@agentunion/kite 1.3.2 → 1.5.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.
Files changed (293) hide show
  1. package/CHANGELOG.md +302 -0
  2. package/cli.js +119 -4
  3. package/core/dependency_checker.py +250 -0
  4. package/core/env_checker.py +490 -0
  5. package/dependencies_lock.json +128 -0
  6. package/extensions/agents/assistant/entry.py +111 -1
  7. package/extensions/agents/assistant/server.py +279 -215
  8. package/extensions/channels/acp_channel/entry.py +111 -1
  9. package/extensions/channels/acp_channel/module.md +23 -22
  10. package/extensions/channels/acp_channel/server.py +279 -215
  11. package/extensions/event_hub_bench/entry.py +107 -1
  12. package/extensions/services/backup/entry.py +306 -21
  13. package/extensions/services/backup/module.md +24 -22
  14. package/extensions/services/evol/auth_manager.py +443 -0
  15. package/extensions/services/evol/config.yaml +149 -0
  16. package/extensions/services/evol/config_loader.py +117 -0
  17. package/extensions/services/evol/entry.py +406 -0
  18. package/extensions/services/evol/evol_api.py +173 -0
  19. package/extensions/services/evol/evol_config.json5 +29 -0
  20. package/extensions/services/evol/migrate_tokens.py +122 -0
  21. package/extensions/services/evol/module.md +32 -0
  22. package/extensions/services/evol/pairing.py +250 -0
  23. package/extensions/services/evol/pairing_codes.jsonl +1 -0
  24. package/extensions/services/evol/relay.py +682 -0
  25. package/extensions/services/evol/relay_config.json5 +67 -0
  26. package/extensions/services/evol/routes/__init__.py +1 -0
  27. package/extensions/services/evol/routes/routes_management_ws.py +127 -0
  28. package/extensions/services/evol/routes/routes_rpc.py +89 -0
  29. package/extensions/services/evol/routes/routes_test.py +61 -0
  30. package/extensions/services/evol/server.py +875 -0
  31. package/extensions/services/evol/static/css/style.css +1200 -0
  32. package/extensions/services/evol/static/index.html +781 -0
  33. package/extensions/services/evol/static/index_evol.html +14 -0
  34. package/extensions/services/evol/static/js/app.js +6304 -0
  35. package/extensions/services/evol/static/js/auth.js +326 -0
  36. package/extensions/services/evol/static/js/dialog.js +285 -0
  37. package/extensions/services/evol/static/js/evol-app-fixed.js +50 -0
  38. package/extensions/services/evol/static/js/evol-app.js +1949 -0
  39. package/extensions/services/evol/static/js/evol-app.js.bak +1800 -0
  40. package/extensions/services/evol/static/js/kernel-client-example.js +228 -0
  41. package/extensions/services/evol/static/js/kernel-client.js +396 -0
  42. package/extensions/services/evol/static/js/main.js +141 -0
  43. package/extensions/services/evol/static/js/registry-tests.js +585 -0
  44. package/extensions/services/evol/static/js/stats.js +217 -0
  45. package/extensions/services/evol/static/js/token-manager.js +175 -0
  46. package/extensions/services/evol/static/pairing.html +248 -0
  47. package/extensions/services/evol/static/test_registry.html +262 -0
  48. package/extensions/services/evol/static/test_relay.html +462 -0
  49. package/extensions/services/evol/stats_manager.py +240 -0
  50. package/extensions/services/model_service/entry.py +167 -19
  51. package/extensions/services/model_service/module.md +21 -22
  52. package/extensions/services/proxy/.claude/settings.local.json +13 -0
  53. package/extensions/services/proxy/CHANGELOG_20260308.md +258 -0
  54. package/extensions/services/proxy/_fix_prints.py +133 -0
  55. package/extensions/services/proxy/_fix_prints2.py +87 -0
  56. package/extensions/services/proxy/agentcp/LICENCE +178 -0
  57. package/extensions/services/proxy/agentcp/README copy.md +85 -0
  58. package/extensions/services/proxy/agentcp/README.md +260 -0
  59. package/extensions/services/proxy/agentcp/__init__.py +16 -0
  60. package/extensions/services/proxy/agentcp/agent.py +4 -0
  61. package/extensions/services/proxy/agentcp/agentcp.py +2494 -0
  62. package/extensions/services/proxy/agentcp/agentprofile.json +89 -0
  63. package/extensions/services/proxy/agentcp/ap/__init__.py +16 -0
  64. package/extensions/services/proxy/agentcp/ap/ap_client.py +316 -0
  65. package/extensions/services/proxy/agentcp/assets/images/wechat_qr.png +0 -0
  66. package/extensions/services/proxy/agentcp/backup/metrics.json +31 -0
  67. package/extensions/services/proxy/agentcp/base/__init__.py +20 -0
  68. package/extensions/services/proxy/agentcp/base/auth_client.py +257 -0
  69. package/extensions/services/proxy/agentcp/base/client.py +112 -0
  70. package/extensions/services/proxy/agentcp/base/env.py +34 -0
  71. package/extensions/services/proxy/agentcp/base/html_util.py +336 -0
  72. package/extensions/services/proxy/agentcp/base/log.py +98 -0
  73. package/extensions/services/proxy/agentcp/ca/__init__.py +17 -0
  74. package/extensions/services/proxy/agentcp/ca/ca_client.py +414 -0
  75. package/extensions/services/proxy/agentcp/ca/ca_root.py +74 -0
  76. package/extensions/services/proxy/agentcp/context/__init__.py +20 -0
  77. package/extensions/services/proxy/agentcp/context/context.py +73 -0
  78. package/extensions/services/proxy/agentcp/context/exceptions.py +114 -0
  79. package/extensions/services/proxy/agentcp/create_profile.py +125 -0
  80. package/extensions/services/proxy/agentcp/create_profile_weather.py +125 -0
  81. package/extensions/services/proxy/agentcp/db/__init__.py +15 -0
  82. package/extensions/services/proxy/agentcp/db/db_mananger.py +550 -0
  83. package/extensions/services/proxy/agentcp/docs/UDP_HEARTBEAT_FIX_REPORT.md +265 -0
  84. package/extensions/services/proxy/agentcp/docs/heartbeat_issue_analysis.md +291 -0
  85. package/extensions/services/proxy/agentcp/file/__init__.py +16 -0
  86. package/extensions/services/proxy/agentcp/file/file_client.py +141 -0
  87. package/extensions/services/proxy/agentcp/file/wss_binary_message.py +137 -0
  88. package/extensions/services/proxy/agentcp/hcp.py +299 -0
  89. package/extensions/services/proxy/agentcp/heartbeat/__init__.py +16 -0
  90. package/extensions/services/proxy/agentcp/heartbeat/heartbeat_client.py +360 -0
  91. package/extensions/services/proxy/agentcp/improved_scheduler.py +498 -0
  92. package/extensions/services/proxy/agentcp/llm_agent_utils.py +249 -0
  93. package/extensions/services/proxy/agentcp/llm_server.py +172 -0
  94. package/extensions/services/proxy/agentcp/mermaid.py +210 -0
  95. package/extensions/services/proxy/agentcp/message.py +149 -0
  96. package/extensions/services/proxy/agentcp/metrics.py +256 -0
  97. package/extensions/services/proxy/agentcp/monitoring/__init__.py +20 -0
  98. package/extensions/services/proxy/agentcp/monitoring/global_monitor.py +27 -0
  99. package/extensions/services/proxy/agentcp/monitoring/metrics_store.py +325 -0
  100. package/extensions/services/proxy/agentcp/monitoring/monitoring_service.py +269 -0
  101. package/extensions/services/proxy/agentcp/monitoring/sliding_window.py +222 -0
  102. package/extensions/services/proxy/agentcp/monitoring/standalone_reader.py +224 -0
  103. package/extensions/services/proxy/agentcp/msg/__init__.py +21 -0
  104. package/extensions/services/proxy/agentcp/msg/connection_manager.py +456 -0
  105. package/extensions/services/proxy/agentcp/msg/message_client.py +2058 -0
  106. package/extensions/services/proxy/agentcp/msg/message_serialize.py +263 -0
  107. package/extensions/services/proxy/agentcp/msg/open_ai_message.py +88 -0
  108. package/extensions/services/proxy/agentcp/msg/session_manager.py +1062 -0
  109. package/extensions/services/proxy/agentcp/msg/stream_client.py +267 -0
  110. package/extensions/services/proxy/agentcp/msg/websocket_file_receiver.py +89 -0
  111. package/extensions/services/proxy/agentcp/msg/ws_logger.py +685 -0
  112. package/extensions/services/proxy/agentcp/msg/wss_binary_message.py +137 -0
  113. package/extensions/services/proxy/agentcp/requirements.txt +7 -0
  114. package/extensions/services/proxy/agentcp/samples/agent_graph/README.md +37 -0
  115. package/extensions/services/proxy/agentcp/samples/agent_graph/agentprofile.json +89 -0
  116. package/extensions/services/proxy/agentcp/samples/agent_graph/create_profile.py +138 -0
  117. package/extensions/services/proxy/agentcp/samples/agent_graph/main.py +164 -0
  118. package/extensions/services/proxy/agentcp/samples/agent_use/create_profile.py +123 -0
  119. package/extensions/services/proxy/agentcp/samples/agent_use/llm/create_profile.py +129 -0
  120. package/extensions/services/proxy/agentcp/samples/agent_use/llm/env.json +5 -0
  121. package/extensions/services/proxy/agentcp/samples/agent_use/llm/main.py +146 -0
  122. package/extensions/services/proxy/agentcp/samples/agent_use/main.py +123 -0
  123. package/extensions/services/proxy/agentcp/samples/agent_use/readme.md +379 -0
  124. package/extensions/services/proxy/agentcp/samples/agent_use/search/create_profile.py +129 -0
  125. package/extensions/services/proxy/agentcp/samples/agent_use/search/main.py +28 -0
  126. package/extensions/services/proxy/agentcp/samples/agent_use/tool/create_profile.py +129 -0
  127. package/extensions/services/proxy/agentcp/samples/agent_use/tool/main.py +20 -0
  128. package/extensions/services/proxy/agentcp/samples/ali_amap/README.md +97 -0
  129. package/extensions/services/proxy/agentcp/samples/ali_amap/amap_agent.py +88 -0
  130. package/extensions/services/proxy/agentcp/samples/ali_amap/create_profile.py +125 -0
  131. package/extensions/services/proxy/agentcp/samples/compute_agent/agent/powershell.py +228 -0
  132. package/extensions/services/proxy/agentcp/samples/compute_agent/agent/software.py +63 -0
  133. package/extensions/services/proxy/agentcp/samples/compute_agent/agent/tools.py +36 -0
  134. package/extensions/services/proxy/agentcp/samples/compute_agent/browser_user.py +41 -0
  135. package/extensions/services/proxy/agentcp/samples/deepseek/README.md +79 -0
  136. package/extensions/services/proxy/agentcp/samples/deepseek/create_profile.py +126 -0
  137. package/extensions/services/proxy/agentcp/samples/deepseek/deepseek.py +42 -0
  138. package/extensions/services/proxy/agentcp/samples/dify_chat/README.md +78 -0
  139. package/extensions/services/proxy/agentcp/samples/dify_chat/create_profile.py +126 -0
  140. package/extensions/services/proxy/agentcp/samples/dify_chat/dify_chat.py +47 -0
  141. package/extensions/services/proxy/agentcp/samples/dify_workflow/README.md +78 -0
  142. package/extensions/services/proxy/agentcp/samples/dify_workflow/create_profile.py +126 -0
  143. package/extensions/services/proxy/agentcp/samples/dify_workflow/dify_workflow.py +46 -0
  144. package/extensions/services/proxy/agentcp/samples/executor/README.md +44 -0
  145. package/extensions/services/proxy/agentcp/samples/executor/agentprofile.json +89 -0
  146. package/extensions/services/proxy/agentcp/samples/executor/create_profile.py +139 -0
  147. package/extensions/services/proxy/agentcp/samples/executor/main.py +160 -0
  148. package/extensions/services/proxy/agentcp/samples/filereader/README.md +45 -0
  149. package/extensions/services/proxy/agentcp/samples/filereader/agentprofile.json +90 -0
  150. package/extensions/services/proxy/agentcp/samples/filereader/create_profile.py +137 -0
  151. package/extensions/services/proxy/agentcp/samples/filereader/main.py +253 -0
  152. package/extensions/services/proxy/agentcp/samples/filewriter/README.md +38 -0
  153. package/extensions/services/proxy/agentcp/samples/filewriter/agentprofile.json +91 -0
  154. package/extensions/services/proxy/agentcp/samples/filewriter/create_profile.py +138 -0
  155. package/extensions/services/proxy/agentcp/samples/filewriter/main.py +289 -0
  156. package/extensions/services/proxy/agentcp/samples/hcp/README.md +85 -0
  157. package/extensions/services/proxy/agentcp/samples/hcp/acp_weather_agent.zip +0 -0
  158. package/extensions/services/proxy/agentcp/samples/hcp/create_profile.py +125 -0
  159. package/extensions/services/proxy/agentcp/samples/hcp/hcp.py +237 -0
  160. package/extensions/services/proxy/agentcp/samples/helloworld/README.md +68 -0
  161. package/extensions/services/proxy/agentcp/samples/helloworld/hello_world.py +40 -0
  162. package/extensions/services/proxy/agentcp/samples/llm_agent/MEADME.md +117 -0
  163. package/extensions/services/proxy/agentcp/samples/llm_agent/create_profile.py +125 -0
  164. package/extensions/services/proxy/agentcp/samples/llm_agent/qwen_agent.py +136 -0
  165. package/extensions/services/proxy/agentcp/samples/local_llm_agent/README.md +90 -0
  166. package/extensions/services/proxy/agentcp/samples/local_llm_agent/create_profile.py +125 -0
  167. package/extensions/services/proxy/agentcp/samples/local_llm_agent/main.py +49 -0
  168. package/extensions/services/proxy/agentcp/samples/query_llm_from_agent/README.md +55 -0
  169. package/extensions/services/proxy/agentcp/samples/query_llm_from_agent/create_profile.py +125 -0
  170. package/extensions/services/proxy/agentcp/samples/query_llm_from_agent/main.py +23 -0
  171. package/extensions/services/proxy/agentcp/samples/query_weather_api_agent/README.md +103 -0
  172. package/extensions/services/proxy/agentcp/samples/query_weather_api_agent/create_profile.py +125 -0
  173. package/extensions/services/proxy/agentcp/samples/query_weather_api_agent/main.py +69 -0
  174. package/extensions/services/proxy/agentcp/samples/query_weather_from_agent/README.md +58 -0
  175. package/extensions/services/proxy/agentcp/samples/query_weather_from_agent/create_profile.py +125 -0
  176. package/extensions/services/proxy/agentcp/samples/query_weather_from_agent/main.py +25 -0
  177. package/extensions/services/proxy/agentcp/samples/qwen3/README.md +71 -0
  178. package/extensions/services/proxy/agentcp/samples/qwen3/create_profile.py +126 -0
  179. package/extensions/services/proxy/agentcp/samples/qwen3/qwen3.py +37 -0
  180. package/extensions/services/proxy/agentcp/samples/qwen3_tools/README.md +133 -0
  181. package/extensions/services/proxy/agentcp/samples/qwen3_tools/create_profile.py +126 -0
  182. package/extensions/services/proxy/agentcp/samples/qwen3_tools/qwen3_tools.py +98 -0
  183. package/extensions/services/proxy/agentcp/samples/search/create_profile_qwen.py +125 -0
  184. package/extensions/services/proxy/agentcp/samples/search/create_profile_search.py +125 -0
  185. package/extensions/services/proxy/agentcp/samples/search/qwen_agent.py +136 -0
  186. package/extensions/services/proxy/agentcp/samples/search/search_agent.py +170 -0
  187. package/extensions/services/proxy/agentcp/samples/wrapper_agently_to_agent/README.md +89 -0
  188. package/extensions/services/proxy/agentcp/samples/wrapper_agently_to_agent/create_profile.py +125 -0
  189. package/extensions/services/proxy/agentcp/samples/wrapper_agently_to_agent/main.py +44 -0
  190. package/extensions/services/proxy/agentcp/utils/__init__.py +15 -0
  191. package/extensions/services/proxy/agentcp/utils/file_util.py +117 -0
  192. package/extensions/services/proxy/agentcp/utils/proxy_bypass.py +99 -0
  193. package/extensions/services/proxy/agentcp/workflow.py +203 -0
  194. package/extensions/services/proxy/console_auth.py +109 -0
  195. package/extensions/services/proxy/evol/__init__.py +1 -0
  196. package/extensions/services/proxy/evol/config.py +37 -0
  197. package/extensions/services/proxy/evol/http/__init__.py +1 -0
  198. package/extensions/services/proxy/evol/http/async_http.py +551 -0
  199. package/extensions/services/proxy/evol/log.py +28 -0
  200. package/extensions/services/proxy/evol/presenter/__init__.py +2 -0
  201. package/extensions/services/proxy/evol/presenter/agentIdPresenter.py +1031 -0
  202. package/extensions/services/proxy/evol/presenter/apikeyPresenter.py +106 -0
  203. package/extensions/services/proxy/evol/presenter/configPresenter.py +1281 -0
  204. package/extensions/services/proxy/evol/presenter/userPresenter.py +477 -0
  205. package/extensions/services/proxy/evol/server/__init__.py +1 -0
  206. package/extensions/services/proxy/evol/server/claude_proxy_async.py +3430 -0
  207. package/extensions/services/proxy/evol/server/openclaw_proxy.py +1861 -0
  208. package/extensions/services/proxy/evol/server/proxy_config.py +15 -0
  209. package/extensions/services/proxy/evol/server/proxy_engine.py +501 -0
  210. package/extensions/services/proxy/evol/version.py +24 -0
  211. package/extensions/services/proxy/logs/websocket.log +260 -0
  212. package/extensions/services/proxy/main.py +240 -0
  213. package/extensions/services/proxy/requirements.txt +13 -0
  214. package/extensions/services/proxy/server.py +271 -0
  215. package/extensions/services/watchdog/entry.py +215 -26
  216. package/extensions/services/watchdog/module.md +1 -0
  217. package/extensions/services/watchdog/monitor.py +178 -38
  218. package/extensions/services/web/WEBSOCKET_STATUS.md +143 -0
  219. package/extensions/services/web/config_example.py +35 -0
  220. package/extensions/services/web/config_loader.py +110 -0
  221. package/extensions/services/web/entry.py +114 -26
  222. package/extensions/services/web/module.md +35 -24
  223. package/extensions/services/web/pairing.py +250 -0
  224. package/extensions/services/web/pairing_codes.jsonl +16 -0
  225. package/extensions/services/web/relay.py +643 -0
  226. package/extensions/services/web/relay_config.json5 +67 -0
  227. package/extensions/services/web/routes/routes_management_ws.py +127 -0
  228. package/extensions/services/web/routes/routes_rpc.py +89 -0
  229. package/extensions/services/web/routes/routes_test.py +61 -0
  230. package/extensions/services/web/routes/schemas.py +0 -22
  231. package/extensions/services/web/server.py +434 -99
  232. package/extensions/services/web/static/css/style.css +67 -28
  233. package/extensions/services/web/static/index.html +234 -44
  234. package/extensions/services/web/static/js/app.js +1335 -48
  235. package/extensions/services/web/static/js/kernel-client-example.js +161 -0
  236. package/extensions/services/web/static/js/kernel-client.js +383 -0
  237. package/extensions/services/web/static/js/registry-tests.js +558 -0
  238. package/extensions/services/web/static/js/token-manager.js +175 -0
  239. package/extensions/services/web/static/pairing.html +248 -0
  240. package/extensions/services/web/static/test_registry.html +262 -0
  241. package/extensions/services/web/web_config.json5 +29 -0
  242. package/kernel/entry.py +120 -32
  243. package/kernel/event_hub.py +141 -16
  244. package/kernel/module.md +60 -33
  245. package/kernel/registry_store.py +45 -36
  246. package/kernel/rpc_router.py +152 -59
  247. package/kernel/server.py +322 -26
  248. package/kite_cli/__init__.py +3 -0
  249. package/kite_cli/__main__.py +5 -0
  250. package/kite_cli/commands/__init__.py +1 -0
  251. package/kite_cli/commands/clean.py +101 -0
  252. package/kite_cli/commands/deps_install.py +67 -0
  253. package/kite_cli/commands/doctor.py +35 -0
  254. package/kite_cli/commands/env_check.py +45 -0
  255. package/kite_cli/commands/history.py +111 -0
  256. package/kite_cli/commands/info.py +96 -0
  257. package/kite_cli/commands/install.py +313 -0
  258. package/kite_cli/commands/list.py +143 -0
  259. package/kite_cli/commands/log.py +81 -0
  260. package/kite_cli/commands/prepare.py +49 -0
  261. package/kite_cli/commands/rollback.py +88 -0
  262. package/kite_cli/commands/search.py +73 -0
  263. package/kite_cli/commands/uninstall.py +85 -0
  264. package/kite_cli/commands/update.py +118 -0
  265. package/kite_cli/commands/venv_setup.py +56 -0
  266. package/kite_cli/core/__init__.py +1 -0
  267. package/kite_cli/core/checker.py +142 -0
  268. package/kite_cli/core/dependency.py +229 -0
  269. package/kite_cli/core/downloader.py +209 -0
  270. package/kite_cli/core/install_info.py +40 -0
  271. package/kite_cli/core/tool_installer.py +397 -0
  272. package/kite_cli/core/validator.py +78 -0
  273. package/kite_cli/main.py +317 -0
  274. package/kite_cli/utils/__init__.py +1 -0
  275. package/kite_cli/utils/i18n.py +252 -0
  276. package/kite_cli/utils/interactive.py +63 -0
  277. package/kite_cli/utils/operation_log.py +77 -0
  278. package/kite_cli/utils/paths.py +34 -0
  279. package/kite_cli/utils/version.py +308 -0
  280. package/launcher/entry.py +1124 -178
  281. package/launcher/logging_setup.py +104 -0
  282. package/launcher/module.md +46 -37
  283. package/launcher/module_scanner.py +11 -1
  284. package/main.py +4 -1
  285. package/package.json +9 -1
  286. package/python_version.json +4 -0
  287. package/requirements.txt +38 -0
  288. package/scripts/env-manager.js +328 -0
  289. package/scripts/plan_manager.py +315 -0
  290. package/scripts/python-env.js +79 -0
  291. package/scripts/scan_dependencies.py +461 -0
  292. package/scripts/setup-python-env.js +191 -0
  293. package/extensions/services/web/routes/routes_modules.py +0 -249
