@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,123 @@
1
+ import json
2
+ from datetime import datetime, timezone
3
+ from pathlib import Path # 新增导入
4
+
5
+ import agentcp
6
+
7
+
8
+ def create_financial_analyzer_json(publisherInfo):
9
+ """创建智能体能力、权限描述"""
10
+ profile_json_data = {
11
+ "publisherInfo": publisherInfo,
12
+ "version": "1.0.0",
13
+ "lastUpdated": datetime.now(timezone.utc).strftime("%Y-%m-%dT%H:%M:%SZ"),
14
+ "name": "串并行调用",
15
+ "description": "实现智能体搜索 调用大模型Agent,实现工具选择,多个工具并行调用获取结果。",
16
+ "capabilities": {
17
+ "core": ["智能体搜索", "工具选择", "工具调用"],
18
+ "extended": []
19
+ },
20
+ "references": {
21
+ "knowledgeBases": [""],
22
+ "tools": [""],
23
+ "companyInfo": [""],
24
+ "productInfo": [""]
25
+ },
26
+ "authorization": {
27
+ "modes": ["free"],
28
+ "fee": {},
29
+ "description": "当前智能体免费使用,无费用",
30
+ "sla": {}
31
+ },
32
+ "input": {
33
+ "types": ["content"], # 目前支持"content", "search", "reasoning_content", "error", 'file',后续会支持语音视频流
34
+ "formats": ["json"], # 详细类型
35
+ "examples": {
36
+ "type": "content",
37
+ "format": "text",
38
+ "content": "查询明天上海的天气,并规划一条去北京的路线"
39
+ },
40
+ "semantics": [""],
41
+ "compatibleAids": ["*"]
42
+ },
43
+ "output": {
44
+ "types": ["content"],
45
+ "formats": ["markdown"],
46
+ "examples": {
47
+ "type": "content",
48
+ "format": "markdown",
49
+ "content": ""
50
+ },
51
+ "semantics": [""],
52
+ "compatibleAids": [""]
53
+ },
54
+ "surportFind": False, # 是否支持智能体发现
55
+ "avaUrl": "https://bkimg.cdn.bcebos.com/pic/5d6034a85edf8db1dd6336220023dd54564e7422",
56
+ "supportStream": True, # False代表当前智能体不支持流式输出
57
+ "supportAsync": True,
58
+ "permission": ["*"]
59
+ }
60
+ return profile_json_data
61
+
62
+ def write_agent_profile_json(json_data):
63
+ try:
64
+ import os
65
+ json_path = Path(__file__).resolve()
66
+ json_dir = json_path.parent
67
+ json_file = os.path.join(json_dir, 'agentprofile.json')
68
+ with open(json_file, 'w', encoding='utf-8') as f:
69
+ json.dump(json_data, f, ensure_ascii=False, indent=2)
70
+ print("智能体描述文件已保存至当前目录下agentprofile.json")
71
+ except Exception as e:
72
+ print(f"文件写入失败: {str(e)}")
73
+ exit(1)
74
+
75
+
76
+ if __name__ == "__main__":
77
+ # 创建JSON数据
78
+ # 将加密种子修改为自己的加密种子,可以是随机字符串,也可以是固定字符串,只要保证一致即可。
79
+ acp = agentcp.AgentCP("../../../data","",debug=False)
80
+ agentid_list = acp.get_aid_list()
81
+ agentid:agentcp.AgentID = None
82
+ while agentid is None:
83
+ print("请选择一个身份(aid):")
84
+ for i, agentid in enumerate(agentid_list):
85
+ print(f"{i+1}. {agentid}")
86
+ print(f"{len(agentid_list)+1}. 创建一个新的身份(aid)")
87
+ choice = input("请输入数字选择一个身份(aid): ")
88
+ try:
89
+ choice = int(choice) - 1
90
+ if choice < 0 or choice > len(agentid_list):
91
+ raise ValueError
92
+ if choice == len(agentid_list):
93
+ aid = input("请输入名称: ")
94
+ agentid = acp.create_aid("agentunion.cn",aid)
95
+ if agentid is None:
96
+ print("创建身份(aid)失败,请打开日志查看原因")
97
+ exit(1)
98
+ agentid_list = acp.get_aid_list()
99
+ else:
100
+ agentid = acp.load_aid(agentid_list[choice])
101
+ if agentid is None:
102
+ print("加载身份(aid)失败,请打开日志查看原因")
103
+ exit(1)
104
+ except ValueError:
105
+ print("无效的选择,请重新输入。")
106
+ print(f"当前选择的身份(aid)是: {str(agentid)}")
107
+ agentid.init_ap_client()
108
+ json_data = create_financial_analyzer_json(agentid.get_publisher_info())
109
+ write_agent_profile_json(json_data)
110
+ select_result = input("是否将文件拷贝到agent公有数据目录下(Y/N): ")
111
+ if select_result.upper() != "Y":
112
+ # print("程序运行结束")
113
+ exit(1)
114
+ agentid.create_agent_profile(json_data)
115
+ select_result = input("拷贝成功,是否同步到接入服务器(Y/N): ")
116
+ if select_result.upper() != "Y":
117
+ print("程序运行结束")
118
+ exit(1)
119
+ result = agentid.sync_public_files()
120
+ if result:
121
+ print("文件同步成功!")
122
+ else:
123
+ print("文件同步失败,请初始化ACP时打开日志查看")
@@ -0,0 +1,129 @@
1
+ import json
2
+ from datetime import datetime, timezone
3
+ from pathlib import Path # 新增导入
4
+
5
+ import agentcp
6
+
7
+
8
+ def create_financial_analyzer_json(publisherInfo):
9
+ """创建智能体能力、权限描述"""
10
+ name = "模拟大模型调用Agent"
11
+ profile_json_data = {
12
+ "publisherInfo": publisherInfo,
13
+ "avaUrl": "https://pic.rmb.bdstatic.com/bjh/news/6b87d6906492735a3b03aa7d0aa9cb02.jpeg",
14
+ "version": "1.0.0",
15
+ "lastUpdated": datetime.now(timezone.utc).strftime("%Y-%m-%dT%H:%M:%SZ"),
16
+ "name": name,
17
+ "description": name,
18
+ "capabilities": {
19
+ "core": [name],
20
+ "extended": []
21
+ },
22
+ "llm":{
23
+ "model":"", #模型名称,或使用aid
24
+ "num_parameters":"", #模型参数量(如"7B"表示70亿参数)
25
+ "quantization_bits":"", #量化位数(如Q4表示4位量化)
26
+ "context_length":"", #上下文长度(如"4096"表示4096个token)
27
+ },
28
+ "references": {
29
+ "knowledgeBases": [""],
30
+ "tools": [""],
31
+ "companyInfo": [""],
32
+ "productInfo": [""]
33
+ },
34
+ "authorization": {
35
+ "modes": ["free"],
36
+ "fee": {},
37
+ "description": "当前智能体免费使用,无费用",
38
+ "sla": {}
39
+ },
40
+ "input": {
41
+ "types": ["content"], # 目前支持"content", "search", "reasoning_content", "error", 'file',后续会支持语音视频流
42
+ "formats": ["json"], # 详细类型
43
+ "examples": {
44
+ "type": "content",
45
+ "format": "text",
46
+ "content": "搜索智能体:xxx"
47
+ },
48
+ "semantics": [""],
49
+ "compatibleAids": ["*"]
50
+ },
51
+ "output": {
52
+ "types": ["content"],
53
+ "formats": ["markdown"],
54
+ "examples": {
55
+ "type": "content",
56
+ "format": "markdown",
57
+ "content": ""
58
+ },
59
+ "semantics": [""],
60
+ "compatibleAids": [""]
61
+ },
62
+ "supportStream": True, # False代表当前智能体不支持流式输出
63
+ "supportAsync": True,
64
+ "permission": ["*"]
65
+ }
66
+ return profile_json_data
67
+
68
+ def write_agent_profile_json(json_data):
69
+ try:
70
+ import os
71
+ json_path = Path(__file__).resolve()
72
+ json_dir = json_path.parent
73
+ json_file = os.path.join(json_dir, 'agentprofile.json')
74
+ with open(json_file, 'w', encoding='utf-8') as f:
75
+ json.dump(json_data, f, ensure_ascii=False, indent=2)
76
+ print("智能体描述文件已保存至当前目录下agentprofile.json")
77
+ except Exception as e:
78
+ print(f"文件写入失败: {str(e)}")
79
+ exit(1)
80
+
81
+
82
+ if __name__ == "__main__":
83
+ # 创建JSON数据
84
+ # 将加密种子修改为自己的加密种子,可以是随机字符串,也可以是固定字符串,只要保证一致即可。
85
+ acp = agentcp.AgentCP("../../../../data","",debug=False)
86
+ agentid_list = acp.get_aid_list()
87
+ agentid:agentcp.AgentID = None
88
+ while agentid is None:
89
+ print("请选择一个身份(aid):")
90
+ for i, agentid in enumerate(agentid_list):
91
+ print(f"{i+1}. {agentid}")
92
+ print(f"{len(agentid_list)+1}. 创建一个新的身份(aid)")
93
+ choice = input("请输入数字选择一个身份(aid): ")
94
+ try:
95
+ choice = int(choice) - 1
96
+ if choice < 0 or choice > len(agentid_list):
97
+ raise ValueError
98
+ if choice == len(agentid_list):
99
+ aid = input("请输入名称: ")
100
+ agentid = acp.create_aid("agentunion.cn",aid)
101
+ if agentid is None:
102
+ print("创建身份(aid)失败,请打开日志查看原因")
103
+ exit(1)
104
+ agentid_list = acp.get_aid_list()
105
+ else:
106
+ agentid = acp.load_aid(agentid_list[choice])
107
+ if agentid is None:
108
+ print("加载身份(aid)失败,请打开日志查看原因")
109
+ exit(1)
110
+ except ValueError:
111
+ print("无效的选择,请重新输入。")
112
+ print(f"当前选择的身份(aid)是: {str(agentid)}")
113
+ agentid.init_ap_client()
114
+ json_data = create_financial_analyzer_json(agentid.get_publisher_info())
115
+ write_agent_profile_json(json_data)
116
+ select_result = input("是否将文件拷贝到agent公有数据目录下(Y/N): ")
117
+ if select_result.upper() != "Y":
118
+ print("程序运行结束")
119
+ exit(1)
120
+ agentid.create_agent_profile(json_data)
121
+ select_result = input("拷贝成功,是否同步到接入服务器(Y/N): ")
122
+ if select_result.upper() != "Y":
123
+ print("程序运行结束")
124
+ exit(1)
125
+ result = agentid.sync_public_files()
126
+ if result:
127
+ print("文件同步成功!")
128
+ else:
129
+ print("文件同步失败,请初始化ACP时打开日志查看")
@@ -0,0 +1,5 @@
1
+ {
2
+ "API_KEY":"大模型的api_key",
3
+ "BASE_URL":"大模型Api接口URL",
4
+ "MODEL":"模型名称"
5
+ }
@@ -0,0 +1,146 @@
1
+ import json
2
+ import time
3
+
4
+ import agentcp
5
+ from openai import OpenAI
6
+
7
+
8
+ class QwenClient:
9
+ def __init__(self):
10
+ self.openai_api_key = None
11
+ self.base_url = None
12
+ self.model = None
13
+ self.client = None
14
+ self.acp = agentcp.AgentCP("../../../../data", seed_password="", debug=True)
15
+ self.agentid: agentcp.AgentID = None
16
+
17
+ def init_ai_client(self, json_data):
18
+ # 从环境变量中获取 API Key 和 Base URL
19
+ self.openai_api_key = json_data.get("API_KEY", "")
20
+ self.base_url = json_data.get("BASE_URL", "")
21
+ self.model = json_data.get("MODEL", "")
22
+ self.client = OpenAI(api_key=self.openai_api_key, base_url=self.base_url)
23
+
24
+ async def async_message_handler(self, message_data):
25
+ try:
26
+ receiver = message_data.get("receiver")
27
+ sender = message_data.get("sender", "") # 获取工具信息
28
+ if self.agentid.id not in receiver:
29
+ print("不是发给我的消息,不处理")
30
+ return
31
+ message_array = self.agentid.get_content_array_from_message(message_data)
32
+ if len(message_array) == 0:
33
+ print("消息内容为空,不处理")
34
+ return
35
+ llm_content = self.agentid.get_content_from_message(message_data)
36
+ stream = message_array[0].get("stream", False) # 获取stream信息
37
+ tools = message_array[0].get("tools", []) # 获取工具信息
38
+ rolesetting = message_array[0].get("prompt", "") # 获取工具信息
39
+ if rolesetting != "" and rolesetting != None:
40
+ messages = [{"role": "system", "content": rolesetting}, {"role": "user", "content": llm_content}]
41
+ else:
42
+ messages = [{"role": "user", "content": llm_content}]
43
+ print(f"\n[处理消息: {sender} : {llm_content}]\n")
44
+ await self.stream_process_query(message_data, messages, sender, stream, tools) # 添加await关键字
45
+ except Exception as e:
46
+ import traceback
47
+ print(f"处理消息时发生错误: {e}\n完整堆栈跟踪:\n{traceback.format_exc()}")
48
+
49
+ def send_message_tools_call(self, session_id, sender, llm_content: str, funcallback):
50
+ to_aid_list = [sender]
51
+ msg_block = {
52
+ "type": "tool_call",
53
+ "status": "success",
54
+ "timestamp": int(time.time() * 1000),
55
+ "content": llm_content,
56
+ }
57
+ self.agentid.add_message_handler(funcallback, session_id)
58
+ self.agentid.send_message(session_id, to_aid_list, msg_block)
59
+
60
+ async def stream_process_query(self, message_data: dict, messages: list, sender: str, stream: bool,
61
+ user_tools: list):
62
+ if user_tools is None:
63
+ user_tools = [] # 确保tools是一个列表,即使它为空
64
+ if len(user_tools) > 0:
65
+ response = self.client.chat.completions.create(
66
+ model=self.model,
67
+ messages=messages,
68
+ stream=stream,
69
+ tools=user_tools
70
+ )
71
+ else:
72
+ response = self.client.chat.completions.create(
73
+ model=self.model,
74
+ messages=messages,
75
+ stream=stream
76
+ )
77
+ session_id = message_data.get("session_id", "") # 获取session_id
78
+ content = response.choices[0]
79
+ if content.finish_reason == "tool_calls":
80
+ tool_call = content.message.tool_calls[0]
81
+ tool_name = tool_call.function.name
82
+ tool_args = json.loads(tool_call.function.arguments)
83
+ print(f"\n[Calling tool {tool_name} with args {tool_args}]\n")
84
+
85
+ async def funcallback(result_content):
86
+ self.agentid.remove_message_handler(funcallback, session_id)
87
+ messages.append(content.message.model_dump())
88
+ messages.append({
89
+ "role": "tool",
90
+ "content": self.agentid.get_content_from_message(result_content),
91
+ "tool_call_id": tool_call.id,
92
+ })
93
+ await self.stream_process_query(message_data, messages, sender, stream, user_tools)
94
+
95
+ tool_content = {
96
+ 'tool_name': tool_name,
97
+ 'tool_args': tool_args,
98
+ }
99
+ self.send_message_tools_call(session_id, sender, json.dumps(tool_content), funcallback)
100
+ return
101
+ if stream:
102
+ await self.agentid.send_stream_message(message_data.get("session_id"), [sender], response) # 确保正确调用
103
+ else:
104
+ return self.agentid.reply_message(message_data, content.message.content)
105
+
106
+
107
+ def main():
108
+ client = QwenClient()
109
+ print("欢迎使用 AGENT!")
110
+ _my_aid = "llmdemo007.agentunion.cn"
111
+ try:
112
+ client.agentid = client.acp.load_aid(_my_aid)
113
+
114
+ @client.agentid.message_handler()
115
+ async def sync_message_handler(msg):
116
+ await client.async_message_handler(msg) # 添加await关键字
117
+ return True
118
+
119
+ print("开始在线...")
120
+ env_path = "./env.json"
121
+ # 新增文件读取逻辑
122
+ try:
123
+ with open(env_path, 'r', encoding='utf-8') as f:
124
+ env_data = json.load(f)
125
+ client.init_ai_client(env_data)
126
+ print(f"成功加载配置文件: {env_path}")
127
+ except FileNotFoundError:
128
+ print(f"配置文件 {env_path} 未找到")
129
+ exit(1)
130
+ except json.JSONDecodeError:
131
+ print(f"配置文件 {env_path} 格式错误")
132
+ exit(1)
133
+ except Exception as e:
134
+ print(f"加载配置失败: {str(e)}")
135
+ exit(1)
136
+ client.agentid.online() # 确保self.agentid不为None
137
+ private_path = client.agentid.get_agent_private_path() # 获取私钥路径
138
+ print("开始监听消息...")
139
+ client.acp.serve_forever()
140
+ except Exception as e:
141
+ import traceback
142
+ print(f"\n⚠️ 发生错误: {traceback.format_exc()}") # 添加堆栈信息打印
143
+
144
+
145
+ if __name__ == "__main__":
146
+ main()
@@ -0,0 +1,123 @@
1
+ import json
2
+ import time
3
+ import traceback
4
+
5
+ import agentcp
6
+
7
+ """
8
+ 智能体搜索 使用大模型agent实现工具选择 多工具并行调用
9
+ """
10
+ class Agent:
11
+ def __init__(self):
12
+ self.agentid = None
13
+ self.acp = agentcp.AgentCP("../../../data",seed_password="")
14
+ self.llm_agent_id = "llmdemo007.agentunion.cn"
15
+ self.search_agent_id = "search007.agentunion.cn"
16
+ async def async_message_handler(self, msg):
17
+ try:
18
+ receiver = self.agentid.get_receiver_from_message(msg)
19
+ if self.agentid.id not in receiver:
20
+ print("不是发给我的消息,不处理")
21
+ return
22
+ sender = self.agentid.get_sender_from_message(msg)
23
+ session_id = self.agentid.get_session_id_from_message(msg)
24
+ to_aid_list = [sender]
25
+
26
+ # 获取输入
27
+ llm_content = self.agentid.get_content_from_message(msg)
28
+ print(f"llm_content={llm_content}\n")
29
+
30
+ # 调用工具选择agent
31
+ self.mult_tool_choose(llm_content,session_id,to_aid_list)
32
+ except Exception as e:
33
+ print(f"处理消息时发生错误: {e}\n完整堆栈跟踪:\n{traceback.format_exc()}")
34
+
35
+ async def reply_message_handler(self,reply_msg,session_id,to_aid_list):
36
+ content = []
37
+ print(f"模型返回结果{reply_msg}")
38
+ message_json = json.loads(reply_msg.get("message"))
39
+ if isinstance(message_json, list) and len(message_json) > 0:
40
+ content = message_json
41
+ message_json = message_json[0]
42
+ # 根据大模型返回结果 决定是否调用其他agent
43
+ if message_json.get("type") == "tool_call":
44
+ print(f"使用工具 {content}")
45
+ await self.mult_tool_call(content,session_id, to_aid_list)
46
+ else:
47
+ self.agentid.send_message_content(session_id, to_aid_list, self.agentid.get_content_from_message(reply_msg))
48
+ return
49
+
50
+ def mult_tool_choose(self,llm_content,session_id,to_aid_list):
51
+ def search_agent_handler(search_msg):
52
+ result = self.agentid.get_content_from_message(search_msg)
53
+ print(f"search result={result}")
54
+ agents = json.loads(result)
55
+ tools = []
56
+ for ainfo in agents:
57
+ description = f"我是{ainfo['agent_id']},我能提供[{ainfo['description']}]服务,我的aid是{ainfo['agent_id']}"
58
+ tools.append({
59
+ "type": "function",
60
+ "function": {
61
+ "name": "agent_" + ainfo['agent_id'],
62
+ "description": description,
63
+ "parameters": {
64
+ "type": "object",
65
+ "properties": {
66
+ "aid": {
67
+ "type": "string",
68
+ "description": "",
69
+ },
70
+ "text": {
71
+ "type": "string",
72
+ "description": ""
73
+ }
74
+ },
75
+ "required": ["aid", "text"]
76
+ }
77
+ }
78
+ })
79
+
80
+ msg_block = {
81
+ "type": "content",
82
+ "status": "success",
83
+ "timestamp": int(time.time() * 1000),
84
+ "content": llm_content,
85
+ "tools": tools,
86
+ "prompt": ""
87
+ }
88
+ self.agentid.quick_send_messsage(self.llm_agent_id, msg_block,
89
+ lambda reply_msg: self.reply_message_handler(reply_msg, session_id,
90
+ to_aid_list))
91
+
92
+ self.agentid.quick_send_messsage_content(self.search_agent_id, llm_content,search_agent_handler)
93
+
94
+ async def mult_tool_call(self,content,session_id, to_aid_list) :
95
+ for tool_call in content:
96
+ tool = json.loads(tool_call.get("content"))
97
+ tool_args = tool.get("tool_args")
98
+ print(f"aiddddddd={tool_args['aid']} text={tool_args['text']}")
99
+ async def async_func_call_result(message):
100
+ tool_result = self.agentid.get_content_from_message(message)
101
+ print(f"工具返回的结果={tool_result}")
102
+ self.agentid.send_message_content(session_id,to_aid_list, tool_result)
103
+ # self.agentid.quick_send_messsage_content(self.llm_agent_id, tool_result,
104
+ # lambda reply_msg: self.reply_message_handler(reply_msg,session_id,to_aid_list))
105
+ return
106
+ self.agentid.quick_send_messsage_content(tool_args["aid"], tool_args["text"], async_func_call_result)
107
+
108
+ if __name__ == "__main__":
109
+ _my_aid = "mc58009.agentunion.cn"
110
+
111
+ agent = Agent()
112
+ agent.agentid =agent.acp.load_aid(_my_aid)
113
+ async def sync_message_handler(msg):
114
+ print(f"收到消息数据: {msg}")
115
+ await agent.async_message_handler(msg) # 添加await关键字
116
+ return True
117
+ try:
118
+ agent.agentid.online()
119
+ # agent.agentid.sync_public_files()
120
+ agent.agentid.add_message_handler(sync_message_handler)
121
+ agent.acp.serve_forever()
122
+ except Exception as e:
123
+ print(f"AgentID未正确初始化: {e}")