Files
AI-Video/reelforge/services/llm.py
2025-11-07 16:59:11 +08:00

98 lines
2.9 KiB
Python

"""
LLM (Large Language Model) Service
"""
from typing import Optional
from reelforge.services.base import BaseService
class LLMService(BaseService):
"""
LLM (Large Language Model) service
Provides unified access to various LLM providers (Qwen, OpenAI, DeepSeek, Ollama, etc.)
Usage:
# Direct call (recommended)
answer = await reelforge.llm("Explain atomic habits")
# With parameters
answer = await reelforge.llm(
prompt="Explain atomic habits in 3 sentences",
temperature=0.7,
max_tokens=2000
)
# Explicit call syntax
answer = await reelforge.llm.call(prompt="Hello")
# Check active LLM
print(f"Using: {reelforge.llm.active}")
# List available LLMs
print(f"Available: {reelforge.llm.available}")
"""
def __init__(self, router):
super().__init__(router, "llm")
async def __call__(
self,
prompt: str,
api_key: Optional[str] = None,
base_url: Optional[str] = None,
model: Optional[str] = None,
temperature: Optional[float] = None,
max_tokens: Optional[int] = None,
**kwargs
) -> str:
"""
Generate text using LLM
Args:
prompt: The prompt to generate from
api_key: API key (optional, uses config if not provided)
base_url: Base URL (optional, uses config if not provided)
model: Model name (optional, uses config if not provided)
temperature: Sampling temperature (0.0-2.0). Lower is more deterministic.
max_tokens: Maximum tokens to generate
**kwargs: Additional provider-specific parameters
Returns:
Generated text
Examples:
# Use config from config.yaml
answer = await reelforge.llm("Explain atomic habits")
# Override with custom parameters
answer = await reelforge.llm(
"Explain the concept of atomic habits in 3 sentences",
api_key="sk-custom-key",
base_url="https://api.custom.com/v1",
model="custom-model",
temperature=0.7,
max_tokens=500
)
"""
params = {"prompt": prompt}
# Add optional LLM parameters (will override config if provided)
if api_key is not None:
params["api_key"] = api_key
if base_url is not None:
params["base_url"] = base_url
if model is not None:
params["model"] = model
if temperature is not None:
params["temperature"] = temperature
if max_tokens is not None:
params["max_tokens"] = max_tokens
params.update(kwargs)
return await self._config_manager.call(self._capability_type, **params)