所有业务接口默认前缀为 /api。
用于基础健康检查,通常在本地启动后优先访问。
返回示例:
{
"status": "healthy",
"version": "3.3.0",
"timestamp": "2026-03-09T16:22:01.796033+00:00",
"build": {
"version": "3.3.0",
"sha": "local",
"created_at": ""
},
"services": {
"api": "healthy",
"llm": "initialized",
"sessions": "healthy"
}
}用于真实 readiness 检查,当前会返回 startup validation 结果。
返回规则:
200:status == "ready"503:status == "starting"或status == "not_ready"
返回示例:
{
"status": "ready",
"validated_at": "2026-03-15T08:21:03.102313+00:00",
"checks": {
"server_config": {
"name": "server_config",
"status": "ok",
"message": "Server configuration resolved.",
"details": {
"web_port": 38083,
"frontend_port": 33003,
"metrics_enabled": true
}
}
}
}简单 liveness 探针,通常只返回:
{
"status": "alive"
}Prometheus 指标出口。
说明:
- 默认路径是
/api/metrics - 如果
metrics_path被改成其他值,应用也会额外挂载一个 metrics 别名路径 - metrics 路径默认不参与限流,避免 Prometheus 抓取被 429 干扰
默认会暴露:
moyuan_http_requests_totalmoyuan_http_request_duration_secondsmoyuan_http_in_flight_requestsmoyuan_chat_stream_requests_totalmoyuan_rate_limit_rejections_totalmoyuan_http_timeouts_totalmoyuan_sse_events_totalmoyuan_readiness_state
GET /api/health/llmGET /api/health/toolsGET /api/health/tools/intents
/api/health/tools 重点字段:
slointent_aggregatewindow_minutesdiagnostics
/api/health/tools/intents 重点字段:
window_minutestotal_requestsintent_aggregate
/api/health 当前还会带:
build.versionbuild.shabuild.created_at
当前 API 已统一错误响应格式:
{
"detail": {
"success": false,
"error": "Request validation failed.",
"code": "REQUEST_VALIDATION_FAILED",
"details": [
{
"field": "body.mode",
"message": "Input should be 'direct', 'react' or 'plan'",
"issueType": "literal_error"
}
]
}
}规则:
- 请求体、Query、Path 校验失败统一返回
422 + REQUEST_VALIDATION_FAILED - 业务语义错误返回稳定业务码,例如
SESSION_NOT_FOUND、MODEL_NOT_FOUND - 现在 request model 默认会做
strip whitespace + forbid extra fields
当前错误码总表见:
主对话接口,返回 text/event-stream。
请求体:
{
"message": "请规划上海周末 2 天轻松游,预算 1500 元以内",
"session_id": "optional-session-id",
"mode": "react"
}字段说明:
message: 用户输入session_id: 可选;为空时后端可创建新会话mode:direct | react | plan- 额外未声明字段会触发
REQUEST_VALIDATION_FAILED
前端当前会主动带:
X-Request-IDX-Trace-ID
如果你自己写调试脚本,也建议带上这两个头,便于把请求日志、SSE payload 和前端日志串起来。
流式接口当前会返回:
Content-Type: text/event-streamX-Request-IDX-Trace-IDCache-Control: no-cacheConnection: keep-alive
session_idreasoning_startreasoning_chunkreasoning_endplan_previewstagesubagent_startsubagent_endartifact_patchtool_starttool_endanswer_startchunkmetadataerrordone
当前仓库会额外维护一份稳定的 SSE 契约快照,便于评审字段和顺序变更:
导出命令:
python scripts/export_sse_contract_snapshot.pysession_idreasoning_startreasoning_chunk(可多次)plan_preview/subagent_start/stage/artifact_patch(按模式可选)reasoning_endanswer_startchunk(可多次)metadatadone
说明:
plan_preview、stage、subagent_start、subagent_end、artifact_patch、tool_start、tool_end可能穿插在中间- 若发生错误,通常会收到
error - 现在
session_id / metadata / done等事件都可能带request_id / trace_id plan_preview / metadata / done现在都可能带artifact
stage:
{
"type": "stage",
"stage": "query",
"label": "查询数据",
"progress": 45,
"request_id": "req-123",
"trace_id": "trace-456"
}subagent_start:
{
"type": "subagent_start",
"subagent": "planning",
"skills": ["PlanSynthesisSkill"],
"tool_names": ["plan_itinerary"],
"sequence": 1,
"trigger": "stage",
"request_id": "req-123",
"trace_id": "trace-456"
}artifact_patch:
{
"type": "artifact_patch",
"subagent": "verification",
"artifact_patch": {
"verification": {
"passed": true,
"summary": "Verification completed."
}
},
"request_id": "req-123",
"trace_id": "trace-456"
}chunk:
{
"type": "chunk",
"content": "上午建议先到外滩...",
"request_id": "req-123",
"trace_id": "trace-456"
}metadata:
{
"type": "metadata",
"run_id": "uuid",
"tools_used": ["query_hotels", "get_weather"],
"answer_length": 1560,
"reasoning_length": 820,
"verification_passed": true,
"stale_result_count": 0,
"fallback_steps": 1,
"artifact": {
"verification": {
"passed": true
}
},
"request_id": "req-123",
"trace_id": "trace-456"
}plan_idintentexplanationvalidation_statusvalidation_errorsstepsartifact
subagentskillstool_namessequencetrigger
subagentartifact_patch
tools_usedanswer_lengthreasoning_lengthplan_idexecution_statsverification_passedstale_result_countfallback_stepsartifactrequest_idtrace_id
POST /api/session/newGET /api/sessionsDELETE /api/session/{session_id}PUT /api/session/{session_id}/namePUT /api/session/{session_id}/modelGET /api/session/{session_id}/modelPOST /api/clear/{session_id}
说明:
name当前会做非空和长度校验model_id当前会做格式校验PUT /api/session/{session_id}/model现在会显式校验模型是否存在,不再接受任意字符串
GET /api/modelsGET /api/models/{model_id}
GET /api/citiesGET /api/cities/{city_id}GET /api/cities/{city_id}/attractionsGET /api/regionsGET /api/tags
用于行程卡中的真实路线预览与距离重排。
创建可分享短链。
请求体关键字段:
titlecontenthtml_contentdelivery_bundle
其中 delivery_bundle 当前会把 artifact + executionReceipt + htmlContent + share 元数据一并持久化,供分享页回放时恢复 artifact-first UI;title / content / html_content 继续保留为兼容字段。
请求体示例:
{
"title": "杭州旅行方案",
"content": "杭州旅行方案\n目的地:杭州",
"html_content": "<!doctype html><html><body><h1>杭州旅行方案</h1></body></html>",
"delivery_bundle": {
"schemaVersion": "2026-03-29",
"descriptor": {
"title": "杭州旅行方案",
"filenameBase": "travel-plan-plan-hz",
"summary": "周末轻松游",
"summaryLines": ["目的地:杭州"],
"metrics": [],
"warnings": [],
"subagentTrail": ["规划"],
"shareContent": "杭州旅行方案\n目的地:杭州",
"htmlDocumentTitle": "杭州旅行方案 | Moyuan Travel Agent",
"htmlSections": []
},
"artifact": {
"itinerary": {
"planId": "plan-hz"
}
},
"executionReceipt": {
"sessionId": "session-1"
},
"htmlContent": "<!doctype html><html><body><h1>杭州旅行方案</h1></body></html>",
"share": {
"title": "杭州旅行方案",
"content": "杭州旅行方案\n目的地:杭州"
}
}
}响应关键字段:
share_idshare_url
获取分享内容详情。
响应关键字段:
titlecontenthtml_contentdelivery_bundlecreated_at
说明:
- 新分享会优先通过
delivery_bundle回放,前端可据此恢复artifact / executionReceipt / subagentEvents - 老分享仍可回退到
content / html_content
GET /docsGET /rapidocGET /redoc
当前仓库还会维护一份 OpenAPI 快照文件:
- Response header 是否为
text/event-stream - 是否有
X-Request-ID / X-Trace-ID - 是否先收到
session_id - 是否最终收到
done - SSE payload 中是否持续带
request_id / trace_id
/api/ready返回的是200还是503checks里是哪一项失败/api/metrics中moyuan_readiness_state是否为1- 启动日志里是否有
startup_validation
The current frontend streaming consumer now treats these SSE fields as first-class application payloads:
plan_preview.artifactplan_preview.artifact_patchplan_preview.subagentmetadata.artifactdone.artifactsubagent_start.skillssubagent_end.statusartifact_patch.artifact_patch
Primary frontend landing points:
frontend/src/services/api/chatClient.tsfrontend/src/services/api/chatStreamParser.tsfrontend/src/components/ChatArea.tsxfrontend/src/components/MessageList.tsxfrontend/src/components/TravelPlanToolkit.tsx
Compatibility rule:
- Structured artifact data is preferred for summary / diagnostics / verification / plan identity.
- Free-text answer parsing is still retained for day-card extraction and compatibility with older responses.
GET /api/session/{session_id}/messages 现在会返回会话公开消息列表,供前端在刷新或切换会话后恢复历史内容。返回字段保留:
rolecontentreasoningtimestampdiagnostics
其中 diagnostics 会携带 Phase 3 结构化结果,包括 artifact、subagentEvents、planId、runId、requestId、traceId。服务端不会把仅供模型复用的 model_content 暴露给前端。
POST /api/chat/stream 现在额外接受可选字段 display_message。它的作用是把用户界面中真正展示的输入单独持久化到会话消息里,而把增强后的 prompt 继续保留给 Agent 运行时使用。