perf: 启动输出瘦身 + FC 能力探测缓存,修复测试套件失效
自用体验(同时以人类和被接入 AI 的视角)暴露出三个问题,一并处理:
1. 启动太吵:117 行 / 16983 字符的开屏,人还没开始用就先刷屏
- 完整 ASCII 开机动画改为 --logo / --banner 按需召唤,默认两行紧凑标识
- 21 行命令说明折叠成一行「/help 全部命令 · /quit 退出 · ...」,
完整速查表挪进 /help(新增 show_quick_commands)
- 插件/引擎/工具的逐条加载日志改走 vprint,由 --verbose / -v /
XCLI_VERBOSE=1 召唤;工具加载汇总成一行
- 日志控制台 handler 降到 WARNING(文件仍留全量 INFO),并静音
httpx/httpcore/urllib3 等第三方心跳日志
=> 默认启动 10 行 / 475 字符,--verbose 仍可看到全部 36 行细节
2. 不支持 FC 的模型每次会话都白撞一发 500
讯飞 xophunyuan7bmt 不支持 Function Calling,请求带 tools 字段必报
500 Invalid Params,虽有降级重试兜底,但每个新会话都要先错一次。
- 新增 xcli_core/fc_tools 能力缓存(按 base_url::model 落盘 .fc_support.json)
- 降级重试成功后记住该模型不支持 FC,后续直接不发 tools
- 降级也失败时不写缓存,避免把别的故障误判成 FC 问题
- 新增 /fc [reset] 查看与清除缓存
3. diff 弹窗模式每次启动都要重新问一遍
- 首次选择后经 config.json 持久化,新增 /diff [popup|inline] 随时切换
测试:
- 新增 tests/test_startup_and_fc.py(27 项,含假 HTTP 验证降级与缓存链路)
- 修复 tests/test_plugins.py 长期失效:插件入口类早已由 Plugin 改名 Liugin,
8 处 fixture 未跟进导致 65 个用例直接 error;断言也未适配 ToolResult 返回值
与「❌」错误前缀。改为 plugin_class() / as_text() / is_error() 语义判断。
- 全量:217 passed(此前 152 passed + 65 error + 27 failed)
This commit is contained in:
1 parent
d2ac6896ad
commit
3a86da7444
12 files changed
+728
-167
No files matched your search
@@ -376,8 +376,42 @@ class DisplayMixin:
|
||||
|
||||
# ── 帮助系统 ──
|
||||
|
||||
def show_quick_commands(self):
|
||||
"""常用命令速查表(启动时不再刷屏,改由 /help 展示)"""
|
||||
rows = [
|
||||
('/help [插件名]', '显示帮助信息'),
|
||||
('/quit', '退出程序'),
|
||||
('/tui', '切换到 TUI 图形模式'),
|
||||
('/engine list', '查看可用 AI 引擎'),
|
||||
('/engine switch <名>', '切换 AI 引擎'),
|
||||
('/fc [reset]', '查看/清除 FC 能力探测缓存'),
|
||||
('/safe', '切换安全模式 (普通→人工→无限制)'),
|
||||
('/diff', '切换 diff 显示模式 (弹窗/主终端)'),
|
||||
('/notify', '切换任务完成通知 (开/关)'),
|
||||
('/scheduler 或 /remind', '管理定时任务'),
|
||||
('/memory', '管理记忆系统 (日记/搜索/聊天记录)'),
|
||||
('/file.read <文件> [行数]', '直接读取文件内容'),
|
||||
('@文件路径', '自动读取文件内容并发送给 AI'),
|
||||
('@图片路径', '自动分析图片并发送描述给 AI'),
|
||||
('/image engines', '查看图像识别引擎'),
|
||||
('/chat save|list|open', '保存/查看/加载聊天记录'),
|
||||
('/remote', '查看远程连接帮助'),
|
||||
('/plugin', '管理插件市场 (安装/卸载/搜索)'),
|
||||
('/protect', '查看进程保护状态'),
|
||||
]
|
||||
width = max(len(cmd) for cmd, _ in rows)
|
||||
print(f"{Fore.GREEN}常用命令:{Style.RESET_ALL}")
|
||||
for cmd, desc in rows:
|
||||
print(f" {Fore.WHITE}{cmd.ljust(width)}{Style.RESET_ALL} {desc}")
|
||||
print()
|
||||
print(f"{Fore.GREEN}启动参数:{Style.RESET_ALL}")
|
||||
print(f" {Fore.WHITE}{'--verbose / -v'.ljust(width)}{Style.RESET_ALL} 打印引擎/插件/技能的逐条加载明细")
|
||||
print(f" {Fore.WHITE}{'--logo'.ljust(width)}{Style.RESET_ALL} 播放完整开机动画")
|
||||
print()
|
||||
|
||||
def show_help(self):
|
||||
"""显示帮助信息"""
|
||||
self.show_quick_commands()
|
||||
help_file_path = os.path.join(os.path.dirname(os.path.dirname(os.path.abspath(__file__))), "HELP.md")
|
||||
if os.path.exists(help_file_path):
|
||||
try:
|
||||
|
||||
Reference in new issue
Block a user