- 预设 12 个本机工具并默认启用,装好即是可操作电脑的 Agent、无需总控配置或安装: 文件与文件夹的查看/读取/写入/建目录/移动/删除(默认不覆盖、删目录需 recursive、 拒绝删除系统目录与用户根目录)、用默认程序打开网址或文件、时间与时区换算 (tzdata 已随包内置)、查看进程、屏幕截图、读写剪贴板。 - 工具下发改为通用:任意 HTTP MCP 服务与 stdio 本机命令(Agent 拉起子进程, 容忍 stdout 噪声,命令缺失或进程崩溃会明确回报),支持多工具并存、 定义未变更时复用连接、替换/删除/退出时回收子进程。 - 多轮上下文:task_dispatch.history 作为此前的 user/assistant 文本拼接到本次请求前, OpenAI 兼容、Anthropic、Gemini 分别适配;Agent 侧独立校验与限幅。 - 工具级实时进度以 progress 事件回传;使用预设工具的任务标记为 builtin 执行来源。 - Skill 与历史内容上限与总控对齐,多个已批准 Skill 不再被静默截断。 - 修复 build.ps1 缺 UTF-8 BOM 导致 build.bat 在 PowerShell 5.1 下语法报错。
48 lines
1.5 KiB
Python
48 lines
1.5 KiB
Python
"""Shared fixtures for the Agent test suite."""
|
|
|
|
import sys
|
|
|
|
import pytest
|
|
|
|
# A minimal MCP stdio server that also pollutes stdout on purpose: a real server
|
|
# must keep working even when something logs to stdout.
|
|
FAKE_MCP_SERVER = '''
|
|
import json
|
|
import sys
|
|
|
|
|
|
def reply(request_id, result):
|
|
sys.stdout.write(json.dumps({"jsonrpc": "2.0", "id": request_id, "result": result}) + "\\n")
|
|
sys.stdout.flush()
|
|
|
|
|
|
print("这行日志会在 stdout 上,客户端必须忽略它而不是把它当成协议数据")
|
|
|
|
for line in sys.stdin:
|
|
line = line.strip()
|
|
if not line:
|
|
continue
|
|
message = json.loads(line)
|
|
method = message.get("method")
|
|
if method == "initialize":
|
|
reply(message["id"], {"protocolVersion": "2025-03-26"})
|
|
elif method == "tools/list":
|
|
reply(message["id"], {"tools": [{"name": "echo", "description": "回显文本", "inputSchema": {"type": "object", "properties": {"text": {"type": "string"}}}}]})
|
|
elif method == "tools/call":
|
|
arguments = message.get("params", {}).get("arguments") or {}
|
|
reply(message["id"], {"content": [{"type": "text", "text": "回显:" + str(arguments.get("text", ""))}]})
|
|
'''
|
|
|
|
|
|
@pytest.fixture
|
|
def mcp_server_script(tmp_path):
|
|
"""Return the path to a runnable fake MCP stdio server."""
|
|
script = tmp_path / "fake_mcp_server.py"
|
|
script.write_text(FAKE_MCP_SERVER, encoding="utf-8")
|
|
return str(script)
|
|
|
|
|
|
@pytest.fixture
|
|
def python_executable():
|
|
return sys.executable
|