From 2b8bc83a9744f85c0b6729cd1ce354da133acb06 Mon Sep 17 00:00:00 2001 From: Octopus Date: Sun, 5 Apr 2026 10:41:54 +0800 Subject: [PATCH] fix: register anthropic provider, normalize togetherAI alias, fix dsk_deepseek exception handling - Add 'anthropic' to available_providers and unsafe_providers so users can set provider_name = anthropic in config.ini and use ANTHROPIC_API_KEY - Add provider name alias normalization so 'togetherAI' (as documented in README) is accepted as equivalent to 'together' - Fix NameError in dsk_deepseek: add 'as e' to AuthenticationError, RateLimitError, and NetworkError except clauses where 'e' was referenced but not bound - Remove unreachable 'return thought' dead code at end of lm_studio_fn - Update README to list Anthropic as a supported API provider --- README.md | 1 + sources/llm_provider.py | 13 ++++++++----- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index aa874a5..7a133bb 100644 --- a/README.md +++ b/README.md @@ -240,6 +240,7 @@ provider_server_address = # Typically ignored or can be left blank when is_local | Hugging Face | `huggingface` | No | Use models from Hugging Face Inference API. | [huggingface.co/settings/tokens](https://huggingface.co/settings/tokens) | | TogetherAI | `togetherAI` | No | Use various open-source models via TogetherAI API.| [api.together.ai/settings/api-keys](https://api.together.ai/settings/api-keys) | | OpenRouter | `openrouter` | No | Use OpenRouter Models| [https://openrouter.ai/](https://openrouter.ai/) | +| Anthropic | `anthropic` | No | Use Claude models via Anthropic's API. | [console.anthropic.com](https://console.anthropic.com/) | | MiniMax | `minimax` | No | Use MiniMax M2.5 series models (e.g., MiniMax-M2.5).| [platform.minimax.io](https://platform.minimax.io/user-center/basic-information) | *Note:* diff --git a/sources/llm_provider.py b/sources/llm_provider.py index a77dc14..afd6d83 100644 --- a/sources/llm_provider.py +++ b/sources/llm_provider.py @@ -17,6 +17,9 @@ from sources.utility import pretty_print, animate_thinking class Provider: def __init__(self, provider_name, model, server_address="127.0.0.1:5000", is_local=False): self.provider_name = provider_name.lower() + # Normalize provider name aliases (e.g. README documents 'togetherAI' but canonical key is 'together') + _aliases = {"togetherai": "together"} + self.provider_name = _aliases.get(self.provider_name, self.provider_name) self.model = model self.is_local = is_local self.server_ip = server_address @@ -32,13 +35,14 @@ class Provider: "together": self.together_fn, "dsk_deepseek": self.dsk_deepseek, "openrouter": self.openrouter_fn, + "anthropic": self.anthropic_fn, "minimax": self.minimax_fn, "test": self.test_fn } self.logger = Logger("provider.log") self.api_key = None self.internal_url, self.in_docker = self.get_internal_url() - self.unsafe_providers = ["openai", "deepseek", "dsk_deepseek", "together", "google", "openrouter", "minimax"] + self.unsafe_providers = ["openai", "deepseek", "dsk_deepseek", "together", "google", "openrouter", "anthropic", "minimax"] if self.provider_name not in self.available_providers: raise ValueError(f"Unknown provider: {provider_name}") if self.provider_name in self.unsafe_providers and self.is_local == False: @@ -388,7 +392,6 @@ class Provider: if "LM Studio" in str(e): raise # Re-raise our custom exceptions raise Exception(f"Unexpected error: {str(e)}") from e - return thought def openrouter_fn(self, history, verbose=False): """ @@ -468,13 +471,13 @@ class Provider: if chunk['type'] == 'text': thought += chunk['content'] return thought - except AuthenticationError: + except AuthenticationError as e: raise AuthenticationError("Authentication failed. Please check your token.") from e - except RateLimitError: + except RateLimitError as e: raise RateLimitError("Rate limit exceeded. Please wait before making more requests.") from e except CloudflareError as e: raise CloudflareError(f"Cloudflare protection encountered: {str(e)}") from e - except NetworkError: + except NetworkError as e: raise NetworkError("Network error occurred. Check your internet connection.") from e except APIError as e: raise APIError(f"API error occurred: {str(e)}") from e