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

11 KiB
Raw Blame History

AIA V2.1 <20>𡒊垢 API 霈曇恣

<EFBFBD><EFBFBD>𧋦嚗间2.1
**<2A>𥕦遣<F0A595A6><EFBFBD>**嚗?026-01-11
**<2A><EFBFBD>頝臬<E9A09D>**嚗䫤/api/v1/aia`


<EFBFBD><EFBFBD> API 璁<><E79281>

<EFBFBD><EFBFBD> 頝臬<EFBFBD> <EFBFBD>讛膩 霈方<EFBFBD>
GET /agents <EFBFBD><EFBFBD><EFBFBD><EFBFBD>雿枏<EFBFBD>銵? <EFBFBD>?
GET /agents/:id <EFBFBD><EFBFBD><EFBFBD><EFBFBD>雿栞祕<EFBFBD>? <EFBFBD>?
POST /intent/route <EFBFBD>誩㦛頝舐眏 <EFBFBD>?
GET /conversations <EFBFBD><EFBFBD>撖寡<EFBFBD><EFBFBD>𡑒” <EFBFBD>?
POST /conversations <EFBFBD>𥕦遣撖寡<EFBFBD> <EFBFBD>?
GET /conversations/:id <EFBFBD><EFBFBD>撖寡<EFBFBD>霂行<EFBFBD> <EFBFBD>?
DELETE /conversations/:id <EFBFBD>𣳇膄撖寡<EFBFBD> <EFBFBD>?
POST /conversations/:id/messages/stream <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>嚗? <EFBFBD>?
POST /conversations/:id/attachments 銝𠹺<EFBFBD><EFBFBD><EFBFBD> <EFBFBD>?
GET /projects <EFBFBD><EFBFBD>憿寧𤌍<EFBFBD>𡑒” <EFBFBD>?
GET /projects/:id <EFBFBD><EFBFBD>憿寧𤌍霂行<EFBFBD> <EFBFBD>?

<EFBFBD><EFBFBD> 霈方<E99C88>

<EFBFBD><EFBFBD><EFBFBD>?API <20><><EFBFBD>銁霂瑟<E99C82>憭港葉<E6B8AF>箏蒂 JWT Token嚗?

Authorization: Bearer <token>

<EFBFBD><EFBFBD> API 霂衣<E99C82>摰帋<E691B0>

1. <20><EFBFBD>雿梶㮾<E6A2B6>?

1.1 <20><EFBFBD><E79195><EFBFBD>雿枏<E99BBF>銵?

GET /api/v1/aia/agents

<EFBFBD>亥砭<EFBFBD><EFBFBD>嚗?

<EFBFBD><EFBFBD> 蝐餃<EFBFBD> <EFBFBD> <EFBFBD>讛膩
stage string <EFBFBD>? 蝑偦<EFBFBD>厰𧫴畾蛛<EFBFBD>design, data, analysis, write, publish

**<2A><EFBFBD>**嚗?

{
  "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>?

GET /api/v1/aia/agents/:id

**<2A><EFBFBD>**嚗?

{
  "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>

POST /api/v1/aia/intent/route

**霂瑟<E99C82>雿?*嚗?

{
  "query": "撣格<E692A3><E6A0BC><EFBFBD><EFBFBD><EFBFBD>銝贝<E98A9D>隞賣㺭<E8B3A3>?
}

**<2A><EFBFBD>**嚗?

{
  "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>𡑒”

GET /api/v1/aia/conversations

<EFBFBD>亥砭<EFBFBD><EFBFBD>嚗?

<EFBFBD><EFBFBD> 蝐餃<EFBFBD> <EFBFBD> <EFBFBD>讛膩
agentId string <EFBFBD>? <EFBFBD>㗇惣<EFBFBD><EFBFBD>蝑偦<EFBFBD>?
projectId string <EFBFBD>? <EFBFBD>厰★<EFBFBD><EFBFBD><EFBFBD><EFBFBD>NULL 銵函內<E587BD>𡁶鍂撖寡<E69296>嚗?
page number <EFBFBD>? 憿萇<EFBFBD>嚗屸<EFBFBD>霈?1
pageSize number <EFBFBD>? 瘥誯△<EFBFBD><EFBFBD>嚗屸<EFBFBD>霈?20

**<2A><EFBFBD>**嚗?

{
  "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>

POST /api/v1/aia/conversations

**霂瑟<E99C82>雿?*嚗?

{
  "agentId": "research-design",
  "projectId": null,
  "title": "<22>啣笆霂?
}

**<2A><EFBFBD>**嚗?

{
  "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>嚗?

GET /api/v1/aia/conversations/:id

<EFBFBD>亥砭<EFBFBD><EFBFBD>嚗?

<EFBFBD><EFBFBD> 蝐餃<EFBFBD> <EFBFBD> <EFBFBD>讛膩
limit number <EFBFBD>? <EFBFBD><EFBFBD><EFBFBD><EFBFBD>餈𤨩<EFBFBD><EFBFBD><EFBFBD><EFBFBD>暺䁅恕 50

**<2A><EFBFBD>**嚗?

{
  "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>嚗?嚗厩<E59A97>蝛嗥𤌍<E597A5>?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>

DELETE /api/v1/aia/conversations/:id

**<2A><EFBFBD>**嚗?

{
  "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>

POST /api/v1/aia/conversations/:id/messages/stream

**霂瑟<E99C82>憭?*嚗?

Content-Type: application/json
Accept: text/event-stream

**霂瑟<E99C82>雿?*嚗?

{
  "content": "撣格<E692A3><E6A0BC><EFBFBD><EFBFBD>餈嗘遢<E59798>唳旿",
  "attachmentIds": ["att-001", "att-002"],
  "enableDeepThinking": true
}

**<2A><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>**嚗?

鈭衤辣 <EFBFBD>讛膩 <EFBFBD>唳旿<EFBFBD><EFBFBD>
thinking_start <EFBFBD>憪𧢲楛摨行<EFBFBD><EFBFBD>? {}
thinking_delta <EFBFBD><EFBFBD><EFBFBD><EFBFBD>摰寧<EFBFBD>畾? {"content": "..."}
thinking_end <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>? {"duration": number}
message_start <EFBFBD>憪讠<EFBFBD><EFBFBD>𣂼<EFBFBD>憭? {"id": "..."}
delta <EFBFBD>𧼮<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> {"content": "..."}
message_end <EFBFBD>𧼮<EFBFBD>蝏𤘪<EFBFBD> {"id": "...", "tokens": number, "model": "..."}
error <EFBFBD>𤑳<EFBFBD><EFBFBD>躰秤 {"code": "...", "message": "..."}
done <EFBFBD><EFBFBD><EFBFBD>? {}

5. <20><>辣銝𠹺<E98A9D>

5.1 銝𠹺<E98A9D><F0A0B9BA><EFBFBD>

POST /api/v1/aia/conversations/:id/attachments

**霂瑟<E99C82>憭?*嚗?

Content-Type: multipart/form-data

**霂瑟<E99C82>雿橒<E99BBF>FormData嚗?*嚗?

摮埈挾 蝐餃<EFBFBD> <EFBFBD> <EFBFBD>讛膩
file File <EFBFBD>? <EFBFBD><EFBFBD>辣嚗㇊DF/Word/TXT/Excel嚗峕<E59A97>憭?0MB嚗?

**<2A><EFBFBD>**嚗?

{
  "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"
  }
}

**<2A>躰秤<E8BAB0>?*嚗?

<EFBFBD>躰秤<EFBFBD>? <EFBFBD>讛膩
ATTACHMENT_TOO_LARGE <EFBFBD><EFBFBD>辣頞<EFBFBD><EFBFBD> 20MB
ATTACHMENT_TYPE_NOT_SUPPORTED 銝齿𣈲<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>辣蝐餃<EFBFBD>
ATTACHMENT_LIMIT_EXCEEDED <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>銝𢠃<EFBFBD>嚗?銝迎<E98A9D>
TEXT_EXTRACTION_FAILED <EFBFBD><EFBFBD>𧋦<EFBFBD>𣂼<EFBFBD>憭梯揖

6. 憿寧𤌍蝞∠<E89D9E>

6.1 <20><EFBFBD>憿寧𤌍<E5AFA7>𡑒”

GET /api/v1/aia/projects

**<2A><EFBFBD>**嚗?

{
  "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"
      }
    ]
  }
}

<EFBFBD><20>躰秤憭<E7A7A4><E686AD>

<EFBFBD>躰秤<EFBFBD><EFBFBD><EFBFBD><EFBFBD>

{
  "code": -1,
  "error": {
    "code": "CONVERSATION_NOT_FOUND",
    "message": "撖寡<E69296>銝滚<E98A9D><E6BB9A>?
  }
}

<EFBFBD>𡁶鍂<EFBFBD>躰秤<EFBFBD>?

<EFBFBD>躰秤<EFBFBD>? HTTP <20><EFBFBD><E59786><EFBFBD> <EFBFBD>讛膩
UNAUTHORIZED 401 <EFBFBD><EFBFBD><EFBFBD>?
FORBIDDEN 403 <EFBFBD><EFBFBD><EFBFBD>?
NOT_FOUND 404 <EFBFBD><EFBFBD>銝滚<EFBFBD><EFBFBD>?
VALIDATION_ERROR 400 <EFBFBD><EFBFBD>㺭撉諹<EFBFBD>憭梯揖
INTERNAL_ERROR 500 <EFBFBD>滚𦛚<EFBFBD><EFBFBD><EFBFBD><EFBFBD>霂?
LLM_ERROR 500 LLM 靚<>鍂憭梯揖
RATE_LIMITED 429 霂瑟<EFBFBD><EFBFBD><EFBFBD>憸𤑳<EFBFBD>

<EFBFBD><EFBFBD> <20>唳旿璅<E79285>

Attachment嚗<EFBFBD><EFBFBD>隞塚<EFBFBD>

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嚗<EFBFBD><EFBFBD><EFBFBD><EFBFBD>

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;
}

<EFBFBD>妒 瘚贝<E7989A>蝷箔<E89DB7>嚗㇌EST Client嚗?

### <20><EFBFBD><E79195><EFBFBD>雿枏<E99BBF>銵?
GET {{baseUrl}}/api/v1/aia/agents
Authorization: Bearer {{token}}

### <20>誩㦛頝舐眏
POST {{baseUrl}}/api/v1/aia/intent/route
Authorization: Bearer {{token}}
Content-Type: application/json

{
  "query": "撣格<E692A3><E6A0BC><EFBFBD><EFBFBD><EFBFBD>唳旿"
}

### <20>𥕦遣撖寡<E69296>
POST {{baseUrl}}/api/v1/aia/conversations
Authorization: Bearer {{token}}
Content-Type: application/json

{
  "agentId": "research-design",
  "title": "瘚贝<E7989A>撖寡<E69296>"
}

### <20><EFBFBD><E785BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E7989A>嚗?
POST {{baseUrl}}/api/v1/aia/conversations/{{conversationId}}/messages/stream
Authorization: Bearer {{token}}
Content-Type: application/json
Accept: text/event-stream

{
  "content": "撣格<E692A3>霈曇恣銝<E681A3>銝析CT<43>𠉛弦",
  "enableDeepThinking": true
}

### 銝𠹺<E98A9D><F0A0B9BA><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--

<EFBFBD><EFBFBD> <20>湔鰵<E6B994><EFBFBD>

<EFBFBD><EFBFBD> <EFBFBD><EFBFBD>𧋦 <EFBFBD><EFBFBD>
2026-01-11 V1.0 <EFBFBD>𥕦遣 API 霈曇恣<E69B87><E681A3>