SPB Git

spb/wp26_uqo

Public
1.7 KB · 49 lines python
1# Author: Simon-Pierre Boucher — simon-pierre.boucher@uqo.ca2"""OpenAI adapter (official SDK, Responses API with JSON-schema structured output)."""3from __future__ import annotations45import os6from typing import Any78from pydantic import BaseModel910from .base import LLMProvider, json_schema_for111213class OpenAIProvider(LLMProvider):14    name = "openai"1516    def __init__(self, **kw):17        super().__init__(**kw)18        from openai import AsyncOpenAI1920        if not os.environ.get("OPENAI_API_KEY"):21            raise RuntimeError("OPENAI_API_KEY not set")22        self.client = AsyncOpenAI(max_retries=self.max_retries, timeout=self.timeout_s)2324    async def _raw_complete(self, *, system: str, user: str, schema: type[BaseModel], model: str, effort: str, max_tokens: int) -> tuple[str, dict[str, Any]]:25        kwargs: dict[str, Any] = dict(26            model=model,27            instructions=system,28            input=user,29            max_output_tokens=max_tokens,30            text={"format": {"type": "json_schema", "name": schema.__name__, "schema": json_schema_for(schema), "strict": True}},31        )32        if effort:33            kwargs["reasoning"] = {"effort": effort}34        resp = await self.client.responses.create(**kwargs)35        text = resp.output_text or ""36        u = resp.usage37        cached = 038        try:39            cached = int(u.input_tokens_details.cached_tokens or 0)40        except Exception:41            pass42        return text, {43            "input_tokens": int(u.input_tokens or 0),44            "output_tokens": int(u.output_tokens or 0),45            "cached_tokens": cached,46            "request_id": getattr(resp, "_request_id", None) or getattr(resp, "id", None),47            "status": getattr(resp, "status", None),48        }49
Files · main
Menu

Theme