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
This commit is contained in:
Octopus
2026-04-05 10:41:54 +08:00
parent 1036c5fbc1
commit 2b8bc83a97
2 changed files with 9 additions and 5 deletions
+1
View File
@@ -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:*
+8 -5
View File
@@ -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