@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.
- package/CHANGELOG.md +102 -0
- package/cli.js +44 -5
- package/core/dependency_checker.py +250 -0
- package/core/env_checker.py +490 -0
- package/dependencies_lock.json +128 -0
- package/extensions/agents/assistant/server.py +33 -17
- package/extensions/channels/acp_channel/server.py +33 -17
- package/extensions/services/backup/entry.py +23 -16
- package/extensions/services/evol/auth_manager.py +443 -0
- package/extensions/services/evol/config.yaml +149 -0
- package/extensions/services/evol/config_loader.py +117 -0
- package/extensions/services/evol/entry.py +406 -0
- package/extensions/services/evol/evol_api.py +173 -0
- package/extensions/services/evol/evol_config.json5 +29 -0
- package/extensions/services/evol/migrate_tokens.py +122 -0
- package/extensions/services/evol/module.md +32 -0
- package/extensions/services/evol/pairing.py +250 -0
- package/extensions/services/evol/pairing_codes.jsonl +1 -0
- package/extensions/services/evol/relay.py +682 -0
- package/extensions/services/evol/relay_config.json5 +67 -0
- package/extensions/services/evol/routes/__init__.py +1 -0
- package/extensions/services/evol/routes/routes_management_ws.py +127 -0
- package/extensions/services/evol/routes/routes_rpc.py +89 -0
- package/extensions/services/evol/routes/routes_test.py +61 -0
- package/extensions/services/evol/server.py +875 -0
- package/extensions/services/evol/static/css/style.css +1200 -0
- package/extensions/services/evol/static/index.html +781 -0
- package/extensions/services/evol/static/index_evol.html +14 -0
- package/extensions/services/evol/static/js/app.js +6304 -0
- package/extensions/services/evol/static/js/auth.js +326 -0
- package/extensions/services/evol/static/js/dialog.js +285 -0
- package/extensions/services/evol/static/js/evol-app-fixed.js +50 -0
- package/extensions/services/evol/static/js/evol-app.js +1949 -0
- package/extensions/services/evol/static/js/evol-app.js.bak +1800 -0
- package/extensions/services/evol/static/js/kernel-client-example.js +228 -0
- package/extensions/services/evol/static/js/kernel-client.js +396 -0
- package/extensions/services/evol/static/js/main.js +141 -0
- package/extensions/services/evol/static/js/registry-tests.js +585 -0
- package/extensions/services/evol/static/js/stats.js +217 -0
- package/extensions/services/evol/static/js/token-manager.js +175 -0
- package/extensions/services/evol/static/pairing.html +248 -0
- package/extensions/services/evol/static/test_registry.html +262 -0
- package/extensions/services/evol/static/test_relay.html +462 -0
- package/extensions/services/evol/stats_manager.py +240 -0
- package/extensions/services/model_service/entry.py +23 -1
- package/extensions/services/proxy/.claude/settings.local.json +13 -0
- package/extensions/services/proxy/CHANGELOG_20260308.md +258 -0
- package/extensions/services/proxy/_fix_prints.py +133 -0
- package/extensions/services/proxy/_fix_prints2.py +87 -0
- package/extensions/services/proxy/agentcp/LICENCE +178 -0
- package/extensions/services/proxy/agentcp/README copy.md +85 -0
- package/extensions/services/proxy/agentcp/README.md +260 -0
- package/extensions/services/proxy/agentcp/__init__.py +16 -0
- package/extensions/services/proxy/agentcp/agent.py +4 -0
- package/extensions/services/proxy/agentcp/agentcp.py +2494 -0
- package/extensions/services/proxy/agentcp/agentprofile.json +89 -0
- package/extensions/services/proxy/agentcp/ap/__init__.py +16 -0
- package/extensions/services/proxy/agentcp/ap/ap_client.py +316 -0
- package/extensions/services/proxy/agentcp/assets/images/wechat_qr.png +0 -0
- package/extensions/services/proxy/agentcp/backup/metrics.json +31 -0
- package/extensions/services/proxy/agentcp/base/__init__.py +20 -0
- package/extensions/services/proxy/agentcp/base/auth_client.py +257 -0
- package/extensions/services/proxy/agentcp/base/client.py +112 -0
- package/extensions/services/proxy/agentcp/base/env.py +34 -0
- package/extensions/services/proxy/agentcp/base/html_util.py +336 -0
- package/extensions/services/proxy/agentcp/base/log.py +98 -0
- package/extensions/services/proxy/agentcp/ca/__init__.py +17 -0
- package/extensions/services/proxy/agentcp/ca/ca_client.py +414 -0
- package/extensions/services/proxy/agentcp/ca/ca_root.py +74 -0
- package/extensions/services/proxy/agentcp/context/__init__.py +20 -0
- package/extensions/services/proxy/agentcp/context/context.py +73 -0
- package/extensions/services/proxy/agentcp/context/exceptions.py +114 -0
- package/extensions/services/proxy/agentcp/create_profile.py +125 -0
- package/extensions/services/proxy/agentcp/create_profile_weather.py +125 -0
- package/extensions/services/proxy/agentcp/db/__init__.py +15 -0
- package/extensions/services/proxy/agentcp/db/db_mananger.py +550 -0
- package/extensions/services/proxy/agentcp/docs/UDP_HEARTBEAT_FIX_REPORT.md +265 -0
- package/extensions/services/proxy/agentcp/docs/heartbeat_issue_analysis.md +291 -0
- package/extensions/services/proxy/agentcp/file/__init__.py +16 -0
- package/extensions/services/proxy/agentcp/file/file_client.py +141 -0
- package/extensions/services/proxy/agentcp/file/wss_binary_message.py +137 -0
- package/extensions/services/proxy/agentcp/hcp.py +299 -0
- package/extensions/services/proxy/agentcp/heartbeat/__init__.py +16 -0
- package/extensions/services/proxy/agentcp/heartbeat/heartbeat_client.py +360 -0
- package/extensions/services/proxy/agentcp/improved_scheduler.py +498 -0
- package/extensions/services/proxy/agentcp/llm_agent_utils.py +249 -0
- package/extensions/services/proxy/agentcp/llm_server.py +172 -0
- package/extensions/services/proxy/agentcp/mermaid.py +210 -0
- package/extensions/services/proxy/agentcp/message.py +149 -0
- package/extensions/services/proxy/agentcp/metrics.py +256 -0
- package/extensions/services/proxy/agentcp/monitoring/__init__.py +20 -0
- package/extensions/services/proxy/agentcp/monitoring/global_monitor.py +27 -0
- package/extensions/services/proxy/agentcp/monitoring/metrics_store.py +325 -0
- package/extensions/services/proxy/agentcp/monitoring/monitoring_service.py +269 -0
- package/extensions/services/proxy/agentcp/monitoring/sliding_window.py +222 -0
- package/extensions/services/proxy/agentcp/monitoring/standalone_reader.py +224 -0
- package/extensions/services/proxy/agentcp/msg/__init__.py +21 -0
- package/extensions/services/proxy/agentcp/msg/connection_manager.py +456 -0
- package/extensions/services/proxy/agentcp/msg/message_client.py +2058 -0
- package/extensions/services/proxy/agentcp/msg/message_serialize.py +263 -0
- package/extensions/services/proxy/agentcp/msg/open_ai_message.py +88 -0
- package/extensions/services/proxy/agentcp/msg/session_manager.py +1062 -0
- package/extensions/services/proxy/agentcp/msg/stream_client.py +267 -0
- package/extensions/services/proxy/agentcp/msg/websocket_file_receiver.py +89 -0
- package/extensions/services/proxy/agentcp/msg/ws_logger.py +685 -0
- package/extensions/services/proxy/agentcp/msg/wss_binary_message.py +137 -0
- package/extensions/services/proxy/agentcp/requirements.txt +7 -0
- package/extensions/services/proxy/agentcp/samples/agent_graph/README.md +37 -0
- package/extensions/services/proxy/agentcp/samples/agent_graph/agentprofile.json +89 -0
- package/extensions/services/proxy/agentcp/samples/agent_graph/create_profile.py +138 -0
- package/extensions/services/proxy/agentcp/samples/agent_graph/main.py +164 -0
- package/extensions/services/proxy/agentcp/samples/agent_use/create_profile.py +123 -0
- package/extensions/services/proxy/agentcp/samples/agent_use/llm/create_profile.py +129 -0
- package/extensions/services/proxy/agentcp/samples/agent_use/llm/env.json +5 -0
- package/extensions/services/proxy/agentcp/samples/agent_use/llm/main.py +146 -0
- package/extensions/services/proxy/agentcp/samples/agent_use/main.py +123 -0
- package/extensions/services/proxy/agentcp/samples/agent_use/readme.md +379 -0
- package/extensions/services/proxy/agentcp/samples/agent_use/search/create_profile.py +129 -0
- package/extensions/services/proxy/agentcp/samples/agent_use/search/main.py +28 -0
- package/extensions/services/proxy/agentcp/samples/agent_use/tool/create_profile.py +129 -0
- package/extensions/services/proxy/agentcp/samples/agent_use/tool/main.py +20 -0
- package/extensions/services/proxy/agentcp/samples/ali_amap/README.md +97 -0
- package/extensions/services/proxy/agentcp/samples/ali_amap/amap_agent.py +88 -0
- package/extensions/services/proxy/agentcp/samples/ali_amap/create_profile.py +125 -0
- package/extensions/services/proxy/agentcp/samples/compute_agent/agent/powershell.py +228 -0
- package/extensions/services/proxy/agentcp/samples/compute_agent/agent/software.py +63 -0
- package/extensions/services/proxy/agentcp/samples/compute_agent/agent/tools.py +36 -0
- package/extensions/services/proxy/agentcp/samples/compute_agent/browser_user.py +41 -0
- package/extensions/services/proxy/agentcp/samples/deepseek/README.md +79 -0
- package/extensions/services/proxy/agentcp/samples/deepseek/create_profile.py +126 -0
- package/extensions/services/proxy/agentcp/samples/deepseek/deepseek.py +42 -0
- package/extensions/services/proxy/agentcp/samples/dify_chat/README.md +78 -0
- package/extensions/services/proxy/agentcp/samples/dify_chat/create_profile.py +126 -0
- package/extensions/services/proxy/agentcp/samples/dify_chat/dify_chat.py +47 -0
- package/extensions/services/proxy/agentcp/samples/dify_workflow/README.md +78 -0
- package/extensions/services/proxy/agentcp/samples/dify_workflow/create_profile.py +126 -0
- package/extensions/services/proxy/agentcp/samples/dify_workflow/dify_workflow.py +46 -0
- package/extensions/services/proxy/agentcp/samples/executor/README.md +44 -0
- package/extensions/services/proxy/agentcp/samples/executor/agentprofile.json +89 -0
- package/extensions/services/proxy/agentcp/samples/executor/create_profile.py +139 -0
- package/extensions/services/proxy/agentcp/samples/executor/main.py +160 -0
- package/extensions/services/proxy/agentcp/samples/filereader/README.md +45 -0
- package/extensions/services/proxy/agentcp/samples/filereader/agentprofile.json +90 -0
- package/extensions/services/proxy/agentcp/samples/filereader/create_profile.py +137 -0
- package/extensions/services/proxy/agentcp/samples/filereader/main.py +253 -0
- package/extensions/services/proxy/agentcp/samples/filewriter/README.md +38 -0
- package/extensions/services/proxy/agentcp/samples/filewriter/agentprofile.json +91 -0
- package/extensions/services/proxy/agentcp/samples/filewriter/create_profile.py +138 -0
- package/extensions/services/proxy/agentcp/samples/filewriter/main.py +289 -0
- package/extensions/services/proxy/agentcp/samples/hcp/README.md +85 -0
- package/extensions/services/proxy/agentcp/samples/hcp/acp_weather_agent.zip +0 -0
- package/extensions/services/proxy/agentcp/samples/hcp/create_profile.py +125 -0
- package/extensions/services/proxy/agentcp/samples/hcp/hcp.py +237 -0
- package/extensions/services/proxy/agentcp/samples/helloworld/README.md +68 -0
- package/extensions/services/proxy/agentcp/samples/helloworld/hello_world.py +40 -0
- package/extensions/services/proxy/agentcp/samples/llm_agent/MEADME.md +117 -0
- package/extensions/services/proxy/agentcp/samples/llm_agent/create_profile.py +125 -0
- package/extensions/services/proxy/agentcp/samples/llm_agent/qwen_agent.py +136 -0
- package/extensions/services/proxy/agentcp/samples/local_llm_agent/README.md +90 -0
- package/extensions/services/proxy/agentcp/samples/local_llm_agent/create_profile.py +125 -0
- package/extensions/services/proxy/agentcp/samples/local_llm_agent/main.py +49 -0
- package/extensions/services/proxy/agentcp/samples/query_llm_from_agent/README.md +55 -0
- package/extensions/services/proxy/agentcp/samples/query_llm_from_agent/create_profile.py +125 -0
- package/extensions/services/proxy/agentcp/samples/query_llm_from_agent/main.py +23 -0
- package/extensions/services/proxy/agentcp/samples/query_weather_api_agent/README.md +103 -0
- package/extensions/services/proxy/agentcp/samples/query_weather_api_agent/create_profile.py +125 -0
- package/extensions/services/proxy/agentcp/samples/query_weather_api_agent/main.py +69 -0
- package/extensions/services/proxy/agentcp/samples/query_weather_from_agent/README.md +58 -0
- package/extensions/services/proxy/agentcp/samples/query_weather_from_agent/create_profile.py +125 -0
- package/extensions/services/proxy/agentcp/samples/query_weather_from_agent/main.py +25 -0
- package/extensions/services/proxy/agentcp/samples/qwen3/README.md +71 -0
- package/extensions/services/proxy/agentcp/samples/qwen3/create_profile.py +126 -0
- package/extensions/services/proxy/agentcp/samples/qwen3/qwen3.py +37 -0
- package/extensions/services/proxy/agentcp/samples/qwen3_tools/README.md +133 -0
- package/extensions/services/proxy/agentcp/samples/qwen3_tools/create_profile.py +126 -0
- package/extensions/services/proxy/agentcp/samples/qwen3_tools/qwen3_tools.py +98 -0
- package/extensions/services/proxy/agentcp/samples/search/create_profile_qwen.py +125 -0
- package/extensions/services/proxy/agentcp/samples/search/create_profile_search.py +125 -0
- package/extensions/services/proxy/agentcp/samples/search/qwen_agent.py +136 -0
- package/extensions/services/proxy/agentcp/samples/search/search_agent.py +170 -0
- package/extensions/services/proxy/agentcp/samples/wrapper_agently_to_agent/README.md +89 -0
- package/extensions/services/proxy/agentcp/samples/wrapper_agently_to_agent/create_profile.py +125 -0
- package/extensions/services/proxy/agentcp/samples/wrapper_agently_to_agent/main.py +44 -0
- package/extensions/services/proxy/agentcp/utils/__init__.py +15 -0
- package/extensions/services/proxy/agentcp/utils/file_util.py +117 -0
- package/extensions/services/proxy/agentcp/utils/proxy_bypass.py +99 -0
- package/extensions/services/proxy/agentcp/workflow.py +203 -0
- package/extensions/services/proxy/console_auth.py +109 -0
- package/extensions/services/proxy/evol/__init__.py +1 -0
- package/extensions/services/proxy/evol/config.py +37 -0
- package/extensions/services/proxy/evol/http/__init__.py +1 -0
- package/extensions/services/proxy/evol/http/async_http.py +551 -0
- package/extensions/services/proxy/evol/log.py +28 -0
- package/extensions/services/proxy/evol/presenter/__init__.py +2 -0
- package/extensions/services/proxy/evol/presenter/agentIdPresenter.py +1031 -0
- package/extensions/services/proxy/evol/presenter/apikeyPresenter.py +106 -0
- package/extensions/services/proxy/evol/presenter/configPresenter.py +1281 -0
- package/extensions/services/proxy/evol/presenter/userPresenter.py +477 -0
- package/extensions/services/proxy/evol/server/__init__.py +1 -0
- package/extensions/services/proxy/evol/server/claude_proxy_async.py +3430 -0
- package/extensions/services/proxy/evol/server/openclaw_proxy.py +1861 -0
- package/extensions/services/proxy/evol/server/proxy_config.py +15 -0
- package/extensions/services/proxy/evol/server/proxy_engine.py +501 -0
- package/extensions/services/proxy/evol/version.py +24 -0
- package/extensions/services/proxy/logs/websocket.log +260 -0
- package/extensions/services/proxy/main.py +240 -0
- package/extensions/services/proxy/requirements.txt +13 -0
- package/extensions/services/proxy/server.py +271 -0
- package/extensions/services/watchdog/entry.py +42 -16
- package/extensions/services/watchdog/module.md +1 -0
- package/extensions/services/watchdog/monitor.py +34 -4
- package/extensions/services/web/module.md +1 -1
- package/extensions/services/web/server.py +30 -18
- package/extensions/services/web/static/js/token-manager.js +10 -10
- package/kernel/entry.py +1 -1
- package/kernel/module.md +25 -1
- package/kernel/registry_store.py +2 -26
- package/kernel/rpc_router.py +36 -10
- package/kernel/server.py +106 -17
- package/kite_cli/commands/deps_install.py +67 -0
- package/kite_cli/commands/env_check.py +45 -0
- package/kite_cli/commands/prepare.py +49 -0
- package/kite_cli/commands/venv_setup.py +56 -0
- package/kite_cli/main.py +29 -1
- package/launcher/entry.py +306 -21
- package/launcher/module.md +9 -0
- package/launcher/module_scanner.py +11 -1
- package/main.py +4 -1
- package/package.json +8 -1
- package/python_version.json +4 -0
- package/requirements.txt +38 -0
- package/scripts/env-manager.js +328 -0
- package/scripts/python-env.js +79 -0
- package/scripts/scan_dependencies.py +461 -0
- 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://tse3-mm.cn.bing.net/th/id/OIP-C.Hux_MNYiHtMI5EnBzSIubAAAAA?rs=1&pid=ImgDetMain",
|
|
11
|
+
"version": "1.0.0",
|
|
12
|
+
"lastUpdated": datetime.now(timezone.utc).strftime("%Y-%m-%dT%H:%M:%SZ"),
|
|
13
|
+
"name": "deepseek",
|
|
14
|
+
"description": "SSE模式接入dify的工作流:输入输出都是字符串(其中输入字符串应该包含:旅行目的地、旅行天数、旅行预算信息)",
|
|
15
|
+
"capabilities": {
|
|
16
|
+
"core": ["dify工作流智能体"],
|
|
17
|
+
"extended": []
|
|
18
|
+
},
|
|
19
|
+
"llm":{
|
|
20
|
+
"model":"qwen-plus", #模型名称,或使用aid
|
|
21
|
+
"num_parameters":"", #模型参数量(如"7B"表示70亿参数)
|
|
22
|
+
"quantization_bits":"", #量化位数(如Q4表示4位量化)
|
|
23
|
+
"context_length":"", #上下文长度(如"4096"表示4096个token)
|
|
24
|
+
},
|
|
25
|
+
"references": {
|
|
26
|
+
"knowledgeBases": [""],
|
|
27
|
+
"tools": [""],
|
|
28
|
+
"companyInfo": [""],
|
|
29
|
+
"productInfo": [""]
|
|
30
|
+
},
|
|
31
|
+
"authorization": {
|
|
32
|
+
"modes": ["free"],
|
|
33
|
+
"fee": {},
|
|
34
|
+
"description": "当前智能体免费使用,无费用",
|
|
35
|
+
"sla": {}
|
|
36
|
+
},
|
|
37
|
+
"input": {
|
|
38
|
+
"types": ["content"], # 目前支持"content", "search", "reasoning_content", "error", 'file',后续会支持语音视频流
|
|
39
|
+
"formats": ["json"], # 详细类型
|
|
40
|
+
"examples": {
|
|
41
|
+
"type": "content",
|
|
42
|
+
"format": "text",
|
|
43
|
+
"content": "搜索智能体:xxx"
|
|
44
|
+
},
|
|
45
|
+
"semantics": [""],
|
|
46
|
+
"compatibleAids": ["*"]
|
|
47
|
+
},
|
|
48
|
+
"output": {
|
|
49
|
+
"types": ["content"],
|
|
50
|
+
"formats": ["markdown"],
|
|
51
|
+
"examples": {
|
|
52
|
+
"type": "content",
|
|
53
|
+
"format": "markdown",
|
|
54
|
+
"content": ""
|
|
55
|
+
},
|
|
56
|
+
"semantics": [""],
|
|
57
|
+
"compatibleAids": [""]
|
|
58
|
+
},
|
|
59
|
+
"supportStream": False, # False代表当前智能体不支持流式输出
|
|
60
|
+
"supportAsync": True,
|
|
61
|
+
"permission": ["*"]
|
|
62
|
+
}
|
|
63
|
+
return profile_json_data
|
|
64
|
+
|
|
65
|
+
def write_agent_profile_json(json_data):
|
|
66
|
+
try:
|
|
67
|
+
import os
|
|
68
|
+
json_path = Path(__file__).resolve()
|
|
69
|
+
json_dir = json_path.parent
|
|
70
|
+
json_file = os.path.join(json_dir, 'agentprofile.json')
|
|
71
|
+
with open(json_file, 'w', encoding='utf-8') as f:
|
|
72
|
+
json.dump(json_data, f, ensure_ascii=False, indent=2)
|
|
73
|
+
print("智能体描述文件已保存至当前目录下agentprofile.json")
|
|
74
|
+
except Exception as e:
|
|
75
|
+
print(f"文件写入失败: {str(e)}")
|
|
76
|
+
exit(1)
|
|
77
|
+
|
|
78
|
+
|
|
79
|
+
if __name__ == "__main__":
|
|
80
|
+
# 创建JSON数据
|
|
81
|
+
# 将加密种子修改为自己的加密种子,可以是随机字符串,也可以是固定字符串,只要保证一致即可。
|
|
82
|
+
acp = agentcp.AgentCP(os.path.pardir ,seed_password="123456",debug=False)
|
|
83
|
+
agentid_list = acp.get_aid_list()
|
|
84
|
+
agentid:agentcp.AgentID = None
|
|
85
|
+
while agentid is None:
|
|
86
|
+
print("请选择一个身份(aid):")
|
|
87
|
+
for i, agentid in enumerate(agentid_list):
|
|
88
|
+
print(f"{i+1}. {agentid}")
|
|
89
|
+
print(f"{len(agentid_list)+1}. 创建一个新的身份(aid)")
|
|
90
|
+
choice = input("请输入数字选择一个身份(aid): ")
|
|
91
|
+
try:
|
|
92
|
+
choice = int(choice) - 1
|
|
93
|
+
if choice < 0 or choice > len(agentid_list):
|
|
94
|
+
raise ValueError
|
|
95
|
+
if choice == len(agentid_list):
|
|
96
|
+
aid = input("请输入名称: ")
|
|
97
|
+
agentid = acp.create_aid("agentunion.cn",aid)
|
|
98
|
+
if agentid is None:
|
|
99
|
+
print("创建身份(aid)失败,请打开日志查看原因")
|
|
100
|
+
exit(1)
|
|
101
|
+
agentid_list = acp.get_aid_list()
|
|
102
|
+
else:
|
|
103
|
+
agentid = acp.load_aid(agentid_list[choice])
|
|
104
|
+
if agentid is None:
|
|
105
|
+
print("加载身份(aid)失败,请打开日志查看原因")
|
|
106
|
+
exit(1)
|
|
107
|
+
except ValueError:
|
|
108
|
+
print("无效的选择,请重新输入。")
|
|
109
|
+
print(f"当前选择的身份(aid)是: {str(agentid)}")
|
|
110
|
+
agentid.init_ap_client()
|
|
111
|
+
json_data = create_financial_analyzer_json(agentid.get_publisher_info())
|
|
112
|
+
write_agent_profile_json(json_data)
|
|
113
|
+
select_result = input("是否将文件拷贝到agent公有数据目录下(Y/N): ")
|
|
114
|
+
if select_result.upper() != "Y":
|
|
115
|
+
print("程序运行结束")
|
|
116
|
+
exit(1)
|
|
117
|
+
agentid.create_agent_profile(json_data)
|
|
118
|
+
select_result = input("拷贝成功,是否同步到接入服务器(Y/N): ")
|
|
119
|
+
if select_result.upper() != "Y":
|
|
120
|
+
print("程序运行结束")
|
|
121
|
+
exit(1)
|
|
122
|
+
result = agentid.sync_public_files()
|
|
123
|
+
if result:
|
|
124
|
+
print("文件同步成功!")
|
|
125
|
+
else:
|
|
126
|
+
print("文件同步失败,请初始化ACP时打开日志查看")
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
# -*- coding:utf-8 -*-
|
|
2
|
+
"""
|
|
3
|
+
基础配置:
|
|
4
|
+
SSE模式接入dify的工作流:输入输出都是字符串(其中输入字符串应该包含:旅行目的地、旅行天数、旅行预算信息)
|
|
5
|
+
https://tse3-mm.cn.bing.net/th/id/OIP-C.Hux_MNYiHtMI5EnBzSIubAAAAA?rs=1&pid=ImgDetMain
|
|
6
|
+
"""
|
|
7
|
+
import agentcp
|
|
8
|
+
import os
|
|
9
|
+
import json
|
|
10
|
+
import requests
|
|
11
|
+
from dotenv import load_dotenv, find_dotenv
|
|
12
|
+
|
|
13
|
+
# 加载并读取环境变量
|
|
14
|
+
load_dotenv(find_dotenv())
|
|
15
|
+
base_url = os.getenv('BASE_URL')
|
|
16
|
+
api_key = os.getenv('API_KEY')
|
|
17
|
+
|
|
18
|
+
def dify_workflow_client(query: str)-> str:
|
|
19
|
+
""" dify工作流客户端"""
|
|
20
|
+
headers = { 'Authorization': f'Bearer {api_key}', 'Content-Type': 'application/json; charset=utf-8'}
|
|
21
|
+
data = json.dumps({'inputs': {'query':query}, 'conversation_id': '', 'user': os.getenv('AID')}, ensure_ascii=False).encode('utf-8')
|
|
22
|
+
response = requests.post(base_url, headers=headers, data=data, stream=False)
|
|
23
|
+
print(f'dify response = {response}')
|
|
24
|
+
if response.status_code != 200:
|
|
25
|
+
return f'请求失败:{response.text}'
|
|
26
|
+
result = json.loads(response.text)['data']['outputs']['text']
|
|
27
|
+
print(f'difyworkflow回复[query = {query}]:response = {result}')
|
|
28
|
+
return result
|
|
29
|
+
|
|
30
|
+
if __name__ == "__main__":
|
|
31
|
+
acp = agentcp.AgentCP(os.path.pardir, seed_password='123456', debug=True)
|
|
32
|
+
print(f"当前acp访问路径:{acp.app_path}\n开始:agentcp版本:{agentcp.__version__},{__file__}")
|
|
33
|
+
aid = acp.load_aid(os.getenv('AID'))
|
|
34
|
+
|
|
35
|
+
@aid.message_handler()
|
|
36
|
+
async def sync_message_handler(msg):
|
|
37
|
+
# 大模型对话
|
|
38
|
+
response = dify_workflow_client(query=aid.get_content_from_message(msg))
|
|
39
|
+
# 消息回复
|
|
40
|
+
aid.send_message_content(aid.get_session_id_from_message(msg), [aid.get_sender_from_message(msg)], response)
|
|
41
|
+
return True
|
|
42
|
+
|
|
43
|
+
# agent上线
|
|
44
|
+
aid.online()
|
|
45
|
+
# 开启永久监听
|
|
46
|
+
acp.serve_forever()
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
# 代码解释器Agent
|
|
2
|
+
|
|
3
|
+
这是一个基于ACP协议的代码解释器Agent,可以python的代码执行。
|
|
4
|
+
|
|
5
|
+
```
|
|
6
|
+
|
|
7
|
+
# 安装依赖
|
|
8
|
+
pip install agentcp RestrictedPython
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
## 使用说明
|
|
12
|
+
|
|
13
|
+
1. 启动Agent:
|
|
14
|
+
|
|
15
|
+
```bash
|
|
16
|
+
# 创建身份
|
|
17
|
+
python create_profile.py
|
|
18
|
+
|
|
19
|
+
# 修改main.py里的 AGENT_NAME 为你创建的身份信息
|
|
20
|
+
python main.py
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
## 功能特性
|
|
24
|
+
|
|
25
|
+
- ✅ 安全的python代码执行
|
|
26
|
+
|
|
27
|
+
```python
|
|
28
|
+
def add(a, b):
|
|
29
|
+
return a + b
|
|
30
|
+
result = add(1, 2)
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
## 调用说明
|
|
34
|
+
|
|
35
|
+
1. 传入参数 `code` 应为合法的Python代码字符串。
|
|
36
|
+
2. 执行代码时,会使用 `RestrictedPython` 进行安全限制,防止执行危险操作。
|
|
37
|
+
3. 代码中的 `print` 输出会被 `PrintCollector` 捕获,但当前方法未返回该输出。
|
|
38
|
+
4. 最终结果需要存储在名为 `result` 的变量中,方法会尝试从执行环境中获取该变量的值并返回。
|
|
39
|
+
5. 代码中可以使用 `import` 进行模块导入,但由于安全性考虑,建议谨慎使用。
|
|
40
|
+
|
|
41
|
+
## 注意事项
|
|
42
|
+
|
|
43
|
+
- 复杂代码执行可能失败
|
|
44
|
+
- 某些代码可能因为没有模块缺失失败
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
{
|
|
2
|
+
"publisherInfo": {
|
|
3
|
+
"publisherAid": "exec1.agentunion.cn",
|
|
4
|
+
"organization": "agentunion.cn",
|
|
5
|
+
"certificationSignature": "agentunion.cn"
|
|
6
|
+
},
|
|
7
|
+
"version": "1.0.0",
|
|
8
|
+
"lastUpdated": "2025-05-08T09:44:33Z",
|
|
9
|
+
"name": "代码执行器",
|
|
10
|
+
"description": "Python代码执行器,支持Python代码的执行和调试。",
|
|
11
|
+
"avaUrl": "https://imgapi.imooc.com/66ebdca0091376a110241024.jpg",
|
|
12
|
+
"capabilities": {
|
|
13
|
+
"core": [
|
|
14
|
+
"Python代码执行"
|
|
15
|
+
],
|
|
16
|
+
"extended": []
|
|
17
|
+
},
|
|
18
|
+
"llm": {
|
|
19
|
+
"model": "qwen-plus",
|
|
20
|
+
"num_parameters": "",
|
|
21
|
+
"quantization_bits": "",
|
|
22
|
+
"context_length": ""
|
|
23
|
+
},
|
|
24
|
+
"references": {
|
|
25
|
+
"knowledgeBases": [
|
|
26
|
+
""
|
|
27
|
+
],
|
|
28
|
+
"tools": [
|
|
29
|
+
""
|
|
30
|
+
],
|
|
31
|
+
"companyInfo": [
|
|
32
|
+
""
|
|
33
|
+
],
|
|
34
|
+
"productInfo": [
|
|
35
|
+
""
|
|
36
|
+
]
|
|
37
|
+
},
|
|
38
|
+
"authorization": {
|
|
39
|
+
"modes": [
|
|
40
|
+
"free"
|
|
41
|
+
],
|
|
42
|
+
"fee": {},
|
|
43
|
+
"description": "",
|
|
44
|
+
"sla": {}
|
|
45
|
+
},
|
|
46
|
+
"input": {
|
|
47
|
+
"types": [
|
|
48
|
+
"content"
|
|
49
|
+
],
|
|
50
|
+
"formats": [
|
|
51
|
+
"json"
|
|
52
|
+
],
|
|
53
|
+
"examples": {
|
|
54
|
+
"type": "content",
|
|
55
|
+
"format": "text",
|
|
56
|
+
"content": ""
|
|
57
|
+
},
|
|
58
|
+
"semantics": [
|
|
59
|
+
""
|
|
60
|
+
],
|
|
61
|
+
"compatibleAids": [
|
|
62
|
+
"*"
|
|
63
|
+
]
|
|
64
|
+
},
|
|
65
|
+
"output": {
|
|
66
|
+
"types": [
|
|
67
|
+
"content"
|
|
68
|
+
],
|
|
69
|
+
"formats": [
|
|
70
|
+
"markdown"
|
|
71
|
+
],
|
|
72
|
+
"examples": {
|
|
73
|
+
"type": "content",
|
|
74
|
+
"format": "markdown",
|
|
75
|
+
"content": ""
|
|
76
|
+
},
|
|
77
|
+
"semantics": [
|
|
78
|
+
""
|
|
79
|
+
],
|
|
80
|
+
"compatibleAids": [
|
|
81
|
+
""
|
|
82
|
+
]
|
|
83
|
+
},
|
|
84
|
+
"supportStream": true,
|
|
85
|
+
"supportAsync": true,
|
|
86
|
+
"permission": [
|
|
87
|
+
"*"
|
|
88
|
+
]
|
|
89
|
+
}
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
# Copyright 2025 ModelUnion Inc.
|
|
2
|
+
#
|
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
4
|
+
# you may not use this file except in compliance with the License.
|
|
5
|
+
# You may obtain a copy of the License at
|
|
6
|
+
#
|
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
8
|
+
#
|
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
12
|
+
# See the License for the specific language governing permissions and
|
|
13
|
+
# limitations under the License.
|
|
14
|
+
|
|
15
|
+
from datetime import datetime, timezone
|
|
16
|
+
import agentcp
|
|
17
|
+
from pathlib import Path # 新增导入
|
|
18
|
+
import json
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
def create_financial_analyzer_json(publisherInfo):
|
|
22
|
+
"""创建智能体能力、权限描述"""
|
|
23
|
+
data = {
|
|
24
|
+
"publisherInfo": publisherInfo,
|
|
25
|
+
"version": "1.0.0",
|
|
26
|
+
"lastUpdated": datetime.now(timezone.utc).strftime("%Y-%m-%dT%H:%M:%SZ"),
|
|
27
|
+
"name": "代码执行器",
|
|
28
|
+
"description": "Python代码执行器,支持Python代码的执行和调试。",
|
|
29
|
+
"avaUrl": "https://imgapi.imooc.com/66ebdca0091376a110241024.jpg",
|
|
30
|
+
"capabilities": {
|
|
31
|
+
"core": ["Python代码执行"],
|
|
32
|
+
"extended": [],
|
|
33
|
+
},
|
|
34
|
+
"llm": {
|
|
35
|
+
"model": "qwen-plus", # 模型名称,或使用aid
|
|
36
|
+
"num_parameters": "", # 模型参数量(如"7B"表示70亿参数)
|
|
37
|
+
"quantization_bits": "", # 量化位数(如Q4表示4位量化)
|
|
38
|
+
"context_length": "", # 上下文长度(如"4096"表示4096个token)
|
|
39
|
+
},
|
|
40
|
+
"references": {
|
|
41
|
+
"knowledgeBases": [""],
|
|
42
|
+
"tools": [""],
|
|
43
|
+
"companyInfo": [""],
|
|
44
|
+
"productInfo": [""],
|
|
45
|
+
},
|
|
46
|
+
"authorization": {
|
|
47
|
+
"modes": ["free"],
|
|
48
|
+
"fee": {},
|
|
49
|
+
"description": "",
|
|
50
|
+
"sla": {},
|
|
51
|
+
},
|
|
52
|
+
"input": {
|
|
53
|
+
"types": ["content"],
|
|
54
|
+
"formats": ["json"], # 详细类型
|
|
55
|
+
"examples": {
|
|
56
|
+
"type": "content",
|
|
57
|
+
"format": "text",
|
|
58
|
+
"content": "",
|
|
59
|
+
},
|
|
60
|
+
"semantics": [""],
|
|
61
|
+
"compatibleAids": ["*"],
|
|
62
|
+
},
|
|
63
|
+
"output": {
|
|
64
|
+
"types": ["content"],
|
|
65
|
+
"formats": ["markdown"],
|
|
66
|
+
"examples": {"type": "content", "format": "markdown", "content": ""},
|
|
67
|
+
"semantics": [""],
|
|
68
|
+
"compatibleAids": [""],
|
|
69
|
+
},
|
|
70
|
+
"supportStream": True, # False代表当前智能体不支持流式输出
|
|
71
|
+
"supportAsync": True,
|
|
72
|
+
"permission": ["*"],
|
|
73
|
+
}
|
|
74
|
+
return data
|
|
75
|
+
|
|
76
|
+
|
|
77
|
+
def write_agent_profile_json(json_data):
|
|
78
|
+
try:
|
|
79
|
+
import os
|
|
80
|
+
|
|
81
|
+
json_path = Path(__file__).resolve()
|
|
82
|
+
json_dir = json_path.parent
|
|
83
|
+
json_file = os.path.join(json_dir, "agentprofile.json")
|
|
84
|
+
with open(json_file, "w", encoding="utf-8") as f:
|
|
85
|
+
json.dump(json_data, f, ensure_ascii=False, indent=2)
|
|
86
|
+
print("智能体描述文件已保存至当前目录下agentprofile.json")
|
|
87
|
+
except Exception as e:
|
|
88
|
+
print(f"文件写入失败: {str(e)}")
|
|
89
|
+
exit(1)
|
|
90
|
+
|
|
91
|
+
|
|
92
|
+
if __name__ == "__main__":
|
|
93
|
+
# 创建JSON数据
|
|
94
|
+
# 将加密种子修改为自己的加密种子,可以是随机字符串,也可以是固定字符串,只要保证一致即可。
|
|
95
|
+
acp = agentcp.AgentCP(".", seed_password="888777", debug=False)
|
|
96
|
+
agentid_list = acp.get_aid_list()
|
|
97
|
+
agentid: agentcp.AgentID = None
|
|
98
|
+
while agentid is None:
|
|
99
|
+
print("请选择一个身份(aid):")
|
|
100
|
+
for i, agentid in enumerate(agentid_list):
|
|
101
|
+
print(f"{i+1}. {agentid}")
|
|
102
|
+
print(f"{len(agentid_list)+1}. 创建一个新的身份(aid)")
|
|
103
|
+
choice = input("请输入数字选择一个身份(aid): ")
|
|
104
|
+
try:
|
|
105
|
+
choice = int(choice) - 1
|
|
106
|
+
if choice < 0 or choice > len(agentid_list):
|
|
107
|
+
raise ValueError
|
|
108
|
+
if choice == len(agentid_list):
|
|
109
|
+
aid = input("请输入名称: ")
|
|
110
|
+
agentid = acp.create_aid("agentunion.cn", aid)
|
|
111
|
+
if agentid is None:
|
|
112
|
+
print("创建身份(aid)失败,请打开日志查看原因")
|
|
113
|
+
exit(1)
|
|
114
|
+
agentid_list = acp.get_aid_list()
|
|
115
|
+
else:
|
|
116
|
+
agentid = acp.load_aid(agentid_list[choice])
|
|
117
|
+
if agentid is None:
|
|
118
|
+
print("加载身份(aid)失败,请打开日志查看原因")
|
|
119
|
+
exit(1)
|
|
120
|
+
except ValueError:
|
|
121
|
+
print("无效的选择,请重新输入。")
|
|
122
|
+
print(f"当前选择的身份(aid)是: {str(agentid)}")
|
|
123
|
+
agentid.init_ap_client()
|
|
124
|
+
json_data = create_financial_analyzer_json(agentid.get_publisher_info())
|
|
125
|
+
write_agent_profile_json(json_data)
|
|
126
|
+
select_result = input("是否将文件拷贝到agent公有数据目录下(Y/N): ")
|
|
127
|
+
if select_result.upper() != "Y":
|
|
128
|
+
print("程序运行结束")
|
|
129
|
+
exit(1)
|
|
130
|
+
agentid.create_agent_profile(json_data)
|
|
131
|
+
select_result = input("拷贝成功,是否同步到接入服务器(Y/N): ")
|
|
132
|
+
if select_result.upper() != "Y":
|
|
133
|
+
print("程序运行结束")
|
|
134
|
+
exit(1)
|
|
135
|
+
result = agentid.sync_public_files()
|
|
136
|
+
if result:
|
|
137
|
+
print("文件同步成功!")
|
|
138
|
+
else:
|
|
139
|
+
print("文件同步失败,请初始化ACP时打开日志查看")
|
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
# Copyright 2025 ModelUnion Inc.
|
|
2
|
+
#
|
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
4
|
+
# you may not use this file except in compliance with the License.
|
|
5
|
+
# You may obtain a copy of the License at
|
|
6
|
+
#
|
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
8
|
+
#
|
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
12
|
+
# See the License for the specific language governing permissions and
|
|
13
|
+
# limitations under the License.
|
|
14
|
+
|
|
15
|
+
from agentcp import AgentCP
|
|
16
|
+
import asyncio
|
|
17
|
+
import json
|
|
18
|
+
from RestrictedPython import compile_restricted
|
|
19
|
+
from RestrictedPython.Guards import safe_builtins, guarded_unpack_sequence
|
|
20
|
+
|
|
21
|
+
class PrintCollector:
|
|
22
|
+
"""Collect written text, and return it when called."""
|
|
23
|
+
|
|
24
|
+
def __init__(self, _getattr_=None):
|
|
25
|
+
self.txt = []
|
|
26
|
+
self._getattr_ = _getattr_
|
|
27
|
+
|
|
28
|
+
def write(self, text):
|
|
29
|
+
self.txt.append(text)
|
|
30
|
+
|
|
31
|
+
def __call__(self, *args, **kwargs):
|
|
32
|
+
return self
|
|
33
|
+
|
|
34
|
+
def _call_print(self, *objects, **kwargs):
|
|
35
|
+
if kwargs.get("file", None) is None:
|
|
36
|
+
kwargs["file"] = self
|
|
37
|
+
else:
|
|
38
|
+
self._getattr_(kwargs["file"], "write")
|
|
39
|
+
|
|
40
|
+
print(*objects, **kwargs)
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
class PythonExecutorAgent:
|
|
44
|
+
def __init__(self, endpoint: str, name: str):
|
|
45
|
+
self.acp = AgentCP("./", seed_password="888777")
|
|
46
|
+
self.endpoint = endpoint
|
|
47
|
+
self.name = name
|
|
48
|
+
self.aid = None
|
|
49
|
+
|
|
50
|
+
async def message_handler(self, msg):
|
|
51
|
+
"""
|
|
52
|
+
消息处理器 - 执行Python代码并返回结果
|
|
53
|
+
"""
|
|
54
|
+
try:
|
|
55
|
+
ref_msg_id = msg.get("ref_msg_id")
|
|
56
|
+
content = msg.get("message", '"{}"')
|
|
57
|
+
content = json.loads(content)[0]["content"]
|
|
58
|
+
content = json.loads(content)
|
|
59
|
+
text = content.get("text", "")
|
|
60
|
+
if not text.strip():
|
|
61
|
+
await self._send_reply(msg, "请输入要执行的Python代码")
|
|
62
|
+
return True
|
|
63
|
+
|
|
64
|
+
try:
|
|
65
|
+
# 安全地执行代码
|
|
66
|
+
result = await self.safe_exec(text)
|
|
67
|
+
print(f"执行结果: {result}")
|
|
68
|
+
await self._send_reply(msg, f"执行结果:<br>{result}")
|
|
69
|
+
except Exception as e:
|
|
70
|
+
print(f"执行代码出错: {str(e)}")
|
|
71
|
+
await self._send_reply(msg, f"执行出错:<br> {str(e)}")
|
|
72
|
+
|
|
73
|
+
return True
|
|
74
|
+
|
|
75
|
+
except Exception as e:
|
|
76
|
+
print(f"处理消息出错: {str(e)}")
|
|
77
|
+
await self._send_reply(msg, f"处理代码时出错:<br> {str(e)}")
|
|
78
|
+
return False
|
|
79
|
+
|
|
80
|
+
async def _send_reply(self, original_msg, content: str):
|
|
81
|
+
"""
|
|
82
|
+
发送回复消息
|
|
83
|
+
"""
|
|
84
|
+
try:
|
|
85
|
+
self.aid.send_message_content(
|
|
86
|
+
to_aid_list=[original_msg.get("sender")],
|
|
87
|
+
session_id=original_msg.get("session_id"),
|
|
88
|
+
llm_content=content,
|
|
89
|
+
)
|
|
90
|
+
except Exception as e:
|
|
91
|
+
print(f"发送回复消息出错: {str(e)}")
|
|
92
|
+
async def safe_exec(self, code: str):
|
|
93
|
+
"""
|
|
94
|
+
安全地执行Python代码
|
|
95
|
+
|
|
96
|
+
调用说明:
|
|
97
|
+
1. 传入参数 `code` 应为合法的Python代码字符串。
|
|
98
|
+
2. 执行代码时,会使用 `RestrictedPython` 进行安全限制,防止执行危险操作。
|
|
99
|
+
3. 代码中的 `print` 输出会被 `PrintCollector` 捕获,但当前方法未返回该输出。
|
|
100
|
+
4. 最终结果需要存储在名为 `result` 的变量中,方法会尝试从执行环境中获取该变量的值并返回。
|
|
101
|
+
5. 代码中可以使用 `import` 进行模块导入,但由于安全性考虑,建议谨慎使用。
|
|
102
|
+
|
|
103
|
+
参数:
|
|
104
|
+
code (str): 要安全执行的Python代码字符串。
|
|
105
|
+
|
|
106
|
+
返回:
|
|
107
|
+
Any: 执行代码中 `result` 变量的值,如果不存在则返回 `None`。
|
|
108
|
+
"""
|
|
109
|
+
safe_builtins.update(
|
|
110
|
+
{
|
|
111
|
+
"__import__": __import__,
|
|
112
|
+
}
|
|
113
|
+
)
|
|
114
|
+
|
|
115
|
+
policy_globals = {
|
|
116
|
+
"__builtins__": safe_builtins,
|
|
117
|
+
"_print_": PrintCollector(), # 用于捕获print输出
|
|
118
|
+
"_getattr_": getattr,
|
|
119
|
+
"_getiter_": iter,
|
|
120
|
+
"_getitem_": lambda obj, index: obj[index],
|
|
121
|
+
"_iter_unpack_sequence_": guarded_unpack_sequence, # 支持多变量赋值
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
byte_code = compile_restricted(code, filename="<inline>", mode="exec")
|
|
125
|
+
exec(byte_code, policy_globals)
|
|
126
|
+
# 查看print输出
|
|
127
|
+
# output = policy_globals["_print_"]()
|
|
128
|
+
# print(f"沙箱输出结果:\n{output.txt}")
|
|
129
|
+
# 获取结果, 最终结果返回必须是变量result
|
|
130
|
+
result = policy_globals.get("result")
|
|
131
|
+
print("Captured result:", result)
|
|
132
|
+
return result
|
|
133
|
+
|
|
134
|
+
async def run(self):
|
|
135
|
+
"""运行Agent"""
|
|
136
|
+
try:
|
|
137
|
+
self.aid = self.acp.create_aid(self.endpoint, self.name)
|
|
138
|
+
self.aid.add_message_handler(self.message_handler)
|
|
139
|
+
self.aid.online()
|
|
140
|
+
print("Python执行器Agent已上线,等待代码执行指令...")
|
|
141
|
+
|
|
142
|
+
while True:
|
|
143
|
+
await asyncio.sleep(1)
|
|
144
|
+
|
|
145
|
+
except Exception as e:
|
|
146
|
+
print(f"发生错误: {str(e)}")
|
|
147
|
+
finally:
|
|
148
|
+
if self.aid:
|
|
149
|
+
self.aid.offline()
|
|
150
|
+
print("Agent已下线")
|
|
151
|
+
|
|
152
|
+
|
|
153
|
+
if __name__ == "__main__":
|
|
154
|
+
# 配置参数
|
|
155
|
+
ENDPOINT = "agentunion.cn"
|
|
156
|
+
AGENT_NAME = "exec1" # 请使用真实的aid
|
|
157
|
+
|
|
158
|
+
# 创建并运行Agent
|
|
159
|
+
agent = PythonExecutorAgent(ENDPOINT, AGENT_NAME)
|
|
160
|
+
asyncio.run(agent.run())
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
# 文件操作Agent
|
|
2
|
+
|
|
3
|
+
这是一个基于ACP协议的文件操作Agent,可以实现文件读取和查询功能。
|
|
4
|
+
|
|
5
|
+
```
|
|
6
|
+
|
|
7
|
+
# 安装依赖
|
|
8
|
+
pip install agentcp
|
|
9
|
+
|
|
10
|
+
```
|
|
11
|
+
|
|
12
|
+
## 功能特性
|
|
13
|
+
|
|
14
|
+
- ✅ 安全的文件读取
|
|
15
|
+
- 🔄 支持文本文件内容检查
|
|
16
|
+
- 📂 支持遍历目录查看文件列表
|
|
17
|
+
- 🤖 交互式消息处理
|
|
18
|
+
|
|
19
|
+
## 使用说明
|
|
20
|
+
|
|
21
|
+
1. 启动Agent:
|
|
22
|
+
|
|
23
|
+
```bash
|
|
24
|
+
# 创建身份
|
|
25
|
+
python create_profile.py
|
|
26
|
+
|
|
27
|
+
# 修改main.py里的 AGENT_NAME 为你创建的身份信息
|
|
28
|
+
python main.py
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
## 交互说明
|
|
33
|
+
|
|
34
|
+
发送指令格式:
|
|
35
|
+
|
|
36
|
+
- 查询文件列表: "查询文件" 或 "列表"
|
|
37
|
+
- 读取文件内容: "读取文件" 或 "查看文件" (会进入交互模式, 只需输入文件名即可)
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
## 注意事项
|
|
42
|
+
|
|
43
|
+
- 文件操作限制在沙箱目录内(AgentID的公有数据目录)
|
|
44
|
+
- 只能操作文本文件
|
|
45
|
+
|