LFM2.5-VL-1.6B实战教程:WebUI多用户权限管理+API密钥鉴权集成
LFM2.5-VL-1.6B实战教程:WebUI多用户权限管理+API密钥鉴权集成
1. 项目概述
LFM2.5-VL-1.6B是Liquid AI发布的一款轻量级多模态大模型,专为端侧和边缘设备设计。这款模型结合了1.2B参数的语言模型和约400M参数的视觉模型,能够在低显存环境下实现快速响应。
| 项目 | 值 |
|---|---|
| 模型名称 | LFM2.5-VL-1.6B |
| 开发商 | Liquid AI |
| 参数量 | 1.6B |
| 类型 | 视觉语言模型 (Vision-Language) |
| 模型路径 | /root/ai-models/LiquidAI/LFM2___5-VL-1___6B |
| WebUI 地址 | http://localhost:7860 |
2. 环境准备与快速部署
2.1 硬件要求
| 组件 | 要求 |
|---|---|
| GPU | NVIDIA GPU (推荐 8GB+ 显存) |
| 当前配置 | RTX 4090 D, 22.15 GB 可用 |
| 内存占用 | ~3 GB GPU |
2.2 快速启动WebUI
# 查看服务状态 supervisorctl status lfm-vl # 重启服务 supervisorctl restart lfm-vl # 查看日志 tail -f /var/log/lfm-vl.out.log启动后访问 http://localhost:7860 即可使用Web界面。
3. 多用户权限管理配置
3.1 创建用户数据库
首先我们需要创建一个简单的用户数据库:
# user_manager.py import sqlite3 from werkzeug.security import generate_password_hash def init_db(): conn = sqlite3.connect('users.db') c = conn.cursor() c.execute('''CREATE TABLE IF NOT EXISTS users (id INTEGER PRIMARY KEY AUTOINCREMENT, username TEXT UNIQUE NOT NULL, password TEXT NOT NULL, role TEXT NOT NULL)''') conn.commit() conn.close() def add_user(username, password, role='user'): conn = sqlite3.connect('users.db') c = conn.cursor() c.execute("INSERT INTO users (username, password, role) VALUES (?, ?, ?)", (username, generate_password_hash(password), role)) conn.commit() conn.close()3.2 集成到WebUI
修改webui.py文件,添加登录验证和权限控制:
# webui.py from flask import Flask, request, session, redirect, url_for from werkzeug.security import check_password_hash import sqlite3 app = Flask(__name__) app.secret_key = 'your_secret_key_here' def get_user_role(username): conn = sqlite3.connect('users.db') c = conn.cursor() c.execute("SELECT role FROM users WHERE username=?", (username,)) role = c.fetchone()[0] conn.close() return role @app.route('/login', methods=['GET', 'POST']) def login(): if request.method == 'POST': username = request.form['username'] password = request.form['password'] conn = sqlite3.connect('users.db') c = conn.cursor() c.execute("SELECT password FROM users WHERE username=?", (username,)) user = c.fetchone() conn.close() if user and check_password_hash(user[0], password): session['username'] = username session['role'] = get_user_role(username) return redirect(url_for('index')) return ''' <form method="post"> <p><input type=text name=username> <p><input type=password name=password> <p><input type=submit value=Login> </form> '''4. API密钥鉴权集成
4.1 创建API密钥管理系统
# api_auth.py import secrets import sqlite3 from datetime import datetime, timedelta def generate_api_key(user_id, expires_days=30): key = secrets.token_urlsafe(32) expiry = datetime.now() + timedelta(days=expires_days) conn = sqlite3.connect('api_keys.db') c = conn.cursor() c.execute('''CREATE TABLE IF NOT EXISTS api_keys (id INTEGER PRIMARY KEY AUTOINCREMENT, user_id INTEGER NOT NULL, api_key TEXT UNIQUE NOT NULL, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, expires_at TIMESTAMP NOT NULL, is_active BOOLEAN DEFAULT 1)''') c.execute("INSERT INTO api_keys (user_id, api_key, expires_at) VALUES (?, ?, ?)", (user_id, key, expiry)) conn.commit() conn.close() return key4.2 添加API鉴权中间件
# api_middleware.py from functools import wraps from flask import request, jsonify import sqlite3 def api_key_required(f): @wraps(f) def decorated_function(*args, **kwargs): api_key = request.headers.get('X-API-KEY') if not api_key: return jsonify({'error': 'API key is missing'}), 401 conn = sqlite3.connect('api_keys.db') c = conn.cursor() c.execute("SELECT user_id, expires_at FROM api_keys WHERE api_key=? AND is_active=1", (api_key,)) key_data = c.fetchone() conn.close() if not key_data or datetime.now() > datetime.strptime(key_data[1], '%Y-%m-%d %H:%M:%S'): return jsonify({'error': 'Invalid or expired API key'}), 403 return f(*args, **kwargs) return decorated_function5. 完整API调用示例
5.1 带鉴权的API调用
import requests import json # 获取API密钥 api_key = "your_api_key_here" # 准备请求数据 url = "http://localhost:7860/api/v1/generate" headers = { "Content-Type": "application/json", "X-API-KEY": api_key } data = { "image_url": "https://example.com/image.jpg", "prompt": "描述这张图片的内容", "temperature": 0.1, "max_new_tokens": 256 } # 发送请求 response = requests.post(url, headers=headers, data=json.dumps(data)) # 处理响应 if response.status_code == 200: result = response.json() print(result['response']) else: print(f"Error: {response.status_code}, {response.text}")5.2 多用户API配额管理
# quota_manager.py import sqlite3 from datetime import datetime def check_quota(user_id): conn = sqlite3.connect('api_quota.db') c = conn.cursor() # 创建配额表 c.execute('''CREATE TABLE IF NOT EXISTS api_usage (user_id INTEGER PRIMARY KEY, daily_limit INTEGER DEFAULT 100, monthly_limit INTEGER DEFAULT 3000, daily_used INTEGER DEFAULT 0, monthly_used INTEGER DEFAULT 0, last_reset_date DATE)''') # 检查是否需要重置计数器 today = datetime.now().date() c.execute("SELECT last_reset_date, daily_used, monthly_used FROM api_usage WHERE user_id=?", (user_id,)) result = c.fetchone() if result: last_reset_date, daily_used, monthly_used = result if last_reset_date != today: # 重置每日用量 c.execute("UPDATE api_usage SET daily_used=0, last_reset_date=? WHERE user_id=?", (today, user_id)) conn.commit() # 检查配额 c.execute("SELECT daily_limit, monthly_limit, daily_used, monthly_used FROM api_usage WHERE user_id=?", (user_id,)) quota = c.fetchone() if not quota: # 新用户默认配额 c.execute("INSERT INTO api_usage (user_id, last_reset_date) VALUES (?, ?)", (user_id, today)) conn.commit() return True, (100, 3000, 0, 0) daily_limit, monthly_limit, daily_used, monthly_used = quota conn.close() if daily_used >= daily_limit or monthly_used >= monthly_limit: return False, (daily_limit, monthly_limit, daily_used, monthly_used) return True, (daily_limit, monthly_limit, daily_used, monthly_used)6. 总结
6.1 关键要点回顾
- 多用户管理:通过SQLite数据库实现了用户账户系统和基于角色的权限控制
- API鉴权:使用随机生成的API密钥进行身份验证,支持密钥过期和吊销
- 配额管理:实现了基于用户的使用配额系统,防止API滥用
- 安全集成:所有功能都无缝集成到现有WebUI中,不影响原有功能
6.2 下一步建议
- 考虑添加更细粒度的权限控制,如模型访问权限、API调用频率限制等
- 实现API密钥的自动续期和通知功能
- 添加审计日志,记录所有API调用和用户操作
- 考虑使用更专业的认证方案如OAuth2.0
获取更多AI镜像
想探索更多AI镜像和应用场景?访问 CSDN星图镜像广场,提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,支持一键部署。
