Files
AIclinicalresearch/docs/03-业务模块/DC-数据清洗整理/04-开发计划/工具C_Day3开发计划.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

26 KiB
Raw Blame History

撌亙<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>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銝芰內靘?*:

  1. 蝏煺<EFBFBD>蝻箏仃<EFBFBD><EFBFBD>霈?
  2. <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>潛泵<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
  3. <EFBFBD><EFBFBD><EFBFBD><EFBFBD>蝻𣇉<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>?/0嚗?
  4. 餈䂿賒<EFBFBD><EFBFBD><EFBFBD><EFBFBD>拳嚗<EFBFBD>僑樴<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
  5. BMI霈∠<EFBFBD>銝𤾸<EFBFBD>蝐?
  6. <EFBFBD><EFBFBD>霈∠<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
  7. <EFBFBD>∩辣蝑偦<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>嚗?
  8. <EFBFBD><EFBFBD>閧撩憭勗<EFBFBD>銵伐<EFBFBD>銝凋<EFBFBD><EFBFBD><EFBFBD>
  9. 憭𡁻<EFBFBD><EFBFBD>MICE 潃?<3F><EFBFBD>
  10. <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>:

  1. 瘚贝<EFBFBD>1: 蝏煺<E89D8F>蝻箏仃<E7AE8F><EFBFBD>霈?
  2. 瘚贝<EFBFBD>2: <20><EFBFBD><EFBFBD><EFBFBD><E79A9C>
  3. 瘚贝<EFBFBD>3: <20><EFBFBD>蝻𣇉<E89DBB>
  4. 瘚贝<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>

  1. <EFBFBD>?backend/prisma/schema.prisma - <20><EFBFBD>DcToolCAiHistory璅<E79285>
  2. <EFBFBD>?backend/scripts/create-tool-c-ai-history-table.mjs - 撱箄”<E7AE84>𡁏𧋦
  3. <EFBFBD>?backend/src/modules/dc/tool-c/services/AICodeService.ts - 400銵?
  4. <EFBFBD>?backend/src/modules/dc/tool-c/controllers/AIController.ts - 200銵?
  5. <EFBFBD>?backend/src/modules/dc/tool-c/routes/index.ts - <20>湔鰵
  6. <EFBFBD>?backend/test-tool-c-day3.mjs - 瘚贝<E7989A><E8B49D>𡁏𧋦

<EFBFBD><EFBFBD><EFBFBD><EFBFBD>辣嚗?銝迎<E98A9D>

  1. <EFBFBD>?撌亙<EFBFBD>C_AI_Few-shot蝷箔<E89DB7>摨?md - 10銝芰內靘贝祕閫?
  2. <EFBFBD>?撌亙<EFBFBD>C_Day3撘<EFBFBD><EFBFBD>𤏸恣<EFBFBD>?md - <20><EFBFBD>獢?
  3. <EFBFBD>?Tool-C<><43><EFBFBD><EFBFBD>箏𦛚皜<F0A69B9A><E79A9C>.md - 敺<><E695BA><EFBFBD>㚚★
  4. <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><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><>