@agentunion/kite 1.4.0 → 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 (235) hide show
  1. package/CHANGELOG.md +102 -0
  2. package/cli.js +44 -5
  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/server.py +33 -17
  7. package/extensions/channels/acp_channel/server.py +33 -17
  8. package/extensions/services/backup/entry.py +23 -16
  9. package/extensions/services/evol/auth_manager.py +443 -0
  10. package/extensions/services/evol/config.yaml +149 -0
  11. package/extensions/services/evol/config_loader.py +117 -0
  12. package/extensions/services/evol/entry.py +406 -0
  13. package/extensions/services/evol/evol_api.py +173 -0
  14. package/extensions/services/evol/evol_config.json5 +29 -0
  15. package/extensions/services/evol/migrate_tokens.py +122 -0
  16. package/extensions/services/evol/module.md +32 -0
  17. package/extensions/services/evol/pairing.py +250 -0
  18. package/extensions/services/evol/pairing_codes.jsonl +1 -0
  19. package/extensions/services/evol/relay.py +682 -0
  20. package/extensions/services/evol/relay_config.json5 +67 -0
  21. package/extensions/services/evol/routes/__init__.py +1 -0
  22. package/extensions/services/evol/routes/routes_management_ws.py +127 -0
  23. package/extensions/services/evol/routes/routes_rpc.py +89 -0
  24. package/extensions/services/evol/routes/routes_test.py +61 -0
  25. package/extensions/services/evol/server.py +875 -0
  26. package/extensions/services/evol/static/css/style.css +1200 -0
  27. package/extensions/services/evol/static/index.html +781 -0
  28. package/extensions/services/evol/static/index_evol.html +14 -0
  29. package/extensions/services/evol/static/js/app.js +6304 -0
  30. package/extensions/services/evol/static/js/auth.js +326 -0
  31. package/extensions/services/evol/static/js/dialog.js +285 -0
  32. package/extensions/services/evol/static/js/evol-app-fixed.js +50 -0
  33. package/extensions/services/evol/static/js/evol-app.js +1949 -0
  34. package/extensions/services/evol/static/js/evol-app.js.bak +1800 -0
  35. package/extensions/services/evol/static/js/kernel-client-example.js +228 -0
  36. package/extensions/services/evol/static/js/kernel-client.js +396 -0
  37. package/extensions/services/evol/static/js/main.js +141 -0
  38. package/extensions/services/evol/static/js/registry-tests.js +585 -0
  39. package/extensions/services/evol/static/js/stats.js +217 -0
  40. package/extensions/services/evol/static/js/token-manager.js +175 -0
  41. package/extensions/services/evol/static/pairing.html +248 -0
  42. package/extensions/services/evol/static/test_registry.html +262 -0
  43. package/extensions/services/evol/static/test_relay.html +462 -0
  44. package/extensions/services/evol/stats_manager.py +240 -0
  45. package/extensions/services/model_service/entry.py +23 -1
  46. package/extensions/services/proxy/.claude/settings.local.json +13 -0
  47. package/extensions/services/proxy/CHANGELOG_20260308.md +258 -0
  48. package/extensions/services/proxy/_fix_prints.py +133 -0
  49. package/extensions/services/proxy/_fix_prints2.py +87 -0
  50. package/extensions/services/proxy/agentcp/LICENCE +178 -0
  51. package/extensions/services/proxy/agentcp/README copy.md +85 -0
  52. package/extensions/services/proxy/agentcp/README.md +260 -0
  53. package/extensions/services/proxy/agentcp/__init__.py +16 -0
  54. package/extensions/services/proxy/agentcp/agent.py +4 -0
  55. package/extensions/services/proxy/agentcp/agentcp.py +2494 -0
  56. package/extensions/services/proxy/agentcp/agentprofile.json +89 -0
  57. package/extensions/services/proxy/agentcp/ap/__init__.py +16 -0
  58. package/extensions/services/proxy/agentcp/ap/ap_client.py +316 -0
  59. package/extensions/services/proxy/agentcp/assets/images/wechat_qr.png +0 -0
  60. package/extensions/services/proxy/agentcp/backup/metrics.json +31 -0
  61. package/extensions/services/proxy/agentcp/base/__init__.py +20 -0
  62. package/extensions/services/proxy/agentcp/base/auth_client.py +257 -0
  63. package/extensions/services/proxy/agentcp/base/client.py +112 -0
  64. package/extensions/services/proxy/agentcp/base/env.py +34 -0
  65. package/extensions/services/proxy/agentcp/base/html_util.py +336 -0
  66. package/extensions/services/proxy/agentcp/base/log.py +98 -0
  67. package/extensions/services/proxy/agentcp/ca/__init__.py +17 -0
  68. package/extensions/services/proxy/agentcp/ca/ca_client.py +414 -0
  69. package/extensions/services/proxy/agentcp/ca/ca_root.py +74 -0
  70. package/extensions/services/proxy/agentcp/context/__init__.py +20 -0
  71. package/extensions/services/proxy/agentcp/context/context.py +73 -0
  72. package/extensions/services/proxy/agentcp/context/exceptions.py +114 -0
  73. package/extensions/services/proxy/agentcp/create_profile.py +125 -0
  74. package/extensions/services/proxy/agentcp/create_profile_weather.py +125 -0
  75. package/extensions/services/proxy/agentcp/db/__init__.py +15 -0
  76. package/extensions/services/proxy/agentcp/db/db_mananger.py +550 -0
  77. package/extensions/services/proxy/agentcp/docs/UDP_HEARTBEAT_FIX_REPORT.md +265 -0
  78. package/extensions/services/proxy/agentcp/docs/heartbeat_issue_analysis.md +291 -0
  79. package/extensions/services/proxy/agentcp/file/__init__.py +16 -0
  80. package/extensions/services/proxy/agentcp/file/file_client.py +141 -0
  81. package/extensions/services/proxy/agentcp/file/wss_binary_message.py +137 -0
  82. package/extensions/services/proxy/agentcp/hcp.py +299 -0
  83. package/extensions/services/proxy/agentcp/heartbeat/__init__.py +16 -0
  84. package/extensions/services/proxy/agentcp/heartbeat/heartbeat_client.py +360 -0
  85. package/extensions/services/proxy/agentcp/improved_scheduler.py +498 -0
  86. package/extensions/services/proxy/agentcp/llm_agent_utils.py +249 -0
  87. package/extensions/services/proxy/agentcp/llm_server.py +172 -0
  88. package/extensions/services/proxy/agentcp/mermaid.py +210 -0
  89. package/extensions/services/proxy/agentcp/message.py +149 -0
  90. package/extensions/services/proxy/agentcp/metrics.py +256 -0
  91. package/extensions/services/proxy/agentcp/monitoring/__init__.py +20 -0
  92. package/extensions/services/proxy/agentcp/monitoring/global_monitor.py +27 -0
  93. package/extensions/services/proxy/agentcp/monitoring/metrics_store.py +325 -0
  94. package/extensions/services/proxy/agentcp/monitoring/monitoring_service.py +269 -0
  95. package/extensions/services/proxy/agentcp/monitoring/sliding_window.py +222 -0
  96. package/extensions/services/proxy/agentcp/monitoring/standalone_reader.py +224 -0
  97. package/extensions/services/proxy/agentcp/msg/__init__.py +21 -0
  98. package/extensions/services/proxy/agentcp/msg/connection_manager.py +456 -0
  99. package/extensions/services/proxy/agentcp/msg/message_client.py +2058 -0
  100. package/extensions/services/proxy/agentcp/msg/message_serialize.py +263 -0
  101. package/extensions/services/proxy/agentcp/msg/open_ai_message.py +88 -0
  102. package/extensions/services/proxy/agentcp/msg/session_manager.py +1062 -0
  103. package/extensions/services/proxy/agentcp/msg/stream_client.py +267 -0
  104. package/extensions/services/proxy/agentcp/msg/websocket_file_receiver.py +89 -0
  105. package/extensions/services/proxy/agentcp/msg/ws_logger.py +685 -0
  106. package/extensions/services/proxy/agentcp/msg/wss_binary_message.py +137 -0
  107. package/extensions/services/proxy/agentcp/requirements.txt +7 -0
  108. package/extensions/services/proxy/agentcp/samples/agent_graph/README.md +37 -0
  109. package/extensions/services/proxy/agentcp/samples/agent_graph/agentprofile.json +89 -0
  110. package/extensions/services/proxy/agentcp/samples/agent_graph/create_profile.py +138 -0
  111. package/extensions/services/proxy/agentcp/samples/agent_graph/main.py +164 -0
  112. package/extensions/services/proxy/agentcp/samples/agent_use/create_profile.py +123 -0
  113. package/extensions/services/proxy/agentcp/samples/agent_use/llm/create_profile.py +129 -0
  114. package/extensions/services/proxy/agentcp/samples/agent_use/llm/env.json +5 -0
  115. package/extensions/services/proxy/agentcp/samples/agent_use/llm/main.py +146 -0
  116. package/extensions/services/proxy/agentcp/samples/agent_use/main.py +123 -0
  117. package/extensions/services/proxy/agentcp/samples/agent_use/readme.md +379 -0
  118. package/extensions/services/proxy/agentcp/samples/agent_use/search/create_profile.py +129 -0
  119. package/extensions/services/proxy/agentcp/samples/agent_use/search/main.py +28 -0
  120. package/extensions/services/proxy/agentcp/samples/agent_use/tool/create_profile.py +129 -0
  121. package/extensions/services/proxy/agentcp/samples/agent_use/tool/main.py +20 -0
  122. package/extensions/services/proxy/agentcp/samples/ali_amap/README.md +97 -0
  123. package/extensions/services/proxy/agentcp/samples/ali_amap/amap_agent.py +88 -0
  124. package/extensions/services/proxy/agentcp/samples/ali_amap/create_profile.py +125 -0
  125. package/extensions/services/proxy/agentcp/samples/compute_agent/agent/powershell.py +228 -0
  126. package/extensions/services/proxy/agentcp/samples/compute_agent/agent/software.py +63 -0
  127. package/extensions/services/proxy/agentcp/samples/compute_agent/agent/tools.py +36 -0
  128. package/extensions/services/proxy/agentcp/samples/compute_agent/browser_user.py +41 -0
  129. package/extensions/services/proxy/agentcp/samples/deepseek/README.md +79 -0
  130. package/extensions/services/proxy/agentcp/samples/deepseek/create_profile.py +126 -0
  131. package/extensions/services/proxy/agentcp/samples/deepseek/deepseek.py +42 -0
  132. package/extensions/services/proxy/agentcp/samples/dify_chat/README.md +78 -0
  133. package/extensions/services/proxy/agentcp/samples/dify_chat/create_profile.py +126 -0
  134. package/extensions/services/proxy/agentcp/samples/dify_chat/dify_chat.py +47 -0
  135. package/extensions/services/proxy/agentcp/samples/dify_workflow/README.md +78 -0
  136. package/extensions/services/proxy/agentcp/samples/dify_workflow/create_profile.py +126 -0
  137. package/extensions/services/proxy/agentcp/samples/dify_workflow/dify_workflow.py +46 -0
  138. package/extensions/services/proxy/agentcp/samples/executor/README.md +44 -0
  139. package/extensions/services/proxy/agentcp/samples/executor/agentprofile.json +89 -0
  140. package/extensions/services/proxy/agentcp/samples/executor/create_profile.py +139 -0
  141. package/extensions/services/proxy/agentcp/samples/executor/main.py +160 -0
  142. package/extensions/services/proxy/agentcp/samples/filereader/README.md +45 -0
  143. package/extensions/services/proxy/agentcp/samples/filereader/agentprofile.json +90 -0
  144. package/extensions/services/proxy/agentcp/samples/filereader/create_profile.py +137 -0
  145. package/extensions/services/proxy/agentcp/samples/filereader/main.py +253 -0
  146. package/extensions/services/proxy/agentcp/samples/filewriter/README.md +38 -0
  147. package/extensions/services/proxy/agentcp/samples/filewriter/agentprofile.json +91 -0
  148. package/extensions/services/proxy/agentcp/samples/filewriter/create_profile.py +138 -0
  149. package/extensions/services/proxy/agentcp/samples/filewriter/main.py +289 -0
  150. package/extensions/services/proxy/agentcp/samples/hcp/README.md +85 -0
  151. package/extensions/services/proxy/agentcp/samples/hcp/acp_weather_agent.zip +0 -0
  152. package/extensions/services/proxy/agentcp/samples/hcp/create_profile.py +125 -0
  153. package/extensions/services/proxy/agentcp/samples/hcp/hcp.py +237 -0
  154. package/extensions/services/proxy/agentcp/samples/helloworld/README.md +68 -0
  155. package/extensions/services/proxy/agentcp/samples/helloworld/hello_world.py +40 -0
  156. package/extensions/services/proxy/agentcp/samples/llm_agent/MEADME.md +117 -0
  157. package/extensions/services/proxy/agentcp/samples/llm_agent/create_profile.py +125 -0
  158. package/extensions/services/proxy/agentcp/samples/llm_agent/qwen_agent.py +136 -0
  159. package/extensions/services/proxy/agentcp/samples/local_llm_agent/README.md +90 -0
  160. package/extensions/services/proxy/agentcp/samples/local_llm_agent/create_profile.py +125 -0
  161. package/extensions/services/proxy/agentcp/samples/local_llm_agent/main.py +49 -0
  162. package/extensions/services/proxy/agentcp/samples/query_llm_from_agent/README.md +55 -0
  163. package/extensions/services/proxy/agentcp/samples/query_llm_from_agent/create_profile.py +125 -0
  164. package/extensions/services/proxy/agentcp/samples/query_llm_from_agent/main.py +23 -0
  165. package/extensions/services/proxy/agentcp/samples/query_weather_api_agent/README.md +103 -0
  166. package/extensions/services/proxy/agentcp/samples/query_weather_api_agent/create_profile.py +125 -0
  167. package/extensions/services/proxy/agentcp/samples/query_weather_api_agent/main.py +69 -0
  168. package/extensions/services/proxy/agentcp/samples/query_weather_from_agent/README.md +58 -0
  169. package/extensions/services/proxy/agentcp/samples/query_weather_from_agent/create_profile.py +125 -0
  170. package/extensions/services/proxy/agentcp/samples/query_weather_from_agent/main.py +25 -0
  171. package/extensions/services/proxy/agentcp/samples/qwen3/README.md +71 -0
  172. package/extensions/services/proxy/agentcp/samples/qwen3/create_profile.py +126 -0
  173. package/extensions/services/proxy/agentcp/samples/qwen3/qwen3.py +37 -0
  174. package/extensions/services/proxy/agentcp/samples/qwen3_tools/README.md +133 -0
  175. package/extensions/services/proxy/agentcp/samples/qwen3_tools/create_profile.py +126 -0
  176. package/extensions/services/proxy/agentcp/samples/qwen3_tools/qwen3_tools.py +98 -0
  177. package/extensions/services/proxy/agentcp/samples/search/create_profile_qwen.py +125 -0
  178. package/extensions/services/proxy/agentcp/samples/search/create_profile_search.py +125 -0
  179. package/extensions/services/proxy/agentcp/samples/search/qwen_agent.py +136 -0
  180. package/extensions/services/proxy/agentcp/samples/search/search_agent.py +170 -0
  181. package/extensions/services/proxy/agentcp/samples/wrapper_agently_to_agent/README.md +89 -0
  182. package/extensions/services/proxy/agentcp/samples/wrapper_agently_to_agent/create_profile.py +125 -0
  183. package/extensions/services/proxy/agentcp/samples/wrapper_agently_to_agent/main.py +44 -0
  184. package/extensions/services/proxy/agentcp/utils/__init__.py +15 -0
  185. package/extensions/services/proxy/agentcp/utils/file_util.py +117 -0
  186. package/extensions/services/proxy/agentcp/utils/proxy_bypass.py +99 -0
  187. package/extensions/services/proxy/agentcp/workflow.py +203 -0
  188. package/extensions/services/proxy/console_auth.py +109 -0
  189. package/extensions/services/proxy/evol/__init__.py +1 -0
  190. package/extensions/services/proxy/evol/config.py +37 -0
  191. package/extensions/services/proxy/evol/http/__init__.py +1 -0
  192. package/extensions/services/proxy/evol/http/async_http.py +551 -0
  193. package/extensions/services/proxy/evol/log.py +28 -0
  194. package/extensions/services/proxy/evol/presenter/__init__.py +2 -0
  195. package/extensions/services/proxy/evol/presenter/agentIdPresenter.py +1031 -0
  196. package/extensions/services/proxy/evol/presenter/apikeyPresenter.py +106 -0
  197. package/extensions/services/proxy/evol/presenter/configPresenter.py +1281 -0
  198. package/extensions/services/proxy/evol/presenter/userPresenter.py +477 -0
  199. package/extensions/services/proxy/evol/server/__init__.py +1 -0
  200. package/extensions/services/proxy/evol/server/claude_proxy_async.py +3430 -0
  201. package/extensions/services/proxy/evol/server/openclaw_proxy.py +1861 -0
  202. package/extensions/services/proxy/evol/server/proxy_config.py +15 -0
  203. package/extensions/services/proxy/evol/server/proxy_engine.py +501 -0
  204. package/extensions/services/proxy/evol/version.py +24 -0
  205. package/extensions/services/proxy/logs/websocket.log +260 -0
  206. package/extensions/services/proxy/main.py +240 -0
  207. package/extensions/services/proxy/requirements.txt +13 -0
  208. package/extensions/services/proxy/server.py +271 -0
  209. package/extensions/services/watchdog/entry.py +42 -16
  210. package/extensions/services/watchdog/module.md +1 -0
  211. package/extensions/services/watchdog/monitor.py +34 -4
  212. package/extensions/services/web/module.md +1 -1
  213. package/extensions/services/web/server.py +30 -18
  214. package/extensions/services/web/static/js/token-manager.js +10 -10
  215. package/kernel/entry.py +1 -1
  216. package/kernel/module.md +25 -1
  217. package/kernel/registry_store.py +2 -26
  218. package/kernel/rpc_router.py +36 -10
  219. package/kernel/server.py +106 -17
  220. package/kite_cli/commands/deps_install.py +67 -0
  221. package/kite_cli/commands/env_check.py +45 -0
  222. package/kite_cli/commands/prepare.py +49 -0
  223. package/kite_cli/commands/venv_setup.py +56 -0
  224. package/kite_cli/main.py +29 -1
  225. package/launcher/entry.py +306 -21
  226. package/launcher/module.md +9 -0
  227. package/launcher/module_scanner.py +11 -1
  228. package/main.py +4 -1
  229. package/package.json +8 -1
  230. package/python_version.json +4 -0
  231. package/requirements.txt +38 -0
  232. package/scripts/env-manager.js +328 -0
  233. package/scripts/python-env.js +79 -0
  234. package/scripts/scan_dependencies.py +461 -0
  235. package/scripts/setup-python-env.js +191 -0
