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:
1 parent
4d57987aa5
commit
148e4a21c2
5 files changed
+210
-16
No files matched your search
@@ -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"},
|
||||
|
||||
Reference in new issue
Block a user