Source code for base_ai_client
#!/usr/bin/env python3
"""
Base AI Client - Abstract interface for different AI providers
"""
from abc import ABC, abstractmethod
from typing import Dict, Any, Optional
from ai_content_generator import AIContentRequest, AIContentResponse
[docs]
class BaseAIClient(ABC):
"""Abstract base class for AI content generation clients"""
[docs]
def __init__(self, base_dir: str = "."):
self.base_dir = base_dir
self.available = False
[docs]
@abstractmethod
def is_available(self) -> bool:
"""Check if AI client is available and configured"""
pass
[docs]
@abstractmethod
def generate_content(self, request: AIContentRequest) -> AIContentResponse:
"""Generate AI content for the given request"""
pass
[docs]
@abstractmethod
def generate_all_cover_letter_content(self, job_description: str, profile_content: str,
company_name: str, position_title: str) -> Dict[str, str]:
"""Generate all cover letter content variables at once"""
pass
[docs]
@abstractmethod
def extract_company_and_position(self, job_description: str) -> Dict[str, str]:
"""Extract company name and position title from job description"""
pass
[docs]
def get_provider_name(self) -> str:
"""Get the name of the AI provider"""
return self.__class__.__name__.replace('APIClient', '').replace('Client', '').lower()
[docs]
@abstractmethod
def get_model_name(self) -> str:
"""Get the specific model name (e.g., 'sonnet-4', '3.2-3b', 'content')"""
pass
[docs]
def get_client_model_folder(self) -> str:
"""Get formatted folder name for client and model"""
provider = self.get_provider_name()
model = self.get_model_name()
# Sanitize folder name
folder_name = f"{provider}_{model}"
# Replace problematic characters for filesystem
folder_name = folder_name.replace(':', '-').replace('/', '-').replace('\\', '-')
folder_name = folder_name.replace(' ', '_').replace('.', '-')
return folder_name
[docs]
def get_usage_stats(self) -> Dict[str, Any]:
"""Get usage statistics"""
return {
'provider': self.get_provider_name(),
'model': self.get_model_name(),
'folder': self.get_client_model_folder(),
'available': self.is_available()
}
[docs]
def test_content_generation(self) -> bool:
"""Test content generation with sample data"""
try:
from ai_content_generator import ContentType
test_request = AIContentRequest(
content_type=ContentType.EINSTIEGSTEXT,
job_description="Wir suchen einen DevOps Engineer für unser innovatives Team.",
profile_content="Erfahrener DevOps Engineer mit 5 Jahren Kubernetes-Erfahrung.",
company_name="TechCorp",
position_title="DevOps Engineer"
)
response = self.generate_content(test_request)
print(f"✓ {self.get_provider_name()} test successful: {response.generated_text[:100]}...")
return True
except Exception as e:
print(f"✗ {self.get_provider_name()} test failed: {e}")
return False
[docs]
class AIProviderError(Exception):
"""Exception raised when AI provider is not available or configured incorrectly"""
pass
[docs]
class AIContentError(Exception):
"""Exception raised when AI content generation fails"""
pass