"""FastAPI Record相关接口"""
import json
from typing import Annotated
from fastapi import APIRouter, Depends, status
from fastapi.responses import JSONResponse
from apps.common.security import Security
from apps.dependency import get_user, verify_user
from apps.schemas.record import (
RecordContent,
RecordData,
RecordFlow,
RecordFlowStep,
RecordMetadata,
)
from apps.schemas.response_data import (
RecordListMsg,
RecordListRsp,
ResponseData,
)
from apps.schemas.task import FlowStepHistory
from apps.services.conversation import ConversationManager
from apps.services.document import DocumentManager
from apps.services.record import RecordManager
from apps.services.task import TaskManager
router = APIRouter(
prefix="/api/record",
tags=["record"],
dependencies=[
Depends(verify_user),
],
)
@router.get(
"/{conversation_id}",
response_model=RecordListRsp,
responses={status.HTTP_403_FORBIDDEN: {"model": ResponseData}},
)
async def get_record(conversation_id: str, user_sub: Annotated[str, Depends(get_user)]) -> JSONResponse:
"""获取某个对话的所有问答对"""
cur_conv = await ConversationManager.get_conversation_by_conversation_id(user_sub, conversation_id)
if not cur_conv:
return JSONResponse(
status_code=status.HTTP_403_FORBIDDEN,
content=ResponseData(
code=status.HTTP_403_FORBIDDEN,
message="Conversation invalid.",
result={},
).model_dump(exclude_none=True),
)
record_group_list = await RecordManager.query_record_group_by_conversation_id(conversation_id)
result = []
for record_group in record_group_list:
for record in record_group.records:
record_data = Security.decrypt(record.content, record.key)
record_data = RecordContent.model_validate(json.loads(record_data))
tmp_record = RecordData(
id=record.id,
groupId=record_group.id,
taskId=record.task_id,
conversationId=conversation_id,
content=record_data,
metadata=record.metadata
if record.metadata
else RecordMetadata(
inputTokens=0,
outputTokens=0,
timeCost=0,
),
comment=record.comment.comment,
createdAt=record.created_at,
)
tmp_record.document = await DocumentManager.get_used_docs_by_record_group(user_sub, record_group.id)
flow_step_list = await TaskManager.get_context_by_record_id(record_group.id, record.id)
if flow_step_list:
tmp_record.flow = RecordFlow(
id=record.flow.flow_id,
recordId=record.id,
flowId=record.flow.flow_id,
flowName=record.flow.flow_name,
flowStatus=record.flow.flow_staus,
stepNum=len(flow_step_list),
steps=[],
)
for flow_step in flow_step_list:
tmp_record.flow.steps.append(
RecordFlowStep(
stepId=flow_step.step_id,
stepName=flow_step.step_name,
stepStatus=flow_step.step_status,
input=flow_step.input_data,
output=flow_step.output_data,
exData=flow_step.ex_data
),
)
result.append(tmp_record)
return JSONResponse(
status_code=status.HTTP_200_OK,
content=RecordListRsp(
code=status.HTTP_200_OK,
message="success",
result=RecordListMsg(records=result),
).model_dump(exclude_none=True, by_alias=True),
)