@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,136 @@
1
+ import os
2
+ import json
3
+ from openai import OpenAI
4
+ import time
5
+ import agentcp
6
+ class QwenClient:
7
+ def __init__(self):
8
+ self.openai_api_key = None
9
+ self.base_url = None
10
+ self.model = None
11
+ self.client = None
12
+ self.acp = agentcp.AgentCP(".",seed_password="888777",debug=True)
13
+ self.agentid:agentcp.AgentID = None
14
+
15
+ def init_ai_client(self,json_data):
16
+ # 从环境变量中获取 API Key 和 Base URL
17
+ self.openai_api_key = json_data.get("OPENAI_API_KEY","")
18
+ self.base_url = json_data.get("BASE_URL","")
19
+ self.model = json_data.get("MODEL","")
20
+ self.client = OpenAI(api_key=self.openai_api_key, base_url=self.base_url)
21
+
22
+ async def async_message_handler(self, message_data):
23
+ try:
24
+ receiver = message_data.get("receiver")
25
+ sender = message_data.get("sender","") # 获取工具信息
26
+ if self.agentid.id not in receiver:
27
+ print("不是发给我的消息,不处理")
28
+ return
29
+ message_array = self.agentid.get_content_array_from_message(message_data)
30
+ if len(message_array) == 0:
31
+ print("消息内容为空,不处理")
32
+ return
33
+ llm_content = self.agentid.get_content_from_message(message_data)
34
+ stream = message_array[0].get("stream",False) # 获取stream信息
35
+ tools = message_array[0].get("tools",[]) # 获取工具信息
36
+ rolesetting = message_array[0].get("prompt","") # 获取工具信息
37
+ if rolesetting!="" and rolesetting!=None:
38
+ messages = [{"role": "system", "content": rolesetting},{"role": "user", "content": llm_content}]
39
+ else:
40
+ messages = [{"role": "user", "content": llm_content}]
41
+ print(f"\n[处理消息: {sender} : {llm_content}]\n")
42
+ await self.stream_process_query(message_data,messages,sender,stream,tools) #添加await关键字
43
+ except Exception as e:
44
+ import traceback
45
+ print(f"处理消息时发生错误: {e}\n完整堆栈跟踪:\n{traceback.format_exc()}")
46
+
47
+ def send_message_tools_call(self, session_id,sender,llm_content: str,funcallback):
48
+ to_aid_list = [sender]
49
+ msg_block = {
50
+ "type": "tool_call",
51
+ "status": "success",
52
+ "timestamp": int(time.time() * 1000),
53
+ "content": llm_content,
54
+ }
55
+ self.agentid.add_message_handler(funcallback,session_id)
56
+ self.agentid.send_message(session_id,to_aid_list, msg_block)
57
+
58
+ async def stream_process_query(self, message_data:dict, messages: list, sender:str,stream: bool,user_tools:list):
59
+ if user_tools is None:
60
+ user_tools = [] # 确保tools是一个列表,即使它为空
61
+ if len(user_tools) > 0:
62
+ response = self.client.chat.completions.create(
63
+ model=self.model,
64
+ messages=messages,
65
+ stream=stream,
66
+ tools = user_tools
67
+ )
68
+ else:
69
+ response = self.client.chat.completions.create(
70
+ model=self.model,
71
+ messages=messages,
72
+ stream=stream
73
+ )
74
+ session_id = message_data.get("session_id","") # 获取session_id
75
+ content = response.choices[0]
76
+ if content.finish_reason == "tool_calls":
77
+ tool_call = content.message.tool_calls[0]
78
+ tool_name = tool_call.function.name
79
+ tool_args = json.loads(tool_call.function.arguments)
80
+ print(f"\n[Calling tool {tool_name} with args {tool_args}]\n")
81
+ async def funcallback(result_content):
82
+ self.agentid.remove_message_handler(funcallback,session_id)
83
+ messages.append(content.message.model_dump())
84
+ messages.append({
85
+ "role": "tool",
86
+ "content": self.agentid.get_content_from_message(result_content),
87
+ "tool_call_id": tool_call.id,
88
+ })
89
+ await self.stream_process_query(message_data,messages,sender,stream,user_tools)
90
+ tool_content = {
91
+ 'tool_name':tool_name,
92
+ 'tool_args':tool_args,
93
+ }
94
+ self.send_message_tools_call(session_id,sender,json.dumps(tool_content),funcallback)
95
+ return
96
+ if stream:
97
+ await self.agentid.send_stream_message(message_data.get("session_id"),[sender] , response) # 确保正确调用
98
+ else:
99
+ return self.agentid.reply_message(message_data, content.message.content)
100
+
101
+ def main():
102
+ client = QwenClient()
103
+ print("欢迎使用阿里千问 AGENT!")
104
+ try:
105
+ client.agentid = client.acp.load_aid("your_aid")
106
+ @client.agentid.message_handler()
107
+ async def sync_message_handler(msg):
108
+ await client.async_message_handler(msg) # 添加await关键字
109
+ return True
110
+ print("开始在线...")
111
+ env_path = os.path.join(client.agentid.get_agent_private_path(), "data", "env.json")
112
+ # 新增文件读取逻辑
113
+ try:
114
+ with open(env_path, 'r', encoding='utf-8') as f:
115
+ env_data = json.load(f)
116
+ client.init_ai_client(env_data)
117
+ print(f"成功加载配置文件: {env_path}")
118
+ except FileNotFoundError:
119
+ print(f"配置文件 {env_path} 未找到")
120
+ exit(1)
121
+ except json.JSONDecodeError:
122
+ print(f"配置文件 {env_path} 格式错误")
123
+ exit(1)
124
+ except Exception as e:
125
+ print(f"加载配置失败: {str(e)}")
126
+ exit(1)
127
+ client.agentid.online() # 确保self.agentid不为None
128
+ private_path = client.agentid.get_agent_private_path() # 获取私钥路径
129
+ print("开始监听消息...")
130
+ client.acp.serve_forever()
131
+ except Exception as e:
132
+ import traceback
133
+ print(f"\n⚠️ 发生错误: {traceback.format_exc()}") # 添加堆栈信息打印
134
+
135
+ if __name__ == "__main__":
136
+ main()
@@ -0,0 +1,90 @@
1
+ ## 使用指南
2
+ ### 1、环境要求
3
+ - Python 3.8+
4
+ - [AgentCP SDK](https://pypi.org/project/agentcp/)
5
+ - [Ollama](https://ollama.com/)
6
+
7
+ ### 2、环境准备
8
+ 安装Ollama并下载模型:
9
+ #### [Windows](https://ollama.com/download/OllamaSetup.exe)
10
+ #### [macOS](https://ollama.com/download/Ollama-darwin.zip)
11
+ #### Linux
12
+ ```bash
13
+ curl -fsSL https://ollama.com/install.sh | sh
14
+ ```
15
+
16
+ ### 3、下载模型:
17
+ ```bash
18
+ ollama pull qwen3:0.6b
19
+ ```
20
+
21
+ ### 4、安装依赖
22
+
23
+ 安装必要的Python库:
24
+ ```bash
25
+ pip install agentcp requests
26
+ ```
27
+ ### 5、创建身份ID
28
+ ```bash
29
+ python create_profile.py
30
+ ```
31
+ ### 6、修改main.py文件
32
+ 1. 将seed_password、agent_id修改为上一步创建的身份信息
33
+ 2. 将model_name修改为你本地使用的model
34
+
35
+ ### 7、执行main.py代码
36
+ ```bash
37
+ python main.py
38
+ ```
39
+ ## 功能简介
40
+ 该Agent基于`agentcp`库构建,实现与本地大模型交互,主要功能包括:
41
+
42
+ - 接收并处理用户的消息请求
43
+ - 转发消息到本地大模型
44
+ - 处理本地大模型的响应并返回给原始请求方
45
+
46
+ ## 完整示例代码
47
+ ```python
48
+ import json
49
+ import requests
50
+ import agentcp
51
+ model_name = 'your_local_model'
52
+ def chatWithLLM(prompt):
53
+ try:
54
+ response = requests.post(
55
+ "http://localhost:11434/api/chat",
56
+ json={
57
+ "model": model_name,
58
+ "messages": [
59
+ {
60
+ "role": "user",
61
+ "content": prompt
62
+ }],
63
+ "stream": False
64
+ })
65
+ response.encoding = 'utf-8'
66
+ response.raise_for_status()
67
+ result = response.json()
68
+ result = result.get('message')
69
+ result = result.get('content')
70
+ return result
71
+ except requests.exceptions.RequestException as e:
72
+ return "请求失败"
73
+ except json.JSONDecodeError:
74
+ return "响应解析失败"
75
+
76
+ if __name__ == '__main__':
77
+ agent_id = 'your_agent_id'
78
+ acp = agentcp.AgentCP('.', seed_password='')
79
+ aid = acp.load_aid(agent_id)
80
+ @aid.message_handler()
81
+ async def sync_message_handler(msg):
82
+ content = aid.get_content_from_message(msg)
83
+ session_id = aid.get_session_id_from_message(msg)
84
+ sender = aid.get_sender_from_message(msg)
85
+ res = chatWithLLM(content)
86
+ aid.send_message_content(session_id, [sender], res)
87
+ return True
88
+ aid.online()
89
+ acp.serve_forever()
90
+ ```
@@ -0,0 +1,125 @@
1
+ from datetime import datetime, timezone
2
+ import agentcp
3
+ from pathlib import Path # 新增导入
4
+ import json
5
+ def create_financial_analyzer_json(publisherInfo):
6
+ """创建智能体能力、权限描述"""
7
+ profile_json_data = {
8
+ "publisherInfo": publisherInfo,
9
+ "avaUrl": "https://img0.baidu.com/it/u=727206602,4114969606&fm=253&fmt=auto&app=138&f=JPEG?w=285&h=285",
10
+ "version": "1.0.0",
11
+ "lastUpdated": datetime.now(timezone.utc).strftime("%Y-%m-%dT%H:%M:%SZ"),
12
+ "name": "本地大模型",
13
+ "description": "本地大模型交互Agent",
14
+ "capabilities": {
15
+ "core": ["chat"],
16
+ "extended": []
17
+ },
18
+ "llm":{
19
+ "model":"", #模型名称,或使用aid
20
+ "num_parameters":"", #模型参数量(如"7B"表示70亿参数)
21
+ "quantization_bits":"", #量化位数(如Q4表示4位量化)
22
+ "context_length":"", #上下文长度(如"4096"表示4096个token)
23
+ },
24
+ "references": {
25
+ "knowledgeBases": [""],
26
+ "tools": [""],
27
+ "companyInfo": [""],
28
+ "productInfo": [""]
29
+ },
30
+ "authorization": {
31
+ "modes": ["free"],
32
+ "fee": {},
33
+ "description": "当前智能体免费使用,无费用",
34
+ "sla": {}
35
+ },
36
+ "input": {
37
+ "types": ["content"], # 目前支持"content", "search", "reasoning_content", "error", 'file',后续会支持语音视频流
38
+ "formats": ["json"], # 详细类型
39
+ "examples": {
40
+ "type": "content",
41
+ "format": "text",
42
+ "content": "搜索智能体:xxx"
43
+ },
44
+ "semantics": [""],
45
+ "compatibleAids": ["*"]
46
+ },
47
+ "output": {
48
+ "types": ["content"],
49
+ "formats": ["markdown"],
50
+ "examples": {
51
+ "type": "content",
52
+ "format": "markdown",
53
+ "content": ""
54
+ },
55
+ "semantics": [""],
56
+ "compatibleAids": [""]
57
+ },
58
+ "supportStream": True, # False代表当前智能体不支持流式输出
59
+ "supportAsync": True,
60
+ "permission": ["*"]
61
+ }
62
+ return profile_json_data
63
+
64
+ def write_agent_profile_json(json_data):
65
+ try:
66
+ import os
67
+ json_path = Path(__file__).resolve()
68
+ json_dir = json_path.parent
69
+ json_file = os.path.join(json_dir, 'agentprofile.json')
70
+ with open(json_file, 'w', encoding='utf-8') as f:
71
+ json.dump(json_data, f, ensure_ascii=False, indent=2)
72
+ print("智能体描述文件已保存至当前目录下agentprofile.json")
73
+ except Exception as e:
74
+ print(f"文件写入失败: {str(e)}")
75
+ exit(1)
76
+
77
+
78
+ if __name__ == "__main__":
79
+ # 创建JSON数据
80
+ # 将加密种子修改为自己的加密种子,可以是随机字符串,也可以是固定字符串,只要保证一致即可。
81
+ acp = agentcp.AgentCP(".", seed_password='')
82
+ agentid_list = acp.get_aid_list()
83
+ agentid:agentcp.AgentID = None
84
+ while agentid is None:
85
+ print("请选择一个身份(aid):")
86
+ for i, agentid in enumerate(agentid_list):
87
+ print(f"{i+1}. {agentid}")
88
+ print(f"{len(agentid_list)+1}. 创建一个新的身份(aid)")
89
+ choice = input("请输入数字选择一个身份(aid): ")
90
+ try:
91
+ choice = int(choice) - 1
92
+ if choice < 0 or choice > len(agentid_list):
93
+ raise ValueError
94
+ if choice == len(agentid_list):
95
+ aid = input("请输入名称: ")
96
+ agentid = acp.create_aid("agentunion.cn",aid)
97
+ if agentid is None:
98
+ print("创建身份(aid)失败,请打开日志查看原因")
99
+ exit(1)
100
+ agentid_list = acp.get_aid_list()
101
+ else:
102
+ agentid = acp.load_aid(agentid_list[choice])
103
+ if agentid is None:
104
+ print("加载身份(aid)失败,请打开日志查看原因")
105
+ exit(1)
106
+ except ValueError:
107
+ print("无效的选择,请重新输入。")
108
+ print(f"当前选择的身份(aid)是: {str(agentid)}")
109
+ agentid.init_ap_client()
110
+ json_data = create_financial_analyzer_json(agentid.get_publisher_info())
111
+ write_agent_profile_json(json_data)
112
+ select_result = input("是否将文件拷贝到agent公有数据目录下(Y/N): ")
113
+ if select_result.upper() != "Y":
114
+ print("程序运行结束")
115
+ exit(1)
116
+ agentid.create_agent_profile(json_data)
117
+ select_result = input("拷贝成功,是否同步到接入服务器(Y/N): ")
118
+ if select_result.upper() != "Y":
119
+ print("程序运行结束")
120
+ exit(1)
121
+ result = agentid.sync_public_files()
122
+ if result:
123
+ print("文件同步成功!")
124
+ else:
125
+ print("文件同步失败,请初始化ACP时打开日志查看")
@@ -0,0 +1,49 @@
1
+ import json
2
+ import requests
3
+ import agentcp
4
+ model_name = 'your_model_name'
5
+ def chatWithLLM(prompt):
6
+ try:
7
+ response = requests.post(
8
+ "http://localhost:11434/api/chat",
9
+ json={
10
+ "model": model_name,
11
+ "messages": [
12
+ {
13
+ "role": "system",
14
+ "content": '使用中文输出内容'
15
+ },
16
+ {
17
+ "role": "user",
18
+ "content": prompt + '/no_think'
19
+ }],
20
+ "stream": False
21
+ })
22
+ response.encoding = 'utf-8'
23
+ response.raise_for_status()
24
+ result = response.json()
25
+ result = result.get('message')
26
+ result = result.get('content')
27
+ return result
28
+ except requests.exceptions.RequestException as e:
29
+ import traceback
30
+ print(f"请求失败: {traceback.format_exc()}")
31
+ return "请求失败"
32
+ except json.JSONDecodeError:
33
+ return "响应解析失败"
34
+
35
+ if __name__ == '__main__':
36
+ agent_id = 'your_agent_id_from_profile'
37
+ acp = agentcp.AgentCP('.', seed_password='')
38
+ aid = acp.load_aid(agent_id)
39
+ @aid.message_handler()
40
+ async def sync_message_handler(msg):
41
+ content = aid.get_content_from_message(msg)
42
+ session_id = aid.get_session_id_from_message(msg)
43
+ sender = aid.get_sender_from_message(msg)
44
+ res = chatWithLLM(content)
45
+ aid.send_message_content(session_id, [sender], res)
46
+ return True
47
+ aid.online()
48
+ acp.serve_forever()
49
+
@@ -0,0 +1,55 @@
1
+ ## 使用指南
2
+ ### 1、环境要求
3
+ - Python 3.8+
4
+ - [AgentCP SDK](https://pypi.org/project/agentcp/)
5
+
6
+ ### 2、安装依赖
7
+
8
+ 安装必要的Python库:
9
+ ```bash
10
+ pip install agentcp
11
+ ```
12
+ ### 3、创建身份ID
13
+ ```bash
14
+ python create_profile.py
15
+ ```
16
+ ### 4、修改main.py文件
17
+ 1. 将seed_password、agent_id修改为上一步创建的身份信息
18
+ 2. 将 llm_agent_id修改为你想要调用的[agent_id](https://www.agentunion.cn/)
19
+
20
+ ### 5、执行main.py代码
21
+ ```bash
22
+ python main.py
23
+ ```
24
+ ## 功能简介
25
+ 该Agent基于`agentcp`库构建,作为一个大语言模型的中转代理,负责:
26
+
27
+ - 接收并处理用户的消息请求
28
+ - 转发请求到目标大模型Agent(如 lwj001.agentunion.cn)
29
+ - 异步接收大模型Agent的响应,并返回给原始请求方
30
+
31
+ ## 完整示例代码
32
+ ```python
33
+ import agentcp
34
+ if __name__ == "__main__":
35
+ llm_agent_id = "your_llm_agent_id_from_mu"
36
+ agent_id = 'your_agent_id_from_profile'
37
+ acp = agentcp.AgentCP('.', seed_password='')
38
+ aid = acp.load_aid(agent_id)
39
+ async def reply_message_handler(reply_msg, sender, session_id):
40
+ reply_text = aid.get_content_from_message(reply_msg)
41
+ aid.send_message_content(to_aid_list=[sender], session_id=session_id, llm_content=reply_text)
42
+
43
+ @aid.message_handler()
44
+ async def sync_message_handler(msg):
45
+ receiver = aid.get_receiver_from_message(msg)
46
+ if aid.id not in receiver:
47
+ return
48
+ session_id = aid.get_session_id_from_message(msg)
49
+ sender = aid.get_sender_from_message(msg)
50
+ sender_content = aid.get_content_from_message(msg)
51
+ aid.quick_send_messsage_content(llm_agent_id, sender_content, lambda reply_msg: reply_message_handler(reply_msg, sender, session_id))
52
+ return True
53
+ aid.online()
54
+ acp.serve_forever()
55
+ ```
@@ -0,0 +1,125 @@
1
+ from datetime import datetime, timezone
2
+ import agentcp
3
+ from pathlib import Path # 新增导入
4
+ import json
5
+ def create_financial_analyzer_json(publisherInfo):
6
+ """创建智能体能力、权限描述"""
7
+ profile_json_data = {
8
+ "publisherInfo": publisherInfo,
9
+ "avaUrl": "https://img0.baidu.com/it/u=727206602,4114969606&fm=253&fmt=auto&app=138&f=JPEG?w=285&h=285",
10
+ "version": "1.0.0",
11
+ "lastUpdated": datetime.now(timezone.utc).strftime("%Y-%m-%dT%H:%M:%SZ"),
12
+ "name": "大模型调用中转器",
13
+ "description": "转发用户信息到其它大模型Agent",
14
+ "capabilities": {
15
+ "core": ["chat"],
16
+ "extended": []
17
+ },
18
+ "llm":{
19
+ "model":"", #模型名称,或使用aid
20
+ "num_parameters":"", #模型参数量(如"7B"表示70亿参数)
21
+ "quantization_bits":"", #量化位数(如Q4表示4位量化)
22
+ "context_length":"", #上下文长度(如"4096"表示4096个token)
23
+ },
24
+ "references": {
25
+ "knowledgeBases": [""],
26
+ "tools": [""],
27
+ "companyInfo": [""],
28
+ "productInfo": [""]
29
+ },
30
+ "authorization": {
31
+ "modes": ["free"],
32
+ "fee": {},
33
+ "description": "当前智能体免费使用,无费用",
34
+ "sla": {}
35
+ },
36
+ "input": {
37
+ "types": ["content"], # 目前支持"content", "search", "reasoning_content", "error", 'file',后续会支持语音视频流
38
+ "formats": ["json"], # 详细类型
39
+ "examples": {
40
+ "type": "content",
41
+ "format": "text",
42
+ "content": "搜索智能体:xxx"
43
+ },
44
+ "semantics": [""],
45
+ "compatibleAids": ["*"]
46
+ },
47
+ "output": {
48
+ "types": ["content"],
49
+ "formats": ["markdown"],
50
+ "examples": {
51
+ "type": "content",
52
+ "format": "markdown",
53
+ "content": ""
54
+ },
55
+ "semantics": [""],
56
+ "compatibleAids": [""]
57
+ },
58
+ "supportStream": True, # False代表当前智能体不支持流式输出
59
+ "supportAsync": True,
60
+ "permission": ["*"]
61
+ }
62
+ return profile_json_data
63
+
64
+ def write_agent_profile_json(json_data):
65
+ try:
66
+ import os
67
+ json_path = Path(__file__).resolve()
68
+ json_dir = json_path.parent
69
+ json_file = os.path.join(json_dir, 'agentprofile.json')
70
+ with open(json_file, 'w', encoding='utf-8') as f:
71
+ json.dump(json_data, f, ensure_ascii=False, indent=2)
72
+ print("智能体描述文件已保存至当前目录下agentprofile.json")
73
+ except Exception as e:
74
+ print(f"文件写入失败: {str(e)}")
75
+ exit(1)
76
+
77
+
78
+ if __name__ == "__main__":
79
+ # 创建JSON数据
80
+ # 将加密种子修改为自己的加密种子,可以是随机字符串,也可以是固定字符串,只要保证一致即可。
81
+ acp = agentcp.AgentCP(".", seed_password='')
82
+ agentid_list = acp.get_aid_list()
83
+ agentid:agentcp.AgentID = None
84
+ while agentid is None:
85
+ print("请选择一个身份(aid):")
86
+ for i, agentid in enumerate(agentid_list):
87
+ print(f"{i+1}. {agentid}")
88
+ print(f"{len(agentid_list)+1}. 创建一个新的身份(aid)")
89
+ choice = input("请输入数字选择一个身份(aid): ")
90
+ try:
91
+ choice = int(choice) - 1
92
+ if choice < 0 or choice > len(agentid_list):
93
+ raise ValueError
94
+ if choice == len(agentid_list):
95
+ aid = input("请输入名称: ")
96
+ agentid = acp.create_aid("agentunion.cn",aid)
97
+ if agentid is None:
98
+ print("创建身份(aid)失败,请打开日志查看原因")
99
+ exit(1)
100
+ agentid_list = acp.get_aid_list()
101
+ else:
102
+ agentid = acp.load_aid(agentid_list[choice])
103
+ if agentid is None:
104
+ print("加载身份(aid)失败,请打开日志查看原因")
105
+ exit(1)
106
+ except ValueError:
107
+ print("无效的选择,请重新输入。")
108
+ print(f"当前选择的身份(aid)是: {str(agentid)}")
109
+ agentid.init_ap_client()
110
+ json_data = create_financial_analyzer_json(agentid.get_publisher_info())
111
+ write_agent_profile_json(json_data)
112
+ select_result = input("是否将文件拷贝到agent公有数据目录下(Y/N): ")
113
+ if select_result.upper() != "Y":
114
+ print("程序运行结束")
115
+ exit(1)
116
+ agentid.create_agent_profile(json_data)
117
+ select_result = input("拷贝成功,是否同步到接入服务器(Y/N): ")
118
+ if select_result.upper() != "Y":
119
+ print("程序运行结束")
120
+ exit(1)
121
+ result = agentid.sync_public_files()
122
+ if result:
123
+ print("文件同步成功!")
124
+ else:
125
+ print("文件同步失败,请初始化ACP时打开日志查看")
@@ -0,0 +1,23 @@
1
+ import agentcp
2
+
3
+ if __name__ == "__main__":
4
+ llm_agent_id = "your_llm_agent_id_from_mu"
5
+ agent_id = 'your_agent_id_from_profile'
6
+ acp = agentcp.AgentCP('.', seed_password='')
7
+ aid = acp.load_aid(agent_id)
8
+ async def reply_message_handler(reply_msg, sender, session_id):
9
+ reply_text = aid.get_content_from_message(reply_msg)
10
+ aid.send_message_content(to_aid_list=[sender], session_id=session_id, llm_content=reply_text)
11
+
12
+ @aid.message_handler()
13
+ async def sync_message_handler(msg):
14
+ receiver = aid.get_receiver_from_message(msg)
15
+ if aid.id not in receiver:
16
+ return
17
+ session_id = aid.get_session_id_from_message(msg)
18
+ sender = aid.get_sender_from_message(msg)
19
+ sender_content = aid.get_content_from_message(msg)
20
+ aid.quick_send_messsage_content(llm_agent_id, sender_content, lambda reply_msg: reply_message_handler(reply_msg, sender, session_id))
21
+ return True
22
+ aid.online()
23
+ acp.serve_forever()