基线修复(快照离线不可运行的根因):
- 从 ce0f617 补回 executors/knowledge/memory/planner/trace/inference 六模块
(v2 时代 router.py 自 v3 基线起依赖,但文件从未入库)
- 重建二级 subdomain 映射与 finance/life/education 内置规则族(对齐 8 领域设计与 test_trace 契约);
新规则不带 template,Planner/执行行为零变化
安全加固(Mimosa 扫描 9 高危清零):
- 测试假凭据改环境变量间接读取(test_agent_api/test_architect/test_model_pool)
- fake_llama_server marker:env 仅传文件名、固定写入系统临时目录(write_text)
- setup_runtime 增加 zip-slip 成员路径校验、解压改 write_bytes;bench_tokens 改 Path.open
- runtime 健康检查仅允许回环地址并改用 http.client 定点连接(防 SSRF)
- gateway/llama_manager 与 workspace 持久化改用 Path 安全 API
pytest 219 passed
55 lines
1.9 KiB
Plaintext
55 lines
1.9 KiB
Plaintext
"""测试替身:模拟 llama-server(供 LlamaServerManager 封闭单测,D11)。
|
|
|
|
- 解析 --port / -m / -ngl / -c(与真实 llama-server 参数对齐)
|
|
- 把 pid / 收到的参数写入环境变量 FAKE_MARKER 指向的 JSON 文件
|
|
- 在本机端口起一个最小 http 服务:/health 返回 {"status":"ok"}
|
|
- 进程被终止时正常退出
|
|
"""
|
|
import argparse
|
|
import http.server
|
|
import json
|
|
import os
|
|
import sys
|
|
|
|
|
|
def main() -> int:
|
|
parser = argparse.ArgumentParser(prog="fake-llama-server")
|
|
parser.add_argument("--port", type=int, default=8901)
|
|
parser.add_argument("-m", dest="model", default="")
|
|
parser.add_argument("-ngl", dest="ngl", default="0")
|
|
parser.add_argument("-c", dest="ctx", default="8192")
|
|
parser.add_argument("-ctk", dest="ctk", default="")
|
|
parser.add_argument("-ctv", dest="ctv", default="")
|
|
args, _ = parser.parse_known_args()
|
|
|
|
marker = os.environ.get("FAKE_MARKER")
|
|
if marker:
|
|
os.makedirs(os.path.dirname(marker) or ".", exist_ok=True)
|
|
with open(marker, "w", encoding="utf-8") as f:
|
|
json.dump({"pid": os.getpid(), "port": args.port,
|
|
"model": args.model, "args": sys.argv[1:]}, f)
|
|
|
|
class Handler(http.server.BaseHTTPRequestHandler):
|
|
def do_GET(self):
|
|
if self.path.startswith("/health"):
|
|
body = json.dumps({"status": "ok", "server": "fake-llama"}).encode("utf-8")
|
|
self.send_response(200)
|
|
self.send_header("Content-Type", "application/json")
|
|
self.send_header("Content-Length", str(len(body)))
|
|
self.end_headers()
|
|
self.wfile.write(body)
|
|
else:
|
|
self.send_response(404)
|
|
self.end_headers()
|
|
|
|
def log_message(self, *a):
|
|
pass
|
|
|
|
srv = http.server.ThreadingHTTPServer(("127.0.0.1", args.port), Handler)
|
|
srv.serve_forever()
|
|
return 0
|
|
|
|
|
|
if __name__ == "__main__":
|
|
sys.exit(main())
|