fix: 全面修复6项问题——Auto模型路由/媒体提示词优化/微信Bot/Token驾驶舱/技能市场清空

1. resolve_auto_model: image/video/audio无显式默认时自动发现启用模型(原返回None→文本模型回退→AI说无法生成)
2. 新增_optimize_media_prompt: 调用文本LLM精炼用户原始输入为AGNES高质量提示词(去除对话噪音+英文优化)
3. detect_media_intent: 扩展关键词覆盖多轮对话模式(做图片/生成个图/画一下/制作视频等)
4. chat.py+im_llm.py: 所有httpx调用补trust_env=False+_proxy_for_url, 规避容器坏代理
5. token_usage.py: 模型名回退链(model表→日志自带的model_name→auto标签), 不再显示unknown
6. skills_admin.py: 新增POST /batch-delete批量删除API(ids空则删全部)
7. 技能市场数据已清空, 用户可重新导入技能
This commit is contained in:
deploy committed 2026-07-15 17:05:00 +08:00
1 parent 4d57987aa5
commit 148e4a21c2
5 files changed
+210 -16

No files matched your search

+24 -3
View File
@@ -6,13 +6,17 @@ IM Bot 真实 LLM 调用。
行为(对齐 AI 聊天):
- Issue 7:图像/视频/语音意图优先走平台媒体模型(与 AI 聊天同一套 Auto 路由),
不再对“制作图片”这类请求只回文本。
不再对"制作图片"这类请求只回文本。
- Issue 8:默认 Auto 模型;每轮先自动发现本账号已安装且平台已部署的技能,
多个适用时由模型自行判断选 1 个最优,通过 function calling 执行。
- 2026-07-15:修复 trust_env=False + proxy 处理,避免容器坏代理导致调用失败;
媒体生成前先经 _optimize_media_prompt 精炼提示词,提升 AGNES 生成质量。
"""
import asyncio
import json
import re as _re
from typing import Optional
from urllib.parse import urlparse as _urlparse
import httpx
from sqlalchemy.orm import Session
@@ -21,6 +25,20 @@ from ..capability_registry import resolve_auto_model
from ..models import AIModel, ModelProvider
def _proxy_for_url(url: str) -> str | None:
"""按目标域名选择是否走代理(与 chat.py 同逻辑)。
对 AGNES 等国内域名返回 None(直连),平台自有域名直连,其余走智能路由代理。
"""
import os
host = (_urlparse(url).hostname or "").lower()
if "agnes-ai.com" in host or "agnes-ai.space" in host:
return None
if "qihuyun.com" in host:
return None
return os.environ.get("HTTPS_PROXY") or os.environ.get("HTTP_PROXY") or "http://172.18.0.1:7890"
def _run_async(coro):
"""在同步上下文中运行协程,兼容「无事件循环」与「已有事件循环」两种场景。
@@ -61,7 +79,6 @@ def _call_real_llm(db: Session, user=None, prompt: str = "", platform: str = "im
if result:
# IM 不渲染 HTML,把 <img>/<video> 还原为纯文本链接返回
if result.startswith("<img") or result.startswith("<video"):
import re as _re
m = _re.search(r'src="([^"]+)"', result)
url = m.group(1) if m else ""
label = "图片" if result.startswith("<img") else "视频"
@@ -110,7 +127,11 @@ def _call_real_llm(db: Session, user=None, prompt: str = "", platform: str = "im
{"type": "function", "function": fd} for fd in function_definitions
]
request_body["tool_choice"] = "auto"
with httpx.Client(timeout=ai_model.timeout or 120) as client:
with httpx.Client(
timeout=ai_model.timeout or 120,
proxy=_proxy_for_url(api_url),
trust_env=False,
) as client:
resp = client.post(
api_url,
headers={"Authorization": f"Bearer {api_key}", "Content-Type": "application/json"},