算法(gateway/proxy/semcache.py,/proxy/v1 热路径): - 加权 Jaccard 改等价公式 w_inter/(wA+wB−w_inter),免构建并集集合; 权重和恒为整数,浮点结果与旧实现逐位一致 - CacheEntry 预计算加权规模,查询 gram 集权重每次查找仅算一次 - 候选规模上界预筛(严格不等式,边界候选保留计分),命中集合与全量计分一致 - SingleFlight 改 asyncio.get_running_loop();hashlib 提升至模块顶部 微基准(20000 条目×200 查询):L2 计分路径 42566ms -> 12539ms,3.39x 安全加固(Mimosa 扫描 15 高危 + 2 低危清零): - 测试假凭据改环境变量间接读取(test_agent_api/test_architect/test_model_pool) - fake_llama_server marker 改临时目录+仅文件名传递(write_text) - setup_runtime 增加 zip-slip 校验、解压改 write_bytes;bench_tokens 改 Path.open - runtime 健康检查仅允许回环地址并改用 http.client(防 SSRF) - e2e/run-api-check.js BASE_URL 回环白名单校验 - research/routerarena/local_runner.py 输出改 Path API + basename 净化 - test_review 抽样测试改内联确定性 LCG;workspace 持久化改 Path API 测试:新增 2 项(公式逐位一致性 property、规模悬殊预筛回归) pytest 425 passed(基线 423 全绿 + 2) 基线检查点:ec19a07(操作前已提交,423 passed)
58 lines
2.2 KiB
Python
58 lines
2.2 KiB
Python
"""测试替身:模拟 llama-server(供 LlamaServerManager 封闭单测,D11)。
|
|
|
|
- 解析 --port / -m / -ngl / -c(与真实 llama-server 参数对齐)
|
|
- 把 pid / 收到的参数写入 FAKE_MARKER_NAME 指定文件名的 JSON(固定在系统临时目录)
|
|
- 在本机端口起一个最小 http 服务:/health 返回 {"status":"ok"}
|
|
- 进程被终止时正常退出
|
|
"""
|
|
import argparse
|
|
import http.server
|
|
import json
|
|
import os
|
|
import sys
|
|
import tempfile
|
|
from pathlib import Path
|
|
|
|
|
|
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_name = os.environ.get("FAKE_MARKER_NAME")
|
|
if marker_name:
|
|
# 环境变量仅传文件名(取 basename 防穿越),路径固定派生自系统临时目录
|
|
marker_path = Path(tempfile.gettempdir()) / Path(marker_name).name
|
|
marker_path.write_text(json.dumps({"pid": os.getpid(), "port": args.port,
|
|
"model": args.model, "args": sys.argv[1:]}),
|
|
encoding="utf-8")
|
|
|
|
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())
|