Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
60 changes: 36 additions & 24 deletions .env.example
Original file line number Diff line number Diff line change
Expand Up @@ -63,6 +63,25 @@ LLM_MAX_TOKENS=
# Disable caching (true/false) - when true, skips reading cache but still writes
LLM_NOCACHE=false

# ==============================================================================
# PYDANTIC AI STANDARD API KEYS
# ==============================================================================
# These are the standard env vars that PydanticAI expects for each provider
# Set these to use the providers with default configuration

# OpenAI API key (for openai provider)
OPENAI_API_KEY=your-openai-api-key

# Anthropic API key (for anthropic provider)
ANTHROPIC_API_KEY=your-anthropic-api-key

# Mistral API key (for mistral provider)
MISTRAL_API_KEY=your-mistral-api-key

# Azure OpenAI (for azure provider)
AZURE_OPENAI_ENDPOINT=https://your-resource.openai.azure.com
AZURE_OPENAI_API_KEY=your-azure-api-key

# Rate limiting settings
# 0 = use provider-specific default (azure/openai/anthropic: 60 RPM, ollama/lmstudio: unlimited)
LLM_RATE_LIMIT_RPM=0
Expand Down Expand Up @@ -104,7 +123,7 @@ LLM_LMSTUDIO_MODEL=local-model
# Naming: LLM_{NAME}_* -> CLI name is lowercase with hyphens (AZURE_GPT4MINI -> azure-gpt4mini)
#
# Required fields per model:
# LLM_{NAME}_PROVIDER - Provider type: azure, openai, anthropic, ollama, lmstudio, mistral, claudecode
# LLM_{NAME}_PROVIDER - Provider type: azure, openai, anthropic, ollama, lmstudio, mistral
# LLM_{NAME}_MODEL - Model name/identifier
# LLM_{NAME}_URL - API endpoint URL
# LLM_{NAME}_KEY - API key (optional for local providers)
Expand Down Expand Up @@ -164,33 +183,26 @@ LLM_LMSTUDIO_LOCAL_PROVIDER=lmstudio
LLM_LMSTUDIO_LOCAL_MODEL=local-model
LLM_LMSTUDIO_LOCAL_URL=http://localhost:1234/v1/chat/completions

# --- CLAUDE CODE (via Agent SDK CLI) ---
# --- ANTHROPIC (Direct API) ---

# Uses your authenticated Claude Code session - no API key needed!
# Requires: Claude Code extension installed and authenticated
#
# Anthropic Claude models via direct API
# Model Pricing (per Million Tokens):
# haiku: $1/$5 (fastest, cheapest)
# sonnet: $3/$15 (balanced)
# opus: $5/$25 (most capable)

# Claude Haiku (via Claude Code) -> use as: claudecode-haiku
LLM_CLAUDECODE_HAIKU_PROVIDER=claudecode
LLM_CLAUDECODE_HAIKU_MODEL=haiku
LLM_CLAUDECODE_HAIKU_URL=cli
LLM_CLAUDECODE_HAIKU_KEY=

# Claude Sonnet (via Claude Code) -> use as: claudecode-sonnet
LLM_CLAUDECODE_SONNET_PROVIDER=claudecode
LLM_CLAUDECODE_SONNET_MODEL=sonnet
LLM_CLAUDECODE_SONNET_URL=cli
LLM_CLAUDECODE_SONNET_KEY=

# Claude Opus (via Claude Code) -> use as: claudecode-opus
LLM_CLAUDECODE_OPUS_PROVIDER=claudecode
LLM_CLAUDECODE_OPUS_MODEL=opus
LLM_CLAUDECODE_OPUS_URL=cli
LLM_CLAUDECODE_OPUS_KEY=

# Anthropic Claude Haiku -> use as: anthropic-haiku
LLM_ANTHROPIC_HAIKU_PROVIDER=anthropic
LLM_ANTHROPIC_HAIKU_MODEL=claude-haiku-4-5-20251001
LLM_ANTHROPIC_HAIKU_URL=https://api.anthropic.com/v1/messages
LLM_ANTHROPIC_HAIKU_KEY=your-anthropic-api-key
LLM_ANTHROPIC_HAIKU_STRUCTURED_OUTPUT=true

