Skip to content
22 changes: 22 additions & 0 deletions astrbot/core/agent/tool.py
Original file line number Diff line number Diff line change
Expand Up @@ -217,6 +217,28 @@ def openai_schema(self, omit_empty_parameter_field: bool = False) -> list[dict]:
result.append(func_def)
return result

def openai_responses_schema(
self, omit_empty_parameter_field: bool = False
) -> list[dict]:
"""Convert tools to OpenAI Responses API schema format.

Note: Responses API expects top-level `name` instead of nested `function.name`.
"""
result = []
for tool_def in self.openai_schema(
omit_empty_parameter_field=omit_empty_parameter_field
):
func_def = tool_def.get("function", {})
if not func_def:
continue
converted = {"type": "function", "name": func_def.get("name", "")}
if func_def.get("description"):
converted["description"] = func_def["description"]
if func_def.get("parameters") is not None:
converted["parameters"] = func_def["parameters"]
result.append(converted)
return result

def anthropic_schema(self) -> list[dict]:
"""Convert tools to Anthropic API format."""
result = []
Expand Down
12 changes: 12 additions & 0 deletions astrbot/core/config/default.py
Original file line number Diff line number Diff line change
Expand Up @@ -1134,6 +1134,18 @@ class ChatProviderTemplate(TypedDict):
"proxy": "",
"custom_headers": {},
},
"OpenAI Responses": {
"id": "openai_responses",
"provider": "openai",
"type": "openai_responses",
"provider_type": "chat_completion",
"enable": True,
"key": [],
"api_base": "https://api.openai.com/v1",
"timeout": 120,
"proxy": "",
"custom_headers": {},
},
"Google Gemini": {
"id": "google_gemini",
"provider": "google",
Expand Down
4 changes: 4 additions & 0 deletions astrbot/core/provider/manager.py
Original file line number Diff line number Diff line change
Expand Up @@ -357,6 +357,10 @@ def dynamic_import_provider(self, type: str) -> None:
from .sources.openai_source import (
ProviderOpenAIOfficial as ProviderOpenAIOfficial,
)
case "openai_responses":
from .sources.openai_responses_source import (
ProviderOpenAIResponses as ProviderOpenAIResponses,
)
case "zhipu_chat_completion":
from .sources.zhipu_source import ProviderZhipu as ProviderZhipu
case "groq_chat_completion":
Expand Down
Loading