""" OpenAI Chat Completions Agent Proxy Uses the OpenAI SDK to communicate with chat completion models. Maintains conversation history in session context for multi-turn dialogue. Configuration: agent_proxy: type: openai api_key: "${OPENAI_API_KEY}" # or set OPENAI_API_KEY env var model: "gpt-4o" system_prompt: "You are a helpful travel agent." temperature: 0.7 max_tokens: 1024 """ import logging import os from .base import BaseAgentProxy, AgentMessage, AgentResponse, AgentProxyFactory logger = logging.getLogger(__name__) class OpenAIChatProxy(BaseAgentProxy): """OpenAI Chat Completions proxy.""" proxy_type = "openai" def _initialize(self): api_key = self.config.get("api_key", "") # Support environment variable references like ${OPENAI_API_KEY} if api_key.startswith("${") and api_key.endswith("}"): env_var = api_key[2:-1] api_key = os.environ.get(env_var, "") if not api_key: api_key = os.environ.get("OPENAI_API_KEY", "") if not api_key: raise ValueError( "OpenAI proxy requires api_key in config or OPENAI_API_KEY env var" ) try: import openai self.client = openai.OpenAI(api_key=api_key) except ImportError: raise ImportError( "openai package is required for the OpenAI proxy. " "Install with: pip install openai" ) self.model = self.config.get("model", "gpt-4o") self.system_prompt = self.config.get("system_prompt", "") self.temperature = self.config.get("temperature", 0.7) self.max_tokens = self.config.get("max_tokens", 1024) self.timeout = self.config.get("sandbox", {}).get( "request_timeout_seconds", 60 ) def start_session(self, task_description: str) -> dict: messages = [] if self.system_prompt: messages.append({"role": "system", "content": self.system_prompt}) # Include task description as system context messages.append({ "role": "system", "content": f"The user's task: {task_description}", }) return {"messages": messages} def send_message(self, message: str, session_context: dict) -> AgentResponse: messages = session_context.get("messages", []) messages.append({"role": "user", "content": message}) try: response = self.client.chat.completions.create( model=self.model, messages=messages, temperature=self.temperature, max_tokens=self.max_tokens, timeout=self.timeout, ) content = response.choices[0].message.content or "" messages.append({"role": "assistant", "content": content}) session_context["messages"] = messages return AgentResponse( message=AgentMessage(role="agent", content=content) ) except Exception as e: logger.error(f"OpenAI proxy error: {e}") return AgentResponse( message=AgentMessage( role="error", content=f"Agent error: {e}" ), error=str(e), ) # Register with factory AgentProxyFactory.register("openai", OpenAIChatProxy)