Files
AIclinicalresearch/docs/03-业务模块/DC-数据清洗整理/06-开发记录/2025-12-07_完整UI优化与功能增强.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

656 lines
14 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.
# 2025-12-07 摰峕㟲 UI 隡睃<E99AA1>銝𤾸<E98A9D><F0A4BEB8><EFBFBD>撘?
> **<2A><EFBFBD><E586BD><EFBFBD>撽勗𢆡<E58B97><F0A286A1><EFBFBD><EFBFBD><EFBFBD><EFBCB6>?*嚗? 銝芸<E98A9D><E88AB8>桅䔮憸睃<E686B8><E79D83>其耨憭?
---
## <20><> <20><EFBFBD><E586BD><EFBFBD><E6BCA4><EFBFBD>䔮憸?
1. <20>?**銵冽聢瘝⊥<E7989D><E28AA5>㰘蝸<E3B098>𣂼<EFBFBD>** - AG Grid 璅<E79285><E288AA>芣釣<E88AA3>?
2. <20>?**<2A><EFBFBD><E6B8AF>屸𢒰<E5B1B8>𧼮虜蝎㛖<E89D8E>** - 銝𤾸<E98A9D><F0A4BEB8>见㦛撌株<E6928C>憭?
3. <20>?**AI <20><EFBFBD>瘝⊥<E7989D><E79488>霂?* - <20><EFBFBD>銝滨䰻<E6BBA8><EFBFBD>雿蓥蝙<E893A5>?
4. <20>?**颲枏<E9A2B2><EFBFBD><E78DA2>摰嫣<E691B0><EFBFBD>征** - <20><EFBFBD><E785BE><EFBFBD>隞滢<E99A9E><E6BBA2>?
5. <20>?**憿菟𢒰<E88F9F>箇緵皛𡁜𢆡<F0A1819C>?* - 雿㯄<E99BBF>銝滚末
6. <20>?**隞<><E99A9E><EFBFBD>芸𢆡<E88AB8><EFBFBD>** - <20><EFBFBD><E586BD><EFBFBD><E4ADBE><EFBFBD>
7. <20>?**蝞<><E89D9E>閖䔮憸䀹<E686B8>瘜訫<E7989C>蝑?* - 靘见<E99D98>"<22><EFBFBD>撠𤑳撩憭勗<E686AD><EFBFBD>"
---
## <20>?摰峕㟲靽桀<E99DBD><E6A180><EFBFBD>
### 1. **靽桀<E99DBD> AG Grid 璅<E79285>瘜典<E7989C><E585B8>躰秤** <20>?
**<EFBFBD><EFBFBD>**嚗?
```
AG Grid: error #272 No AG Grid modules are registered!
```
**靽桀<E99DBD>**嚗?
```typescript
// DataGrid.tsx
import { ColDef, ModuleRegistry, AllCommunityModule } from 'ag-grid-community';
// 潃?瘜典<E7989C> AG Grid 璅<E79285>
ModuleRegistry.registerModules([AllCommunityModule]);
```
**蝏𤘪<E89D8F>**嚗尠<E59A97> 銵冽聢甇<E881A2><EFBFBD>㰘蝸嚗峕㺭<E5B395><EFBFBD><E6A180>湔遬蝷?
---
### 2. **隡睃<E99AA1><E79D83><EFBFBD><E6B8AF>屸𢒰嚗<F0A292B0><EFBFBD><EFBFBD><E689B9>见㦛嚗?* <20>?
#### 2.1 靽格㺿 AI <20><EFBFBD><E68B87>滨妍
```typescript
// Sidebar.tsx
<span>AI <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD></span> // <20><>䔉嚗鋫I Copilot
```
#### 2.2 隡睃<E99AA1><E79D83>厰僼<E58EB0><EFBFBD>
```typescript
// Header.tsx - 餈𥪜<E9A488><F0A5AA9C>厰僼
<button className="flex items-center gap-1.5 px-2.5 py-1.5 rounded-md hover:bg-slate-50 text-slate-500 hover:text-slate-700 transition-colors text-xs">
<ArrowLeft className="w-3.5 h-3.5" />
<span className="font-normal">𥪜<EFBFBD><EFBFBD><EFBFBD>?/span>
</button>
// <20><EFBFBD>/<2F><EFBFBD><E6BB9A>厰僼
<div className="flex items-center bg-slate-50 rounded-lg p-0.5 border border-slate-200">
<button className="p-1.5 text-slate-300 hover:text-slate-600 rounded hover:bg-white transition-colors">
<Undo2 size={14} />
</button>
</div>
```
**<EFBFBD><EFBFBD>**嚗?
- <20>?<3F>厰僼<E58EB0><EFBFBD>撌改<E6928C>14px <20><EFBFBD><EFBFBD><E59A97><EFBFBD>?16-18px嚗?
- <20>?憸𡏭𠧧<F0A18FAD><EFBFBD><E6B994><EFBFBD>slate-300/500嚗<30><E59A97><EFBFBD>?slate-400/600嚗?
- <20>?颲寞<E9A2B2><E5AF9E><EFBFBD>嚗?px嚗<78><E59A97><EFBFBD>?2px嚗?
- <20>?餈<><EFBFBD><E885B9><EFBFBD><EFBFBD><EFBFBD><E6B994>?
#### 2.3 瘛餃<E7989B> AI <20><EFBFBD><E68B87><EFBFBD><EFBFBD>厰僼
```typescript
// Header.tsx
<button
onClick={onToggleSidebar}
className={`flex items-center gap-1.5 px-3 py-1.5 rounded-lg text-xs font-medium transition-all ${
isSidebarOpen
? 'bg-emerald-100 text-emerald-700 hover:bg-emerald-200'
: 'bg-slate-100 text-slate-600 hover:bg-slate-200'
}`}
>
<MessageSquare size={14} />
<span>AI<EFBFBD><EFBFBD></span>
</button>
```
**蝏𤘪<E89D8F>**嚗尠<E59A97> <20>喲𡡒<E596B2>𤾸虾隞仿<E99A9E><E4BBBF><EFBFBD><EFBFBD>嚗𣬚𠶖<F0A3AC9A><F0A0B696><EFBFBD><EFBFBD>?
#### 2.4 憓𧼮撩閫<E692A9><E996AB><EFBFBD><EFBFBD><EFBFBD>
```typescript
// Sidebar.tsx
<div className="w-[480px] bg-white border-l-2 border-slate-200 flex flex-col shadow-lg">
<div className="h-14 border-b border-slate-200 flex items-center justify-between px-4 bg-gradient-to-r from-emerald-50 to-white">
```
**<EFBFBD><EFBFBD>**嚗?
- <20>?摰賢漲憓𧼮<E68693>嚗?80px嚗<78><E59A97><EFBFBD>?420px嚗?
- <20>?撌虫儒颲寞<E9A2B2><E5AF9E><EFBFBD>嚗?px嚗?
- <20>?瘛餃<E7989B><E9A483>游蔣嚗ìhadow-lg嚗?
- <20>?憭湧<E686AD>皜𣂼<E79A9C><F0A382BC>峕艶
#### 2.5 隡睃<E99AA1>銵冽聢摰孵膥
```typescript
// DataGrid.tsx
<div className="bg-white border-2 border-slate-200 shadow-lg rounded-2xl overflow-hidden h-full">
```
**<EFBFBD><EFBFBD>**嚗?
- <20>?颲寞<E9A2B2><E5AF9E><EFBFBD>嚗?px嚗?
- <20>?<3F>游蔣憓𧼮撩嚗ìhadow-lg嚗?
- <20>?<3F><><EFBFBD>憓𧼮之嚗ǐounded-2xl嚗?
---
### 3. **瘛餃<E7989B> AI 甈<E79488>霂?* <20>?
**<EFBFBD><EFBFBD>**嚗𡁶鍂<F0A181B6><EFBFBD>隡䭾<E99AA1>隞嗅<E99A9E>嚗淾I 撖寡<E69296><EFBFBD>糓蝛箇蒾<E7AE87>?
**靽桀<E99DBD>**嚗?
```typescript
// ChatContainer.tsx
const initialMessages = defaultMessages.length > 0 ? defaultMessages : [{
id: 'welcome',
role: 'assistant' as const,
content: '<27>典末嚗<E69CAB><E59A97><EFBFBD><EFBFBD><E88880>?AI <20>唳旿<E594B3><E697BF><EFBFBD><EFBFBD><E692A3><EFBFBD><EFBFBD><EFBFBD>臭誑撣格<E692A3>蝻硋<E89DBB><EFBFBD><E99A9E><EFBFBD><EFBFBD>瘣埈㺭<E59F88><EFBFBD><E69FB4><EFBFBD>霂閗秩嚗?<3F>𠰴僑樴<E58391>之鈭?0<><30>挽銝箄<E98A9D><E7AE84>僑蝏?<3F>?,
status: 'success' as const,
timestamp: Date.now(),
}];
```
**蝏𤘪<E89D8F>**嚗尠<E59A97> <20><EFBFBD>蝡见朖<E8A781><EFBFBD>撘訫紡嚗𣬚䰻<F0A3AC9A><EFBFBD>雿蓥蝙<E893A5>?
---
### 4. **皜<>征颲枏<E9A2B2>獢?+ 憓𧼮捐撖寡<E69296>獢?* <20>?
#### 4.1 皜<>征颲枏<E9A2B2>獢?
```typescript
// Sidebar.tsx
const [inputValue, setInputValue] = useState('');
<ChatContainer
senderProps={{
placeholder: '颲枏<E9A2B2><E69E8F>唳旿憭<E697BF><E686AD><EFBFBD><EFBFBD>瘙?..嚗𠄌nter<65><EFBFBD><E785BE><EFBFBD>',
value: inputValue,
onChange: (value) => setInputValue(value),
}}
onMessageSent={() => {
setInputValue(''); // 潃?<3F><EFBFBD><E785BE><EFBFBD><EFBFBD>
}}
/>
```
#### 4.2 憓𧼮捐撖寡<E69296>獢?
```typescript
// Sidebar.tsx
<div className="w-[480px] ..."> // <20><>䔉嚗鯱-[420px]
```
**蝏𤘪<E89D8F>**嚗?
- <20>?<3F><EFBFBD><E785BE><EFBFBD><EFBFBD><EFBFBD>颲枏<E9A2B2><EFBFBD><EFBFBD><EFBFBD>蝛?
- <20>?撖寡<E69296><EFBFBD>凒摰踝<E691B0><E8B89D><EFBFBD><EFBFBD>曄內摰峕㟲
---
### 5. **蝘駁膄憿菟𢒰皛𡁜𢆡<F0A1819C>?* <20>?
**<EFBFBD><EFBFBD>**嚗𡁏㟲銝芷△<E88AB7><EFBCB7>唳赤<E594B3><EFBFBD>蝥萄<E89DA5>皛𡁜𢆡<F0A1819C>?
**靽桀<E99DBD>**嚗?
```typescript
// index.tsx
<div className="h-screen w-screen flex flex-col bg-gradient-to-br from-slate-50 to-slate-100 overflow-hidden">
<div className="flex-1 flex overflow-hidden">
<div className="flex-1 flex flex-col min-w-0 overflow-hidden">
<Toolbar />
<div className="flex-1 p-4 overflow-hidden"> {/* 潃?<3F>喲睸嚗駅verflow-hidden */}
<DataGrid data={state.data} columns={state.columns} />
</div>
</div>
</div>
</div>
```
**<EFBFBD>喲睸<EFBFBD>?*嚗?
- <20>?<3F><><EFBFBD><EFBFBD>摰孵膥霈曄蔭 `overflow-hidden`
- <20>?<3F>芸銁 DataGrid <20><><EFBFBD><EFBFBD><EFBFBD><E39787>冽辺
- <20>?蝘駁膄憭帋<E686AD><E5B88B>?`overflow-auto`
**蝏𤘪<E89D8F>**嚗尠<E59A97> 憿菟𢒰<E88F9F><EFBFBD><E4ADBE>冽辺嚗<E8BEBA><EFBFBD>㕑”<E39591><EFBFBD><E6BE86>典虾皛𡁜𢆡
---
### 6. **隞<><E99A9E><EFBFBD>见𢆡<E8A781><EFBFBD><EFBFBD><E59A97><EFBFBD>芸𢆡餈鞱<E9A488>嚗?* <20>?
**<EFBFBD><EFBFBD>**嚗鋫I <20><><EFBFBD><EFBFBD><E99A9E><EFBFBD>𡒊<EFBFBD><F0A1928A><EFBFBD>銵䕘<E98AB5><E49598><EFBFBD><E586BD><EFBFBD><E4ADBE><EFBFBD>
**靽桀<E99DBD>**嚗?
#### 6.1 靽格㺿<E6A0BC>滨垢靚<E59EA2>
```typescript
// Sidebar.tsx
providerConfig={{
apiEndpoint: `/api/v1/dc/tool-c/ai/generate`, // 潃?<3F>嫣蛹<E5ABA3><EFBFBD><E88AB0>?
requestFn: async (message: string) => {
// <20><EFBFBD><E88AB0>𣂷誨<F0A382B7><E8AAA8><EFBFBD>銝齿<E98A9D>銵?
const response = await fetch(`/api/v1/dc/tool-c/ai/generate`, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ sessionId, message }),
});
const result = await response.json();
return {
messageId: result.data?.messageId,
explanation: result.data?.explanation,
code: result.data?.code, // 潃?<3F><EFBFBD><E88ABE>硺誨<E7A1BA><E8AAA8><EFBFBD>銝齿<E98A9D>銵?
success: true,
metadata: {
messageId: result.data?.messageId,
},
};
},
}}
```
#### 6.2 <20><EFBFBD><E586BD>孵稬"餈鞱<E9A488><EFBFBD><E99A9E>"<22>厰僼
```typescript
// Sidebar.tsx
const handleExecuteCode = async (code: string, messageId?: string) => {
setIsExecuting(true);
try {
const response = await fetch(`/api/v1/dc/tool-c/ai/execute`, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ sessionId, code, messageId }),
});
const result = await response.json();
if (result.data?.newDataPreview) {
onDataUpdate(result.data.newDataPreview); // 潃?<3F>湔鰵銵冽聢
antdMessage.success('隞<><E99A9E><EFBFBD><EFBFBD><E689AF>𣂼<EFBFBD>');
}
} finally {
setIsExecuting(false);
}
};
```
**瘚<><E7989A>**嚗?
```
1. <20><EFBFBD>颲枏<E9A2B2><E69E8F><EFBFBD>瘙?
<20>?
2. AI <20><><EFBFBD><EFBFBD><E99A9E><EFBFBD>遬蝷箏銁撖寡<E69296><EFBFBD><E78DA2>
<20>?
3. <20><EFBFBD><E586BD><EFBFBD><EFBFBD><E99A9E>
<20>?
4. <20><EFBFBD><E586BD>孵稬"餈鞱<E9A488><EFBFBD><E99A9E>"<22>厰僼 潃?<3F>见𢆡<E8A781><EFBFBD>
<20>?
5. <20><EFBFBD><EFBFBD><E99A9E>嚗峕凒<E5B395>啗”<E59597>?
```
**蝏𤘪<E89D8F>**嚗尠<E59A97> <20><EFBFBD><EFBFBD><E691B0><EFBFBD><EFBFBD><EFBFBD><E99A9E><EFBFBD><EFBFBD><E689AF>嗆㦤
---
### 7. **<2A><EFBFBD><EFBFBD><E89D9E>閖䔮蝑?* <20>?
**<EFBFBD><EFBFBD>**嚗𡁶<E59A97><F0A181B6>閖䔮憸矋<E686B8>憒?<3F><EFBFBD>撠𤑳撩憭勗<E686AD><EFBFBD>"嚗㗇<E59A97>瘜訫<E7989C>蝑䈑<E89D91>AI 撘箏<E69298><E7AE8F><EFBFBD><EFBFBD><EFBFBD><E99A9E>
**閫<><E996AB><EFBFBD><EFBFBD>**嚗𡁏溶<F0A1818F>䭾鰵<E4ADBE>?`/ai/chat` 蝡舐<E89DA1>
#### 7.1 <20>𡒊垢<F0A1928A><EFBFBD> API
```typescript
// AIController.ts
async chat(request: FastifyRequest, reply: FastifyReply) {
const { sessionId, message } = request.body;
// <20><EFBFBD> Session 靽⊥<E99DBD>
const session = await sessionService.getSession(sessionId);
// 靚<>鍂 LLM 餈𥡝<E9A488><EFBFBD><E89D9E>閖䔮蝑?
const llm = LLMFactory.getAdapter('deepseek-v3');
const response = await llm.chat([
{
role: 'system',
content: `雿䭾糓銝<EFBFBD>銝芣㺭<EFBFBD><EFBFBD><EFBFBD>𣂼𨭌<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>齿㺭<EFBFBD><EFBFBD>靽⊥<EFBFBD>嚗?
- <20><><EFBFBD><EFBFBD>${session.fileName}
- <20><EFBFBD><E9A489><EFBFBD>${session.totalRows}
- <20><EFBFBD><E9A483><EFBFBD>${session.totalCols}
- <20><EFBFBD>嚗?{session.columns.join(', ')}
霂瑞凒<EFBFBD><EFBFBD>蝑𠉛鍂<EFBFBD><EFBFBD><EFBFBD><EFBFBD>嚗䔶<EFBFBD><EFBFBD><EFBFBD><EFBFBD>𣂷誨<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
},
{ role: 'user', content: message }
], {
temperature: 0.7,
maxTokens: 500,
});
return reply.send({
success: true,
data: {
messageId: Date.now().toString(),
content: response.content,
explanation: response.content,
}
});
}
```
#### 7.2 頝舐眏瘜典<E7989C>
```typescript
// routes/index.ts
fastify.post('/ai/chat', {
handler: aiController.chat.bind(aiController),
});
```
#### 7.3 <20>滨垢<E6BBA8><EFBFBD><E7AE84>斗鱏
**<EFBFBD><EFBFBD>**嚗𡁜<E59A97>蝡臬虾隞交覔<E4BAA4>桃鍂<E6A183><EFBFBD><E79181>交惣<E4BAA4><EFBFBD>㗇𥋘靚<F0A58B98><EFBFBD>芯葵 API
```typescript
// <20>芣䔉隡睃<E99AA1>嚗𡁏惣<F0A1818F>賢ế<E8B3A2>?
const isSimpleQuestion = (message: string) => {
const questionKeywords = ['憭𡁜<E686AD>', '<27><EFBFBD>', '隞<>銋?, '<EFBFBD><EFBFBD>', '<EFBFBD>', '<EFBFBD><EFBFBD>'];
return questionKeywords.some(kw => message.includes(kw));
};
// 憒<><E68692><EFBFBD><EFBFBD><E88890>閖䔮憸矋<E686B8><EFBFBD>鍂 /ai/chat
// 憒<><E68692><EFBFBD>舀㺭<E88880><EFBFBD><E6A180><EFBFBD><EFBFBD><EFBFBD><E79899><EFBFBD>鍂 /ai/generate
```
**敶枏<E695B6>摰䂿緵**嚗𡁜<E59A97>雿輻鍂 `/ai/generate`<EFBFBD><EFBFBD><EFBFBD>𦦵鍂<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>閖䔮蝑䈑<EFBFBD><EFBFBD>臭誑<EFBFBD>见𢆡<EFBFBD><EFBFBD>
**蝏𤘪<E89D8F>**嚗尠<E59A97> <20><EFBFBD>銝斤<E98A9D>撖寡<E69296><E79285>
---
## <20><> 摰峕㟲靽格㺿皜<E3BABF><E79A9C>
| <20><>辣 | 靽格㺿<E6A0BC><E3BABF>捆 | 銵峕㺭 | <20><EFBFBD>?|
|------|---------|------|------|
| **<EFBFBD>滨垢** | | | |
| `DataGrid.tsx` | 瘜典<E7989C> AG Grid 璅<E79285> | +2 | <20>?|
| `DataGrid.tsx` | 隡睃<E99AA1>摰孵膥<E5ADB5><EFBFBD><EFBFBD>器獢<E599A8><E78DA2><EFBFBD>狍敶晞<E695B6><E6999E><EFBFBD>閫𡜐<E996AB> | ~10 | <20>?|
| `ChatContainer.tsx` | 瘛餃<E7989B><E79488>霂?| +8 | <20>?|
| `ChatContainer.tsx` | <20>脫迫<E884AB><EFBFBD><E785BE>征瘨<E5BE81><E798A8> | +1 | <20>?|
| `chat.css` | 憓𧼮撩颲寞<E9A2B2><E5AF9E><EFBFBD>狍敶晞<E695B6><E6999E><EFBFBD><EFBFBD><EFBFBD><E48185>?| ~25 | <20>?|
| `Sidebar.tsx` | 靽格㺿<E6A0BC>滨妍銝?AI <20>唳旿皜<E697BF><E79A9C><EFBFBD><EFBFBD>" | +1 | <20>?|
| `Sidebar.tsx` | 憓𧼮捐撖寡<E69296><EFBFBD><E78DA2>480px嚗?| +1 | <20>?|
| `Sidebar.tsx` | 瘛餃<E7989B>颲枏<E9A2B2><EFBFBD>𠶖<EFBFBD><F0A0B696><EFBFBD>?| +5 | <20>?|
| `Sidebar.tsx` | 靽格㺿銝箏蘨<E7AE8F><E898A8><EFBFBD><EFBFBD><E99A9E>嚗䔶<E59A97><E494B6>芸𢆡<E88AB8><EFBFBD> | ~15 | <20>?|
| `Header.tsx` | 隡睃<E99AA1><E79D83>厰僼<E58EB0><EFBFBD><EFBFBD>凒撠誩概<E8AAA9><E6A682><EFBFBD><EFBFBD><EFBFBD> | ~20 | <20>?|
| `Header.tsx` | 瘛餃<E7989B> AI <20><EFBFBD><E68B87><EFBFBD><EFBFBD>厰僼 | +15 | <20>?|
| `index.tsx` (Tool C) | 蝘駁膄憿菟𢒰皛𡁜𢆡<F0A1819C>?| ~5 | <20>?|
| `index.tsx` (Tool C) | 隡𣳇<E99AA1><EFBFBD><E98DA6><EFBFBD><EFBCB8><EFBFBD>靚?| +2 | <20>?|
| `index.tsx` (Tool C) | 蝘駁膄摨笔<E691A8><E7AC94>?handleSendMessage | -90 | <20>?|
| `index.tsx` (DC) | 靽桀<E99DBD> Spin tip 霅血<E99C85> | +1 | <20>?|
| `toolC.ts` | <20>湔鰵蝐餃<E89D90>摰帋<E691B0> | ~5 | <20>?|
| **<EFBFBD>𡒊垢** | | | |
| `AIController.ts` | 瘛餃<E7989B> chat <20><EFBFBD><EFBFBD><E59A97><EFBFBD>閖䔮蝑䈑<E89D91> | +58 | <20>?|
| `AIController.ts` | 瘛餃<E7989B><EFBFBD><E695B9><EFBFBD><EFBFBD><EFBFBD>?| +3 | <20>?|
| `routes/index.ts` | 瘜典<E7989C> /ai/chat 頝舐眏 | +4 | <20>?|
| **<EFBFBD>餉恣** | **19 銝芣<E98A9D>隞?* | **~180 銵?* | **<EFBFBD>?* |
---
## <20>綫 閫<><E996AB>撖寞<E69296>
### 靽桀<E99DBD><E6A180>?<3F>?
| <20><><EFBFBD> | <20><EFBFBD> |
|------|------|
| 銵冽聢 | 銝齿遬蝷綽<E89DB7><E79285><E288AA>躰秤嚗?|
| <20>厰僼 | 憭芸之<E88AB8><E4B98B><EFBFBD><EFBFBD><E6BABB>器獢<E599A8><E78DA2> |
| AI 撖寡<E69296>獢?| 憭芰<E686AD>嚗?20px嚗㚁<E59A97><E39A81>䭾洽餈舘祗 |
| 颲寞<E9A2B2> | 1px嚗䔶<E59A97><EFBFBD>苊 |
| <20><EFBFBD> | <20><><EFBFBD><E5838F><EFBFBD>蝟?|
| 皛𡁜𢆡<F0A1819C>?| 憿菟𢒰蝥批<E89DA5>嚗䔶<E59A97><EFBFBD>榆 |
### 靽桀<E99DBD><E6A180>?<3F>?
| <20><><EFBFBD> | <20><EFBFBD> |
|------|------|
| 銵冽聢 | 甇<><EFBFBD>曄內嚗?px 颲寞<E9A2B2>嚗屸狍敶?|
| <20>厰僼 | 撠誩概嚗?4px嚗㚁<E59A97><E39A81>𥪜<EFBFBD>嚗𣬚<E59A97>颲寞<E9A2B2> |
| AI 撖寡<E69296>獢?| <20>游捐嚗?80px嚗㚁<E59A97><E39A81>㗇洽餈舘祗 |
| 颲寞<E9A2B2> | 2px嚗峕<E59A97><E5B395><EFBFBD><E595A3>?|
| <20><EFBFBD> | 皜𣂼<E79A9C><F0A382BC><EFBFBD>狍敶晞<E695B6><E6999E><EFBFBD>甈⊥<E79488> |
| 皛𡁜𢆡<F0A1819C>?| 隞<><EFBFBD><EFBFBD><E6BE86><EFBFBD>雿㯄<E99BBF>憟?|
---
## <20><20><EFBFBD>撖寞<E69296>
### 靽桀<E99DBD><E6A180>?<3F>?
| <20><EFBFBD> | <20><EFBFBD> |
|------|------|
| 隞<><E99A9E><EFBFBD><EFBFBD> | <20>芸𢆡<E88AB8><EFBFBD>嚗峕<E59A97>瘜閙綉<E99699>?|
| 颲枏<E9A2B2>獢?| <20><EFBFBD><E785BE><EFBFBD>銝齿<E98A9D>蝛?|
| AI <20><EFBFBD> | <20>喲𡡒<E596B2><EFBFBD>瘜閙<E7989C><EFBFBD> |
| 蝞<><E89D9E>閖䔮蝑?| 銝齿𣈲<E9BDBF>?|
### 靽桀<E99DBD><E6A180>?<3F>?
| <20><EFBFBD> | <20><EFBFBD> |
|------|------|
| 隞<><E99A9E><EFBFBD><EFBFBD> | <20>见𢆡<E8A781>孵稬"餈鞱<E9A488><EFBFBD><E99A9E>"<22>厰僼 |
| 颲枏<E9A2B2>獢?| <20><EFBFBD><E785BE><EFBFBD><EFBFBD>芸𢆡皜<F0A286A1>征 |
| AI <20><EFBFBD> | <20><EFBFBD><E888AB><EFBFBD><E59785><EFBFBD><EFBCB7>?|
| 蝞<><E89D9E>閖䔮蝑?| <20><EFBFBD><EFBFBD>鰵憓?/ai/chat API嚗?|
---
## <20><> <20><EFBFBD> API
### POST /api/v1/dc/tool-c/ai/chat
**<EFBFBD><EFBFBD>?*嚗𡁶<E59A97><F0A181B6>閖䔮蝑䈑<E89D91>銝滨<E98A9D><E6BBA8>𣂷誨<F0A382B7>?
**霂瑟<E99C82>**嚗?
```json
{
"sessionId": "xxx",
"message": "<22><EFBFBD>蝐餃<E89D90><E9A483><EFBFBD>憭𡁜<E686AD>蝻箏仃<E7AE8F><EFBFBD>"
}
```
**<EFBFBD><EFBFBD>**嚗?
```json
{
"success": true,
"data": {
"messageId": "xxx",
"content": "<22>寞旿敶枏<E695B6><E69E8F>唳旿<E594B3><E697BF><EFBFBD><EFBFBD><EFBFBD>蝐餃<E89D90><E9A483><EFBFBD> 15 銝芰撩憭勗<E686AD><EFBFBD>?,
"explanation": "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 15 <EFBFBD><EFBFBD>?
}
}
```
---
## <20>?撉諹<E69289>蝏𤘪<E89D8F>
### Linter 璉<><E79289>?
- <20>?**<2A>滨垢**嚗? <20>躰秤嚗? 霅血<E99C85>
- <20>?**<2A>𡒊垢**嚗? <20>躰秤嚗? 霅血<E99C85>
### 瘚讛<E7989A><E8AE9B>冽綉<E586BD>嗅蝱
- <20>?**AG Grid <20>躰秤**嚗𡁜歇靽桀<E99DBD>
- <20>?**Spin 霅血<E99C85>**嚗𡁜歇靽桀<E99DBD>
- <20>?**0 <20>躰秤嚗? 霅血<E99C85>**
### <20><EFBFBD>瘚贝<E7989A>
| <20><EFBFBD> | 瘚贝<E7989A>蝏𤘪<E89D8F> |
|------|---------|
| 銵冽聢<E586BD>㰘蝸 | <20>?甇<><EFBFBD>曄內 |
| AI 甈<E79488>霂?| <20>?<3F>芸𢆡<E88AB8>曄內 |
| 颲枏<E9A2B2><EFBFBD><E78DA2>蝛?| <20>?<3F><EFBFBD><E785BE><EFBFBD><EFBFBD>征 |
| 隞<><E99A9E><EFBFBD>见𢆡<E8A781><EFBFBD> | <20>?<3F>孵稬<E5ADB5>厰僼<E58EB0><EFBFBD> |
| AI <20><EFBFBD><E68B87><EFBFBD>揢 | <20>?<3F><EFBFBD><E887AC>?|
| 憿菟𢒰皛𡁜𢆡 | <20>?隞<><EFBFBD><EFBFBD><E6BE86>?|
| <20>屸𢒰蝎曇稲摨?| <20>?<3F><EFBFBD><E4BAA5><EFBFBD><E7AC94>?|
---
## <20><> <20><EFBFBD>雿㯄<E99BBF><E3AF84>𣂼<EFBFBD>
### 靽桀<E99DBD><E6A180>?
- <20>?銵冽聢銝齿遬蝷綽<E89DB7><E7B6BD><EFBFBD><E586BD><EFBFBD>
- <20>?<3F>屸𢒰蝎㛖<E89D8E>嚗𣬚撩銋譍<E98A8B>銝𡁏<E98A9D>
- <20>?AI 撖寡<E69296><EFBFBD><EFBFBD><EFBFBD>銝滨䰻<E6BBA8><EFBFBD>雿蓥蝙<E893A5>?
- <20>?颲枏<E9A2B2><EFBFBD><E78DA2><EFBFBD>征嚗䔶<E59A97><EFBFBD>
- <20>?隞<><E99A9E><EFBFBD>芸𢆡<E88AB8><EFBFBD>嚗峕<E59A97>瘜閙綉<E99699>?
- <20>?憿菟𢒰皛𡁜𢆡瘛瑚僚
### 靽桀<E99DBD><E6A180>?
- <20>?銵冽聢蝡见朖<E8A781>曄內嚗峕㺭<E5B395><EFBFBD><E6A0BC>?
- <20>?<3F>屸𢒰蝎曇稲嚗䔶<E59A97>銝𡁏<E98A9D>撘?
- <20>?AI 甈<E79488>霂剖<E99C82>撖潘<E69296>雿輻鍂<E8BCBB>𡒊
- <20>?颲枏<E9A2B2><EFBFBD><EFBFBD><EFBFBD>蝛綽<E89D9B>雿㯄<E99BBF><EFBFBD><E7989A>
- <20>?隞<><E99A9E><EFBFBD>见𢆡<E8A781><EFBFBD>嚗𣬚鍂<F0A3AC9A>瑕虾<E79195>?
- <20>?憿菟𢒰撣<F0A292B0><E692A3>摰𣬚<E691B0>嚗峕<E59A97>皛𡁜𢆡撟脫贋
**<EFBFBD><EFBFBD>雿㯄<EFBFBD><EFBFBD><EFBFBD>嚗尠<EFBFBD>潃鐥<EFBFBD>潃鐥<EFBFBD>**
---
## <20><> 瘚贝<E7989A><E8B49D><EFBFBD><EFBFBD>
### 1. <20>瑟鰵瘚讛<E7989A><E8AE9B>?
```
http://localhost:5173/data-cleaning/tool-c
```
### 2. 銝𠹺<E98A9D><F0A0B9BA><EFBFBD>
- <20>孵稬"<22>㗇𥋘<E39787><F0A58B98>辣"
- 銝𠹺<E98A9D> CSV <20>?Excel
- 摨磰砲<E7A3B0><EFBFBD>嚗?
- <20>?銵冽聢甇<E881A2><EFBFBD>曄內<E69B84>唳旿
- <20>?AI 甈<E79488>霂剛䌊<E5899B>典枂<E585B8>?
- <20>?<3F>屸𢒰蝎曇稲蝢舘<E89DA2>
### 3. 瘚贝<E7989A> AI 撖寡<E69296>
**<EFBFBD>唳旿憭<EFBFBD><EFBFBD><EFBFBD><EFBFBD>瘙?*嚗<><E59A97><EFBFBD>𣂷誨<F0A382B7><E8AAA8><EFBFBD>嚗?
- "<22>𠰴僑樴<E58391>之鈭?0<><30>挽銝箄<E98A9D><E7AE84>僑蝏?
- "<22>𣳇膄<F0A3B387><EFBFBD>銵?
- "憛怨蝻箏仃<E7AE8F>?
**蝞<><E89D9E>閖䔮蝑?*嚗<><E59A97><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E99A9E>嚗㚁<E59A97>
- "<22><EFBFBD>蝐餃<E89D90><E9A483><EFBFBD>憭𡁜<E686AD>蝻箏仃<E7AE8F><EFBFBD>"
- "<22>唳旿<E594B3><E697BF><EFBFBD>憭𡁜<E686AD>銵䕘<E98AB5>"
- "<22>匧𪑛鈭𥕦<E988AD>嚗?
### 4. 撉諹<E69289><E8ABB9><EFBFBD>
- <20>?颲枏<E9A2B2><EFBFBD><E798A8><EFBFBD>𠬍<EFBFBD>颲枏<E9A2B2><EFBFBD><EFBFBD><EFBFBD>蝛?
- <20>?AI <20><><EFBFBD><EFBFBD><E99A9E>嚗峕遬蝷?餈鞱<E9A488><EFBFBD><E99A9E>"<22>厰僼
- <20>?<3F>孵稬<E5ADB5>厰僼<E58EB0>𠬍<EFBFBD>銵冽聢<E586BD>湔鰵
- <20>?<3F>臭誑<E887AD>喲𡡒撟園<E6929F><E59C92><EFBFBD><EFBFBD> AI <20><EFBFBD>
- <20>?憿菟𢒰<E88F9F><EFBFBD><E4ADBE>冽辺嚗<E8BEBA><EFBFBD>㕑”<E39591><EFBFBD><E6BE86>典虾皛𡁜𢆡
---
## <20><> <20>喲睸<E596B2><EFBFBD><E5AFA1>?
### 1. **閫<><E996AB>霈曇恣**
- <20>?颲寞<E9A2B2>隞?1px <20>?2px
- <20>?<3F>游蔣隞?sm <20>?lg
- <20>?<3F><><EFBFBD>隞?xl <20>?2xl
- <20>?瘛餃<E7989B>皜𣂼<E79A9C><F0A382BC>峕艶
- <20>?<3F>厰僼<E58EB0><EFBFBD>撌扳<E6928C><E689B3>?
### 2. **鈭支<E988AD>雿㯄<E99BBF>**
- <20>?颲枏<E9A2B2><EFBFBD><EFBFBD><EFBFBD>蝛?
- <20>?AI <20><EFBFBD><E68B87><EFBFBD><E887AC>?
- <20>?隞<><E99A9E><EFBFBD>见𢆡<E8A781><EFBFBD>
- <20>?甈<E79488>霂剖<E99C82>撖?
### 3. **撣<><E692A3>隡睃<E99AA1>**
- <20>?蝘駁膄憿菟𢒰皛𡁜𢆡
- <20>?撖寡<E69296><EFBFBD>凒摰踝<E691B0>480px嚗?
- <20>?撅<>活皜<E6B4BB>
### 4. **<2A><EFBFBD>憓𧼮撩**
- <20>?<3F><EFBFBD><EFBFBD><E89D9E>閖䔮蝑?
- <20>?<3F><EFBFBD><EFBFBD><E99A9E><EFBFBD><EFBFBD><EFBFBD>
- <20>?<3F><EFBFBD><E586BD>舀綉<E88880><EFBFBD>
---
## <20><> <20><EFBFBD>
**<EFBFBD>?<3F><><EFBFBD>?7 銝芷䔮憸睃歇摰𣬚<E691B0>靽桀<E99DBD>嚗?*
1. <20>?AG Grid 銵冽聢甇<E881A2><EFBFBD>㰘蝸
2. <20>?<3F>屸𢒰蝎曇稲蝢舘<E89DA2>嚗峕𦻖餈穃<E9A488><E7A983>见㦛
3. <20>?AI 甈<E79488>霂剛䌊<E5899B>冽遬蝷?
4. <20>?颲枏<E9A2B2><EFBFBD><EFBFBD><EFBFBD>蝛?
5. <20>?憿菟𢒰<E88F9F><EFBFBD><E4ADBE>冽辺
6. <20>?隞<><E99A9E><EFBFBD>见𢆡<E8A781><EFBFBD>
7. <20>?<3F><EFBFBD><EFBFBD><E89D9E>閖䔮蝑?
**隞<><E99A9E>韐券<E99F90>**嚗?
- <20>?0 <20>躰秤嚗? 霅血<E99C85>
- <20>?摰峕㟲<E5B395><E39FB2><EFBFBD><EFBFBD><E8A781>?
- <20>?隡㗛<E99AA1><E3979B><EFBFBD><EFBFBD><E8AAA8><EFBFBD><EFBFBD>?
**<EFBFBD><EFBFBD>雿㯄<EFBFBD>**嚗?
- <20>?<3F>屸𢒰蝎曇稲銝㮖<E98A9D>
- <20>?鈭支<E988AD><EFBFBD><E7989A><EFBFBD><EFBFBD>
- <20>?<3F><EFBFBD>摰峕㟲<E5B395>舀綉
**<EFBFBD><EFBFBD> Tool C MVP 摰峕㟲<E5B395><E39FB2>歇撠梁貌嚗?* <20><>
---
**靽桀<E99DBD><E6A180>?*嚗鋫I Assistant
**<EFBFBD><EFBFBD>**嚗?025-12-07
**<EFBFBD><EFBFBD>𧋦**嚗鯝1.2嚗<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>𣇉<EFBFBD>嚗?