| 
                        123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138 | 
                        - import json
 - import logging
 - from typing import Optional, Union
 - 
 - import anthropic
 - from langchain.chat_models import ChatAnthropic
 - from langchain.schema import HumanMessage
 - 
 - from core import hosted_llm_credentials
 - from core.llm.error import ProviderTokenNotInitError
 - from core.llm.provider.base import BaseProvider
 - from core.llm.provider.errors import ValidateFailedError
 - from models.provider import ProviderName, ProviderType
 - 
 - 
 - class AnthropicProvider(BaseProvider):
 -     def get_models(self, model_id: Optional[str] = None) -> list[dict]:
 -         return [
 -             {
 -                 'id': 'claude-instant-1',
 -                 'name': 'claude-instant-1',
 -             },
 -             {
 -                 'id': 'claude-2',
 -                 'name': 'claude-2',
 -             },
 -         ]
 - 
 -     def get_credentials(self, model_id: Optional[str] = None) -> dict:
 -         return self.get_provider_api_key(model_id=model_id)
 - 
 -     def get_provider_name(self):
 -         return ProviderName.ANTHROPIC
 - 
 -     def get_provider_configs(self, obfuscated: bool = False, only_custom: bool = False) -> Union[str | dict]:
 -         """
 -         Returns the provider configs.
 -         """
 -         try:
 -             config = self.get_provider_api_key(only_custom=only_custom)
 -         except:
 -             config = {
 -                 'anthropic_api_key': ''
 -             }
 - 
 -         if obfuscated:
 -             if not config.get('anthropic_api_key'):
 -                 config = {
 -                     'anthropic_api_key': ''
 -                 }
 - 
 -             config['anthropic_api_key'] = self.obfuscated_token(config.get('anthropic_api_key'))
 -             return config
 - 
 -         return config
 - 
 -     def get_encrypted_token(self, config: Union[dict | str]):
 -         """
 -         Returns the encrypted token.
 -         """
 -         return json.dumps({
 -             'anthropic_api_key': self.encrypt_token(config['anthropic_api_key'])
 -         })
 - 
 -     def get_decrypted_token(self, token: str):
 -         """
 -         Returns the decrypted token.
 -         """
 -         config = json.loads(token)
 -         config['anthropic_api_key'] = self.decrypt_token(config['anthropic_api_key'])
 -         return config
 - 
 -     def get_token_type(self):
 -         return dict
 - 
 -     def config_validate(self, config: Union[dict | str]):
 -         """
 -         Validates the given config.
 -         """
 -         # check OpenAI / Azure OpenAI credential is valid
 -         openai_provider = BaseProvider.get_valid_provider(self.tenant_id, ProviderName.OPENAI.value)
 -         azure_openai_provider = BaseProvider.get_valid_provider(self.tenant_id, ProviderName.AZURE_OPENAI.value)
 - 
 -         provider = None
 -         if openai_provider:
 -             provider = openai_provider
 -         elif azure_openai_provider:
 -             provider = azure_openai_provider
 - 
 -         if not provider:
 -             raise ValidateFailedError(f"OpenAI or Azure OpenAI provider must be configured first.")
 - 
 -         if provider.provider_type == ProviderType.SYSTEM.value:
 -             quota_used = provider.quota_used if provider.quota_used is not None else 0
 -             quota_limit = provider.quota_limit if provider.quota_limit is not None else 0
 -             if quota_used >= quota_limit:
 -                 raise ValidateFailedError(f"Your quota for Dify Hosted OpenAI has been exhausted, "
 -                                           f"please configure OpenAI or Azure OpenAI provider first.")
 - 
 -         try:
 -             if not isinstance(config, dict):
 -                 raise ValueError('Config must be a object.')
 - 
 -             if 'anthropic_api_key' not in config:
 -                 raise ValueError('anthropic_api_key must be provided.')
 - 
 -             chat_llm = ChatAnthropic(
 -                 model='claude-instant-1',
 -                 anthropic_api_key=config['anthropic_api_key'],
 -                 max_tokens_to_sample=10,
 -                 temperature=0,
 -                 default_request_timeout=60
 -             )
 - 
 -             messages = [
 -                 HumanMessage(
 -                     content="ping"
 -                 )
 -             ]
 - 
 -             chat_llm(messages)
 -         except anthropic.APIConnectionError as ex:
 -             raise ValidateFailedError(f"Anthropic: Connection error, cause: {ex.__cause__}")
 -         except (anthropic.APIStatusError, anthropic.RateLimitError) as ex:
 -             raise ValidateFailedError(f"Anthropic: Error code: {ex.status_code} - "
 -                                       f"{ex.body['error']['type']}: {ex.body['error']['message']}")
 -         except Exception as ex:
 -             logging.exception('Anthropic config validation failed')
 -             raise ex
 - 
 -     def get_hosted_credentials(self) -> Union[str | dict]:
 -         if not hosted_llm_credentials.anthropic or not hosted_llm_credentials.anthropic.api_key:
 -             raise ProviderTokenNotInitError(
 -                 f"No valid {self.get_provider_name().value} model provider credentials found. "
 -                 f"Please go to Settings -> Model Provider to complete your provider credentials."
 -             )
 - 
 -         return {'anthropic_api_key': hosted_llm_credentials.anthropic.api_key}
 
 
  |