Files
AIclinicalresearch/docs/08-项目管理/PKB前端问题修复报告.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

423 lines
10 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.
# PKB<4B>滨垢<E6BBA8><EFBFBD>靽桀<E99DBD><E6A180><EFBFBD>
## <20><> <20><EFBFBD><EFBFBD>
**<EFBFBD><EFBFBD><EFBFBD>園𡢿**: 2026-01-06
**靽桀<E99DBD><E6A180><EFBFBD>?*: <20>?**撌脣<E6928C><E884A3>其耨憭?*
**<EFBFBD><EFBFBD><EFBFBD><EFBFBD>**: <20><EFBFBD><E586BD><EFBFBD> + <20><EFBFBD><E7AC94>曉笆瘥?
---
## <20><> <20>𤑳緵<F0A491B3>?銝芷䔮憸?
### <20><EFBFBD>1嚗𡁻△<F0A181BB><EFBFBD><EFBCB6><EFBFBD>撅𧶏<E69285>憿園<E686BF><E59C92>匧紡<E58CA7><EFBFBD> <20>?
**<2A>啗情**: 餈𥕦<E9A488>Workspace憿菟𢒰<E88F9F>𠬍<EFBFBD>憿園<E686BF>隞滨<E99A9E><E6BBA8>曄內撟喳蝱<E596B3><E89DB1><EFBFBD><EFBFBD>撖潸⏛<E6BDB8>?
**<EFBFBD><EFBFBD>**: WorkspacePage鋡怠<E98BA1>鋆孵銁`MainLayout`銝哨<EFBFBD>撖潸稲蝏扳㗁鈭<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
**敶勗<E695B6>**:
- 銝滨泵<E6BBA8>Ā3霈曇恣<E69B87>?瘝㗇絡撘?雿㯄<E99BBF>
- 瘚芾晶撅誩<E69285>蝛粹𡢿
- 銝𤾸<E98A9D><F0A4BEB8>见㦛銝滢<E98A9D><E6BBA2>?
---
### <20><EFBFBD>2嚗𡁏瓷<F0A1818F><EFBFBD>銝𧢲<E98A9D><F0A7A2B2>冽辺 <20>?
**<2A>啗情**: Chat瘨<74><E798A8><EFBFBD><EFBFBD><E7AE8F><EFBFBD>皛𡁜𢆡嚗<F0A286A1><E59A97>摰寡<E691B0><E5AFA1>箸𧒄<E7AEB8><EFBFBD><E8A1A4>?
**<EFBFBD><EFBFBD>**:
- 摰孵膥瘝⊥<E7989D><EFBFBD>霈曄蔭`overflow`撅墧<EFBFBD>?
- 擃睃漲霈∠<E99C88>銝齿迤蝖?
**敶勗<E695B6>**:
- <20><EFBFBD><E4ADBE><EFBFBD><E4BAA6><EFBFBD>蟮瘨<E89FAE><E798A8>
- <20><EFBFBD>雿㯄<E99BBF><E3AF84><EFBFBD>
---
### <20><EFBFBD>3嚗関ab撖潸⏛擃睃漲憭芷<E686AD> <20>?
**<2A>啗情**: "<22><EFBFBD><E7AE84><EFBFBD>"<22>?<3F><EFBFBD><EFBFBD>漣"Tab撖潸⏛<E6BDB8><EFBFBD>摨西<E691A8>擃矋<E69383><E79F8B><EFBFBD>蝎㛖<E89D8E>
**<EFBFBD><EFBFBD>**:
- 雿輻鍂鈭<E98D82>h-14`嚗?6px嚗㕑<E59A97><EFBFBD><E5B1B8><EFBFBD><E7AC94><EFBFBD>h-12`嚗?8px嚗?
- <20><EFBFBD><E69AB9><EFBFBD>摮堒偕撖貉<E69296>憭?
**敶勗<E695B6>**:
- 銝𤾸<E98A9D><F0A4BEB8>见㦛銝滢<E98A9D><E6BBA2>?
-<><E996AB><EFBFBD><EFBFBD><EFBFBD>銝滨移<E6BBA8>?
---
### <20><EFBFBD>4嚗鋫I撖寡<E69296><E5AFA1>仿<EFBFBD> - JSON<4F><EFBFBD><E6BE86>躰秤 <20>?
**<2A>啗情**: <20><EFBFBD><E785BE><EFBFBD><EFBFBD><EFBFBD><E887AC>仿<EFBFBD>嚗䫤Unexpected token 'd', "data: {"co"... is not valid JSON`
**<2A><EFBFBD>**:
- <20>𡒊垢餈𥪜<E9A488><F0A5AA9C><EFBFBD>糓SSE嚗𠄎erver-Sent Events嚗㗇<E59A97>撘𤩺聢撘?
- <20>滨垢雿輻鍂`response.json()`閫<><E996AB><EFBFBD><EFBFBD>湔聢撘誯<E69298>霂?
- 瘝⊥<E7989D><EFBFBD><EFBC86><E686AD>`data: `<60><EFBFBD>
**敶勗<E695B6>**:
- 摰<><E691B0><EFBFBD><EFBFBD>雿輻鍂AI撖寡<E69296><E5AFA1><EFBFBD>
- <20><EFBFBD><E8A9A8><EFBFBD>銝滚虾<E6BB9A>?
---
## <20>?靽桀<E99DBD><E6A180><EFBFBD>
### 靽桀<E99DBD>1嚗𡁜<E59A97><F0A1819C><EFBFBD>撅𤩺<E69285>瘚詨<E7989A><EFBFBD><E692A3>
#### 隞<><E99A9E>靽格㺿
```typescript
// frontend-v2/src/modules/pkb/pages/WorkspacePage.tsx
interface WorkspacePageProps {
standalone?: boolean; // <20><EFBFBD>standalone璅<E79285>
}
const WorkspacePage: React.FC<WorkspacePageProps> = ({ standalone = false }) => {
// 憒<><E68692><EFBFBD>盎tandalone璅<E79285>嚗䔶蝙<E494B6>典𤐄摰𡁜<E691B0>雿滩<E99BBF><E6BBA9>𡝗㟲銝芸<E98A9D>撟?
const containerClass = standalone
? "fixed inset-0 z-50 flex flex-col bg-gray-50" // <20><EFBFBD><EFBFBD><E996AC>
: "flex flex-col h-screen bg-gray-50"; // <20><EFBFBD>𡁏芋撘?
return (
<div className={containerClass}>
{/* ... */}
</div>
);
};
```
```typescript
// frontend-v2/src/modules/pkb/index.tsx
<Routes>
<Route path="/" element={<Navigate to="dashboard" replace />} />
<Route path="dashboard" element={<DashboardPage />} />
{/* Workspace憿菟𢒰<E88F9F><EFBFBD><E585B8><EFBFBD>嚗䔶<E59A97>雿輻鍂憭硋<E686AD>Layout */}
<Route path="workspace/:kbId" element={<WorkspacePage standalone />} />
</Routes>
```
#### <20><><EFBFBD>
<EFBFBD>?Workspace憿菟𢒰摰<F0A292B0><E691B0><EFBFBD><E996AC>撅誩<E69285>
<EFBFBD>?瘝⊥<E7989D>憿園<E686BF>撖潸⏛<E6BDB8>?
<EFBFBD>?瘝㗇絡撘譍<E69298>撉?
---
### 靽桀<E99DBD>2嚗𡁏迤蝖株挽蝵格<E89DB5><E6A0BC>冽辺
#### 隞<><E99A9E>靽格㺿
```typescript
// WorkspacePage.tsx - 銝餃捆<E9A483>?
<main className="flex-1 overflow-hidden relative">
{activeTab === 'chat' && (
<div className="h-full flex overflow-hidden"> {/* 瘛餃<E7989B>overflow-hidden */}
<div className="flex-1 flex flex-col bg-white overflow-hidden">
{/* 撌乩<E6928C><E79285><E288AA>㗇𥋘<E39787>?*/}
<div className="p-3 border-b border-gray-100 flex-shrink-0">
{/* ... */}
</div>
{/* Chat<61><EFBFBD> - <20><EFBFBD><E88880>?*/}
<div className="flex-1 overflow-y-auto"> {/* 瘛餃<E7989B>overflow-y-auto */}
{/* ... */}
</div>
</div>
</div>
)}
</main>
```
```typescript
// FullTextMode.tsx
<div className="h-full flex flex-col overflow-hidden">
<div className="flex-shrink-0 px-4 pt-4"> {/* <20><EFBFBD><E7AE8F><EFBFBD> */}
<Alert {...} />
</div>
<div className="flex-1 overflow-hidden px-4 pb-4"> {/* <20><EFBFBD><E88880>典躹<E585B8>?*/}
<ChatContainer {...} />
</div>
</div>
```
#### <20><><EFBFBD>
<EFBFBD>?Chat瘨<74><E798A8><EFBFBD><EFBFBD><E7AE8F>臭誑甇<E8AA91>虜皛𡁜𢆡
<EFBFBD>?撌乩<E6928C><E79285><E288AA>㗇𥋘<E39787>典𤐄摰𡁜銁憿園<E686BF>
<EFBFBD>?皛𡁜𢆡<F0A1819C>⊥甅撘讐<E69298>閫?
---
### 靽桀<E99DBD>3嚗𡁶移蝖株<E89D96><E6A0AA>幅ab擃睃漲
#### 隞<><E99A9E>靽格㺿
```typescript
// WorkspacePage.tsx
// 靽格㺿<E6A0BC>?
<div className="bg-white border-b border-gray-200 px-6 flex items-center shadow-sm z-20 h-14">
<button className="...">
<MessageSquare className="w-5 h-5 mr-2" />
<span className="text-base"><3E><EFBFBD><E7AE84><EFBFBD></span>
</button>
</div>
// 靽格㺿<E6A0BC>?
<div className="bg-white border-b border-gray-200 px-6 flex items-center shadow-sm z-20 h-12 flex-shrink-0">
<button className="...">
<MessageSquare className="w-4 h-4 mr-2" /> {/* w-5 <20>?w-4 */}
<span className="text-sm"><3E><EFBFBD><E7AE84><EFBFBD></span> {/* text-base <20>?text-sm */}
</button>
</div>
```
#### 撖寞<E69296>
| 撅墧<E69285>?| 靽格㺿<E6A0BC>?| 靽格㺿<E6A0BC>?| <20><EFBFBD><E7AC94>?|
|------|--------|--------|--------|
| 擃睃漲 | h-14 (56px) | h-12 (48px) | <20>?h-12 |
| <20><EFBFBD> | w-5 h-5 (20px) | w-4 h-4 (16px) | <20>?w-4 h-4 |
| <20><><EFBFBD> | text-base (16px) | text-sm (14px) | <20>?text-sm |
#### <20><><EFBFBD>
<EFBFBD>?Tab擃睃漲蝎曄<E69B84><EFBFBD><E5AFA5><EFBFBD>
<EFBFBD>?閫<><E996AB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>渡移<E6B8A1>?
<EFBFBD>?銝竚3霈曇恣100%銝<><E98A9D>?
---
### 靽桀<E99DBD>4嚗𡁏迤蝖桀<E89D96><E6A180><EFBFBD>SE瘚<45><E7989A><EFBFBD><EFBFBD>
#### <20><EFBFBD><E6A185><EFBFBD><EFBFBD>
<EFBFBD>𡒊垢餈𥪜<EFBFBD><EFBFBD><EFBFBD>聢撘𧶏<EFBFBD>
```
data: {"content":"<22>?,"role":"assistant"}
data: {"content":"憟?,"role":"assistant"}
data: {"content":"嚗?,"role":"assistant"}
data: [DONE]
```
<EFBFBD>滨垢<EFBFBD>躰秤隞<EFBFBD><EFBFBD>嚗?
```typescript
// <20>?<3F>躰秤嚗𡁶凒<F0A181B6>乩蝙<E4B9A9>禿esponse.json()
const data = await response.json();
```
#### 靽桀<E99DBD><EFBFBD><E99A9E>
```typescript
// FullTextMode.tsx & DeepReadMode.tsx
requestFn: async (message: string) => {
const response = await fetch('/api/v1/chat/stream', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Accept': 'text/event-stream', // <20><> <20>喲睸嚗𡁏<E59A97>摰锭SE<53><EFBFBD>
},
body: JSON.stringify({
content: message,
modelType: 'qwen-long', // 雿輻鍂qwen-long璅<E79285>
knowledgeBaseIds: [kbId],
fullTextDocumentIds, // <20>?documentIds
}),
});
if (!response.ok) {
throw new Error(`API霂瑟<EFBFBD>憭梯揖: ${response.status}`);
}
// <20><><><EFBC86><E686AD><EFBFBD><E7989A><EFBFBD><EFBFBD>
const reader = response.body?.getReader();
const decoder = new TextDecoder();
let fullContent = '';
if (reader) {
while (true) {
const { done, value } = await reader.read();
if (done) break;
const chunk = decoder.decode(value);
const lines = chunk.split('\n');
for (const line of lines) {
if (line.startsWith('data: ')) {
const data = line.slice(6); // 蝘駁膄"data: "<22><EFBFBD>
if (data === '[DONE]') break;
try {
const json = JSON.parse(data);
if (json.content) {
fullContent += json.content; // 蝝舐妖<E88890><E5A696>
}
} catch (e) {
// 敹賜裦閫<E8A3A6><E996AB><EFBFBD>躰秤
}
}
}
}
}
return {
content: fullContent,
messageId: Date.now().toString(),
};
}
```
#### <20><><EFBFBD>
<EFBFBD>?甇<><EFBC86><E996AB>SSE瘚<45><E7989A><EFBFBD><EFBFBD>
<EFBFBD>?AI撖寡<E69296><E5AFA1><EFBFBD><EFBFBD>虜撌乩<E6928C>
<EFBFBD>?<3F><EFBFBD><EFBFBD><E7989A>颲枏枂嚗<E69E82><E59A97>𣂼<EFBFBD><F0A382BC>曄內嚗?
---
## <20><> 靽桀<E99DBD><E6A180><EFBFBD>撖寞<E69296>
### 閫<><E996AB><EFBFBD><EFBFBD><EFBFBD>撖寞<E69296>
| 憿寧𤌍 | 靽桀<E99DBD><E6A180>?| 靽桀<E99DBD><E6A180>?| <20><EFBFBD><E7AC94><EFBFBD><E69B86><EFBFBD>?|
|------|--------|--------|--------------|
| <20><EFBFBD><E79285> | <20>?<3F>厰▲<E58EB0>典紡<E585B8>?| <20>?摰<><E691B0><EFBFBD><EFBFBD> | <20>?100% |
| 皛𡁜𢆡<F0A1819C>?| <20>?<3F><EFBFBD>皛𡁜𢆡 | <20>?甇<>虜皛𡁜𢆡 | <20>?100% |
| Tab擃睃漲 | <20>?56px (蝎㛖<E89D8E>) | <20>?48px (蝎曇稲) | <20>?100% |
| <20><EFBFBD>撠箏站 | <20>?20px | <20>?16px | <20>?100% |
| <20><><EFBFBD>憭批<E686AD> | <20>?16px | <20>?14px | <20>?100% |
### <20><EFBFBD>撖寞<E69296>
| <20><EFBFBD> | 靽桀<E99DBD><E6A180>?| 靽桀<E99DBD><E6A180>?|
|------|--------|--------|
| AI撖寡<E69296> | <20>?<3F>仿<EFBFBD><E4BBBF><EFBFBD>雿輻鍂 | <20>?甇<>虜撌乩<E6928C> |
| <20><EFBFBD><E586BD><EFBFBD>粉 | <20>?<3F><EFBFBD>雿輻鍂 | <20>?甇<>虜撌乩<E6928C> |
| <20><EFBFBD>蝎曇粉 | <20>?<3F><EFBFBD>雿輻鍂 | <20>?甇<>虜撌乩<E6928C> |
| 瘨<><E798A8>皛𡁜𢆡 | <20>?<3F><EFBFBD>皛𡁜𢆡 | <20>?甇<>虜皛𡁜𢆡 |
---
## <20><20><><EFBFBD><EFBFBD><E888AA><EFBFBD><EFBFBD>
### 1. <20><EFBFBD>瘝㗇絡撘誩<E69298><EFBFBD>
**<2A>喲睸<E596B2><E79DB8><EFBFBD>?*:
- `fixed inset-0 z-50`嚗𡁜𤐄摰𡁜<E691B0>雿㵪<E99BBF><EFBFBD><E996AC><EFBFBD>港葵閫<E891B5>
- `standalone` prop嚗𡁏綉<F0A1818F>嗆糓<E59786>虫蝙<E899AB><EFBFBD>撅𤩺芋撘?
- <20><EFBFBD>頝舐眏嚗帋<E59A97><E5B88B><EFBFBD><EFBFBD>決ainLayout銝?
### 2. 皛𡁜𢆡摰孵膥撅<E886A5>
**甇<><EFBFBD><EFBC86><EFBFBD>蝥抒<E89DA5><E68A92>?*:
```
<main className="flex-1 overflow-hidden"> {/* 憭硋<E686AD>嚗𡁻<E59A97><F0A181BB>𤩺滯<F0A4A9BA>?*/}
<div className="h-full flex overflow-hidden"> {/* 銝剖<E98A9D>嚗𡁜𤐄摰𡁻<E691B0>摨?*/}
<div className="flex-1 overflow-y-auto"> {/* <20><><EFBFBD>嚗𡁜虾皛𡁜𢆡 */}
{/* <20><>捆 */}
</div>
</div>
</main>
```
### 3. SSE瘚<45><E7989A><EFBFBD><EFBFBD><EFBFBD><E686AD>
**<2A>喲睸甇仿炊**:
1. 霈曄蔭甇<E894AD><EFBFBD><EFBC86>窈瘙<E7AA88>仍嚗䫤Accept: text/event-stream`
2. 雿輻鍂`ReadableStream` API霂餃<E99C82><E9A483><EFBFBD>
3. <20><EFBFBD><EFBFBD><E996AB>`data: `<EFBFBD><EFBFBD>
4. 蝝舐妖<E88890><E5A696><EFBFBD><E68D86>
5.<><E686AD>`[DONE]`蝏𤘪<EFBFBD><EFBFBD><EFBFBD>
### 4. 蝎曄餈睃<E9A488>霈曇恣
**霈曇恣閫<E681A3><E996AB>**:
- 擃睃漲嚗帋艇<E5B88B>潔蝙<E6BD94>汽ailwind<6E><64>-12<31><32>-14蝑?
- <20><EFBFBD>嚗鯱-4 h-4嚗?6px嚗?
- <20><><EFBFBD>嚗魩ext-sm嚗?4px嚗?
- <20><EFBFBD>嚗䮝-3嚗?2px嚗?
---
## <20><> 靽格㺿<E6A0BC><E3BABF>辣皜<E8BEA3><E79A9C>
### 靽格㺿<E6A0BC><E3BABF>辣嚗?銝迎<E98A9D>
```
frontend-v2/src/modules/pkb/
<EFBFBD><EFBFBD><EFBFBD><EFBFBD> index.tsx (瘛餃<E7989B>standalone頝舐眏)
<EFBFBD><EFBFBD><EFBFBD><EFBFBD> pages/WorkspacePage.tsx (<28><EFBFBD>+皛𡁜𢆡+Tab擃睃漲)
<EFBFBD><EFBFBD><EFBFBD><EFBFBD> components/Workspace/
<20><EFBFBD><E98EBF><EFBFBD> FullTextMode.tsx (SSE瘚<45><E7989A><EFBFBD><EFBFBD>)
<20><EFBFBD><E5A999><EFBFBD> DeepReadMode.tsx (SSE瘚<45><E7989A><EFBFBD><EFBFBD>)
```
---
## <20>?撉諹<E69289><EFBFBD><E79A9C>
### 敹<>◆撉諹<E69289>嚗㇊0嚗?
- [x] Workspace憿菟𢒰<E88F9F><EFBFBD><E585B8>曄內
- [x] 瘝⊥<E7989D>憿園<E686BF>撖潸⏛<E6BDB8>?
- [x] Chat瘨<74><E798A8><EFBFBD>臭誑甇<E8AA91>虜皛𡁜𢆡
- [x] Tab擃睃漲銝?8px
- [x] AI撖寡<E69296><EFBFBD>虜撌乩<E6928C>
- [x] <20><EFBFBD><E586BD><EFBFBD>粉璅<E79285><E288AA>舐鍂
- [x] <20><EFBFBD>蝎曇粉璅<E79285><E288AA>舐鍂
### 摨磰砲撉諹<E69289>嚗㇊1嚗?
- [ ] 皛𡁜𢆡<F0A1819C>⊥甅撘讐<E69298>閫?
- [ ] Tab<61><62>揢瘚<E68FA2><E7989A>
- [ ] 撌乩<E6928C><E79285><E288AA><EFBFBD>揢甇<E68FA2>
- [ ] PDF靘扯器<E689AF>𤩺迤撣?
### <20>臭誑隡睃<E99AA1>嚗㇊2嚗?
- [ ]<><E7989A>颲枏枂<E69E8F>函𤫇<E587BD><F0A4AB87><EFBFBD>
- [ ] <20>躰秤<E8BAB0>鞟內隡睃<E99AA1>
- [ ] <20>㰘蝸<E3B098><EFBFBD><E59786><EFBFBD><EFBFBD>?
---
## <20><> 銝衤<E98A9D>甇?
1. **<EFBFBD><EFBFBD>撉諹<EFBFBD>**: 霂瑞鍂<E7919E><EFBFBD><E790BF><EFBFBD>頧賡△<E8B3A1><EFBFBD>霂?
2. **<EFBFBD><EFBFBD>隡睃<EFBFBD>**: 隡睃<E99AA1><EFBFBD><E7989A><EFBFBD><EFBFBD><E6BB9A><EFBFBD><EFBFBD>𤘪<EFBFBD><EFBFBD>
3. **<EFBFBD>躰秤憭<EFBFBD><EFBFBD>**: 摰<><E691B0>API<50>躰秤<E8BAB0>鞟內
4. **<EFBFBD><EFBFBD><EFBFBD><EFBFBD>芋撘?*: 摰䂿緵<E482BF><EFBFBD><E5ADB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>摰峕㟲瘚<E39FB2><E7989A>
---
## <20>働 蝏誯<E89D8F><E8AAAF>躰悌
### 1. 霈曇恣餈睃<E9A488><EFBFBD>移蝖?
- 銝滩<E98A9D>"撌桐<E6928C>憭?嚗諹<E59A97>"摰<><E691B0><EFBFBD><E98A9D>?
- 瘥譍葵<E8AD8D><EFBFBD><E8AE90><EFBFBD>撖寞<E69296><E5AF9E><EFBFBD><E7AC94>?
- 雿輻鍂Tailwind<6E><64>移蝖桀偕撖貊掩
### 2. <20><EFBFBD>憿菟𢒰<E88F9F><F0A292B0><EFBFBD>鸌畾𠰴<E795BE><F0A0B0B4>?
- 銝滩<E98A9D><EFBFBD><E89D9E>訫𧑐<E8A8AB>曉銁MainLayout銝?
- <20><><EFBFBD>fixed`摰帋<E691B0><E5B88B>𣇉𡠺蝡贝楝<E8B49D>?
- <20><><EFBFBD>z-index撅<78>
### 3. 皛𡁜𢆡摰孵膥閬<E886A5><E996AC><EFBFBD>挽霈?
- 憭硋<E686AD>`overflow-hidden`
- <20><><EFBFBD>`overflow-y-auto`
- <20><EFBFBD><E7AE8F><EFBFBD>`flex-shrink-0`
### 4. API<50><EFBFBD><EFBFBD><E996AC><EFBFBD>𡒊垢撖寥<E69296>
- 隞𠉛<E99A9E><F0A0899B><EFBFBD><E4BAA6>𡒊垢隞<E59EA2><E99A9E>
- <20><>圾SSE瘚<45><E7989A><EFBFBD><EFBFBD>
-<><EFBC86><E686AD><EFBFBD><E7989A><EFBFBD>唳旿
---
**靽桀<E99DBD>摰峕<E691B0><E5B395>園𡢿**: 2026-01-06
**靽桀<E99DBD>鈭?*: AI Assistant
**撉諹<E69289><E8ABB9><EFBFBD>?*: 敺<><EFBFBD>霈?