MicroFish/backend/app/adapters/llm/base.py

58 lines
1.6 KiB
Python

"""Unified business-facing LLM provider interface."""
from __future__ import annotations
from abc import ABC, abstractmethod
from dataclasses import dataclass
from typing import Any, Dict, List, Optional
@dataclass
class LLMTask:
run_id: str
task_type: str
stage: str
expected_schema: Dict[str, Any]
input_text: Optional[str] = None
input_files: Optional[List[str]] = None
structured_input: Optional[Dict[str, Any]] = None
system_prompt: str = ""
user_prompt: str = ""
validation_rules: Optional[Dict[str, Any]] = None
retry_policy: Optional[Dict[str, Any]] = None
context_refs: Optional[List[str]] = None
output_contract: Optional[Dict[str, Any]] = None
@dataclass
class LLMProviderResult:
status: str
output: Optional[Dict[str, Any]] = None
request_id: Optional[str] = None
request_file: Optional[str] = None
expected_response_file: Optional[str] = None
error: Optional[str] = None
def to_dict(self) -> Dict[str, Any]:
data = {
"status": self.status,
"output": self.output,
"request_id": self.request_id,
"request_file": self.request_file,
"expected_response_file": self.expected_response_file,
"error": self.error,
}
return {key: value for key, value in data.items() if value is not None}
class LLMProvider(ABC):
name: str
@abstractmethod
def run_task(self, task: LLMTask) -> LLMProviderResult:
raise NotImplementedError
class ProviderConfigurationError(RuntimeError):
pass