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%)
26 KiB
撌亙<EFBFBD>C Day 3 撘<><E69298>𤏸恣<F0A48FB8>?- AI隞<49><E99A9E><EFBFBD><EFBFBD><EFBFBD><EFBFBD>滚𦛚
<EFBFBD><EFBFBD>﹝<EFBFBD><EFBFBD>𧋦: V1.0
<EFBFBD>𥕦遣<EFBFBD>交<EFBFBD>: 2025-12-06
**撘<><E69298>𤑳𤌍<F0A491B3>?*: AI隞<49><E99A9E><EFBFBD><EFBFBD><EFBFBD> + Python<6F>扯<EFBFBD> + <20>芣<EFBFBD>靽格迤
憸<EFBFBD>恣撌交𧒄: 5.5-6撠𤩺𧒄
靘肽<EFBFBD>: Day 2撌脣<E6928C><E884A3>琜<EFBFBD>Session蝞∠<E89D9E>嚗?
<EFBFBD><EFBFBD> <20>詨<EFBFBD><E8A9A8>喟<EFBFBD><E5969F>餌<EFBFBD>
<EFBFBD>喟<EFBFBD>1: 撖寡<E69296>摮睃<E691AE><E79D83>孵<EFBFBD> <20>?
<EFBFBD>寞<EFBFBD><EFBFBD>㗇𥋘: <20>𥕦遣<F0A595A6>祉<EFBFBD>銵?dc_tool_c_ai_history
<EFBFBD><EFBFBD>眏:
- <EFBFBD>芣䔉璅∪<EFBFBD><EFBFBD>航<EFBFBD><EFBFBD>祉<EFBFBD><EFBFBD><EFBFBD><EFBFBD>格<EFBFBD><EFBFBD>祉<EFBFBD><EFBFBD>函蔡
- 蝚血<EFBFBD>Schema<EFBFBD>𠉛氖<EFBFBD>笔<EFBFBD>
- Tool C<>厩鸌畾𠰴<E795BE>畾菟<E795BE>瘙<EFBFBD><E79899>code<64><65>xecuteResult嚗?
<EFBFBD>唳旿摨廍chema:
model DcToolCAiHistory {
id String @id @default(uuid())
sessionId String // <20>唾<EFBFBD>Tool C Session
userId String
role String // user/assistant/system
content String @db.Text
// Tool C<>寞<EFBFBD>摮埈挾
generatedCode String? @db.Text // AI<41><49><EFBFBD><EFBFBD><EFBFBD>誨<EFBFBD>?
codeExplanation String? @db.Text // 隞<><E99A9E>閫<EFBFBD><E996AB>
executeStatus String? // success/failed/pending
executeResult Json? // <20>扯<EFBFBD>蝏𤘪<E89D8F>
executeError String? @db.Text // <20>躰秤靽⊥<E99DBD>
retryCount Int @default(0)
model String? // deepseek-v3
createdAt DateTime @default(now())
@@index([sessionId])
@@index([userId])
@@map("dc_tool_c_ai_history")
@@schema("dc_schema")
}
<EFBFBD>喟<EFBFBD>2: AI隞<49><E99A9E><EFBFBD>扯<EFBFBD>瘚<EFBFBD><E7989A> <20>?
<EFBFBD>寞<EFBFBD><EFBFBD>㗇𥋘: <20>冽<EFBFBD>蝖株恕<E6A0AA>擧<EFBFBD>銵䕘<E98AB5><E49598>寞<EFBFBD>A嚗?
瘚<EFBFBD><EFBFBD>:
<EFBFBD>冽<EFBFBD>颲枏<EFBFBD><EFBFBD>芰<EFBFBD>霂剛<EFBFBD>
<20>?
AI<41><49><EFBFBD>隞<EFBFBD><E99A9E> + 閫<><E996AB>
<20>?
<0A>滨垢撅閧內隞<E585A7><E99A9E>嚗<EFBFBD><E59A97>鈭殷<E988AD>
<20>?
<0A>冽<EFBFBD><E586BD>孵稬"<22>扯<EFBFBD>"<22>厰僼 <20>?<3F>冽<EFBFBD>蝖株恕
<20>?
Python<6F>滚𦛚<E6BB9A>扯<EFBFBD>隞<EFBFBD><E99A9E>
<20>?
餈𥪜<E9A488>蝏𤘪<E89D8F> + <20>唳旿憸<E697BF><E686B8>嚗<EFBFBD><E59A97>50銵䕘<E98AB5>
<EFBFBD><EFBFBD>眏:
- <EFBFBD>?<3F>冽<EFBFBD><E586BD>臬恣<E887AC>乩誨<E4B9A9><E8AAA8><EFBFBD>摰匧<E691B0><E58CA7>舀綉嚗?
- <EFBFBD>?蝚血<E89D9A>"AI颲<49>𨭌"<22>屸<EFBFBD>"AI<41>芸𢆡"<22><><EFBFBD>雿?
- <EFBFBD>?<3F>滢<EFBFBD><E6BBA2>扯<EFBFBD><E689AF>躰秤憌𡡞埯
<EFBFBD>喟<EFBFBD>3: System Prompt霈曇恣 <20>?
<EFBFBD>寞<EFBFBD><EFBFBD>㗇𥋘: 摰峕㟲<E5B395>?0銝東ew-shot蝷箔<E89DB7>
蝷箔<EFBFBD><EFBFBD><EFBFBD><EFBFBD>:
| 蝥批<EFBFBD> | <EFBFBD>圈<EFBFBD> | 蝷箔<EFBFBD>蝻硋噡 | <EFBFBD>箸艶 |
|---|---|---|---|
| Level 1 | 2銝? | 1-2 | 蝻箏仃<EFBFBD>潛<EFBFBD>銝<EFBFBD><EFBFBD><EFBFBD>㺭<EFBFBD>潭<EFBFBD>瘣? |
| Level 2 | 2銝? | 3-4 | 蝻𣇉<EFBFBD><EFBFBD><EFBFBD><EFBFBD>蝞? |
| Level 3 | 3銝? | 5-7 | BMI<EFBFBD><EFBFBD>𠯫<EFBFBD>麄<EFBFBD><EFBFBD><EFBFBD><EFBFBD>? |
| Level 4 | 3銝? | 8-10 | 蝞<EFBFBD><EFBFBD>訫‵銵乓<EFBFBD>?*憭𡁻<E686AD><F0A181BB>坿‘**<2A><>縧<EFBFBD>? |
<EFBFBD>詨<EFBFBD>鈭桃<EFBFBD>:
- <EFBFBD>?<3F><>鉄蝻箏仃<E7AE8F>澆<EFBFBD><E6BE86><EFBFBD><EFBFBD>蝷箔<E89DB7>8嚗?
- <EFBFBD>?<3F><>鉄憭𡁻<E686AD><F0A181BB>坿‘MICE嚗<45>內靘?嚗争<E59A97> <20>滨<EFBFBD>
- <EFBFBD>?閬<><E996AC>隞𤾸抅蝖<E68A85><E89D96>圈<EFBFBD>蝥批<E89DA5>璇臬漲
<EFBFBD><EFBFBD>﹝雿滨蔭: 撌亙<EFBFBD>C_AI_Few-shot蝷箔<E89DB7>摨?md
<EFBFBD>喟<EFBFBD>4: <20>唳旿<E594B3>嗆<EFBFBD><E59786>恣<EFBFBD>?<3F>?
<EFBFBD>寞<EFBFBD><EFBFBD>㗇𥋘: Python<6F><6E><EFBFBD>蝏湔擪嚗<E693AA>䲮獢㇃嚗?
<EFBFBD>嗆<EFBFBD>:
Session<EFBFBD>𥕦遣 <20>?<3F>唳旿<E594B3>㰘蝸<E3B098>訐ython<6F><6E><EFBFBD>
<20>?
AI<41>滢<EFBFBD>1 <20>?靽格㺿<E6A0BC><E3BABF><EFBFBD>銝剔<E98A9D>DataFrame
<20>?
AI<41>滢<EFBFBD>2 <20>?蝏抒賒靽格㺿DataFrame嚗<65>敞蝘荔<E89D98>
<20>?
AI<41>滢<EFBFBD>N <20>?...
<20>?
<0A>冽<EFBFBD><E586BD>孵稬"撖澆枂" <20>?靽嘥<E99DBD><E598A5>記SS
<EFBFBD><EFBFBD><EFBFBD>臬<EFBFBD>箏𦛚:
- <EFBFBD><EFBFBD> Python<6F>滚鍳隡帋腺憭梁𠶖<E6A281>?
- <EFBFBD><EFBFBD> <20>芣䔉隡睃<E99AA1>嚗𡁏<E59A97>銋<EFBFBD><E98A8B><EFBFBD>訌edis<69>𤈛SS
- <EFBFBD><EFBFBD> <20><>﹝雿滨蔭: <EFBFBD><EFBFBD><EFBFBD>臬<EFBFBD>箏𦛚皜<EFBFBD><EFBFBD>
<EFBFBD>喟<EFBFBD>5: AI<41>芣<EFBFBD>靽格迤<E6A0BC>箏<EFBFBD> <20>?
<EFBFBD>寞<EFBFBD><EFBFBD>㗇𥋘: <20><>憭?甈⊿<E79488>霂𤏪<E99C82><F0A48FAA>寞<EFBFBD>B嚗?
瘚<EFBFBD><EFBFBD>:
attempt = 0
while attempt < 3:
# <20><><EFBFBD>隞<EFBFBD><E99A9E>
code = generate_code(user_message + error_feedback)
# <20>扯<EFBFBD>隞<EFBFBD><E99A9E>
result = execute_code(code)
if result.success:
return result # <20>?<3F>𣂼<EFBFBD>
error_feedback = result.error
attempt += 1
# <20>?3甈∩<E79488>憭梯揖嚗諹<E59A97><E8ABB9>𧼮<EFBFBD>憟賡<E6869F>霂?
return "<22>扯<EFBFBD>憭梯揖嚗諹窈靚<E7AA88>㟲<EFBFBD><E39FB2>瘙<EFBFBD><E79899><EFBFBD>滩<EFBFBD>"
<EFBFBD>喟<EFBFBD>6: LLM璅∪<E79285><E288AA>㗇𥋘 <20>?
隡睃<EFBFBD>雿輻鍂: DeepSeek-V3
<EFBFBD>滨蔭:
const llm = LLMFactory.createAdapter('deepseek-v3');
const response = await llm.chat(messages, {
temperature: 0.1, // 雿擧萱摨佗<E691A8>蝖桐<E89D96>隞<EFBFBD><E99A9E><EFBFBD><EFBFBD>&<EFBFBD>?
maxTokens: 2000, // 頞喳<E9A09E><E596B3><EFBFBD><EFBFBD>隞<EFBFBD><E99A9E>+閫<><E996AB>
topP: 0.9
});
**憭<><E686AD>㗇䲮獢?*:
- Qwen3-72B: 銝剜<E98A9D><E5899C><EFBFBD>圾<EFBFBD>游末
- GPT-5-Pro: 隞<><E99A9E>韐券<E99F90><E588B8><EFBFBD>擃矋<E69383><E79F8B>鞉𧋦擃矋<E69383>
<EFBFBD>喟<EFBFBD>7: 銝𠹺<E98A9D><F0A0B9BA><EFBFBD><EFBFBD><EFBFBD>?<3F>?
<EFBFBD>滨蔭: 隡𣳇<E99AA1>埝<EFBFBD>餈?頧桀笆霂?
摰䂿緵:
async getConversationHistory(sessionId: string, limit: number = 5) {
return await prisma.dcToolCAiHistory.findMany({
where: { sessionId },
orderBy: { createdAt: 'desc' },
take: limit * 2, // user + assistant <20>𣂼笆
});
}
// <20><>遣瘨<E981A3><E798A8>銝𠹺<E98A9D><F0A0B9BA>?
const messages = [
{ role: 'system', content: systemPrompt },
...history.reverse(), // <20><>餈?頧?
{ role: 'user', content: userMessage }
];
<EFBFBD>喟<EFBFBD>8: <20>扯<EFBFBD>蝏𤘪<E89D8F>撅閧內 <20>?
<EFBFBD>滨蔭: 餈𥪜<E9A488><F0A5AA9C>?0銵屸<E98AB5>閫?
<EFBFBD>笔<EFBFBD>:
- 50銵諹雲憭<EFBFBD>䰻<EFBFBD>𧢲㺭<EFBFBD>桀<EFBFBD><EFBFBD>?
- 銝滢<EFBFBD>餈<EFBFBD>之敶勗<EFBFBD><EFBFBD>扯<EFBFBD>
- 蝚血<EFBFBD><EFBFBD>餌<EFBFBD><EFBFBD>唳旿<EFBFBD>箸艶嚗<EFBFBD><EFBFBD>𡁜虜<EFBFBD>惩<EFBFBD><EFBFBD>啣<EFBFBD><EFBFBD>曇<EFBFBD>嚗?
<EFBFBD>喟<EFBFBD>9: Few-shot蝷箔<E89DB7>蝖株恕 <20>?
**<2A><>蝏?0銝芰內靘?*:
- 蝏煺<EFBFBD>蝻箏仃<EFBFBD>潭<EFBFBD>霈?
- <EFBFBD>啣<EFBFBD>澆<EFBFBD>皜<EFBFBD><EFBFBD>嚗<EFBFBD><EFBFBD>撉<EFBFBD><EFBFBD>潛泵<EFBFBD>瑕<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
- <EFBFBD><EFBFBD>掩<EFBFBD>㗛<EFBFBD>蝻𣇉<EFBFBD>嚗<EFBFBD><EFBFBD>批<EFBFBD><EFBFBD>?/0嚗?
- 餈䂿賒<EFBFBD>㗛<EFBFBD><EFBFBD><EFBFBD>拳嚗<EFBFBD>僑樴<EFBFBD><EFBFBD>蝏<EFBFBD><EFBFBD>
- BMI霈∠<EFBFBD>銝𤾸<EFBFBD>蝐?
- <EFBFBD>交<EFBFBD>霈∠<EFBFBD>嚗<EFBFBD><EFBFBD><EFBFBD>W予<EFBFBD>堆<EFBFBD>
- <EFBFBD>∩辣蝑偦<EFBFBD>㚁<EFBFBD><EFBFBD>亦<EFBFBD><EFBFBD><EFBFBD><EFBFBD>嚗?
- 蝞<EFBFBD><EFBFBD>閧撩憭勗<EFBFBD>澆‵銵伐<EFBFBD>銝凋<EFBFBD><EFBFBD>堆<EFBFBD>
- 憭𡁻<EFBFBD><EFBFBD>坿‘MICE 潃?<3F>詨<EFBFBD>
- <EFBFBD>箄<EFBFBD><EFBFBD>駁<EFBFBD>嚗<EFBFBD><EFBFBD><EFBFBD>交<EFBFBD>靽萘<EFBFBD><EFBFBD><EFBFBD><EFBFBD>堆<EFBFBD>
<EFBFBD><EFBFBD>儭?<3F><><EFBFBD>舀沲<E88880><E6B2B2>挽霈?
<EFBFBD>港<EFBFBD><EFBFBD>嗆<EFBFBD>
<EFBFBD>𢞖<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>?
<0A>? Frontend (React) <20>?
<0A>? - 撖寡<E69296><E5AFA1>屸𢒰嚗㇍ool C銝梶鍂嚗? <20>?
<0A>? - 隞<><E99A9E>撅閧內嚗<E585A7><E59A97>鈭殷<E988AD> <20>?
<0A>? - <20>扯<EFBFBD><E689AF>厰僼 <20>?
<0A>? - 蝏𤘪<E89D8F>憸<EFBFBD><E686B8>嚗㇁G Grid嚗? <20>?
<0A>婙<EFBFBD><E5A999><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>砂<EFBFBD><E7A082><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>?
<20>?REST API
<0A>𢞖<EFBFBD><F0A29E96><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>潑<EFBFBD><E6BD91><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>?
<0A>? Node.js Backend (Fastify) <20>?
<0A>? <20>𢞖<EFBFBD><F0A29E96><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>? <20>?
<0A>? <20>?AICodeService <20>? <20>?
<0A>? <20>?- generateCode() <20>? <20>?
<0A>? <20>?- executeCode() <20>? <20>?
<0A>? <20>?- generateAndExecute() (撣阡<E692A3>霂? <20>? <20>?
<0A>? <20>?- getHistory() <20>? <20>?
<0A>? <20>婙<EFBFBD><E5A999><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>砂<EFBFBD><E7A082><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>砂<EFBFBD><E7A082><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>? <20>?
<0A>? <20>? <20>? <20>?
<0A>? <20>𢞖<EFBFBD><F0A29E96><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>潑<EFBFBD><E6BD91><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>? <20>𢞖<EFBFBD><F0A29E96><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>潑<EFBFBD><E6BD91><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>? <20>?
<0A>? <20>?LLMFactory <20>? <20>?PythonExecutor<6F>? <20>?
<0A>? <20>?(<28>𡁶鍂撅<E98D82><E69285><EFBFBD>?<3F>? <20>?Service <20>? <20>?
<0A>? <20>婙<EFBFBD><E5A999><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>? <20>婙<EFBFBD><E5A999><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>砂<EFBFBD><E7A082><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>? <20>?
<0A>婙<EFBFBD><E5A999><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>潑<EFBFBD><E6BD91><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>?
<20>?HTTP
<20>𢞖<EFBFBD><F0A29E96><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>潑<EFBFBD><E6BD91><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>?
<20>?Python Service (FastAPI) <20>?
<20>?- /api/dc/validate (AST璉<54><E79289>? <20>?
<20>?- /api/dc/execute (<28>扯<EFBFBD>隞<EFBFBD><E99A9E>) <20>?
<20>?- Session<6F>嗆<EFBFBD><E59786>恣<EFBFBD><E681A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>嚗? <20>?
<20>婙<EFBFBD><E5A999><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>?
<EFBFBD>詨<EFBFBD><EFBFBD>滚𦛚霈曇恣
AICodeService (<28>啣遣嚗斋400銵?
// backend/src/modules/dc/tool-c/services/AICodeService.ts
export class AICodeService {
// ==================== <20>詨<EFBFBD><E8A9A8>寞<EFBFBD> ====================
/**
* <20><><EFBFBD>Pandas隞<73><E99A9E>
* @param sessionId - Tool C Session ID
* @param userMessage - <20>冽<EFBFBD><E586BD>芰<EFBFBD>霂剛<E99C82><E5899B><EFBFBD>瘙?
* @returns { code, explanation, messageId }
*/
async generateCode(
sessionId: string,
userMessage: string
): Promise<GenerateCodeResult> {
// 1. <20>瑕<EFBFBD>Session靽⊥<E99DBD>嚗<EFBFBD>㺭<EFBFBD>桅<EFBFBD><E6A185><EFBFBD>㺭<EFBFBD>殷<EFBFBD>
const session = await sessionService.getSession(sessionId);
// 2. <20><>遣System Prompt嚗<74>鉄10銝東ew-shot嚗?
const systemPrompt = this.buildSystemPrompt(session);
// 3. <20>瑕<EFBFBD>撖寡<E69296><E5AFA1><EFBFBD>蟮嚗<E89FAE><E59A97>餈?頧殷<E9A0A7>
const history = await this.getHistory(sessionId, 5);
// 4. 靚<>鍂LLM嚗<4D><E59A97><EFBFBD>汪LMFactory嚗?
const llm = LLMFactory.createAdapter('deepseek-v3');
const response = await llm.chat([
{ role: 'system', content: systemPrompt },
...history,
{ role: 'user', content: userMessage }
], {
temperature: 0.1,
maxTokens: 2000
});
// 5. 閫<><E996AB>AI<41>𧼮<EFBFBD>嚗<EFBFBD><E59A97><EFBFBD>鈪ode<64>𨫪xplanation嚗?
const parsed = this.parseAIResponse(response.content);
// 6. 靽嘥<E99DBD><E598A5>唳㺭<E594B3>桀<EFBFBD>
const messageId = await this.saveMessages(
sessionId,
userMessage,
parsed.code,
parsed.explanation
);
return {
code: parsed.code,
explanation: parsed.explanation,
messageId
};
}
/**
* <20>扯<EFBFBD>Python隞<6E><E99A9E>
* @param sessionId - Tool C Session ID
* @param code - Python隞<6E><E99A9E>
* @param messageId - <20>唾<EFBFBD><E594BE><EFBFBD><EFBFBD><EFBFBD>涅D
* @returns { success, result, newDataPreview }
*/
async executeCode(
sessionId: string,
code: string,
messageId: string
): Promise<ExecuteCodeResult> {
// 1. 靚<>鍂Python<6F>滚𦛚<E6BB9A>扯<EFBFBD>
const result = await pythonExecutorService.executeCode(code, {
sessionId // Python<6F>滚𦛚蝏湔擪Session<6F>嗆<EFBFBD>?
});
// 2. <20>湔鰵瘨<E9B0B5><E798A8><EFBFBD>嗆<EFBFBD>?
await prisma.dcToolCAiHistory.update({
where: { id: messageId },
data: {
executeStatus: result.success ? 'success' : 'failed',
executeResult: result.data,
executeError: result.error
}
});
// 3. 憒<><E68692><EFBFBD>𣂼<EFBFBD>嚗諹繮<E8ABB9>𡝗鰵<F0A19D97>唳旿憸<E697BF><E686B8>嚗<EFBFBD><E59A97>50銵䕘<E98AB5>
if (result.success) {
const preview = result.data?.slice(0, 50);
return {
success: true,
result: result.data,
newDataPreview: preview
};
}
return {
success: false,
error: result.error
};
}
/**
* <20><><EFBFBD>撟嗆<E6929F>銵䕘<E98AB5>撣西䌊<E8A5BF>睲耨甇<E880A8><E79487>
* @param sessionId - Tool C Session ID
* @param userMessage - <20>冽<EFBFBD><E586BD><EFBFBD>瘙?
* @param maxRetries - <20><>憭折<E686AD>霂閙活<E99699>堆<EFBFBD>暺䁅恕3嚗?
* @returns { code, explanation, executeResult, retryCount }
*/
async generateAndExecute(
sessionId: string,
userMessage: string,
maxRetries: number = 3
): Promise<ProcessResult> {
let attempt = 0;
let lastError: string | null = null;
let generated: GenerateCodeResult | null = null;
while (attempt < maxRetries) {
try {
// <20><>遣撣阡<E692A3>霂臬<E99C82>擐<EFBFBD><E69390><EFBFBD>鞟內霂?
const enhancedMessage = attempt === 0
? userMessage
: `${userMessage}\n\n銝𦠜活<EFBFBD>扯<EFBFBD><EFBFBD>躰秤嚗?{lastError}\n霂瑚耨甇<EFBFBD>誨<EFBFBD><EFBFBD><EFBFBD><EFBFBD>;
// <20><><EFBFBD>隞<EFBFBD><E99A9E>
generated = await this.generateCode(sessionId, enhancedMessage);
// <20>扯<EFBFBD>隞<EFBFBD><E99A9E>
const executeResult = await this.executeCode(
sessionId,
generated.code,
generated.messageId
);
if (executeResult.success) {
// <20>?<3F>𣂼<EFBFBD>
logger.info(`[AICodeService] <EFBFBD>扯<EFBFBD><EFBFBD>𣂼<EFBFBD>嚗<EFBFBD><EFBFBD>霂?{attempt + 1}甈∴<EFBFBD>`);
return {
...generated,
executeResult,
retryCount: attempt
};
}
// <20>?憭梯揖嚗<E68F96><E59A97>憭<EFBFBD><E686AD>霂?
lastError = executeResult.error || '<27>芰䰻<E88AB0>躰秤';
attempt++;
logger.warn(`[AICodeService] <EFBFBD>扯<EFBFBD>憭梯揖嚗<EFBFBD><EFBFBD>霂?{attempt}/${maxRetries}嚗? ${lastError}`);
} catch (error: any) {
logger.error(`[AICodeService] 撘<EFBFBD>虜: ${error.message}`);
lastError = error.message;
attempt++;
}
}
// 3甈∩<E79488>憭梯揖
throw new Error(
`隞<EFBFBD><EFBFBD><EFBFBD>扯<EFBFBD>憭梯揖嚗<EFBFBD>歇<EFBFBD>滩<EFBFBD>${maxRetries}甈∴<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>𡡞<EFBFBD>霂荔<EFBFBD>${lastError}<EFBFBD><EFBFBD> +
`撱箄悅嚗朞窈靚<E7AA88>㟲<EFBFBD><E39FB2>瘙<EFBFBD><E79899>餈唳<E9A488><E594B3>见𢆡靽格㺿隞<E3BABF><E99A9E><EFBFBD><EFBFBD>
);
}
/**
* <20>瑕<EFBFBD>撖寡<E69296><E5AFA1><EFBFBD>蟮
*/
async getHistory(sessionId: string, limit: number = 5): Promise<Message[]> {
const records = await prisma.dcToolCAiHistory.findMany({
where: { sessionId },
orderBy: { createdAt: 'desc' },
take: limit * 2 // user + assistant <20>𣂼笆
});
return records.reverse().map(r => ({
role: r.role,
content: r.content
}));
}
// ==================== 颲<>𨭌<EFBFBD>寞<EFBFBD> ====================
/**
* <20><>遣System Prompt嚗<74>鉄10銝東ew-shot嚗?
*/
private buildSystemPrompt(session: SessionData): string {
return `雿䭾糓<EFBFBD>餌<EFBFBD>蝘𤑳<EFBFBD><EFBFBD>唳旿皜<EFBFBD><EFBFBD>銝枏振嚗諹<EFBFBD>韐<EFBFBD><EFBFBD><EFBFBD>辥andas隞<EFBFBD><EFBFBD><EFBFBD>交<EFBFBD>瘣埈㟲<EFBFBD><EFBFBD>㺭<EFBFBD>柴<EFBFBD>?
## 敶枏<EFBFBD><EFBFBD>唳旿<EFBFBD><EFBFBD>縑<EFBFBD>?
- <EFBFBD><EFBFBD>辣<EFBFBD>? ${session.fileName}
- 銵峕㺭: ${session.totalRows}
- <EFBFBD>埈㺭: ${session.totalCols}
- <EFBFBD>堒<EFBFBD>: ${session.columns.join(', ')}
## 摰匧<EFBFBD>閫<EFBFBD><EFBFBD>嚗<EFBFBD>撩<EFBFBD>塚<EFBFBD>
1. <EFBFBD>芾<EFBFBD><EFBFBD>滢<EFBFBD>df<EFBFBD>㗛<EFBFBD>嚗䔶<EFBFBD><EFBFBD>賭耨<EFBFBD>孵<EFBFBD>隞硋<EFBFBD><EFBFBD>?
2. 蝳<EFBFBD>迫撖澆<EFBFBD>os<EFBFBD><EFBFBD>ys<EFBFBD><EFBFBD>ubprocess蝑匧暒<EFBFBD>拇芋<EFBFBD>?
3. 蝳<EFBFBD>迫雿輻鍂eval<EFBFBD><EFBFBD>xec<EFBFBD><EFBFBD>_import__蝑匧暒<EFBFBD>拙遆<EFBFBD>?
4. 敹<EFBFBD>◆餈𥡝<EFBFBD>撘<EFBFBD>虜憭<EFBFBD><EFBFBD>
5. 餈𥪜<EFBFBD><EFBFBD>澆<EFBFBD>敹<EFBFBD>◆<EFBFBD>浥SON: {"code": "...", "explanation": "..."}
## Few-shot蝷箔<EFBFBD>
### 蝷箔<EFBFBD>1: 蝏煺<EFBFBD>蝻箏仃<EFBFBD>潭<EFBFBD>霈?
<EFBFBD>冽<EFBFBD>: <EFBFBD>𦠜<EFBFBD><EFBFBD>劐誨銵函撩憭梁<EFBFBD>蝚血噡嚗?<EFBFBD><EFBFBD><EFBFBD>霂艾<EFBFBD><EFBFBD>A<EFBFBD><EFBFBD>/A嚗厩<EFBFBD>銝<EFBFBD><EFBFBD>踵揢銝箸<EFBFBD><EFBFBD><EFBFBD>征<EFBFBD>?
隞<EFBFBD><EFBFBD>:
\`\`\`python
df = df.replace(['-', '銝滩祕', 'NA', 'N/A', '\\\\', '<27>芣䰻'], np.nan)
\`\`\`
霂湔<EFBFBD>: 撠<><E692A0>蝘滨撩憭勗<E686AD>潸”蝷箇<E89DB7>銝<EFBFBD>銝摸aN嚗䔶噶鈭𤾸<E988AD>蝏剔<E89D8F>霈∪<E99C88><E288AA>?
### 蝷箔<E89DB7>2: <20>啣<EFBFBD>澆<EFBFBD>皜<EFBFBD><E79A9C>
<EFBFBD>冽<EFBFBD>: <20>𡃏<EFBFBD><F0A1838F>𣂼<EFBFBD><F0A382BC>𣬚<EFBFBD><F0A3AC9A>墧㺭摮㛖泵<E39B96>瑕縧<E79195>㚁<EFBFBD><0.1<EFBFBD>?.05憭<EFBFBD><EFBFBD>嚗諹蓮銝箸㺭<EFBFBD>潛掩<EFBFBD>?
隞<EFBFBD><EFBFBD>:
\`\`\`python
df['creatinine'] = df['creatinine'].astype(str).str.replace('>', '').str.replace('<', '')
df.loc[df['creatinine'] == '0.1', 'creatinine'] = '0.05'
df['creatinine'] = pd.to_numeric(df['creatinine'], errors='coerce')
\`\`\`
霂湔<EFBFBD>: 璉<>撉𣬚<E69289><F0A3AC9A>唳旿撣詨鉄蝚血噡嚗屸<E59A97>皜<EFBFBD><E79A9C><EFBFBD>擧<EFBFBD><E693A7>質恣蝞?
[... 蝷箔<E89DB7>3-8 ...]
### 蝷箔<E89DB7>9: 憭𡁻<E686AD><F0A181BB>坿‘嚗㇈ICE嚗争<E59A97> <20>滨<EFBFBD>
<EFBFBD>冽<EFBFBD>: 雿輻鍂憭𡁻<E686AD><F0A181BB>坿‘瘜訫笆BMI<4D><49>僑樴<E58391><E6A8B4><EFBFBD><EFBFBD><EFBFBD>𣂼<EFBFBD><F0A382BC><EFBFBD>撩憭勗<E686AD>潸<EFBFBD>銵<EFBFBD>‵銵?
隞<EFBFBD><EFBFBD>:
\`\`\`python
from sklearn.experimental import enable_iterative_imputer
from sklearn.impute import IterativeImputer
# <20>㗇𥋘<E39787><F0A58B98>閬<EFBFBD><E996AC>銵亦<E98AB5><E4BAA6>啣<EFBFBD>澆<EFBFBD>
cols = ['BMI', 'age', 'creatinine']
# 憭𡁻<E686AD><F0A181BB>坿‘
imputer = IterativeImputer(max_iter=10, random_state=0)
df[cols] = imputer.fit_transform(df[cols])
\`\`\`
霂湔<EFBFBD>: <20>拍鍂<E68B8D>㗛<EFBFBD><E3979B>渡㮾<E6B8A1>單<EFBFBD>折<EFBFBD>瘚讠撩憭勗<E686AD>潘<EFBFBD>靽脲<E99DBD><E884B2>唳旿<E594B3><E697BF><EFBFBD><EFBFBD>孵<EFBFBD>嚗屸<E59A97><E5B1B8>鍂鈭穽AR嚗<52><E59A97><EFBFBD>箇撩憭梧<E686AD>
### 蝷箔<E89DB7>10: <20>箄<EFBFBD><E7AE84>駁<EFBFBD>
<EFBFBD>冽<EFBFBD>: <20>㗇<EFBFBD><E39787><EFBFBD>D<EFBFBD>駁<EFBFBD>嚗䔶<E59A97><E494B6>蹱<EFBFBD><E8B9B1>交𠯫<E4BAA4><F0A0AFAB><EFBFBD><EFBFBD>啁<EFBFBD>霈啣<E99C88>
隞<EFBFBD><EFBFBD>:
\`\`\`python
df['check_date'] = pd.to_datetime(df['check_date'])
df = df.sort_values('check_date').drop_duplicates(subset=['patient_id'], keep='last')
\`\`\`
霂湔<EFBFBD>: <20><><EFBFBD><EFBFBD>交<EFBFBD><E4BAA4>鍦<EFBFBD>嚗<EFBFBD><E59A97><EFBFBD>駁<EFBFBD>靽萘<E99DBD><E89098><EFBFBD><EFBFBD>𦒘<EFBFBD><F0A69298>∴<EFBFBD><E288B4><EFBFBD><EFBFBD>堆<EFBFBD>
## <20>冽<EFBFBD>敶枏<E695B6>霂瑟<E99C82>
霂瑟覔<EFBFBD>桐誑銝羓內靘见<EFBFBD>敶枏<EFBFBD><EFBFBD>唳旿<EFBFBD><EFBFBD>縑<EFBFBD>荔<EFBFBD><EFBFBD><EFBFBD><EFBFBD>隞<EFBFBD><EFBFBD>撟嗉圾<EFBFBD>𨳍<EFBFBD>?
`;
}
/**
* 閫<><E996AB>AI<41>𧼮<EFBFBD>嚗<EFBFBD><E59A97><EFBFBD>鈪ode<64>𨫪xplanation嚗?
*/
private parseAIResponse(content: string): { code: string; explanation: string } {
try {
// <20>寞<EFBFBD>1嚗𡁜<E59A97>霂閗圾<E99697>軃SON
const json = JSON.parse(content);
if (json.code && json.explanation) {
return { code: json.code, explanation: json.explanation };
}
} catch {
// <20>寞<EFBFBD>2嚗𡁏迤<F0A1818F>蹱<EFBFBD><E8B9B1>碶誨<E7A2B6><E8AAA8><EFBFBD>
const codeMatch = content.match(/```python\n([\s\S]+?)\n```/);
const code = codeMatch ? codeMatch[1] : '';
// <20>𣂼<EFBFBD>閫<EFBFBD><E996AB>嚗<EFBFBD>誨<EFBFBD><E8AAA8><EFBFBD>銋见<E98A8B><E8A781><EFBFBD><EFBFBD><EFBFBD>穿<EFBFBD>
const explanation = content.replace(/```python[\s\S]+?```/g, '').trim();
if (code) {
return { code, explanation };
}
}
throw new Error('AI<41>𧼮<EFBFBD><F0A7BCAE>澆<EFBFBD><E6BE86>躰秤嚗峕<E59A97>瘜閙<E7989C><E99699>碶誨<E7A2B6>?);
}
/**
* 靽嘥<E99DBD>瘨<EFBFBD><E798A8><EFBFBD>唳㺭<E594B3>桀<EFBFBD>
*/
private async saveMessages(
sessionId: string,
userMessage: string,
code: string,
explanation: string
): Promise<string> {
// 靽嘥<E99DBD><E598A5>冽<EFBFBD>瘨<EFBFBD><E798A8>
await prisma.dcToolCAiHistory.create({
data: {
sessionId,
userId: 'test-user', // TODO: 隞𥣡WT<57>瑕<EFBFBD>
role: 'user',
content: userMessage
}
});
// 靽嘥<E99DBD>AI<41>𧼮<EFBFBD>
const assistantMessage = await prisma.dcToolCAiHistory.create({
data: {
sessionId,
userId: 'test-user',
role: 'assistant',
content: explanation,
generatedCode: code,
codeExplanation: explanation,
executeStatus: 'pending',
model: 'deepseek-v3'
}
});
return assistantMessage.id;
}
}
// 撖澆枂<E6BE86>蓥<EFBFBD>
export const aiCodeService = new AICodeService();
AIController (<28>啣遣嚗斋200銵?
// backend/src/modules/dc/tool-c/controllers/AIController.ts
export class AIController {
/**
* POST /api/v1/dc/tool-c/ai/generate
* <20><><EFBFBD>隞<EFBFBD><E99A9E>嚗<EFBFBD><E59A97><EFBFBD>扯<EFBFBD>嚗?
*/
async generateCode(request: FastifyRequest, reply: FastifyReply) {
try {
const { sessionId, message } = request.body as any;
// <20><>㺭撉諹<E69289>
if (!sessionId || !message) {
return reply.code(400).send({
success: false,
error: '蝻箏<E89DBB>敹<EFBFBD><E695B9><EFBFBD><EFBFBD>㺭嚗窃essionId<49><64>essage'
});
}
// <20><><EFBFBD>隞<EFBFBD><E99A9E>
const result = await aiCodeService.generateCode(sessionId, message);
return reply.code(200).send({
success: true,
data: result
});
} catch (error: any) {
logger.error(`[AIController] generateCode憭梯揖: ${error.message}`);
return reply.code(500).send({
success: false,
error: error.message
});
}
}
/**
* POST /api/v1/dc/tool-c/ai/execute
* <20>扯<EFBFBD>隞<EFBFBD><E99A9E>
*/
async executeCode(request: FastifyRequest, reply: FastifyReply) {
try {
const { sessionId, code, messageId } = request.body as any;
const result = await aiCodeService.executeCode(sessionId, code, messageId);
return reply.code(200).send({
success: true,
data: result
});
} catch (error: any) {
logger.error(`[AIController] executeCode憭梯揖: ${error.message}`);
return reply.code(500).send({
success: false,
error: error.message
});
}
}
/**
* POST /api/v1/dc/tool-c/ai/process
* <20><><EFBFBD>撟嗆<E6929F>銵䕘<E98AB5>銝<EFBFBD>甇亙<E79487>雿㵪<E99BBF>撣阡<E692A3>霂𤏪<E99C82>
*/
async process(request: FastifyRequest, reply: FastifyReply) {
try {
const { sessionId, message, maxRetries = 3 } = request.body as any;
const result = await aiCodeService.generateAndExecute(
sessionId,
message,
maxRetries
);
return reply.code(200).send({
success: true,
data: result
});
} catch (error: any) {
logger.error(`[AIController] process憭梯揖: ${error.message}`);
return reply.code(500).send({
success: false,
error: error.message
});
}
}
/**
* GET /api/v1/dc/tool-c/ai/history/:sessionId
* <20>瑕<EFBFBD>撖寡<E69296><E5AFA1><EFBFBD>蟮
*/
async getHistory(
request: FastifyRequest<{ Params: { sessionId: string } }>,
reply: FastifyReply
) {
try {
const { sessionId } = request.params;
const history = await aiCodeService.getHistory(sessionId, 10);
return reply.code(200).send({
success: true,
data: { history }
});
} catch (error: any) {
logger.error(`[AIController] getHistory憭梯揖: ${error.message}`);
return reply.code(500).send({
success: false,
error: error.message
});
}
}
}
export const aiController = new AIController();
<EFBFBD><EFBFBD> 撘<><E69298>𤏸恣<F0A48FB8>?
<EFBFBD>嗆挾1: <20>唳旿摨栞挽霈∴<E99C88>30<33><30><EFBFBD>嚗争蝱 09:00-09:30
隞餃𦛚皜<EFBFBD><EFBFBD>:
- <EFBFBD>湔鰵
backend/prisma/schema.prisma嚗<EFBFBD>溶<EFBFBD>痃cToolCAiHistory璅∪<EFBFBD>嚗? - <EFBFBD>𥕦遣<EFBFBD>唳旿摨栞<EFBFBD>蝘餉<EFBFBD><EFBFBD>?
create-tool-c-ai-history-table.mjs - <EFBFBD>扯<EFBFBD>餈<EFBFBD>宏嚗<EFBFBD><EFBFBD>撱箄”嚗?
- 撉諹<EFBFBD>銵函<EFBFBD><EFBFBD>?
- <EFBFBD><EFBFBD><EFBFBD>Prisma Client (
npx prisma generate)
**鈭支<E988AD><E694AF>?*:
- <EFBFBD>?
dc_schema.dc_tool_c_ai_history銵典<E98AB5>撱箸<E692B1><E7AEB8>? - <EFBFBD>?Prisma Client<6E>湔鰵摰峕<E691B0>
<EFBFBD>嗆挾2: AICodeService摰䂿緵嚗?撠𤩺𧒄嚗争蝱 09:30-11:30
隞餃𦛚皜<EFBFBD><EFBFBD>:
- <EFBFBD>𥕦遣
AICodeService.ts<20>箇<EFBFBD>蝏𤘪<E89D8F> - 摰䂿緵
buildSystemPrompt()- 10銝東ew-shot蝷箔<E89DB7><E7AE94><EFBFBD><EFBFBD> - 摰䂿緵
generateCode()- AI<41><49><EFBFBD>隞<EFBFBD><E99A9E> - 摰䂿緵
parseAIResponse()- 閫<><E996AB>AI<41>𧼮<EFBFBD> - 摰䂿緵
executeCode()- <20>扯<EFBFBD>Python隞<6E><E99A9E> - 摰䂿緵
generateAndExecute()- <20><><EFBFBD>+<2B>扯<EFBFBD>+<2B>滩<EFBFBD> - 摰䂿緵
getHistory()- <20>瑕<EFBFBD>撖寡<E69296><E5AFA1><EFBFBD>蟮 - 摰䂿緵
saveMessages()- 靽嘥<E99DBD>瘨<EFBFBD><E798A8><EFBFBD>唳㺭<E594B3>桀<EFBFBD> - 瘛餃<EFBFBD>摰峕㟲<EFBFBD>躰秤憭<EFBFBD><EFBFBD><EFBFBD>峕𠯫敹?
**鈭支<E988AD><E694AF>?*:
- <EFBFBD>?
AICodeService.ts摰峕㟲摰䂿緵嚗ǚ400銵䕘<E98AB5> - <EFBFBD>?<3F>訫<EFBFBD>瘚贝<E7989A><E8B49D>朞<EFBFBD>
<EFBFBD>嗆挾3: AIController摰䂿緵嚗?撠𤩺𧒄嚗争蝱 11:30-12:30
隞餃𦛚皜<EFBFBD><EFBFBD>:
- <EFBFBD>𥕦遣
AIController.ts - 摰䂿緵
POST /ai/generate- <20><><EFBFBD>隞<EFBFBD><E99A9E> - 摰䂿緵
POST /ai/execute- <20>扯<EFBFBD>隞<EFBFBD><E99A9E> - 摰䂿緵
POST /ai/process- 銝<>甇亙<E79487>雿? - 摰䂿緵
GET /ai/history/:sessionId- 撖寡<E69296><E5AFA1><EFBFBD>蟮 - 瘛餃<EFBFBD><EFBFBD><EFBFBD>㺭撉諹<EFBFBD>
- 瘛餃<EFBFBD><EFBFBD>躰秤憭<EFBFBD><EFBFBD>
**鈭支<E988AD><E694AF>?*:
- <EFBFBD>?
AIController.ts摰峕㟲摰䂿緵嚗ǚ200銵䕘<E98AB5> - <EFBFBD>?4銝服PI蝡舐<E89DA1>撠梁貌
<EFBFBD><EFBFBD><EFBFBD> <20>?12:30-13:30
<EFBFBD>嗆挾4: 頝舐眏<E88890>滨蔭嚗?5<><35><EFBFBD>嚗争蝱 13:30-13:45
隞餃𦛚皜<EFBFBD><EFBFBD>:
- <EFBFBD>湔鰵
routes/index.ts - 瘜典<EFBFBD>AI<EFBFBD>詨<EFBFBD>頝舐眏
- 瘚贝<EFBFBD>頝舐眏<EFBFBD>航挪<EFBFBD>格<EFBFBD>?
**鈭支<E988AD><E694AF>?*:
- <EFBFBD>?AI頝舐眏瘜典<E7989C>摰峕<E691B0>
- <EFBFBD>?Swagger<65><72>﹝<EFBFBD>湔鰵嚗<E9B0B5><E59A97><EFBFBD>㚁<EFBFBD>
<EFBFBD>嗆挾5: 瘚贝<E7989A>撉峕𤣰嚗?.5撠𤩺𧒄嚗争蝱 13:45-15:15
5.1 <20>箇<EFBFBD>瘚贝<E7989A>嚗?0<><30><EFBFBD>嚗?
瘚贝<EFBFBD><EFBFBD>其<EFBFBD>:
- 瘚贝<EFBFBD>1: 蝏煺<E89D8F>蝻箏仃<E7AE8F>潭<EFBFBD>霈?
- 瘚贝<EFBFBD>2: <20>啣<EFBFBD>澆<EFBFBD>皜<EFBFBD><E79A9C>
- 瘚贝<EFBFBD>3: <20>批<EFBFBD>蝻𣇉<E89DBB>
- 瘚贝<EFBFBD>4: 撟湧<E6929F><E6B9A7><EFBFBD><EFBFBD>
撉峕𤣰<EFBFBD><EFBFBD><EFBFBD>:
- AI<EFBFBD>賣迤蝖桃<EFBFBD><EFBFBD>𣂷誨<EFBFBD>?
- 隞<EFBFBD><EFBFBD><EFBFBD>舀<EFBFBD>銵?
- 蝏𤘪<EFBFBD>蝚血<EFBFBD>憸<EFBFBD><EFBFBD>
5.2 銝剔漣瘚贝<E7989A>嚗?0<><30><EFBFBD>嚗?
瘚贝<EFBFBD><EFBFBD>其<EFBFBD>: 5. [ ] 瘚贝<E7989A>5: BMI霈∠<E99C88> 6. [ ] 瘚贝<E7989A>6: 雿誯堺憭拇㺭霈∠<E99C88> 7. [ ] 瘚贝<E7989A>7: <20>∩辣蝑偦<E89D91>?
5.3 擃条漣瘚贝<E7989A>嚗?0<><30><EFBFBD>嚗?
瘚贝<EFBFBD><EFBFBD>其<EFBFBD>: 8. [ ] 瘚贝<E7989A>8: 銝凋<E98A9D><E5878B>啣‵銵? 9. [ ] 瘚贝<E7989A>9: 憭𡁻<E686AD><F0A181BB>坿‘MICE 潃? 10. [ ] 瘚贝<E7989A>10: <20>箄<EFBFBD><E7AE84>駁<EFBFBD>
5.4 <20>寞<EFBFBD>瘚贝<E7989A>嚗?0<><30><EFBFBD>嚗?
瘚贝<EFBFBD><EFBFBD>其<EFBFBD>: 11. [ ] <20>芣<EFBFBD>靽格迤瘚贝<E7989A>嚗<EFBFBD><E59A97><EFBFBD>誯<EFBFBD>霂荔<E99C82>撉諹<E69289><E8ABB9>滩<EFBFBD><E6BBA9>箏<EFBFBD>嚗? 12. [ ] 颲寧<E9A2B2>瘚贝<E7989A>嚗<EFBFBD><E59A97>銝滚<E98A9D><E6BB9A>具<EFBFBD><E585B7><EFBFBD><EFBFBD>函撩憭梁<E686AD>嚗? 13. [ ] 撟嗅<E6929F>瘚贝<E7989A>嚗<EFBFBD><E59A97><EFBFBD>冽<EFBFBD><E586BD>峕𧒄雿輻鍂嚗? 14. [ ] 蝡臬<E89DA1>蝡舀<E89DA1>霂𤏪<E99C82>銝𠹺<E98A9D><F0A0B9BA>𡒶I憭<49><E686AD><EFBFBD>垍<EFBFBD><E59E8D>𣈯<EFBFBD>霂<EFBFBD><E99C82>
**鈭支<E988AD><E694AF>?*:
- <EFBFBD>?瘚贝<E7989A><E8B49D>𡁏𧋦
test-tool-c-day3.mjs - <EFBFBD>?瘚贝<E7989A><E8B49D>亙<EFBFBD>嚗<EFBFBD><E59A97>朞<EFBFBD><E69C9E><EFBFBD>竉90%嚗?
<EFBFBD>嗆挾6: <20><>﹝銝𦒘<E98A9D><F0A69298>吔<EFBFBD>30<33><30><EFBFBD>嚗争蝱 15:15-15:45
隞餃𦛚皜<EFBFBD><EFBFBD>:
- <EFBFBD>𥕦遣<EFBFBD><EFBFBD><EFBFBD>臬<EFBFBD>箏𦛚皜<EFBFBD><EFBFBD>
Tool-C<><43><EFBFBD>臬<EFBFBD>箏𦛚皜<F0A69B9A><E79A9C>.md - <EFBFBD>湔鰵璅∪<EFBFBD><EFBFBD>嗆<EFBFBD><EFBFBD><EFBFBD>獢?
00-撌亙<E6928C>C敶枏<E695B6><E69E8F>嗆<EFBFBD><E59786><EFBFBD>撘<EFBFBD><E69298>烐<EFBFBD><E78390>?md - <EFBFBD>𥕦遣Day 3撘<33><E69298>穃<EFBFBD><E7A983>鞉<EFBFBD>餌<EFBFBD>
- <EFBFBD>𣂷漱Git撟嗆綫<EFBFBD>?
**鈭支<E988AD><E694AF>?*:
- <EFBFBD>?<3F><><EFBFBD>臬<EFBFBD>箏𦛚<E7AE8F><F0A69B9A>﹝
- <EFBFBD>?Day 3撘<33><E69298>𤏸扇敶?
- <EFBFBD>?Git<69>𣂷漱<F0A382B7>𣂼<EFBFBD>
<EFBFBD>㴓 撉峕𤣰<E5B395><F0A4A3B0><EFBFBD>
<EFBFBD>蠘<EFBFBD>撉峕𤣰
| <EFBFBD>蠘<EFBFBD> | 撉峕𤣰<EFBFBD><EFBFBD><EFBFBD> | <EFBFBD>嗆<EFBFBD>? |
|---|---|---|
| AI隞<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> | 10銝芰內靘见㦤<EFBFBD>?00%<25>舐<EFBFBD><E88890>鞉迤蝖桐誨<E6A190>? | <EFBFBD>賂<EFBFBD> |
| 隞<EFBFBD><EFBFBD><EFBFBD>扯<EFBFBD> | <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>誨<EFBFBD><EFBFBD>虾<EFBFBD>𣂼<EFBFBD><EFBFBD>扯<EFBFBD> | <EFBFBD>賂<EFBFBD> |
| <EFBFBD>芣<EFBFBD>靽格迤 | 憭梯揖<EFBFBD>舘<EFBFBD><EFBFBD>芸𢆡<EFBFBD>滩<EFBFBD>嚗<EFBFBD><EFBFBD>憭?甈∴<E79488> | <EFBFBD>賂<EFBFBD> |
| 撖寡<EFBFBD><EFBFBD><EFBFBD>蟮 | <EFBFBD>質繮<EFBFBD>𡝗<EFBFBD>餈?頧桀笆霂? | <EFBFBD>賂<EFBFBD> |
| <EFBFBD>唳旿憸<EFBFBD><EFBFBD> | <EFBFBD>扯<EFBFBD><EFBFBD>舘<EFBFBD><EFBFBD>𧼮<EFBFBD>50銵屸<EFBFBD>閫? | <EFBFBD>賂<EFBFBD> |
<EFBFBD><EFBFBD><EFBFBD>舫<EFBFBD><EFBFBD>?
| <EFBFBD><EFBFBD><EFBFBD> | <EFBFBD>格<EFBFBD> | <EFBFBD>嗆<EFBFBD>? |
|---|---|---|
| 隞<EFBFBD><EFBFBD>韐券<EFBFBD> | <EFBFBD><EFBFBD>ypeScript<EFBFBD>躰秤 | <EFBFBD>賂<EFBFBD> |
| 鈭穃<EFBFBD><EFBFBD>蠘<EFBFBD><EFBFBD>? | 100%蝚血<E89D9A> | <EFBFBD>賂<EFBFBD> |
| <EFBFBD>躰秤憭<EFBFBD><EFBFBD> | <EFBFBD><EFBFBD><EFBFBD>匧<EFBFBD>撣賊<EFBFBD><EFBFBD>匧<EFBFBD><EFBFBD>? | <EFBFBD>賂<EFBFBD> |
| <EFBFBD>亙<EFBFBD>摰峕㟲<EFBFBD>? | <EFBFBD>喲睸<EFBFBD>滢<EFBFBD><EFBFBD>賣<EFBFBD><EFBFBD>亙<EFBFBD> | <EFBFBD>賂<EFBFBD> |
| 瘚贝<EFBFBD>閬<EFBFBD><EFBFBD><EFBFBD>? | <EFBFBD>?0% | <EFBFBD>賂<EFBFBD> |
<EFBFBD>扯<EFBFBD>撉峕𤣰
| <EFBFBD><EFBFBD><EFBFBD> | <EFBFBD>格<EFBFBD> | <EFBFBD>嗆<EFBFBD>? |
|---|---|---|
| AI<EFBFBD><EFBFBD><EFBFBD><EFBFBD>園𡢿 | <5蝘? | <EFBFBD>賂<EFBFBD> |
| 隞<EFBFBD><EFBFBD><EFBFBD>扯<EFBFBD><EFBFBD>園𡢿 | <3蝘𡜐<E89D98>蝞<EFBFBD><E89D9E>閙<EFBFBD>雿頣<E99BBF> | <EFBFBD>賂<EFBFBD> |
| 蝡臬<EFBFBD>蝡舀𧒄<EFBFBD>? | <10蝘? | <EFBFBD>賂<EFBFBD> |
<EFBFBD>𣑐 鈭支<E988AD>皜<EFBFBD><E79A9C>
隞<EFBFBD><EFBFBD><EFBFBD><EFBFBD>辣嚗?銝迎<E98A9D>
- <EFBFBD>?
backend/prisma/schema.prisma- <20>啣<EFBFBD>DcToolCAiHistory璅∪<E79285> - <EFBFBD>?
backend/scripts/create-tool-c-ai-history-table.mjs- 撱箄”<E7AE84>𡁏𧋦 - <EFBFBD>?
backend/src/modules/dc/tool-c/services/AICodeService.ts- 400銵? - <EFBFBD>?
backend/src/modules/dc/tool-c/controllers/AIController.ts- 200銵? - <EFBFBD>?
backend/src/modules/dc/tool-c/routes/index.ts- <20>湔鰵 - <EFBFBD>?
backend/test-tool-c-day3.mjs- 瘚贝<E7989A><E8B49D>𡁏𧋦
<EFBFBD><EFBFBD>﹝<EFBFBD><EFBFBD>辣嚗?銝迎<E98A9D>
- <EFBFBD>?
撌亙<EFBFBD>C_AI_Few-shot蝷箔<E89DB7>摨?md- 10銝芰內靘贝祕閫? - <EFBFBD>?
撌亙<EFBFBD>C_Day3撘<EFBFBD><EFBFBD>𤏸恣<EFBFBD>?md- <20>祆<EFBFBD>獢? - <EFBFBD>?
Tool-C<><43><EFBFBD>臬<EFBFBD>箏𦛚皜<F0A69B9A><E79A9C>.md- 敺<><E695BA><EFBFBD>㚚★ - <EFBFBD>?
2025-12-06_撌亙<E6928C>C_Day3撘<33><E69298>穃<EFBFBD><E7A983>鞉<EFBFBD>餌<EFBFBD>.md- <20>餌<EFBFBD><E9A48C>亙<EFBFBD>
<EFBFBD><EFBFBD> <20>詨<EFBFBD><E8A9A8><EFBFBD>﹝
- 撌亙<EFBFBD>C_AI_Few-shot蝷箔<E89DB7>摨?md
- 撌亙<EFBFBD>C_MVP撘<EFBFBD><EFBFBD>𤏸恣<EFBFBD>𦚱V1.0.md
- <EFBFBD>𡁶鍂撖寡<EFBFBD><EFBFBD>滚𦛚<EFBFBD>賢<EFBFBD>霈∪<EFBFBD>.md
- 鈭穃<EFBFBD><EFBFBD>笔<EFBFBD><EFBFBD>𤏸<EFBFBD><EFBFBD>?md
<EFBFBD><EFBFBD> 憌𡡞埯蝞∠<E89D9E>
憌𡡞埯1: AI<41><49><EFBFBD>隞<EFBFBD><E99A9E>韐券<E99F90>銝滨迅摰?
摨𥪜笆<EFBFBD>芣鴌:
- <EFBFBD>?雿輻鍂10銝東ew-shot蝷箔<E89DB7><E7AE94>𣂼<EFBFBD>韐券<E99F90>
- <EFBFBD>?<3F>滢<EFBFBD>temperature<72>?.1
- <EFBFBD>?摰墧鴌3甈⊿<E79488>霂閙㦤<E99699>?
- <EFBFBD>?瘛餃<E7989B>AST<53>蹱<EFBFBD><E8B9B1><EFBFBD><EFBFBD>伐<EFBFBD>Python<6F>滚𦛚嚗?
憌𡡞埯2: LLM靚<4D>鍂頞<E98D82>𧒄
摨𥪜笆<EFBFBD>芣鴌:
- <EFBFBD>?霈曄蔭<E69B84><E894AD><EFBFBD><EFBFBD><EFBFBD>imeout嚗?0蝘𡜐<E89D98>
- <EFBFBD>?<3F>滨垢<E6BBA8>曄內<E69B84>㰘蝸<E3B098>嗆<EFBFBD>?
- <EFBFBD>?瘛餃<E7989B><E9A483>滩<EFBFBD><E6BBA9>箏<EFBFBD>
憌𡡞埯3: Python<6F>扯<EFBFBD>憭梯揖
摨𥪜笆<EFBFBD>芣鴌:
- <EFBFBD>?AI<41>芣<EFBFBD>靽格迤嚗<E8BFA4><E59A97>憭?甈∴<E79488>
- <EFBFBD>?<3F>见末<E8A781>躰秤<E8BAB0>鞟內
- <EFBFBD>?撱箄悅<E7AE84>冽<EFBFBD>靚<EFBFBD>㟲<EFBFBD><E39FB2>瘙?
<EFBFBD><EFBFBD> 憸<><E686B8><EFBFBD>鞉<EFBFBD>
**Day 3摰峕<E691B0><E5B395>?*:
- <EFBFBD>?Tool C<>冽<EFBFBD><E586BD>舫<EFBFBD>朞<EFBFBD><E69C9E>芰<EFBFBD>霂剛<E99C82>皜<EFBFBD><E79A9C><EFBFBD>唳旿
- <EFBFBD>?AI<41>賜<EFBFBD><E8B39C>?0%<25>箸艶<E7AEB8><E889B6>迤蝖桐誨<E6A190>?
- <EFBFBD>?憭梯揖<E6A2AF>箸艶<E7AEB8>㕑䌊<E39591>券<EFBFBD>霂閙㦤<E99699>?
- <EFBFBD>?摰峕㟲<E5B395><E39FB2>笆霂嘥<E99C82><E598A5>脩恣<E884A9>?
<EFBFBD>港<EFBFBD>餈𥕦漲:
- Day 1: Python敺格<E695BA><E6A0BC>?<3F>?
- Day 2: Session蝞∠<E89D9E> <20>?
- Day 3: AI隞<49><E99A9E><EFBFBD><EFBFBD><EFBFBD> <20>賂<EFBFBD>
- Day 4-5: <20>滨垢撘<E59EA2><E69298>?
- Day 6: 蝡臬<E89DA1>蝡舀<E89DA1>霂?
<EFBFBD><EFBFBD> <20>湔鰵霈啣<E99C88>
| <EFBFBD>交<EFBFBD> | <EFBFBD><EFBFBD>𧋦 | <EFBFBD>湔鰵<EFBFBD><EFBFBD>捆 | <EFBFBD>湔鰵鈭? |
|---|---|---|---|
| 2025-12-06 | V1.0 | <EFBFBD>嘥<EFBFBD><EFBFBD>𥕦遣嚗峕<EFBFBD>蝖?憭批<E686AD>蝑硋<E89D91>撘<EFBFBD><E69298>𤏸恣<F0A48FB8>? | AI Assistant |
**<2A><>﹝<EFBFBD>嗆<EFBFBD>?: <20>?撌脩&霈? **銝衤<E98A9D>甇?: 撘<>憪𧢲<E686AA>銵<EFBFBD><E98AB5><EFBFBD>𤏸恣<F0A48FB8>𡜐<EFBFBD>憸<EFBFBD>恣5.5-6撠𤩺𧒄嚗?
<EFBFBD><EFBFBD><EFBFBD>撘<EFBFBD>憪见<EFBFBD><EFBFBD>𡢅<EFBFBD> <20><>