@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,137 @@
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 struct
16
+ import zlib
17
+ import json
18
+ from dataclasses import dataclass
19
+
20
+ @dataclass
21
+ class WssBinaryMessage:
22
+ """
23
+ 用于存储 WSS 二进制消息中从 magic_byte1 到 payload 的各个字段的数据类。
24
+ """
25
+ magic_byte1: int = 77 # ord('M')
26
+ magic_byte2: int = 85 # ord('U')
27
+ version: int = 0x101
28
+ flags: int = 0
29
+ msg_type: int = 1
30
+ msg_seq: int = 0
31
+ content_type: int = 1
32
+ compressed: int = 0
33
+ reserved: int = 0
34
+ crc32: int = 0
35
+ payload_length: int = 0
36
+ payload: bytes = b''
37
+
38
+ def encode_wss_binary_message(json_data):
39
+ magic_byte1 = ord('M')
40
+ magic_byte2 = ord('U')
41
+ version = 0x101
42
+ flags = 0
43
+ msg_type = 1
44
+ # 假设 msg_seq 初始为 0,可根据实际情况调整
45
+ msg_seq = 0
46
+ payload = json_data.encode()
47
+ if len(payload) < 512:
48
+ content_type = 1
49
+ compressed = 0
50
+ else:
51
+ content_type = 1
52
+ compressed = 1
53
+ payload = zlib.compress(payload)
54
+ reserved = 0
55
+ crc32 = zlib.crc32(payload)
56
+ payload_length = len(payload)
57
+
58
+
59
+ header = struct.pack('>BBHIHIBBIII', magic_byte1, magic_byte2, version, flags, msg_type, msg_seq, content_type, compressed, reserved, crc32, payload_length)
60
+ #print(f"Header: {header}")
61
+ #print(f"Payload: {payload}")
62
+ return header + payload
63
+
64
+
65
+ def decode_wss_binary_message(data):
66
+ try:
67
+ magic_byte1, magic_byte2, version, flags, msg_type, msg_seq, content_type, compressed, reserved, crc32, payload_length = struct.unpack('>BBHIHIBBIII', data[:28])
68
+ if magic_byte1 != ord('M') or magic_byte2 != ord('U'):
69
+ return ""
70
+ payload = data[28:]
71
+ if len(payload) != payload_length:
72
+ return ""
73
+ if zlib.crc32(payload) != crc32:
74
+ return ""
75
+ if compressed != 0 and compressed != 1:
76
+ return ""
77
+ if compressed == 1:
78
+ payload = zlib.decompress(payload)
79
+ return payload.decode()
80
+ except (struct.error, zlib.error):
81
+ return ""
82
+ except Exception:
83
+ return ""
84
+
85
+
86
+ def encode_wss_binary_buffer(payload, msg_header: WssBinaryMessage):
87
+ magic_byte1 = ord('M')
88
+ magic_byte2 = ord('U')
89
+ version = msg_header.version
90
+ flags = msg_header.flags
91
+ msg_type = msg_header.msg_type
92
+ # 假设 msg_seq 初始为 0,可根据实际情况调整
93
+ msg_seq = msg_header.msg_seq
94
+ content_type = msg_header.content_type
95
+ compressed = msg_header.compressed
96
+ reserved = msg_header.reserved
97
+ crc32 = zlib.crc32(payload)
98
+ payload_length = len(payload)
99
+
100
+ header = struct.pack('>BBHIHIBBIII', magic_byte1, magic_byte2, version, flags, msg_type, msg_seq, content_type, compressed, reserved, crc32, payload_length)
101
+ #print(f"Header: {header}")
102
+ #print(f"Payload: {payload}")
103
+ return header + payload
104
+
105
+
106
+ def decode_wss_binary_buffer(data):
107
+ try:
108
+ magic_byte1, magic_byte2, version, flags, msg_type, msg_seq, content_type, compressed, reserved, crc32, payload_length = struct.unpack('>BBHIHIBBIII', data[:28])
109
+ if magic_byte1 != ord('M') or magic_byte2 != ord('U'):
110
+ return None
111
+ payload = data[28:]
112
+ if len(payload) != payload_length:
113
+ return None
114
+ if zlib.crc32(payload) != crc32:
115
+ return None
116
+ if compressed != 0 and compressed != 1:
117
+ return None
118
+ if compressed == 1:
119
+ payload = zlib.decompress(payload)
120
+
121
+ wss_msg = WssBinaryMessage()
122
+ wss_msg.version = version
123
+ wss_msg.flags = flags
124
+ wss_msg.msg_type = msg_type
125
+ wss_msg.msg_seq = msg_seq
126
+ wss_msg.content_type = content_type
127
+ wss_msg.compressed = compressed
128
+ wss_msg.reserved = reserved
129
+ wss_msg.crc32 = crc32
130
+ wss_msg.payload_length = len(payload)
131
+ wss_msg.payload = payload
132
+
133
+ return wss_msg
134
+ except (struct.error, zlib.error):
135
+ return None
136
+ except Exception:
137
+ return None
@@ -0,0 +1,7 @@
1
+ cryptography>=3.4.7
2
+ requests>=2.26.0
3
+ websocket-client>=1.2.1
4
+ python-dotenv>=0.19.0
5
+ asyncio>=3.4.3
6
+ typing-extensions>=4.0.1
7
+ openai>=0.27.2
@@ -0,0 +1,37 @@
1
+ # 文件操作Agent
2
+
3
+ 这是一个基于ACP协议的Agent,可以根据会话和群组成员生成关系图
4
+
5
+ ```
6
+
7
+ # 安装依赖
8
+ pip install agentcp
9
+
10
+ ```
11
+
12
+ ## 功能特性
13
+
14
+ - ✅ 消息问答
15
+ - ✅ 生成调用关系图
16
+
17
+ ## 使用说明
18
+
19
+ 1. 启动Agent:
20
+
21
+ ```bash
22
+ # 创建身份
23
+ python create_profile.py
24
+
25
+ # 修改main.py里的 AGENT_NAME 为你创建的身份信息
26
+ python main.py
27
+ ```
28
+
29
+ ## 交互说明
30
+
31
+ 发送指令格式:
32
+
33
+ - 生成调用关系图: "查看关系图"
34
+
35
+
36
+ ## 注意事项
37
+
@@ -0,0 +1,89 @@
1
+ {
2
+ "publisherInfo": {
3
+ "publisherAid": "gggg12.agentunion.cn",
4
+ "organization": "agentunion.cn",
5
+ "certificationSignature": "agentunion.cn"
6
+ },
7
+ "version": "1.0.0",
8
+ "lastUpdated": "2025-05-08T09:40:38Z",
9
+ "name": "Agent调用关系图",
10
+ "description": "Agent调用关系图绘制",
11
+ "avaUrl": "https://t9.baidu.com/it/u=2472616479,557015018&fm=193",
12
+ "capabilities": {
13
+ "core": [
14
+ "调用关系图绘制"
15
+ ],
16
+ "extended": []
17
+ },
18
+ "references": {
19
+ "knowledgeBases": [
20
+ ""
21
+ ],
22
+ "tools": [
23
+ ""
24
+ ],
25
+ "companyInfo": [
26
+ ""
27
+ ],
28
+ "productInfo": [
29
+ ""
30
+ ]
31
+ },
32
+ "llm": {
33
+ "model": "qwen-plus",
34
+ "num_parameters": "",
35
+ "quantization_bits": "",
36
+ "context_length": ""
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": "查看关系图"
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,138 @@
1
+ # Copyright 2025 ModelUnion Inc.
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+
15
+ from datetime import datetime, timezone
16
+ import agentcp
17
+ from pathlib import Path # 新增导入
18
+ import json
19
+
20
+
21
+ def create_financial_analyzer_json(publisherInfo):
22
+ """创建智能体能力、权限描述"""
23
+ profile_json_data = {
24
+ "publisherInfo": publisherInfo,
25
+ "version": "1.0.0",
26
+ "lastUpdated": datetime.now(timezone.utc).strftime("%Y-%m-%dT%H:%M:%SZ"),
27
+ "name": "Agent调用关系图",
28
+ "description": "Agent调用关系图绘制",
29
+ "avaUrl": "https://t9.baidu.com/it/u=2472616479,557015018&fm=193",
30
+ "capabilities": {"core": ["调用关系图绘制"], "extended": []},
31
+ "references": {
32
+ "knowledgeBases": [""],
33
+ "tools": [""],
34
+ "companyInfo": [""],
35
+ "productInfo": [""],
36
+ },
37
+ "llm": {
38
+ "model": "qwen-plus", # 模型名称,或使用aid
39
+ "num_parameters": "", # 模型参数量(如"7B"表示70亿参数)
40
+ "quantization_bits": "", # 量化位数(如Q4表示4位量化)
41
+ "context_length": "", # 上下文长度(如"4096"表示4096个token)
42
+ },
43
+ "authorization": {
44
+ "modes": ["free"],
45
+ "fee": {},
46
+ "description": "",
47
+ "sla": {},
48
+ },
49
+ "input": {
50
+ "types": [
51
+ "content"
52
+ ], # 目前支持"content", "search", "reasoning_content", "error", 'file',后续会支持语音视频流
53
+ "formats": ["json"], # 详细类型
54
+ "examples": {
55
+ "type": "content",
56
+ "format": "text",
57
+ "content": "查看关系图",
58
+ },
59
+ "semantics": [""],
60
+ "compatibleAids": ["*"],
61
+ },
62
+ "output": {
63
+ "types": ["content"],
64
+ "formats": ["markdown"],
65
+ "examples": {"type": "content", "format": "markdown", "content": ""},
66
+ "semantics": [""],
67
+ "compatibleAids": [""],
68
+ },
69
+ "supportStream": True, # False代表当前智能体不支持流式输出
70
+ "supportAsync": True,
71
+ "permission": ["*"],
72
+ }
73
+ return profile_json_data
74
+
75
+
76
+ def write_agent_profile_json(json_data):
77
+ try:
78
+ import os
79
+
80
+ json_path = Path(__file__).resolve()
81
+ json_dir = json_path.parent
82
+ json_file = os.path.join(json_dir, "agentprofile.json")
83
+ with open(json_file, "w", encoding="utf-8") as f:
84
+ json.dump(json_data, f, ensure_ascii=False, indent=2)
85
+ print("智能体描述文件已保存至当前目录下agentprofile.json")
86
+ except Exception as e:
87
+ print(f"文件写入失败: {str(e)}")
88
+ exit(1)
89
+
90
+
91
+ if __name__ == "__main__":
92
+ # 创建JSON数据
93
+ # 将加密种子修改为自己的加密种子,可以是随机字符串,也可以是固定字符串,只要保证一致即可。
94
+ acp = agentcp.AgentCP(".", seed_password="888777", debug=False)
95
+ agentid_list = acp.get_aid_list()
96
+ agentid: agentcp.AgentID = None
97
+ while agentid is None:
98
+ print("请选择一个身份(aid):")
99
+ for i, agentid in enumerate(agentid_list):
100
+ print(f"{i+1}. {agentid}")
101
+ print(f"{len(agentid_list)+1}. 创建一个新的身份(aid)")
102
+ choice = input("请输入数字选择一个身份(aid): ")
103
+ try:
104
+ choice = int(choice) - 1
105
+ if choice < 0 or choice > len(agentid_list):
106
+ raise ValueError
107
+ if choice == len(agentid_list):
108
+ aid = input("请输入名称: ")
109
+ agentid = acp.create_aid("agentunion.cn", aid)
110
+ if agentid is None:
111
+ print("创建身份(aid)失败,请打开日志查看原因")
112
+ exit(1)
113
+ agentid_list = acp.get_aid_list()
114
+ else:
115
+ agentid = acp.load_aid(agentid_list[choice])
116
+ if agentid is None:
117
+ print("加载身份(aid)失败,请打开日志查看原因")
118
+ exit(1)
119
+ except ValueError:
120
+ print("无效的选择,请重新输入。")
121
+ print(f"当前选择的身份(aid)是: {str(agentid)}")
122
+ agentid.init_ap_client()
123
+ json_data = create_financial_analyzer_json(agentid.get_publisher_info())
124
+ write_agent_profile_json(json_data)
125
+ select_result = input("是否将文件拷贝到agent公有数据目录下(Y/N): ")
126
+ if select_result.upper() != "Y":
127
+ print("程序运行结束")
128
+ exit(1)
129
+ agentid.create_agent_profile(json_data)
130
+ select_result = input("拷贝成功,是否同步到接入服务器(Y/N): ")
131
+ if select_result.upper() != "Y":
132
+ print("程序运行结束")
133
+ exit(1)
134
+ result = agentid.sync_public_files()
135
+ if result:
136
+ print("文件同步成功!")
137
+ else:
138
+ print("文件同步失败,请初始化ACP时打开日志查看")
@@ -0,0 +1,164 @@
1
+ # Copyright 2025 ModelUnion Inc.
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+
15
+ import json
16
+ from agentcp import AgentCP
17
+ import networkx as nx
18
+ from pyvis.network import Network
19
+
20
+
21
+ class Graph(nx.DiGraph):
22
+
23
+ def add(self, source, target, info=""):
24
+ if self.has_edge(source, target):
25
+ # 更新 info 信息
26
+ self[source][target]["info"] = info
27
+ else:
28
+ # 添加新边
29
+ self.add_edge(source, target, info=info)
30
+
31
+ def draw(self, name="agent_call_graph.html"):
32
+ net = Network(
33
+ height="600px",
34
+ width="100%",
35
+ directed=True,
36
+ notebook=False,
37
+ cdn_resources="in_line",
38
+ )
39
+ net.from_nx(self)
40
+ root_nodes = [node for node in self.nodes if self.in_degree(node) == 0]
41
+
42
+ # 创建 pyvis 网络图
43
+ net = Network(
44
+ height="600px",
45
+ width="100%",
46
+ directed=True,
47
+ notebook=False,
48
+ cdn_resources="in_line",
49
+ )
50
+
51
+ # 从 NetworkX 图导入结构
52
+ net.from_nx(self)
53
+
54
+ # 放大节点
55
+ for node in net.nodes:
56
+ node["size"] = 15 # 默认 25 左右,40 会明显更大
57
+ node["color"] = "#ADD8E6" # 可选:设置更醒目的颜色
58
+ node["font"] = {"size": 20} # 放大标签字体
59
+ if self.in_degree(node["id"]) == 0:
60
+ node["color"] = "#CFD8E6" # 可选:设置更醒目的颜色
61
+
62
+ # 更新每条边的 title(hover 时显示调用频率)
63
+ for edge in net.edges:
64
+ src = edge["from"]
65
+ tgt = edge["to"]
66
+ info = self.get_edge_data(src, tgt).get("info", "")
67
+ edge["title"] = info # 设置 hover 提示
68
+ edge["arrows"] = "to" # 确保箭头方向正确
69
+
70
+ # 添加物理布局和交互设置
71
+ net.set_options(
72
+ """
73
+ var options = {
74
+ "physics": {
75
+ "enabled": false,
76
+ "stabilization": {
77
+ "iterations": 300
78
+ }
79
+ },
80
+ "interaction": {
81
+ "hover": true,
82
+ "navigationButtons": true,
83
+ "zoomView": true,
84
+ "dragNodes": true
85
+ }
86
+ }
87
+ """
88
+ )
89
+
90
+ # 生成 HTML 并在浏览器中打开
91
+ net.write_html(name, local=False, notebook=False, open_browser=True)
92
+
93
+
94
+ class AgentGraph:
95
+
96
+ def __init__(self, name, endpoint="agentunion.cn"):
97
+ self.name = name
98
+ self.endpoint = endpoint
99
+ self.acp = AgentCP("./", seed_password="888777")
100
+ self.graph = Graph()
101
+ self.aid = self.acp.create_aid(self.endpoint, self.name)
102
+ self.call_count = {}
103
+ self.id = f'{self.name}.{self.endpoint}'
104
+ self.aid.add_message_handler(self.message_handler)
105
+ self.graph_file = f"{self.aid.get_agent_public_path()}/agent_call_graph.html"
106
+
107
+ async def message_handler(self, msg):
108
+ """
109
+ 消息处理器 - 根据消息内容安全地读取文件
110
+ {
111
+ 'session_id': '1831173476580327424',
112
+ 'request_id': '', 'message_id': '9',
113
+ 'ref_msg_id': '',
114
+ 'sender': 'samplesdeveloper.agentunion.cn',
115
+ 'receiver': 'guest_1831158907166261248.agentunion.cn',
116
+ 'message': '[{"type": "text", "status": "success", "timestamp": 1746343146261,
117
+ "content": "{\\"text\\":\\"\\u8bfb\\u53d6\\u6587\\u4ef6agentprofile.json\\",\\"files\\":[],\\"links\\":[],\\"search\\":false,\\"think\\":false}",
118
+ "stream": false, "prompt": null, "extra": null, "artifact": null}]',
119
+ 'timestamp': '1746343146265'
120
+ }
121
+ """
122
+
123
+ sender = msg.get("sender")
124
+ self.call_count[sender] = self.call_count.get(sender, 0) + 1
125
+ print(f"收到来自 {sender} 的消息")
126
+ self.graph.add(sender, self.id, f"调用次数: {self.call_count[sender]}")
127
+ message = json.loads(msg.get("message"))[0]
128
+ message = json.loads(message.get('content', '{}'))
129
+ message = message.get('text', '')
130
+ # self.graph.add(self.id, sender, f'调用次数: {self.call_count[sender]}')
131
+ members = self.aid.get_session_member_list(msg.get("session_id"))
132
+ print(f"群成员: {members}")
133
+ for member in members:
134
+ print(f"群组成员: {member}")
135
+ # self.graph.add(self.id, member, f'调用次数: {self.call_count[member]}'
136
+ if message.find('关系图') != -1:
137
+ print(f"生成关系图: {self.graph_file}")
138
+ try:
139
+ self.graph.draw(name=self.graph_file)
140
+ self.aid.sync_public_files()
141
+ url = f'https://{self.aid.id}/{self.graph_file.split("/")[-1]}'
142
+ self.aid.reply_message(msg, f"关系图已生成可访问: {url} 查看")
143
+ self.graph.add(self.id, sender, f"调用次数: {self.call_count[sender]}")
144
+ except Exception as e:
145
+ print(f"生成关系图失败: {e}")
146
+ else:
147
+ self.graph.add(self.id, sender, f"调用次数: {self.call_count[sender]}")
148
+ self.aid.reply_message(msg, "收到消息")
149
+
150
+ def online(self):
151
+ self.aid.online()
152
+ self.acp.register_signal_handler()
153
+ self.acp.serve_forever()
154
+
155
+ def offline(self):
156
+ self.aid.offline()
157
+ self.graph.draw()
158
+
159
+
160
+ if __name__ == "__main__":
161
+ ENDPOINT = "agentunion.cn"
162
+ AGENT_NAME = "gggg12"
163
+ agent = AgentGraph(AGENT_NAME, ENDPOINT)
164
+ agent.online()