python
(.venv) PS E:\code\my_python_server> e:; cd 'e:\code\my_python_server'; & 'e:\code\my_python_server\.venv\Scripts\python.exe' 'c:\Users\njsgcs\.lingma\extensions\ms-python.debugpy-2025.19.2026021801-win32-x64\bundled\libs\debugpy\launcher' '58350' '--' 'E:\code\my_python_server\start.py'
2026-02-21 22:57:58,751 | INFO | _toolkit:register_agent_skill:1104 - Registered agent skill 'web_skill' from directory 'skills\web_skill'.
2026-02-21 22:57:58,752 | INFO | _toolkit:register_agent_skill:1104 - Registered agent skill 'ue_skill' from directory 'skills\ue_skill'.
2026-02-21 22:57:58,752 | INFO | _toolkit:register_agent_skill:1104 - Registered agent skill 'blender_skill' from directory 'skills\blender_skill'.
# Agent Skills
The agent skills are a collection of folds of instructions, scripts, and resources that you can load dynamically to improve performance on specialized tasks. Each agent skill has a `SKILL.md` file in its folder that describes how to use the skill. If you want to use a skill, you MUST read its `SKILL.md` file carefully.
## web_skill
功能:打开网页,OCR识别,点击操作,滚动操作,YOLO检测,检查下载栏
Check "skills\web_skill/SKILL.md" for how to use this skill
## ue_skill
打开ue,导入FBX模型,构建Sifu MOD
Check "skills\ue_skill/SKILL.md" for how to use this skill
## blender_skill
打开Blender窗口,清理场景,导入psk,pmx模型,
Check "skills\blender_skill/SKILL.md" for how to use this skill
* Serving Flask app 'share_config.flask_server'
* Debug mode: off
INFO:werkzeug:WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead.
* Running on all addresses (0.0.0.0)
* Running on http://127.0.0.1:5001
* Running on http://192.168.1.8:5001
INFO:werkzeug:Press CTRL+C to quit
打开blender
INFO:httpx:HTTP Request: POST http://127.0.0.1:11434/api/chat "HTTP/1.1 200 OK"
杜野凛世: {
"type": "tool_use",
"id": "0_view_text_file",
"name": "view_text_file",
"input": {
"file_path": "skills\\blender_skill\\SKILL.md"
},
"raw_input": "{\"file_path\": \"skills\\\\blender_skill\\\\SKILL.md\"}"
}
system: {
"type": "tool_result",
"id": "0_view_text_file",
"name": "view_text_file",
"output": [
{
"type": "text",
"text": "The content of skills\\blender_skill\\SKILL.md:\n```\n1: ---\n2: name: blender_skill\n3: description: 打开Blender窗口,清理场景,导入psk,pmx模型,\n4: \n5: \n6: \n7: \n8: ---\n9: \n10: \n11: \n12: \n13: ## 详细功能\n14: \n15: - **打开Blender窗口**\n16: - **工具**: start_blender\n17: - **CLI调用**: `python skills/blender_skill/scripts/blender_start.py`\n18: - **操作**: 打开start blender\n19: \n20: - **清理场景**\n21: - **工具**: delete_all_objects\n22: - **CLI调用**: `python skills/blender_skill/scripts/delete_all_objects.py`\n23: - **操作**: 清空当前Blender场景中的所有物体\n24: \n25: - **导入PMX模型**\n26: - **工具**: import_pmx\n27: - **CLI调用**: `python skills/blender_skill/scripts/import_pmx.py`\n28: - **操作**: 导入PMX格式的3D模型文件,不需要参数\n29: \n30: \n31: \n32: - **导入PSK模型**\n33: - **工具**: import_psk\n34: - **CLI调 用**: `python skills/blender_skill/scripts/import_psk.py`\n35: - **操作**: 导入PSK格式的3D模型文件,不需要参数\n36: \n37: \n38: \n39: \n40: \n41: \n42: \n```"
}
]
}
INFO:httpx:HTTP Request: POST http://127.0.0.1:11434/api/chat "HTTP/1.1 200 OK"
杜野凛世: {
"type": "tool_use",
"id": "0_execute_shell_command",
"name": "execute_shell_command",
"input": {
"command": "python skills/blender_skill/scripts/blender_start.py"
},
"raw_input": "{\"command\": \"python skills/blender_skill/scripts/blender_start.py\"}"
}
system: {
"type": "tool_result",
"id": "0_execute_shell_command",
"name": "execute_shell_command",
"output": [
{
"type": "text",
"text": "<returncode>0</returncode><stdout>Blender启动指令已发送\r\n</stdout><stderr></stderr>"
}
]
}
INFO:httpx:HTTP Request: POST http://127.0.0.1:11434/api/chat "HTTP/1.1 200 OK"
杜野凛世: Blender 已经启动。另外,提醒您记得学习数学。
prompt:
在使用任何技能前,请先用view_text_file方法读取对应技能目录下的 SKILL.md 文件,并严格按照说明用execute_shell_command操作。
python
"""
负责定义agent
"""
import sys
import os
import logging
from llm_cline import langchain_chat_llm
sys.path.append(os.getcwd())
import time
from datetime import datetime
from agentscope.message import Msg, TextBlock, ImageBlock, Base64Source
from agentscope import agent, formatter, memory, tool
from agentscope.memory import InMemoryMemory
from agentscope.memory._long_term_memory._mem0._mem0_utils import _run_async_in_persistent_loop
from share_config.api_key import sys_prompt
from agent_scope.model import ollama_model_llm
from agentscope.tool import execute_shell_command, execute_python_code, view_text_file
# 配置日志
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)
toolkit = tool.Toolkit()
toolkit.register_tool_function(execute_shell_command)
toolkit.register_tool_function(execute_python_code)
toolkit.register_tool_function(view_text_file)
toolkit.register_agent_skill("skills\\web_skill")
toolkit.register_agent_skill("skills\\ue_skill")
toolkit.register_agent_skill("skills\\blender_skill")
sys_prompt = """
在使用任何技能前,请先用view_text_file方法读取对应技能目录下的 SKILL.md 文件,并严格按照说明用execute_shell_command操作。
"""
llm_agent = agent.ReActAgent(
name="杜野凛世",
sys_prompt=sys_prompt,
model=ollama_model_llm,
toolkit=toolkit,
print_hint_msg=True, # 启用提示信息打印
formatter=formatter.OllamaChatFormatter(),
)
def print_tool_results(response_msg):
"""打印工具执行结果"""
if hasattr(response_msg, 'content'):
for block in response_msg.content:
# 修复:检查 type 字段而不是使用 isinstance
if isinstance(block, dict) and block.get("type") == "tool_result":
tool_name = block.get("name", "Unknown")
result = block.get("output", "")
logger.info(f"🔧 工具调用结果 [{tool_name}]: {result}")
def llm_chat(user_input):
"""与视觉AI代理进行对话,获取屏幕描述和思考内容(使用持久化事件循环)"""
llm_content = f"{user_input}"
msg = Msg(
name="User",
content=[
TextBlock(type="text", text=llm_content)
],
role="user",
)
# 使用AgentScope的持久化事件循环管理器
response_msg = _run_async_in_persistent_loop(llm_agent(msg))
# 打印工具执行结果
print_tool_results(response_msg)
# 合并所有内容为一个字符串
screen_description = response_msg.get_text_content()
# 确保screen_description不为None
if screen_description is None:
screen_description = ""
# 从metadata获取思考内容(如果有的话)
thinking = ""
if hasattr(response_msg, 'metadata') and response_msg.metadata:
thinking = response_msg.metadata.get( 'thinking', '')
combined_content = ""
if thinking:
combined_content += f"\n[思考内容]: {thinking}"
combined_content += screen_description
return combined_content