fix(tools): fix OpenClaw connection test and multimodal format compatibility
- Use safe .get() for server URL to avoid KeyError - Support both api_key and token in connection test auth - Add OpenAI/Volcano image format (image_url) support - Add aiohttp import in _test_openclaw_connection
This commit is contained in:
@@ -220,7 +220,9 @@ class CustomTool(BaseTool):
|
|||||||
image_url = None
|
image_url = None
|
||||||
if self._uploaded_files:
|
if self._uploaded_files:
|
||||||
for f in self._uploaded_files:
|
for f in self._uploaded_files:
|
||||||
if f.get("type") == "image":
|
f_type = f.get("type", "")
|
||||||
|
if f_type == "image":
|
||||||
|
# Bedrock/Anthropic 格式:{"type": "image", "source": {"type": "base64", ...}}
|
||||||
source = f.get("source", {})
|
source = f.get("source", {})
|
||||||
if source.get("type") == "base64":
|
if source.get("type") == "base64":
|
||||||
media_type = source.get("media_type", "image/jpeg")
|
media_type = source.get("media_type", "image/jpeg")
|
||||||
@@ -232,7 +234,11 @@ class CustomTool(BaseTool):
|
|||||||
elif f.get("url"):
|
elif f.get("url"):
|
||||||
# 其他格式:{"type": "image", "url": "https://..."}
|
# 其他格式:{"type": "image", "url": "https://..."}
|
||||||
image_url = f.get("url")
|
image_url = f.get("url")
|
||||||
break # 只取第一张图片
|
break
|
||||||
|
elif f_type == "image_url":
|
||||||
|
# OpenAI/Volcano 格式:{"type": "image_url", "image_url": {"url": "..."}}
|
||||||
|
image_url = f.get("image_url", {}).get("url", "")
|
||||||
|
break
|
||||||
|
|
||||||
# 如果 image_url 是服务器中转 URL,直接下载图片转 base64
|
# 如果 image_url 是服务器中转 URL,直接下载图片转 base64
|
||||||
# 避免 OSS 签名 URL 在重定向解析过程中被破坏
|
# 避免 OSS 签名 URL 在重定向解析过程中被破坏
|
||||||
|
|||||||
@@ -642,7 +642,6 @@ class AgentRunService:
|
|||||||
logger.info(f"处理了 {len(processed_files)} 个文件,provider={provider}")
|
logger.info(f"处理了 {len(processed_files)} 个文件,provider={provider}")
|
||||||
#================= 为 OpenClaw 工具注入运行时上下文==========
|
#================= 为 OpenClaw 工具注入运行时上下文==========
|
||||||
for t in tools:
|
for t in tools:
|
||||||
logger.info(f"检查工具: {type(t).__name__}, has_tool_instance={hasattr(t, 'tool_instance')}, is_openclaw={getattr(getattr(t, 'tool_instance', None), '_is_openclaw', 'N/A')}")
|
|
||||||
if hasattr(t, 'tool_instance') and hasattr(t.tool_instance, '_is_openclaw'):
|
if hasattr(t, 'tool_instance') and hasattr(t.tool_instance, '_is_openclaw'):
|
||||||
if t.tool_instance._is_openclaw:
|
if t.tool_instance._is_openclaw:
|
||||||
t.tool_instance._user_id = user_id or "anonymous"
|
t.tool_instance._user_id = user_id or "anonymous"
|
||||||
|
|||||||
@@ -358,11 +358,15 @@ class ToolService:
|
|||||||
self, custom_config: CustomToolConfig, schema: dict
|
self, custom_config: CustomToolConfig, schema: dict
|
||||||
) -> Dict[str, Any]:
|
) -> Dict[str, Any]:
|
||||||
"""测试 OpenClaw 连接"""
|
"""测试 OpenClaw 连接"""
|
||||||
|
import aiohttp
|
||||||
try:
|
try:
|
||||||
info = schema.get("info", {})
|
info = schema.get("info", {})
|
||||||
servers = schema.get("servers", [])
|
servers = schema.get("servers", [])
|
||||||
base_url = servers[0]["url"] if servers else ""
|
base_url = servers[0].get("url", "") if servers else ""
|
||||||
token = (custom_config.auth_config or {}).get("token", "")
|
if not base_url:
|
||||||
|
return {"success": False, "message": "OpenClaw 未配置 server URL"}
|
||||||
|
auth = custom_config.auth_config or {}
|
||||||
|
token = auth.get("api_key") or auth.get("token") or ""
|
||||||
agent_id = info.get("x-openclaw-agent-id", "main")
|
agent_id = info.get("x-openclaw-agent-id", "main")
|
||||||
model = info.get("x-openclaw-default-model", "openclaw")
|
model = info.get("x-openclaw-default-model", "openclaw")
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user