@@ -0,0 +1,123 @@
1
+ import json
2
+ from datetime import datetime, timezone
3
+ from pathlib import Path # 新增导入
4
+
5
+ import agentcp
6
+
7
+
8
+ def create_financial_analyzer_json(publisherInfo):
9
+ """创建智能体能力、权限描述"""
10
+ profile_json_data = {
11
+ "publisherInfo": publisherInfo,
12
+ "version": "1.0.0",
13
+ "lastUpdated": datetime.now(timezone.utc).strftime("%Y-%m-%dT%H:%M:%SZ"),
14
+ "name": "串并行调用",
15
+ "description": "实现智能体搜索 调用大模型Agent,实现工具选择,多个工具并行调用获取结果。",
16
+ "capabilities": {
17
+ "core": ["智能体搜索", "工具选择", "工具调用"],
18
+ "extended": []
19
+ },
20
+ "references": {
21
+ "knowledgeBases": [""],
22
+ "tools": [""],
23
+ "companyInfo": [""],
24
+ "productInfo": [""]
25
+ },
26
+ "authorization": {
27
+ "modes": ["free"],
28
+ "fee": {},
29
+ "description": "当前智能体免费使用,无费用",
30
+ "sla": {}
31
+ },
32
+ "input": {
33
+ "types": ["content"], # 目前支持"content", "search", "reasoning_content", "error", 'file',后续会支持语音视频流
34
+ "formats": ["json"], # 详细类型
35
+ "examples": {
36
+ "type": "content",
37
+ "format": "text",
38
+ "content": "查询明天上海的天气,并规划一条去北京的路线"
39
+ },
40
+ "semantics": [""],
41
+ "compatibleAids": ["*"]
42
+ },
43
+ "output": {
44
+ "types": ["content"],
45
+ "formats": ["markdown"],
46
+ "examples": {
47
+ "type": "content",
48
+ "format": "markdown",
49
+ "content": ""
50
+ },
51
+ "semantics": [""],
52
+ "compatibleAids": [""]
53
+ },
54
+ "surportFind": False, # 是否支持智能体发现
55
+ "avaUrl": "https://bkimg.cdn.bcebos.com/pic/5d6034a85edf8db1dd6336220023dd54564e7422",
56
+ "supportStream": True, # False代表当前智能体不支持流式输出
57
+ "supportAsync": True,
58
+ "permission": ["*"]
59
+ }
60
+ return profile_json_data
61
+
62
+ def write_agent_profile_json(json_data):
63
+ try:
64
+ import os
65
+ json_path = Path(__file__).resolve()
66
+ json_dir = json_path.parent
67
+ json_file = os.path.join(json_dir, 'agentprofile.json')
68
+ with open(json_file, 'w', encoding='utf-8') as f:
69
+ json.dump(json_data, f, ensure_ascii=False, indent=2)
70
+ print("智能体描述文件已保存至当前目录下agentprofile.json")
71
+ except Exception as e:
72
+ print(f"文件写入失败: {str(e)}")
73
+ exit(1)
74
+
75
+
76
+ if __name__ == "__main__":
77
+ # 创建JSON数据
78
+ # 将加密种子修改为自己的加密种子,可以是随机字符串,也可以是固定字符串,只要保证一致即可。
79
+ acp = agentcp.AgentCP("../../../data","",debug=False)
80
+ agentid_list = acp.get_aid_list()
81
+ agentid:agentcp.AgentID = None
82
+ while agentid is None:
83
+ print("请选择一个身份(aid):")
84
+ for i, agentid in enumerate(agentid_list):
85
+ print(f"{i+1}. {agentid}")
86
+ print(f"{len(agentid_list)+1}. 创建一个新的身份(aid)")
87
+ choice = input("请输入数字选择一个身份(aid): ")
88
+ try:
89
+ choice = int(choice) - 1
90
+ if choice < 0 or choice > len(agentid_list):
91
+ raise ValueError
92
+ if choice == len(agentid_list):
93
+ aid = input("请输入名称: ")
94
+ agentid = acp.create_aid("agentunion.cn",aid)
95
+ if agentid is None:
96
+ print("创建身份(aid)失败,请打开日志查看原因")
97
+ exit(1)
98
+ agentid_list = acp.get_aid_list()
99
+ else:
100
+ agentid = acp.load_aid(agentid_list[choice])
101
+ if agentid is None:
102
+ print("加载身份(aid)失败,请打开日志查看原因")
103
+ exit(1)
104
+ except ValueError:
105
+ print("无效的选择,请重新输入。")
106
+ print(f"当前选择的身份(aid)是: {str(agentid)}")
107
+ agentid.init_ap_client()
108
+ json_data = create_financial_analyzer_json(agentid.get_publisher_info())
109
+ write_agent_profile_json(json_data)
110
+ select_result = input("是否将文件拷贝到agent公有数据目录下(Y/N): ")
111
+ if select_result.upper() != "Y":
112
+ # print("程序运行结束")
113
+ exit(1)
114
+ agentid.create_agent_profile(json_data)
115
+ select_result = input("拷贝成功,是否同步到接入服务器(Y/N): ")
116
+ if select_result.upper() != "Y":
117
+ print("程序运行结束")
118
+ exit(1)
119
+ result = agentid.sync_public_files()
120
+ if result:
121
+ print("文件同步成功!")
122
+ else:
123
+ print("文件同步失败,请初始化ACP时打开日志查看")
@@ -0,0 +1,129 @@
1
+ import json
2
+ from datetime import datetime, timezone
3
+ from pathlib import Path # 新增导入
4
+
5
+ import agentcp
6
+
7
+
8
+ def create_financial_analyzer_json(publisherInfo):
9
+ """创建智能体能力、权限描述"""
10
+ name = "模拟大模型调用Agent"
11
+ profile_json_data = {
12
+ "publisherInfo": publisherInfo,
13
+ "avaUrl": "https://pic.rmb.bdstatic.com/bjh/news/6b87d6906492735a3b03aa7d0aa9cb02.jpeg",
14
+ "version": "1.0.0",
15
+ "lastUpdated": datetime.now(timezone.utc).strftime("%Y-%m-%dT%H:%M:%SZ"),
16
+ "name": name,
17
+ "description": name,
18
+ "capabilities": {
19
+ "core": [name],
20
+ "extended": []
21
+ },
22
+ "llm":{
23
+ "model":"", #模型名称,或使用aid
24
+ "num_parameters":"", #模型参数量(如"7B"表示70亿参数)
25
+ "quantization_bits":"", #量化位数(如Q4表示4位量化)
26
+ "context_length":"", #上下文长度(如"4096"表示4096个token)
27
+ },
28
+ "references": {
29
+ "knowledgeBases": [""],
30
+ "tools": [""],
31
+ "companyInfo": [""],
32
+ "productInfo": [""]
33
+ },
34
+ "authorization": {
35
+ "modes": ["free"],
36
+ "fee": {},
37
+ "description": "当前智能体免费使用,无费用",
38
+ "sla": {}
39
+ },
40
+ "input": {
41
+ "types": ["content"], # 目前支持"content", "search", "reasoning_content", "error", 'file',后续会支持语音视频流
42
+ "formats": ["json"], # 详细类型
43
+ "examples": {
44
+ "type": "content",
45
+ "format": "text",
46
+ "content": "搜索智能体:xxx"
47
+ },
48
+ "semantics": [""],
49
+ "compatibleAids": ["*"]
50
+ },
51
+ "output": {
52
+ "types": ["content"],
53
+ "formats": ["markdown"],
54
+ "examples": {
55
+ "type": "content",
56
+ "format": "markdown",
57
+ "content": ""
58
+ },
59
+ "semantics": [""],
60
+ "compatibleAids": [""]
61
+ },
62
+ "supportStream": True, # False代表当前智能体不支持流式输出
63
+ "supportAsync": True,
64
+ "permission": ["*"]
65
+ }
66
+ return profile_json_data
67
+
68
+ def write_agent_profile_json(json_data):
69
+ try:
70
+ import os
71
+ json_path = Path(__file__).resolve()
72
+ json_dir = json_path.parent
73
+ json_file = os.path.join(json_dir, 'agentprofile.json')
74
+ with open(json_file, 'w', encoding='utf-8') as f:
75
+ json.dump(json_data, f, ensure_ascii=False, indent=2)
76
+ print("智能体描述文件已保存至当前目录下agentprofile.json")
77
+ except Exception as e:
78
+ print(f"文件写入失败: {str(e)}")
79
+ exit(1)
80
+
81
+
82
+ if __name__ == "__main__":
83
+ # 创建JSON数据
84
+ # 将加密种子修改为自己的加密种子,可以是随机字符串,也可以是固定字符串,只要保证一致即可。
85
+ acp = agentcp.AgentCP("../../../../data","",debug=False)
86
+ agentid_list = acp.get_aid_list()
87
+ agentid:agentcp.AgentID = None
88
+ while agentid is None:
89
+ print("请选择一个身份(aid):")
90
+ for i, agentid in enumerate(agentid_list):
91
+ print(f"{i+1}. {agentid}")
92
+ print(f"{len(agentid_list)+1}. 创建一个新的身份(aid)")
93
+ choice = input("请输入数字选择一个身份(aid): ")
94
+ try:
95
+ choice = int(choice) - 1
96
+ if choice < 0 or choice > len(agentid_list):
97
+ raise ValueError
98
+ if choice == len(agentid_list):
99
+ aid = input("请输入名称: ")
100
+ agentid = acp.create_aid("agentunion.cn",aid)
101
+ if agentid is None:
102
+ print("创建身份(aid)失败,请打开日志查看原因")
103
+ exit(1)
104
+ agentid_list = acp.get_aid_list()
105
+ else:
106
+ agentid = acp.load_aid(agentid_list[choice])
107
+ if agentid is None:
108
+ print("加载身份(aid)失败,请打开日志查看原因")
109
+ exit(1)
110
+ except ValueError:
111
+ print("无效的选择,请重新输入。")
112
+ print(f"当前选择的身份(aid)是: {str(agentid)}")
113
+ agentid.init_ap_client()
114
+ json_data = create_financial_analyzer_json(agentid.get_publisher_info())
115
+ write_agent_profile_json(json_data)
116
+ select_result = input("是否将文件拷贝到agent公有数据目录下(Y/N): ")
117
+ if select_result.upper() != "Y":
118
+ print("程序运行结束")
119
+ exit(1)
120
+ agentid.create_agent_profile(json_data)
121
+ select_result = input("拷贝成功,是否同步到接入服务器(Y/N): ")
122
+ if select_result.upper() != "Y":
123
+ print("程序运行结束")
124
+ exit(1)
125
+ result = agentid.sync_public_files()
126
+ if result:
127
+ print("文件同步成功!")
128
+ else:
129
+ print("文件同步失败,请初始化ACP时打开日志查看")
@@ -0,0 +1,5 @@
1
+ {
2
+ "API_KEY":"大模型的api_key",
3
+ "BASE_URL":"大模型Api接口URL",
4
+ "MODEL":"模型名称"
5
+ }
@@ -0,0 +1,146 @@
1
+ import json
2
+ import time
3
+
4
+ import agentcp
5
+ from openai import OpenAI
6
+
7
+
8
+ class QwenClient:
9
+ def __init__(self):
10
+ self.openai_api_key = None
11
+ self.base_url = None
12
+ self.model = None
13
+ self.client = None
14
+ self.acp = agentcp.AgentCP("../../../../data", seed_password="", debug=True)
15
+ self.agentid: agentcp.AgentID = None
16
+
17
+ def init_ai_client(self, json_data):
18
+ # 从环境变量中获取 API Key 和 Base URL
19
+ self.openai_api_key = json_data.get("API_KEY", "")
20
+ self.base_url = json_data.get("BASE_URL", "")
21
+ self.model = json_data.get("MODEL", "")
22
+ self.client = OpenAI(api_key=self.openai_api_key, base_url=self.base_url)
23
+
24
+ async def async_message_handler(self, message_data):
25
+ try:
26
+ receiver = message_data.get("receiver")
27
+ sender = message_data.get("sender", "") # 获取工具信息
28
+ if self.agentid.id not in receiver:
29
+ print("不是发给我的消息,不处理")
30
+ return
31
+ message_array = self.agentid.get_content_array_from_message(message_data)
32
+ if len(message_array) == 0:
33
+ print("消息内容为空,不处理")
34
+ return
35
+ llm_content = self.agentid.get_content_from_message(message_data)
36
+ stream = message_array[0].get("stream", False) # 获取stream信息
37
+ tools = message_array[0].get("tools", []) # 获取工具信息
38
+ rolesetting = message_array[0].get("prompt", "") # 获取工具信息
39
+ if rolesetting != "" and rolesetting != None:
40
+ messages = [{"role": "system", "content": rolesetting}, {"role": "user", "content": llm_content}]
41
+ else:
42
+ messages = [{"role": "user", "content": llm_content}]
43
+ print(f"\n[处理消息: {sender} : {llm_content}]\n")
44
+ await self.stream_process_query(message_data, messages, sender, stream, tools) # 添加await关键字
45
+ except Exception as e:
46
+ import traceback
47
+ print(f"处理消息时发生错误: {e}\n完整堆栈跟踪:\n{traceback.format_exc()}")
48
+
49
+ def send_message_tools_call(self, session_id, sender, llm_content: str, funcallback):
50
+ to_aid_list = [sender]
51
+ msg_block = {
52
+ "type": "tool_call",
53
+ "status": "success",
54
+ "timestamp": int(time.time() * 1000),
55
+ "content": llm_content,
56
+ }
57
+ self.agentid.add_message_handler(funcallback, session_id)
58
+ self.agentid.send_message(session_id, to_aid_list, msg_block)
59
+
60
+ async def stream_process_query(self, message_data: dict, messages: list, sender: str, stream: bool,
61
+ user_tools: list):
62
+ if user_tools is None:
63
+ user_tools = [] # 确保tools是一个列表,即使它为空
64
+ if len(user_tools) > 0:
65
+ response = self.client.chat.completions.create(
66
+ model=self.model,
67
+ messages=messages,
68
+ stream=stream,
69
+ tools=user_tools
70
+ )
71
+ else:
72
+ response = self.client.chat.completions.create(
73
+ model=self.model,
74
+ messages=messages,
75
+ stream=stream
76
+ )
77
+ session_id = message_data.get("session_id", "") # 获取session_id
78
+ content = response.choices[0]
79
+ if content.finish_reason == "tool_calls":
80
+ tool_call = content.message.tool_calls[0]
81
+ tool_name = tool_call.function.name
82
+ tool_args = json.loads(tool_call.function.arguments)
83
+ print(f"\n[Calling tool {tool_name} with args {tool_args}]\n")
84
+
85
+ async def funcallback(result_content):
86
+ self.agentid.remove_message_handler(funcallback, session_id)
87
+ messages.append(content.message.model_dump())
88
+ messages.append({
89
+ "role": "tool",
90
+ "content": self.agentid.get_content_from_message(result_content),
91
+ "tool_call_id": tool_call.id,
92
+ })
93
+ await self.stream_process_query(message_data, messages, sender, stream, user_tools)
94
+
95
+ tool_content = {
96
+ 'tool_name': tool_name,
97
+ 'tool_args': tool_args,
98
+ }
99
+ self.send_message_tools_call(session_id, sender, json.dumps(tool_content), funcallback)
100
+ return
101
+ if stream:
102
+ await self.agentid.send_stream_message(message_data.get("session_id"), [sender], response) # 确保正确调用
103
+ else:
104
+ return self.agentid.reply_message(message_data, content.message.content)
105
+
106
+
107
+ def main():
108
+ client = QwenClient()
109
+ print("欢迎使用 AGENT!")
110
+ _my_aid = "llmdemo007.agentunion.cn"
111
+ try:
112
+ client.agentid = client.acp.load_aid(_my_aid)
113
+
114
+ @client.agentid.message_handler()
115
+ async def sync_message_handler(msg):
116
+ await client.async_message_handler(msg) # 添加await关键字
117
+ return True
118
+
119
+ print("开始在线...")
120
+ env_path = "./env.json"
121
+ # 新增文件读取逻辑
122
+ try:
123
+ with open(env_path, 'r', encoding='utf-8') as f:
124
+ env_data = json.load(f)
125
+ client.init_ai_client(env_data)
126
+ print(f"成功加载配置文件: {env_path}")
127
+ except FileNotFoundError:
128
+ print(f"配置文件 {env_path} 未找到")
129
+ exit(1)
130
+ except json.JSONDecodeError:
131
+ print(f"配置文件 {env_path} 格式错误")
132
+ exit(1)
133
+ except Exception as e:
134
+ print(f"加载配置失败: {str(e)}")
135
+ exit(1)
136
+ client.agentid.online() # 确保self.agentid不为None
137
+ private_path = client.agentid.get_agent_private_path() # 获取私钥路径
138
+ print("开始监听消息...")
139
+ client.acp.serve_forever()
140
+ except Exception as e:
141
+ import traceback
142
+ print(f"\n⚠️ 发生错误: {traceback.format_exc()}") # 添加堆栈信息打印
143
+
144
+
145
+ if __name__ == "__main__":
146
+ main()
@@ -0,0 +1,123 @@
1
+ import json
2
+ import time
3
+ import traceback
4
+
5
+ import agentcp
6
+
7
+ """
8
+ 智能体搜索 使用大模型agent实现工具选择 多工具并行调用
9
+ """
10
+ class Agent:
11
+ def __init__(self):
12
+ self.agentid = None
13
+ self.acp = agentcp.AgentCP("../../../data",seed_password="")
14
+ self.llm_agent_id = "llmdemo007.agentunion.cn"
15
+ self.search_agent_id = "search007.agentunion.cn"
16
+ async def async_message_handler(self, msg):
17
+ try:
18
+ receiver = self.agentid.get_receiver_from_message(msg)
19
+ if self.agentid.id not in receiver:
20
+ print("不是发给我的消息,不处理")
21
+ return
22
+ sender = self.agentid.get_sender_from_message(msg)
23
+ session_id = self.agentid.get_session_id_from_message(msg)
24
+ to_aid_list = [sender]
25
+
26
+ # 获取输入
27
+ llm_content = self.agentid.get_content_from_message(msg)
28
+ print(f"llm_content={llm_content}\n")
29
+
30
+ # 调用工具选择agent
31
+ self.mult_tool_choose(llm_content,session_id,to_aid_list)
32
+ except Exception as e:
33
+ print(f"处理消息时发生错误: {e}\n完整堆栈跟踪:\n{traceback.format_exc()}")
34
+
35
+ async def reply_message_handler(self,reply_msg,session_id,to_aid_list):
36
+ content = []
37
+ print(f"模型返回结果{reply_msg}")
38
+ message_json = json.loads(reply_msg.get("message"))
39
+ if isinstance(message_json, list) and len(message_json) > 0:
40
+ content = message_json
41
+ message_json = message_json[0]
42
+ # 根据大模型返回结果 决定是否调用其他agent
43
+ if message_json.get("type") == "tool_call":
44
+ print(f"使用工具 {content}")
45
+ await self.mult_tool_call(content,session_id, to_aid_list)
46
+ else:
47
+ self.agentid.send_message_content(session_id, to_aid_list, self.agentid.get_content_from_message(reply_msg))
48
+ return
49
+
50
+ def mult_tool_choose(self,llm_content,session_id,to_aid_list):
51
+ def search_agent_handler(search_msg):
52
+ result = self.agentid.get_content_from_message(search_msg)
53
+ print(f"search result={result}")
54
+ agents = json.loads(result)
55
+ tools = []
56
+ for ainfo in agents:
57
+ description = f"我是{ainfo['agent_id']},我能提供[{ainfo['description']}]服务,我的aid是{ainfo['agent_id']}"
58
+ tools.append({
59
+ "type": "function",
60
+ "function": {
61
+ "name": "agent_" + ainfo['agent_id'],
62
+ "description": description,
63
+ "parameters": {
64
+ "type": "object",
65
+ "properties": {
66
+ "aid": {
67
+ "type": "string",
68
+ "description": "",
69
+ },
70
+ "text": {
71
+ "type": "string",
72
+ "description": ""
73
+ }
74
+ },
75
+ "required": ["aid", "text"]
76
+ }
77
+ }
78
+ })
79
+
80
+ msg_block = {
81
+ "type": "content",
82
+ "status": "success",
83
+ "timestamp": int(time.time() * 1000),
84
+ "content": llm_content,
85
+ "tools": tools,
86
+ "prompt": ""
87
+ }
88
+ self.agentid.quick_send_messsage(self.llm_agent_id, msg_block,
89
+ lambda reply_msg: self.reply_message_handler(reply_msg, session_id,
90
+ to_aid_list))
91
+
92
+ self.agentid.quick_send_messsage_content(self.search_agent_id, llm_content,search_agent_handler)
93
+
94
+ async def mult_tool_call(self,content,session_id, to_aid_list) :
95
+ for tool_call in content:
96
+ tool = json.loads(tool_call.get("content"))
97
+ tool_args = tool.get("tool_args")
98
+ print(f"aiddddddd={tool_args['aid']} text={tool_args['text']}")
99
+ async def async_func_call_result(message):
100
+ tool_result = self.agentid.get_content_from_message(message)
101
+ print(f"工具返回的结果={tool_result}")
102
+ self.agentid.send_message_content(session_id,to_aid_list, tool_result)
103
+ # self.agentid.quick_send_messsage_content(self.llm_agent_id, tool_result,
104
+ # lambda reply_msg: self.reply_message_handler(reply_msg,session_id,to_aid_list))
105
+ return
106
+ self.agentid.quick_send_messsage_content(tool_args["aid"], tool_args["text"], async_func_call_result)
107
+
108
+ if __name__ == "__main__":
109
+ _my_aid = "mc58009.agentunion.cn"
110
+
111
+ agent = Agent()
112
+ agent.agentid =agent.acp.load_aid(_my_aid)
113
+ async def sync_message_handler(msg):
114
+ print(f"收到消息数据: {msg}")
115
+ await agent.async_message_handler(msg) # 添加await关键字
116
+ return True
117
+ try:
118
+ agent.agentid.online()
119
+ # agent.agentid.sync_public_files()
120
+ agent.agentid.add_message_handler(sync_message_handler)
121
+ agent.acp.serve_forever()
122
+ except Exception as e:
123
+ print(f"AgentID未正确初始化: {e}")