Files
AIclinicalresearch/docs/03-业务模块/DC-数据清洗整理/04-开发计划/工具C_方案B实施总结_2025-12-09.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

398 lines
8.4 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.
# 撌亙<E6928C>C - <20><EFBFBD>B摰墧鴌<E5A2A7><EFBFBD><EFBFBD><E59A97><EFBFBD>滨鸌畾𠰴<E795BE>蝚西圾<E8A5BF>單䲮獢<E4B2AE><E78DA2>
> **<2A><EFBFBD>**: 2025-12-09
> **<2A><>𧋦**: v1.0
> **摰墧鴌<E5A2A7><EFBFBD>**: <20><EFBFBD>B - Python韐蠘提<E8A098><EFBFBD><E5A092>踵揢
---
## <20><> <20><EFBFBD><E6A185>峕艶
### <20><EFBFBD><E7AC94><EFBFBD>
<EFBFBD><EFBFBD>銝𠹺<EFBFBD><EFBFBD><EFBFBD>xcel<EFBFBD><EFBFBD>辣銵典仍<EFBFBD><EFBFBD><EFBFBD><EFBFBD>摮㛖泵嚗<EFBFBD><EFBFBD>渲恣蝞堒<EFBFBD><EFBFBD><EFBFBD>憭梯揖嚗?
**蝷箔<E89DB7>銵典仍**:
- `雿㯄<E99BBF>ɑg嚗头
- `1.擃䁅<E69383><E48185><EFBFBD><EFBFBD><E59A97>=0嚗峕<E59A97>=1嚗䔶<E59A97><E494B6>仿<EFBFBD>=2嚗头
- `頨恍<E9A0A8>嚗Ếm嚗头
**<EFBFBD>仿<EFBFBD>靽⊥<EFBFBD>**:
```
霈∠<EFBFBD><EFBFBD>堒仃韐伐<EFBFBD><EFBFBD><EFBFBD>撉諹<EFBFBD>憭梯揖: <20><EFBFBD><E7A08D><EFBFBD>鉄銝滚<E98A9D>霈貊<E99C88>摮㛖泵
```
---
## <20><20><EFBFBD><E5AF9E>㗇𥋘
### <20><EFBFBD>撖寞<E69296>
| <20><EFBFBD> | <20>讛膩 | 隡条<E99AA1> | 蝻箇<E89DBB> | 霂<><E99C82> |
|------|------|------|------|------|
| **<EFBFBD><EFBFBD>A** | <20><EFBFBD>雿輻鍂摨誩噡撘閧鍂嚗Ếol_0, col_1嚗?| <20><><EFBFBD><EFBFBD>摰匧<E691B0> | <20><EFBFBD>雿㯄<E99BBF>撌殷<E6928C>銝滨凒閫?| 潃鐥<E6BD83> |
| **<EFBFBD><EFBFBD>B** | <20><EFBFBD>雿輻鍂<E8BCBB><EFBFBD><E7AC94><EFBFBD>Python韐蠘提<E8A098>踵揢 | <20><EFBFBD>雿㯄<E99BBF>憟踝<E6869F><E8B89D><EFBFBD><EFBFBD>臬虾<E887AC>?| <20><>摰䂿緵<E482BF>踵揢<E8B8B5><EFBFBD> | 潃鐥<E6BD83>潃鐥<E6BD83>潃?|
| **<EFBFBD><EFBFBD>C** | <20>滨垢<E6BBA8>踵揢<E8B8B5><EFBFBD> | <20><EFBFBD>蝵𤑳<E89DB5>隡㰘<E99AA1> | 颲寧<E9A2B2><EFBFBD><E99C82><EFBFBD>圈𠗕嚗䔶<E59A97><E494B6><EFBFBD> | 潃鐥<E6BD83>潃?|
**<EFBFBD><EFBFBD><EFBFBD><EFBFBD>㗇𥋘**: **<EFBFBD><EFBFBD>B** <20>?
---
## <20><>儭?<3F><EFBFBD>霈曇恣
### <20>唳旿瘚?
```
<EFBFBD><EFBFBD>颲枏<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>嚗?
<20>?
<EFBFBD>滨垢嚗帋<EFBFBD><EFBFBD><EFBFBD>kg嚗?/ (頨恍<E9A0A8>嚗Ếm嚗?100)**2
<20>?
<EFBFBD>𡒊垢嚗朞繮<EFBFBD>?columnMapping
<20>?
隡𣳇<EFBFBD><EFBFBD>Python: {
formula: "雿㯄<E99BBF>ɑg嚗?/ (頨恍<E9A0A8>嚗Ếm嚗?100)**2",
column_mapping: [
{"originalName": "雿㯄<E99BBF>ɑg嚗?, "safeName": "col_0"},
{"originalName": "頨恍<E9A0A8>嚗Ếm嚗?, "safeName": "col_1"}
]
}
<20>?
Python<EFBFBD>踵揢: col_0 / (col_1/100)**2
<20>?
<EFBFBD><EFBFBD>霈∠<EFBFBD> <20>?
```
### <20>諹提<E8ABB9><EFBFBD>
| 撅<>漣 | <20>諹提 | <20>喲睸<E596B2>?|
|------|------|--------|
| **<EFBFBD>滨垢** | UI鈭支<E988AD><E694AF><EFBFBD><EFBFBD>格𤣰<E6A0BC>?| <20><EFBFBD><E586BD><EFBFBD><E8A781><EFBFBD><E8ABB9><EFBFBD><E4BA99><EFBFBD> |
| **<EFBFBD>𡒊垢** | <20><EFBFBD>columnMapping<6E><67><EFBFBD><EFBFBD><EFBFBD>Python | 隞燑ession<6F><EFBFBD><E79195><EFBFBD> |
| **Python** | <20><EFBFBD><E5A092>踵揢<E8B8B5><E68FA2><EFBFBD>撘𤩺<E69298>銵?| <20>厰鵭摨行<E691A8>摨譌<E691A8><E8AD8C>移蝖格𤜯<E6A0BC>?|
---
## <20>凃 摰墧鴌蝏<E9B48C><E89D8F>
### 1. <20>滨垢嚗㇃omputeDialog.tsx嚗?
**靽脲<E99DBD>銝滚<E98A9D>** - 撌脩<E6928C>雿輻鍂<E8BCBB><EFBFBD><E7AC94>齿䲮撘?
```typescript
// <20><EFBFBD><E586BD>孵稬<E5ADB5><EFBFBD><E5A092><EFBFBD>倌嚗峕<E59A97><E5B395><EFBFBD><E4BA99><EFBFBD>獢?
<Tag onClick={() => setFormula(formula + col.name)}>
{col.name} {/* <20>曄內<E69B84><EFBFBD><E7AC94><EFBFBD>雿㯄<E99BBF>ɑg嚗?*/}
</Tag>
// <20>𣂷漱<F0A382B7>嗥凒<E597A5><EFBFBD><E4B9A9><EFBFBD><E98DA6><EFBFBD>
onApply({
newColumnName: "BMI",
formula: "雿㯄<E99BBF>ɑg嚗?/ (頨恍<E9A0A8>嚗Ếm嚗?100)**2", // <20><EFBFBD><E7AC94>?
});
```
### 2. <20>𡒊垢嚗㇋uickActionController.ts嚗?
**靽格㺿**: <20><EFBFBD>session撟嗡<E6929F><E597A1>𠸍olumnMapping
```typescript
// <20><EFBFBD>session嚗<6E><E59A97><EFBFBD>剃olumnMapping嚗?
session = await sessionService.getSession(sessionId);
// 隡𣳇<E99AA1><EFBFBD>QuickActionService
executeResult = await quickActionService.executeCompute(
fullData,
params,
session.columnMapping // <20>?隡𣳇<E99AA1><EFBFBD>撠?
);
```
### 3. <20>𡒊垢嚗㇋uickActionService.ts嚗?
**靽格㺿**: <20>交𤣰撟嗡<E6929F><E597A1>𠸍olumnMapping蝏筢ython
```typescript
async executeCompute(
data: any[],
params: ComputeParams,
columnMapping?: any[] // <20>?<3F><EFBFBD><E595A3><EFBFBD>
): Promise<OperationResult> {
const response = await axios.post(`${PYTHON_SERVICE_URL}/api/operations/compute`, {
data,
new_column_name: params.newColumnName,
formula: params.formula,
column_mapping: columnMapping || [], // <20>?隡𣳇<E99AA1><EFBFBD>撠?
});
return response.data;
}
```
### 4. Python嚗éain.py嚗?
**靽格㺿**: <20>湔鰵霂瑟<E99C82><E79285>
```python
class ComputeRequest(BaseModel):
data: List[Dict[str, Any]]
new_column_name: str
formula: str
column_mapping: List[Dict[str, str]] = [] # <20>?<3F><EFBFBD>摮埈挾
@app.post("/api/operations/compute")
async def operation_compute(request: ComputeRequest):
result_df = compute_column(
df,
request.new_column_name,
request.formula,
request.column_mapping # <20>?隡𣳇<E99AA1><EFBFBD>撠?
)
```
### 5. Python嚗Ếompute.py嚗?
**<EFBFBD><EFBFBD>摰䂿緵**: <20><EFBFBD><E5A092>踵揢<E8B8B5><EFBFBD>
```python
def replace_column_names_in_formula(
formula: str,
column_mapping: List[Dict[str, str]]
) -> str:
"""
<20>?<3F><EFBFBD>蝞埈<E89D9E>嚗𡁜虾<F0A1819C><EFBFBD><E588A0><EFBFBD><E5A092>踵揢
"""
safe_formula = formula
# <20>喲睸1嚗𡁏<E59A97><F0A1818F><EFBFBD><E5A092>踹漲<E8B8B9><EFBFBD><E98DA6><EFBFBD>
# <20><EFBFBD>摮𣂷葡<F0A382B7><EFBFBD>嚗𡁜<E59A97><F0A1819C>踵揢"擃䁅<E69383><E48185><EFBFBD><E8AEA0>?嚗<><E59A97><EFBFBD>踵揢"擃䁅<E69383><E48185>?
sorted_mapping = sorted(
column_mapping,
key=lambda x: len(x['originalName']),
reverse=True
)
# <20>喲睸2嚗𡁻<E59A97>𣂷葵蝎曄<E69B84>踵揢嚗<E68FA2><E59A97>雿輻鍂甇<E98D82><E79487>嚗?
for item in sorted_mapping:
original = item['originalName']
safe = item['safeName']
if original in safe_formula:
safe_formula = safe_formula.replace(original, safe)
return safe_formula
def compute_column(
df: pd.DataFrame,
new_column_name: str,
formula: str,
column_mapping: Optional[List[Dict[str, str]]] = None
) -> pd.DataFrame:
"""
<20>?<3F><EFBFBD>B嚗䥪ython韐蠘提<E8A098>踵揢
"""
# 1. <20>踵揢<E8B8B5><EFBFBD>
if column_mapping:
safe_formula = replace_column_names_in_formula(formula, column_mapping)
else:
safe_formula = formula
# 2. <20><><EFBFBD><EFBFBD><EFBFBD><E689AF><EFBFBD>
env = {}
for item in column_mapping:
env[item['safeName']] = df[item['originalName']]
env.update(ALLOWED_FUNCTIONS)
# 3. <20><EFBFBD><EFBFBD><E59A97><EFBFBD><EFBFBD><EFBFBD><E996AC>蝚阡<E89D9A><EFBFBD><E99C82>嚗?
result = eval(safe_formula, {"__builtins__": {}}, env)
return df.assign(**{new_column_name: result})
```
---
## <20>?閫<><E996AB><EFBFBD><EFBFBD>䔮憸?
### 1. <20><EFBFBD>摮㛖泵<E39B96><EFBFBD> <20>?
- **<2A><EFBFBD>**: `雿㯄<E99BBF>ɑg嚗头 <20><>鉄銝剜<E98A9D><E5899C>砍噡
- **閫<><E996AB>**: Python雿輻鍂摰匧<E691B0><E58CA7><EFBFBD> `col_0`嚗䔶<EFBFBD><EFBFBD>㛖鸌畾𠰴<EFBFBD>蝚血蔣<EFBFBD>?
### 2. 摮𣂷葡<F0A382B7><E891A1><EFBFBD><EFBFBD> <20>?
- **<2A><EFBFBD>**: "擃䁅<E69383><E48185>? <20>?"擃䁅<E69383><E48185><EFBFBD><E8AEA0>? <20><EFBFBD>霂舀𤜯<E88880>?
- **閫<><E996AB>**: <20>厰鵭摨血<E691A8><EFBFBD><E98DA6><EFBFBD><EFBFBD><E59A97><EFBFBD>踵揢<E8B8B5><EFBFBD><E8B8B9>?
### 3. 颲寧<E9A2B2><EFBFBD><E99C82><EFBFBD><EFBFBD> <20>?
- **<2A><EFBFBD>**: 甇<><E79487>`\b`撖嫣葉<EFBFBD><EFBFBD><EFBFBD>蝚虫<EFBFBD><EFBFBD><EFBFBD>
- **閫<><E996AB>**: 雿輻鍂Python摮㛖泵銝深replace`嚗𣬚<E59A97><F0A3AC9A>訫虾<E8A8AB>?
### 4. 摮㛖泵<E39B96><EFBFBD><E8B3A2>閖䔮憸?<3F>?
- **<2A><EFBFBD>**: <20><><EFBFBD><E996AC>銝暹<E98A9D><E69AB9><EFBFBD>霈貊<E99C88>摮㛖泵
- **閫<><E996AB>**: 銝漤<E98A9D><EFBFBD><E996AC><EFBFBD><E99C82>Python<6F><EFBFBD><E88AB8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E585B8>?
---
## <20>妒 瘚贝<E7989A><E8B49D><EFBFBD>
### 瘚贝<E7989A>1嚗𡁜抅<F0A1819C><EFBFBD><E7A08D>?
```python
column_mapping = [
{"originalName": "雿㯄<EFBFBD>ɑg嚗?, "safeName": "col_0"},
{"originalName": "頨恍<EFBFBD>嚗Ếm嚗?, "safeName": "col_1"}
]
formula = "雿㯄<EFBFBD>ɑg嚗?/ (頨恍<E9A0A8>嚗Ếm嚗?100)**2"
# 憸<><E686B8>: col_0 / (col_1/100)**2 <20>?
```
### 瘚贝<E7989A>2嚗𡁜<E59A97>銝脣<E98A9D><E884A3>?
```python
column_mapping = [
{"originalName": "擃䁅<EFBFBD><EFBFBD>?, "safeName": "col_0"},
{"originalName": "擃䁅<EFBFBD><EFBFBD><EFBFBD><EFBFBD>?, "safeName": "col_1"}
]
formula = "擃䁅<EFBFBD><EFBFBD><EFBFBD><EFBFBD>?+ 擃䁅<E69383><E48185>?
# 憸<><E686B8>: col_1 + col_0 <20><><EFBFBD><EFBFBD>牐蛹<E78990>厰鵭摨行<E691A8>摨𧶏<E691A8>
```
### 瘚贝<E7989A>3嚗𡁜<E59A97><F0A1819C><EFBFBD>鸌畾𠰴<E795BE>蝚?
```python
column_mapping = [
{"originalName": "1.擃䁅<E69383><E48185><EFBFBD><EFBFBD><E59A97>=0嚗峕<E59A97>=1嚗䔶<E59A97><E494B6>仿<EFBFBD>=2嚗?, "safeName": "col_0"}
]
formula = "1.擃䁅<E69383><E48185><EFBFBD><EFBFBD><E59A97>=0嚗峕<E59A97>=1嚗䔶<E59A97><E494B6>仿<EFBFBD>=2嚗?* 2"
# 憸<><E686B8>: col_0 * 2 <20>?
```
### 瘚贝<E7989A>4嚗𡁜<E59A97>憟埈𡠺<E59F88>?
```python
column_mapping = [
{"originalName": "FMA<EFBFBD><EFBFBD>嚗?-100嚗?, "safeName": "col_0"}
]
formula = "FMA<EFBFBD><EFBFBD>嚗?-100嚗?/ 100"
# 憸<><E686B8>: col_0 / 100 <20>?
```
---
## <20><> <20><EFBFBD>敶勗<E695B6>
| <20><><EFBFBD> | 敶勗<E695B6> | 霂湔<E99C82> |
|------|------|------|
| **蝵𤑳<E89DB5>隡㰘<E99AA1>** | +5KB | columnMapping蝥?KB嚗?00<30><EFBFBD> |
| **<EFBFBD>踵揢<EFBFBD>園𡢿** | <1ms | 摮㛖泵銝脫𤜯<E884AB><EFBFBD>撣詨翰 |
| **<EFBFBD><EFBFBD><EFBFBD><EFBFBD>** | <20>臬蕭<E887AC>?| <20><EFBFBD><E8B1A2>唳旿憭<E697BF><E686AD><EFBFBD>園𡢿嚗<F0A1A2BF><E59A97>蝥改<E89DA5><E694B9>臬蕭<E887AC>?|
---
## <20>㴓 隡睃飵<E79D83><EFBFBD>
### <20><EFBFBD>雿㯄<E99BBF> 潃鐥<E6BD83>潃鐥<E6BD83>潃?
- <20>?<3F><EFBFBD><E586BD><EFBFBD><E8A781><EFBFBD><E8ABB9><EFBFBD><E4BA99><EFBFBD>
- <20>?<3F><EFBFBD><E7A08D><EFBFBD><E6B8B2>𤘪<EFBFBD>
- <20>?<3F><>蟮霈啣<E99C88><EFBFBD>
### <20><><EFBFBD>臬虾<E887AC><EFBFBD>?潃鐥<E6BD83>潃鐥<E6BD83>潃?
- <20>?銝滢<E98A9D>韏𡝗迤<F0A19D97>躰器<E8BAB0><EFBFBD><E8ABB9>?
- <20>?<3F>厰鵭摨行<E691A8>摨誯<E691A8><E8AAAF><EFBFBD>銝脤䔮憸?
- <20>?Python摮㛖泵銝脫<E98A9D>雿𦦵<E99BBF><F0A6A6B5>訫虾<E8A8AB>?
### <20>舐輕<E88890><EFBFBD>?潃鐥<E6BD83>潃鐥<E6BD83>潃?
- <20>?<3F>諹提皜<E68F90>苊嚗<E88B8A><E59A97>蝡狹I<E78BB9><49>ython<6F><EFBFBD>嚗?
- <20>?<3F><EFBFBD><EFBFBD><E99D9A><EFBFBD><EFBFBD>枏㫲<E69E8F>踵揢<E8B8B5><EFBFBD>嚗?
- <20>?<3F>芣䔉銝滢<E98A9D><E6BBA2>齿<EFBFBD>摮㛖泵<E39B96><EFBFBD>
---
## <20><> <20>𡒊賒撌乩<E6928C>
### 撌脣<E6928C><E884A3>?<3F>?
- [x] <20>滨垢靽脲<E99DBD>雿輻鍂<E8BCBB><EFBFBD><E7AC94>?
- [x] <20>𡒊垢隡𣳇<E99AA1>𠸍olumnMapping
- [x] Python摰䂿緵<E482BF>踵揢<E8B8B5><EFBFBD>
- [x] 蝘駁膄摮㛖泵撉諹<E69289>
- [x] <20>湔鰵Pivot<6F><EFBFBD>
### 敺<><E695BA>霂?<3F>?
- [ ] <20><EFBFBD>摰鮋<E691B0>瘚贝<E7989A>
- [ ] 颲寧<E9A2B2><E5AFA7><EFBFBD><EFBFBD>撉諹<E69289>
- [ ] <20><EFBFBD>瘚贝<E7989A>
### <20>芣䔉隡睃<E99AA1> <20>
- [ ] 瘛餃<E7989B><E9A483><EFBFBD>霂剜<E99C82>擃䀝漁
- [ ] <20><EFBFBD><E5A092>芸𢆡銵亙<E98AB5>
- [ ] <20><EFBFBD><E7A08D>躰秤<E8BAB0>鞟內隡睃<E99AA1>
---
## <20><> <20><EFBFBD><E8A9A8><EFBFBD>
### 靽格㺿<E6A0BC><E3BABF><EFBFBD>隞?
1. `backend/src/modules/dc/tool-c/controllers/QuickActionController.ts`
2. `backend/src/modules/dc/tool-c/services/QuickActionService.ts`
3. `extraction_service/main.py`
4. `extraction_service/operations/compute.py`
5. `extraction_service/operations/pivot.py`
### <20><>
- <20><EFBFBD><EFBFBD><E78DA2>`撌亙<E6928C>C_<43><EFBFBD>B摰墧鴌<E5A2A7><EFBFBD>_2025-12-09.md`
- <20>埞ug<75><EFBFBD>嚗䫤撌亙<E6928C>C_Bug靽桀<E99DBD><E6A180><EFBFBD>_2025-12-08.md`
---
## <20>?<3F><EFBFBD>
<EFBFBD><EFBFBD>B<EFBFBD>𣂼<EFBFBD>摰䂿緵鈭<EFBFBD><EFBFBD>
1. **<EFBFBD><EFBFBD>雿㯄<EFBFBD>隡条<EFBFBD>** - 雿輻鍂<E8BCBB><EFBFBD><E7AC94><EFBFBD><E3B5AA><EFBFBD><E6B8B2>𤘪<EFBFBD>
2. **<EFBFBD><EFBFBD><EFBFBD>臬虾<EFBFBD>?* - Python<6F>踵揢嚗𣬚<E59A97><F0A3AC9A>訫虾<E8A8AB>?
3. **敶餃<E695B6><EFBFBD><E996AB>** - 銝滚<E98A9D><E6BB9A>厩鸌畾𠰴<E795BE>蝚阡䔮憸?
**銝衤<E98A9D>甇?*: 蝑匧<E89D91><E58CA7><EFBFBD>瘚贝<E7989A>撉諹<E69289> <20>?