add
测试mcp基座
This commit is contained in:
1 parent
c0966ad334
commit
1afcc10a61
6 files changed
+489
-96
No files matched your search
@@ -0,0 +1,127 @@
|
||||
import socket
|
||||
import json
|
||||
from openai import OpenAI
|
||||
|
||||
# 1. 初始化 DeepSeek 客户端
|
||||
# 注意:务必确保已经执行过 pip install openai
|
||||
client = OpenAI(
|
||||
api_key="sk-420190f448fe41158c4e2ccff90e35ce",
|
||||
base_url="https://api.deepseek.com" # 核心修改:将网关指向 DeepSeek 服务器
|
||||
)
|
||||
|
||||
# 核心修改:使用 DeepSeek 的主模型。
|
||||
# (注: DeepSeek-V4/V4.1 的视觉支持已集成,具体模型名请以你 DeepSeek 后台显示的可用模型为准)
|
||||
MODEL_NAME = "deepseek-flash"
|
||||
|
||||
def call_cad_mcp_server(tool_name, arguments):
|
||||
"""封装与 AutoCAD MCP 基座的 TCP 通信"""
|
||||
try:
|
||||
cad_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
|
||||
cad_socket.connect(("127.0.0.1", 8080))
|
||||
|
||||
req = {
|
||||
"jsonrpc": "2.0",
|
||||
"id": 1,
|
||||
"method": "tools/call",
|
||||
"params": {
|
||||
"name": tool_name,
|
||||
"arguments": arguments
|
||||
}
|
||||
}
|
||||
cad_socket.sendall(json.dumps(req).encode('utf-8'))
|
||||
|
||||
response_data = b""
|
||||
while True:
|
||||
chunk = cad_socket.recv(8192)
|
||||
response_data += chunk
|
||||
if len(chunk) < 8192:
|
||||
break
|
||||
|
||||
cad_socket.close()
|
||||
return json.loads(response_data.decode('utf-8'))
|
||||
except Exception as e:
|
||||
print(f"[Error] 连接 CAD 基座失败: {e}")
|
||||
return None
|
||||
|
||||
def main():
|
||||
print("=== DeepSeek CAD Vision Agent 启动 ===")
|
||||
|
||||
# 2. 定义 MCP 工具 (Tool Calling)
|
||||
tools = [
|
||||
{
|
||||
"type": "function",
|
||||
"function": {
|
||||
"name": "get_viewport_screenshot",
|
||||
"description": "获取当前 AutoCAD 视口的实时截图。当用户询问图纸上的视觉特征、数量或位置时,必须先调用此工具获取画面。"
|
||||
}
|
||||
}
|
||||
]
|
||||
|
||||
# 3. 初始化历史
|
||||
messages = [
|
||||
{"role": "system", "content": "你是一个专业的 AutoCAD 视觉审查助手。必须先使用截图工具观察图纸,再回答用户问题。"},
|
||||
{"role": "user", "content": "请看看当前 CAD 屏幕上,我一共画了几个圆?"}
|
||||
]
|
||||
|
||||
print("\n[DeepSeek] 正在思考如何完成任务...")
|
||||
|
||||
# === 第一回合:DeepSeek 思考并决定调用工具 ===
|
||||
response = client.chat.completions.create(
|
||||
model=MODEL_NAME,
|
||||
messages=messages,
|
||||
tools=tools
|
||||
)
|
||||
|
||||
assistant_message = response.choices[0].message
|
||||
messages.append(assistant_message)
|
||||
|
||||
# 检查 DeepSeek 是否发起了 Tool Call
|
||||
if assistant_message.tool_calls:
|
||||
tool_call = assistant_message.tool_calls[0]
|
||||
tool_name = tool_call.function.name
|
||||
|
||||
print(f"[DeepSeek] 决定调用 CAD 工具: {tool_name}")
|
||||
print(f"[CAD] 正在执行截图,请稍候...")
|
||||
|
||||
# === 与 CAD 基座通信 ===
|
||||
cad_res = call_cad_mcp_server(tool_name, {})
|
||||
|
||||
if cad_res and "result" in cad_res:
|
||||
content_array = cad_res["result"]["content"]
|
||||
base64_img = ""
|
||||
mime_type = "image/png"
|
||||
for item in content_array:
|
||||
if item["type"] == "image":
|
||||
base64_img = item["data"]
|
||||
mime_type = item.get("mimeType", "image/png")
|
||||
|
||||
print("[CAD] 截图成功!正在将视觉数据传回大模型神经中枢...")
|
||||
|
||||
# 4. 将 Base64 图片按标准多模态格式塞回历史
|
||||
messages.append({
|
||||
"role": "tool",
|
||||
"tool_call_id": tool_call.id,
|
||||
"content": [
|
||||
{"type": "text", "text": "这是 AutoCAD 当前界面的实时截图。请根据图片回答用户的问题。"},
|
||||
{"type": "image_url", "image_url": {"url": f"data:{mime_type};base64,{base64_img}"}}
|
||||
]
|
||||
})
|
||||
|
||||
# === 第二回合:DeepSeek “看”图并回答 ===
|
||||
print("[DeepSeek] 正在进行视觉分析...")
|
||||
final_response = client.chat.completions.create(
|
||||
model=MODEL_NAME,
|
||||
messages=messages
|
||||
)
|
||||
|
||||
print("\n==================================")
|
||||
print(f"[DeepSeek 最终回答]:\n{final_response.choices[0].message.content}")
|
||||
print("==================================")
|
||||
|
||||
else:
|
||||
print("[Error] CAD 工具执行失败。")
|
||||
else:
|
||||
print(f"[DeepSeek 盲猜]: {assistant_message.content}")
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
Reference in new issue
Block a user