- Prevent path traversal in gitignore template names (Critical) - Fix TOCTOU races in file operations with try/except pattern (High) - Add timeout to HuggingFace API requests (Medium) - Add missing %x00 separator in changelog fallback format (Medium) - Filter unsanitized kwargs before passing to OpenAI SDK (High) - Use context managers for proper client cleanup in providers (High) - Exit with non-zero code on commit engine failure (Low)
31 lines
1.2 KiB
Python
31 lines
1.2 KiB
Python
from openai import OpenAI
|
|
|
|
from devgen.providers.base import BaseProvider
|
|
|
|
|
|
class OpenrouterProvider(BaseProvider):
|
|
"""Generates content using OpenRouter (OpenAI-compatible API)."""
|
|
|
|
DISPLAY_NAME = "OpenRouter"
|
|
BASE_URL = "https://openrouter.ai/api/v1"
|
|
DEFAULT_MODEL = "openai/gpt-3.5-turbo"
|
|
|
|
# Keys consumed by devgen itself — never forwarded to the SDK.
|
|
_DEVGEN_KEYS = frozenset({"debug", "ollama_host", "max_retries", "retry_delay"})
|
|
|
|
def _generate(self, prompt, api_key, model, **kwargs):
|
|
safe_kwargs = {k: v for k, v in kwargs.items() if k not in self._DEVGEN_KEYS}
|
|
with OpenAI(base_url=self.BASE_URL, api_key=api_key) as client:
|
|
response = client.chat.completions.create(
|
|
model=model,
|
|
messages=[{"role": "user", "content": prompt}],
|
|
extra_headers={
|
|
"HTTP-Referer": "https://github.com/S4NKALP/devgen",
|
|
"X-Title": "devgen CLI",
|
|
},
|
|
**safe_kwargs,
|
|
)
|
|
if not response.choices:
|
|
raise RuntimeError(f"OpenRouter returned no choices for model {model!r}.")
|
|
return response.choices[0].message.content or ""
|