| """Base LLM interface.""" |
|
|
| from abc import ABC, abstractmethod |
| from dataclasses import dataclass |
| from typing import Any, Dict, List, Optional |
|
|
|
|
| @dataclass |
| class LLMResponse: |
| """Response from an LLM generation call. |
| |
| text: generated text content. |
| image_path: path to generated image file, or None for text-only. |
| """ |
|
|
| text: str = "" |
| image_path: Optional[str] = None |
|
|
|
|
| class LLMInterface(ABC): |
| """Abstract base for LLM backends. |
| |
| Subclass this and implement generate() to add a new LLM provider. |
| """ |
|
|
| @abstractmethod |
| async def generate( |
| self, system_message: str, messages: List[Dict[str, Any]], **kwargs |
| ) -> LLMResponse: |
| """Generate a response from the LLM. |
| |
| Args: |
| system_message: system prompt string. |
| messages: conversation history as list of {role, content} dicts. |
| **kwargs: backend-specific options (e.g. image_output=True for |
| image generation, output_dir, program_id, temperature). |
| |
| Returns: |
| LLMResponse with text and optional image_path. |
| """ |
| pass |
|
|