""" OpenAI-compatible provider for Ollama and LM Studio. Both expose an OpenAI-compatible /v1/chat/completions endpoint. """ import json from openai import AsyncOpenAI from app.services.ai.base import AIProvider, SYSTEM_PROMPT, USER_PROMPT_TEMPLATE class OpenAICompatProvider(AIProvider): def __init__(self, config: dict) -> None: self._client = AsyncOpenAI( base_url=config["base_url"], api_key=config.get("api_key", "not-required"), ) self._model = config["model"] async def classify_document(self, text: str) -> dict: response = await self._client.chat.completions.create( model=self._model, temperature=0, messages=[ {"role": "system", "content": SYSTEM_PROMPT}, {"role": "user", "content": USER_PROMPT_TEMPLATE.format(text=text[:100_000])}, ], ) raw = response.choices[0].message.content.strip() return _parse_json(raw) def _parse_json(raw: str) -> dict: if raw.startswith("```"): raw = raw.split("\n", 1)[1].rsplit("```", 1)[0] return json.loads(raw)