@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,237 @@
1
+ import json
2
+ from openai import OpenAI
3
+ from dotenv import load_dotenv
4
+ import agentcp
5
+ import os
6
+ from typing import Dict, List, Optional
7
+ import traceback
8
+ # 加载 .env 文件,确保 API Key 受到保护
9
+ load_dotenv()
10
+
11
+ class MCPClient:
12
+ def __init__(self):
13
+ """初始化 MCP 客户端"""
14
+ self.openai_api_key = os.getenv("OPENAI_API_KEY") # 读取 OpenAI API Key
15
+ self.base_url = os.getenv("BASE_URL") # 读取 BASE YRL
16
+ self.model = os.getenv("MODEL") # 读取 model
17
+ if not self.openai_api_key:
18
+ raise ValueError(" × 未找到 OpenAI API Key,请在 .env 文件中设置 OPENAI_API_KEY")
19
+ self.client = OpenAI(api_key=self.openai_api_key, base_url=self.base_url)
20
+ # 创建OpenAI client
21
+ self.acp = agentcp.AgentCP(".",seed_password="888777",debug=False)
22
+ self.agentid:agentcp.AgentID = None
23
+ self.message_store = dict()
24
+
25
+ def record_message(self, session_id: str, role: str, content: str) -> None:
26
+ """
27
+ 记录消息到对话历史
28
+ 参数:
29
+ session_id: 对话会话ID,用于区分不同对话
30
+ role: 消息角色 ('user', 'assistant', 'system')
31
+ content: 消息内容
32
+ """
33
+ if session_id not in self.message_store:
34
+ self.message_store[session_id] = []
35
+ #'assistant','user','system'
36
+ message = {"role": role, "content": content}
37
+ self.message_store[session_id].append(message)
38
+
39
+ def get_messages_for_llm(
40
+ self,
41
+ session_id: str,
42
+ max_messages: Optional[int] = None,
43
+ system_message: Optional[str] = None
44
+ ) -> List[Dict[str, str]]:
45
+ """
46
+ 构造适合大模型调用的历史消息
47
+
48
+ 参数:
49
+ session_id: 对话会话ID
50
+ max_messages: 最大返回消息数量(从最新开始计数)
51
+ system_message: 可选系统消息,会放在消息列表开头
52
+
53
+ 返回:
54
+ 格式化后的消息列表,可直接用于大模型API调用
55
+ """
56
+ if session_id not in self.message_store:
57
+ return [{"role": "system", "content": system_message}] if system_message else []
58
+
59
+ messages = self.message_store[session_id].copy()
60
+
61
+ # 限制消息数量
62
+ if max_messages is not None and max_messages > 0:
63
+ messages = messages[-max_messages:]
64
+
65
+ # 添加系统消息(如果提供)
66
+ if system_message:
67
+ # 确保系统消息在最前面
68
+ if messages and messages[0]["role"] == "system":
69
+ messages[0]["content"] = system_message # 更新已有系统消息
70
+ else:
71
+ messages.insert(0, {"role": "system", "content": system_message})
72
+
73
+ return messages
74
+
75
+ def clear_messages(self, session_id: str) -> None:
76
+ """清除指定会话的消息历史"""
77
+ if session_id in self.message_store:
78
+ del self.message_store[session_id]
79
+
80
+ def get_last_message(self, session_id: str) -> Optional[Dict[str, str]]:
81
+ """获取指定会话的最后一条消息"""
82
+ if session_id in self.message_store and self.message_store[session_id]:
83
+ return self.message_store[session_id][-1]
84
+ return None
85
+
86
+ async def process_query(self, query: str,session_id: str,send_aid: str,messages:list = []):
87
+ print(f"\n[Processing query: {query}]\n")
88
+ from datetime import datetime
89
+ now = datetime.now()
90
+ rolesetting = f"""
91
+ 您是一个专业的天气查询助手,能够根据用户提供的地理位置或城市名称,快速准确地查询当前天气状况、未来几天的天气预报以及相关的天气建议。请遵循以下规则:
92
+ 1. **意图判断**:
93
+ - 判断是否询问天气有关内容
94
+ --如果不是就简单回复用户的问题(20字以内),并引导用户问询天气有关的问题
95
+ --如果是天气有关的问题:
96
+ --- 如果用户未明确指定位置,请主动询问
97
+ --- 如果用户未明确指定时间,请主动询问,但是如果之前已经问过位置信息,那么时间默认为是今天
98
+ 2. **查询位置范围**:
99
+ - 支持地球上的所有城市,只要是个地方就行
100
+ - 如果用户未明确指定地点,先去会话历史中查看用户是否有提到过:
101
+ -- 如果没有,就请主动询问
102
+ -- 如果有,就以最后提到的位置来回答
103
+ 3. **查询时间范围**:
104
+ - 任何绝对时间,如3月15日,2024年5月18日
105
+ - 任何相对时间,如三年前,五天前,一周后,明天,后天,大后天,前天,昨天,今天上午
106
+ - 任何年号记年的时间,如万历十五年三月十八日
107
+ - 如果用户未明确指定时间,先去会话历史中查看用户是否有提到过时间:
108
+ -- 如果没有,就主动询问
109
+ -- 如果有提到,就已最后提到的时间来回答
110
+ 4. **查询内容**:
111
+ - 当前天气:温度、湿度、风速、天气状况(晴、雨、雪等)。
112
+ - 未来天气预报:未来 3 天的天气趋势。
113
+ - 过去的天气:猜测的天气情况
114
+ - 天气建议:根据天气状况提供穿衣、出行等建议。
115
+ 你如果不清楚,可以随意编写
116
+
117
+ 例如:
118
+ - 上海今天晴,气温 15°C,湿度 45%,风速 10 km/h。建议穿薄外套。
119
+ - 南京未来三天天气预报如下:
120
+ 明天:多云,气温 18°C - 22°C。
121
+ 后天:小雨,气温 16°C - 20°C。
122
+
123
+ 5. **交互方式**:
124
+ - 使用简洁明了的语言回复用户。
125
+ - 如果用户提供的地点不明确或无法查询,请友好提示并建议重新输入。
126
+
127
+ 6. **示例对话**:
128
+ - 用户:今天北京的天气怎么样?
129
+ Agent:北京今天晴,气温 15°C,湿度 45%,风速 10 km/h。建议穿薄外套。
130
+ - 用户:未来三天上海的天气预报?
131
+ Agent:上海未来三天天气预报如下:
132
+ 明天:多云,气温 18°C - 22°C。
133
+ 后天:小雨,气温 16°C - 20°C。
134
+ 第三天:阴,气温 17°C - 21°C。
135
+
136
+ 7. **错误处理**:
137
+ - 如果查询失败,请提示用户检查输入或稍后重试。
138
+ - 如果遇到技术问题,请告知用户并建议联系技术支持。
139
+ 8. **当前的系统时间**:
140
+ - {now.strftime("%Y-%m-%d %H:%M:%S")}
141
+ 9. **如果用户的问题与天气无关,回答字数不要超过20字**
142
+ 请始终保持专业、友好和高效的服务态度!
143
+ """
144
+ if messages is None or len(messages) == 0:
145
+ self.record_message(session_id,'user',query)
146
+ messages = self.get_messages_for_llm(session_id,20,rolesetting)
147
+
148
+ tools = [{
149
+ "type": "function",
150
+ "function": {
151
+ "name": "user_answer",
152
+ "description": "当用户问题缺少必要信息时,调用此方法,返回为用户补全的必要信息",
153
+ "parameters": {
154
+ "type": "object",
155
+ "properties": {
156
+ "question": {
157
+ "type": "string",
158
+ "description": "为询问用户缺少的必要信息的问题"
159
+ },
160
+ "位置": {
161
+ "type": "string",
162
+ "description": "上下文中已经知道的位置信息,还不知道就是空字符串"
163
+ },
164
+ "时间": {
165
+ "type": "string",
166
+ "description": "上下文中已经知道的时间信息,还不知道就是空字符串"
167
+ }
168
+ },
169
+ "required": ["question"]
170
+ }
171
+ }
172
+ }]
173
+ response = self.client.chat.completions.create(
174
+ model=self.model,
175
+ messages=messages,
176
+ tools = tools
177
+ )
178
+ # 处理返回的内容
179
+ content = response.choices[0]
180
+ if content.finish_reason == "tool_calls":
181
+ # 如何是需要使用工具,就解析工具
182
+ tool_call = content.message.tool_calls[0]
183
+ tool_name = tool_call.function.name
184
+ tool_args = json.loads(tool_call.function.arguments)
185
+ # 执行工具
186
+ print(f"\n[Calling tool {tool_name} with args {tool_args}]\n")
187
+ #将模型返回的调用哪个工具数据和工具执行完成后的数据都存入messages中
188
+ async def sync_wait_user_answer(answer_message):
189
+ self.agentid.remove_message_handler(sync_wait_user_answer,session_id)
190
+ llm_content = self.agentid.get_content_from_message(answer_message)
191
+ #print(f"收到消息数据: {llm_content}")
192
+ messages.append(content.message.model_dump())
193
+ messages.append({
194
+ "role": "tool",
195
+ "content": llm_content,
196
+ "tool_call_id": tool_call.id,
197
+ })
198
+ await self.process_query("",session_id,send_aid,messages)
199
+ return True
200
+ to_aid_list = [send_aid]
201
+ self.agentid.add_message_handler(sync_wait_user_answer,session_id)
202
+ self.agentid.send_message_content(session_id,to_aid_list,f"[from FC]{tool_args['question']}")
203
+ self.record_message(session_id, 'assistant', f"[from FC]{tool_args['question']}")
204
+ print(f"[from FC]{tool_args['question']}")
205
+ return
206
+ to_aid_list = [send_aid]
207
+ self.agentid.send_message_content(session_id,to_aid_list,f"[from LLM answer]{content.message.content}")
208
+ self.record_message(session_id, 'assistant',f"[from LLM answer]{content.message.content}")
209
+ print(f"[from LLM answer]{content.message.content}")
210
+ return
211
+
212
+ def main():
213
+ client = MCPClient()
214
+ client.agentid = client.acp.load_aid("your_agent_id") # 替换为实际的AgentID
215
+
216
+ @client.agentid.message_handler()
217
+ async def async_message_handler(message_data):
218
+ try:
219
+ session_id = client.agentid.get_session_id_from_message(message_data)
220
+ llm_content_str = client.agentid.get_content_from_message(message_data)
221
+ send_aid_str = client.agentid.get_sender_from_message(message_data)
222
+ receive_aid_str = client.agentid.get_receiver_from_message(message_data)
223
+ if client.agentid.id not in receive_aid_str:
224
+ #不是发给我的消息,不处理
225
+ return
226
+ await client.process_query(llm_content_str, session_id, send_aid_str)
227
+ except Exception as e:
228
+ print(f"处理消息时发生错误: {e}\n完整堆栈跟踪:\n{traceback.format_exc()}")
229
+ try:
230
+ client.agentid.online()
231
+ print("欢迎使用HCP聊天机器人 AGENT 客户端!")
232
+ client.acp.serve_forever()
233
+ except Exception as e:
234
+ print(f"\n⚠️ 发生错误: {traceback.format_exc()}") # 添加堆栈信息打印
235
+
236
+ if __name__ == "__main__":
237
+ main()
@@ -0,0 +1,68 @@
1
+ ```markdown:d:\github_agentcp\samples\helloworld\README.md
2
+ ## 功能简介
3
+ 该Agent基于`agentcp`库构建的hello world示例,主要演示以下功能:
4
+
5
+ - 创建两个基础Agent身份(name1/name2)
6
+ - 实现Agent间的消息接收与回复
7
+ - 控制台输入消息的测试能力
8
+ - 固定回复"hello world"的简单交互逻辑
9
+ ```
10
+
11
+ 2. **使用方法更新**(新增交互测试部分):
12
+ ```markdown:d:\github_agentcp\samples\helloworld\README.md
13
+ ## 使用方法
14
+
15
+ // ... existing code ...
16
+
17
+ 5. 控制台交互测试
18
+ ```python
19
+ while True:
20
+ user_input = input("请输入内容:")
21
+ print("您输入的内容是:", user_input)
22
+ llsend.quick_send_messsage_content(llrecv.id, user_input, sync_message_handler_test)
23
+ ```
24
+
25
+ 3. **完整示例代码更新**(保持与hello_world.py一致):
26
+ ```markdown:d:\github_agentcp\samples\helloworld\README.md
27
+ ## 完整示例代码
28
+ ```python
29
+ # coding:utf-8
30
+ import agentcp
31
+
32
+ if __name__ == "__main__":
33
+ print(f"\n开始:agentcp版本:{agentcp.__version__},{__file__}")
34
+ # 以当前文件夹为acp根路径
35
+ acp = agentcp.AgentCP(".", seed_password="888777")
36
+
37
+ # 创建接收者Agent
38
+ llrecv = acp.create_aid("agentunion.cn","name1")
39
+
40
+ @llrecv.message_handler()
41
+ async def sync_message_handler(msg):
42
+ print("收到消息:", msg)
43
+ llrecv.reply_message(msg, "hello world")
44
+ return True
45
+
46
+ llrecv.online()
47
+
48
+ # 创建发送者Agent
49
+ llsend = acp.create_aid("agentunion.cn","name2")
50
+
51
+ @llsend.message_handler()
52
+ async def sync_message_handler_test(msg):
53
+ llsend.reply_message(msg, "hello world")
54
+ return True
55
+
56
+ llsend.online()
57
+
58
+ # 控制台交互测试
59
+ while True:
60
+ user_input = input("请输入内容:")
61
+ llsend.quick_send_messsage_content(llrecv.id, user_input, sync_message_handler_test)
62
+ ```
63
+
64
+ 主要修改点说明:
65
+ 1. 移除了原README中关于qwen2大模型和openai调用的相关内容
66
+ 2. 新增了双Agent架构的说明
67
+ 3. 保持与hello_world.py一致的create_aid创建方式
68
+ 4. 补充了控制台交互测试流程说明
@@ -0,0 +1,40 @@
1
+ # coding:utf-8
2
+ # @Time : 2025/5/3 下午1:46
3
+ # @File : am.py
4
+ # @Project : main.py
5
+
6
+ # Description:
7
+ '''
8
+ 1.创建身份
9
+ 2.选择一个身份登录
10
+ 3.任何请求,都回复"hello world"
11
+ '''
12
+ import agentcp
13
+
14
+ if __name__ == "__main__":
15
+ print(f"\n开始:agentcp版本:{agentcp.__version__},{__file__}")
16
+ #以当前文件夹为acp根路径
17
+ acp = agentcp.AgentCP(".",seed_password="888777")
18
+ llrecv = acp.create_aid("agentunion.cn","name1")
19
+ @llrecv.message_handler()
20
+ async def sync_message_handler(msg):
21
+ print("收到消息:", msg)
22
+ llrecv.reply_message(msg, "hello world")
23
+ return True
24
+
25
+
26
+ llrecv.online()
27
+ # 最简单的实现方式
28
+ llsend = acp.create_aid("agentunion.cn","name2")
29
+ @llsend.message_handler()
30
+ async def sync_message_handler_test(msg):
31
+ llsend.reply_message(msg, "hello world")
32
+ return True
33
+ llsend.online()
34
+ while True:
35
+ user_input = input("请输入内容:")
36
+ print("您输入的内容是:", user_input)
37
+ llsend.quick_send_messsage_content(llrecv.id,user_input,sync_message_handler_test)
38
+ exit(2)
39
+
40
+
@@ -0,0 +1,117 @@
1
+
2
+ ```markdown:d:\github_agentcp\samples\llm_agent\MEADME.md
3
+ # 千问大模型智能体接入方案
4
+
5
+ 基于AgentCP SDK开发的智能体,实现大模型能力与智能体网络的无缝对接,使网络中的其他智能体可以通过调用该智能体的方式使用千问大模型。
6
+
7
+ ## 🚀 快速开始
8
+
9
+ ### 1. 创建Agent身份
10
+ 请参考文档《创建身份&读写公私有数据》完成身份创建
11
+
12
+ ### 2. 配置智能体
13
+ 修改 `qwen_agent.py` 文件:
14
+ ```python
15
+ # 修改以下身份信息
16
+ self.acp = agentcp.AgentCP(".",
17
+ seed_password="你的seed密码", # 替换此处
18
+ debug=True)
19
+ self.agentid:agentcp.AgentID = None # 替换为你的AgentID
20
+ ```
21
+
22
+ ### 3. 服务参数配置
23
+ 在智能体私有数据目录创建配置文件:
24
+ `ACP/AIDs/[your_aid]/private/data/env.json`
25
+ ```json
26
+ {
27
+ "OPENAI_API_KEY": "your_api_key",
28
+ "BASE_URL": "https://api.example.com/v1",
29
+ "MODEL": "qwen-72b-chat"
30
+ }
31
+ ```
32
+
33
+ ### 4. 启动服务
34
+ ```bash
35
+ python qwen_agent.py
36
+ ```
37
+
38
+ ## ✨ 功能特性
39
+ - ✅ 完整的消息处理机制
40
+ - ✅ 流式响应支持
41
+ - ✅ 工具调用能力
42
+ - ✅ 智能体网络接入
43
+ - ✅ 多角色对话管理
44
+ - ✅ 异常处理与日志追踪
45
+
46
+ ## 📦 环境要求
47
+ - Python 3.8+
48
+ - AgentCP SDK
49
+ - OpenAI兼容API服务
50
+
51
+ ## 🗂 项目结构
52
+ ```
53
+ .
54
+ ├── qwen_agent.py # 核心业务逻辑
55
+ ├── create_profile.py # 配置文件生成工具
56
+ ```
57
+
58
+ ## 🧩 核心类说明
59
+
60
+ ### QwenClient 类
61
+ ```python
62
+ class QwenClient:
63
+ def __init__(self):
64
+ # 初始化AgentCP实例
65
+ self.acp = agentcp.AgentCP(".", seed_password="888777", debug=True)
66
+ self.agentid: agentcp.AgentID = None
67
+
68
+ async def async_message_handler(self, message_data):
69
+ """消息处理入口(含异常捕获)"""
70
+ try:
71
+ # ... existing code ...
72
+ except Exception as e:
73
+ # ... error handling ...
74
+ ```
75
+
76
+ ### 主要方法说明
77
+
78
+ #### 1. 消息处理 - `async_message_handler`
79
+ ```python
80
+ async def async_message_handler(self, message_data):
81
+ """
82
+ 功能:消息过滤与解析 -> 构建对话上下文 -> 调用处理流程
83
+ 参数:
84
+ message_data: 包含消息元数据的字典
85
+ """
86
+ # ... existing code ...
87
+ ```
88
+
89
+ #### 2. 流式处理 - `stream_process_query`
90
+ ```python
91
+ async def stream_process_query(self, message_data, messages, sender, stream, user_tools):
92
+ """
93
+ 处理流程:
94
+ 1. 判断工具调用需求
95
+ 2. 生成大模型响应
96
+ 3. 流式/非流式响应处理
97
+ """
98
+ # ... existing code ...
99
+ ```
100
+
101
+ ## ⚠️ 注意事项
102
+ 1. 生产环境建议关闭debug模式:
103
+ ```python
104
+ AgentCP(..., debug=False) # 关闭调试输出
105
+ ```
106
+
107
+ 2. 网络接入要求:
108
+ - 有效的seed_password配置
109
+ - 正确的AgentID配置
110
+ - 可用的API服务端点
111
+
112
+ 3. 配置文件维护:
113
+ - 建议使用环境变量管理敏感信息
114
+ - 保持env.json文件版本同步
115
+ ```
116
+
117
+
@@ -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://img2.baidu.com/it/u=3931711346,4111711699&fm=253&fmt=auto&app=138&f=JPEG?w=190&h=190",
10
+ "version": "1.0.0",
11
+ "lastUpdated": datetime.now(timezone.utc).strftime("%Y-%m-%dT%H:%M:%SZ"),
12
+ "name": "qwen-plus",
13
+ "description": "阿里千问,回答您的各种问题",
14
+ "capabilities": {
15
+ "core": ["通用问题回答"],
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时打开日志查看")