Add production-ready async HTTP client for Ollama API communication with proper error handling and dependency injection. Ollama Client (src/ollama/client.py): - Async context manager for connection lifecycle - Non-streaming chat endpoint - Streaming chat endpoint with async generator - Model listing endpoint - Health check endpoint - Timeout configuration per request - Comprehensive error handling with custom exceptions - FastAPI dependency injection support Ollama Schemas (src/ollama/schemas.py): - OllamaMessage: Chat message format - OllamaChatRequest: Request with model, messages, options - OllamaChatResponse: Complete chat response - OllamaModelInfo: Model metadata - OllamaModelsResponse: Model list response Features: - Async/await throughout for non-blocking I/O - Connection pooling via httpx.AsyncClient - Configurable timeouts (default: 120s) - Proper exception mapping (connection errors, timeouts) - Ready for integration (currently not connected to routes) Following Best Practices: - Async context manager pattern - Dependency injection for FastAPI routes - Separation of concerns (client vs schemas) - Type hints throughout - Comprehensive logging Status: Ready for integration (mock responses used in routes currently) 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
43 lines
897 B
Python
43 lines
897 B
Python
"""
|
|
Ollama API schemas.
|
|
Internal models for Ollama API communication.
|
|
"""
|
|
from typing import Any
|
|
|
|
from src.core.models import CustomBaseModel
|
|
|
|
|
|
class OllamaMessage(CustomBaseModel):
|
|
"""Message format for Ollama API."""
|
|
role: str
|
|
content: str
|
|
|
|
|
|
class OllamaChatRequest(CustomBaseModel):
|
|
"""Chat request to Ollama API."""
|
|
model: str
|
|
messages: list[OllamaMessage]
|
|
stream: bool = False
|
|
options: dict[str, Any] | None = None
|
|
|
|
|
|
class OllamaChatResponse(CustomBaseModel):
|
|
"""Chat response from Ollama API."""
|
|
model: str
|
|
created_at: str
|
|
message: OllamaMessage
|
|
done: bool
|
|
|
|
|
|
class OllamaModelInfo(CustomBaseModel):
|
|
"""Model information from Ollama."""
|
|
name: str
|
|
modified_at: str
|
|
size: int
|
|
digest: str
|
|
|
|
|
|
class OllamaModelsResponse(CustomBaseModel):
|
|
"""Response from Ollama models list endpoint."""
|
|
models: list[OllamaModelInfo]
|