Files
DevGen/devgen/providers/huggingface.py
T
sankalp 8069895bc7 feat(devgen/providers): normalize token limit error handling
Add token limit error detection and formatting across all provider modules to surface clear diagnostics when context windows are exceeded, improving error messages and preventing silent failures.

New Features
- Introduce `is_token_limit_error` checks in Anthropic, Gemini, Hugging Face, Ollama, OpenAI, and OpenRouter providers.
- Use `format_token_limit_error` to generate user‑friendly error messages for token limit overs.

Enhancements
- Centralize token limit error handling for consistent diagnostics across providers.
- Explicitly re‑raise `RuntimeError` in Hugging Face to preserve original behavior.

Bug Fixes
- None
2026-06-06 16:45:05 +05:45

80 lines
3.1 KiB
Python

import requests
from devgen.utils import format_token_limit_error, is_token_limit_error
class HuggingfaceProvider:
"""Generates content using Hugging Face Inference API."""
API_URL_TEMPLATE = "https://api-inference.huggingface.co/models/{model}"
def generate(
self,
prompt: str,
api_key: str,
model: str = "mistralai/Mistral-7B-Instruct-v0.2",
**kwargs,
) -> str:
"""Generates a response using Hugging Face API."""
if not api_key:
raise ValueError(
"Hugging Face API token is missing. "
"Set it via `devgen setup config` or pass --api-key."
)
api_url = self.API_URL_TEMPLATE.format(model=model)
headers = {"Authorization": f"Bearer {api_key}"}
# HF models often expect specific prompting formats, but we'll send raw prompt
# Some models are text-generation, some are conversational.
# Assuming text-generation for generic usage.
payload = {
"inputs": prompt,
"parameters": {"max_new_tokens": 500, "return_full_text": False},
}
try:
response = requests.post(api_url, headers=headers, json=payload)
response.raise_for_status()
result = response.json()
if isinstance(result, list) and result and "generated_text" in result[0]:
return result[0]["generated_text"].strip()
elif isinstance(result, dict) and "error" in result:
err = result["error"]
if "is currently loading" in str(err).lower():
raise RuntimeError(
f"Hugging Face model is loading: {err}. "
"Wait a minute and retry, or pick a different model."
)
if is_token_limit_error(err):
raise RuntimeError(
format_token_limit_error("Hugging Face", err)
) from err
raise RuntimeError(f"Hugging Face API error: {err}")
else:
raise RuntimeError(
"Hugging Face returned an unexpected response shape. "
"The model may not support text-generation."
)
except requests.HTTPError as e:
status = e.response.status_code if e.response is not None else "?"
if is_token_limit_error(e):
raise RuntimeError(format_token_limit_error("Hugging Face", e)) from e
raise RuntimeError(
f"Hugging Face request failed (HTTP {status}): {e}. "
"Check the model id and your token permissions."
) from e
except requests.RequestException as e:
raise RuntimeError(
f"Hugging Face network error: {e}. Check your connection."
) from e
except RuntimeError:
raise
except Exception as e:
if is_token_limit_error(e):
raise RuntimeError(format_token_limit_error("Hugging Face", e)) from e
raise RuntimeError(f"Hugging Face generation failed: {e}") from e