# MCP LLM Model Configuration ## Overview All LLM provider models are now configured exclusively through `appsettings.json` - **no hardcoded values in the code**. This allows you to easily change models without recompiling the application. ## Configuration Location All model settings are in: `src/Managing.Api/appsettings.json` ```json { "Llm": { "Gemini": { "ApiKey": "", // Add your key here or via user secrets "DefaultModel": "gemini-3-flash-preview" }, "OpenAI": { "ApiKey": "", "DefaultModel": "gpt-4o" }, "Claude": { "ApiKey": "", "DefaultModel": "claude-haiku-4-5-20251001" } } } ``` ## Current Models (from appsettings.json) - **Gemini**: `gemini-3-flash-preview` - **OpenAI**: `gpt-4o` - **Claude**: `claude-haiku-4-5-20251001` ## Fallback Models (in code) If `DefaultModel` is not specified in configuration, the providers use these fallback models: - **Gemini**: `gemini-2.0-flash-exp` - **OpenAI**: `gpt-4o` - **Claude**: `claude-3-5-sonnet-20241022` ## How It Works ### 1. Configuration Reading When the application starts, `LlmService` reads the model configuration: ```csharp var geminiModel = _configuration["Llm:Gemini:DefaultModel"]; var openaiModel = _configuration["Llm:OpenAI:DefaultModel"]; var claudeModel = _configuration["Llm:Claude:DefaultModel"]; ``` ### 2. Provider Initialization Each provider is initialized with the configured model: ```csharp _providers["gemini"] = new GeminiProvider(geminiApiKey, geminiModel, httpClientFactory, _logger); _providers["openai"] = new OpenAiProvider(openaiApiKey, openaiModel, httpClientFactory, _logger); _providers["claude"] = new ClaudeProvider(claudeApiKey, claudeModel, httpClientFactory, _logger); ``` ### 3. Model Usage The provider uses the configured model for all API calls: ```csharp public async Task ChatAsync(LlmChatRequest request) { var model = _defaultModel; // From configuration var url = $"{BaseUrl}/models/{model}:generateContent?key={_apiKey}"; // ... } ``` ## Changing Models ### Method 1: Edit appsettings.json ```json { "Llm": { "Claude": { "DefaultModel": "claude-3-5-sonnet-20241022" // Change to Sonnet } } } ``` ### Method 2: Environment Variables ```bash export Llm__Claude__DefaultModel="claude-3-5-sonnet-20241022" ``` ### Method 3: User Secrets (Development) ```bash cd src/Managing.Api dotnet user-secrets set "Llm:Claude:DefaultModel" "claude-3-5-sonnet-20241022" ``` ## Available Models ### Gemini Models - `gemini-2.0-flash-exp` - Latest Flash (experimental) - `gemini-3-flash-preview` - Flash preview - `gemini-1.5-pro` - Pro model - `gemini-1.5-flash` - Fast and efficient ### OpenAI Models - `gpt-4o` - GPT-4 Optimized (recommended) - `gpt-4o-mini` - Smaller, faster - `gpt-4-turbo` - GPT-4 Turbo - `gpt-3.5-turbo` - Cheaper, faster ### Claude Models - `claude-haiku-4-5-20251001` - Haiku 4.5 (fastest, cheapest) - `claude-3-5-sonnet-20241022` - Sonnet 3.5 (balanced, recommended) - `claude-3-opus-20240229` - Opus (most capable) - `claude-3-sonnet-20240229` - Sonnet 3 - `claude-3-haiku-20240307` - Haiku 3 ## Model Selection Guide ### For Development/Testing - **Gemini**: `gemini-2.0-flash-exp` (free tier) - **Claude**: `claude-haiku-4-5-20251001` (cheapest) - **OpenAI**: `gpt-4o-mini` (cheapest) ### For Production (Balanced) - **Claude**: `claude-3-5-sonnet-20241022` ✅ Recommended - **OpenAI**: `gpt-4o` - **Gemini**: `gemini-1.5-pro` ### For Maximum Capability - **Claude**: `claude-3-opus-20240229` (best reasoning) - **OpenAI**: `gpt-4-turbo` - **Gemini**: `gemini-1.5-pro` ### For Speed/Cost Efficiency - **Claude**: `claude-haiku-4-5-20251001` - **OpenAI**: `gpt-4o-mini` - **Gemini**: `gemini-2.0-flash-exp` ## Cost Comparison (Approximate) ### Claude - **Haiku 4.5**: ~$0.50 per 1M tokens (cheapest) - **Sonnet 3.5**: ~$9 per 1M tokens (recommended) - **Opus**: ~$45 per 1M tokens (most expensive) ### OpenAI - **GPT-4o-mini**: ~$0.30 per 1M tokens - **GPT-4o**: ~$10 per 1M tokens - **GPT-4-turbo**: ~$30 per 1M tokens ### Gemini - **Free tier**: 15 requests/minute (development) - **Paid**: ~$0.50 per 1M tokens ## Logging When providers are initialized, you'll see log messages indicating which model is being used: ``` [Information] Gemini provider initialized with model: gemini-3-flash-preview [Information] OpenAI provider initialized with model: gpt-4o [Information] Claude provider initialized with model: claude-haiku-4-5-20251001 ``` If no model is configured, it will show: ``` [Information] Gemini provider initialized with model: default ``` And the fallback model will be used. ## Best Practices 1. **Use environment variables** for production to keep configuration flexible 2. **Test with cheaper models** during development 3. **Monitor costs** in provider dashboards 4. **Update models** as new versions are released 5. **Document changes** when switching models for your team ## Example Configurations ### Development (Cost-Optimized) ```json { "Llm": { "Claude": { "ApiKey": "your-key", "DefaultModel": "claude-haiku-4-5-20251001" } } } ``` ### Production (Balanced) ```json { "Llm": { "Claude": { "ApiKey": "your-key", "DefaultModel": "claude-3-5-sonnet-20241022" } } } ``` ### High-Performance (Maximum Capability) ```json { "Llm": { "Claude": { "ApiKey": "your-key", "DefaultModel": "claude-3-opus-20240229" } } } ``` ## Verification To verify which model is being used: 1. Check application logs on startup 2. Look for provider initialization messages 3. Check LLM response metadata (includes model name) 4. Monitor provider dashboards for API usage ## Troubleshooting ### Model not found error **Issue**: "Model not found" or "Invalid model name" **Solution**: 1. Verify model name spelling in `appsettings.json` 2. Check provider documentation for available models 3. Ensure model is available in your region/tier 4. Try removing `DefaultModel` to use the fallback ### Wrong model being used **Issue**: Application uses fallback instead of configured model **Solution**: 1. Check configuration path: `Llm:ProviderName:DefaultModel` 2. Verify no typos in JSON (case-sensitive) 3. Restart application after configuration changes 4. Check logs for which model was loaded ### Configuration not loading **Issue**: Changes to `appsettings.json` not taking effect **Solution**: 1. Restart the application 2. Clear build artifacts: `dotnet clean` 3. Check file is in correct location: `src/Managing.Api/appsettings.json` 4. Verify JSON syntax is valid ## Summary ✅ All models configured in `appsettings.json` ✅ No hardcoded model names in code ✅ Easy to change without recompiling ✅ Fallback models in case of missing configuration ✅ Full flexibility for different environments ✅ Logged on startup for verification This design allows maximum flexibility while maintaining sensible defaults!