| """ |
| 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", "") |
| |
| 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}) |
| |
| 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), |
| ) |
|
|
|
|
| |
| AgentProxyFactory.register("openai", OpenAIChatProxy) |
|
|