| 1234567891011121314151617181920212223242526272829303132333435 |
- """HTTP 中断适配:领域错误映射为状态码,执行层不依赖请求模型。"""
- from fastapi import HTTPException
- from runtime.events import EventBuilder
- from runtime.interrupts import pack, token_for, ResumeDecision, ResumeError
- from runtime.interrupts import interrupt_event, resume_value as resolve_resume, official_resume
- from api.sse_events import serialize_event
- def decision_from_request(request) -> ResumeDecision:
- return ResumeDecision(interrupt_token=request.interrupt_token or "", approved=request.approved,
- status=request.status, answers=request.answers, error=request.error)
- def interrupt_frame(writer, payload):
- builder = EventBuilder(writer.session_id, writer.trace_id, encode=lambda event: event)
- return serialize_event(interrupt_event(builder, payload))
- def resume_value(request, state):
- try:
- return resolve_resume(decision_from_request(request), state)
- except ResumeError as exc:
- raise _http_error(exc) from exc
- def to_official_resume(request, pending_count):
- try:
- return official_resume(decision_from_request(request), pending_count)
- except ResumeError as exc:
- raise _http_error(exc) from exc
- def _http_error(exc: ResumeError) -> HTTPException:
- status = 400 if exc.code in {"invalid_answers", "invalid_decision"} else 409
- return HTTPException(status_code=status, detail={"code": exc.code, "message": str(exc)})
|