后端: 1.获取agent聊天历史记录接口做了如下更改: (1)对reasoning_content也做了存储,同步更改了mysql和redis缓存的读写逻辑 (2)为了承接前端的重试/修改消息的逻辑,进行了一些代码和表单上的改动 前端: 1.agent页面新增了很多小组件,改善交互体验 2.新增重试消息/修改消息并重新发送功能,前者有bug,可能前后端都有问题,待修复。
391 lines
11 KiB
YAML
391 lines
11 KiB
YAML
openapi: 3.0.3
|
|
info:
|
|
title: SmartFlow Agent History API
|
|
version: 0.8.1
|
|
description: Latest conversation history API spec, including persisted reasoning content.
|
|
|
|
servers:
|
|
- url: http://localhost:8080
|
|
|
|
paths:
|
|
/api/v1/agent/chat:
|
|
post:
|
|
tags:
|
|
- Agent
|
|
summary: Stream chat reply
|
|
description: |
|
|
Starts an Agent chat request.
|
|
Retry uses the same endpoint and passes retry metadata in `extra`.
|
|
security:
|
|
- BearerAuth: []
|
|
requestBody:
|
|
required: true
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/AgentChatRequest'
|
|
examples:
|
|
normal:
|
|
value:
|
|
conversation_id: 8df59142-29a2-4bf6-85b6-c5e3f4e9cb89
|
|
message: Help me review tomorrow's tasks.
|
|
model: worker
|
|
thinking: true
|
|
extra: {}
|
|
retry:
|
|
value:
|
|
conversation_id: 8df59142-29a2-4bf6-85b6-c5e3f4e9cb89
|
|
message: Help me review tomorrow's tasks.
|
|
model: worker
|
|
thinking: true
|
|
extra:
|
|
request_mode: retry
|
|
retry_group_id: retry-group-001
|
|
retry_from_user_message_id: 123
|
|
retry_from_assistant_message_id: 456
|
|
responses:
|
|
'200':
|
|
description: SSE stream response
|
|
'400':
|
|
description: Invalid request
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/ErrorResponse'
|
|
'401':
|
|
description: Unauthorized
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/ErrorResponse'
|
|
|
|
/api/v1/agent/conversation-list:
|
|
get:
|
|
tags:
|
|
- Agent
|
|
summary: Get conversation list
|
|
security:
|
|
- BearerAuth: []
|
|
parameters:
|
|
- name: page
|
|
in: query
|
|
required: false
|
|
schema:
|
|
type: integer
|
|
minimum: 1
|
|
example: 1
|
|
- name: page_size
|
|
in: query
|
|
required: false
|
|
schema:
|
|
type: integer
|
|
minimum: 1
|
|
maximum: 100
|
|
example: 20
|
|
- name: limit
|
|
in: query
|
|
required: false
|
|
description: Alias of page_size.
|
|
schema:
|
|
type: integer
|
|
minimum: 1
|
|
maximum: 100
|
|
example: 20
|
|
- name: status
|
|
in: query
|
|
required: false
|
|
schema:
|
|
type: string
|
|
enum: [active, archived]
|
|
example: active
|
|
responses:
|
|
'200':
|
|
description: Success
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/ConversationListEnvelope'
|
|
'400':
|
|
description: Invalid request
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/ErrorResponse'
|
|
'401':
|
|
description: Unauthorized
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/ErrorResponse'
|
|
|
|
/api/v1/agent/conversation-history:
|
|
get:
|
|
tags:
|
|
- Agent
|
|
summary: Get conversation history
|
|
description: |
|
|
Returns chat history for a conversation.
|
|
The service validates ownership first, then prefers Redis and falls back to MySQL.
|
|
`reasoning_content` is now returned from both cache hits and DB-backed history when available.
|
|
`reasoning_duration_seconds` is server-computed and persisted in seconds.
|
|
Retry groups are returned via `retry_group_id`, `retry_index`, and `retry_total`.
|
|
security:
|
|
- BearerAuth: []
|
|
parameters:
|
|
- name: conversation_id
|
|
in: query
|
|
required: true
|
|
schema:
|
|
type: string
|
|
format: uuid
|
|
example: 8df59142-29a2-4bf6-85b6-c5e3f4e9cb89
|
|
responses:
|
|
'200':
|
|
description: Success
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/ConversationHistoryEnvelope'
|
|
examples:
|
|
success:
|
|
value:
|
|
status: "10000"
|
|
info: success
|
|
data:
|
|
- id: 101
|
|
role: user
|
|
content: Help me review tomorrow's most important task.
|
|
created_at: "2026-03-24T22:15:01+08:00"
|
|
reasoning_content: ""
|
|
reasoning_duration_seconds: 0
|
|
retry_group_id: retry-group-001
|
|
retry_index: 1
|
|
retry_total: 2
|
|
- id: 102
|
|
role: assistant
|
|
content: Tomorrow you should prioritize the DB integration and API validation.
|
|
created_at: "2026-03-24T22:15:06+08:00"
|
|
reasoning_content: "Stage: request.accepted\nUser request accepted.\n\nStage: task_query.reflecting\nComparing the retrieved tasks and selecting the tightest deadlines."
|
|
reasoning_duration_seconds: 5
|
|
retry_group_id: retry-group-001
|
|
retry_index: 2
|
|
retry_total: 2
|
|
'400':
|
|
description: Missing parameter or conversation not found
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/ErrorResponse'
|
|
'401':
|
|
description: Unauthorized
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/ErrorResponse'
|
|
|
|
components:
|
|
securitySchemes:
|
|
BearerAuth:
|
|
type: http
|
|
scheme: bearer
|
|
bearerFormat: JWT
|
|
|
|
schemas:
|
|
AgentChatRequest:
|
|
type: object
|
|
required:
|
|
- message
|
|
properties:
|
|
conversation_id:
|
|
type: string
|
|
format: uuid
|
|
nullable: true
|
|
message:
|
|
type: string
|
|
model:
|
|
type: string
|
|
nullable: true
|
|
example: worker
|
|
thinking:
|
|
type: boolean
|
|
example: true
|
|
extra:
|
|
$ref: '#/components/schemas/AgentChatExtra'
|
|
|
|
AgentChatExtra:
|
|
type: object
|
|
additionalProperties: true
|
|
properties:
|
|
request_mode:
|
|
type: string
|
|
description: Use `retry` when regenerating a previous answer version.
|
|
example: retry
|
|
retry_group_id:
|
|
type: string
|
|
nullable: true
|
|
example: retry-group-001
|
|
retry_from_user_message_id:
|
|
type: integer
|
|
nullable: true
|
|
example: 123
|
|
retry_from_assistant_message_id:
|
|
type: integer
|
|
nullable: true
|
|
example: 456
|
|
|
|
ErrorResponse:
|
|
type: object
|
|
required:
|
|
- status
|
|
- info
|
|
properties:
|
|
status:
|
|
type: string
|
|
example: "40005"
|
|
info:
|
|
type: string
|
|
example: wrong param type
|
|
|
|
ConversationListEnvelope:
|
|
type: object
|
|
required:
|
|
- status
|
|
- info
|
|
- data
|
|
properties:
|
|
status:
|
|
type: string
|
|
example: "10000"
|
|
info:
|
|
type: string
|
|
example: success
|
|
data:
|
|
$ref: '#/components/schemas/ConversationListResponse'
|
|
|
|
ConversationListResponse:
|
|
type: object
|
|
required:
|
|
- list
|
|
- page
|
|
- page_size
|
|
- limit
|
|
- total
|
|
- has_more
|
|
properties:
|
|
list:
|
|
type: array
|
|
items:
|
|
$ref: '#/components/schemas/ConversationListItem'
|
|
page:
|
|
type: integer
|
|
example: 1
|
|
page_size:
|
|
type: integer
|
|
example: 20
|
|
limit:
|
|
type: integer
|
|
example: 20
|
|
total:
|
|
type: integer
|
|
format: int64
|
|
example: 56
|
|
has_more:
|
|
type: boolean
|
|
example: true
|
|
|
|
ConversationListItem:
|
|
type: object
|
|
required:
|
|
- conversation_id
|
|
- title
|
|
- has_title
|
|
- message_count
|
|
- status
|
|
properties:
|
|
conversation_id:
|
|
type: string
|
|
format: uuid
|
|
title:
|
|
type: string
|
|
example: Tomorrow task review
|
|
has_title:
|
|
type: boolean
|
|
example: true
|
|
message_count:
|
|
type: integer
|
|
example: 14
|
|
last_message_at:
|
|
type: string
|
|
format: date-time
|
|
nullable: true
|
|
status:
|
|
type: string
|
|
example: active
|
|
created_at:
|
|
type: string
|
|
format: date-time
|
|
nullable: true
|
|
|
|
ConversationHistoryEnvelope:
|
|
type: object
|
|
required:
|
|
- status
|
|
- info
|
|
- data
|
|
properties:
|
|
status:
|
|
type: string
|
|
example: "10000"
|
|
info:
|
|
type: string
|
|
example: success
|
|
data:
|
|
type: array
|
|
items:
|
|
$ref: '#/components/schemas/ConversationHistoryItem'
|
|
|
|
ConversationHistoryItem:
|
|
type: object
|
|
required:
|
|
- role
|
|
- content
|
|
properties:
|
|
id:
|
|
type: integer
|
|
description: Database primary key. May be omitted on pure cache hits.
|
|
example: 102
|
|
role:
|
|
type: string
|
|
enum: [user, assistant, system]
|
|
example: assistant
|
|
content:
|
|
type: string
|
|
example: Tomorrow you should prioritize the DB integration and API validation.
|
|
created_at:
|
|
type: string
|
|
format: date-time
|
|
nullable: true
|
|
reasoning_content:
|
|
type: string
|
|
description: Aggregated reasoning text, including streamed model reasoning or stage-level thinking text.
|
|
example: "Stage: request.accepted\nUser request accepted."
|
|
reasoning_duration_seconds:
|
|
type: integer
|
|
description: Server-computed reasoning duration in seconds.
|
|
example: 5
|
|
retry_group_id:
|
|
type: string
|
|
nullable: true
|
|
description: Retry group identifier shared by the original answer and all retry versions.
|
|
example: retry-group-001
|
|
retry_index:
|
|
type: integer
|
|
nullable: true
|
|
description: 1-based version index within the retry group.
|
|
example: 2
|
|
retry_total:
|
|
type: integer
|
|
nullable: true
|
|
description: Total number of versions currently in the retry group.
|
|
example: 2
|