@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,126 @@
1
+ from datetime import datetime, timezone
2
+ import agentcp
3
+ import os
4
+ from pathlib import Path # 新增导入
5
+ import json
6
+ def create_financial_analyzer_json(publisherInfo):
7
+ """创建智能体能力、权限描述"""
8
+ profile_json_data = {
9
+ "publisherInfo": publisherInfo,
10
+ "avaUrl": "https://img.alicdn.com/imgextra/i2/O1CN01kvilTK1hZKZPhDDvY_!!6000000004291-2-tps-269-282.png",
11
+ "version": "1.0.0",
12
+ "lastUpdated": datetime.now(timezone.utc).strftime("%Y-%m-%dT%H:%M:%SZ"),
13
+ "name": "qwen3",
14
+ "description": "qwen3大模型流式输出对话:输入字符串,输出字符串",
15
+ "capabilities": {
16
+ "core": ["大模型智能体"],
17
+ "extended": []
18
+ },
19
+ "llm":{
20
+ "model":"qwen-plus", #模型名称,或使用aid
21
+ "num_parameters":"", #模型参数量(如"7B"表示70亿参数)
22
+ "quantization_bits":"", #量化位数(如Q4表示4位量化)
23
+ "context_length":"", #上下文长度(如"4096"表示4096个token)
24
+ },
25
+ "references": {
26
+ "knowledgeBases": [""],
27
+ "tools": [""],
28
+ "companyInfo": [""],
29
+ "productInfo": [""]
30
+ },
31
+ "authorization": {
32
+ "modes": ["free"],
33
+ "fee": {},
34
+ "description": "当前智能体免费使用,无费用",
35
+ "sla": {}
36
+ },
37
+ "input": {
38
+ "types": ["content"], # 目前支持"content", "search", "reasoning_content", "error", 'file',后续会支持语音视频流
39
+ "formats": ["json"], # 详细类型
40
+ "examples": {
41
+ "type": "content",
42
+ "format": "text",
43
+ "content": "搜索智能体:xxx"
44
+ },
45
+ "semantics": [""],
46
+ "compatibleAids": ["*"]
47
+ },
48
+ "output": {
49
+ "types": ["content"],
50
+ "formats": ["markdown"],
51
+ "examples": {
52
+ "type": "content",
53
+ "format": "markdown",
54
+ "content": ""
55
+ },
56
+ "semantics": [""],
57
+ "compatibleAids": [""]
58
+ },
59
+ "supportStream": True, # False代表当前智能体不支持流式输出
60
+ "supportAsync": True,
61
+ "permission": ["*"]
62
+ }
63
+ return profile_json_data
64
+
65
+ def write_agent_profile_json(json_data):
66
+ try:
67
+ import os
68
+ json_path = Path(__file__).resolve()
69
+ json_dir = json_path.parent
70
+ json_file = os.path.join(json_dir, 'agentprofile.json')
71
+ with open(json_file, 'w', encoding='utf-8') as f:
72
+ json.dump(json_data, f, ensure_ascii=False, indent=2)
73
+ print("智能体描述文件已保存至当前目录下agentprofile.json")
74
+ except Exception as e:
75
+ print(f"文件写入失败: {str(e)}")
76
+ exit(1)
77
+
78
+
79
+ if __name__ == "__main__":
80
+ # 创建JSON数据
81
+ # 将加密种子修改为自己的加密种子,可以是随机字符串,也可以是固定字符串,只要保证一致即可。
82
+ acp = agentcp.AgentCP(os.path.pardir ,seed_password="123456",debug=False)
83
+ agentid_list = acp.get_aid_list()
84
+ agentid:agentcp.AgentID = None
85
+ while agentid is None:
86
+ print("请选择一个身份(aid):")
87
+ for i, agentid in enumerate(agentid_list):
88
+ print(f"{i+1}. {agentid}")
89
+ print(f"{len(agentid_list)+1}. 创建一个新的身份(aid)")
90
+ choice = input("请输入数字选择一个身份(aid): ")
91
+ try:
92
+ choice = int(choice) - 1
93
+ if choice < 0 or choice > len(agentid_list):
94
+ raise ValueError
95
+ if choice == len(agentid_list):
96
+ aid = input("请输入名称: ")
97
+ agentid = acp.create_aid("agentunion.cn",aid)
98
+ if agentid is None:
99
+ print("创建身份(aid)失败,请打开日志查看原因")
100
+ exit(1)
101
+ agentid_list = acp.get_aid_list()
102
+ else:
103
+ agentid = acp.load_aid(agentid_list[choice])
104
+ if agentid is None:
105
+ print("加载身份(aid)失败,请打开日志查看原因")
106
+ exit(1)
107
+ except ValueError:
108
+ print("无效的选择,请重新输入。")
109
+ print(f"当前选择的身份(aid)是: {str(agentid)}")
110
+ agentid.init_ap_client()
111
+ json_data = create_financial_analyzer_json(agentid.get_publisher_info())
112
+ write_agent_profile_json(json_data)
113
+ select_result = input("是否将文件拷贝到agent公有数据目录下(Y/N): ")
114
+ if select_result.upper() != "Y":
115
+ print("程序运行结束")
116
+ exit(1)
117
+ agentid.create_agent_profile(json_data)
118
+ select_result = input("拷贝成功,是否同步到接入服务器(Y/N): ")
119
+ if select_result.upper() != "Y":
120
+ print("程序运行结束")
121
+ exit(1)
122
+ result = agentid.sync_public_files()
123
+ if result:
124
+ print("文件同步成功!")
125
+ else:
126
+ print("文件同步失败,请初始化ACP时打开日志查看")
@@ -0,0 +1,37 @@
1
+ # -*- coding:utf-8 -*-
2
+ """
3
+ 基础配置:
4
+ qwen3大模型流式输出对话:输入字符串,输出字符串
5
+ https://img.alicdn.com/imgextra/i2/O1CN01kvilTK1hZKZPhDDvY_!!6000000004291-2-tps-269-282.png
6
+ """
7
+
8
+ import agentcp
9
+ import os
10
+ from openai import OpenAI
11
+ from dotenv import load_dotenv, find_dotenv
12
+
13
+ # 加载并读取环境变量
14
+ load_dotenv(find_dotenv())
15
+ base_url = os.getenv('BASE_URL')
16
+ openai_api_key = os.getenv('OPENAI_API_KEY')
17
+ model_name = os.getenv('MODEL_NAME')
18
+
19
+ if __name__ == "__main__":
20
+ acp = agentcp.AgentCP(os.path.pardir, seed_password='123456', debug=True)
21
+ print(f"当前acp访问路径:{acp.app_path}\n开始:agentcp版本:{agentcp.__version__},{__file__}")
22
+ aid = acp.load_aid(os.getenv('AID'))
23
+
24
+ @aid.message_handler()
25
+ async def sync_message_handler(msg):
26
+ # 大模型对话流式响应
27
+ client = OpenAI(api_key=openai_api_key, base_url=base_url)
28
+ messages = [{'role': 'user', 'content': aid.get_content_from_message(msg)}]
29
+ response = client.chat.completions.create(model=model_name, extra_body={'enable_thinking': False}, stream=True, messages=messages)
30
+ # 流式响应
31
+ await aid.send_stream_message(aid.get_session_id_from_message(msg), [aid.get_sender_from_message(msg)], response)
32
+ return True
33
+
34
+ # agent上线
35
+ aid.online()
36
+ # 开启永久监听
37
+ acp.serve_forever()
@@ -0,0 +1,133 @@
1
+ # github
2
+ [https://github.com/auliwenjiang/agentcp/blob/master/samples/qwen3_tools](https://github.com/auliwenjiang/agentcp/blob/master/samples/qwen3_tools)
3
+
4
+ # README.md
5
+
6
+ ## 1、使用指南
7
+ ### 1)、创建agent身份
8
+ 请参考[一、创建身份,读写公有私有数据](https://ccnz88r91l2y.feishu.cn/wiki/I5F4whGuFioqwNkfJ45c8ZQ3nGf)
9
+ - 运行create_profile.py,创建agent
10
+
11
+ ### 2)、添加并配置.env文件
12
+ ``` bash
13
+ BASE_URL=https://api.siliconflow.cn/v1 # 改成实际url
14
+ OPENAI_API_KEY=sk-*********** # 改成实际api key
15
+ MODEL_NAME=Qwen/Qwen3-8B # 改成实际大模型
16
+ AID=deepseekdemo.agentunion.cn # 改成自己实际注册aid
17
+ ```
18
+ ### 3)、添加依赖
19
+ ``` bash
20
+ pip install openai==1.77.0 -i https://pypi.tuna.tsinghua.edu.cn/simple/
21
+ ```
22
+ ### 4)、目录结构
23
+ ```bash
24
+ .
25
+ ├── create_profile.py # agent注册脚本
26
+ ├── .env # 环境变量配置
27
+ ├── qwen3_tools.py # 智能体实现
28
+ ```
29
+ ### 5)、执行代码
30
+ ```bash
31
+ python qwen3_tools.py
32
+ ```
33
+
34
+ ## 2、功能简介
35
+ 基于AgentCP SDK开发的qwen3大模型function calling智能体,实现大模型能力与智能体网络的无缝对接。使网络中的其他智能体可以通过调用该智能体的API来获取大模型的响应。
36
+
37
+ ## 3、环境要求
38
+ - Python 3.8+
39
+ - AgentCP SDK
40
+ - OpenAI兼容API服务
41
+
42
+ ## 4、核心类说明
43
+ ### 1)、agent上线
44
+ ```python
45
+ acp = agentcp.AgentCP(os.path.pardir, debug=True)
46
+ print(f"当前acp访问路径:{acp.app_path}\n开始:agentcp版本:{agentcp.__version__},{__file__}")
47
+ aid = acp.load_aid(os.getenv('AID'))
48
+
49
+ # agent上线
50
+ aid.online()
51
+
52
+ # 开启永久监听
53
+ acp.serve_forever()
54
+ ```
55
+ ### 2)、消息处理
56
+ ```python
57
+ @aid.message_handler()
58
+ async def sync_message_handler(msg):
59
+ print(f'收到消息数据: {msg}')
60
+ # 大模型对话
61
+ response = chat_tools(query=aid.get_content_from_message(msg))
62
+ # 消息回复
63
+ aid.send_message_content(aid.get_session_id_from_message(msg), [aid.get_sender_from_message(msg)], response)
64
+ return True
65
+ ```
66
+
67
+ ### 3)、fuction calling实现
68
+ ```python
69
+ # 工具清单
70
+ tools = [
71
+ {
72
+ "type": "function",
73
+ "function": {
74
+ "name": "get_weather",
75
+ "description": "获取城市天气信息",
76
+ "parameters": {"type": "object", "properties": {"location": {"type": "string"}, "dt": {"type": "string"}}}
77
+ }
78
+ },
79
+ {
80
+ "type": "function",
81
+ "function": {
82
+ "name": "search_news",
83
+ "description": "搜索指定主题新闻",
84
+ "parameters": {"type": "object", "properties": {"keyword": {"type": "string"}}}
85
+ }
86
+ }
87
+ ]
88
+
89
+ # 定义本地函数(模拟天气API)
90
+ def get_weather(location: str, dt: str):
91
+ """模拟天气查询功能"""
92
+ return f'{location}{dt}天气:25℃,晴朗'
93
+
94
+ # 定义本地函数(模拟天气API)
95
+ def search_news(keyword: str):
96
+ """模拟天气查询功能"""
97
+ return f'{keyword}最新消息'
98
+
99
+
100
+ def chat_tools(query: str):
101
+ print('-' * 60)
102
+ # 发起请求并处理响应
103
+ messages = [{'role': 'user', 'content': query},
104
+ {'role': 'system', 'content': '你是一个工具调用助手,需要一次性返回所有工具'}]
105
+ client = OpenAI(api_key=openai_api_key, base_url=base_url)
106
+ response = client.chat.completions.create(model=model_name, messages=messages, tools=tools, tool_choice='auto',
107
+ temperature=0.3)
108
+ # 大模型返回解析
109
+ try:
110
+ message = response.choices[0].message
111
+ # 工具不存在直接返回
112
+ if not hasattr(message, 'tool_calls') or not message.tool_calls:
113
+ return message.content
114
+
115
+ # 处理工具
116
+ results = []
117
+ for tool_call in message.tool_calls:
118
+ name, args0 = tool_call.function.name, tool_call.function.arguments
119
+ # 兼容{'location': '上海'} 和 '{"location": "上海"}'格式
120
+ args = json.loads(args0) if isinstance(args0, str) else args0
121
+ result = get_weather(**args) if name == 'get_weather' else search_news(**args)
122
+ info = f'函数={name}, args={args}, 调用结果:{result}'
123
+ results.append(info)
124
+ return ';'.join(results)
125
+ except Exception as e:
126
+ print(f'llm response parse err:{e}')
127
+ return '大模型返回解析失败'
128
+ ```
129
+
130
+ ## 注意事项
131
+ 1. 大模型环境变量正确配置
132
+ 2. 智能体网络接入需要有效的seed_password
133
+ 3. 生产环境建议关闭debug模式
@@ -0,0 +1,126 @@
1
+ from datetime import datetime, timezone
2
+ import agentcp
3
+ import os
4
+ from pathlib import Path # 新增导入
5
+ import json
6
+ def create_financial_analyzer_json(publisherInfo):
7
+ """创建智能体能力、权限描述"""
8
+ profile_json_data = {
9
+ "publisherInfo": publisherInfo,
10
+ "avaUrl": "https://img.alicdn.com/imgextra/i2/O1CN01kvilTK1hZKZPhDDvY_!!6000000004291-2-tps-269-282.pn",
11
+ "version": "1.0.0",
12
+ "lastUpdated": datetime.now(timezone.utc).strftime("%Y-%m-%dT%H:%M:%SZ"),
13
+ "name": "qwen3_tools",
14
+ "description": "qwen3大模型function calling使用,输入字符串,输出字符串",
15
+ "capabilities": {
16
+ "core": ["大模型tools智能体"],
17
+ "extended": []
18
+ },
19
+ "llm":{
20
+ "model":"qwen-plus", #模型名称,或使用aid
21
+ "num_parameters":"", #模型参数量(如"7B"表示70亿参数)
22
+ "quantization_bits":"", #量化位数(如Q4表示4位量化)
23
+ "context_length":"", #上下文长度(如"4096"表示4096个token)
24
+ },
25
+ "references": {
26
+ "knowledgeBases": [""],
27
+ "tools": [""],
28
+ "companyInfo": [""],
29
+ "productInfo": [""]
30
+ },
31
+ "authorization": {
32
+ "modes": ["free"],
33
+ "fee": {},
34
+ "description": "当前智能体免费使用,无费用",
35
+ "sla": {}
36
+ },
37
+ "input": {
38
+ "types": ["content"], # 目前支持"content", "search", "reasoning_content", "error", 'file',后续会支持语音视频流
39
+ "formats": ["json"], # 详细类型
40
+ "examples": {
41
+ "type": "content",
42
+ "format": "text",
43
+ "content": "搜索智能体:xxx"
44
+ },
45
+ "semantics": [""],
46
+ "compatibleAids": ["*"]
47
+ },
48
+ "output": {
49
+ "types": ["content"],
50
+ "formats": ["markdown"],
51
+ "examples": {
52
+ "type": "content",
53
+ "format": "markdown",
54
+ "content": ""
55
+ },
56
+ "semantics": [""],
57
+ "compatibleAids": [""]
58
+ },
59
+ "supportStream": False, # False代表当前智能体不支持流式输出
60
+ "supportAsync": True,
61
+ "permission": ["*"]
62
+ }
63
+ return profile_json_data
64
+
65
+ def write_agent_profile_json(json_data):
66
+ try:
67
+ import os
68
+ json_path = Path(__file__).resolve()
69
+ json_dir = json_path.parent
70
+ json_file = os.path.join(json_dir, 'agentprofile.json')
71
+ with open(json_file, 'w', encoding='utf-8') as f:
72
+ json.dump(json_data, f, ensure_ascii=False, indent=2)
73
+ print("智能体描述文件已保存至当前目录下agentprofile.json")
74
+ except Exception as e:
75
+ print(f"文件写入失败: {str(e)}")
76
+ exit(1)
77
+
78
+
79
+ if __name__ == "__main__":
80
+ # 创建JSON数据
81
+ # 将加密种子修改为自己的加密种子,可以是随机字符串,也可以是固定字符串,只要保证一致即可。
82
+ acp = agentcp.AgentCP(os.path.pardir ,seed_password="123456",debug=False)
83
+ agentid_list = acp.get_aid_list()
84
+ agentid:agentcp.AgentID = None
85
+ while agentid is None:
86
+ print("请选择一个身份(aid):")
87
+ for i, agentid in enumerate(agentid_list):
88
+ print(f"{i+1}. {agentid}")
89
+ print(f"{len(agentid_list)+1}. 创建一个新的身份(aid)")
90
+ choice = input("请输入数字选择一个身份(aid): ")
91
+ try:
92
+ choice = int(choice) - 1
93
+ if choice < 0 or choice > len(agentid_list):
94
+ raise ValueError
95
+ if choice == len(agentid_list):
96
+ aid = input("请输入名称: ")
97
+ agentid = acp.create_aid("agentunion.cn",aid)
98
+ if agentid is None:
99
+ print("创建身份(aid)失败,请打开日志查看原因")
100
+ exit(1)
101
+ agentid_list = acp.get_aid_list()
102
+ else:
103
+ agentid = acp.load_aid(agentid_list[choice])
104
+ if agentid is None:
105
+ print("加载身份(aid)失败,请打开日志查看原因")
106
+ exit(1)
107
+ except ValueError:
108
+ print("无效的选择,请重新输入。")
109
+ print(f"当前选择的身份(aid)是: {str(agentid)}")
110
+ agentid.init_ap_client()
111
+ json_data = create_financial_analyzer_json(agentid.get_publisher_info())
112
+ write_agent_profile_json(json_data)
113
+ select_result = input("是否将文件拷贝到agent公有数据目录下(Y/N): ")
114
+ if select_result.upper() != "Y":
115
+ print("程序运行结束")
116
+ exit(1)
117
+ agentid.create_agent_profile(json_data)
118
+ select_result = input("拷贝成功,是否同步到接入服务器(Y/N): ")
119
+ if select_result.upper() != "Y":
120
+ print("程序运行结束")
121
+ exit(1)
122
+ result = agentid.sync_public_files()
123
+ if result:
124
+ print("文件同步成功!")
125
+ else:
126
+ print("文件同步失败,请初始化ACP时打开日志查看")
@@ -0,0 +1,98 @@
1
+ # -*- coding:utf-8 -*-
2
+ """
3
+ 基础配置:
4
+ qwen3大模型function calling使用,输入字符串,输出字符串
5
+ https://img.alicdn.com/imgextra/i2/O1CN01kvilTK1hZKZPhDDvY_!!6000000004291-2-tps-269-282.png
6
+ """
7
+ import agentcp
8
+ import os
9
+ import json
10
+ from openai import OpenAI
11
+ from dotenv import load_dotenv, find_dotenv
12
+
13
+ # 加载并读取环境变量
14
+ load_dotenv(find_dotenv())
15
+ base_url = os.getenv('BASE_URL')
16
+ openai_api_key = os.getenv('OPENAI_API_KEY')
17
+ model_name = os.getenv('MODEL_NAME')
18
+
19
+
20
+ # 工具清单
21
+ tools = [
22
+ {
23
+ "type": "function",
24
+ "function": {
25
+ "name": "get_weather",
26
+ "description": "获取城市天气信息",
27
+ "parameters": {"type": "object", "properties": {"location": {"type": "string"}, "dt": {"type": "string"}}}
28
+ }
29
+ },
30
+ {
31
+ "type": "function",
32
+ "function": {
33
+ "name": "search_news",
34
+ "description": "搜索指定主题新闻",
35
+ "parameters": {"type": "object", "properties": {"keyword": {"type": "string"}}}
36
+ }
37
+ }
38
+ ]
39
+
40
+ # 定义本地函数(模拟天气API)
41
+ def get_weather(location: str, dt: str):
42
+ """模拟天气查询功能"""
43
+ return f'{location}{dt}天气:25℃,晴朗'
44
+
45
+ # 定义本地函数(模拟天气API)
46
+ def search_news(keyword: str):
47
+ """模拟天气查询功能"""
48
+ return f'{keyword}最新消息'
49
+
50
+
51
+ def chat_tools(query: str):
52
+ print('-' * 60)
53
+ # 发起请求并处理响应
54
+ messages = [{'role': 'user', 'content': query},
55
+ {'role': 'system', 'content': '你是一个工具调用助手,需要一次性返回所有工具'}]
56
+ client = OpenAI(api_key=openai_api_key, base_url=base_url)
57
+ response = client.chat.completions.create(model=model_name, messages=messages, tools=tools, tool_choice='auto',
58
+ temperature=0.3)
59
+ # 大模型返回解析
60
+ try:
61
+ message = response.choices[0].message
62
+ # 工具不存在直接返回
63
+ if not hasattr(message, 'tool_calls') or not message.tool_calls:
64
+ return message.content
65
+
66
+ # 处理工具
67
+ results = []
68
+ for tool_call in message.tool_calls:
69
+ name, args0 = tool_call.function.name, tool_call.function.arguments
70
+ # 兼容{'location': '上海'} 和 '{"location": "上海"}'格式
71
+ args = json.loads(args0) if isinstance(args0, str) else args0
72
+ result = get_weather(**args) if name == 'get_weather' else search_news(**args)
73
+ info = f'函数={name}, args={args}, 调用结果:{result}'
74
+ results.append(info)
75
+ return ';'.join(results)
76
+ except Exception as e:
77
+ print(f'llm response parse err:{e}')
78
+ return '大模型返回解析失败'
79
+
80
+
81
+ if __name__ == "__main__":
82
+ acp = agentcp.AgentCP(os.path.pardir, seed_password='123456', debug=True)
83
+ print(f"当前acp访问路径:{acp.app_path}\n开始:agentcp版本:{agentcp.__version__},{__file__}")
84
+ aid = acp.load_aid(os.getenv('AID'))
85
+
86
+ @aid.message_handler()
87
+ async def sync_message_handler(msg):
88
+ print(f'收到消息数据: {msg}')
89
+ # 大模型对话
90
+ response = chat_tools(query=aid.get_content_from_message(msg))
91
+ # 消息回复
92
+ aid.send_message_content(aid.get_session_id_from_message(msg), [aid.get_sender_from_message(msg)], response)
93
+ return True
94
+
95
+ # agent上线
96
+ aid.online()
97
+ # 开启永久监听
98
+ acp.serve_forever()
@@ -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时打开日志查看")