@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,89 @@
1
+ {
2
+ "publisherInfo": {
3
+ "publisherAid": "weather.agentunion.cn",
4
+ "organization": "agentunion.cn",
5
+ "certificationSignature": "agentunion.cn"
6
+ },
7
+ "avaUrl": "https://img1.baidu.com/it/u=4196730940,2454447876&fm=253&fmt=auto&app=120&f=JPEG?w=933&h=800",
8
+ "version": "1.0.0",
9
+ "lastUpdated": "2025-05-15T04:22:30Z",
10
+ "name": "ACP 天气问答智能体",
11
+ "description": "智能查询天气信息,提供准确的天气数据。",
12
+ "capabilities": {
13
+ "core": [
14
+ "智能查询天气信息,提供准确的天气数据。"
15
+ ],
16
+ "extended": []
17
+ },
18
+ "llm": {
19
+ "model": "qwen-plus",
20
+ "num_parameters": "",
21
+ "quantization_bits": "",
22
+ "context_length": ""
23
+ },
24
+ "references": {
25
+ "knowledgeBases": [
26
+ ""
27
+ ],
28
+ "tools": [
29
+ ""
30
+ ],
31
+ "companyInfo": [
32
+ ""
33
+ ],
34
+ "productInfo": [
35
+ ""
36
+ ]
37
+ },
38
+ "authorization": {
39
+ "modes": [
40
+ "free"
41
+ ],
42
+ "fee": {},
43
+ "description": "当前智能体免费使用,无费用",
44
+ "sla": {}
45
+ },
46
+ "input": {
47
+ "types": [
48
+ "content"
49
+ ],
50
+ "formats": [
51
+ "json"
52
+ ],
53
+ "examples": {
54
+ "type": "content",
55
+ "format": "text",
56
+ "content": "搜索智能体:xxx"
57
+ },
58
+ "semantics": [
59
+ ""
60
+ ],
61
+ "compatibleAids": [
62
+ "*"
63
+ ]
64
+ },
65
+ "output": {
66
+ "types": [
67
+ "content"
68
+ ],
69
+ "formats": [
70
+ "markdown"
71
+ ],
72
+ "examples": {
73
+ "type": "content",
74
+ "format": "markdown",
75
+ "content": ""
76
+ },
77
+ "semantics": [
78
+ ""
79
+ ],
80
+ "compatibleAids": [
81
+ ""
82
+ ]
83
+ },
84
+ "supportStream": true,
85
+ "supportAsync": true,
86
+ "permission": [
87
+ "*"
88
+ ]
89
+ }
@@ -0,0 +1,16 @@
1
+ # -*- coding: utf-8 -*-
2
+ # Copyright 2025 AgentUnion Inc.
3
+ #
4
+ # Licensed under the Apache License, Version 2.0 (the "License");
5
+ # you may not use this file except in compliance with the License.
6
+ # You may obtain a copy of the License at
7
+ #
8
+ # http://www.apache.org/licenses/LICENSE-2.0
9
+ #
10
+ # Unless required by applicable law or agreed to in writing, software
11
+ # distributed under the License is distributed on an "AS IS" BASIS,
12
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ # See the License for the specific language governing permissions and
14
+ # limitations under the License.
15
+
16
+ from . import ap_client
@@ -0,0 +1,316 @@
1
+ # -*- coding: utf-8 -*-
2
+ # Copyright 2025 AgentUnion Inc.
3
+ #
4
+ # Licensed under the Apache License, Version 2.0 (the "License");
5
+ # you may not use this file except in compliance with the License.
6
+ # You may obtain a copy of the License at
7
+ #
8
+ # http://www.apache.org/licenses/LICENSE-2.0
9
+ #
10
+ # Unless required by applicable law or agreed to in writing, software
11
+ # distributed under the License is distributed on an "AS IS" BASIS,
12
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ # See the License for the specific language governing permissions and
14
+ # limitations under the License.
15
+ import datetime
16
+ import hashlib
17
+ import os
18
+
19
+ import requests
20
+
21
+ from agentcp.base.auth_client import AuthClient
22
+ from agentcp.base.client import IClient
23
+ from agentcp.base.log import log_debug, log_error, log_exception, log_info
24
+
25
+ from ..context import ErrorContext, exceptions
26
+
27
+
28
+ class ApClient(IClient):
29
+ def __init__(self, agent_id: str, server_url: str, aid_path: str, seed_password: str):
30
+ super().__init__()
31
+ self.agent_id = agent_id
32
+ self.heartbeat_server = ""
33
+ self.message_server = ""
34
+ self.server_url = f"{server_url}" + "/api/accesspoint"
35
+ self.auth_client = AuthClient(agent_id, self.server_url, aid_path, seed_password) # 使用AuthClient
36
+
37
+ def initialize(self):
38
+ self.auth_client.sign_in()
39
+ self.get_entrypoint_config()
40
+
41
+ def sign_in(self) -> bool:
42
+ return self.auth_client.sign_in() is not None
43
+
44
+ def get_headers(self) -> dict:
45
+ return {"User-Agent": f"AgentCP/{__import__('agentcp').__version__} (AuthClient; {self.agent_id})"}
46
+
47
+ def sign_out(self):
48
+ """登出方法"""
49
+ self.auth_client.sign_out()
50
+
51
+ def post_private_data(self, data):
52
+ try:
53
+ ep_url = self.server_url + "/post_agent_private_data"
54
+ data = {
55
+ "agent_id": f"{self.agent_id}",
56
+ "signature": self.auth_client.signature,
57
+ "data": data,
58
+ }
59
+ response = self.post_request(ep_url, json=data)
60
+ if response.status_code == 200:
61
+ log_info(f"post_private_data ok:{response.json()}")
62
+ return response.json()["data"]
63
+ else:
64
+ log_error(f"post_private_data failed:{response.json()}")
65
+ return None
66
+ except Exception as e:
67
+ log_exception(f"Post private data exception occurred: {e}")
68
+ ErrorContext.publish(exceptions.SDKError(f"Post private data exception occurred: {e}"))
69
+ return None
70
+
71
+ def get_all_public_data(self):
72
+ try:
73
+ ep_url = self.server_url + "/get_all_public_data"
74
+ data = {
75
+ "agent_id": f"{self.agent_id}",
76
+ "signature": self.auth_client.signature,
77
+ }
78
+ response = self.post_request(ep_url, json=data)
79
+ if response.status_code == 200:
80
+ return response.json()["data"]
81
+ else:
82
+ log_error(f"get_all_public_data failed:{response.json()}")
83
+ return []
84
+ except Exception as e:
85
+ log_error("get_all_public_data exception:")
86
+ log_exception(e)
87
+ ErrorContext.publish(exceptions.SDKError(f"get_all_public_data exception: {e}"))
88
+ return []
89
+
90
+ def get_agent_list(self):
91
+ try:
92
+ ep_url = self.server_url + "/get_agent_list"
93
+ data = {
94
+ "agent_id": f"{self.agent_id}",
95
+ "signature": self.auth_client.signature,
96
+ }
97
+ response = self.post_request(ep_url, json=data)
98
+ if response.status_code == 200:
99
+ log_info(f"get_all_public_data ok:{response.json()}")
100
+ return response.json()["data"]
101
+ else:
102
+ log_error(f"get_all_public_data failed:{response.json()}")
103
+ return None
104
+ except Exception as e:
105
+ log_exception(f"Get all public data exception occurred: {e}")
106
+ ErrorContext.publish(exceptions.SDKError(f"Get all public data exception occurred: {e}"))
107
+
108
+ def get_entrypoint_config(self):
109
+ try:
110
+ ep_url = self.server_url + "/get_accesspoint_config"
111
+ log_debug(f"Get server config: {ep_url}")
112
+ data = {
113
+ "agent_id": f"{self.agent_id}",
114
+ "signature": self.auth_client.signature,
115
+ }
116
+ response = self.post_request(ep_url, json=data)
117
+ if response.status_code == 200:
118
+ try:
119
+ config = response.json()
120
+ if isinstance(config.get("config"), str): # 处理config是字符串的情况
121
+ import json
122
+
123
+ config["config"] = json.loads(config["config"])
124
+ if "config" in config:
125
+ if "heartbeat_server" in config["config"]:
126
+ self.heartbeat_server = config["config"]["heartbeat_server"]
127
+ log_debug(f"Set heartbeat server to: {self.heartbeat_server}")
128
+ if "message_server" in config["config"]:
129
+ self.message_server = config["config"]["message_server"]
130
+ log_debug(f"Set message server to: {self.message_server}")
131
+ except (ValueError, AttributeError) as e:
132
+ ErrorContext.publish(exceptions.SDKError(f"处理ap返回的数据出错: {response.text}"))
133
+ log_exception(f"Failed to parse JSON. Response content: {response.text[:500]}. Error: {e}")
134
+ else:
135
+ log_error(f"Get entrypoint config {ep_url} failed:{response.json()}")
136
+
137
+ except Exception as e:
138
+ log_exception(f"Get entrypoint config exception occurred: {e}")
139
+ ErrorContext.publish(exceptions.SDKError(f"Get entrypoint config exception occurred: {e}"))
140
+
141
+ def get_agent_profile(self, agentid):
142
+ try:
143
+ url = f"https://{agentid}/agentprofile.json"
144
+ response = self.get_request(url)
145
+ if response.status_code == 200:
146
+ log_debug(f"get_agent_public_data ok:{response.json()}")
147
+ return response.json()
148
+ else:
149
+ log_error(f"get_agent_public_data failed:{response.json()}")
150
+ return None
151
+ except Exception as e:
152
+ log_exception(f"Get agent public data exception occurred: {e}")
153
+ return None
154
+
155
+ def get_agent_public_data(self, agentid):
156
+ try:
157
+ ep_url = self.server_url + "/get_agent_public_data"
158
+ data = {
159
+ "agent_id": f"{agentid}",
160
+ "signature": self.auth_client.signature,
161
+ }
162
+ response = self.post_request(ep_url, json=data)
163
+ if response.status_code == 200:
164
+ log_debug(f"get_agent_public_data ok:{response.json()}")
165
+ return response.json()[
166
+ "data"
167
+ ] # Return the data if it exists, else return None or handle it as you like
168
+ else:
169
+ log_error(f"get_agent_public_data failed:{response.json()}")
170
+ return None
171
+ except Exception as e:
172
+ log_exception(f"Get agent public data exception occurred: {e}")
173
+ return None
174
+
175
+ def get_agent_private_data(self):
176
+ try:
177
+ ep_url = self.server_url + "/get_agent_private_data"
178
+ data = {
179
+ "agent_id": f"{self.agent_id}",
180
+ "signature": self.auth_client.signature,
181
+ }
182
+ response = self.post_request(ep_url, json=data)
183
+ if response.status_code == 200:
184
+ log_debug(f"Get_agent_private_data ok:{response.json()}")
185
+ return response.json()["data"]
186
+ else:
187
+ log_error(f"Get_agent_private_data failed:{response.json()}")
188
+ return None
189
+ except Exception as e:
190
+ log_exception(f"Get agent private data exception occurred: {e}")
191
+ return None
192
+
193
+ def get_heartbeat_server(self):
194
+ return self.heartbeat_server
195
+
196
+ def get_message_server(self):
197
+ return self.message_server
198
+
199
+ def __get_sha256(self, input_str: str) -> str:
200
+ sha256_hash = hashlib.sha256()
201
+ sha256_hash.update(input_str.encode("utf-8"))
202
+ return sha256_hash.hexdigest()
203
+
204
+ def __scan_folder(self, folder_path):
205
+ file_list = []
206
+ for root, dirs, files in os.walk(folder_path):
207
+ for file in files:
208
+ relative_file_path = os.path.relpath(os.path.join(root, file), folder_path)
209
+ relative_file_path = relative_file_path.replace("\\", "/")
210
+ file_path = os.path.join(root, file)
211
+
212
+ try:
213
+ file_size = os.path.getsize(file_path)
214
+ last_modified_utc = datetime.datetime.fromtimestamp(
215
+ os.path.getmtime(file_path), tz=datetime.timezone.utc
216
+ )
217
+ last_modified_ms = int(last_modified_utc.timestamp() * 1000)
218
+ sha256 = self.__get_sha256(file_path)
219
+ file_info = {
220
+ "full_path": relative_file_path,
221
+ "size": file_size,
222
+ "last_modified": last_modified_ms,
223
+ "sha256": sha256,
224
+ }
225
+ file_list.append(file_info)
226
+ except Exception as e:
227
+ import traceback
228
+
229
+ log_error(f"处理文件 {relative_file_path} 时出错,错误信息: {str(e)}")
230
+ log_error("详细堆栈信息如下:")
231
+ log_error(traceback.format_exc())
232
+ return file_list
233
+
234
+ def sync_public_files(self, file_path) -> bool:
235
+ try:
236
+ files_list = self.__scan_folder(file_path)
237
+ ep_url = self.server_url + "/sync_public_files"
238
+ data = {
239
+ "agent_id": f"{self.agent_id}",
240
+ "signature": self.auth_client.signature,
241
+ "file_list": files_list,
242
+ }
243
+ response = requests.post(ep_url, json=data, verify=False, proxies={})
244
+ if response.status_code == 200:
245
+ rj = response.json()
246
+ log_info(f"sync_public_files ok:{rj}")
247
+ if "need_upload_files" in rj:
248
+ need_upload_files = rj["need_upload_files"]
249
+ for file_name in need_upload_files:
250
+ params = {
251
+ "agent_id": self.agent_id,
252
+ "signature": self.auth_client.signature,
253
+ "file_name": file_name,
254
+ }
255
+ full_path = os.path.join(file_path, file_name)
256
+ hb_url = self.server_url + "/upload_file"
257
+ with open(full_path, "rb") as file:
258
+ files = {"file": file}
259
+ response = requests.post(hb_url, data=params, files=files, verify=False, proxies={})
260
+ if response.status_code == 200:
261
+ log_info(f"文件{file_name}上传成功 => {response.json()['url']}")
262
+ else:
263
+ log_error(f"文件{file_name}上传失败,状态码: {response.status_code}")
264
+ if "need_download_files" in rj:
265
+ need_download_files = rj["need_download_files"]
266
+ for file_name in need_download_files:
267
+ download_url = (
268
+ self.server_url
269
+ + "/download_file"
270
+ + f"?file_name={file_name}&agent_id={self.agent_id}&signature={self.auth_client.signature}"
271
+ )
272
+ log_info(f"download_url:{download_url}")
273
+ try:
274
+ # 发送 GET 请求下载文件
275
+ response = requests.get(download_url, verify=False, stream=True, proxies={})
276
+ response.raise_for_status() # 检查请求是否成功
277
+ # 打开本地文件以写入二进制数据
278
+ save_path = os.path.join(file_path, file_name)
279
+ os.makedirs(os.path.dirname(save_path), exist_ok=True)
280
+ with open(save_path, "wb") as file:
281
+ # 逐块写入文件,避免一次性加载大文件到内存
282
+ for chunk in response.iter_content(chunk_size=16384):
283
+ if chunk: # 过滤掉保持活动的新块
284
+ file.write(chunk)
285
+ log_info(f"文件下载成功,保存路径: {save_path}")
286
+ except requests.RequestException as e:
287
+ log_error(f"下载文件时发生请求错误: {e}")
288
+ except Exception as e:
289
+ log_error(f"下载文件时发生未知错误: {e}")
290
+ return True
291
+ else:
292
+ raise Exception(f"sync_public_files failed:{response.status_code}")
293
+ return False
294
+ except Exception:
295
+ import traceback
296
+
297
+ log_error("详细堆栈信息如下:")
298
+ log_error(traceback.format_exc())
299
+ return False
300
+
301
+ def delete_public_file(self, file_name: str):
302
+ try:
303
+ ep_url = self.server_url + "/delete_public_file"
304
+ data = {
305
+ "agent_id": f"{self.agent_id}",
306
+ "signature": self.auth_client.signature,
307
+ "file_name": file_name,
308
+ }
309
+ response = requests.post(ep_url, json=data, verify=False, proxies={})
310
+ if response.status_code == 200:
311
+ log_info(f"delete_public_file ok:{response.json()}")
312
+ else:
313
+ log_error(f"delete_public_file failed:{response.json()}")
314
+ except Exception as e:
315
+ log_exception(f"delete_public_file in exception: {e}")
316
+ pass
@@ -0,0 +1,31 @@
1
+ {
2
+ "received_total": 11,
3
+ "dispatched_success": 11,
4
+ "dispatched_failed": 0,
5
+ "handler_success": 10,
6
+ "handler_failed": 0,
7
+ "dispatch_queue_size": 0,
8
+ "dispatch_success_rate": "100.00%",
9
+ "handler_success_rate": "90.91%",
10
+ "dispatch_latency": {
11
+ "avg_ms": "0.90",
12
+ "p50_ms": "0.53",
13
+ "p95_ms": "1.97",
14
+ "p99_ms": "1.97"
15
+ },
16
+ "handler_latency": {
17
+ "avg_ms": "5026.83",
18
+ "p50_ms": "4824.77",
19
+ "p95_ms": "21972.03",
20
+ "p99_ms": "21972.03"
21
+ },
22
+ "throughput": {
23
+ "messages_per_second": "0.09",
24
+ "dispatched_per_second": "0.09"
25
+ },
26
+ "uptime_seconds": "120",
27
+ "agent_id": "claude_code_proxy.aid.pub",
28
+ "agent_name": "",
29
+ "timestamp": 1762966733.0209625,
30
+ "timestamp_str": "2025-11-13 00:58:53"
31
+ }
@@ -0,0 +1,20 @@
1
+ # -*- coding: utf-8 -*-
2
+ # Copyright 2025 AgentUnion Inc.
3
+ #
4
+ # Licensed under the Apache License, Version 2.0 (the "License");
5
+ # you may not use this file except in compliance with the License.
6
+ # You may obtain a copy of the License at
7
+ #
8
+ # http://www.apache.org/licenses/LICENSE-2.0
9
+ #
10
+ # Unless required by applicable law or agreed to in writing, software
11
+ # distributed under the License is distributed on an "AS IS" BASIS,
12
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ # See the License for the specific language governing permissions and
14
+ # limitations under the License.
15
+
16
+ from . import auth_client
17
+ from. import client
18
+ from. import env
19
+ from. import html_util
20
+ from. import log