Spaces:
Running
Running
| """ | |
| 🇬🇧 Module: llm_client.py | |
| Purpose: Adapter for Featherless.ai (OpenAI-compatible API). | |
| 🇷🇺 Модуль: llm_client.py | |
| Назначение: адаптер для LLM-инференса через Featherless.ai (совместимо с OpenAI API). | |
| """ | |
| import os | |
| from typing import List, Dict, Generator | |
| from openai import OpenAI | |
| from config import FEATHERLESS_API_KEY, FEATHERLESS_MODEL | |
| class FeatherlessLLM: | |
| """Wrapper for Featherless.ai LLM inference.""" | |
| def __init__(self, api_key: str = FEATHERLESS_API_KEY, model: str = FEATHERLESS_MODEL): | |
| if not api_key: | |
| raise RuntimeError("❌ Environment variable 'featherless' (API key) is missing.") | |
| self.client = OpenAI(base_url="https://api.featherless.ai/v1", api_key=api_key) | |
| self.model = model | |
| def stream_chat(self, *, messages: List[Dict], model: str = None) -> Generator[str, None, None]: | |
| """Stream chat completion using Featherless.ai.""" | |
| used_model = model or self.model | |
| response = self.client.chat.completions.create( | |
| model=used_model, | |
| messages=messages, | |
| stream=True, | |
| ) | |
| for chunk in response: | |
| delta = chunk.choices[0].delta.content | |
| if delta: | |
| yield delta | |
| # === Global singleton instance === | |
| llm_service = FeatherlessLLM() | |