Merge pull request #3001 from pipecat-ai/pk/openai-realtime-toolsschema-support
Added support for passing in a `ToolsSchema` in lieu of a list of pro…
This commit is contained in:
@@ -12,6 +12,8 @@ from typing import Any, Dict, List, Literal, Optional, Union
|
||||
|
||||
from pydantic import BaseModel, ConfigDict, Field
|
||||
|
||||
from pipecat.adapters.schemas.tools_schema import ToolsSchema
|
||||
|
||||
#
|
||||
# session properties
|
||||
#
|
||||
@@ -184,6 +186,9 @@ class SessionProperties(BaseModel):
|
||||
include: Additional fields to include in server outputs.
|
||||
"""
|
||||
|
||||
# Needed to support ToolSchema in tools field.
|
||||
model_config = ConfigDict(arbitrary_types_allowed=True)
|
||||
|
||||
type: Optional[Literal["realtime"]] = "realtime"
|
||||
object: Optional[Literal["realtime.session"]] = None
|
||||
id: Optional[str] = None
|
||||
@@ -191,7 +196,10 @@ class SessionProperties(BaseModel):
|
||||
output_modalities: Optional[List[Literal["text", "audio"]]] = None
|
||||
instructions: Optional[str] = None
|
||||
audio: Optional[AudioConfiguration] = None
|
||||
tools: Optional[List[Dict]] = None
|
||||
# Tools can only be ToolsSchema when provided by the user, in either the
|
||||
# OpenAIRealtimeLLMService constructor or through LLMUpdateSettingsFrame.
|
||||
# We'll never serialize/deserialize ToolsSchema when talking to the server.
|
||||
tools: Optional[ToolsSchema | List[Dict]] = None
|
||||
tool_choice: Optional[Literal["auto", "none", "required"]] = None
|
||||
max_output_tokens: Optional[Union[int, Literal["inf"]]] = None
|
||||
tracing: Optional[Union[Literal["auto"], Dict]] = None
|
||||
|
||||
@@ -14,6 +14,7 @@ from typing import Optional
|
||||
|
||||
from loguru import logger
|
||||
|
||||
from pipecat.adapters.schemas.tools_schema import ToolsSchema
|
||||
from pipecat.adapters.services.open_ai_realtime_adapter import (
|
||||
OpenAIRealtimeLLMAdapter,
|
||||
)
|
||||
@@ -481,9 +482,9 @@ class OpenAIRealtimeLLMService(LLMService):
|
||||
|
||||
async def _update_settings(self):
|
||||
settings = self._session_properties
|
||||
adapter: OpenAIRealtimeLLMAdapter = self.get_llm_adapter()
|
||||
|
||||
if self._context:
|
||||
adapter: OpenAIRealtimeLLMAdapter = self.get_llm_adapter()
|
||||
llm_invocation_params = adapter.get_llm_invocation_params(self._context)
|
||||
|
||||
# tools given in the context override the tools in the session properties
|
||||
@@ -495,6 +496,12 @@ class OpenAIRealtimeLLMService(LLMService):
|
||||
if llm_invocation_params["system_instruction"]:
|
||||
settings.instructions = llm_invocation_params["system_instruction"]
|
||||
|
||||
# If needed, map settings.tools from ToolsSchema to list of dicts,
|
||||
# which remote server expects. It would only be a ToolsSchema if that's
|
||||
# how it was provided in the constructor or via LLMUpdateSettingsFrame.
|
||||
if settings.tools and isinstance(settings.tools, ToolsSchema):
|
||||
settings.tools = adapter.from_standard_tools(settings.tools)
|
||||
|
||||
await self.send_client_event(events.SessionUpdateEvent(session=settings))
|
||||
|
||||
#
|
||||
|
||||
Reference in New Issue
Block a user