@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,126 @@
1
+ from datetime import datetime, timezone
2
+ import agentcp
3
+ import os
4
+ from pathlib import Path # 新增导入
5
+ import json
6
+ def create_financial_analyzer_json(publisherInfo):
7
+ """创建智能体能力、权限描述"""
8
+ profile_json_data = {
9
+ "publisherInfo": publisherInfo,
10
+ "avaUrl": "https://tse3-mm.cn.bing.net/th/id/OIP-C.Hux_MNYiHtMI5EnBzSIubAAAAA?rs=1&pid=ImgDetMain",
11
+ "version": "1.0.0",
12
+ "lastUpdated": datetime.now(timezone.utc).strftime("%Y-%m-%dT%H:%M:%SZ"),
13
+ "name": "deepseek",
14
+ "description": "SSE模式接入dify的工作流:输入输出都是字符串(其中输入字符串应该包含:旅行目的地、旅行天数、旅行预算信息)",
15
+ "capabilities": {
16
+ "core": ["dify工作流智能体"],
17
+ "extended": []
18
+ },
19
+ "llm":{
20
+ "model":"qwen-plus", #模型名称,或使用aid
21
+ "num_parameters":"", #模型参数量(如"7B"表示70亿参数)
22
+ "quantization_bits":"", #量化位数(如Q4表示4位量化)
23
+ "context_length":"", #上下文长度(如"4096"表示4096个token)
24
+ },
25
+ "references": {
26
+ "knowledgeBases": [""],
27
+ "tools": [""],
28
+ "companyInfo": [""],
29
+ "productInfo": [""]
30
+ },
31
+ "authorization": {
32
+ "modes": ["free"],
33
+ "fee": {},
34
+ "description": "当前智能体免费使用,无费用",
35
+ "sla": {}
36
+ },
37
+ "input": {
38
+ "types": ["content"], # 目前支持"content", "search", "reasoning_content", "error", 'file',后续会支持语音视频流
39
+ "formats": ["json"], # 详细类型
40
+ "examples": {
41
+ "type": "content",
42
+ "format": "text",
43
+ "content": "搜索智能体:xxx"
44
+ },
45
+ "semantics": [""],
46
+ "compatibleAids": ["*"]
47
+ },
48
+ "output": {
49
+ "types": ["content"],
50
+ "formats": ["markdown"],
51
+ "examples": {
52
+ "type": "content",
53
+ "format": "markdown",
54
+ "content": ""
55
+ },
56
+ "semantics": [""],
57
+ "compatibleAids": [""]
58
+ },
59
+ "supportStream": False, # False代表当前智能体不支持流式输出
60
+ "supportAsync": True,
61
+ "permission": ["*"]
62
+ }
63
+ return profile_json_data
64
+
65
+ def write_agent_profile_json(json_data):
66
+ try:
67
+ import os
68
+ json_path = Path(__file__).resolve()
69
+ json_dir = json_path.parent
70
+ json_file = os.path.join(json_dir, 'agentprofile.json')
71
+ with open(json_file, 'w', encoding='utf-8') as f:
72
+ json.dump(json_data, f, ensure_ascii=False, indent=2)
73
+ print("智能体描述文件已保存至当前目录下agentprofile.json")
74
+ except Exception as e:
75
+ print(f"文件写入失败: {str(e)}")
76
+ exit(1)
77
+
78
+
79
+ if __name__ == "__main__":
80
+ # 创建JSON数据
81
+ # 将加密种子修改为自己的加密种子,可以是随机字符串,也可以是固定字符串,只要保证一致即可。
82
+ acp = agentcp.AgentCP(os.path.pardir ,seed_password="123456",debug=False)
83
+ agentid_list = acp.get_aid_list()
84
+ agentid:agentcp.AgentID = None
85
+ while agentid is None:
86
+ print("请选择一个身份(aid):")
87
+ for i, agentid in enumerate(agentid_list):
88
+ print(f"{i+1}. {agentid}")
89
+ print(f"{len(agentid_list)+1}. 创建一个新的身份(aid)")
90
+ choice = input("请输入数字选择一个身份(aid): ")
91
+ try:
92
+ choice = int(choice) - 1
93
+ if choice < 0 or choice > len(agentid_list):
94
+ raise ValueError
95
+ if choice == len(agentid_list):
96
+ aid = input("请输入名称: ")
97
+ agentid = acp.create_aid("agentunion.cn",aid)
98
+ if agentid is None:
99
+ print("创建身份(aid)失败,请打开日志查看原因")
100
+ exit(1)
101
+ agentid_list = acp.get_aid_list()
102
+ else:
103
+ agentid = acp.load_aid(agentid_list[choice])
104
+ if agentid is None:
105
+ print("加载身份(aid)失败,请打开日志查看原因")
106
+ exit(1)
107
+ except ValueError:
108
+ print("无效的选择,请重新输入。")
109
+ print(f"当前选择的身份(aid)是: {str(agentid)}")
110
+ agentid.init_ap_client()
111
+ json_data = create_financial_analyzer_json(agentid.get_publisher_info())
112
+ write_agent_profile_json(json_data)
113
+ select_result = input("是否将文件拷贝到agent公有数据目录下(Y/N): ")
114
+ if select_result.upper() != "Y":
115
+ print("程序运行结束")
116
+ exit(1)
117
+ agentid.create_agent_profile(json_data)
118
+ select_result = input("拷贝成功,是否同步到接入服务器(Y/N): ")
119
+ if select_result.upper() != "Y":
120
+ print("程序运行结束")
121
+ exit(1)
122
+ result = agentid.sync_public_files()
123
+ if result:
124
+ print("文件同步成功!")
125
+ else:
126
+ print("文件同步失败,请初始化ACP时打开日志查看")
@@ -0,0 +1,46 @@
1
+ # -*- coding:utf-8 -*-
2
+ """
3
+ 基础配置:
4
+ SSE模式接入dify的工作流:输入输出都是字符串(其中输入字符串应该包含:旅行目的地、旅行天数、旅行预算信息)
5
+ https://tse3-mm.cn.bing.net/th/id/OIP-C.Hux_MNYiHtMI5EnBzSIubAAAAA?rs=1&pid=ImgDetMain
6
+ """
7
+ import agentcp
8
+ import os
9
+ import json
10
+ import requests
11
+ from dotenv import load_dotenv, find_dotenv
12
+
13
+ # 加载并读取环境变量
14
+ load_dotenv(find_dotenv())
15
+ base_url = os.getenv('BASE_URL')
16
+ api_key = os.getenv('API_KEY')
17
+
18
+ def dify_workflow_client(query: str)-> str:
19
+ """ dify工作流客户端"""
20
+ headers = { 'Authorization': f'Bearer {api_key}', 'Content-Type': 'application/json; charset=utf-8'}
21
+ data = json.dumps({'inputs': {'query':query}, 'conversation_id': '', 'user': os.getenv('AID')}, ensure_ascii=False).encode('utf-8')
22
+ response = requests.post(base_url, headers=headers, data=data, stream=False)
23
+ print(f'dify response = {response}')
24
+ if response.status_code != 200:
25
+ return f'请求失败:{response.text}'
26
+ result = json.loads(response.text)['data']['outputs']['text']
27
+ print(f'difyworkflow回复[query = {query}]:response = {result}')
28
+ return result
29
+
30
+ if __name__ == "__main__":
31
+ acp = agentcp.AgentCP(os.path.pardir, seed_password='123456', debug=True)
32
+ print(f"当前acp访问路径:{acp.app_path}\n开始:agentcp版本:{agentcp.__version__},{__file__}")
33
+ aid = acp.load_aid(os.getenv('AID'))
34
+
35
+ @aid.message_handler()
36
+ async def sync_message_handler(msg):
37
+ # 大模型对话
38
+ response = dify_workflow_client(query=aid.get_content_from_message(msg))
39
+ # 消息回复
40
+ aid.send_message_content(aid.get_session_id_from_message(msg), [aid.get_sender_from_message(msg)], response)
41
+ return True
42
+
43
+ # agent上线
44
+ aid.online()
45
+ # 开启永久监听
46
+ acp.serve_forever()
@@ -0,0 +1,44 @@
1
+ # 代码解释器Agent
2
+
3
+ 这是一个基于ACP协议的代码解释器Agent,可以python的代码执行。
4
+
5
+ ```
6
+
7
+ # 安装依赖
8
+ pip install agentcp RestrictedPython
9
+ ```
10
+
11
+ ## 使用说明
12
+
13
+ 1. 启动Agent:
14
+
15
+ ```bash
16
+ # 创建身份
17
+ python create_profile.py
18
+
19
+ # 修改main.py里的 AGENT_NAME 为你创建的身份信息
20
+ python main.py
21
+ ```
22
+
23
+ ## 功能特性
24
+
25
+ - ✅ 安全的python代码执行
26
+
27
+ ```python
28
+ def add(a, b):
29
+ return a + b
30
+ result = add(1, 2)
31
+ ```
32
+
33
+ ## 调用说明
34
+
35
+ 1. 传入参数 `code` 应为合法的Python代码字符串。
36
+ 2. 执行代码时,会使用 `RestrictedPython` 进行安全限制,防止执行危险操作。
37
+ 3. 代码中的 `print` 输出会被 `PrintCollector` 捕获,但当前方法未返回该输出。
38
+ 4. 最终结果需要存储在名为 `result` 的变量中,方法会尝试从执行环境中获取该变量的值并返回。
39
+ 5. 代码中可以使用 `import` 进行模块导入,但由于安全性考虑,建议谨慎使用。
40
+
41
+ ## 注意事项
42
+
43
+ - 复杂代码执行可能失败
44
+ - 某些代码可能因为没有模块缺失失败
@@ -0,0 +1,89 @@
1
+ {
2
+ "publisherInfo": {
3
+ "publisherAid": "exec1.agentunion.cn",
4
+ "organization": "agentunion.cn",
5
+ "certificationSignature": "agentunion.cn"
6
+ },
7
+ "version": "1.0.0",
8
+ "lastUpdated": "2025-05-08T09:44:33Z",
9
+ "name": "代码执行器",
10
+ "description": "Python代码执行器,支持Python代码的执行和调试。",
11
+ "avaUrl": "https://imgapi.imooc.com/66ebdca0091376a110241024.jpg",
12
+ "capabilities": {
13
+ "core": [
14
+ "Python代码执行"
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": ""
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,139 @@
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
+ data = {
24
+ "publisherInfo": publisherInfo,
25
+ "version": "1.0.0",
26
+ "lastUpdated": datetime.now(timezone.utc).strftime("%Y-%m-%dT%H:%M:%SZ"),
27
+ "name": "代码执行器",
28
+ "description": "Python代码执行器,支持Python代码的执行和调试。",
29
+ "avaUrl": "https://imgapi.imooc.com/66ebdca0091376a110241024.jpg",
30
+ "capabilities": {
31
+ "core": ["Python代码执行"],
32
+ "extended": [],
33
+ },
34
+ "llm": {
35
+ "model": "qwen-plus", # 模型名称,或使用aid
36
+ "num_parameters": "", # 模型参数量(如"7B"表示70亿参数)
37
+ "quantization_bits": "", # 量化位数(如Q4表示4位量化)
38
+ "context_length": "", # 上下文长度(如"4096"表示4096个token)
39
+ },
40
+ "references": {
41
+ "knowledgeBases": [""],
42
+ "tools": [""],
43
+ "companyInfo": [""],
44
+ "productInfo": [""],
45
+ },
46
+ "authorization": {
47
+ "modes": ["free"],
48
+ "fee": {},
49
+ "description": "",
50
+ "sla": {},
51
+ },
52
+ "input": {
53
+ "types": ["content"],
54
+ "formats": ["json"], # 详细类型
55
+ "examples": {
56
+ "type": "content",
57
+ "format": "text",
58
+ "content": "",
59
+ },
60
+ "semantics": [""],
61
+ "compatibleAids": ["*"],
62
+ },
63
+ "output": {
64
+ "types": ["content"],
65
+ "formats": ["markdown"],
66
+ "examples": {"type": "content", "format": "markdown", "content": ""},
67
+ "semantics": [""],
68
+ "compatibleAids": [""],
69
+ },
70
+ "supportStream": True, # False代表当前智能体不支持流式输出
71
+ "supportAsync": True,
72
+ "permission": ["*"],
73
+ }
74
+ return data
75
+
76
+
77
+ def write_agent_profile_json(json_data):
78
+ try:
79
+ import os
80
+
81
+ json_path = Path(__file__).resolve()
82
+ json_dir = json_path.parent
83
+ json_file = os.path.join(json_dir, "agentprofile.json")
84
+ with open(json_file, "w", encoding="utf-8") as f:
85
+ json.dump(json_data, f, ensure_ascii=False, indent=2)
86
+ print("智能体描述文件已保存至当前目录下agentprofile.json")
87
+ except Exception as e:
88
+ print(f"文件写入失败: {str(e)}")
89
+ exit(1)
90
+
91
+
92
+ if __name__ == "__main__":
93
+ # 创建JSON数据
94
+ # 将加密种子修改为自己的加密种子,可以是随机字符串,也可以是固定字符串,只要保证一致即可。
95
+ acp = agentcp.AgentCP(".", seed_password="888777", debug=False)
96
+ agentid_list = acp.get_aid_list()
97
+ agentid: agentcp.AgentID = None
98
+ while agentid is None:
99
+ print("请选择一个身份(aid):")
100
+ for i, agentid in enumerate(agentid_list):
101
+ print(f"{i+1}. {agentid}")
102
+ print(f"{len(agentid_list)+1}. 创建一个新的身份(aid)")
103
+ choice = input("请输入数字选择一个身份(aid): ")
104
+ try:
105
+ choice = int(choice) - 1
106
+ if choice < 0 or choice > len(agentid_list):
107
+ raise ValueError
108
+ if choice == len(agentid_list):
109
+ aid = input("请输入名称: ")
110
+ agentid = acp.create_aid("agentunion.cn", aid)
111
+ if agentid is None:
112
+ print("创建身份(aid)失败,请打开日志查看原因")
113
+ exit(1)
114
+ agentid_list = acp.get_aid_list()
115
+ else:
116
+ agentid = acp.load_aid(agentid_list[choice])
117
+ if agentid is None:
118
+ print("加载身份(aid)失败,请打开日志查看原因")
119
+ exit(1)
120
+ except ValueError:
121
+ print("无效的选择,请重新输入。")
122
+ print(f"当前选择的身份(aid)是: {str(agentid)}")
123
+ agentid.init_ap_client()
124
+ json_data = create_financial_analyzer_json(agentid.get_publisher_info())
125
+ write_agent_profile_json(json_data)
126
+ select_result = input("是否将文件拷贝到agent公有数据目录下(Y/N): ")
127
+ if select_result.upper() != "Y":
128
+ print("程序运行结束")
129
+ exit(1)
130
+ agentid.create_agent_profile(json_data)
131
+ select_result = input("拷贝成功,是否同步到接入服务器(Y/N): ")
132
+ if select_result.upper() != "Y":
133
+ print("程序运行结束")
134
+ exit(1)
135
+ result = agentid.sync_public_files()
136
+ if result:
137
+ print("文件同步成功!")
138
+ else:
139
+ print("文件同步失败,请初始化ACP时打开日志查看")
@@ -0,0 +1,160 @@
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 agentcp import AgentCP
16
+ import asyncio
17
+ import json
18
+ from RestrictedPython import compile_restricted
19
+ from RestrictedPython.Guards import safe_builtins, guarded_unpack_sequence
20
+
21
+ class PrintCollector:
22
+ """Collect written text, and return it when called."""
23
+
24
+ def __init__(self, _getattr_=None):
25
+ self.txt = []
26
+ self._getattr_ = _getattr_
27
+
28
+ def write(self, text):
29
+ self.txt.append(text)
30
+
31
+ def __call__(self, *args, **kwargs):
32
+ return self
33
+
34
+ def _call_print(self, *objects, **kwargs):
35
+ if kwargs.get("file", None) is None:
36
+ kwargs["file"] = self
37
+ else:
38
+ self._getattr_(kwargs["file"], "write")
39
+
40
+ print(*objects, **kwargs)
41
+
42
+
43
+ class PythonExecutorAgent:
44
+ def __init__(self, endpoint: str, name: str):
45
+ self.acp = AgentCP("./", seed_password="888777")
46
+ self.endpoint = endpoint
47
+ self.name = name
48
+ self.aid = None
49
+
50
+ async def message_handler(self, msg):
51
+ """
52
+ 消息处理器 - 执行Python代码并返回结果
53
+ """
54
+ try:
55
+ ref_msg_id = msg.get("ref_msg_id")
56
+ content = msg.get("message", '"{}"')
57
+ content = json.loads(content)[0]["content"]
58
+ content = json.loads(content)
59
+ text = content.get("text", "")
60
+ if not text.strip():
61
+ await self._send_reply(msg, "请输入要执行的Python代码")
62
+ return True
63
+
64
+ try:
65
+ # 安全地执行代码
66
+ result = await self.safe_exec(text)
67
+ print(f"执行结果: {result}")
68
+ await self._send_reply(msg, f"执行结果:<br>{result}")
69
+ except Exception as e:
70
+ print(f"执行代码出错: {str(e)}")
71
+ await self._send_reply(msg, f"执行出错:<br> {str(e)}")
72
+
73
+ return True
74
+
75
+ except Exception as e:
76
+ print(f"处理消息出错: {str(e)}")
77
+ await self._send_reply(msg, f"处理代码时出错:<br> {str(e)}")
78
+ return False
79
+
80
+ async def _send_reply(self, original_msg, content: str):
81
+ """
82
+ 发送回复消息
83
+ """
84
+ try:
85
+ self.aid.send_message_content(
86
+ to_aid_list=[original_msg.get("sender")],
87
+ session_id=original_msg.get("session_id"),
88
+ llm_content=content,
89
+ )
90
+ except Exception as e:
91
+ print(f"发送回复消息出错: {str(e)}")
92
+ async def safe_exec(self, code: str):
93
+ """
94
+ 安全地执行Python代码
95
+
96
+ 调用说明:
97
+ 1. 传入参数 `code` 应为合法的Python代码字符串。
98
+ 2. 执行代码时,会使用 `RestrictedPython` 进行安全限制,防止执行危险操作。
99
+ 3. 代码中的 `print` 输出会被 `PrintCollector` 捕获,但当前方法未返回该输出。
100
+ 4. 最终结果需要存储在名为 `result` 的变量中,方法会尝试从执行环境中获取该变量的值并返回。
101
+ 5. 代码中可以使用 `import` 进行模块导入,但由于安全性考虑,建议谨慎使用。
102
+
103
+ 参数:
104
+ code (str): 要安全执行的Python代码字符串。
105
+
106
+ 返回:
107
+ Any: 执行代码中 `result` 变量的值,如果不存在则返回 `None`。
108
+ """
109
+ safe_builtins.update(
110
+ {
111
+ "__import__": __import__,
112
+ }
113
+ )
114
+
115
+ policy_globals = {
116
+ "__builtins__": safe_builtins,
117
+ "_print_": PrintCollector(), # 用于捕获print输出
118
+ "_getattr_": getattr,
119
+ "_getiter_": iter,
120
+ "_getitem_": lambda obj, index: obj[index],
121
+ "_iter_unpack_sequence_": guarded_unpack_sequence, # 支持多变量赋值
122
+ }
123
+
124
+ byte_code = compile_restricted(code, filename="<inline>", mode="exec")
125
+ exec(byte_code, policy_globals)
126
+ # 查看print输出
127
+ # output = policy_globals["_print_"]()
128
+ # print(f"沙箱输出结果:\n{output.txt}")
129
+ # 获取结果, 最终结果返回必须是变量result
130
+ result = policy_globals.get("result")
131
+ print("Captured result:", result)
132
+ return result
133
+
134
+ async def run(self):
135
+ """运行Agent"""
136
+ try:
137
+ self.aid = self.acp.create_aid(self.endpoint, self.name)
138
+ self.aid.add_message_handler(self.message_handler)
139
+ self.aid.online()
140
+ print("Python执行器Agent已上线,等待代码执行指令...")
141
+
142
+ while True:
143
+ await asyncio.sleep(1)
144
+
145
+ except Exception as e:
146
+ print(f"发生错误: {str(e)}")
147
+ finally:
148
+ if self.aid:
149
+ self.aid.offline()
150
+ print("Agent已下线")
151
+
152
+
153
+ if __name__ == "__main__":
154
+ # 配置参数
155
+ ENDPOINT = "agentunion.cn"
156
+ AGENT_NAME = "exec1" # 请使用真实的aid
157
+
158
+ # 创建并运行Agent
159
+ agent = PythonExecutorAgent(ENDPOINT, AGENT_NAME)
160
+ asyncio.run(agent.run())
@@ -0,0 +1,45 @@
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
+ ## 使用说明
20
+
21
+ 1. 启动Agent:
22
+
23
+ ```bash
24
+ # 创建身份
25
+ python create_profile.py
26
+
27
+ # 修改main.py里的 AGENT_NAME 为你创建的身份信息
28
+ python main.py
29
+ ```
30
+
31
+
32
+ ## 交互说明
33
+
34
+ 发送指令格式:
35
+
36
+ - 查询文件列表: "查询文件" 或 "列表"
37
+ - 读取文件内容: "读取文件" 或 "查看文件" (会进入交互模式, 只需输入文件名即可)
38
+
39
+
40
+
41
+ ## 注意事项
42
+
43
+ - 文件操作限制在沙箱目录内(AgentID的公有数据目录)
44
+ - 只能操作文本文件
45
+