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%)
14 KiB
<EFBFBD>𡒊垢<EFBFBD>嗆<EFBFBD>憓鮋<EFBFBD>瞍磰<EFBFBD><EFBFBD>寞<EFBFBD>
*<EFBFBD><EFBFBD>𧋦嚗? V1.0
*<EFBFBD>𥕦遣<EFBFBD>交<EFBFBD>嚗? 2025-11-14
*蝑𣇉裦嚗? <20>唳唂撟嗅<E6929F>嚗<EFBFBD><E59A97><EFBFBD>𤩺<EFBFBD>餈? *<EFBFBD>笔<EFBFBD>嚗? <20>園<EFBFBD><E59C92>拇㺿<E68B87>𩤃<EFBFBD><F0A9A483>唳芋<E594B3>埈鰵<E59F88>嗆<EFBFBD>
<EFBFBD>㴓 <20>詨<EFBFBD>蝑𣇉裦
"蝏墧<E89D8F><E5A2A7><EFBFBD>芋撘?嚗𠄎trangler Fig Pattern嚗?
*銝齿㺿<EFBFBD>䭾唂隞<EFBFBD><EFBFBD>嚗峕鰵<EFBFBD>蠘<EFBFBD><EFBFBD>唳沲<EFBFBD>?
<EFBFBD>𢞖<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><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>? AI銝游<E98A9D><E6B8B8>𠉛弦撟喳蝱 - Backend <20>?
<0A>鎿<EFBFBD><E98EBF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><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>? <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>? <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>? <20>?
<0A>? <20>? <20>唳<EFBFBD>璅∪<E79285> <20>? <20>? <20>唳芋<E594B3>? <20>? <20>?
<0A>? <20>? (<28>扳沲<E689B3>? <20>? <20>? (<28>唳沲<E594B3>? <20>? <20>?
<0A>? <20>鎿<EFBFBD><E98EBF><EFBFBD><EFBFBD><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><E98EBF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><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>?<3F>?AIA <20>? <20>?<3F>?ASL (<28>? <20>? <20>?
<0A>? <20>?<3F>?PKB <20>? <20>?<3F>?<3F>芣䔉璅∪<E79285>... <20>? <20>?
<0A>? <20>?<3F>?RVW <20>? <20>? <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><EFBFBD><EFBFBD>? <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>? <20>?
<0A>? <20>? <20>? <20>?
<0A>? 撟喲唍蝏𤘪<E89D8F> platform/common/modules <20>?
<0A>? 靽脲<E99DBD>銝滚<E98A9D> <20><><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><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><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><E59581>桀<EFBFBD>蝏𤘪<E89D8F>嚗<EFBFBD>僎摮条<E691AE>嚗?
backend/
<0A>鎿<EFBFBD><E98EBF><EFBFBD> src/
<0A>? <20>鎿<EFBFBD><E98EBF><EFBFBD> index.ts # 銝餃<E98A9D><E9A483><EFBFBD><EFBFBD>瘜典<E7989C><E585B8><EFBFBD><EFBFBD>㗇芋<E39787>梹<EFBFBD>
<0A>? <20>?
<0A>? <20>鎿<EFBFBD><E98EBF><EFBFBD> config/ # <20>𣂼<EFBFBD><F0A382BC>具<EFBFBD>煾<EFBFBD>蝵桀<E89DB5>
<0A>? <20>? <20>鎿<EFBFBD><E98EBF><EFBFBD> env.ts
<0A>? <20>? <20>婙<EFBFBD><E5A999><EFBFBD> database.ts
<0A>? <20>?
<0A>? <20>鎿<EFBFBD><E98EBF><EFBFBD> legacy/ # <20>璛 <20>唳<EFBFBD>隞<EFBFBD><E99A9E>嚗<EFBFBD>唂<EFBFBD>嗆<EFBFBD>嚗?
<0A>? <20>? <20>鎿<EFBFBD><E98EBF><EFBFBD> routes/
<0A>? <20>? <20>? <20>鎿<EFBFBD><E98EBF><EFBFBD> agents.ts # AIA 頝舐眏
<0A>? <20>? <20>? <20>鎿<EFBFBD><E98EBF><EFBFBD> conversations.ts
<0A>? <20>? <20>? <20>鎿<EFBFBD><E98EBF><EFBFBD> chatRoutes.ts
<0A>? <20>? <20>? <20>鎿<EFBFBD><E98EBF><EFBFBD> projects.ts
<0A>? <20>? <20>? <20>鎿<EFBFBD><E98EBF><EFBFBD> knowledgeBases.ts # PKB 頝舐眏
<0A>? <20>? <20>? <20>鎿<EFBFBD><E98EBF><EFBFBD> batchRoutes.ts
<0A>? <20>? <20>? <20>婙<EFBFBD><E5A999><EFBFBD> reviewRoutes.ts # RVW 頝舐眏
<0A>? <20>? <20>?
<0A>? <20>? <20>鎿<EFBFBD><E98EBF><EFBFBD> controllers/
<0A>? <20>? <20>? <20>鎿<EFBFBD><E98EBF><EFBFBD> agentController.ts
<0A>? <20>? <20>? <20>鎿<EFBFBD><E98EBF><EFBFBD> conversationController.ts
<0A>? <20>? <20>? <20>鎿<EFBFBD><E98EBF><EFBFBD> chatController.ts
<0A>? <20>? <20>? <20>鎿<EFBFBD><E98EBF><EFBFBD> knowledgeBaseController.ts
<0A>? <20>? <20>? <20>婙<EFBFBD><E5A999><EFBFBD> reviewController.ts
<0A>? <20>? <20>?
<0A>? <20>? <20>鎿<EFBFBD><E98EBF><EFBFBD> services/
<0A>? <20>? <20>? <20>鎿<EFBFBD><E98EBF><EFBFBD> agentService.ts
<0A>? <20>? <20>? <20>鎿<EFBFBD><E98EBF><EFBFBD> conversationService.ts
<0A>? <20>? <20>? <20>鎿<EFBFBD><E98EBF><EFBFBD> knowledgeBaseService.ts
<0A>? <20>? <20>? <20>婙<EFBFBD><E5A999><EFBFBD> reviewService.ts
<0A>? <20>? <20>?
<0A>? <20>? <20>婙<EFBFBD><E5A999><EFBFBD> templates/
<0A>? <20>? <20>婙<EFBFBD><E5A999><EFBFBD> clinicalResearch.ts
<0A>? <20>?
<0A>? <20>鎿<EFBFBD><E98EBF><EFBFBD> common/ # <20>𣂼<EFBFBD><F0A382BC>具<EFBFBD>煾<EFBFBD>𡁶鍂<F0A181B6>賢<EFBFBD>撅?
<0A>? <20>? <20>鎿<EFBFBD><E98EBF><EFBFBD> llm/ # LLM <20><><EFBFBD><EFBFBD>?
<0A>? <20>? <20>? <20>婙<EFBFBD><E5A999><EFBFBD> adapters/
<0A>? <20>? <20>? <20>鎿<EFBFBD><E98EBF><EFBFBD> DeepSeekAdapter.ts
<0A>? <20>? <20>? <20>鎿<EFBFBD><E98EBF><EFBFBD> QwenAdapter.ts
<0A>? <20>? <20>? <20>鎿<EFBFBD><E98EBF><EFBFBD> LLMFactory.ts
<0A>? <20>? <20>? <20>婙<EFBFBD><E5A999><EFBFBD> types.ts
<0A>? <20>? <20>?
<0A>? <20>? <20>鎿<EFBFBD><E98EBF><EFBFBD> rag/ # RAG <20>賢<EFBFBD>
<0A>? <20>? <20>? <20>鎿<EFBFBD><E98EBF><EFBFBD> DifyClient.ts
<0A>? <20>? <20>? <20>婙<EFBFBD><E5A999><EFBFBD> types.ts
<0A>? <20>? <20>?
<0A>? <20>? <20>鎿<EFBFBD><E98EBF><EFBFBD> document/ # <20><>﹝憭<EFB99D><E686AD>
<0A>? <20>? <20>? <20>鎿<EFBFBD><E98EBF><EFBFBD> ExtractionClient.ts
<0A>? <20>? <20>? <20>婙<EFBFBD><E5A999><EFBFBD> TokenService.ts
<0A>? <20>? <20>?
<0A>? <20>? <20>鎿<EFBFBD><E98EBF><EFBFBD> middleware/ # 銝剝𡢿隞?
<0A>? <20>? <20>? <20>婙<EFBFBD><E5A999><EFBFBD> validateProject.ts
<0A>? <20>? <20>?
<0A>? <20>? <20>婙<EFBFBD><E5A999><EFBFBD> utils/ # 撌亙<E6928C><E4BA99>賣㺭
<0A>? <20>? <20>婙<EFBFBD><E5A999><EFBFBD> jsonParser.ts
<0A>? <20>?
<0A>? <20>婙<EFBFBD><E5A999><EFBFBD> modules/ # <20><> <20>唳沲<E594B3><E6B2B2>芋<EFBFBD>梹<EFBFBD><E6A2B9><EFBFBD><EFBFBD><EFBFBD>吔<EFBFBD>
<0A>? <20>?
<0A>? <20>鎿<EFBFBD><E98EBF><EFBFBD> asl/ # 潃?AI<41>箄<EFBFBD><E7AE84><EFBFBD>讃嚗<E8AE83>鰵璅∪<E79285>嚗?
<0A>? <20>? <20>鎿<EFBFBD><E98EBF><EFBFBD> index.ts # 璅∪<E79285>撖澆枂
<0A>? <20>? <20>鎿<EFBFBD><E98EBF><EFBFBD> routes/
<0A>? <20>? <20>? <20>鎿<EFBFBD><E98EBF><EFBFBD> index.ts # 頝舐眏蝏煺<E89D8F>撖澆枂
<0A>? <20>? <20>? <20>鎿<EFBFBD><E98EBF><EFBFBD> projects.ts # 憿寧𤌍蝞∠<E89D9E>
<0A>? <20>? <20>? <20>鎿<EFBFBD><E98EBF><EFBFBD> screening.ts # <20><>讃蝑偦<E89D91>?
<0A>? <20>? <20>? <20>鎿<EFBFBD><E98EBF><EFBFBD> extraction.ts # <20>唳旿<E594B3>𣂼<EFBFBD>
<0A>? <20>? <20>? <20>婙<EFBFBD><E5A999><EFBFBD> analysis.ts # 蝏澆<E89D8F><E6BE86><EFBFBD><EFBFBD>
<0A>? <20>? <20>?
<0A>? <20>? <20>鎿<EFBFBD><E98EBF><EFBFBD> controllers/
<0A>? <20>? <20>? <20>鎿<EFBFBD><E98EBF><EFBFBD> projectController.ts
<0A>? <20>? <20>? <20>鎿<EFBFBD><E98EBF><EFBFBD> screeningController.ts
<0A>? <20>? <20>? <20>鎿<EFBFBD><E98EBF><EFBFBD> extractionController.ts
<0A>? <20>? <20>? <20>婙<EFBFBD><E5A999><EFBFBD> analysisController.ts
<0A>? <20>? <20>?
<0A>? <20>? <20>鎿<EFBFBD><E98EBF><EFBFBD> services/
<0A>? <20>? <20>? <20>鎿<EFBFBD><E98EBF><EFBFBD> projectService.ts
<0A>? <20>? <20>? <20>鎿<EFBFBD><E98EBF><EFBFBD> screeningService.ts
<0A>? <20>? <20>? <20>鎿<EFBFBD><E98EBF><EFBFBD> extractionService.ts
<0A>? <20>? <20>? <20>婙<EFBFBD><E5A999><EFBFBD> analysisService.ts
<0A>? <20>? <20>?
<0A>? <20>? <20>婙<EFBFBD><E5A999><EFBFBD> types/ # 璅∪<E79285>蝐餃<E89D90>摰帋<E691B0>
<0A>? <20>? <20>婙<EFBFBD><E5A999><EFBFBD> index.ts
<0A>? <20>?
<0A>? <20>婙<EFBFBD><E5A999><EFBFBD> [<5B>芣䔉璅∪<E79285>]/ # <20>芣䔉<E88AA3><E49489>鰵璅∪<E79285><E288AA>賣<EFBFBD>甇斤<E79487><E696A4>?
<0A>?
<0A>鎿<EFBFBD><E98EBF><EFBFBD> package.json
<0A>鎿<EFBFBD><E98EBF><EFBFBD> tsconfig.json # TypeScript <20>滨蔭
<0A>婙<EFBFBD><E5A999><EFBFBD> .env
<EFBFBD><EFBFBD> 銝餃<E98A9D><E9A483><EFBFBD><EFBFBD>隞塚<E99A9E>index.ts嚗?
/**
* AI銝游<E98A9D><E6B8B8>𠉛弦撟喳蝱 - 蝏煺<E89D8F><E785BA>亙藁
*
* <20>嗆<EFBFBD>瞍磰<E79E8D>蝑𣇉裦嚗𡁏鰵<F0A1818F>批僎摮?
* - Legacy 璅∪<E79285>嚗帋<E59A97><E5B88B><EFBFBD>緵<EFBFBD>厩<EFBFBD><E58EA9>?
* - New 璅∪<E79285>嚗𡁻<E59A97><F0A181BB>冽<EFBFBD><E586BD><EFBFBD><EFBFBD>銝匧<E98A9D><E58CA7>嗆<EFBFBD>
*/
import Fastify from 'fastify';
import cors from '@fastify/cors';
import multipart from '@fastify/multipart';
import { config, validateEnv } from './config/env.js';
import { testDatabaseConnection, prisma } from './config/database.js';
// ============================================
// <20>鞉唂<E99E89>嗆<EFBFBD><E59786>鍸egacy 璅∪<E79285> - 靽脲<E99DBD>銝滚<E98A9D>
// ============================================
import { projectRoutes } from './legacy/routes/projects.js';
import { agentRoutes } from './legacy/routes/agents.js';
import { conversationRoutes } from './legacy/routes/conversations.js';
import { chatRoutes } from './legacy/routes/chatRoutes.js';
import knowledgeBaseRoutes from './legacy/routes/knowledgeBases.js';
import batchRoutes from './legacy/routes/batchRoutes.js';
import reviewRoutes from './legacy/routes/reviewRoutes.js';
// ============================================
// <20>鞉鰵<E99E89>嗆<EFBFBD><E59786>烐<EFBFBD><E78390><EFBFBD><EFBFBD>璅∪<E79285>
// ============================================
import { aslRoutes } from './modules/asl/routes/index.js'; // ASL 璅∪<E79285>嚗<EFBFBD>鰵嚗?
const fastify = Fastify({ logger: true });
// 瘜典<E7989C><E585B8>雴辣
await fastify.register(cors, { origin: true });
await fastify.register(multipart, { limits: { fileSize: 10 * 1024 * 1024 } });
// <20>亙熒璉<E78692><E79289>?
fastify.get('/health', async () => ({
status: 'ok',
architecture: 'hybrid', // 瘛瑕<E7989B><E79195>嗆<EFBFBD>
modules: {
legacy: ['aia', 'pkb', 'rvw'],
modern: ['asl'],
},
}));
// ============================================
// 瘜典<E7989C> Legacy 璅∪<E79285>頝舐眏嚗<E79C8F>唂<EFBFBD>嗆<EFBFBD>嚗?
// ============================================
console.log('\n<>𣑐 <20>㰘蝸 Legacy 璅∪<E79285>...');
await fastify.register(projectRoutes, { prefix: '/api/v1/aia' });
await fastify.register(agentRoutes, { prefix: '/api/v1/aia' });
await fastify.register(conversationRoutes, { prefix: '/api/v1/aia' });
await fastify.register(chatRoutes, { prefix: '/api/v1/aia' });
await fastify.register(knowledgeBaseRoutes, { prefix: '/api/v1/pkb' });
await fastify.register(batchRoutes, { prefix: '/api/v1/pkb' });
await fastify.register(reviewRoutes, { prefix: '/api/v1/rvw' });
console.log('<27>?Legacy 璅∪<E79285><E288AA>㰘蝸摰峕<E691B0>嚗㇁IA, PKB, RVW嚗?);
// ============================================
// 瘜典<E7989C><E585B8>唳沲<E594B3><E6B2B2>芋<EFBFBD>𡑒楝<F0A19192>?
// ============================================
console.log('\n<EFBFBD><EFBFBD> <EFBFBD>㰘蝸<EFBFBD>唳沲<EFBFBD><EFBFBD>芋<EFBFBD>?..');
await fastify.register(aslRoutes, { prefix: '/api/v1/asl' });
console.log('<EFBFBD>?<EFBFBD>唳沲<EFBFBD><EFBFBD>芋<EFBFBD>堒<EFBFBD>頧賢<EFBFBD><EFBFBD>琜<EFBFBD>ASL嚗?);
// <20>臬𢆡<E887AC>滚𦛚<E6BB9A>?
async function start() {
try {
validateEnv();
await testDatabaseConnection();
await fastify.listen({ port: config.port, host: config.host });
console.log('\n' + '='.repeat(60));
console.log('<27><> AI銝游<E98A9D><E6B8B8>𠉛弦撟喳蝱<E596B3>臬𢆡<E887AC>𣂼<EFBFBD>嚗?);
console.log('='.repeat(60));
console.log(`<60><> <20>滚𦛚<E6BB9A>啣<EFBFBD>: http://${config.host}:${config.port}`);
console.log('\n<EFBFBD>𣑐 璅∪<EFBFBD><EFBFBD>嗆<EFBFBD>:');
console.log(' <EFBFBD>璛 Legacy <EFBFBD>嗆<EFBFBD>: AIA, PKB, RVW (蝔喳<EFBFBD>餈鞱<EFBFBD>)');
console.log(' <EFBFBD><EFBFBD> <EFBFBD>唳沲<EFBFBD>? ASL (<EFBFBD><EFBFBD><EFBFBD><EFBFBD>𡝗芋<EFBFBD>?');
console.log('='.repeat(60) + '\n');
} catch (error) {
console.error('<EFBFBD>?<EFBFBD>臬𢆡憭梯揖:', error);
await prisma.$disconnect();
process.exit(1);
}
}
start();
<EFBFBD><EFBFBD> <20>唳芋<E594B3>堒<EFBFBD><E5A092>烐<EFBFBD><E78390>梹<EFBFBD>ASL 銝箔<E98A9D>嚗?
1. <20>𥕦遣璅∪<E79285>撉冽沲
# 銝<>甈⊥<E79488>批<EFBFBD>撱箸<E692B1><E7AEB8>厩𤌍敶?
mkdir -p backend/src/modules/asl/{routes,controllers,services,types}
2. <20>𥕦遣璅∪<E79285>撖澆枂嚗ǎndex.ts嚗?
// backend/src/modules/asl/index.ts
/**
* ASL 璅∪<E79285>蝏煺<E89D8F>撖澆枂
*/
export { aslRoutes } from './routes/index.js';
export * from './types/index.js';
3. <20>𥕦遣頝舐眏蝏煺<E89D8F>撖澆枂
// backend/src/modules/asl/routes/index.ts
import { FastifyInstance } from 'fastify';
import { projectRoutes } from './projects.js';
import { screeningRoutes } from './screening.js';
import { extractionRoutes } from './extraction.js';
import { analysisRoutes } from './analysis.js';
/**
* ASL 璅∪<E79285>頝舐眏瘜典<E7989C>
*/
export async function aslRoutes(fastify: FastifyInstance) {
// 瘜典<E7989C><E585B8><EFBFBD><EFBFBD>璅∪<E79285>頝舐眏
await fastify.register(projectRoutes); // /projects
await fastify.register(screeningRoutes); // /screening
await fastify.register(extractionRoutes); // /extraction
await fastify.register(analysisRoutes); // /analysis
console.log('<27>?ASL 璅∪<E79285>頝舐眏瘜典<E7989C>摰峕<E691B0>');
}
4. <20><><EFBFBD><EFBFBD>𣇉<EFBFBD> Controller 璅∪<E79285>
// backend/src/modules/asl/controllers/projectController.ts
import { FastifyRequest, FastifyReply } from 'fastify';
import * as projectService from '../services/projectService.js';
export class ProjectController {
/**
* <20>瑕<EFBFBD>憿寧𤌍<E5AFA7>𡑒”
*/
async getProjects(request: FastifyRequest, reply: FastifyReply) {
try {
const projects = await projectService.getProjects();
return reply.send({ success: true, data: projects });
} catch (error) {
console.error('<27>瑕<EFBFBD>憿寧𤌍<E5AFA7>𡑒”憭梯揖:', error);
return reply.status(500).send({
success: false,
message: error instanceof Error ? error.message : '<27>滚𦛚<E6BB9A>券<EFBFBD>霂?
});
}
}
// ... <20>嗡<EFBFBD><E597A1>寞<EFBFBD>
}
export const projectController = new ProjectController();
<EFBFBD>圲 TSConfig 頝臬<E9A09D><E887AC>怠<EFBFBD><E680A0>滨蔭
{
"compilerOptions": {
"baseUrl": ".",
"paths": {
"@config/*": ["src/config/*"],
"@common/*": ["src/common/*"],
"@legacy/*": ["src/legacy/*"],
"@modules/*": ["src/modules/*"]
}
}
}
*雿輻鍂蝷箔<EFBFBD>嚗?
// <20>唳芋<E594B3>𦯀葉撖澆<E69296><E6BE86>𡁶鍂<F0A181B6>賢<EFBFBD>
import { LLMFactory } from '@common/llm/adapters/LLMFactory.js';
import { DifyClient } from '@common/rag/DifyClient.js';
import { config } from '@config/env.js';
// Legacy 璅∪<E79285>靽脲<E99DBD><E884B2><EFBFBD><EFBFBD>撖澆<E69296>銝滚<E98A9D>
import { agentService } from '../services/agentService.js';
<EFBFBD><EFBFBD> 摰墧鴌甇仿炊嚗<E7828A>妟憌𡡞埯嚗?
蝚?1 甇伐<E79487><E4BC90><EFBFBD>辣<EFBFBD>滨<EFBFBD>嚗?<3F><><EFBFBD>嚗争<E59A97>
# 1. <20>𥕦遣 legacy <20>桀<EFBFBD>
mkdir backend/src/legacy
# 2. 蝘餃𢆡<E9A483>唳<EFBFBD>隞<EFBFBD><E99A9E><EFBFBD>?legacy嚗<79><E59A97><EFBFBD><EFBFBD>㮾撖寡楝敺<E6A59D><E695BA><EFBFBD>矋<EFBFBD>
mv backend/src/routes backend/src/legacy/
mv backend/src/controllers backend/src/legacy/
mv backend/src/services backend/src/legacy/
mv backend/src/templates backend/src/legacy/
# 3. <20>𥕦遣<F0A595A6>唳沲<E594B3><E6B2B2>𤌍敶?
mkdir -p backend/src/modules/asl/{routes,controllers,services,types}
*撉諹<EFBFBD>嚗? <20>𣳇<EFBFBD>靽格㺿隞颱<E99A9E>隞<EFBFBD><E99A9E>嚗<EFBFBD>蘨<EFBFBD>舐宏<E88890>函𤌍敶蓥<E695B6>蝵?
蝚?2 甇伐<E79487><E4BC90>湔鰵銝餃<E98A9D><E9A483><EFBFBD><EFBFBD>5<EFBFBD><35><EFBFBD>嚗?
<EFBFBD>芯耨<EFBFBD>?src/index.ts <20><>紡<EFBFBD>亥楝敺<E6A59D><E695BA>
// <20>改<EFBFBD>from './routes/agents.js'
// <20>堆<EFBFBD>from './legacy/routes/agents.js'
*撉諹<EFBFBD>嚗? npm run dev <20>滚𦛚<E6BB9A>冽迤撣詨鍳<E8A9A8>?
蝚?3 甇伐<E79487><E4BC90>滨蔭 TSConfig嚗?<3F><><EFBFBD>嚗?
瘛餃<EFBFBD>頝臬<EFBFBD><EFBFBD>怠<EFBFBD><EFBFBD>滨蔭<EFBFBD>?
*撉諹<EFBFBD>嚗? IDE <20>質<EFBFBD><E8B3AA>?@legacy/*, @modules/* 蝑㕑楝敺?
蝚?4 甇伐<E79487>撘<EFBFBD><E69298>?ASL 璅∪<E79285>嚗<EFBFBD>鰵<EFBFBD>蠘<EFBFBD>嚗?
<EFBFBD>㗇鰵<EFBFBD>嗆<EFBFBD><EFBFBD><EFBFBD><EFBFBD>撘<EFBFBD><EFBFBD>𡢅<EFBFBD>摰<EFBFBD><EFBFBD>銝滚蔣<EFBFBD>滨緵<EFBFBD>㗇芋<EFBFBD>𨰜<EFBFBD>?
<EFBFBD>?<3F>寞<EFBFBD>隡睃飵
1. *<EFBFBD>園<EFBFBD><EFBFBD>拇㺿<EFBFBD>?
- <EFBFBD>?<3F>唳<EFBFBD>隞<EFBFBD><E99A9E><EFBFBD>芰宏<E88AB0>函𤌍敶𤏪<E695B6>銝滢耨<E6BBA2>孵<EFBFBD>摰?
- <EFBFBD>?<3F>芣㺿銝<E3BABF>銝芣<E98A9D>隞嗥<E99A9E>撖澆<E69296>頝臬<E9A09D>
- <EFBFBD>?<3F>舫<EFBFBD><E888AB>嗅<EFBFBD>皛?
2. *皜<EFBFBD>苊<EFBFBD><EFBFBD>沲<EFBFBD><EFBFBD>器<EFBFBD>?
legacy/ <20>?<3F>找誨<E689BE><E8AAA8><EFBFBD><EFBFBD>𡒊&<F0A1928A><EFBC86><EFBFBD>
modules/ <20>?<3F>唬誨<E594AC><E8AAA8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>?
3. <EFBFBD>唳芋<EFBFBD>埈鰵<EFBFBD>嗆<EFBFBD>
- <EFBFBD>?ASL <20>湔𦻖<E6B994>㗇<EFBFBD><E39787><EFBFBD><EFBFBD><EFBFBD>?
- <EFBFBD>?<3F>𣂷蛹<F0A382B7>芣䔉璅∪<E79285><E288AA><EFBFBD><EFBFBD><EFBFBD>?
- <EFBFBD>?銝滚<E98A9D><E6BB9A>找誨<E689BE><E8AAA8>漲<EFBFBD>?
4. 撟單<EFBFBD>瞍磰<EFBFBD>頝臬<EFBFBD>
<EFBFBD>啣銁嚗?銝芣唂璅∪<E79285> + 0銝芣鰵璅∪<E79285>
<0A>芣䔉嚗?銝芣唂璅∪<E79285> + 1銝芣鰵璅∪<E79285>嚗㇁SL嚗?
<0A>渲<EFBFBD>嚗?銝芣唂璅∪<E79285> + N銝芣鰵璅∪<E79285>
<0A><>蝏<EFBFBD><E89D8F><EFBFBD>厰<EFBFBD><E58EB0>鞉郊餈<E9838A>宏<EFBFBD>扳芋<E689B3>梹<EFBFBD><E6A2B9>舫<EFBFBD>㚁<EFBFBD>
<EFBFBD>㴓 瞍磰<E79E8D><E7A3B0>園𡢿頧?
| <EFBFBD>嗆挾 | <EFBFBD>園𡢿 | 撌乩<EFBFBD><EFBFBD><EFBFBD>捆 | 憌𡡞埯 |
|---|---|---|---|
| 隞𠰴予 | 15<EFBFBD><EFBFBD><EFBFBD> | <EFBFBD>滨<EFBFBD><EFBFBD>桀<EFBFBD>+<2B>湔鰵<E6B994>亙藁 | <EFBFBD><EFBFBD><EFBFBD> |
| Week 3 | - | 撘<EFBFBD><EFBFBD>?ASL 璅∪<E79285>嚗<EFBFBD>鰵<EFBFBD>嗆<EFBFBD>嚗? | <EFBFBD>𩤃<EFBFBD><EFBFBD>啣<EFBFBD><EFBFBD>踝<EFBFBD> |
| Week 4+ | - | 蝏抒賒撘<EFBFBD><EFBFBD>烐鰵璅∪<EFBFBD> | <EFBFBD>? |
| <EFBFBD>芣䔉 | <EFBFBD>厰<EFBFBD> | <EFBFBD>鞉郊餈<EFBFBD>宏<EFBFBD>扳芋<EFBFBD>梹<EFBFBD><EFBFBD>舫<EFBFBD>㚁<EFBFBD> | <EFBFBD>舀綉 |
<EFBFBD><EFBFBD> 撘<><E69298>𤏸<EFBFBD><F0A48FB8>?
Legacy 璅∪<E79285>閫<EFBFBD><E996AB>
- <EFBFBD>𩤃<EFBFBD> **銝滢蜓<E6BBA2>其耨<E585B6>?*嚗屸膄<E5B1B8>硺耨憭嵖ug
- <EFBFBD>𩤃<EFBFBD> 靽脲<E99DBD><E884B2>唳<EFBFBD>蝏𤘪<E89D8F>銝滚<E98A9D>
- <EFBFBD>𩤃<EFBFBD> <20>臭誑撘閧鍂
common/撅<><E69285><EFBFBD>賢<EFBFBD>
<EFBFBD>唳芋<EFBFBD>𡑒<EFBFBD><EFBFBD>?
- <EFBFBD>?敹<>◆<EFBFBD>㗇<EFBFBD><E39787><EFBFBD><EFBFBD>撅<EFBFBD>沲<EFBFBD>?
- <EFBFBD>?敹<>◆雿輻鍂頝臬<E9A09D><E887AC>怠<EFBFBD>
- <EFBFBD>?敹<>◆<EFBFBD>祉<EFBFBD><E7A589>舫<EFBFBD>蝵?
- <EFBFBD>?敹<>◆<EFBFBD>匧<EFBFBD><E58CA7>渡<EFBFBD>蝐餃<E89D90>摰帋<E691B0>
<EFBFBD><EFBFBD> 銝衤<E98A9D>甇亥<E79487><E4BAA5>?
- **隞𠰴予嚗?5<><35><EFBFBD>嚗?*嚗𡁏<E59A97>銵𣬚洵1-3甇伐<E79487>摰峕<E691B0><E5B395>桀<EFBFBD><E6A180>滨<EFBFBD>
- <EFBFBD>𤾸予嚗𡁜<EFBFBD>憪?ASL 璅∪<E79285>撘<EFBFBD><E69298>𡢅<EFBFBD><F0A1A285>唳沲<E594B3><E6B2B2><EFBFBD>
- Week 3嚗鋫SL 璅∪<E79285>銝羓瑪
- <EFBFBD>芣䔉嚗𡁏鰵璅∪<EFBFBD><EFBFBD><EFBFBD>賒<EFBFBD>㗇<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>?
<EFBFBD><EFBFBD><EFBFBD>擧凒<EFBFBD>堆<EFBFBD> 2025-11-14
蝏湔擪<EFBFBD><EFBFBD><EFBFBD> 撘<><E69298>穃𣪧<E7A983>?