Initial commit: VoIdeaAI - voice-first AI idea assistant
This commit is contained in:
@@ -0,0 +1,64 @@
|
||||
"""Base classes for AI provider integration."""
|
||||
|
||||
from __future__ import annotations
|
||||
|
||||
from abc import ABC, abstractmethod
|
||||
from dataclasses import dataclass, field
|
||||
from datetime import datetime, timezone
|
||||
from typing import Any
|
||||
|
||||
|
||||
@dataclass
|
||||
class AIResult:
|
||||
"""Result from an AI provider call."""
|
||||
|
||||
success: bool
|
||||
content: str = ""
|
||||
model: str = ""
|
||||
provider: str = ""
|
||||
tokens_used: int = 0
|
||||
duration_ms: int = 0
|
||||
error: str = ""
|
||||
metadata: dict[str, Any] = field(default_factory=dict)
|
||||
|
||||
|
||||
class AIProvider(ABC):
|
||||
"""Abstract base class for AI providers.
|
||||
|
||||
All AI providers (Yandex GPT, GigaChat, etc.) must implement this.
|
||||
"""
|
||||
|
||||
name: str = ""
|
||||
model: str = ""
|
||||
timeout: int = 10
|
||||
max_retries: int = 3
|
||||
|
||||
def __init__(self, api_key: str = "", **kwargs: Any):
|
||||
self.api_key = api_key
|
||||
for key, value in kwargs.items():
|
||||
setattr(self, key, value)
|
||||
self._initialize()
|
||||
|
||||
def _initialize(self) -> None:
|
||||
"""Post-initialization hook for provider-specific setup."""
|
||||
|
||||
@abstractmethod
|
||||
async def analyze(self, prompt: str, **kwargs: Any) -> AIResult:
|
||||
"""Send a prompt to the AI provider and return the result.
|
||||
|
||||
Args:
|
||||
prompt: The formatted prompt to send
|
||||
**kwargs: Additional provider-specific parameters
|
||||
|
||||
Returns:
|
||||
AIResult with the response content
|
||||
"""
|
||||
|
||||
def format_prompt(
|
||||
self, system_prompt: str, user_prompt: str, **kwargs: Any
|
||||
) -> str:
|
||||
"""Format a prompt with system instructions and user message.
|
||||
|
||||
Override in provider if the API uses separate system/user messages.
|
||||
"""
|
||||
return f"{system_prompt}\n\n{user_prompt}"
|
||||
Reference in New Issue
Block a user