fix: 文件上传不再添加文件名标记,内容自然融入消息
This commit is contained in:
199
main.py
199
main.py
@@ -382,6 +382,205 @@ async def get_config(db: Session = Depends(get_db)):
|
||||
}
|
||||
|
||||
|
||||
@app.get("/api/admin/ai-config")
|
||||
async def get_ai_config(db: Session = Depends(get_db)):
|
||||
"""获取AI配置"""
|
||||
configs = {c.key: c.value for c in db.query(SystemConfig).filter(SystemConfig.key.startswith('ai_')).all()}
|
||||
|
||||
return {
|
||||
"api_base": configs.get('ai_api_base', 'http://192.168.2.17:19007/v1'),
|
||||
"api_key": configs.get('ai_api_key', 'xxxx'),
|
||||
"model": configs.get('ai_model', 'auto'),
|
||||
"use_mock": ai_service.use_mock
|
||||
}
|
||||
|
||||
|
||||
@app.post("/api/admin/ai-config")
|
||||
async def update_ai_config(data: dict, db: Session = Depends(get_db)):
|
||||
"""更新AI配置"""
|
||||
api_base = data.get("api_base")
|
||||
api_key = data.get("api_key")
|
||||
model = data.get("model")
|
||||
|
||||
if api_base:
|
||||
config = db.query(SystemConfig).filter(SystemConfig.key == 'ai_api_base').first()
|
||||
if config:
|
||||
config.value = api_base
|
||||
else:
|
||||
config = SystemConfig(key='ai_api_base', value=api_base, description='AI API地址')
|
||||
db.add(config)
|
||||
|
||||
if api_key:
|
||||
config = db.query(SystemConfig).filter(SystemConfig.key == 'ai_api_key').first()
|
||||
if config:
|
||||
config.value = api_key
|
||||
else:
|
||||
config = SystemConfig(key='ai_api_key', value=api_key, description='AI API密钥')
|
||||
db.add(config)
|
||||
|
||||
if model:
|
||||
config = db.query(SystemConfig).filter(SystemConfig.key == 'ai_model').first()
|
||||
if config:
|
||||
config.value = model
|
||||
else:
|
||||
config = SystemConfig(key='ai_model', value=model, description='AI模型名称')
|
||||
db.add(config)
|
||||
|
||||
db.commit()
|
||||
|
||||
# 更新AI服务配置
|
||||
configs = {c.key: c.value for c in db.query(SystemConfig).filter(SystemConfig.key.startswith('ai_')).all()}
|
||||
ai_service.update_config(
|
||||
configs.get('ai_api_base', 'http://192.168.2.17:19007/v1'),
|
||||
configs.get('ai_api_key', 'xxxx'),
|
||||
configs.get('ai_model', 'auto')
|
||||
)
|
||||
|
||||
return {"success": True, "message": "AI配置已更新"}
|
||||
|
||||
|
||||
@app.get("/api/admin/models")
|
||||
async def get_available_models(db: Session = Depends(get_db)):
|
||||
"""获取可用模型列表"""
|
||||
import httpx
|
||||
|
||||
# 从数据库读取最新配置
|
||||
configs = {c.key: c.value for c in db.query(SystemConfig).filter(SystemConfig.key.startswith('ai_')).all()}
|
||||
api_base = configs.get('ai_api_base', '')
|
||||
api_key = configs.get('ai_api_key', 'xxxx')
|
||||
|
||||
if not api_base:
|
||||
# 返回默认模型列表
|
||||
return {
|
||||
"models": [
|
||||
{"id": "auto", "name": "auto (自动选择)", "owned_by": "system"},
|
||||
{"id": "qwen3.5-4b", "name": "qwen3.5-4b", "owned_by": "local"},
|
||||
{"id": "dsv32", "name": "dsv32", "owned_by": "deepseek"},
|
||||
{"id": "glm-4", "name": "glm-4", "owned_by": "zhipu"},
|
||||
{"id": "gpt-4o", "name": "gpt-4o", "owned_by": "openai"},
|
||||
{"id": "claude-3-opus", "name": "claude-3-opus", "owned_by": "anthropic"}
|
||||
],
|
||||
"success": False,
|
||||
"message": "请先配置API地址"
|
||||
}
|
||||
|
||||
try:
|
||||
# 从当前配置的API地址获取模型列表
|
||||
url = f"{api_base}/models"
|
||||
headers = {"Authorization": f"Bearer {api_key}"}
|
||||
|
||||
logger.info(f"获取模型列表: url={url}")
|
||||
|
||||
async with httpx.AsyncClient(timeout=10.0) as client:
|
||||
response = await client.get(url, headers=headers)
|
||||
if response.status_code == 200:
|
||||
data = response.json()
|
||||
models = []
|
||||
for m in data.get('data', []):
|
||||
model_id = m.get('id', '')
|
||||
if model_id:
|
||||
models.append({
|
||||
"id": model_id,
|
||||
"name": m.get('name', model_id),
|
||||
"owned_by": m.get('owned_by', 'unknown')
|
||||
})
|
||||
return {"models": models, "success": True}
|
||||
except Exception as e:
|
||||
logger.error(f"获取模型列表失败: {e}")
|
||||
|
||||
# 返回默认模型列表
|
||||
return {
|
||||
"models": [
|
||||
{"id": "auto", "name": "auto (自动选择)", "owned_by": "system"},
|
||||
{"id": "qwen3.5-4b", "name": "qwen3.5-4b", "owned_by": "local"},
|
||||
{"id": "dsv32", "name": "dsv32", "owned_by": "deepseek"},
|
||||
{"id": "glm-4", "name": "glm-4", "owned_by": "zhipu"},
|
||||
{"id": "gpt-4o", "name": "gpt-4o", "owned_by": "openai"},
|
||||
{"id": "claude-3-opus", "name": "claude-3-opus", "owned_by": "anthropic"}
|
||||
],
|
||||
"success": False,
|
||||
"message": "无法从API获取模型列表,显示默认列表"
|
||||
}
|
||||
|
||||
|
||||
@app.post("/api/admin/test-ai")
|
||||
async def test_ai_connection(db: Session = Depends(get_db)):
|
||||
"""测试AI连接"""
|
||||
import httpx
|
||||
|
||||
# 从数据库读取最新配置,如果没有则使用默认值
|
||||
configs = {c.key: c.value for c in db.query(SystemConfig).filter(SystemConfig.key.startswith('ai_')).all()}
|
||||
|
||||
# 使用数据库值或默认值
|
||||
api_base = configs.get('ai_api_base') or 'http://192.168.2.17:19007/v1'
|
||||
api_key = configs.get('ai_api_key') or 'xxxx'
|
||||
model = configs.get('ai_model') or 'auto'
|
||||
|
||||
# 判断是否使用默认值
|
||||
using_defaults = not configs.get('ai_api_base')
|
||||
|
||||
try:
|
||||
url = f"{api_base}/chat/completions"
|
||||
headers = {
|
||||
"Authorization": f"Bearer {api_key}",
|
||||
"Content-Type": "application/json"
|
||||
}
|
||||
payload = {
|
||||
"model": model,
|
||||
"messages": [{"role": "user", "content": "测试连接"}],
|
||||
"max_tokens": 50
|
||||
}
|
||||
|
||||
logger.info(f"测试AI连接: url={url}, model={model}, using_defaults={using_defaults}")
|
||||
|
||||
async with httpx.AsyncClient(timeout=15.0) as client:
|
||||
response = await client.post(url, headers=headers, json=payload)
|
||||
if response.status_code == 200:
|
||||
data = response.json()
|
||||
content = data['choices'][0]['message']['content']
|
||||
|
||||
result = {
|
||||
"success": True,
|
||||
"message": f"连接成功!模型响应: {content[:100]}",
|
||||
"model": model,
|
||||
"api_base": api_base
|
||||
}
|
||||
|
||||
if using_defaults:
|
||||
result["message"] += "\n(使用默认配置,点击「保存配置」可持久化)"
|
||||
|
||||
return result
|
||||
else:
|
||||
error_text = response.text[:200] if response.text else ""
|
||||
return {
|
||||
"success": False,
|
||||
"message": f"连接失败: HTTP {response.status_code} - {error_text}",
|
||||
"model": model,
|
||||
"api_base": api_base
|
||||
}
|
||||
except httpx.ConnectError as e:
|
||||
return {
|
||||
"success": False,
|
||||
"message": f"无法连接到API地址: {api_base}",
|
||||
"model": model,
|
||||
"api_base": api_base
|
||||
}
|
||||
except httpx.TimeoutException:
|
||||
return {
|
||||
"success": False,
|
||||
"message": f"连接超时(15秒)",
|
||||
"model": model,
|
||||
"api_base": api_base
|
||||
}
|
||||
except Exception as e:
|
||||
return {
|
||||
"success": False,
|
||||
"message": f"连接失败: {str(e)}",
|
||||
"model": model,
|
||||
"api_base": api_base
|
||||
}
|
||||
|
||||
|
||||
@app.post("/api/admin/config")
|
||||
async def update_config(data: dict, db: Session = Depends(get_db)):
|
||||
"""更新系统配置"""
|
||||
|
||||
Reference in New Issue
Block a user