fix(agent): serialize retrieval trace responses
This commit is contained in:
@@ -16,6 +16,10 @@ def register_exception_handlers(app: FastAPI) -> None:
|
||||
async def validation_exception_handler(request: Request, exc: RequestValidationError) -> JSONResponse:
|
||||
return JSONResponse(status_code=422, content=api_error(10000, "请求参数不正确", exc.errors()))
|
||||
|
||||
@app.exception_handler(Exception)
|
||||
async def unhandled_exception_handler(request: Request, exc: Exception) -> JSONResponse:
|
||||
return JSONResponse(status_code=500, content=api_error(50000, "系统内部错误,请稍后重试"))
|
||||
|
||||
|
||||
def _code_from_status(status_code: int) -> int:
|
||||
if status_code in {401, 403}:
|
||||
|
||||
@@ -127,7 +127,7 @@ class KnowledgeAgentService:
|
||||
log.selected_knowledge_ids = ",".join(str(item) for item in selected_ids)
|
||||
log.query_terms = json.dumps(terms, ensure_ascii=False)
|
||||
log.final_section_ids = ",".join(str(item.section.id) for item in selected)
|
||||
log.tool_trace = json.dumps(trace, ensure_ascii=False)
|
||||
log.tool_trace = _dump_trace(trace)
|
||||
log.tool_cost_ms = int((perf_counter() - started) * 1000)
|
||||
log.status = "prepared"
|
||||
db.add(log)
|
||||
@@ -152,7 +152,7 @@ class KnowledgeAgentService:
|
||||
except Exception as exc:
|
||||
log.status = "failed"
|
||||
log.error_message = str(exc)
|
||||
log.tool_trace = json.dumps(trace, ensure_ascii=False)
|
||||
log.tool_trace = _dump_trace(trace)
|
||||
log.tool_cost_ms = int((perf_counter() - started) * 1000)
|
||||
db.add(log)
|
||||
raise
|
||||
@@ -431,6 +431,18 @@ class KnowledgeAgentService:
|
||||
return content if len(content) <= 3200 else content[:3200].rstrip() + "\n[章节内容已按保护规则截断]"
|
||||
|
||||
|
||||
def _dump_trace(trace: list[dict]) -> str:
|
||||
"""Persist tool traces without failing on database datetime values."""
|
||||
return json.dumps(trace, ensure_ascii=False, default=_json_trace_value)
|
||||
|
||||
|
||||
def _json_trace_value(value):
|
||||
isoformat = getattr(value, "isoformat", None)
|
||||
if callable(isoformat):
|
||||
return isoformat()
|
||||
return str(value)
|
||||
|
||||
|
||||
def _extract_json(value: str) -> str:
|
||||
match = re.search(r"\{[\s\S]*\}", value)
|
||||
if not match:
|
||||
|
||||
Reference in New Issue
Block a user