feat(tuning): release V0.8.2 Agent 界面重构
This commit is contained in:
@@ -27,6 +27,8 @@ from urllib.parse import parse_qs, unquote, urlsplit
|
||||
|
||||
from tuning.manager import TuningError, TuningManager
|
||||
from tuning.process import GpuLease, ResourceBusyError
|
||||
from tuning.schema import RewardConfigError
|
||||
from tuning.scoring import EvaluationError
|
||||
|
||||
VERSION = "0.4.0"
|
||||
# 浏览器当前 ONNX 运行时只实现 Go2 的 47→12 部署契约;其他任务须由服务启动参数显式放行。
|
||||
@@ -498,7 +500,7 @@ class TrainingRequestHandler(BaseHTTPRequestHandler):
|
||||
self._json(HTTPStatus.NOT_FOUND, {"error": "调参 session、trial 或 proposal 不存在"})
|
||||
elif isinstance(error, ResourceBusyError):
|
||||
self._json(HTTPStatus.CONFLICT, {"error": str(error)})
|
||||
elif isinstance(error, TuningError):
|
||||
elif isinstance(error, (TuningError, RewardConfigError, EvaluationError)):
|
||||
self._json(HTTPStatus.BAD_REQUEST, {"error": str(error)})
|
||||
else:
|
||||
self._json(
|
||||
@@ -552,7 +554,7 @@ class TrainingRequestHandler(BaseHTTPRequestHandler):
|
||||
self._ensure_origin()
|
||||
self.send_response(HTTPStatus.NO_CONTENT)
|
||||
self._cors()
|
||||
self.send_header("Access-Control-Allow-Methods", "GET, POST, DELETE, OPTIONS")
|
||||
self.send_header("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS")
|
||||
self.send_header("Access-Control-Allow-Headers", "Authorization, Content-Type")
|
||||
self.send_header("Access-Control-Max-Age", "600")
|
||||
self.end_headers()
|
||||
@@ -591,14 +593,18 @@ class TrainingRequestHandler(BaseHTTPRequestHandler):
|
||||
tags = [tag for value in query.get("tags", []) for tag in value.split(",") if tag]
|
||||
try:
|
||||
max_points = int(query.get("maxPoints", ["1000"])[0])
|
||||
after_raw = query.get("afterStep", [None])[0]
|
||||
after_step = int(after_raw) if after_raw is not None else None
|
||||
except ValueError as error:
|
||||
raise TuningError("maxPoints 必须是整数") from error
|
||||
raise TuningError("maxPoints/afterStep 必须是整数") from error
|
||||
if not 10 <= max_points <= 5000:
|
||||
raise TuningError("maxPoints 必须在 10–5000 之间")
|
||||
if after_step is not None and after_step < -1:
|
||||
raise TuningError("afterStep 不能小于 -1")
|
||||
self._json(
|
||||
HTTPStatus.OK,
|
||||
self.tuning_manager.metrics(
|
||||
match.group(1), match.group(2), tags or None, max_points
|
||||
match.group(1), match.group(2), tags or None, max_points, after_step
|
||||
),
|
||||
)
|
||||
return
|
||||
@@ -640,6 +646,22 @@ class TrainingRequestHandler(BaseHTTPRequestHandler):
|
||||
)
|
||||
self._json(HTTPStatus.ACCEPTED, action(match.group(1)))
|
||||
return
|
||||
match = re.fullmatch(r"/api/tuning/sessions/([0-9a-f]{32})/(step|rollback)", path)
|
||||
if match:
|
||||
action = (
|
||||
self.tuning_manager.step
|
||||
if match.group(2) == "step"
|
||||
else self.tuning_manager.rollback
|
||||
)
|
||||
self._json(HTTPStatus.ACCEPTED, action(match.group(1), self._payload()))
|
||||
return
|
||||
match = re.fullmatch(r"/api/tuning/sessions/([0-9a-f]{32})/mode", path)
|
||||
if match:
|
||||
self._json(
|
||||
HTTPStatus.ACCEPTED,
|
||||
self.tuning_manager.set_mode(match.group(1), self._payload()),
|
||||
)
|
||||
return
|
||||
match = re.fullmatch(
|
||||
r"/api/tuning/sessions/([0-9a-f]{32})/proposals/([0-9a-f]{32})/(approve|reject)",
|
||||
path,
|
||||
@@ -658,6 +680,21 @@ class TrainingRequestHandler(BaseHTTPRequestHandler):
|
||||
except Exception as error:
|
||||
self._error(error)
|
||||
|
||||
def do_PUT(self) -> None:
|
||||
try:
|
||||
self._ensure_request()
|
||||
path = urlsplit(self.path).path
|
||||
match = re.fullmatch(r"/api/tuning/sessions/([0-9a-f]{32})/constraints", path)
|
||||
if match:
|
||||
self._json(
|
||||
HTTPStatus.ACCEPTED,
|
||||
self.tuning_manager.set_constraints(match.group(1), self._payload()),
|
||||
)
|
||||
return
|
||||
raise ApiError(HTTPStatus.NOT_FOUND, "接口不存在")
|
||||
except Exception as error:
|
||||
self._error(error)
|
||||
|
||||
def do_DELETE(self) -> None:
|
||||
try:
|
||||
self._ensure_request()
|
||||
|
||||
Reference in New Issue
Block a user