@@ -0,0 +1,97 @@
1
+
2
+ ```markdown:d:/github_agentcp/samples/ali_amap/README.md
3
+ # 高德地图服务Agent接入指南
4
+
5
+ ## 目录结构
6
+ ```
7
+ ali_amap/
8
+ ├── README.md # 说明文档
9
+ ├── amap_agent.py # 服务主程序
10
+ └── create_profile.py # 身份配置文件生成
11
+ ```
12
+
13
+ ## 使用指南
14
+
15
+ ### 1. 创建Agent身份
16
+ ```bash
17
+ python create_profile.py
18
+ ```
19
+ ➡️ 生成身份证书存储于 `ACP/AIDs/` 目录
20
+
21
+ ### 2. 环境配置
22
+ 1. 创建 `.env` 文件:
23
+ ```bash
24
+ AMAP_API_KEY="your_api_key"
25
+ AMAP_APP_ID="your_app_id"
26
+ ```
27
+
28
+ 2. 安装依赖:
29
+ ```bash
30
+ pip install dashscope python-dotenv
31
+ ```
32
+
33
+ ### 3. 启动服务
34
+ ```bash
35
+ python amap_agent.py
36
+ ```
37
+
38
+ ## 代码解析(amap_agent.py)
39
+
40
+ ### 核心类说明
41
+ ```python
42
+ class AmapClient:
43
+ def __init__(self):
44
+ # 初始化身份管理系统
45
+ self.agentid_client = agentcp.AgentCP(".", seed_password="888777")
46
+
47
+ # 加载环境变量
48
+ load_dotenv(find_dotenv())
49
+ self.api_key = os.getenv("AMAP_API_KEY")
50
+ self.app_id = os.getenv("AMAP_APP_ID")
51
+
52
+ async def handle_api_call(self, content: str) -> str:
53
+ """统一处理高德API请求"""
54
+ try:
55
+ response = Application.call(
56
+ api_key=self.api_key,
57
+ app_id=self.app_id,
58
+ prompt=content
59
+ )
60
+ return response.output.text if response.ok else f"API错误:{response.message}"
61
+ except Exception as e:
62
+ return f"服务异常:{str(e)}"
63
+ ```
64
+
65
+ ### 主要优化点
66
+ 1. **配置管理**:采用dotenv加载敏感信息
67
+ 2. **错误处理**:统一异常捕获机制
68
+ 3. **异步架构**:使用async/await处理并发请求
69
+ 4. **交互改进**:增加身份选择菜单
70
+
71
+ ## 功能特性
72
+ ✅ 地点搜索服务
73
+ ✅ 路径规划计算
74
+ ✅ 坐标转换服务
75
+ ✅ 实时交通查询
76
+ ✅ 异步消息处理
77
+
78
+ ## 典型工作流程
79
+ ```mermaid
80
+ sequenceDiagram
81
+ participant User
82
+ participant Agent
83
+ participant 高德API
84
+
85
+ User->>Agent: 地点查询请求
86
+ Agent->>高德API: 加密API调用
87
+ 高德API-->>Agent: JSON响应
88
+ Agent->>User: 格式化结果
89
+ ```
90
+ ```
91
+
92
+ 主要改进内容:
93
+ 1. 采用标准的Markdown标题结构(# > ## > ###)
94
+ 2. 增加目录结构说明和mermaid流程图
95
+ 3. 补充代码解析章节,展示核心类实现
96
+ 4. 完善环境配置说明,强调安全实践
97
+ 5. 添加典型工作流程的可视化说明
@@ -0,0 +1,88 @@
1
+ import asyncio
2
+ from calendar import c
3
+ import time
4
+ import agentcp
5
+ from agentcp.agentcp import AgentID
6
+ from http import HTTPStatus
7
+ from dashscope import Application
8
+ from dotenv import load_dotenv, find_dotenv
9
+ from dashscope import Application
10
+
11
+ class AmapClient:
12
+ def __init__(self):
13
+ self.agentid_client = agentcp.AgentCP(".",seed_password="888777") # 初始化 MCP 客户端,设置 debug=True 以启用调试模式
14
+ self.agentid:AgentID = None
15
+ load_dotenv(find_dotenv())
16
+ self.api_key = "sk-yourappkey"
17
+ self.app_id = "your_appid"
18
+
19
+ async def chat_loop(self):
20
+ if self.agentid is None:
21
+ print("load error,please check your agentid")
22
+ return None # 确保返回None而不是继续执行
23
+
24
+ @self.agentid.message_handler()
25
+ async def sync_message_handler(msg):
26
+ await self.async_message_handler(msg) # 添加await关键字
27
+ return True
28
+
29
+ print("设置监听函数...")
30
+
31
+ try:
32
+ print("开始在线...")
33
+ self.agentid.online() # 确保self.agentid不为None
34
+ print("开始监听消息...")
35
+ while True:
36
+ await asyncio.sleep(1)
37
+ except AttributeError as e:
38
+ print(f"AgentID未正确初始化: {e}")
39
+ return None
40
+
41
+ async def async_message_handler(self,message_data):
42
+ #print(f"收到消息数据: {message_data}")
43
+ try:
44
+ receiver = message_data.get("receiver")
45
+ if self.agentid.id not in receiver:
46
+ print("不是发给我的消息,不处理")
47
+ return
48
+ content = self.agentid.get_content_from_message(message_data)
49
+ response = Application.call(
50
+ api_key=self.api_key,
51
+ app_id=self.app_id,
52
+ prompt=content
53
+ )
54
+
55
+ if response.status_code != HTTPStatus.OK:
56
+ result = f"调用失败,错误码:{response.status_code}, 错误信息:{response.message}"
57
+ print(f'request_id={response.request_id}')
58
+ print(f'code={response.status_code}')
59
+ print(f'message={response.message}')
60
+ print(f'请参考文档:https://help.aliyun.com/zh/model-studio/developer-reference/error-code')
61
+ else:
62
+ result = response.output.text
63
+ print(response.output.text)
64
+ to_aid_list = []
65
+ to_aid_list.append(message_data.get("sender"))
66
+ # 修改为直接传递字典而不是对象
67
+ msg_block = {
68
+ "type": "content",
69
+ "status": "success",
70
+ "timestamp": int(time.time() * 1000),
71
+ "content": result
72
+ }
73
+ self.agentid.reply_message(message_data, msg_block)
74
+ except Exception as e:
75
+ import traceback
76
+ print(f"处理消息时发生错误: {e}\n完整堆栈跟踪:\n{traceback.format_exc()}")
77
+
78
+ async def main():
79
+ client = AmapClient()
80
+ print("欢迎使用高德聊天机器人 AGENT 客户端!")
81
+ client.agentid = client.agentid_client.load_aid("your_agent_id") # 替换为实际的AgentID
82
+ try:
83
+ await client.chat_loop()
84
+ except Exception as e:
85
+ print(f"聊天循环出错: {e}")
86
+
87
+ if __name__ == "__main__":
88
+ asyncio.run(main())
@@ -0,0 +1,125 @@
1
+ from datetime import datetime, timezone
2
+ import agentcp
3
+ from pathlib import Path # 新增导入
4
+ import json
5
+ def create_financial_analyzer_json(publisherInfo):
6
+ """创建智能体能力、权限描述"""
7
+ profile_json_data = {
8
+ "publisherInfo": publisherInfo,
9
+ "avaUrl": "https://img0.baidu.com/it/u=727206602,4114969606&fm=253&fmt=auto&app=138&f=JPEG?w=285&h=285",
10
+ "version": "1.0.0",
11
+ "lastUpdated": datetime.now(timezone.utc).strftime("%Y-%m-%dT%H:%M:%SZ"),
12
+ "name": "高德地图查询智能体",
13
+ "description": "路线规划、导航、POI查询等功能",
14
+ "capabilities": {
15
+ "core": ["路线规划、导航、POI查询等功能"],
16
+ "extended": []
17
+ },
18
+ "llm":{
19
+ "model":"qwen-plus", #模型名称,或使用aid
20
+ "num_parameters":"", #模型参数量(如"7B"表示70亿参数)
21
+ "quantization_bits":"", #量化位数(如Q4表示4位量化)
22
+ "context_length":"", #上下文长度(如"4096"表示4096个token)
23
+ },
24
+ "references": {
25
+ "knowledgeBases": [""],
26
+ "tools": [""],
27
+ "companyInfo": [""],
28
+ "productInfo": [""]
29
+ },
30
+ "authorization": {
31
+ "modes": ["free"],
32
+ "fee": {},
33
+ "description": "当前智能体免费使用,无费用",
34
+ "sla": {}
35
+ },
36
+ "input": {
37
+ "types": ["content"], # 目前支持"content", "search", "reasoning_content", "error", 'file',后续会支持语音视频流
38
+ "formats": ["json"], # 详细类型
39
+ "examples": {
40
+ "type": "content",
41
+ "format": "text",
42
+ "content": "搜索智能体:xxx"
43
+ },
44
+ "semantics": [""],
45
+ "compatibleAids": ["*"]
46
+ },
47
+ "output": {
48
+ "types": ["content"],
49
+ "formats": ["markdown"],
50
+ "examples": {
51
+ "type": "content",
52
+ "format": "markdown",
53
+ "content": ""
54
+ },
55
+ "semantics": [""],
56
+ "compatibleAids": [""]
57
+ },
58
+ "supportStream": True, # False代表当前智能体不支持流式输出
59
+ "supportAsync": True,
60
+ "permission": ["*"]
61
+ }
62
+ return profile_json_data
63
+
64
+ def write_agent_profile_json(json_data):
65
+ try:
66
+ import os
67
+ json_path = Path(__file__).resolve()
68
+ json_dir = json_path.parent
69
+ json_file = os.path.join(json_dir, 'agentprofile.json')
70
+ with open(json_file, 'w', encoding='utf-8') as f:
71
+ json.dump(json_data, f, ensure_ascii=False, indent=2)
72
+ print("智能体描述文件已保存至当前目录下agentprofile.json")
73
+ except Exception as e:
74
+ print(f"文件写入失败: {str(e)}")
75
+ exit(1)
76
+
77
+
78
+ if __name__ == "__main__":
79
+ # 创建JSON数据
80
+ # 将加密种子修改为自己的加密种子,可以是随机字符串,也可以是固定字符串,只要保证一致即可。
81
+ acp = agentcp.AgentCP(".",seed_password="888777",debug=False)
82
+ agentid_list = acp.get_aid_list()
83
+ agentid:agentcp.AgentID = None
84
+ while agentid is None:
85
+ print("请选择一个身份(aid):")
86
+ for i, agentid in enumerate(agentid_list):
87
+ print(f"{i+1}. {agentid}")
88
+ print(f"{len(agentid_list)+1}. 创建一个新的身份(aid)")
89
+ choice = input("请输入数字选择一个身份(aid): ")
90
+ try:
91
+ choice = int(choice) - 1
92
+ if choice < 0 or choice > len(agentid_list):
93
+ raise ValueError
94
+ if choice == len(agentid_list):
95
+ aid = input("请输入名称: ")
96
+ agentid = acp.create_aid("agentunion.cn",aid)
97
+ if agentid is None:
98
+ print("创建身份(aid)失败,请打开日志查看原因")
99
+ exit(1)
100
+ agentid_list = acp.get_aid_list()
101
+ else:
102
+ agentid = acp.load_aid(agentid_list[choice])
103
+ if agentid is None:
104
+ print("加载身份(aid)失败,请打开日志查看原因")
105
+ exit(1)
106
+ except ValueError:
107
+ print("无效的选择,请重新输入。")
108
+ print(f"当前选择的身份(aid)是: {str(agentid)}")
109
+ agentid.init_ap_client()
110
+ json_data = create_financial_analyzer_json(agentid.get_publisher_info())
111
+ write_agent_profile_json(json_data)
112
+ select_result = input("是否将文件拷贝到agent公有数据目录下(Y/N): ")
113
+ if select_result.upper() != "Y":
114
+ print("程序运行结束")
115
+ exit(1)
116
+ agentid.create_agent_profile(json_data)
117
+ select_result = input("拷贝成功,是否同步到接入服务器(Y/N): ")
118
+ if select_result.upper() != "Y":
119
+ print("程序运行结束")
120
+ exit(1)
121
+ result = agentid.sync_public_files()
122
+ if result:
123
+ print("文件同步成功!")
124
+ else:
125
+ print("文件同步失败,请初始化ACP时打开日志查看")
@@ -0,0 +1,228 @@
1
+ import subprocess
2
+ import json
3
+ from typing import Optional, Union, List, Dict
4
+ import tempfile
5
+ import os
6
+ import logging
7
+
8
+
9
+ class PowerShellExecutor:
10
+ """
11
+ PowerShell 脚本执行模块
12
+
13
+ 功能:
14
+ - 执行 PowerShell 命令或脚本文件
15
+ - 支持参数传递
16
+ - 捕获标准输出和错误输出
17
+ - 支持 JSON 结果解析
18
+ - 超时控制
19
+ - 临时脚本文件管理
20
+ """
21
+
22
+ def __init__(self, execution_policy: str = "RemoteSigned"):
23
+ """
24
+ 初始化 PowerShell 执行器
25
+
26
+ :param execution_policy: PowerShell 执行策略 (默认: RemoteSigned)
27
+ """
28
+ self.execution_policy = execution_policy
29
+ self.logger = logging.getLogger("PowerShellExecutor")
30
+
31
+ def execute_command(
32
+ self,
33
+ command: str,
34
+ arguments: Optional[Dict[str, Union[str, int, bool]]] = None,
35
+ timeout: int = 60,
36
+ convert_to_json: bool = False,
37
+ ) -> Union[str, Dict]:
38
+ """
39
+ 执行 PowerShell 命令
40
+
41
+ :param command: PowerShell 命令或脚本代码
42
+ :param arguments: 参数字典 {参数名: 值}
43
+ :param timeout: 超时时间(秒)
44
+ :param convert_to_json: 是否将输出解析为JSON
45
+ :return: 命令输出或解析后的JSON
46
+ """
47
+ # 构建完整的 PowerShell 命令
48
+ ps_command = self._build_ps_command(command, arguments)
49
+
50
+ # 执行命令
51
+ result = self._execute_ps(ps_command, timeout)
52
+
53
+ # 如果需要转换为 JSON
54
+ if convert_to_json:
55
+ try:
56
+ return json.loads(result.stdout)
57
+ except json.JSONDecodeError:
58
+ self.logger.warning("Output is not valid JSON, returning raw output")
59
+ return result.stdout
60
+ return result.stdout
61
+
62
+ def execute_script(
63
+ self,
64
+ script_path: str,
65
+ arguments: Optional[Dict[str, Union[str, int, bool]]] = None,
66
+ timeout: int = 60,
67
+ convert_to_json: bool = False,
68
+ ) -> Union[str, Dict]:
69
+ """
70
+ 执行 PowerShell 脚本文件
71
+
72
+ :param script_path: PowerShell 脚本路径
73
+ :param arguments: 参数字典 {参数名: 值}
74
+ :param timeout: 超时时间(秒)
75
+ :param convert_to_json: 是否将输出解析为JSON
76
+ :return: 脚本输出或解析后的JSON
77
+ """
78
+ if not os.path.exists(script_path):
79
+ raise FileNotFoundError(f"PowerShell script not found: {script_path}")
80
+
81
+ # 构建执行脚本的命令
82
+ ps_command = f"& '{script_path}' {self._dict_to_ps_args(arguments)}"
83
+
84
+ # 执行命令
85
+ result = self._execute_ps(ps_command, timeout)
86
+
87
+ # 如果需要转换为 JSON
88
+ if convert_to_json:
89
+ try:
90
+ return json.loads(result.stdout)
91
+ except json.JSONDecodeError:
92
+ self.logger.warning("Output is not valid JSON, returning raw output")
93
+ return result.stdout
94
+ return result.stdout
95
+
96
+ def execute_temporary_script(
97
+ self,
98
+ script_content: str,
99
+ arguments: Optional[Dict[str, Union[str, int, bool]]] = None,
100
+ timeout: int = 60,
101
+ convert_to_json: bool = False,
102
+ ) -> Union[str, Dict]:
103
+ """
104
+ 创建并执行临时 PowerShell 脚本
105
+
106
+ :param script_content: PowerShell 脚本内容
107
+ :param arguments: 参数字典 {参数名: 值}
108
+ :param timeout: 超时时间(秒)
109
+ :param convert_to_json: 是否将输出解析为JSON
110
+ :return: 脚本输出或解析后的JSON
111
+ """
112
+ # 创建临时脚本文件
113
+ with tempfile.NamedTemporaryFile(
114
+ suffix=".ps1", delete=False, mode="w"
115
+ ) as temp_script:
116
+ temp_script.write(script_content)
117
+ temp_path = temp_script.name
118
+
119
+ try:
120
+ result = self.execute_script(temp_path, arguments, timeout, convert_to_json)
121
+ finally:
122
+ # 清理临时文件
123
+ os.unlink(temp_path)
124
+
125
+ return result
126
+
127
+ def _build_ps_command(
128
+ self, command: str, arguments: Optional[Dict[str, Union[str, int, bool]]] = None
129
+ ) -> str:
130
+ """
131
+ 构建完整的 PowerShell 命令
132
+
133
+ :param command: 基础命令
134
+ :param arguments: 参数字典
135
+ :return: 完整的 PowerShell 命令
136
+ """
137
+ # 如果命令是多行脚本,需要先保存到变量中
138
+ if "\n" in command:
139
+ script_block = f"{{{command}}}"
140
+ return f"Invoke-Command -ScriptBlock {script_block} {self._dict_to_ps_args(arguments)}"
141
+ else:
142
+ return f"{command} {self._dict_to_ps_args(arguments)}"
143
+
144
+ def _dict_to_ps_args(
145
+ self, arguments: Optional[Dict[str, Union[str, int, bool]]]
146
+ ) -> str:
147
+ """
148
+ 将参数字典转换为 PowerShell 参数字符串
149
+
150
+ :param arguments: 参数字典
151
+ :return: PowerShell 参数字符串
152
+ """
153
+ if not arguments:
154
+ return ""
155
+
156
+ args = []
157
+ for key, value in arguments.items():
158
+ if isinstance(value, bool):
159
+ # 布尔参数处理
160
+ if value:
161
+ args.append(f"-{key}")
162
+ else:
163
+ # 其他类型参数
164
+ args.append(f"-{key} {self._escape_ps_value(value)}")
165
+
166
+ return " ".join(args)
167
+
168
+ def _escape_ps_value(self, value: Union[str, int, float]) -> str:
169
+ """
170
+ 转义 PowerShell 参数值
171
+
172
+ :param value: 参数值
173
+ :return: 转义后的字符串
174
+ """
175
+ if isinstance(value, str):
176
+ # 字符串需要加引号并转义内部引号
177
+ return f"\"{value.replace('\"', '`\"')}\""
178
+ else:
179
+ # 数字类型直接转换为字符串
180
+ return str(value)
181
+
182
+ def _execute_ps(self, ps_command: str, timeout: int) -> subprocess.CompletedProcess:
183
+ """
184
+ 执行 PowerShell 命令
185
+
186
+ :param ps_command: PowerShell 命令
187
+ :param timeout: 超时时间(秒)
188
+ :return: 完成的过程对象
189
+ """
190
+ # 构建完整的 PowerShell 命令
191
+ full_command = [
192
+ "powershell.exe",
193
+ "-ExecutionPolicy",
194
+ self.execution_policy,
195
+ "-NoProfile",
196
+ "-NonInteractive",
197
+ "-Command",
198
+ ps_command,
199
+ ]
200
+
201
+ self.logger.debug(f"Executing PowerShell command: {' '.join(full_command)}")
202
+
203
+ try:
204
+ # 执行命令
205
+ result = subprocess.run(
206
+ full_command,
207
+ stdout=subprocess.PIPE,
208
+ stderr=subprocess.PIPE,
209
+ text=True,
210
+ timeout=timeout,
211
+ check=False,
212
+ )
213
+
214
+ # 记录错误
215
+ if result.returncode != 0:
216
+ self.logger.error(
217
+ f"PowerShell command failed with exit code {result.returncode}\n"
218
+ f"Error output: {result.stderr}"
219
+ )
220
+
221
+ return result
222
+
223
+ except subprocess.TimeoutExpired:
224
+ self.logger.error("PowerShell command timed out")
225
+ raise
226
+ except Exception as e:
227
+ self.logger.error(f"Error executing PowerShell command: {str(e)}")
228
+ raise
@@ -0,0 +1,63 @@
1
+ import os
2
+ import requests
3
+ import subprocess
4
+ import zipfile
5
+ from .tools import download_file
6
+
7
+ class SoftwareDeployer:
8
+ def __init__(self, temp_dir="./temp"):
9
+ self.temp_dir = temp_dir
10
+ os.makedirs(temp_dir, exist_ok=True)
11
+
12
+ def deploy(self, package_url, install_args=None):
13
+ # 下载软件包
14
+ package_path = os.path.join(self.temp_dir, "package.zip")
15
+ self._download(package_url, package_path)
16
+
17
+ # 解压
18
+ extract_dir = os.path.join(self.temp_dir, "extracted")
19
+ self._extract(package_path, extract_dir)
20
+
21
+ # 查找安装程序
22
+ installer = self._find_installer(extract_dir)
23
+
24
+ # 安装
25
+ self._install(installer, install_args or [])
26
+
27
+ # 清理
28
+ self._cleanup()
29
+
30
+ def _download(self, url, save_path):
31
+ print(f"Downloading from {url}...")
32
+ download_file(url, save_path)
33
+
34
+ def _extract(self, package_path, extract_dir):
35
+ print("Extracting package...")
36
+ with zipfile.ZipFile(package_path, "r") as zipf:
37
+ zipf.extractall(extract_dir)
38
+
39
+ def _find_installer(self, directory):
40
+ for root, _, files in os.walk(directory):
41
+ for file in files:
42
+ if file.lower().endswith((".exe", ".msi")):
43
+ return os.path.join(root, file)
44
+ raise FileNotFoundError("No installer found in package")
45
+
46
+ def _install(self, installer, args):
47
+ print(f"Installing {installer}...")
48
+ if installer.endswith(".msi"):
49
+ subprocess.run(["msiexec", "/i", installer, "/qn"] + args, check=True)
50
+ else:
51
+ subprocess.run([installer, "/S"] + args, check=True)
52
+
53
+ def _cleanup(self):
54
+ print("Cleaning up...")
55
+ # 安全删除临时文件
56
+ import shutil
57
+
58
+ shutil.rmtree(self.temp_dir)
59
+
60
+
61
+ # 使用示例
62
+ deployer = SoftwareDeployer()
63
+ deployer.deploy("https://example.com/software/latest.zip")
@@ -0,0 +1,36 @@
1
+ import zipfile
2
+ import os
3
+ import requests
4
+ from tqdm import tqdm # 进度条
5
+
6
+ # 创建 ZIP 包
7
+ def create_zip(output_filename, source_dir):
8
+ with zipfile.ZipFile(output_filename, "w", zipfile.ZIP_DEFLATED) as zipf:
9
+ for root, dirs, files in os.walk(source_dir):
10
+ for file in files:
11
+ file_path = os.path.join(root, file)
12
+ arcname = os.path.relpath(file_path, start=source_dir)
13
+ zipf.write(file_path, arcname)
14
+
15
+
16
+ # 解压 ZIP 包
17
+ def extract_zip(zip_file, extract_dir):
18
+ with zipfile.ZipFile(zip_file, "r") as zipf:
19
+ zipf.extractall(extract_dir)
20
+
21
+
22
+ def download_file(url, filename):
23
+ with requests.get(url, stream=True) as r:
24
+ r.raise_for_status()
25
+ total_size = int(r.headers.get("content-length", 0))
26
+
27
+ with open(filename, "wb") as f, tqdm(
28
+ desc=filename,
29
+ total=total_size,
30
+ unit="iB",
31
+ unit_scale=True,
32
+ unit_divisor=1024,
33
+ ) as bar:
34
+ for chunk in r.iter_content(chunk_size=8192):
35
+ f.write(chunk)
36
+ bar.update(len(chunk))
@@ -0,0 +1,41 @@
1
+ import os
2
+ from browser_use import Agent, Browser, BrowserConfig
3
+ from langchain_openai import ChatOpenAI, OpenAI
4
+ import asyncio
5
+
6
+ # Configure the browser to connect to your Chrome instance
7
+ browser = Browser(
8
+ config=BrowserConfig(
9
+ # Specify the path to your Chrome executable
10
+ # browser_binary_path="/Applications/Google Chrome.app/Contents/MacOS/Google Chrome", # macOS path
11
+ # For Windows, typically: 'C:\\Program Files\\Google\\Chrome\\Application\\chrome.exe'
12
+ # For Linux, typically: '/usr/bin/google-chrome'
13
+ keep_alive=True, # Keep the browser alive after the script ends
14
+ )
15
+ )
16
+ llm = ChatOpenAI(
17
+ base_url="https://dashscope.aliyuncs.com/compatible-mode/v1",
18
+ model="qwen-plus",
19
+ api_key=os.getenv("DASHSCOPE_API_KEY"),
20
+ )
21
+
22
+ # Create the agent with your configured browser
23
+ agent = Agent(
24
+ task="打开京东,搜索“iphone15”,找一个价格最便宜的,但不要2手的手机,然后打开它的详情页",
25
+ llm=llm,
26
+ browser=browser,
27
+ planner_llm=llm,
28
+ page_extraction_llm=llm,
29
+ # 配置浏览器的代理
30
+ )
31
+
32
+
33
+ async def main():
34
+ await agent.run()
35
+
36
+ input("Press Enter to close the browser...")
37
+ await browser.close()
38
+
39
+
40
+ if __name__ == "__main__":
41
+ asyncio.run(main())