feat: initialize XAS test console with native execution
This commit is contained in:
@@ -0,0 +1,115 @@
|
||||
"""In-container bootstrap. Input contains optional credentials; never persist it."""
|
||||
from http.server import BaseHTTPRequestHandler, HTTPServer
|
||||
import json
|
||||
import os
|
||||
from pathlib import Path
|
||||
import subprocess
|
||||
import sys
|
||||
import threading
|
||||
import time
|
||||
import urllib.error
|
||||
import urllib.request
|
||||
|
||||
|
||||
class NoRedirect(urllib.request.HTTPRedirectHandler):
|
||||
def redirect_request(self, request, fp, code, msg, headers, newurl):
|
||||
return None
|
||||
|
||||
|
||||
class BudgetRelay(HTTPServer):
|
||||
def __init__(self, address, upstream, key):
|
||||
super().__init__(address, RelayHandler)
|
||||
self.upstream, self.key = upstream, key
|
||||
self.gets, self.posts = 0, 0
|
||||
self.records = []
|
||||
|
||||
|
||||
class RelayHandler(BaseHTTPRequestHandler):
|
||||
def log_message(self, *args):
|
||||
pass
|
||||
|
||||
def do_GET(self):
|
||||
if self.path != "/v1/models" or self.server.gets >= 1:
|
||||
self.send_error(403, "Request outside run budget")
|
||||
return
|
||||
self.server.gets += 1
|
||||
self.forward(None, 10)
|
||||
|
||||
def do_POST(self):
|
||||
if self.path != "/v1/chat/completions" or self.server.posts >= 3:
|
||||
self.send_error(403, "Request outside run budget")
|
||||
return
|
||||
try:
|
||||
length = int(self.headers.get("Content-Length", "0"))
|
||||
if not 0 < length <= 8192:
|
||||
raise ValueError()
|
||||
data = self.rfile.read(length)
|
||||
body = json.loads(data)
|
||||
if body.get("model") != "deepseek-v4.1-flash" or body.get("max_tokens") != 512 or body.get("stream"):
|
||||
raise ValueError()
|
||||
except (ValueError, json.JSONDecodeError):
|
||||
self.send_error(400, "Unexpected smoke request")
|
||||
return
|
||||
self.server.posts += 1 # Count before I/O: timeouts never replenish the budget.
|
||||
self.forward(data, 600)
|
||||
|
||||
def forward(self, data, timeout):
|
||||
started = time.monotonic()
|
||||
record = {"path": self.path, "status": None}
|
||||
try:
|
||||
req = urllib.request.Request(self.server.upstream + self.path, data=data, headers={
|
||||
"Content-Type": "application/json", "Authorization": "Bearer " + self.server.key})
|
||||
opener = urllib.request.build_opener(urllib.request.ProxyHandler({}), NoRedirect())
|
||||
with opener.open(req, timeout=timeout) as response:
|
||||
status, payload = response.status, response.read(2 * 1024 * 1024 + 1)
|
||||
if len(payload) > 2 * 1024 * 1024:
|
||||
raise ValueError("Response exceeded limit")
|
||||
record["status"] = status
|
||||
decoded = json.loads(payload)
|
||||
if self.path.endswith("completions"):
|
||||
record["response"] = decoded
|
||||
self.send_response(status)
|
||||
self.send_header("Content-Type", "application/json")
|
||||
self.send_header("Content-Length", str(len(payload)))
|
||||
self.end_headers()
|
||||
self.wfile.write(payload)
|
||||
except urllib.error.HTTPError as exc:
|
||||
record["status"] = exc.code
|
||||
self.send_error(exc.code, "Upstream request failed")
|
||||
except (OSError, ValueError) as exc:
|
||||
record["error"] = type(exc).__name__
|
||||
try:
|
||||
self.send_error(502, "Upstream outcome uncertain; no retry")
|
||||
except OSError:
|
||||
pass
|
||||
finally:
|
||||
record["seconds"] = round(time.monotonic() - started, 3)
|
||||
self.server.records.append(record)
|
||||
print(json.dumps({"event": "model_request", **{k: v for k, v in record.items() if k != "response"}}), flush=True)
|
||||
|
||||
|
||||
def main():
|
||||
payload = json.loads(sys.stdin.buffer.readline(16384))
|
||||
relay = None
|
||||
if payload.get("profile") == "legacy_smoke":
|
||||
relay = BudgetRelay(("127.0.0.1", 18100), payload.pop("upstream"), payload.pop("key"))
|
||||
threading.Thread(target=relay.serve_forever, daemon=True).start()
|
||||
command = (["python3", "-u"] if payload["language"] == "python" else ["/bin/bash"]) + [payload["script"]] + payload["args"]
|
||||
print("[控制台] 测试进程已启动,输出将持续显示。", flush=True)
|
||||
status = subprocess.call(command, stdin=subprocess.DEVNULL)
|
||||
if relay:
|
||||
report = {"synthetic": False, "scope": "接口冒烟检查,非模型质量评测", "get_attempts": relay.gets,
|
||||
"completion_attempts": relay.posts, "records": relay.records, "script_exit_code": status}
|
||||
valid = len(relay.records) == 4 and all(r.get("status") == 200 for r in relay.records)
|
||||
report["requests_completed"] = valid
|
||||
report["message"] = "请求均返回成功;请结合实际回答与 finish_reason 判断内容" if valid else "存在失败或未完成请求;未自动重试"
|
||||
Path(os.environ["XAS_RUN_DIR"], "smoke-response.json").write_text(json.dumps(report, ensure_ascii=False, indent=2), encoding="utf-8")
|
||||
if not valid:
|
||||
status = status or 1
|
||||
relay.shutdown()
|
||||
print(f"[控制台] 测试进程结束,退出码 {status}。", flush=True)
|
||||
return status
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
sys.exit(main())
|
||||
Reference in New Issue
Block a user