Files
patchy631--ai-engineering-hub/ai-avatar-demo/services/llm_service.py
T
2026-07-13 12:37:47 +08:00

59 lines
2.1 KiB
Python

"""LLM service for handling multiple providers (Minimax M2 via OpenRouter)."""
import json
from typing import AsyncGenerator, List, Dict, Any, Optional, cast
from config import settings
class LLMService:
"""Service for LLM interactions with Minimax M2 via OpenRouter."""
def __init__(self):
"""Initialize LLM service with OpenRouter."""
if not settings.openrouter_api_key:
raise ValueError("OPENROUTER_API_KEY not configured")
from openai import AsyncOpenAI
self.client = AsyncOpenAI(
base_url="https://openrouter.ai/api/v1",
api_key=settings.openrouter_api_key
)
async def stream_chat_completion(
self,
messages: List[Dict[str, str]],
system_prompt: str,
) -> AsyncGenerator[str, None]:
"""Stream chat completion from Minimax M2."""
# Prepend system message
openai_messages = [{"role": "system", "content": system_prompt}]
openai_messages.extend(messages)
try:
# Stream response
stream = await self.client.chat.completions.create(
model="minimax/minimax-m2",
messages=cast(Any, openai_messages),
stream=True,
temperature=0.8,
max_tokens=2048,
)
async for chunk in stream:
if chunk.choices and chunk.choices[0].delta.content:
yield chunk.choices[0].delta.content
except Exception as e:
# If streaming fails, try non-streaming
print(f"\nStreaming failed, using non-streaming mode: {e}")
response = await self.client.chat.completions.create(
model="minimax/minimax-m2",
messages=cast(Any, openai_messages),
stream=False,
temperature=0.8,
max_tokens=2048,
)
if response.choices and response.choices[0].message.content:
yield response.choices[0].message.content
# Global service instance
llm_service = LLMService()