本文档定义了项目中所有API接口的统一响应格式规范,旨在:
message用于高层级描述,data.response用于具体内容code:HTTP状态码success:操作成功/失败的布尔值message:高层级分类描述,不包含具体业务细节data.response:用户最终看到的具体内容data.*:其他业务数据和元信息| 状态码 | 使用场景 | 说明 |
|---|---|---|
| 200 | 成功响应 | 包括业务成功和业务失败但HTTP通信成功的情况 |
| 400 | 请求参数错误 | 缺少必需参数、参数格式错误 |
| 422 | 参数验证失败 | 参数格式正确但业务逻辑验证失败 |
| 500 | 服务器内部错误 | 数据库错误、系统异常等 |
| 503 | 服务不可用 | Agent初始化失败、健康检查失败等 |
"操作成功""请求参数错误""参数验证失败""系统内部错误""服务暂时不可用""查询失败""生成失败""处理失败"{
"code": "HTTP状态码 (必须)",
"success": "布尔值,操作是否成功 (必须)",
"message": "高层级描述信息 (必须)",
"data": "数据载体,所有具体信息都在这里 (必须,可为null)"
}
code:HTTP状态码success:操作是否成功message:高层级描述data:数据载体response:用户看到的具体内容(推荐)timestamp:响应时间戳(推荐)error_type:错误类型标识(仅失败时)can_retry:是否可以重试(仅失败时)type:响应类型(DATABASE/CHAT)sql:生成的SQL语句(DATABASE类型)summary:LLM对查询结果的总结(DATABASE类型,可选)query_result:查询结果数据(DATABASE类型)session_id:会话IDexecution_path:执行路径classification_info:分类信息agent_version:Agent版本{
"code": 200,
"success": true,
"message": "操作成功",
"data": {
"type": "DATABASE",
"response": "共有120个服务区。",
"sql": "SELECT COUNT(*) AS 服务区总数 FROM bss_service_area WHERE delete_ts IS NULL;",
"summary": "共有120个服务区。",
"query_result": {
"columns": ["服务区总数"],
"rows": [{"服务区总数": 120}],
"row_count": 1,
"is_limited": false,
"total_row_count": 1
},
"session_id": "test_session_001",
"execution_path": ["classify", "agent_database", "format_response"],
"classification_info": {
"confidence": 0.95,
"method": "enhanced_llm",
"reason": "用户询问服务区数量统计"
},
"agent_version": "langgraph_v1",
"timestamp": "2025-06-21T19:31:19.948772"
}
}
{
"code": 200,
"success": true,
"message": "操作成功",
"data": {
"type": "DATABASE",
"sql": "SELECT service_area_name, company_id FROM bss_service_area LIMIT 10;",
"query_result": {
"columns": ["service_area_name", "company_id"],
"rows": [
{"service_area_name": "阳澄湖服务区", "company_id": "001"},
{"service_area_name": "梅村服务区", "company_id": "002"}
],
"row_count": 2,
"is_limited": true,
"total_row_count": 120
},
"session_id": "test_session_001",
"execution_path": ["classify", "agent_database", "format_response"],
"classification_info": {
"confidence": 0.95,
"method": "enhanced_llm",
"reason": "用户询问服务区列表"
},
"agent_version": "langgraph_v1",
"timestamp": "2025-06-21T19:31:19.948772"
}
}
{
"code": 422,
"success": false,
"message": "查询失败",
"data": {
"type": "DATABASE",
"response": "无法生成该查询,因为提供的上下文中缺少存储\"服务区经理名字\"的相关字段信息。",
"error_type": "sql_generation_failed",
"session_id": "test_session_001",
"execution_path": ["classify", "agent_database_error", "format_response"],
"classification_info": {
"confidence": 0.95,
"method": "enhanced_llm",
"reason": "用户询问服务区经理信息"
},
"agent_version": "langgraph_v1",
"timestamp": "2025-06-21T19:31:19.948772"
}
}
{
"code": 500,
"success": false,
"message": "查询失败",
"data": {
"type": "DATABASE",
"response": "查询执行失败,请稍后重试。",
"error_type": "sql_execution_failed",
"sql": "SELECT * FROM non_existent_table;",
"sql_error_category": "table_not_found",
"can_retry": false,
"session_id": "test_session_001",
"execution_path": ["classify", "agent_database", "sql_execution_error"],
"classification_info": {
"confidence": 0.95,
"method": "enhanced_llm",
"reason": "用户询问数据统计"
},
"agent_version": "langgraph_v1",
"timestamp": "2025-06-21T19:31:19.948772"
}
}
{
"code": 200,
"success": true,
"message": "操作成功",
"data": {
"type": "CHAT",
"response": "根据我的知识库,中国荔枝的主要产地集中在南方地区,包括广东、广西、福建、海南等省份。",
"session_id": "test_session_001",
"execution_path": ["start", "classify", "agent_chat", "format_response"],
"classification_info": {
"confidence": 0.85,
"method": "rule_based_non_business",
"reason": "包含非业务实体词: ['荔枝']"
},
"agent_version": "langgraph_v1",
"timestamp": "2025-06-21T22:53:37.723684"
}
}
{
"code": 503,
"success": false,
"message": "服务暂时不可用",
"data": {
"response": "AI服务暂时不可用,请稍后重试。",
"error_type": "agent_initialization_failed",
"can_retry": true,
"session_id": "test_session_001",
"execution_path": ["agent_init_error"],
"agent_version": "langgraph_v1",
"timestamp": "2025-06-21T19:31:19.948772"
}
}
{
"code": 400,
"success": false,
"message": "请求参数错误",
"data": {
"response": "缺少必需参数:question",
"error_type": "missing_required_params",
"missing_params": ["question"],
"timestamp": "2025-06-21T19:31:19.948772"
}
}
{
"code": 500,
"success": false,
"message": "系统内部错误",
"data": {
"response": "请求处理异常,请稍后重试。",
"error_type": "request_processing_failed",
"can_retry": true,
"session_id": "test_session_001",
"execution_path": ["general_error"],
"agent_version": "langgraph_v1",
"timestamp": "2025-06-21T19:31:19.948772"
}
}
{
"code": 200,
"success": true,
"message": "操作成功",
"data": {
"status": "healthy",
"test_result": true,
"workflow_compiled": true,
"tools_count": 4,
"response": "Agent健康检查完成",
"checks": {
"agent_creation": true,
"tools_import": true,
"llm_connection": true,
"classifier_ready": true
},
"timestamp": "2025-06-21T19:31:19.948772"
}
}
{
"code": 503,
"success": false,
"message": "服务暂时不可用",
"data": {
"status": "degraded",
"test_result": false,
"workflow_compiled": false,
"tools_count": 0,
"response": "部分组件异常",
"checks": {
"agent_creation": false,
"tools_import": true,
"llm_connection": true,
"classifier_ready": true
},
"timestamp": "2025-06-21T19:31:19.948772"
}
}
common/result.py修改重点:
data 字段传递新增功能:
common/messages.py内容:
class MessageTemplate:
SUCCESS = "操作成功"
BAD_REQUEST = "请求参数错误"
VALIDATION_FAILED = "参数验证失败"
INTERNAL_ERROR = "系统内部错误"
SERVICE_UNAVAILABLE = "服务暂时不可用"
QUERY_FAILED = "查询失败"
GENERATION_FAILED = "生成失败"
PROCESSING_FAILED = "处理失败"
citu_app.py需要修改的API接口:
/api/v0/ask_agent
data_result → query_resultmessage 到 data.response/api/v0/ask 和 /api/v0/ask_cached
rows, columns → query_result/api/v0/agent_health
data.message → data.response其他管理API
/api/v0/cache_overview/api/v0/cache_cleanup/api/v0/training_error_question_sql/api/v0/citu_run_sqlflask_app.py修改内容:
agent/citu_agent.py主要修改点:
_format_response_node() 方法:
data_result → query_resulterror → data.responseresponse 字段使用process_question() 方法:
agent/state.py修改内容:
final_response 结构定义文件: agent/tools/sql_execution.py, agent/tools/summary_generation.py, agent/tools/general_chat.py
修改内容:
docs/agent api 说明.md更新内容:
| 优先级 | 阶段 | 文件/模块 | 依赖关系 |
|---|---|---|---|
| P0 | 第一阶段 | common/result.py |
无依赖,基础组件 |
| P0 | 第一阶段 | common/messages.py |
无依赖,新建文件 |
| P1 | 第二阶段 | citu_app.py |
依赖第一阶段完成 |
| P1 | 第二阶段 | agent/citu_agent.py |
依赖第一阶段完成 |
| P2 | 第三阶段 | agent/state.py, agent/tools/* |
依赖前两阶段 |
| P2 | 第三阶段 | flask_app.py |
依赖第一阶段 |
| P3 | 第四阶段 | 文档更新 | 依赖前三阶段 |
字段重命名
data_result → query_resultdata.message → data.response(健康检查API)内容迁移
message → data.responsedata.response格式统一
Message标准化
function handleApiResponse(response) {
const { code, success, message, data } = response;
if (success) {
// 成功情况处理
if (data.type === "DATABASE") {
// 数据库查询成功
if (data.summary || data.response) {
displaySummary(data.summary || data.response);
}
if (data.query_result) {
displayTable(data.query_result);
}
if (data.sql) {
displaySQL(data.sql);
}
} else if (data.type === "CHAT") {
// 聊天回复
displayChatMessage(data.response);
} else {
// 其他成功情况
displayMessage(data.response || message);
}
} else {
// 失败情况处理
const errorMessage = data.response || message;
displayError(errorMessage);
// 根据错误类型提供特殊处理
if (data.error_type === "sql_generation_failed") {
showSuggestion("请尝试重新描述您的问题");
} else if (data.can_retry) {
showRetryButton();
}
}
}
success - 主要成功/失败判断data.type - 响应类型判断(DATABASE/CHAT)data.response - 用户展示内容data.error_type - 错误类型特殊处理data.can_retry - 重试机制判断data.summary 或 data.responsedata.query_resultdata.sql(可选显示)这样的设计确保前端能够以统一、简洁的方式处理所有API响应,提高开发效率和用户体验。