PaiAgent
<div align="center"> # PaiAgent **äŒäžçº§ AI å·¥äœæµå¯è§åçŒæå¹³å°** éè¿ææœåŒçé¢å¿«éæå»ºãçŒæåæ§è¡ AI å·¥äœæµïŒè®© AI èœåç»åæŽç®å [](LICENSE) [](https://www.oracle.com/java/) [](https://spring.io/projects/spring-boot) [](https://spring.io/projects/spring-ai) [](https://java2ai.com) [](https://github.com/bsorrentino/langgraph4j) [](https://reactjs.org/) [](https://www.typescriptlang.org/) [å¿«éåŒå§](#-å¿«éåŒå§) ⢠[åèœç¹æ§](#-æ žå¿ç¹æ§) ⢠[ææ¯æ¶æ](#-ææ¯æ¶æ) ⢠[äœ¿çšææ¡£](./USER_GUIDE.md) ⢠[åŒåè¿åºŠ](./PROGRESS.md) </div> --- ## ð 项ç®ç®ä» PaiAgent æ¯äžäžª**äŒäžçº§ç AI å·¥äœæµå¯è§åçŒæå¹³å°**ïŒè®© AI èœåçç»ååè°åºŠååŸç®å髿ãéè¿çŽè§çææœåŒçé¢ïŒåŒåè åäžå¡äººåéœèœå¿«éæå»ºå€æç AI å€çæµçšïŒæ éçŒå代ç å³å¯å®ç°å€ç§å€§æš¡åçååå·¥äœã      ### ð¡ 䞺ä»ä¹éæ© PaiAgentïŒ - **ð¯ é¶ä»£ç çŒæ**ïŒå¯è§åææœçé¢ïŒæ éçŒçšå³å¯æå»ºå€æ AI å·¥äœæµ - **ð ååŒæé©±åš**ïŒèªç DAG åŒæ + LangGraph4j ç¶æåŸåŒæïŒæé忢ïŒå Œé¡Ÿç®æŽäžå€æåºæ¯ - **ð 倿š¡åç»äž**ïŒåºäº Spring AI æ¡æ¶ïŒç»äžæ¥å ¥ OpenAIãDeepSeekãéä¹åé®çäž»æµå€§æš¡å - **ð§ Skills æèœç³»ç»**ïŒå 眮æç€ºè¯å·¥çšæèœæ¡æ¶ïŒæ¯æ YAML åçŒå£°æåŒæèœå®ä¹ïŒäžçº§æžè¿åŒå 蜜 - **ð ïž çµæŽ»æ©å±**ïŒåºäºæä»¶å讟计ïŒèœ»æŸåŒåèªå®ä¹èç¹æ»¡è¶³äžªæ§åéæ± - **ð 宿¶è°è¯**ïŒå 眮è°è¯é¢æ¿ïŒæ¯æ SSE æµåŒèŸåºïŒå¯è§åæ§è¡è¿çš - **ðŠ åŒç®±å³çš**ïŒå®æŽçååç«¯è§£å³æ¹æ¡ïŒå¿«ééšçœ²å°ç产ç¯å¢ ### é¡¹ç®æçš  æå·²ç»æŸå°ææ¯æŽŸäžäºïŒ[ç¹å»è¿é](https://paicoding.com/column/14/1)æ¥çè¯Šç»æçšïŒéæ¶å 莹ïŒã  ç¬¬äžæææŽæ°äºäºç¯æçšïŒææ³åŠä¹ çååŠå¯ä»¥è·çè¿äžªé¡¹ç®å²ã - [æå»ºPaiAgentèææ¶](https://paicoding.com/column/14/1) - [èç¹é 眮](https://paicoding.com/column/14/2) - [LLMèç¹åŒå](https://paicoding.com/column/14/3) - [è¶ æäººé³é¢èç¹](https://paicoding.com/column/14/4) - [å·¥äœæµå®æ¶æšé](https://paicoding.com/column/14/5) ç¬¬äºæææŽæ°äºäžç¯æçšïŒå嫿¯åç®åãé¢è¯é¢åLangGraph4Jã - [åç®å](https://paicoding.com/column/14/6) - [é¢è¯é¢](https://paicoding.com/column/14/7) - [LangGraph4J](https://paicoding.com/column/14/8) ## âš æ žå¿ç¹æ§ ### å¯è§åæµçšçŒèŸåš åºäº ReactFlow æå»ºçäžäžæµçšåŸçŒèŸåšïŒæ¯æèç¹ææœãè¿çº¿é 眮ãåæ°çŒèŸç宿Žåèœã ### å€å€§æš¡åèç¹æ¯æ åºäº **Spring AI + Spring AI Alibaba** æ¡æ¶ç»äžæ¥å ¥ïŒ - **OpenAI èç¹**ïŒGPT-5 çæš¡åïŒSpring AI OpenAI æ¥å£ïŒ - **DeepSeek èç¹**ïŒåœäº§å€§æš¡åïŒOpenAI å Œå®¹æ¥å£ïŒ - **éä¹åé®èç¹**ïŒé¿éäºåé®ç³»åïŒSpring AI Alibaba DashScope åçæ¯æïŒ - **æºè°± AI èç¹**ïŒGLM ç³»åæš¡åïŒOpenAI å Œå®¹æ¥å£ïŒ - **AIPing èç¹**ïŒç¬¬äžæ¹æš¡å代çïŒOpenAI å Œå®¹æ¥å£ïŒ ### å·¥å ·èç¹çæ - **TTS é³é¢åæ**ïŒæ¯æéä¹ Qwen3 TTS äžé¶è·æèŸ° StepAudio çè¶ æäººè¯é³çæ - **èŸå ¥/èŸåºèç¹**ïŒçµæŽ»çæ°æ®èŸå ¥èŸåº - **èªå®ä¹æ©å±**ïŒåºäºç»äžæ¥å£åŒåäžå±èç¹ ### DAG å·¥äœæµåŒæ - **æææåº**ïŒåºäº Kahn ç®æ³çèç¹è°åºŠ - **åŸªç¯æ£æµ**ïŒDFS 深床äŒå æçޢ鲿¢æ»åŸªç¯ - **æ°æ®æµèœ¬**ïŒèç¹éŽæºèœæ°æ®äŒ éæºå¶ - **æ§è¡çæ§**ïŒå®æŽçæ§è¡æ¥å¿åç»æè®°åœ ### LangGraph4j ç¶æåŸåŒæïŒæ°å¢ïŒ - **ç¶æåŸçŒæ**ïŒåºäº LangGraph4j ç StateGraph æå»ºå€æå·¥äœæµïŒæ¯ææ¡ä»¶åæ¯äžåšæè·¯ç± - **ååŒæåæ¢**ïŒéè¿ EngineSelector æ `engineType` åæ®µèªåšè·¯ç±å° DAG æ LangGraph åŒæïŒååå Œå®¹ - **åŒæ¥èç¹æ§è¡**ïŒNodeAdapter å°ç°æ NodeExecutor éé 䞺 AsyncNodeActionïŒæ ééåäžå¡é»èŸ - **ç¶æç®¡ç**ïŒStateManager ç»äžç®¡çå·¥äœæµäžäžæïŒæ¯æ inputDataãnodeOutputsãglobalContext - **äºä»¶åè°**ïŒæ§è¡è¿çšäžè§Šå ExecutionEventïŒå®æ¶åéŠæ¯äžªèç¹çå¯åšãæåååŒåžž ### Skills æèœç³»ç»ïŒæ°å¢ïŒ - **声æåŒæèœå®ä¹**ïŒéè¿ SKILL.md + YAML Frontmatter å®ä¹æèœåç§°ãæè¿°åæ§è¡è§å - **äžçº§æžè¿åŒå 蜜**ïŒæèŠïŒåç§°+æè¿°ïŒâ 诊æ ïŒå®æŽ SKILL.mdïŒâ åŒçšææ¡£ïŒreference åç®åœïŒïŒæéå 蜜èç Token - **æèœæ³šåäžå¿**ïŒSkillRegistry åºçšå¯åšæ¶èªå𿫿 classpath åæä»¶ç³»ç»ïŒçŒåå° ConcurrentHashMap - **LLM Function éæ**ïŒéè¿ LoadSkillDetailFunction / LoadSkillReferenceFunction æŽé²äžº Spring AI FunctionCallbackïŒè®©å€§æš¡åèªäž»è°çšæèœ - **REST API æ¯æ**ïŒæäŸæèœå衚æ¥è¯¢ã诊æ è·åãåŒçšææ¡£å èœœçæ¥å£ - **å端æèœéæ©åš**ïŒSkillSelector ç»ä»¶æ¯æåšå·¥äœæµäžéæ©ååºçšæèœ ## ð¯ åºçšåºæ¯ | åºæ¯ç±»å« | å ·äœåºçš | éçšå¯¹è±¡ | |---------|---------|----------| | ð å å®¹çæ | æ¹éæç« çæãå€è¯èšç¿»è¯ãå 容æ¹åæ¶Šè² | å 容åäœè ãè¥éå¢é | | ð¬ æºèœå®¢æ | å€èœ®å¯¹è¯æµçšãæåŸè¯å«äžæºèœååº | 客æå¢éã产åç»ç | | ð æ°æ®å€ç | ææ¬åæãä¿¡æ¯æœåãæ°æ®æž æŽèœ¬æ¢ | æ°æ®åæåžãç åå¢é | | ðµ é³è§é¢å€ç | è¯é³åæãåå¹çæãé³é¢èœ¬å | å 容å¢éãæè²è¡äž | | âïž æµçšèªåšå | æ¥åçæãé®ä»¶èªåšåå€ã宿¶ä»»å¡ | è¿è¥å¢éãäŒäžçšæ· | ## ðïž ææ¯æ¶æ ### ç³»ç»æ¶æ ``` âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ â åç«¯å± (Frontend) â â React 18 + TypeScript + ReactFlow + Ant Design â â ⢠å¯è§åçŒèŸåš ⢠èç¹é¢æ¿ ⢠è°è¯å·¥å · â ââââââââââââââââââââââ¬âââââââââââââââââââââââââââââââââââââ â REST API / SSE ââââââââââââââââââââââŽâââââââââââââââââââââââââââââââââââââ â åºçšå± (Backend) â â Spring Boot 3.4.1 + Java 21 â â ⢠Controller ⢠Service ⢠Interceptor â ââââââââââââââââââââââ¬âââââââââââââââââââââââââââââââââââââ â ââââââââââââââââââââââŽâââââââââââââââââââââââââââââââââââââ â æ žå¿åŒæå± (Engine) â â ⢠EngineSelector: åŒæè·¯ç±ïŒDAG / LangGraphïŒ â â ⢠DAGParser: æææåº + åŸªç¯æ£æµ â â ⢠LangGraph4j: ç¶æåŸçŒæ + æ¡ä»¶è·¯ç± â â ⢠SkillRegistry: æèœæ³šåäžå¿ + æžè¿åŒå 蜜 â â ⢠NodeExecutor: èç¹æ§è¡åšå·¥å â ââââââââââââââââââââââ¬âââââââââââââââââââââââââââââââââââââ â ââââââââââââââââââââââŽâââââââââââââââââââââââââââââââââââââ â AI æš¡åå± (Spring AI) â â ⢠Spring AI: OpenAI/DeepSeek/æºè°± çå Œå®¹æ¥å£ â â ⢠Spring AI Alibaba: éä¹åé® DashScope åçæ¯æ â â ⢠ChatClientFactory: ç»äžç ChatClient åšæå·¥å â ââââââââââââââââââââââ¬âââââââââââââââââââââââââââââââââââââ â ââââââââââââââââââââââŽâââââââââââââââââââââââââââââââââââââ â æ°æ®å± (Data & Storage) â â ⢠MySQL: å·¥äœæµé çœ®ãæ§è¡è®°åœ â â ⢠MinIO: æä»¶ååš (å¯é) â âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ ``` ### ææ¯æ 诊æ <table> <tr> <td><b>å±çº§</b></td> <td><b>ææ¯éå</b></td> <td><b>çæ¬èŠæ±</b></td> <td><b>诎æ</b></td> </tr> <tr> <td rowspan="6"><b>å端</b></td> <td>React</td> <td>18.x</td> <td>ç°ä»£å UI æ¡æ¶</td> </tr> <tr> <td>TypeScript</td> <td>5.x</td> <td>ç±»åå®å šä¿é</td> </tr> <tr> <td>Vite</td> <td>5.x</td> <td>髿§èœæå»ºå·¥å ·</td> </tr> <tr> <td>ReactFlow</td> <td>ææ°ç</td> <td>äžäžæµçšåŸåº</td> </tr> <tr> <td>Ant Design + Tailwind CSS</td> <td>-</td> <td>äŒäžçº§ UI ç»ä»¶</td> </tr> <tr> <td>Zustand</td> <td>ææ°ç</td> <td>蜻éçº§ç¶æç®¡ç</td> </tr> <tr> <td rowspan="6"><b>å端</b></td> <td>Spring Boot</td> <td>3.4.1</td> <td>äŒäžçº§ Java æ¡æ¶</td> </tr> <tr> <td>Java</td> <td>21+</td> <td>LTS é¿ææ¯æçæ¬</td> </tr> <tr> <td>MyBatis-Plus</td> <td>3.5.5</td> <td>å¢åŒºç ORM æ¡æ¶</td> </tr> <tr> <td>Spring AI</td> <td>1.0.0-M5</td> <td>AI æš¡åç»äžè°ç𿡿¶</td> </tr> <tr> <td>Spring AI Alibaba</td> <td>1.0.0-M6.1</td> <td>éä¹åé® DashScope åçæ¯æ</td> </tr> <tr> <td>MySQL</td> <td>8.0+</td> <td>å ³ç³»åæ°æ®åº</td> </tr> <tr> <td>FastJSON2</td> <td>ææ°ç</td> <td>髿§èœ JSON åº</td> </tr> <tr> <td>MinIO</td> <td>å¯é</td> <td>对象ååšæå¡</td> </tr> <tr> <td rowspan="7"><b>æ žå¿åŒæ</b></td> <td>èªç DAG åŒæ</td> <td>-</td> <td>å·¥äœæµçŒææ žå¿ïŒæææåº + åŸªç¯æ£æµïŒ</td> </tr> <tr> <td>LangGraph4j Core</td> <td>1.1.5</td> <td>ç¶æåŸå·¥äœæµåŒæ</td> </tr> <tr> <td>LangGraph4j Spring AI</td> <td>1.8.0-beta3</td> <td>LangGraph4j äž Spring AI éææ¡¥æ¥</td> </tr> <tr> <td>Skills æèœç³»ç»</td> <td>-</td> <td>声æåŒæç€ºè¯å·¥ç𿡿¶</td> </tr> <tr> <td>EngineSelector</td> <td>-</td> <td>ååŒæåšæè·¯ç±éæ©</td> </tr> <tr> <td>Spring AI ChatClient</td> <td>-</td> <td>ç»äž AI æš¡åè°çšæ¥å£</td> </tr> <tr> <td>ChatClientFactory</td> <td>-</td> <td>åšæå建äžåæš¡å客æ·ç«¯</td> </tr> </table> ## ð 项ç®ç»æ ``` PaiAgent-one/ âââ backend/ # Spring Boot å端æå¡ â âââ src/main/ â â âââ java/com/paiagent/ â â â âââ engine/ # ð¯ å·¥äœæµåŒæïŒæ žå¿ïŒ â â â â âââ WorkflowEngine.java # å·¥äœæµçŒæåŒæ â â â â âââ EngineSelector.java # ååŒæè·¯ç±éæ©åš â â â â âââ dag/DAGParser.java # æææåº+åŸªç¯æ£æµ â â â â âââ langgraph/ # ð LangGraph4j åŒæ â â â â â âââ LangGraphWorkflowEngine.java # LangGraph æ§è¡åŒæ â â â â â âââ WorkflowState.java # ç¶ææš¡å â â â â â âââ builder/GraphBuilder.java # StateGraph æå»ºåš â â â â â âââ adapter/NodeAdapter.java # AsyncNodeAction éé åš â â â â â âââ state/StateManager.java # ç¶æç®¡çåš â â â â âââ skill/ # ð Skills æèœç³»ç» â â â â â âââ Skill.java # æèœæ°æ®æš¡å â â â â â âââ SkillRegistry.java # æèœæ³šåäžå¿ â â â â â âââ SkillLoader.java # SKILL.md è§£æåš â â â â â âââ LoadSkillDetailFunction.java # FunctionCallback: å 蜜诊æ â â â â â âââ LoadSkillReferenceFunction.java # FunctionCallback: å 蜜åŒçš â â â â âââ llm/ # LLM è°çšå±ïŒSpring AIïŒ â â â â â âââ ChatClientFactory.java # ChatClient åšæå·¥å â â â â â âââ PromptTemplateService.java # æç€ºè¯æš¡æ¿å€ç â â â â â âââ LLMNodeConfig.java # LLM èç¹é 眮 â â â â âââ executor/ # èç¹æ§è¡åš â â â â â âââ NodeExecutor.java # æ§è¡åšæ¥å£ â â â â â âââ NodeExecutorFactory.java # å·¥åæš¡åŒ â â â â â âââ impl/ # å ·äœå®ç° â â â â â âââ AbstractLLMNodeExecutor.java # LLM æœè±¡åºç±» â â â â â âââ InputNodeExecutor.java â â â â â âââ OutputNodeExecutor.java â â â â â âââ OpenAINodeExecutor.java â â â â â âââ DeepSeekNodeExecutor.java â â â â â âââ QwenNodeExecutor.java â â â â â âââ ZhiPuNodeExecutor.java â â â â â âââ AIPingNodeExecutor.java â â â â â âââ TTSNodeExecutor.java â â â â âââ model/ # æ°æ®æš¡å â â â âââ controller/ # REST API æ¥å£å± â â â âââ service/ # äžå¡é»èŸå± â â â âââ mapper/ # MyBatis-Plus æ°æ®è®¿é®å± â â â âââ entity/ # æ°æ®åºå®äœ â â â âââ dto/ # æ°æ®äŒ èŸå¯¹è±¡ â â â âââ config/ # é 眮类 â â â âââ interceptor/ # æŠæªåšïŒè®€è¯ïŒ â â â âââ common/ # éçšå·¥å · â â âââ resources/ â â âââ application.yml # åºçšé 眮 â â âââ schema.sql # æ°æ®åºåå§åèæ¬ â â âââ skills/ # ð æèœèµæºç®åœ â â âââ ai-podcast/ # ç€ºäŸæèœïŒAI æå®¢èæ¬çæ â â âââ SKILL.md # æèœå®ä¹ïŒYAML + MarkdownïŒ â â âââ reference/ # åŒçšææ¡£ â â âââ script-template.md â â âââ voice-guide.md â âââ pom.xml # Maven äŸèµé 眮 â âââ frontend/ # React å端åºçš â âââ src/ â â âââ components/ # ðš æ žå¿ç»ä»¶ â â â âââ FlowCanvas.tsx # ReactFlow æµçšçŒèŸåš â â â âââ NodePanel.tsx # 坿æœèç¹é¢æ¿ â â â âââ DebugDrawer.tsx # è°è¯æœå±é¢æ¿ â â â âââ AudioPlayer.tsx # é³é¢ææŸåš â â â âââ SkillSelector.tsx # ð æèœéæ©åš â â âââ pages/ # 页é¢ç»ä»¶ â â â âââ LoginPage.tsx # ç»åœé¡µ â â â âââ MainPage.tsx # å·¥äœæµå衚页 â â â âââ EditorPage.tsx # å·¥äœæµçŒèŸåšé¡µ â â âââ store/ # Zustand ç¶æç®¡ç â â â âââ authStore.ts # çšæ·è®€è¯ç¶æ â â â âââ workflowStore.ts # å·¥äœæµçŒèŸç¶æ â â âââ api/ # API è°çšå± â â âââ utils/ # å·¥å ·åœæ° â â âââ App.tsx # åºçšå ¥å£ â âââ package.json # NPM äŸèµé 眮 â âââ vite.config.ts # Vite æå»ºé 眮 â âââ docs/ # ð é¡¹ç®ææ¡£ â âââ README.md # é¡¹ç®æŠè§ïŒåœåæä»¶ïŒ â âââ USER_GUIDE.md # çšæ·äœ¿çšæå â âââ PROGRESS.md # åŒåè¿åºŠè¿œèžª â âââ SUMMARY.md # é¡¹ç®ææ¯æ»ç» â âââ AGENTS.md # AI Agent åŒåæåŒ â âââ mermaid.md # æ¶æå¯è§ååŸè¡š â âââ .gitignore # Git 応ç¥é 眮 ``` ## ð å¿«éåŒå§ ### ç¯å¢èŠæ± åšåŒå§ä¹åïŒè¯·ç¡®ä¿æšçåŒåç¯å¢æ»¡è¶³ä»¥äžèŠæ±ïŒ | å·¥å · | çæ¬èŠæ± | 诎æ | |------|---------|------| | Java | 21+ | æšèäœ¿çš OpenJDK æ Oracle JDK | | Node.js | 18+ | å å« npm å 管çåš | | MySQL | 8.0+ | æ°æ®åºæå¡ | | Maven | 3.8+ | Java é¡¹ç®æå»ºå·¥å · | ### äžé®å¯åšæå #### æ¥éª€ 1ïŒå éé¡¹ç® ```bash git clone https://github.com/yourusername/PaiAgent-one.git cd PaiAgent-one ``` #### æ¥éª€ 2ïŒé çœ®æ°æ®åº **2.1 åå»ºæ°æ®åº** ```bash mysql -u root -p ``` ```sql CREATE DATABASE paiagent DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; ``` **2.2 å¯Œå ¥åå§åèæ¬** ```bash mysql -u root -p paiagent < backend/src/main/resources/schema.sql ``` **2.3 é çœ®æ°æ®åºè¿æ¥ïŒç¯å¢åéæ¹åŒïŒ** æ¬é¡¹ç®äœ¿çšç¯å¢åéç®¡çææé 眮ïŒ**请å¿å°çå®åè¯æäº€å° Git**ã å€å¶å端ç¯å¢åéæš¡æ¿å¹¶çŒèŸïŒ ```bash cd backend cp .env.example .env ``` çŒèŸ `backend/.env` æä»¶ïŒè®Ÿçœ®äœ çæ°æ®åºå¯ç åå ¶ä»é çœ®ïŒ ```bash # å¿ å¡«ïŒæ°æ®åºå¯ç ïŒç产ç¯å¢å¿ 须䜿çšåŒºå¯ç ïŒ MYSQL_PASSWORD=your_strong_password_here # å ¶ä»é 眮æéä¿®æ¹ MYSQL_HOST=localhost MYSQL_PORT=3306 MYSQL_USERNAME=root MYSQL_DATABASE=paiagent # JWT å¯é¥ïŒç产ç¯å¢å¿ 须修æ¹ïŒïŒ JWT_SECRET=your_jwt_secret_key_minimum_32_characters # MinIO åè¯ïŒåŠäœ¿çšå¯¹è±¡ååšïŒ MINIO_ACCESS_KEY=your_access_key MINIO_SECRET_KEY=your_secret_key ``` > **å®å šæç€º**ïŒ > - `.env` æä»¶å·²å å ¥ `.gitignore`ïŒäžäŒæäº€å°çæ¬åº > - `.env.example` æ¯é 眮暡æ¿ïŒäžå å«ç宿æä¿¡æ¯ > - ç产ç¯å¢å»ºè®®éè¿ç³»ç»ç¯å¢åéæé 眮äžå¿æ³šå ¥ #### æ¥éª€ 3ïŒå¯åšå端æå¡ ```bash cd backend ./mvnw spring-boot:run ``` â å端æå¡å¯åšæååïŒæšå°çå°ïŒ ``` Started PaiAgentApplication in X.XXX seconds ``` å端æå¡å°åïŒ`http://localhost:8084`ïŒå¯åš `.env` äžéè¿ `SERVER_PORT` ä¿®æ¹ïŒ #### æ¥éª€ 4ïŒå¯åšå端æå¡ æåŒæ°çç»ç«¯çªå£ïŒ ```bash cd frontend cp .env.example .env.local ``` åŠéä¿®æ¹åç«¯è¿æ¥çå端å°åïŒçŒèŸ `frontend/.env.local`ïŒ ```bash VITE_API_BASE_URL=http://localhost:8084 ``` ç¶åå¯åšåç«¯ïŒ ```bash npm install npm run dev ``` â å端æå¡å¯åšæååïŒæšå°çå°ïŒ ``` â Local: http://localhost:5173/ ``` #### æ¥éª€ 5ïŒéŠæ¬¡ç»åœ **åŒåç¯å¢é»è®€èŽŠæ·**ïŒå¯åš `backend/.env` äžä¿®æ¹ïŒïŒ | é 眮项 | é»è®€åŒ | 诎æ | |--------|--------|------| | çšæ·å | `admin` | éè¿ `APP_AUTH_DEFAULT_USERNAME` é 眮 | | å¯ç | `admin123` | éè¿ `APP_AUTH_DEFAULT_PASSWORD` é 眮 | > **â ïž å®å šæç€º**ïŒ > - é»è®€èŽŠæ·ä» çšäºåŒåæµè¯ïŒç产ç¯å¢å¿ é¡»ä¿®æ¹æçŠçš > - éŠæ¬¡ç»åœå请ç«å³ä¿®æ¹å¯ç ïŒåèœåŸ å®ç°ïŒ > - å¯éè¿ç¯å¢åé `APP_AUTH_DEFAULT_USERNAME` å `APP_AUTH_DEFAULT_PASSWORD` èªå®ä¹ > - å°äž€äžªåééœè®Ÿäžºç©ºåŒå¯çŠçšé»è®€èŽŠæ·ïŒéé åçšæ·æ³šååèœäœ¿çšïŒ #### æ¥éª€ 6ïŒè®¿é®åºçš - å端端å£åš [application.yml](/Users/itwanger/Documents/GitHub/PaiAgent-one/backend/src/main/resources/application.yml#L1) äžé 眮ïŒåœåé»è®€åŒæ¯ `8084` - å端éè¿ Vite ç¯å¢åé `VITE_API_BASE_URL` è¿æ¥å端ïŒé»è®€ç€ºäŸè§ [`frontend/.env.example`](/Users/itwanger/Documents/GitHub/PaiAgent-one/frontend/.env.example) - å端äžèœçŽæ¥è¯»å Spring Boot ç `application.yml`ïŒæä»¥åŠæå端端å£ååïŒéèŠåæ¥è°æŽ `frontend/.env.local` ### ð¬ å¿«éæŒç€º å建æšç第äžäžªå·¥äœæµïŒ 1. **ç»åœç³»ç»**ïŒäœ¿çšé»è®€åè¯ç»åœ 2. **åå»ºå·¥äœæµ**ïŒç¹å»ãæ°å»ºå·¥äœæµãæé® 3. **ææœèç¹**ïŒä»å·ŠäŸ§èç¹é¢æ¿ææœãèŸå ¥èç¹ãâãOpenAIèç¹ãâãèŸåºèç¹ãå°ç»åž 4. **è¿æ¥èç¹**ïŒæé¡ºåºè¿æ¥å䞪èç¹ 5. **é çœ®åæ°**ïŒç¹å» OpenAI èç¹ïŒé 眮 API Key åæç€ºè¯ 6. **æ§è¡è°è¯**ïŒç¹å»ãè°è¯ãæé®ïŒæ¥çæ§è¡ç»æ 瀺äŸïŒææ¬èœ¬è¯é³å·¥äœæµ ``` [èŸå ¥èç¹] â [OpenAIèç¹] â [TTSèç¹] â [èŸåºèç¹] èŸå ¥ææ¬ çæèæ¬ è¯é³åæ ææŸé³é¢ ``` ## ðºïž åŒåè·¯çº¿åŸ ### â 已宿åèœ (v1.0) - â åºç¡æ¶ææå»ºïŒSpring Boot + React + TypeScriptïŒ - â çšæ·è®€è¯ç³»ç»ïŒToken è®€è¯ + æŠæªåšïŒ - â å¯è§åæµçšçŒèŸåšïŒReactFlow éæïŒ - â DAG å·¥äœæµåŒæïŒæææåº + åŸªç¯æ£æµïŒ - â **Spring AI æ¡æ¶éæ**ïŒv1.0.0-M5ïŒ - ç»äžç ChatClient è°çšæ¥å£ - æ¯æ OpenAI å Œå®¹åè®®ïŒOpenAI/DeepSeek/æºè°±/AIPingïŒ - â **Spring AI Alibaba éæ**ïŒv1.0.0-M6.1ïŒ - éä¹åé® DashScope åçæ¯æ - é¿éäº Qwen ç³»åæš¡åæ¥å ¥ - â å€å€§æš¡åèç¹æ¯æ - OpenAI èç¹ïŒGPT ç³»åïŒ - DeepSeek èç¹ - éä¹åé®èç¹ - æºè°± AI èç¹ - AIPing èç¹ - â å·¥å ·èç¹å®ç° - èŸå ¥/èŸåºèç¹ - TTS é³é¢åæèç¹ - é³é¢ææŸåšç»ä»¶ - â SSE 宿¶æµåŒèŸåºïŒè°è¯æœå± + æ¥å¿èŸåº + ç»æå±ç€ºïŒ - â å·¥äœæµ CRUD 管ç - â æ§è¡è®°åœæ¥è¯¢ - â **LangGraph4j ç¶æåŸåŒæéæ** - åºäº LangGraph4j StateGraph çç¬¬äºæ§è¡åŒæ - EngineSelector ååŒæè·¯ç±ïŒæ¯ææå·¥äœæµåæ¢ - NodeAdapter éé åšïŒé¶æ¹åšå€çšå·²æèç¹æ§è¡åš - StateManager ç»äžç¶æç®¡ç - â **Skills æèœç³»ç»** - YAML Frontmatter + Markdown 声æåŒæèœå®ä¹ - SkillRegistry èªå𿫿å 蜜 + ConcurrentHashMap çŒå - äžçº§æžè¿åŒå èœœïŒæèŠâ诊æ âåŒçšææ¡£ïŒ - Spring AI FunctionCallback éæïŒLLM å¯èªäž»è°çšæèœ - å端 SkillSelector æèœéæ©åšç»ä»¶ - REST API æ¯ææèœå衚ã诊æ ãåŒçšææ¡£æ¥è¯¢ **åœåå®æåºŠïŒ98%** ð ### ð§ è§åäžåèœ (v1.1 - v2.0) **v1.1 çæ¬ïŒè¿æïŒ** - ð æ¡ä»¶åæ¯èç¹ïŒIF/ELSE é»èŸïŒ - ð åŸªç¯æ§è¡èç¹ïŒFOR/WHILE 埪ç¯ïŒ - ð æŽå€ LLM èç¹æ¥å ¥ïŒClaudeãGeminiãæ¬å°æš¡åïŒ - ð§ æŽå€å 眮æèœïŒææ¡£æèŠã代ç 审æ¥ãæ°æ®åæçïŒ - ð§ª éææµè¯å®å - ð æ§è¡æ§èœçæ§ **v1.5 çæ¬ïŒäžæïŒ** - ð åå·¥äœæµè°çšïŒå·¥äœæµå€çšïŒ - â° å®æ¶ä»»å¡è°åºŠïŒCron 衚蟟åŒïŒ - ðŠ å·¥äœæµçæ¬ç®¡çïŒGit 飿 ŒïŒ - ðš å·¥äœæµæš¡æ¿åžåº - ðŒïž æŽå€å·¥å ·èç¹ïŒåŸåå€çãææ¡£è§£æãWebç¬è«ïŒ **v2.0 çæ¬ïŒè¿æïŒ** - ð¥ å€ç§æ·äžæé管ç - ð€ åäœäžå享åèœ - ð æ§èœçæ§äžåèŠ - ð åœé 忝æïŒå€è¯èšïŒ - ð æä»¶åžåºïŒç¬¬äžæ¹èç¹ïŒ ## ð é¡¹ç®ææ¡£ | ææ¡£ç±»å | ææ¡£éŸæ¥ | 诎æ | |---------|---------|------| | ð äœ¿çšæå | [USER_GUIDE.md](./USER_GUIDE.md) | 诊ç»äœ¿çšè¯Žæåæäœ³å®è·µ | | ð åŒåè¿åºŠ | [PROGRESS.md](./PROGRESS.md) | 项ç®åŒåé¶æ®µå宿æ åµ | | ð é¡¹ç®æ»ç» | [SUMMARY.md](./SUMMARY.md) | ææ¯éååå®ç°æ»ç» | | ð 宿æ¥å | [PROJECT_COMPLETION_REPORT.md](./PROJECT_COMPLETION_REPORT.md) | 项ç®äº€ä»æ¥å | | ðïž æ¶æè®Ÿè®¡ | [mermaid.md](./mermaid.md) | ç³»ç»æ¶æå¯è§ååŸè¡š | | ð€ åŒåæå | [AGENTS.md](./AGENTS.md) | AI Agent åŒåæåŒ | ## ð§ æ žå¿åèœè¯Šè§£ ### å·¥äœæµçŒæ **èç¹ç±»å** - **èŸå ¥èç¹**ïŒæ¥æ¶å€éšèŸå ¥æ°æ®ïŒäœäžºå·¥äœæµçèµ·ç¹ - **èŸåºèç¹**ïŒèŸåºå·¥äœæµæ§è¡ç»æïŒäœäžºå·¥äœæµçç»ç¹ - **LLM èç¹**ïŒè°çšå€§è¯èšæš¡åè¿è¡ææ¬çæãçè§£çä»»å¡ - **å·¥å ·èç¹**ïŒæ§è¡ç¹å®åèœïŒåŠ TTS è¯é³åæãåŸåå€çç **è¿çº¿è§å** - èç¹ä¹éŽéè¿æåèŸ¹è¿æ¥ïŒè¡šç€ºæ°æ®æµå - æ¯æäžå¯¹å€ãå€å¯¹äžçè¿æ¥æ¹åŒ - èªå𿣿µåŸªç¯äŸèµïŒé²æ¢æ»é ### DAG åŒææºå¶ **å·¥äœæµè§£ææµçš** 1. **JSON è§£æ**ïŒå°å端é 眮解æäžº WorkflowConfig 对象 2. **æææåº**ïŒäœ¿çš Kahn ç®æ³ç¡®å®èç¹æ§è¡é¡ºåº 3. **åŸªç¯æ£æµ**ïŒDFS 深床äŒå æçŽ¢æ£æµåŸªç¯äŸèµ 4. **èç¹è°åºŠ**ïŒæææé¡ºåºäŸæ¬¡æ§è¡èç¹ 5. **æ°æ®äŒ é**ïŒäžæžžèç¹èŸåºäœäžºäžæžžèç¹èŸå ¥ 6. **ç»æè®°åœ**ïŒä¿åæ¯äžªèç¹çæ§è¡ç»æåæ¥å¿ **æ°æ®äŒ éæºå¶** ```java // èç¹æ§è¡åšæ¥å£ public interface NodeExecutor { Map<String, Object> execute(WorkflowNode node, Map<String, Object> input); } // LLM èç¹éè¿ Spring AI ChatClient ç»äžè°çš ChatClient chatClient = chatClientFactory.createClient(nodeType, apiUrl, apiKey, model, temperature); String response = chatClient.prompt().user(prompt).call().content(); ``` ### LangGraph4j åŒææºå¶ **åŒæéæ©äžè·¯ç±** EngineSelector æ ¹æ®å·¥äœæµç `engineType` åæ®µèªåšéæ©æ§è¡åŒæïŒé»è®€äœ¿çš DAG åŒæä»¥ç¡®ä¿ååå Œå®¹ïŒ ```java // åŒæè·¯ç±ïŒæ ¹æ® engineType èªåšéæ© EngineSelector.execute(workflowConfig); // engineType = "dag" â DAGWorkflowEngine // engineType = "langgraph" â LangGraphWorkflowEngine // engineType = null â DAGWorkflowEngineïŒé»è®€ïŒ ``` **LangGraph4j æ§è¡æµçš** 1. **é 眮解æ**ïŒå° WorkflowConfig äŒ å ¥ GraphBuilder 2. **ç¶æåŸæå»º**ïŒGraphBuilder å°èç¹/蟹蜬æ¢äžº LangGraph4j StateGraphïŒæ¯ææ¡ä»¶åæ¯ 3. **ç¶æåå§å**ïŒStateManager åå§å inputDataãnodeOutputsãglobalContext 4. **åŒæ¥æ§è¡**ïŒNodeAdapter å°ç°æ NodeExecutor éé 䞺 AsyncNodeActionïŒå€çšå·²æäžå¡é»èŸ 5. **äºä»¶é©±åš**ïŒæ§è¡è¿çšè§Šå ExecutionEvent åè°ïŒstart / success / errorïŒ 6. **ç»ææ¶é**ïŒæ±æ»ææèç¹èŸåºïŒè¿å ExecutionResponse ### Skills æèœç³»ç»è¯Šè§£ **æèœæä»¶ç»æ** æ¯äžªæèœæ¯äžäžªç¬ç«ç®åœïŒå å« SKILL.md äž»æä»¶åå¯éç reference åç®åœïŒ ``` skills/ âââ ai-podcast/ âââ SKILL.md # æèœäž»æä»¶ïŒYAML Frontmatter + MarkdownïŒ âââ reference/ # åŒçšææ¡£ç®åœ âââ script-template.md # èæ¬æš¡æ¿ âââ voice-guide.md # è¯é³é£æ Œæå ``` **SKILL.md æ ŒåŒç€ºäŸ** ```yaml --- name: ai-podcast description: çæäžäžæå®¢èæ¬ïŒå人对è¯åœ¢åŒ --- # AI æå®¢èæ¬çæ ## æ§è¡è§å 1. çæèªç¶æµç çåäººå¯¹è¯ 2. å å«åŒåºçœãäž»äœå 容ãQ&Aãç»æè¯ ... ``` **äžçº§æžè¿åŒå 蜜** - **第äžçº§ - æèŠ**ïŒä» å 蜜æèœåç§°åæè¿°ïŒçšäºå衚å±ç€º - **第äºçº§ - 诊æ **ïŒå èœœå®æŽ SKILL.md å 容ïŒçšäºæèœæ§è¡ - **第äžçº§ - åŒçš**ïŒæéå 蜜 reference ç®åœäžçææ¡£ïŒèç Token åŒé **Skills REST API** | æ¹æ³ | è·¯åŸ | 诎æ | |------|------|------| | GET | `/api/skills` | è·åæææèœæèŠå衚 | | GET | `/api/skills/{name}` | è·åæå®æèœè¯Šç»å 容 | | GET | `/api/skills/{name}/references/{ref}` | è·åæèœåŒçšææ¡£ | ### èç¹æ©å±åŒå **æ¹åŒäžïŒåŒåæ®éå·¥å ·èç¹** 1. **å®ç° NodeExecutor æ¥å£** ```java public class CustomNodeExecutor implements NodeExecutor { @Override public Map<String, Object> execute(WorkflowNode node, Map<String, Object> input) { // èªå®ä¹é»èŸ return output; } } ``` 2. **泚åå°å·¥å** ```java NodeExecutorFactory.register("custom", new CustomNodeExecutor()); ``` **æ¹åŒäºïŒåŒå LLM èç¹ïŒæšèïŒ** ```java // ç»§æ¿ AbstractLLMNodeExecutorïŒèªåšè·åŸ Spring AI èœå @Component public class CustomLLMNodeExecutor extends AbstractLLMNodeExecutor { @Override protected String getNodeType() { return "custom_llm"; } } ``` 3. **å端添å èç¹å®ä¹** ```typescript const customNode = { type: 'custom', label: 'èªå®ä¹èç¹', category: 'tool' }; ``` ## ðŒ 项ç®äº®ç¹ïŒç®åçïŒ **项ç®åç§°**ïŒPaiAgent - äŒäžçº§ AI å·¥äœæµçŒæå¹³å° **é¡¹ç®æè¿°**ïŒåºäºå¯è§åæµçšçŒèŸåšç AI Agent å·¥äœæµå¹³å°ïŒæ¯æçšæ·éè¿ææœæ¹åŒçŒæå€ç§å€§æš¡åïŒDeepSeekãéä¹åé®çïŒåå·¥å ·èç¹ïŒäœ¿çšèªç DAG åŒææææé¡ºåºæ§è¡å·¥äœæµïŒå®ç°å€æ AI ä»»å¡çèªåšåçŒæäžæ§è¡ã **ææ¯æ **ïŒJava 21ãSpring Boot 3.4.1ãSpring AI 1.0.0ãLangGraph4j 1.8.0 **æ žå¿è莣**ïŒ - åºäº Spring AI æ¡æ¶éæ LLM éä¿¡å±ïŒéçšå·¥åæš¡åŒ+æš¡æ¿æ¹æ³æš¡åŒè®Ÿè®¡ ChatClientFactory åšæå·¥åå AbstractLLMNodeExecutor æœè±¡åºç±»ïŒå° 5 䞪 LLM èç¹æ§è¡åšçéå€ä»£ç ä» 800+è¡ç²Ÿç®è³ 75 è¡ - è®Ÿè®¡åšæ ChatClient å建æºå¶ïŒæ¯æè¿è¡æ¶æ ¹æ®å·¥äœæµèç¹é 眮ïŒapiKey/apiUrl/modelïŒåšæå®äŸåäžåååç ChatClientïŒå®ç°å€ç§æ·åºæ¯äžæ¯äžªèç¹ç¬ç«é 眮çèœå - æœå PromptTemplateService å ¬å ±æå¡ïŒç»äžå€ç `{{variable}}` æš¡æ¿åéæ¿æ¢åäžäžæžžèç¹åæ°åŒçšæ å°ïŒæ¯æ input éæåŒå reference åšæåŒçšäž€ç§åæ°ç±»å - åºäº Spring AI ç Flux ååºåŒæµå®ç° LLM æµåŒèŸåºïŒéè¿ SSE 宿¶æšéçæè¿åºŠå°å端ïŒé åç°æ ExecutionEvent äºä»¶æºå¶ïŒçšæ·å¯å®æ¶æ¥ç AI çæè¿çš - éæ LangGraph4j ç¶æåŸåŒæäœäžºç¬¬äºæ§è¡åŒæïŒè®Ÿè®¡ EngineSelector è·¯ç±æºå¶å®ç°ååŒææé忢ïŒéè¿ NodeAdapter éé åšæš¡åŒå°ç°æèç¹æ§è¡åšæ¡¥æ¥äžº AsyncNodeActionïŒé¶æ¹åšå€çšå šéšäžå¡é»èŸ - 讟计并å®ç° Skills æèœç³»ç»ïŒéçš YAML Frontmatter + Markdown 声æåŒå®ä¹æèœïŒäžçº§æžè¿åŒå èœœïŒæèŠâ诊æ âåŒçšææ¡£ïŒäŒå Token æ¶èïŒéè¿ Spring AI FunctionCallback æºå¶è®©å€§æš¡åèªäž»åç°åè°çšæèœ ## ð€ èŽ¡ç®æå æä»¬æ¬¢è¿ææåœ¢åŒç莡ç®ïŒå æ¬äœäžéäºïŒ - ð æäº€ Bug æ¥å - ð¡ æåºæ°åèœå»ºè®® - ð æ¹è¿ææ¡£ - ð§ æäº€ä»£ç ä¿®å€ - â Star é¡¹ç®æ¯ææä»¬ ### åäžæ¹åŒ 1. **Fork æ¬ä»åº** 2. **åå»ºç¹æ§åæ¯** (`git checkout -b feature/AmazingFeature`) 3. **æäº€æŽæ¹** (`git commit -m 'Add some AmazingFeature'`) 4. **æšéå°åæ¯** (`git push origin feature/AmazingFeature`) 5. **åŒå¯ Pull Request** ### 代ç è§è - **å端**ïŒéµåŸªé¿éå·Žå·Ž Java åŒåæå - **å端**ïŒéµåŸª Airbnb React/JSX 飿 Œæå - **æäº€ä¿¡æ¯**ïŒäœ¿çšçºŠå®åŒæäº€ïŒConventional CommitsïŒ ## ð¬ 瀟åºäžæ¯æ ### è·ååž®å© - ð¬ **GitHub Issues**ïŒ[é®é¢åéŠååèœå»ºè®®](https://github.com/yourusername/PaiAgent-one/issues) - ð **GitHub Discussions**ïŒ[ææ¯è®šè®ºåç»éªå享](https://github.com/yourusername/PaiAgent-one/discussions) - ð **宿¹ææ¡£**ïŒæ¥ç [USER_GUIDE.md](./USER_GUIDE.md) è·å宿Žäœ¿çšæå ### èç³»æ¹åŒ - **项ç®ç»Žæ€è **ïŒ[@itwanger](https://github.com/itwanger) - **é®ç®±**ïŒé¡¹ç®çžå ³é®é¢è¯·éè¿ GitHub Issues æäº€ ## ð 讞å¯è¯ æ¬é¡¹ç®éçš [MIT License](LICENSE) åŒæºåè®®ã ## ð èŽè°¢ æè°¢ææäžºæ¬é¡¹ç®ååºèŽ¡ç®çåŒåè ïŒ --- <div align="center"> **åŠæè¿äžªé¡¹ç®å¯¹æšæåž®å©ïŒè¯·ç¹å» â Star æ¯ææä»¬ïŒ** [⬠åå°é¡¶éš](#paiagent-one) </div>