# Anthropic Claude Sonnet -> use as: anthropic-sonnet
LLM_ANTHROPIC_SONNET_PROVIDER=anthropic
LLM_ANTHROPIC_SONNET_MODEL=claude-sonnet-4-5-20251101
LLM_ANTHROPIC_SONNET_URL=https://api.anthropic.com/v1/messages
LLM_ANTHROPIC_SONNET_KEY=your-anthropic-api-key
LLM_ANTHROPIC_SONNET_STRUCTURED_OUTPUT=true

# ==============================================================================
# TOKEN LIMITS FOR CHUNKING
Expand Down
16 changes: 15 additions & 1 deletion CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,21 @@ Deriving ArchiMate models from code using knowledge graphs, heuristics and LLM's

# v0.6.x - Deriva (December 2025 - January 2026)

## v0.6.7 - (January 15 2026)
## v0.6.8 - PydanticAI Migration (Unreleased)

### LLM Adapter Rewrite
- **PydanticAI Integration**: Replaced custom REST provider implementations with PydanticAI library
- **Code Reduction**: Same (or better) llm adapter with way less code, deleted entire `providers.py`
- **Native Structured Output**: PydanticAI handles validation and retry automatically
- **Removed ClaudeCode Provider**: Use `anthropic` provider directly instead (CLI subprocess no longer supported)

### Configuration
- **Standard API Keys**: Added PydanticAI standard env vars (`OPENAI_API_KEY`, `ANTHROPIC_API_KEY`, `MISTRAL_API_KEY`, `AZURE_OPENAI_*`)
- **Updated .env.example**: Removed `claudecode` provider, added Anthropic direct API configs

---

## v0.6.7 - Gotta save some Tokens (January 15 2026)

### Caching & Performance
- **Graph Cache**: New `cache.py` in graph adapter with hash-based cache for expensive graph queries
Expand Down
42 changes: 12 additions & 30 deletions deriva/adapters/llm/__init__.py
Original file line number Diff line number Diff line change
@@ -1,11 +1,15 @@
"""
LLM Manager - A multi-provider LLM abstraction with caching and structured output.

Uses PydanticAI for model-agnostic LLM interactions.

Supports:
- Azure OpenAI
- OpenAI
- Anthropic
- Ollama
- Mistral
- LM Studio

Example:
from deriva.adapters.llm import LLMManager
Expand All @@ -27,9 +31,12 @@ class Concept(BaseModel):
from __future__ import annotations

from .cache import CacheManager, cached_llm_call
from .manager import LLMManager
from .model_registry import VALID_PROVIDERS, get_pydantic_ai_model
from .models import (
APIError,
BaseResponse,
BenchmarkModelConfig,
CachedResponse,
CacheError,
ConfigurationError,
Expand All @@ -38,24 +45,9 @@ class Concept(BaseModel):
LLMError,
LLMResponse,
ResponseType,
StructuredOutputMixin,
ValidationError,
)
from .providers import (
AnthropicProvider,
AzureOpenAIProvider,
BaseProvider,
CompletionResult,
LLMProvider,
LMStudioProvider,
OllamaProvider,
OpenAIProvider,
ProviderConfig,
ProviderError,
create_provider,
)
from .rate_limiter import RateLimitConfig, RateLimiter, get_default_rate_limit
from .manager import LLMManager

__all__ = [
# Main service
Expand All @@ -67,20 +59,10 @@ class Concept(BaseModel):
"CachedResponse",
"FailedResponse",
"LLMResponse",
# Structured output
"StructuredOutputMixin",
# Providers
"LLMProvider",
"BaseProvider",
"AzureOpenAIProvider",
"OpenAIProvider",
"AnthropicProvider",
"OllamaProvider",
"LMStudioProvider",
"ProviderConfig",
"CompletionResult",
"ProviderError",
"create_provider",
# Configuration
"BenchmarkModelConfig",
"VALID_PROVIDERS",
"get_pydantic_ai_model",
# Cache
"CacheManager",
"cached_llm_call",
Expand All @@ -96,4 +78,4 @@ class Concept(BaseModel):
"ValidationError",
]

__version__ = "1.0.0"
__version__ = "2.0.0"
Loading
Loading