chat_bot_sentinel / llm_client.py
vicfeuga's picture
First upload
4a09f2e verified
Raw
History Blame Contribute Delete
3.45 kB
"""
LLM client backed by Hugging Face Inference Providers.
The original chatbot was built against Azure OpenAI and the agents call:
client.chat.completions.create(
model=client._default_deployment,
messages=[...],
temperature=0,
)
`huggingface_hub.InferenceClient` already exposes an OpenAI-compatible
``client.chat.completions.create(...)`` surface, so we just need to attach the
default model name as an attribute and the rest of the agent code works unchanged.
"""
from __future__ import annotations
import os
from typing import Any
DEFAULT_MODEL = "meta-llama/Llama-3.3-70B-Instruct"
DEFAULT_PROVIDER = "auto"
class MissingHFTokenError(RuntimeError):
"""Raised when no HF_TOKEN is available to authenticate with Inference Providers."""
def get_hf_token() -> str | None:
"""Return the first non-empty HF token from the usual environment variables."""
for var in ("HF_TOKEN", "HUGGING_FACE_HUB_TOKEN", "HUGGINGFACEHUB_API_TOKEN"):
value = os.environ.get(var, "").strip()
if value:
return value
return None
def create_chat_client(
model: str | None = None,
provider: str | None = None,
token: str | None = None,
) -> Any:
"""
Create an `InferenceClient` configured for chat completions.
The returned client exposes ``client.chat.completions.create(...)`` and is tagged
with a ``_default_deployment`` attribute that the agents read as the model name.
Parameters
----------
model : str, optional
HF model id (e.g. ``meta-llama/Llama-3.3-70B-Instruct``). Falls back to the
``HF_MODEL`` env var, then to :data:`DEFAULT_MODEL`.
provider : str, optional
HF Inference Providers routing (``auto``, ``hf-inference``, ``together``,
``cerebras``, …). Falls back to the ``HF_PROVIDER`` env var, then to ``auto``.
token : str, optional
Explicit HF token. Falls back to ``HF_TOKEN`` / ``HUGGING_FACE_HUB_TOKEN``.
Raises
------
MissingHFTokenError
If no token is available — the Space cannot make LLM calls without one.
"""
try:
from huggingface_hub import InferenceClient
except ImportError as exc:
raise ImportError(
"huggingface_hub is required. Install with `pip install huggingface_hub`."
) from exc
model_id = (model or os.environ.get("HF_MODEL") or DEFAULT_MODEL).strip()
provider_id = (provider or os.environ.get("HF_PROVIDER") or DEFAULT_PROVIDER).strip()
hf_token = (token or get_hf_token() or "").strip()
if not hf_token:
raise MissingHFTokenError(
"No Hugging Face token found. Set `HF_TOKEN` in the Space secrets "
"(Settings → Variables and secrets) or in your local environment."
)
client = InferenceClient(
provider=provider_id,
token=hf_token,
model=model_id,
)
client._default_deployment = model_id # type: ignore[attr-defined]
client._default_provider = provider_id # type: ignore[attr-defined]
return client
def describe_client(client: Any) -> dict:
"""Return a small dict describing the client config (handy for the UI)."""
return {
"model": getattr(client, "_default_deployment", "unknown"),
"provider": getattr(client, "_default_provider", "unknown"),
}