Files
AIclinicalresearch/docs/03-业务模块/AIA-AI智能问答/04-开发计划/02-后端API设计.md
HaHafeng 1b53ab9d52 feat(aia): Complete AIA V2.0 with universal streaming capabilities
Major Changes:
- Add StreamingService with OpenAI Compatible format
- Upgrade Chat component V2 with Ant Design X integration
- Implement AIA module with 12 intelligent agents
- Update API routes to unified /api/v1 prefix
- Update system documentation

Backend (~1300 lines):
- common/streaming: OpenAI Compatible adapter
- modules/aia: 12 agents, conversation service, streaming integration
- Update route versions (RVW, PKB to v1)

Frontend (~3500 lines):
- modules/aia: AgentHub + ChatWorkspace (100% prototype restoration)
- shared/Chat: AIStreamChat, ThinkingBlock, useAIStream Hook
- Update API endpoints to v1

Documentation:
- AIA module status guide
- Universal capabilities catalog
- System overview updates
- All module documentation sync

Tested: Stream response verified, authentication working
Status: AIA V2.0 core completed (85%)
2026-01-14 19:15:01 +08:00

572 lines
11 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# AIA V2.1 <20>𡒊垢 API 霈曇恣
> **<2A><>𧋦**嚗间2.1
> **<2A>𥕦遣<F0A595A6><EFBFBD>**嚗?026-01-11
> **<2A><EFBFBD>頝臬<E9A09D>**嚗䫤/api/v1/aia`
---
## <20><> API 璁<><E79281>
| <20><EFBFBD> | 頝臬<E9A09D> | <20>讛膩 | 霈方<E99C88> |
|------|------|------|------|
| GET | `/agents` | <20><EFBFBD><E79195><EFBFBD>雿枏<E99BBF>銵?| <20>?|
| GET | `/agents/:id` | <20><EFBFBD><E79195><EFBFBD>雿栞祕<E6A09E>?| <20>?|
| POST | `/intent/route` | <20>誩㦛頝舐眏 | <20>?|
| GET | `/conversations` | <20><EFBFBD>撖寡<E69296><E5AFA1>𡑒” | <20>?|
| POST | `/conversations` | <20>𥕦遣撖寡<E69296> | <20>?|
| GET | `/conversations/:id` | <20><EFBFBD>撖寡<E69296>霂行<E99C82> | <20>?|
| DELETE | `/conversations/:id` | <20>𣳇膄撖寡<E69296> | <20>?|
| POST | `/conversations/:id/messages/stream` | <20><EFBFBD><E785BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E7989A>嚗?| <20>?|
| POST | `/conversations/:id/attachments` | 銝𠹺<E98A9D><F0A0B9BA><EFBFBD>辣 | <20>?|
| GET | `/projects` | <20><EFBFBD>憿寧𤌍<E5AFA7>𡑒” | <20>?|
| GET | `/projects/:id` | <20><EFBFBD>憿寧𤌍霂行<E99C82> | <20>?|
---
## <20><> 霈方<E99C88>
<EFBFBD><EFBFBD><EFBFBD>?API <20><><EFBFBD>銁霂瑟<E99C82>憭港葉<E6B8AF>箏蒂 JWT Token嚗?
```
Authorization: Bearer <token>
```
---
## <20><> API 霂衣<E99C82>摰帋<E691B0>
### 1. <20><EFBFBD>雿梶㮾<E6A2B6>?
#### 1.1 <20><EFBFBD><E79195><EFBFBD>雿枏<E99BBF>銵?
```http
GET /api/v1/aia/agents
```
**<EFBFBD>亥砭<EFBFBD><EFBFBD>㺭**嚗?
| <20><>㺭 | 蝐餃<E89D90> | 敹<> | <20>讛膩 |
|------|------|------|------|
| stage | string | <20>?| 蝑偦<E89D91>厰𧫴畾蛛<E795BE>`design`, `data`, `analysis`, `write`, `publish` |
**<EFBFBD><EFBFBD>**嚗?
```json
{
"code": 0,
"data": {
"agents": [
{
"id": "research-design",
"name": "蝘𤑳<E89D98>霈曇恣撠誩𨭌<E8AAA9>?,
"description": "𨭌<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>",
"icon": "<EFBFBD>𥈡",
"stage": "design",
"color": "#3B82F6",
"knowledgeBaseId": "kb-001",
"isTool": false
},
{
"id": "dc-tool",
"name": "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>",
"description": "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>?,
"icon": "<22><>",
"stage": "data",
"color": "#8B5CF6",
"targetModule": "/data-collection",
"isTool": true
}
]
}
}
```
#### 1.2 <20><EFBFBD><E79195><EFBFBD>雿栞祕<E6A09E>?
```http
GET /api/v1/aia/agents/:id
```
**<EFBFBD><EFBFBD>**嚗?
```json
{
"code": 0,
"data": {
"id": "research-design",
"name": "蝘𤑳<E89D98>霈曇恣撠誩𨭌<E8AAA9>?,
"description": "𨭌<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>",
"icon": "<EFBFBD>𥈡",
"stage": "design",
"color": "#3B82F6",
"knowledgeBaseId": "kb-001",
"systemPrompt": "<EFBFBD><EFBFBD>𡁶<EFBFBD><EFBFBD>𤑳<EFBFBD>...",
"welcomeMessage": "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>n- <EFBFBD>𠉛<EFBFBD><EFBFBD>\n- <EFBFBD><EFBFBD><EFBFBD><EFBFBD>n- <EFBFBD><EFBFBD><EFBFBD>𠉛<EFBFBD><EFBFBD>",
"suggestedQuestions": [
"<EFBFBD><EFBFBD><EFBFBD>CT<EFBFBD>𠉛?,
"撣格<E692A3><EFBFBD><E89D9D>5撟渡<E6929F>撠輻<E692A0><E8BCBB>𠉛弦<F0A0899B><E5BCA6>讃",
"隞<><EFBFBD><E98A8B><EFBFBD><EFBFBD>雿輻鍂<E8BCBB><EFBFBD><E69B89><EFBFBD><E689AF><EFBFBD><EFBFBD><EFBFBD>"
]
}
}
```
---
### 2. <20>誩㦛頝舐眏
#### 2.1 <20><EFBFBD><E7AE84>誩㦛霂<E3A69B><E99C82>
```http
POST /api/v1/aia/intent/route
```
**霂瑟<E99C82>雿?*嚗?
```json
{
"query": "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>?
}
```
**<EFBFBD><EFBFBD>**嚗?
```json
{
"code": 0,
"data": {
"agentId": "data-analysis",
"agentName": "蝏蠘恣<E8A098><E681A3><EFBFBD>撠誩𨭌<E8AAA9>?,
"confidence": 0.92,
"prefillPrompt": "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>𡠺<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>?
}
}
```
---
### 3. 撖寡<E69296>蝞∠<E89D9E>
#### 3.1 <20><EFBFBD>撖寡<E69296><E5AFA1>𡑒”
```http
GET /api/v1/aia/conversations
```
**<EFBFBD>亥砭<EFBFBD><EFBFBD>㺭**嚗?
| <20><>㺭 | 蝐餃<E89D90> | 敹<> | <20>讛膩 |
|------|------|------|------|
| agentId | string | <20>?| <20>㗇惣<E39787><EFBFBD>蝑偦<E89D91>?|
| projectId | string | <20>?| <20>厰★<E58EB0><EFBFBD><E6A183><EFBFBD>NULL 銵函內<E587BD>𡁶鍂撖寡<E69296>嚗?|
| page | number | <20>?| 憿萇<E686BF>嚗屸<E59A97>霈?1 |
| pageSize | number | <20>?| 瘥誯△<E8AAAF><EFBFBD>嚗屸<E59A97>霈?20 |
**<EFBFBD><EFBFBD>**嚗?
```json
{
"code": 0,
"data": {
"conversations": [
{
"id": "conv-001",
"title": "RCT<43>𠉛弦霈曇恣<E69B87>刻砭",
"agentId": "research-design",
"agentName": "蝘𤑳<E89D98>霈曇恣撠誩𨭌<E8AAA9>?,
"projectId": null,
"messageCount": 12,
"lastMessage": "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>?..",
"createdAt": "2026-01-11T10:00:00Z",
"updatedAt": "2026-01-11T12:30:00Z"
}
],
"pagination": {
"total": 25,
"page": 1,
"pageSize": 20,
"totalPages": 2
}
}
}
```
#### 3.2 <20>𥕦遣撖寡<E69296>
```http
POST /api/v1/aia/conversations
```
**霂瑟<E99C82>雿?*嚗?
```json
{
"agentId": "research-design",
"projectId": null,
"title": "<EFBFBD>?
}
```
**<EFBFBD><EFBFBD>**嚗?
```json
{
"code": 0,
"data": {
"id": "conv-002",
"title": "<22>啣笆霂?,
"agentId": "research-design",
"projectId": null,
"createdAt": "2026-01-11T14:00:00Z"
}
}
```
#### 3.3 <20><EFBFBD>撖寡<E69296>霂行<E99C82><EFBFBD><EFBFBD><E98984>蟮瘨<E89FAE><E798A8>嚗?
```http
GET /api/v1/aia/conversations/:id
```
**<EFBFBD>亥砭<EFBFBD><EFBFBD>㺭**嚗?
| <20><>㺭 | 蝐餃<E89D90> | 敹<> | <20>讛膩 |
|------|------|------|------|
| limit | number | <20>?| <20><EFBFBD><E79195><EFBFBD>餈𤨩<E9A488><EFBFBD><E28AA5><EFBFBD>暺䁅恕 50 |
**<EFBFBD><EFBFBD>**嚗?
```json
{
"code": 0,
"data": {
"id": "conv-001",
"title": "RCT<43>𠉛弦霈曇恣<E69B87>刻砭",
"agentId": "research-design",
"agentName": "蝘𤑳<E89D98>霈曇恣撠誩𨭌<E8AAA9>?,
"projectId": null,
"createdAt": "2026-01-11T10:00:00Z",
"updatedAt": "2026-01-11T12:30:00Z",
"messages": [
{
"id": "msg-001",
"role": "user",
"content": "<EFBFBD><EFBFBD><EFBFBD>𡒊<EFBFBD><EFBFBD><EFBFBD><EFBFBD>CT<EFBFBD>𠉛",
"attachments": [],
"createdAt": "2026-01-11T10:00:00Z"
},
{
"id": "msg-002",
"role": "assistant",
"content": "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>RCT<EFBFBD>𠉛<EFBFBD><EFBFBD>...",
"thinkingContent": "<EFBFBD><EFBFBD><EFBFBD>CT<EFBFBD>𠉛<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>?<EFBFBD>𤌍<EFBFBD>?2<EFBFBD><EFBFBD><EFBFBD><EFBFBD>?3<EFBFBD><EFBFBD> 4<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 5𤩅?6<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...",
"model": "deepseek-v3",
"tokens": 1250,
"createdAt": "2026-01-11T10:00:30Z"
}
]
}
}
```
#### 3.4 <20>𣳇膄撖寡<E69296>
```http
DELETE /api/v1/aia/conversations/:id
```
**<EFBFBD><EFBFBD>**嚗?
```json
{
"code": 0,
"data": {
"deleted": true
}
}
```
---
### 4. 瘨<><E798A8><EFBFBD><EFBFBD><E785BE><EFBFBD><EFBFBD><E7989A>嚗?
#### 4.1 <20><EFBFBD><E785BE><EFBFBD><EFBFBD>臬僎<E887AC><EFBFBD><EFBFBD><E7989A><EFBFBD><EFBFBD>
```http
POST /api/v1/aia/conversations/:id/messages/stream
```
**霂瑟<E99C82>憭?*嚗?
```
Content-Type: application/json
Accept: text/event-stream
```
**霂瑟<E99C82>雿?*嚗?
```json
{
"content": "撣格<E692A3><E6A0BC><EFBFBD><EFBFBD>餈嗘遢<E59798>唳旿",
"attachmentIds": ["att-001", "att-002"],
"enableDeepThinking": true
}
```
**<EFBFBD><EFBFBD>嚗𠄎SE <20><EFBFBD>嚗?*嚗?
```
event: thinking_start
data: {}
event: thinking_delta
data: {"content": "<22><EFBFBD>銝𠹺<E98A9D><EFBFBD><EFBFBD><EFBFBD>隞塚<E99A9E><E5A19A><EFBFBD>閬?}
event: thinking_delta
data: {"content": "餈𥡝<E9A488><F0A5A19D>讛膩<E8AE9B><EFBFBD><E99C88><E288AA>?.."}
event: thinking_end
data: {"duration": 3200}
event: message_start
data: {"id": "msg-003"}
event: delta
data: {"content": "<22>寞旿<E5AF9E><EFBFBD>隡删<E99AA1><E588A0>唳旿嚗?}
event: delta
data: {"content": "<22>烐䔉銝箸<E98A9D>餈𥡝<E9A488><F0A5A19D><EFBFBD><EFBFBD>..."}
event: message_end
data: {"id": "msg-003", "tokens": 850, "model": "deepseek-v3"}
event: done
data: {}
```
**SSE 鈭衤辣蝐餃<E89D90>**嚗?
| 鈭衤辣 | <20>讛膩 | <20>唳旿<E594B3><EFBFBD> |
|------|------|---------|
| `thinking_start` | 撘<>憪𧢲楛摨行<E691A8><EFBFBD>?| `{}` |
| `thinking_delta` | <20><EFBFBD><E882BD><EFBFBD>摰寧<E691B0>畾?| `{"content": "..."}` |
| `thinking_end` | <20><EFBFBD><E882BD><EFBFBD><EFBFBD>?| `{"duration": number}` |
| `message_start` | 撘<>憪讠<E686AA><E8AEA0>𣂼<EFBFBD>憭?| `{"id": "..."}` |
| `delta` | <20>𧼮<EFBFBD><F0A7BCAE><EFBFBD><EFBFBD><E68D86>挾 | `{"content": "..."}` |
| `message_end` | <20>𧼮<EFBFBD>蝏𤘪<E89D8F> | `{"id": "...", "tokens": number, "model": "..."}` |
| `error` | <20>𤑳<EFBFBD><F0A491B3>躰秤 | `{"code": "...", "message": "..."}` |
| `done` | 瘚<><E7989A><EFBFBD>?| `{}` |
---
### 5. <20><>辣銝𠹺<E98A9D>
#### 5.1 銝𠹺<E98A9D><F0A0B9BA><EFBFBD>
```http
POST /api/v1/aia/conversations/:id/attachments
```
**霂瑟<E99C82>憭?*嚗?
```
Content-Type: multipart/form-data
```
**霂瑟<E99C82>雿橒<E99BBF>FormData嚗?*嚗?
| 摮埈挾 | 蝐餃<E89D90> | 敹<> | <20>讛膩 |
|------|------|------|------|
| file | File | <20>?| <20><>辣嚗㇊DF/Word/TXT/Excel嚗峕<E59A97>憭?0MB嚗?|
**<EFBFBD><EFBFBD>**嚗?
```json
{
"code": 0,
"data": {
"id": "att-001",
"filename": "<22>𠉛弦<F0A0899B>唳旿.xlsx",
"mimeType": "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
"size": 1024000,
"ossUrl": "https://oss.example.com/attachments/att-001.xlsx",
"textExtracted": true,
"tokenCount": 15000,
"truncated": false,
"createdAt": "2026-01-11T14:00:00Z"
}
}
```
**<EFBFBD>躰秤<EFBFBD>?*嚗?
| <20>躰秤<E8BAB0>?| <20>讛膩 |
|--------|------|
| `ATTACHMENT_TOO_LARGE` | <20><>辣頞<E8BEA3><E9A09E> 20MB |
| `ATTACHMENT_TYPE_NOT_SUPPORTED` | 銝齿𣈲<E9BDBF><F0A388B2><EFBFBD><EFBFBD><EFBFBD>辣蝐餃<E89D90> |
| `ATTACHMENT_LIMIT_EXCEEDED` | <20><><EFBFBD><EFBFBD><EFBFBD><E9A09E>銝𢠃<E98A9D>嚗?銝迎<E98A9D> |
| `TEXT_EXTRACTION_FAILED` | <20><>𧋦<EFBFBD>𣂼<EFBFBD>憭梯揖 |
---
### 6. 憿寧𤌍蝞∠<E89D9E>
#### 6.1 <20><EFBFBD>憿寧𤌍<E5AFA7>𡑒”
```http
GET /api/v1/aia/projects
```
**<EFBFBD><EFBFBD>**嚗?
```json
{
"code": 0,
"data": {
"projects": [
{
"id": "proj-001",
"name": "蝟硋倏<E7A18B><E5808F><EFBFBD>蝛園★<E59C92>?,
"description": "2<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>?,
"conversationCount": 5,
"createdAt": "2026-01-01T10:00:00Z",
"updatedAt": "2026-01-11T12:00:00Z"
}
]
}
}
```
---
## <20><20>躰秤憭<E7A7A4><E686AD>
### <20>躰秤<E8BAB0><EFBFBD><E6BB9A><EFBFBD>
```json
{
"code": -1,
"error": {
"code": "CONVERSATION_NOT_FOUND",
"message": "<EFBFBD><EFBFBD><EFBFBD>?
}
}
```
### <20>𡁶鍂<F0A181B6>躰秤<E8BAB0>?
| <20>躰秤<E8BAB0>?| HTTP <20><EFBFBD><E59786><EFBFBD> | <20>讛膩 |
|--------|------------|------|
| `UNAUTHORIZED` | 401 | <20><EFBFBD><E88AA3>?|
| `FORBIDDEN` | 403 | <20><EFBFBD><E4ADBE>?|
| `NOT_FOUND` | 404 | 韏<><E99F8F>銝滚<E98A9D><E6BB9A>?|
| `VALIDATION_ERROR` | 400 | <20><>㺭撉諹<E69289>憭梯揖 |
| `INTERNAL_ERROR` | 500 | <20>滚𦛚<E6BB9A><EFBFBD><E585B8><EFBFBD>霂?|
| `LLM_ERROR` | 500 | LLM 靚<>鍂憭梯揖 |
| `RATE_LIMITED` | 429 | 霂瑟<E99C82><EFBFBD><E9A488>憸𤑳<E686B8> |
---
## <20><> <20>唳旿璅<E79285>
### Attachment嚗<74><E59A97>隞塚<E99A9E>
```typescript
interface Attachment {
id: string; // <20><>辣ID
filename: string; // <20><EFBFBD><E7AC94><EFBFBD><EFBFBD>?
mimeType: string; // MIME 蝐餃<E89D90>
size: number; // <20><>辣憭批<E686AD><EFBFBD><E59A97><EFBFBD><EFBFBD><EFBFBD>
ossUrl: string; // OSS 摮睃<E691AE><E79D83><EFBFBD>
textContent?: string; // <20>𣂼<EFBFBD><F0A382BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>摰對<E691B0>摮睃<E691AE><E79D83>嗆⏛<E59786><EFBFBD>
tokenCount: number; // <20><>𧋦 Token <20>?
truncated: boolean; // <20>臬炏鋡急⏛<E680A5><EFBFBD><EFBFBD><E9A09E>30K tokens嚗?
createdAt: string; // <20>𥕦遣<F0A595A6>園𡢿
}
```
### Message嚗<65><E59A97><EFBFBD><EFBFBD>
```typescript
interface Message {
id: string;
conversationId: string;
role: 'user' | 'assistant';
content: string;
thinkingContent?: string; // 瘛勗漲<E58B97><EFBFBD><E882BD><EFBFBD>摰?
attachments?: Attachment[];
model?: string;
tokens?: number;
isPinned: boolean;
createdAt: string;
}
```
---
## <20>妒 瘚贝<E7989A>蝷箔<E89DB7>嚗㇌EST Client嚗?
```http
### <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>?
GET {{baseUrl}}/api/v1/aia/agents
Authorization: Bearer {{token}}
### <EFBFBD>
POST {{baseUrl}}/api/v1/aia/intent/route
Authorization: Bearer {{token}}
Content-Type: application/json
{
"query": "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>"
}
### <EFBFBD>𥕦<EFBFBD>
POST {{baseUrl}}/api/v1/aia/conversations
Authorization: Bearer {{token}}
Content-Type: application/json
{
"agentId": "research-design",
"title": "<EFBFBD><EFBFBD>"
}
### <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>?
POST {{baseUrl}}/api/v1/aia/conversations/{{conversationId}}/messages/stream
Authorization: Bearer {{token}}
Content-Type: application/json
Accept: text/event-stream
{
"content": "<EFBFBD><EFBFBD>CT<EFBFBD>𠉛",
"enableDeepThinking": true
}
### 𠹺<EFBFBD><EFBFBD><EFBFBD>
POST {{baseUrl}}/api/v1/aia/conversations/{{conversationId}}/attachments
Authorization: Bearer {{token}}
Content-Type: multipart/form-data; boundary=----WebKitFormBoundary
------WebKitFormBoundary
Content-Disposition: form-data; name="file"; filename="data.xlsx"
Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet
< ./data.xlsx
------WebKitFormBoundary--
```
---
## <20><> <20>湔鰵<E6B994><EFBFBD>
| <20><EFBFBD> | <20><>𧋦 | <20><>捆 |
|------|------|------|
| 2026-01-11 | V1.0 | <20>𥕦遣 API 霈曇恣<E69B87><E681A3>﹝ |