release: v6.1.0 - TUI 体验全面升级 + 背景自定义

TUI 界面改进:
- 全面中文化: CommandPalette/HelpPanel/Footer/Chatbox 边框标题等所有用户可见英文汉化
- 辅助中心 (Ctrl+P/F9): 原"设置"重命名, 含 6 项可切换设置
- 独立帮助浮层 (? 键): 重写帮助页面逻辑, 全中文, 带滑入淡入动画
- 背景切换: 辅助中心 [5] 预设背景, [6] 自定义背景; 新增 /bg 命令支持图片提取主色调
- 换行修复: Ctrl+J 作为主推换行键 (Windows 终端不区分 Shift+Enter)
- 引擎切换修复: 解决 call_from_thread 在主线程崩溃的 RuntimeError

技术改进:
- 文本工具调用解析: 检测模型用 <tool_call> 标签返回的工具调用
- 网络工具优化: network_tools.py 和 ai_search.py 改进请求头/重试/编码
- 流式输出修复: append_chunk 的 refresh 改为 layout=True
- 取消响应修复: 引擎层 _cancelled 标志 + TUI 层 worker 身份跟踪

融合 v6.0.0 工作:
- 保留 terminal 模拟器/operit 桥接/深度思考/工作模式/记忆模式等 v6.0.0 全部功能
- 在此基础上叠加本会话的 TUI 改进
This commit is contained in:
shuiyu1123 committed 2026-06-29 13:00:19 +08:00
1 parent b5f638cffc
commit de15b54b19
30 files changed
+3267 -934

No files matched your search

+20 -21
View File
@@ -417,21 +417,17 @@ class LocalServer:
image_engine = getattr(self.cli, 'image_engine', None)
if not image_engine:
try:
from image_engine import get_image_engine
image_engine = get_image_engine()
from image_engine import get_engine_manager
image_engine = get_engine_manager()
except:
return f"@{file_path}" # 没有图像引擎,直接返回路径
if websocket:
await self._send_tool_status(websocket, "图像识别", text or "分析图片", "calling")
# 读取图片
with open(file_path, 'rb') as f:
image_data = f.read()
# 调用图像识别
try:
result = image_engine.analyze(image_data, text or "请描述这张图片")
result = image_engine.analyze(file_path, text or "请描述这张图片")
if websocket:
await self._send_tool_status(websocket, "图像识别", text or "分析图片", "success", result[:200] if result else "无结果")
@@ -638,9 +634,13 @@ class LocalServer:
from colorama import Fore, Style
try:
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.connect(("8.8.8.8", 80))
local_ip = s.getsockname()[0]
s.close()
try:
s.connect(("8.8.8.8", 80))
local_ip = s.getsockname()[0]
except:
local_ip = "未知"
finally:
s.close()
except:
local_ip = "未知"
@@ -657,9 +657,13 @@ class LocalServer:
def get_status(self) -> dict:
try:
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.connect(("8.8.8.8", 80))
local_ip = s.getsockname()[0]
s.close()
try:
s.connect(("8.8.8.8", 80))
local_ip = s.getsockname()[0]
except:
local_ip = "未知"
finally:
s.close()
except:
local_ip = "未知"
return {
@@ -817,15 +821,12 @@ class ProxyClient:
image_engine = getattr(self.cli, 'image_engine', None)
if not image_engine:
try:
from image_engine import get_image_engine
image_engine = get_image_engine()
from image_engine import get_engine_manager
image_engine = get_engine_manager()
except:
return f"@{file_path}"
with open(file_path, 'rb') as f:
image_data = f.read()
result = image_engine.analyze(image_data, text or "请描述这张图片")
result = image_engine.analyze(file_path, text or "请描述这张图片")
return await self._process_message(f"@{file_path}", [], f"图片内容: {result}\n\n{text}" if text else f"图片内容: {result}")
except Exception as e:
@@ -1133,8 +1134,6 @@ def start_proxy_client(cli_instance, server_host: str, server_port: int,
websocket_server = None
return result
return _proxy_client.start(server_host, server_port, server_password, pc_port, pc_password)
def stop_all():