98 lines
2.9 KiB
Python
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)
|
|
|