tianxincode 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +201 -0
- package/README.md +57 -0
- package/dist/api/api.types.d.ts +350 -0
- package/dist/api/api.types.d.ts.map +1 -0
- package/dist/api/api.types.js +12 -0
- package/dist/api/api.types.js.map +1 -0
- package/dist/api/chat.routes.d.ts +26 -0
- package/dist/api/chat.routes.d.ts.map +1 -0
- package/dist/api/chat.routes.js +275 -0
- package/dist/api/chat.routes.js.map +1 -0
- package/dist/api/config.routes.d.ts +10 -0
- package/dist/api/config.routes.d.ts.map +1 -0
- package/dist/api/config.routes.js +150 -0
- package/dist/api/config.routes.js.map +1 -0
- package/dist/api/db.routes.d.ts +12 -0
- package/dist/api/db.routes.d.ts.map +1 -0
- package/dist/api/db.routes.js +108 -0
- package/dist/api/db.routes.js.map +1 -0
- package/dist/api/files.routes.d.ts +14 -0
- package/dist/api/files.routes.d.ts.map +1 -0
- package/dist/api/files.routes.js +220 -0
- package/dist/api/files.routes.js.map +1 -0
- package/dist/api/filesystem.routes.d.ts +10 -0
- package/dist/api/filesystem.routes.d.ts.map +1 -0
- package/dist/api/filesystem.routes.js +181 -0
- package/dist/api/filesystem.routes.js.map +1 -0
- package/dist/api/index.d.ts +6 -0
- package/dist/api/index.d.ts.map +1 -0
- package/dist/api/index.js +25 -0
- package/dist/api/index.js.map +1 -0
- package/dist/api/lsp.d.ts +5 -0
- package/dist/api/lsp.d.ts.map +1 -0
- package/dist/api/lsp.js +103 -0
- package/dist/api/lsp.js.map +1 -0
- package/dist/api/projects.routes.d.ts +18 -0
- package/dist/api/projects.routes.d.ts.map +1 -0
- package/dist/api/projects.routes.js +306 -0
- package/dist/api/projects.routes.js.map +1 -0
- package/dist/api/session.routes.d.ts +18 -0
- package/dist/api/session.routes.d.ts.map +1 -0
- package/dist/api/session.routes.js +186 -0
- package/dist/api/session.routes.js.map +1 -0
- package/dist/api/skills.routes.d.ts +6 -0
- package/dist/api/skills.routes.d.ts.map +1 -0
- package/dist/api/skills.routes.js +54 -0
- package/dist/api/skills.routes.js.map +1 -0
- package/dist/cli/args.d.ts +49 -0
- package/dist/cli/args.d.ts.map +1 -0
- package/dist/cli/args.js +77 -0
- package/dist/cli/args.js.map +1 -0
- package/dist/cli/cli.types.d.ts +22 -0
- package/dist/cli/cli.types.d.ts.map +1 -0
- package/dist/cli/cli.types.js +5 -0
- package/dist/cli/cli.types.js.map +1 -0
- package/dist/cli/commands.d.ts +30 -0
- package/dist/cli/commands.d.ts.map +1 -0
- package/dist/cli/commands.js +263 -0
- package/dist/cli/commands.js.map +1 -0
- package/dist/cli/index.d.ts +7 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +6 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/components/App.d.ts +34 -0
- package/dist/components/App.d.ts.map +1 -0
- package/dist/components/App.js +639 -0
- package/dist/components/App.js.map +1 -0
- package/dist/config/index.d.ts +2 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +2 -0
- package/dist/config/index.js.map +1 -0
- package/dist/config/tx.config.d.ts +31 -0
- package/dist/config/tx.config.d.ts.map +1 -0
- package/dist/config/tx.config.js +29 -0
- package/dist/config/tx.config.js.map +1 -0
- package/dist/index.d.ts +15 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +79 -0
- package/dist/index.js.map +1 -0
- package/dist/lsp/client.d.ts +55 -0
- package/dist/lsp/client.d.ts.map +1 -0
- package/dist/lsp/client.js +252 -0
- package/dist/lsp/client.js.map +1 -0
- package/dist/lsp/downloader.d.ts +17 -0
- package/dist/lsp/downloader.d.ts.map +1 -0
- package/dist/lsp/downloader.js +302 -0
- package/dist/lsp/downloader.js.map +1 -0
- package/dist/lsp/index.d.ts +13 -0
- package/dist/lsp/index.d.ts.map +1 -0
- package/dist/lsp/index.js +30 -0
- package/dist/lsp/index.js.map +1 -0
- package/dist/lsp/launch.d.ts +17 -0
- package/dist/lsp/launch.d.ts.map +1 -0
- package/dist/lsp/launch.js +69 -0
- package/dist/lsp/launch.js.map +1 -0
- package/dist/lsp/manager.d.ts +19 -0
- package/dist/lsp/manager.d.ts.map +1 -0
- package/dist/lsp/manager.js +251 -0
- package/dist/lsp/manager.js.map +1 -0
- package/dist/lsp/server.d.ts +11 -0
- package/dist/lsp/server.d.ts.map +1 -0
- package/dist/lsp/server.js +302 -0
- package/dist/lsp/server.js.map +1 -0
- package/dist/lsp/sql.d.ts +11 -0
- package/dist/lsp/sql.d.ts.map +1 -0
- package/dist/lsp/sql.js +23 -0
- package/dist/lsp/sql.js.map +1 -0
- package/dist/lsp/types.d.ts +58 -0
- package/dist/lsp/types.d.ts.map +1 -0
- package/dist/lsp/types.js +13 -0
- package/dist/lsp/types.js.map +1 -0
- package/dist/modules/ai/ai.service.d.ts +182 -0
- package/dist/modules/ai/ai.service.d.ts.map +1 -0
- package/dist/modules/ai/ai.service.js +280 -0
- package/dist/modules/ai/ai.service.js.map +1 -0
- package/dist/modules/ai/ai.types.d.ts +54 -0
- package/dist/modules/ai/ai.types.d.ts.map +1 -0
- package/dist/modules/ai/ai.types.js +2 -0
- package/dist/modules/ai/ai.types.js.map +1 -0
- package/dist/modules/ai/index.d.ts +6 -0
- package/dist/modules/ai/index.d.ts.map +1 -0
- package/dist/modules/ai/index.js +5 -0
- package/dist/modules/ai/index.js.map +1 -0
- package/dist/modules/ai/openai.provider.d.ts +138 -0
- package/dist/modules/ai/openai.provider.d.ts.map +1 -0
- package/dist/modules/ai/openai.provider.js +279 -0
- package/dist/modules/ai/openai.provider.js.map +1 -0
- package/dist/modules/ai/react/index.d.ts +5 -0
- package/dist/modules/ai/react/index.d.ts.map +1 -0
- package/dist/modules/ai/react/index.js +4 -0
- package/dist/modules/ai/react/index.js.map +1 -0
- package/dist/modules/ai/react/prompt/role.txt +51 -0
- package/dist/modules/ai/react/react.parser.d.ts +75 -0
- package/dist/modules/ai/react/react.parser.d.ts.map +1 -0
- package/dist/modules/ai/react/react.parser.js +278 -0
- package/dist/modules/ai/react/react.parser.js.map +1 -0
- package/dist/modules/ai/react/react.prompts.d.ts +26 -0
- package/dist/modules/ai/react/react.prompts.d.ts.map +1 -0
- package/dist/modules/ai/react/react.prompts.js +180 -0
- package/dist/modules/ai/react/react.prompts.js.map +1 -0
- package/dist/modules/ai/react/react.types.d.ts +47 -0
- package/dist/modules/ai/react/react.types.d.ts.map +1 -0
- package/dist/modules/ai/react/react.types.js +2 -0
- package/dist/modules/ai/react/react.types.js.map +1 -0
- package/dist/modules/ai/react.agent.d.ts +40 -0
- package/dist/modules/ai/react.agent.d.ts.map +1 -0
- package/dist/modules/ai/react.agent.js +136 -0
- package/dist/modules/ai/react.agent.js.map +1 -0
- package/dist/modules/ai/summarizer/index.d.ts +4 -0
- package/dist/modules/ai/summarizer/index.d.ts.map +1 -0
- package/dist/modules/ai/summarizer/index.js +3 -0
- package/dist/modules/ai/summarizer/index.js.map +1 -0
- package/dist/modules/ai/summarizer/summarizer.prompts.d.ts +15 -0
- package/dist/modules/ai/summarizer/summarizer.prompts.d.ts.map +1 -0
- package/dist/modules/ai/summarizer/summarizer.prompts.js +47 -0
- package/dist/modules/ai/summarizer/summarizer.prompts.js.map +1 -0
- package/dist/modules/ai/summarizer/summarizer.service.d.ts +24 -0
- package/dist/modules/ai/summarizer/summarizer.service.d.ts.map +1 -0
- package/dist/modules/ai/summarizer/summarizer.service.js +153 -0
- package/dist/modules/ai/summarizer/summarizer.service.js.map +1 -0
- package/dist/modules/ai/summarizer/summarizer.types.d.ts +21 -0
- package/dist/modules/ai/summarizer/summarizer.types.d.ts.map +1 -0
- package/dist/modules/ai/summarizer/summarizer.types.js +5 -0
- package/dist/modules/ai/summarizer/summarizer.types.js.map +1 -0
- package/dist/modules/config/config.service.d.ts +32 -0
- package/dist/modules/config/config.service.d.ts.map +1 -0
- package/dist/modules/config/config.service.js +163 -0
- package/dist/modules/config/config.service.js.map +1 -0
- package/dist/modules/config/config.types.d.ts +44 -0
- package/dist/modules/config/config.types.d.ts.map +1 -0
- package/dist/modules/config/config.types.js +21 -0
- package/dist/modules/config/config.types.js.map +1 -0
- package/dist/modules/config/index.d.ts +10 -0
- package/dist/modules/config/index.d.ts.map +1 -0
- package/dist/modules/config/index.js +10 -0
- package/dist/modules/config/index.js.map +1 -0
- package/dist/modules/context/context.service.d.ts +46 -0
- package/dist/modules/context/context.service.d.ts.map +1 -0
- package/dist/modules/context/context.service.js +216 -0
- package/dist/modules/context/context.service.js.map +1 -0
- package/dist/modules/context/context.types.d.ts +30 -0
- package/dist/modules/context/context.types.d.ts.map +1 -0
- package/dist/modules/context/context.types.js +5 -0
- package/dist/modules/context/context.types.js.map +1 -0
- package/dist/modules/context/index.d.ts +10 -0
- package/dist/modules/context/index.d.ts.map +1 -0
- package/dist/modules/context/index.js +10 -0
- package/dist/modules/context/index.js.map +1 -0
- package/dist/modules/db/db.service.d.ts +97 -0
- package/dist/modules/db/db.service.d.ts.map +1 -0
- package/dist/modules/db/db.service.js +387 -0
- package/dist/modules/db/db.service.js.map +1 -0
- package/dist/modules/db/db.types.d.ts +8 -0
- package/dist/modules/db/db.types.d.ts.map +1 -0
- package/dist/modules/db/db.types.js +7 -0
- package/dist/modules/db/db.types.js.map +1 -0
- package/dist/modules/db/index.d.ts +10 -0
- package/dist/modules/db/index.d.ts.map +1 -0
- package/dist/modules/db/index.js +9 -0
- package/dist/modules/db/index.js.map +1 -0
- package/dist/modules/logger/index.d.ts +2 -0
- package/dist/modules/logger/index.d.ts.map +1 -0
- package/dist/modules/logger/index.js +2 -0
- package/dist/modules/logger/index.js.map +1 -0
- package/dist/modules/logger/logger.d.ts +26 -0
- package/dist/modules/logger/logger.d.ts.map +1 -0
- package/dist/modules/logger/logger.js +57 -0
- package/dist/modules/logger/logger.js.map +1 -0
- package/dist/modules/memory/index.d.ts +9 -0
- package/dist/modules/memory/index.d.ts.map +1 -0
- package/dist/modules/memory/index.js +9 -0
- package/dist/modules/memory/index.js.map +1 -0
- package/dist/modules/memory/memory.service.d.ts +191 -0
- package/dist/modules/memory/memory.service.d.ts.map +1 -0
- package/dist/modules/memory/memory.service.js +282 -0
- package/dist/modules/memory/memory.service.js.map +1 -0
- package/dist/modules/memory/memory.types.d.ts +13 -0
- package/dist/modules/memory/memory.types.d.ts.map +1 -0
- package/dist/modules/memory/memory.types.js +5 -0
- package/dist/modules/memory/memory.types.js.map +1 -0
- package/dist/modules/session/index.d.ts +9 -0
- package/dist/modules/session/index.d.ts.map +1 -0
- package/dist/modules/session/index.js +9 -0
- package/dist/modules/session/index.js.map +1 -0
- package/dist/modules/session/session.service.d.ts +252 -0
- package/dist/modules/session/session.service.d.ts.map +1 -0
- package/dist/modules/session/session.service.js +406 -0
- package/dist/modules/session/session.service.js.map +1 -0
- package/dist/modules/session/session.types.d.ts +34 -0
- package/dist/modules/session/session.types.d.ts.map +1 -0
- package/dist/modules/session/session.types.js +5 -0
- package/dist/modules/session/session.types.js.map +1 -0
- package/dist/modules/skill/index.d.ts +8 -0
- package/dist/modules/skill/index.d.ts.map +1 -0
- package/dist/modules/skill/index.js +7 -0
- package/dist/modules/skill/index.js.map +1 -0
- package/dist/modules/skill/skill.service.d.ts +72 -0
- package/dist/modules/skill/skill.service.d.ts.map +1 -0
- package/dist/modules/skill/skill.service.js +283 -0
- package/dist/modules/skill/skill.service.js.map +1 -0
- package/dist/modules/skill/skill.tool.d.ts +19 -0
- package/dist/modules/skill/skill.tool.d.ts.map +1 -0
- package/dist/modules/skill/skill.tool.js +92 -0
- package/dist/modules/skill/skill.tool.js.map +1 -0
- package/dist/modules/skill/skill.txt +18 -0
- package/dist/modules/skill/skill.types.d.ts +40 -0
- package/dist/modules/skill/skill.types.d.ts.map +1 -0
- package/dist/modules/skill/skill.types.js +6 -0
- package/dist/modules/skill/skill.types.js.map +1 -0
- package/dist/modules/skill/skills.manager.d.ts +30 -0
- package/dist/modules/skill/skills.manager.d.ts.map +1 -0
- package/dist/modules/skill/skills.manager.js +182 -0
- package/dist/modules/skill/skills.manager.js.map +1 -0
- package/dist/modules/tools/builtin/bash.d.ts +3 -0
- package/dist/modules/tools/builtin/bash.d.ts.map +1 -0
- package/dist/modules/tools/builtin/bash.js +124 -0
- package/dist/modules/tools/builtin/bash.js.map +1 -0
- package/dist/modules/tools/builtin/bash.tool.d.ts +6 -0
- package/dist/modules/tools/builtin/bash.tool.d.ts.map +1 -0
- package/dist/modules/tools/builtin/bash.tool.js +52 -0
- package/dist/modules/tools/builtin/bash.tool.js.map +1 -0
- package/dist/modules/tools/builtin/bash.txt +81 -0
- package/dist/modules/tools/builtin/code_search.d.ts +3 -0
- package/dist/modules/tools/builtin/code_search.d.ts.map +1 -0
- package/dist/modules/tools/builtin/code_search.js +85 -0
- package/dist/modules/tools/builtin/code_search.js.map +1 -0
- package/dist/modules/tools/builtin/code_search.txt +18 -0
- package/dist/modules/tools/builtin/edit-file.tool.d.ts +6 -0
- package/dist/modules/tools/builtin/edit-file.tool.d.ts.map +1 -0
- package/dist/modules/tools/builtin/edit-file.tool.js +58 -0
- package/dist/modules/tools/builtin/edit-file.tool.js.map +1 -0
- package/dist/modules/tools/builtin/edit_file.d.ts +3 -0
- package/dist/modules/tools/builtin/edit_file.d.ts.map +1 -0
- package/dist/modules/tools/builtin/edit_file.js +69 -0
- package/dist/modules/tools/builtin/edit_file.js.map +1 -0
- package/dist/modules/tools/builtin/edit_file.txt +10 -0
- package/dist/modules/tools/builtin/glob.d.ts +3 -0
- package/dist/modules/tools/builtin/glob.d.ts.map +1 -0
- package/dist/modules/tools/builtin/glob.js +84 -0
- package/dist/modules/tools/builtin/glob.js.map +1 -0
- package/dist/modules/tools/builtin/glob.tool.d.ts +6 -0
- package/dist/modules/tools/builtin/glob.tool.d.ts.map +1 -0
- package/dist/modules/tools/builtin/glob.tool.js +81 -0
- package/dist/modules/tools/builtin/glob.tool.js.map +1 -0
- package/dist/modules/tools/builtin/glob.txt +10 -0
- package/dist/modules/tools/builtin/grep.d.ts +3 -0
- package/dist/modules/tools/builtin/grep.d.ts.map +1 -0
- package/dist/modules/tools/builtin/grep.js +93 -0
- package/dist/modules/tools/builtin/grep.js.map +1 -0
- package/dist/modules/tools/builtin/grep.tool.d.ts +6 -0
- package/dist/modules/tools/builtin/grep.tool.d.ts.map +1 -0
- package/dist/modules/tools/builtin/grep.tool.js +96 -0
- package/dist/modules/tools/builtin/grep.tool.js.map +1 -0
- package/dist/modules/tools/builtin/grep.txt +12 -0
- package/dist/modules/tools/builtin/index.d.ts +8 -0
- package/dist/modules/tools/builtin/index.d.ts.map +1 -0
- package/dist/modules/tools/builtin/index.js +88 -0
- package/dist/modules/tools/builtin/index.js.map +1 -0
- package/dist/modules/tools/builtin/lsp.d.ts +7 -0
- package/dist/modules/tools/builtin/lsp.d.ts.map +1 -0
- package/dist/modules/tools/builtin/lsp.js +125 -0
- package/dist/modules/tools/builtin/lsp.js.map +1 -0
- package/dist/modules/tools/builtin/lsp.txt +19 -0
- package/dist/modules/tools/builtin/memory.d.ts +3 -0
- package/dist/modules/tools/builtin/memory.d.ts.map +1 -0
- package/dist/modules/tools/builtin/memory.js +76 -0
- package/dist/modules/tools/builtin/memory.js.map +1 -0
- package/dist/modules/tools/builtin/memory.txt +36 -0
- package/dist/modules/tools/builtin/read-file.tool.d.ts +6 -0
- package/dist/modules/tools/builtin/read-file.tool.d.ts.map +1 -0
- package/dist/modules/tools/builtin/read-file.tool.js +46 -0
- package/dist/modules/tools/builtin/read-file.tool.js.map +1 -0
- package/dist/modules/tools/builtin/read_file.d.ts +3 -0
- package/dist/modules/tools/builtin/read_file.d.ts.map +1 -0
- package/dist/modules/tools/builtin/read_file.js +99 -0
- package/dist/modules/tools/builtin/read_file.js.map +1 -0
- package/dist/modules/tools/builtin/read_file.txt +15 -0
- package/dist/modules/tools/builtin/todo_read.d.ts +6 -0
- package/dist/modules/tools/builtin/todo_read.d.ts.map +1 -0
- package/dist/modules/tools/builtin/todo_read.js +24 -0
- package/dist/modules/tools/builtin/todo_read.js.map +1 -0
- package/dist/modules/tools/builtin/todo_read.txt +14 -0
- package/dist/modules/tools/builtin/todo_write.d.ts +6 -0
- package/dist/modules/tools/builtin/todo_write.d.ts.map +1 -0
- package/dist/modules/tools/builtin/todo_write.js +45 -0
- package/dist/modules/tools/builtin/todo_write.js.map +1 -0
- package/dist/modules/tools/builtin/todo_write.txt +46 -0
- package/dist/modules/tools/builtin/web_fetch.d.ts +3 -0
- package/dist/modules/tools/builtin/web_fetch.d.ts.map +1 -0
- package/dist/modules/tools/builtin/web_fetch.js +51 -0
- package/dist/modules/tools/builtin/web_fetch.js.map +1 -0
- package/dist/modules/tools/builtin/web_fetch.txt +15 -0
- package/dist/modules/tools/builtin/web_search.d.ts +3 -0
- package/dist/modules/tools/builtin/web_search.d.ts.map +1 -0
- package/dist/modules/tools/builtin/web_search.js +99 -0
- package/dist/modules/tools/builtin/web_search.js.map +1 -0
- package/dist/modules/tools/builtin/web_search.txt +16 -0
- package/dist/modules/tools/builtin/write-file.tool.d.ts +6 -0
- package/dist/modules/tools/builtin/write-file.tool.d.ts.map +1 -0
- package/dist/modules/tools/builtin/write-file.tool.js +38 -0
- package/dist/modules/tools/builtin/write-file.tool.js.map +1 -0
- package/dist/modules/tools/builtin/write_file.d.ts +3 -0
- package/dist/modules/tools/builtin/write_file.d.ts.map +1 -0
- package/dist/modules/tools/builtin/write_file.js +46 -0
- package/dist/modules/tools/builtin/write_file.js.map +1 -0
- package/dist/modules/tools/builtin/write_file.txt +9 -0
- package/dist/modules/tools/index.d.ts +11 -0
- package/dist/modules/tools/index.d.ts.map +1 -0
- package/dist/modules/tools/index.js +10 -0
- package/dist/modules/tools/index.js.map +1 -0
- package/dist/modules/tools/tool.service.d.ts +207 -0
- package/dist/modules/tools/tool.service.d.ts.map +1 -0
- package/dist/modules/tools/tool.service.js +331 -0
- package/dist/modules/tools/tool.service.js.map +1 -0
- package/dist/modules/tools/tool.types.d.ts +39 -0
- package/dist/modules/tools/tool.types.d.ts.map +1 -0
- package/dist/modules/tools/tool.types.js +5 -0
- package/dist/modules/tools/tool.types.js.map +1 -0
- package/dist/web/index.d.ts +10 -0
- package/dist/web/index.d.ts.map +1 -0
- package/dist/web/index.js +20 -0
- package/dist/web/index.js.map +1 -0
- package/dist/web/web.service.d.ts +95 -0
- package/dist/web/web.service.d.ts.map +1 -0
- package/dist/web/web.service.js +396 -0
- package/dist/web/web.service.js.map +1 -0
- package/package.json +57 -0
- package/web/dist/assets/Layout-Bb76CGAL.js +1 -0
- package/web/dist/assets/element-icons-B-tDfklg.woff +0 -0
- package/web/dist/assets/element-icons-_lZGOqcG.ttf +0 -0
- package/web/dist/assets/index-DQRR0ggU.js +199 -0
- package/web/dist/assets/index-KTH-myBB.css +1 -0
- package/web/dist/index.html +14 -0
- package/web/index.html +13 -0
- package/web/package.json +24 -0
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OpenAI Provider 模块
|
|
3
|
+
*
|
|
4
|
+
* 本模块负责与 OpenAI API (及兼容 API) 进行交互
|
|
5
|
+
*
|
|
6
|
+
* 核心功能:
|
|
7
|
+
* 1. chat() - 发送聊天请求,获取完整响应
|
|
8
|
+
* 2. chatStream() - 流式聊天,逐块获取响应
|
|
9
|
+
* 3. Tool Calls - 支持 AI 调用工具 (Function Calling)
|
|
10
|
+
*
|
|
11
|
+
* 支持的 AI 提供商:
|
|
12
|
+
* - OpenAI (GPT-4, GPT-3.5)
|
|
13
|
+
* - 兼容 OpenAI API 的其他提供商 (如 Anthropic Claude 通过适配器)
|
|
14
|
+
* - 自定义 API 端点 (通过 baseUrl 配置)
|
|
15
|
+
*
|
|
16
|
+
* 使用方式:
|
|
17
|
+
* const provider = new OpenAIProvider({
|
|
18
|
+
* apiKey: 'your-api-key',
|
|
19
|
+
* baseUrl: 'https://api.openai.com/v1',
|
|
20
|
+
* defaultModel: 'gpt-4'
|
|
21
|
+
* });
|
|
22
|
+
*
|
|
23
|
+
* const response = await provider.chat([
|
|
24
|
+
* { role: 'user', content: '你好' }
|
|
25
|
+
* ]);
|
|
26
|
+
*/
|
|
27
|
+
import { ChatMessage, ChatOptions, ChatResponse } from './ai.types.js';
|
|
28
|
+
/**
|
|
29
|
+
* OpenAI Provider 配置参数
|
|
30
|
+
*/
|
|
31
|
+
export interface OpenAIConfig {
|
|
32
|
+
/** API 密钥 */
|
|
33
|
+
apiKey: string;
|
|
34
|
+
/** API 基础 URL (可选,默认 OpenAI) */
|
|
35
|
+
baseUrl?: string;
|
|
36
|
+
/** 默认模型名称 (可选,默认 gpt-4) */
|
|
37
|
+
defaultModel?: string;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* OpenAIProvider 类
|
|
41
|
+
*
|
|
42
|
+
* 封装与 OpenAI API 的所有交互逻辑
|
|
43
|
+
* 使用原生 fetch API 发送请求
|
|
44
|
+
*
|
|
45
|
+
* API 端点:
|
|
46
|
+
* - POST /chat/completions - 聊天完成
|
|
47
|
+
*
|
|
48
|
+
* 请求格式:
|
|
49
|
+
* - model: 模型名称
|
|
50
|
+
* - messages: 消息数组
|
|
51
|
+
* - temperature: 温度参数 (0-2)
|
|
52
|
+
* - max_tokens: 最大 Token 数
|
|
53
|
+
* - tools: 工具定义数组 (可选)
|
|
54
|
+
* - tool_choice: 工具选择策略 (可选)
|
|
55
|
+
* - stream: 是否流式响应 (可选)
|
|
56
|
+
*/
|
|
57
|
+
export declare class OpenAIProvider {
|
|
58
|
+
/** API 密钥 */
|
|
59
|
+
private apiKey;
|
|
60
|
+
/** API 基础 URL */
|
|
61
|
+
private baseUrl;
|
|
62
|
+
/** 默认模型名称 */
|
|
63
|
+
private defaultModel;
|
|
64
|
+
/**
|
|
65
|
+
* 构造函数
|
|
66
|
+
*
|
|
67
|
+
* @param config - 配置对象
|
|
68
|
+
*
|
|
69
|
+
* baseUrl 默认值说明:
|
|
70
|
+
* - OpenAI: https://api.openai.com/v1
|
|
71
|
+
* - 本地部署: http://localhost:11434/v1 (Ollama)
|
|
72
|
+
* - 自定义: 用户配置的任意兼容 API 地址
|
|
73
|
+
*/
|
|
74
|
+
constructor(config: OpenAIConfig);
|
|
75
|
+
/**
|
|
76
|
+
* 发送聊天请求 (非流式)
|
|
77
|
+
*
|
|
78
|
+
* 将消息数组发送给 AI,获取完整的响应
|
|
79
|
+
* 支持 Tool Calls 功能
|
|
80
|
+
*
|
|
81
|
+
* 执行流程:
|
|
82
|
+
* 1. 构建请求体 (model, messages, temperature 等)
|
|
83
|
+
* 2. 如果有工具定义,添加到请求体
|
|
84
|
+
* 3. 发送 POST 请求到 /chat/completions
|
|
85
|
+
* 4. 解析响应,返回 ChatResponse
|
|
86
|
+
*
|
|
87
|
+
* @param messages - 消息数组,包含角色和内容
|
|
88
|
+
* @param options - 可选配置 (temperature, maxTokens, model, tools)
|
|
89
|
+
* @returns {Promise<ChatResponse>} AI 响应对象
|
|
90
|
+
*
|
|
91
|
+
* @example
|
|
92
|
+
* const response = await provider.chat([
|
|
93
|
+
* { role: 'system', content: '你是一个助手' },
|
|
94
|
+
* { role: 'user', content: '你好' }
|
|
95
|
+
* ]);
|
|
96
|
+
*
|
|
97
|
+
* console.log(response.content); // AI 的回复
|
|
98
|
+
* console.log(response.usage); // Token 使用量
|
|
99
|
+
*/
|
|
100
|
+
chat(messages: ChatMessage[], options?: ChatOptions): Promise<ChatResponse>;
|
|
101
|
+
/**
|
|
102
|
+
* 流式聊天
|
|
103
|
+
*
|
|
104
|
+
* 使用 Server-Sent Events (SSE) 流式获取 AI 响应
|
|
105
|
+
* 适用于需要实时展示 AI 回复的场景
|
|
106
|
+
*
|
|
107
|
+
* 实现原理:
|
|
108
|
+
* 1. 发送请求时设置 stream: true
|
|
109
|
+
* 2. 逐块读取响应体
|
|
110
|
+
* 3. 解析每个 SSE 消息块
|
|
111
|
+
* 4. yield 每个内容块给调用者
|
|
112
|
+
* 5. 直到收到 [DONE] 标记结束
|
|
113
|
+
*
|
|
114
|
+
* @param messages - 消息数组
|
|
115
|
+
* @param options - 可选配置
|
|
116
|
+
* @returns {AsyncGenerator<string>} 异步生成器,逐块返回内容
|
|
117
|
+
*/
|
|
118
|
+
chatStream(messages: ChatMessage[], options?: ChatOptions): AsyncGenerator<string, void, unknown>;
|
|
119
|
+
/**
|
|
120
|
+
* 格式化消息
|
|
121
|
+
*
|
|
122
|
+
* 将内部 ChatMessage 格式转换为 OpenAI API 格式
|
|
123
|
+
*
|
|
124
|
+
* @param message - 内部消息格式
|
|
125
|
+
* @returns {Record<string, any>} OpenAPI API 消息格式
|
|
126
|
+
*/
|
|
127
|
+
private formatMessage;
|
|
128
|
+
/**
|
|
129
|
+
* 解析 API 响应
|
|
130
|
+
*
|
|
131
|
+
* 将 OpenAI API 响应转换为内部 ChatResponse 格式
|
|
132
|
+
*
|
|
133
|
+
* @param data - OpenAI API 响应数据
|
|
134
|
+
* @returns {ChatResponse} 内部响应格式
|
|
135
|
+
*/
|
|
136
|
+
private parseResponse;
|
|
137
|
+
}
|
|
138
|
+
//# sourceMappingURL=openai.provider.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"openai.provider.d.ts","sourceRoot":"","sources":["../../../src/modules/ai/openai.provider.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAEH,OAAO,EACL,WAAW,EACX,WAAW,EACX,YAAY,EAGb,MAAM,eAAe,CAAC;AAGvB;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,aAAa;IACb,MAAM,EAAE,MAAM,CAAC;IACf,gCAAgC;IAChC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,2BAA2B;IAC3B,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,qBAAa,cAAc;IACzB,aAAa;IACb,OAAO,CAAC,MAAM,CAAS;IACvB,iBAAiB;IACjB,OAAO,CAAC,OAAO,CAAS;IACxB,aAAa;IACb,OAAO,CAAC,YAAY,CAAS;IAE7B;;;;;;;;;OASG;gBACS,MAAM,EAAE,YAAY;IAMhC;;;;;;;;;;;;;;;;;;;;;;;;OAwBG;IACG,IAAI,CACR,QAAQ,EAAE,WAAW,EAAE,EACvB,OAAO,GAAE,WAAgB,GACxB,OAAO,CAAC,YAAY,CAAC;IA0DxB;;;;;;;;;;;;;;;;OAgBG;IACI,UAAU,CACf,QAAQ,EAAE,WAAW,EAAE,EACvB,OAAO,GAAE,WAAgB,GACxB,cAAc,CAAC,MAAM,EAAE,IAAI,EAAE,OAAO,CAAC;IAqFxC;;;;;;;OAOG;IACH,OAAO,CAAC,aAAa;IAcrB;;;;;;;OAOG;IACH,OAAO,CAAC,aAAa;CA+BtB"}
|
|
@@ -0,0 +1,279 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OpenAI Provider 模块
|
|
3
|
+
*
|
|
4
|
+
* 本模块负责与 OpenAI API (及兼容 API) 进行交互
|
|
5
|
+
*
|
|
6
|
+
* 核心功能:
|
|
7
|
+
* 1. chat() - 发送聊天请求,获取完整响应
|
|
8
|
+
* 2. chatStream() - 流式聊天,逐块获取响应
|
|
9
|
+
* 3. Tool Calls - 支持 AI 调用工具 (Function Calling)
|
|
10
|
+
*
|
|
11
|
+
* 支持的 AI 提供商:
|
|
12
|
+
* - OpenAI (GPT-4, GPT-3.5)
|
|
13
|
+
* - 兼容 OpenAI API 的其他提供商 (如 Anthropic Claude 通过适配器)
|
|
14
|
+
* - 自定义 API 端点 (通过 baseUrl 配置)
|
|
15
|
+
*
|
|
16
|
+
* 使用方式:
|
|
17
|
+
* const provider = new OpenAIProvider({
|
|
18
|
+
* apiKey: 'your-api-key',
|
|
19
|
+
* baseUrl: 'https://api.openai.com/v1',
|
|
20
|
+
* defaultModel: 'gpt-4'
|
|
21
|
+
* });
|
|
22
|
+
*
|
|
23
|
+
* const response = await provider.chat([
|
|
24
|
+
* { role: 'user', content: '你好' }
|
|
25
|
+
* ]);
|
|
26
|
+
*/
|
|
27
|
+
import { logger } from '../logger/index.js';
|
|
28
|
+
/**
|
|
29
|
+
* OpenAIProvider 类
|
|
30
|
+
*
|
|
31
|
+
* 封装与 OpenAI API 的所有交互逻辑
|
|
32
|
+
* 使用原生 fetch API 发送请求
|
|
33
|
+
*
|
|
34
|
+
* API 端点:
|
|
35
|
+
* - POST /chat/completions - 聊天完成
|
|
36
|
+
*
|
|
37
|
+
* 请求格式:
|
|
38
|
+
* - model: 模型名称
|
|
39
|
+
* - messages: 消息数组
|
|
40
|
+
* - temperature: 温度参数 (0-2)
|
|
41
|
+
* - max_tokens: 最大 Token 数
|
|
42
|
+
* - tools: 工具定义数组 (可选)
|
|
43
|
+
* - tool_choice: 工具选择策略 (可选)
|
|
44
|
+
* - stream: 是否流式响应 (可选)
|
|
45
|
+
*/
|
|
46
|
+
export class OpenAIProvider {
|
|
47
|
+
/**
|
|
48
|
+
* 构造函数
|
|
49
|
+
*
|
|
50
|
+
* @param config - 配置对象
|
|
51
|
+
*
|
|
52
|
+
* baseUrl 默认值说明:
|
|
53
|
+
* - OpenAI: https://api.openai.com/v1
|
|
54
|
+
* - 本地部署: http://localhost:11434/v1 (Ollama)
|
|
55
|
+
* - 自定义: 用户配置的任意兼容 API 地址
|
|
56
|
+
*/
|
|
57
|
+
constructor(config) {
|
|
58
|
+
this.apiKey = config.apiKey;
|
|
59
|
+
this.baseUrl = config.baseUrl || 'https://api.openai.com/v1';
|
|
60
|
+
this.defaultModel = config.defaultModel || 'gpt-4';
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* 发送聊天请求 (非流式)
|
|
64
|
+
*
|
|
65
|
+
* 将消息数组发送给 AI,获取完整的响应
|
|
66
|
+
* 支持 Tool Calls 功能
|
|
67
|
+
*
|
|
68
|
+
* 执行流程:
|
|
69
|
+
* 1. 构建请求体 (model, messages, temperature 等)
|
|
70
|
+
* 2. 如果有工具定义,添加到请求体
|
|
71
|
+
* 3. 发送 POST 请求到 /chat/completions
|
|
72
|
+
* 4. 解析响应,返回 ChatResponse
|
|
73
|
+
*
|
|
74
|
+
* @param messages - 消息数组,包含角色和内容
|
|
75
|
+
* @param options - 可选配置 (temperature, maxTokens, model, tools)
|
|
76
|
+
* @returns {Promise<ChatResponse>} AI 响应对象
|
|
77
|
+
*
|
|
78
|
+
* @example
|
|
79
|
+
* const response = await provider.chat([
|
|
80
|
+
* { role: 'system', content: '你是一个助手' },
|
|
81
|
+
* { role: 'user', content: '你好' }
|
|
82
|
+
* ]);
|
|
83
|
+
*
|
|
84
|
+
* console.log(response.content); // AI 的回复
|
|
85
|
+
* console.log(response.usage); // Token 使用量
|
|
86
|
+
*/
|
|
87
|
+
async chat(messages, options = {}) {
|
|
88
|
+
// ========== 提取配置参数 ==========
|
|
89
|
+
// 使用提供的值或默认值
|
|
90
|
+
const { temperature = 0.7, // 温度:控制生成随机性,0-2 之间
|
|
91
|
+
maxTokens = 2000, // 最大 Token 数
|
|
92
|
+
model = this.defaultModel, // 模型名称
|
|
93
|
+
tools, // 工具定义数组 (可选)
|
|
94
|
+
} = options;
|
|
95
|
+
// ========== 构建请求体 ==========
|
|
96
|
+
const requestBody = {
|
|
97
|
+
model,
|
|
98
|
+
messages: messages.map(m => this.formatMessage(m)), // 格式化每条消息
|
|
99
|
+
temperature,
|
|
100
|
+
max_tokens: maxTokens,
|
|
101
|
+
};
|
|
102
|
+
// ========== 添加工具定义 ==========
|
|
103
|
+
// 如果提供了工具,AI 可以选择调用工具
|
|
104
|
+
if (tools && tools.length > 0) {
|
|
105
|
+
requestBody.tools = tools;
|
|
106
|
+
requestBody.tool_choice = 'auto'; // 让 AI 自动决定是否调用工具
|
|
107
|
+
}
|
|
108
|
+
// ========== 发送请求 ==========
|
|
109
|
+
// 完整的 API 端点: {baseUrl}/chat/completions
|
|
110
|
+
const url = `${this.baseUrl}/chat/completions`;
|
|
111
|
+
// 记录请求日志 (调试用)
|
|
112
|
+
logger.logRequest(url, requestBody);
|
|
113
|
+
// 使用 fetch 发送 POST 请求
|
|
114
|
+
const response = await fetch(url, {
|
|
115
|
+
method: 'POST',
|
|
116
|
+
headers: {
|
|
117
|
+
'Content-Type': 'application/json',
|
|
118
|
+
Authorization: `Bearer ${this.apiKey}`, // Bearer Token 认证
|
|
119
|
+
},
|
|
120
|
+
body: JSON.stringify(requestBody),
|
|
121
|
+
});
|
|
122
|
+
// ========== 错误处理 ==========
|
|
123
|
+
if (!response.ok) {
|
|
124
|
+
const error = await response.text();
|
|
125
|
+
throw new Error(`OpenAI API error: ${response.status} - ${error}`);
|
|
126
|
+
}
|
|
127
|
+
// ========== 解析响应 ==========
|
|
128
|
+
const data = (await response.json());
|
|
129
|
+
// 记录响应日志
|
|
130
|
+
logger.logResponse(url, data);
|
|
131
|
+
// 转换为内部格式并返回
|
|
132
|
+
return this.parseResponse(data);
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* 流式聊天
|
|
136
|
+
*
|
|
137
|
+
* 使用 Server-Sent Events (SSE) 流式获取 AI 响应
|
|
138
|
+
* 适用于需要实时展示 AI 回复的场景
|
|
139
|
+
*
|
|
140
|
+
* 实现原理:
|
|
141
|
+
* 1. 发送请求时设置 stream: true
|
|
142
|
+
* 2. 逐块读取响应体
|
|
143
|
+
* 3. 解析每个 SSE 消息块
|
|
144
|
+
* 4. yield 每个内容块给调用者
|
|
145
|
+
* 5. 直到收到 [DONE] 标记结束
|
|
146
|
+
*
|
|
147
|
+
* @param messages - 消息数组
|
|
148
|
+
* @param options - 可选配置
|
|
149
|
+
* @returns {AsyncGenerator<string>} 异步生成器,逐块返回内容
|
|
150
|
+
*/
|
|
151
|
+
async *chatStream(messages, options = {}) {
|
|
152
|
+
const { temperature = 0.7, maxTokens = 2000, model = this.defaultModel, } = options;
|
|
153
|
+
// 构建请求体,设置 stream: true
|
|
154
|
+
const url = `${this.baseUrl}/chat/completions`;
|
|
155
|
+
const requestBody = {
|
|
156
|
+
model,
|
|
157
|
+
messages: messages.map(m => this.formatMessage(m)),
|
|
158
|
+
temperature,
|
|
159
|
+
max_tokens: maxTokens,
|
|
160
|
+
stream: true, // 关键:启用流式响应
|
|
161
|
+
};
|
|
162
|
+
logger.logRequest(url, requestBody);
|
|
163
|
+
const response = await fetch(url, {
|
|
164
|
+
method: 'POST',
|
|
165
|
+
headers: {
|
|
166
|
+
'Content-Type': 'application/json',
|
|
167
|
+
Authorization: `Bearer ${this.apiKey}`,
|
|
168
|
+
},
|
|
169
|
+
body: JSON.stringify(requestBody),
|
|
170
|
+
});
|
|
171
|
+
if (!response.ok) {
|
|
172
|
+
throw new Error(`OpenAI API error: ${response.status}`);
|
|
173
|
+
}
|
|
174
|
+
// ========== 获取响应流 ==========
|
|
175
|
+
// response.body 是一个 ReadableStream
|
|
176
|
+
const reader = response.body?.getReader();
|
|
177
|
+
if (!reader)
|
|
178
|
+
throw new Error('No response body');
|
|
179
|
+
const decoder = new TextDecoder(); // 解码二进制数据
|
|
180
|
+
let buffer = ''; // 缓冲区,存储未处理的数据
|
|
181
|
+
const streamData = []; // 存储所有响应数据 (日志用)
|
|
182
|
+
// ========== 循环读取流数据 ==========
|
|
183
|
+
while (true) {
|
|
184
|
+
// 读取一块数据
|
|
185
|
+
const { done, value } = await reader.read();
|
|
186
|
+
if (done)
|
|
187
|
+
break; // 流已结束
|
|
188
|
+
// 解码并追加到缓冲区
|
|
189
|
+
buffer += decoder.decode(value, { stream: true });
|
|
190
|
+
// 按行分割
|
|
191
|
+
const lines = buffer.split('\n');
|
|
192
|
+
buffer = lines.pop() || ''; // 保留最后一行 (可能不完整)
|
|
193
|
+
// ========== 处理每一行 ==========
|
|
194
|
+
for (const line of lines) {
|
|
195
|
+
const trimmed = line.trim();
|
|
196
|
+
// SSE 格式: data: {...}
|
|
197
|
+
if (trimmed.startsWith('data: ')) {
|
|
198
|
+
const data = trimmed.slice(6); // 去掉 'data: ' 前缀
|
|
199
|
+
streamData.push(data);
|
|
200
|
+
// ========== 检查结束标记 ==========
|
|
201
|
+
if (data === '[DONE]') {
|
|
202
|
+
logger.logResponse(url, streamData);
|
|
203
|
+
return; // 流式响应结束
|
|
204
|
+
}
|
|
205
|
+
// ========== 解析并 yield 内容 ==========
|
|
206
|
+
try {
|
|
207
|
+
const parsed = JSON.parse(data);
|
|
208
|
+
// OpenAI 流式响应的格式: choices[0].delta.content
|
|
209
|
+
const content = parsed.choices?.[0]?.delta?.content;
|
|
210
|
+
if (content) {
|
|
211
|
+
yield content; // 返回内容块
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
catch { }
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
logger.logResponse(url, streamData);
|
|
219
|
+
}
|
|
220
|
+
/**
|
|
221
|
+
* 格式化消息
|
|
222
|
+
*
|
|
223
|
+
* 将内部 ChatMessage 格式转换为 OpenAI API 格式
|
|
224
|
+
*
|
|
225
|
+
* @param message - 内部消息格式
|
|
226
|
+
* @returns {Record<string, any>} OpenAPI API 消息格式
|
|
227
|
+
*/
|
|
228
|
+
formatMessage(message) {
|
|
229
|
+
const formatted = {
|
|
230
|
+
role: message.role,
|
|
231
|
+
content: message.content,
|
|
232
|
+
};
|
|
233
|
+
// 添加可选字段
|
|
234
|
+
if (message.name)
|
|
235
|
+
formatted.name = message.name;
|
|
236
|
+
if (message.toolCallId)
|
|
237
|
+
formatted.tool_call_id = message.toolCallId;
|
|
238
|
+
if (message.toolCalls)
|
|
239
|
+
formatted.tool_calls = message.toolCalls;
|
|
240
|
+
return formatted;
|
|
241
|
+
}
|
|
242
|
+
/**
|
|
243
|
+
* 解析 API 响应
|
|
244
|
+
*
|
|
245
|
+
* 将 OpenAI API 响应转换为内部 ChatResponse 格式
|
|
246
|
+
*
|
|
247
|
+
* @param data - OpenAI API 响应数据
|
|
248
|
+
* @returns {ChatResponse} 内部响应格式
|
|
249
|
+
*/
|
|
250
|
+
parseResponse(data) {
|
|
251
|
+
// 获取第一个 choice (通常只有一个)
|
|
252
|
+
const choice = data.choices[0];
|
|
253
|
+
const message = choice.message;
|
|
254
|
+
// 构建响应对象
|
|
255
|
+
const response = {
|
|
256
|
+
content: message.content || '', // AI 回复内容
|
|
257
|
+
finishReason: choice.finish_reason, // 结束原因
|
|
258
|
+
usage: data.usage ? {
|
|
259
|
+
promptTokens: data.usage.prompt_tokens,
|
|
260
|
+
completionTokens: data.usage.completion_tokens,
|
|
261
|
+
totalTokens: data.usage.total_tokens,
|
|
262
|
+
} : undefined,
|
|
263
|
+
};
|
|
264
|
+
// ========== 处理工具调用 ==========
|
|
265
|
+
// 如果 AI 调用了工具,解析工具调用信息
|
|
266
|
+
if (message.tool_calls && message.tool_calls.length > 0) {
|
|
267
|
+
response.toolCalls = message.tool_calls.map((tc) => ({
|
|
268
|
+
id: tc.id, // 工具调用 ID
|
|
269
|
+
type: 'function', // 调用类型
|
|
270
|
+
function: {
|
|
271
|
+
name: tc.function.name, // 工具名称
|
|
272
|
+
arguments: tc.function.arguments, // 工具参数 (JSON 字符串)
|
|
273
|
+
},
|
|
274
|
+
}));
|
|
275
|
+
}
|
|
276
|
+
return response;
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
//# sourceMappingURL=openai.provider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"openai.provider.js","sourceRoot":"","sources":["../../../src/modules/ai/openai.provider.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AASH,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAc5C;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,OAAO,cAAc;IAQzB;;;;;;;;;OASG;IACH,YAAY,MAAoB;QAC9B,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;QAC5B,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC,OAAO,IAAI,2BAA2B,CAAC;QAC7D,IAAI,CAAC,YAAY,GAAG,MAAM,CAAC,YAAY,IAAI,OAAO,CAAC;IACrD,CAAC;IAED;;;;;;;;;;;;;;;;;;;;;;;;OAwBG;IACH,KAAK,CAAC,IAAI,CACR,QAAuB,EACvB,UAAuB,EAAE;QAEzB,+BAA+B;QAC/B,aAAa;QACb,MAAM,EACJ,WAAW,GAAG,GAAG,EAAK,oBAAoB;QAC1C,SAAS,GAAG,IAAI,EAAM,aAAa;QACnC,KAAK,GAAG,IAAI,CAAC,YAAY,EAAG,OAAO;QACnC,KAAK,EAAiB,cAAc;UACrC,GAAG,OAAO,CAAC;QAEZ,8BAA8B;QAC9B,MAAM,WAAW,GAAwB;YACvC,KAAK;YACL,QAAQ,EAAE,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,EAAG,UAAU;YAC/D,WAAW;YACX,UAAU,EAAE,SAAS;SACtB,CAAC;QAEF,+BAA+B;QAC/B,sBAAsB;QACtB,IAAI,KAAK,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC9B,WAAW,CAAC,KAAK,GAAG,KAAK,CAAC;YAC1B,WAAW,CAAC,WAAW,GAAG,MAAM,CAAC,CAAE,kBAAkB;QACvD,CAAC;QAED,6BAA6B;QAC7B,yCAAyC;QACzC,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC,OAAO,mBAAmB,CAAC;QAE/C,eAAe;QACf,MAAM,CAAC,UAAU,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC;QAEpC,sBAAsB;QACtB,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;YAChC,MAAM,EAAE,MAAM;YACd,OAAO,EAAE;gBACP,cAAc,EAAE,kBAAkB;gBAClC,aAAa,EAAE,UAAU,IAAI,CAAC,MAAM,EAAE,EAAG,kBAAkB;aAC5D;YACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC;SAClC,CAAC,CAAC;QAEH,6BAA6B;QAC7B,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,MAAM,KAAK,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;YACpC,MAAM,IAAI,KAAK,CAAC,qBAAqB,QAAQ,CAAC,MAAM,MAAM,KAAK,EAAE,CAAC,CAAC;QACrE,CAAC;QAED,6BAA6B;QAC7B,MAAM,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAmB,CAAC;QAEvD,SAAS;QACT,MAAM,CAAC,WAAW,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;QAE9B,aAAa;QACb,OAAO,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;IAClC,CAAC;IAED;;;;;;;;;;;;;;;;OAgBG;IACH,KAAK,CAAC,CAAC,UAAU,CACf,QAAuB,EACvB,UAAuB,EAAE;QAEzB,MAAM,EACJ,WAAW,GAAG,GAAG,EACjB,SAAS,GAAG,IAAI,EAChB,KAAK,GAAG,IAAI,CAAC,YAAY,GAC1B,GAAG,OAAO,CAAC;QAEZ,wBAAwB;QACxB,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC,OAAO,mBAAmB,CAAC;QAC/C,MAAM,WAAW,GAAG;YAClB,KAAK;YACL,QAAQ,EAAE,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC;YAClD,WAAW;YACX,UAAU,EAAE,SAAS;YACrB,MAAM,EAAE,IAAI,EAAG,YAAY;SAC5B,CAAC;QAEF,MAAM,CAAC,UAAU,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC;QAEpC,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;YAChC,MAAM,EAAE,MAAM;YACd,OAAO,EAAE;gBACP,cAAc,EAAE,kBAAkB;gBAClC,aAAa,EAAE,UAAU,IAAI,CAAC,MAAM,EAAE;aACvC;YACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC;SAClC,CAAC,CAAC;QAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,MAAM,IAAI,KAAK,CAAC,qBAAqB,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;QAC1D,CAAC;QAED,8BAA8B;QAC9B,mCAAmC;QACnC,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,EAAE,SAAS,EAAE,CAAC;QAC1C,IAAI,CAAC,MAAM;YAAE,MAAM,IAAI,KAAK,CAAC,kBAAkB,CAAC,CAAC;QAEjD,MAAM,OAAO,GAAG,IAAI,WAAW,EAAE,CAAC,CAAE,UAAU;QAC9C,IAAI,MAAM,GAAG,EAAE,CAAC,CAAoB,eAAe;QACnD,MAAM,UAAU,GAAa,EAAE,CAAC,CAAI,iBAAiB;QAErD,gCAAgC;QAChC,OAAO,IAAI,EAAE,CAAC;YACZ,SAAS;YACT,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC;YAC5C,IAAI,IAAI;gBAAE,MAAM,CAAE,OAAO;YAEzB,YAAY;YACZ,MAAM,IAAI,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;YAElD,OAAO;YACP,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YACjC,MAAM,GAAG,KAAK,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,CAAE,iBAAiB;YAE9C,8BAA8B;YAC9B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;gBACzB,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;gBAE5B,sBAAsB;gBACtB,IAAI,OAAO,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;oBACjC,MAAM,IAAI,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAE,iBAAiB;oBACjD,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;oBAEtB,+BAA+B;oBAC/B,IAAI,IAAI,KAAK,QAAQ,EAAE,CAAC;wBACtB,MAAM,CAAC,WAAW,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC;wBACpC,OAAO,CAAE,SAAS;oBACpB,CAAC;oBAED,qCAAqC;oBACrC,IAAI,CAAC;wBACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;wBAChC,2CAA2C;wBAC3C,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC;wBACpD,IAAI,OAAO,EAAE,CAAC;4BACZ,MAAM,OAAO,CAAC,CAAE,QAAQ;wBAC1B,CAAC;oBACH,CAAC;oBAAC,MAAM,CAAC,CAAA,CAAC;gBACZ,CAAC;YACH,CAAC;QACH,CAAC;QAED,MAAM,CAAC,WAAW,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC;IACtC,CAAC;IAED;;;;;;;OAOG;IACK,aAAa,CAAC,OAAoB;QACxC,MAAM,SAAS,GAAwB;YACrC,IAAI,EAAE,OAAO,CAAC,IAAI;YAClB,OAAO,EAAE,OAAO,CAAC,OAAO;SACzB,CAAC;QAEF,SAAS;QACT,IAAI,OAAO,CAAC,IAAI;YAAE,SAAS,CAAC,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;QAChD,IAAI,OAAO,CAAC,UAAU;YAAE,SAAS,CAAC,YAAY,GAAG,OAAO,CAAC,UAAU,CAAC;QACpE,IAAI,OAAO,CAAC,SAAS;YAAE,SAAS,CAAC,UAAU,GAAG,OAAO,CAAC,SAAS,CAAC;QAEhE,OAAO,SAAS,CAAC;IACnB,CAAC;IAED;;;;;;;OAOG;IACK,aAAa,CAAC,IAAoB;QACxC,wBAAwB;QACxB,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QAC/B,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC;QAE/B,SAAS;QACT,MAAM,QAAQ,GAAiB;YAC7B,OAAO,EAAE,OAAO,CAAC,OAAO,IAAI,EAAE,EAAqB,UAAU;YAC7D,YAAY,EAAE,MAAM,CAAC,aAAiD,EAAG,OAAO;YAChF,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;gBAClB,YAAY,EAAE,IAAI,CAAC,KAAK,CAAC,aAAa;gBACtC,gBAAgB,EAAE,IAAI,CAAC,KAAK,CAAC,iBAAiB;gBAC9C,WAAW,EAAE,IAAI,CAAC,KAAK,CAAC,YAAY;aACrC,CAAC,CAAC,CAAC,SAAS;SACd,CAAC;QAEF,+BAA+B;QAC/B,uBAAuB;QACvB,IAAI,OAAO,CAAC,UAAU,IAAI,OAAO,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACxD,QAAQ,CAAC,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,EAAO,EAAE,EAAE,CAAC,CAAC;gBACxD,EAAE,EAAE,EAAE,CAAC,EAAE,EAAuB,UAAU;gBAC1C,IAAI,EAAE,UAAmB,EAAO,OAAO;gBACvC,QAAQ,EAAE;oBACR,IAAI,EAAE,EAAE,CAAC,QAAQ,CAAC,IAAI,EAAQ,OAAO;oBACrC,SAAS,EAAE,EAAE,CAAC,QAAQ,CAAC,SAAS,EAAG,kBAAkB;iBACtD;aACF,CAAC,CAAC,CAAC;QACN,CAAC;QAED,OAAO,QAAQ,CAAC;IAClB,CAAC;CACF"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export { reactParser } from './react.parser.js';
|
|
2
|
+
export { buildReActPrompt } from './react.prompts.js';
|
|
3
|
+
export { ReActParser } from './react.parser.js';
|
|
4
|
+
export type { ToolDefinition, ReActStep, ReActResult, ParsedBlock, SkillInfo, ToolParameterProperty, ToolParameters } from './react.types.js';
|
|
5
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/modules/ai/react/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,YAAY,EACV,cAAc,EACd,SAAS,EACT,WAAW,EACX,WAAW,EACX,SAAS,EACT,qBAAqB,EACrB,cAAc,EACf,MAAM,kBAAkB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/modules/ai/react/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
你是 txcode,一个帮助用户完成软件工程任务的交互式命令行工具。按照以下说明和可用工具来协助用户。
|
|
2
|
+
|
|
3
|
+
如果用户寻求帮助或想提供反馈,请告知他们:
|
|
4
|
+
/help:获取使用 txcode 的帮助
|
|
5
|
+
如需提供反馈,请在 https://gitee.com/homecommunity/txcode 提交问题
|
|
6
|
+
|
|
7
|
+
## 语气和风格
|
|
8
|
+
你应该简洁、直接、切中要点。请记住,你的输出将显示在命令行界面上。你的回复可以使用 GitHub 风格的 markdown 进行格式化,并将使用 CommonMark 规范以等宽字体呈现。
|
|
9
|
+
除非用户明确要求,否则不要使用表情符号。除非被要求,否则在所有交流中避免使用表情符号。
|
|
10
|
+
重要:在保持帮助性、质量和准确性的前提下,你应该尽可能减少输出标记。仅处理当前的特定查询或任务,除非对完成请求至关重要,否则避免无关信息。如果你能用1-3句话或一个简短的段落回答,请这样做。
|
|
11
|
+
重要:除非用户要求,否则你不应添加不必要的开场白或结束语(例如解释你的代码或总结你的操作)。
|
|
12
|
+
重要:保持回复简短,因为它们将显示在命令行界面上。除非用户要求详细说明,否则你的回答必须简洁,少于4行文本(不包括工具使用或代码生成)。直接回答用户的问题,无需阐述、解释或细节。
|
|
13
|
+
|
|
14
|
+
## 主动性
|
|
15
|
+
你可以主动行事,但仅限于用户要求你这样做。你应该努力在以下两点之间取得平衡:
|
|
16
|
+
1、在被要求时做正确的事,包括采取行动和后续行动
|
|
17
|
+
2、不要未经询问就采取行动让用户感到意外
|
|
18
|
+
例如,如果用户询问你如何处理某事,你应该首先尽力回答他们的问题,而不是立即采取行动。
|
|
19
|
+
3、除非用户要求,否则不要添加额外的代码解释总结。处理完文件后,直接停止,不要解释你做了什么。
|
|
20
|
+
|
|
21
|
+
## 遵循惯例
|
|
22
|
+
在修改文件时,首先要了解文件的代码惯例。模仿代码风格,使用现有的库和实用程序,并遵循现有模式。
|
|
23
|
+
·绝对不要假设某个库可用,即使它是众所周知的。每当你编写使用库或框架的代码时,首先要检查此代码库是否已使用该库。例如,你可以查看相邻文件,或检查 package.json(或 cargo.toml,等等,具体取决于语言)。
|
|
24
|
+
·当你创建新组件时,首先查看现有组件以了解它们的编写方式;然后考虑框架选择、命名约定、类型和其他约定。
|
|
25
|
+
·当你编辑一段代码时,首先查看代码的周围上下文(特别是其导入语句),以了解代码选择的框架和库。然后考虑如何以最符合惯用法的方式进行给定的更改。
|
|
26
|
+
始终遵循安全最佳实践。切勿引入暴露或记录机密和密钥的代码。切勿将机密或密钥提交到代码库。
|
|
27
|
+
|
|
28
|
+
## 代码风格
|
|
29
|
+
重要:除非被要求,否则不要添加 任何 注释
|
|
30
|
+
|
|
31
|
+
## 执行任务
|
|
32
|
+
用户主要会要求你执行软件工程任务。这包括解决错误、添加新功能、重构代码、解释代码等等。对于这些任务,建议遵循以下步骤:
|
|
33
|
+
·推荐检查AGENT.md了解项目(如果存在),然后使用查询记忆的工具查询有没有相关记忆,再根据SKILL有没有可用的SKILL
|
|
34
|
+
·使用可用的搜索工具来理解代码库和用户的查询。建议广泛并行和串行地使用搜索工具。
|
|
35
|
+
·使用你所有可用的工具来实现解决方案
|
|
36
|
+
·如果可能,通过测试验证解决方案。绝对不要假设特定的测试框架或测试脚本。查看 README 或搜索代码库以确定测试方法。
|
|
37
|
+
·非常重要:当你完成任务后,如果提供了 lint 和类型检查命令(例如 npm run lint、npm run typecheck、ruff 等),你必须使用 Bash 运行它们,以确保你的代码正确。如果你找不到正确的命令,请询问用户要运行的命令,如果他们提供了,主动建议将其写入 AGENTS.md,以便你下次知道要运行它。
|
|
38
|
+
·除非用户明确要求,否则绝对不要提交更改。非常重要,仅在明确要求时才提交,否则用户会觉得你过于主动。
|
|
39
|
+
|
|
40
|
+
## 工具使用策略
|
|
41
|
+
你可以在单个响应中调用多个工具。当请求多个独立信息时,请将你的工具调用组合在一起以获得最佳性能。当进行多个 bash 工具调用时,你必须发送一条包含多个工具调用的消息以并行运行这些调用。例如,如果你需要运行“git status”和“git diff”,请发送一条包含两个工具调用的消息以并行运行这些调用。
|
|
42
|
+
你必须简洁地回答,文本少于 4 行(不包括工具使用或代码生成),除非用户要求详细信息。
|
|
43
|
+
重要:在开始工作之前,根据文件名和目录结构思考你要编辑的代码应该做什么。
|
|
44
|
+
|
|
45
|
+
## 代码引用
|
|
46
|
+
在引用特定函数或代码片段时,请包含 file_path:line_number 格式的模式,以便用户轻松导航到源代码位置。
|
|
47
|
+
<example> 用户:客户端的错误在哪里处理? 助手:客户端在 `src/services/process.ts:712` 的 `connectToServer` 函数中被标记为失败。 </example>
|
|
48
|
+
|
|
49
|
+
## 运行环境
|
|
50
|
+
- 操作系统: {platform}
|
|
51
|
+
- 工作目录: {workdir}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ReAct 响应解析器
|
|
3
|
+
*
|
|
4
|
+
* 本模块负责解析 AI 返回的文本内容
|
|
5
|
+
* AI 返回的是包含 Thought、Action、Observation 等字段的文本
|
|
6
|
+
* 需要从中提取出结构化的步骤信息
|
|
7
|
+
*
|
|
8
|
+
* 解析流程:
|
|
9
|
+
* 1. splitBlocks() - 按 "---" 分隔符分割文本为多个块
|
|
10
|
+
* 2. 识别每块的类型:
|
|
11
|
+
* - content: 大文本内容 (用于占位符替换)
|
|
12
|
+
* - step: 步骤块 (包含 thought, action, action_input, final_answer 等)
|
|
13
|
+
* - observation: 观察结果块
|
|
14
|
+
* 3. replacePlaceholders() - 替换占位符 (如 $content:1)
|
|
15
|
+
* 4. 返回结构化的 steps 数组和 finalAnswer
|
|
16
|
+
*
|
|
17
|
+
* AI 输出格式示例(XML):
|
|
18
|
+
* ```xml
|
|
19
|
+
* <react>
|
|
20
|
+
* <thought>我需要读取文件</thought>
|
|
21
|
+
* <action>readFile</action>
|
|
22
|
+
* <action_input>
|
|
23
|
+
* <path>/path/to/file</path>
|
|
24
|
+
* </action_input>
|
|
25
|
+
* <keep_context>true</keep_context>
|
|
26
|
+
* </react>
|
|
27
|
+
* ---
|
|
28
|
+
* <react>
|
|
29
|
+
* <thought>需要创建一个组件</thought>
|
|
30
|
+
* <action>write_file</action>
|
|
31
|
+
* <action_input>
|
|
32
|
+
* <path>src/Hello.tsx</path>
|
|
33
|
+
* <content><![CDATA[import React from 'react';]]></content>
|
|
34
|
+
* </action_input>
|
|
35
|
+
* </react>
|
|
36
|
+
* ---
|
|
37
|
+
* Tool Result:
|
|
38
|
+
* ---
|
|
39
|
+
* 观察结果
|
|
40
|
+
* ---
|
|
41
|
+
* ```
|
|
42
|
+
*/
|
|
43
|
+
import { ReActStep } from './react.types.js';
|
|
44
|
+
/**
|
|
45
|
+
* ReActParser 类
|
|
46
|
+
*
|
|
47
|
+
* 将 AI 返回的文本解析为结构化的 ReActStep 数组
|
|
48
|
+
*/
|
|
49
|
+
export declare class ReActParser {
|
|
50
|
+
parse(content: string): {
|
|
51
|
+
steps: ReActStep[];
|
|
52
|
+
finalAnswer: string;
|
|
53
|
+
};
|
|
54
|
+
private splitBlocks;
|
|
55
|
+
/**
|
|
56
|
+
* 解析 XML 格式的块
|
|
57
|
+
*/
|
|
58
|
+
private parseXMLBlock;
|
|
59
|
+
/**
|
|
60
|
+
* 解析 XML 参数节点
|
|
61
|
+
*/
|
|
62
|
+
private parseXMLParams;
|
|
63
|
+
/**
|
|
64
|
+
* 从 XML 内容中提取纯文本,处理 CDATA
|
|
65
|
+
*/
|
|
66
|
+
private extractCDATAOrText;
|
|
67
|
+
private replacePlaceholders;
|
|
68
|
+
private isEncodedContent;
|
|
69
|
+
private decodeContent;
|
|
70
|
+
hasFinalAnswer(steps: ReActStep[]): boolean;
|
|
71
|
+
formatObservation(observation: any): string;
|
|
72
|
+
buildObservationResponse(observation: any): string;
|
|
73
|
+
}
|
|
74
|
+
export declare const reactParser: ReActParser;
|
|
75
|
+
//# sourceMappingURL=react.parser.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"react.parser.d.ts","sourceRoot":"","sources":["../../../../src/modules/ai/react/react.parser.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAyCG;AAEH,OAAO,EAAE,SAAS,EAAe,MAAM,kBAAkB,CAAC;AAE1D;;;;GAIG;AACH,qBAAa,WAAW;IACtB,KAAK,CAAC,OAAO,EAAE,MAAM,GAAG;QAAE,KAAK,EAAE,SAAS,EAAE,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE;IAwCnE,OAAO,CAAC,WAAW;IAsDnB;;OAEG;IACH,OAAO,CAAC,aAAa;IA0CrB;;OAEG;IACH,OAAO,CAAC,cAAc;IAgBtB;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAS1B,OAAO,CAAC,mBAAmB;IAgC3B,OAAO,CAAC,gBAAgB;IAWxB,OAAO,CAAC,aAAa;IAUrB,cAAc,CAAC,KAAK,EAAE,SAAS,EAAE,GAAG,OAAO;IAI3C,iBAAiB,CAAC,WAAW,EAAE,GAAG,GAAG,MAAM;IAO3C,wBAAwB,CAAC,WAAW,EAAE,GAAG,GAAG,MAAM;CAUnD;AAED,eAAO,MAAM,WAAW,aAAoB,CAAC"}
|