camel icon indicating copy to clipboard operation
camel copied to clipboard

[BUG] TypeError: "Could not resolve authentication method. Expected either api_key or auth_token to be set. Or for one of the `X-Api-Key` or `Authorization` headers to be explicitly omitted"

Open jacksonzhang348 opened this issue 8 months ago • 3 comments

Required prerequisites

What version of camel are you using?

0.2.45

System information

3.10.9 (main, Apr 19 2023, 00:02:01) [Clang 14.0.0 (clang-1400.0.29.202)] darwin 0.2.45

Problem description

在使用 Camel 库的 ChatAgent 与 Anthropic Claude 模型交互时,遇到认证错误。当通过 ModelFactory 创建 ANTHROPIC 平台的模型并尝试使用时,系统抛出 TypeError 异常,提示无法解析认证方法。

错误信息:
Traceback (most recent call last): File "/Users/zhangjianlin/.pyenv/versions/3.10.9/lib/python3.10/runpy.py", line 196, in _run_module_as_main return _run_code(code, main_globals, None, File "/Users/zhangjianlin/.pyenv/versions/3.10.9/lib/python3.10/runpy.py", line 86, in _run_code exec(code, run_globals) File "/Volumes/WD_BLACK/pythonpro/apps/svg_app/main.py", line 81, in sys.exit(main()) File "/Volumes/WD_BLACK/pythonpro/apps/svg_app/main.py", line 66, in main svg_result = svg_agent_crew.process_claude( File "/Volumes/WD_BLACK/pythonpro/agents/svg_agent/svg_agent_crew.py", line 111, in process_claude return claude_agent.step(svg_content) File "/Volumes/WD_BLACK/pythonpro/.venv/lib/python3.10/site-packages/camel/agents/chat_agent.py", line 603, in step openai_messages, num_tokens = self.memory.get_context() File "/Volumes/WD_BLACK/pythonpro/.venv/lib/python3.10/site-packages/camel/memories/base.py", line 150, in get_context return self.get_context_creator().create_context(self.retrieve()) File "/Volumes/WD_BLACK/pythonpro/.venv/lib/python3.10/site-packages/camel/memories/context_creators/score_based.py", line 93, in create_context system_unit, regular_units = self._extract_system_message(records) File "/Volumes/WD_BLACK/pythonpro/.venv/lib/python3.10/site-packages/camel/memories/context_creators/score_based.py", line 210, in _extract_system_message tokens = self.token_counter.count_tokens_from_messages([message]) File "/Volumes/WD_BLACK/pythonpro/.venv/lib/python3.10/site-packages/camel/utils/commons.py", line 220, in wrapper return func(*args, **kwargs) File "/Volumes/WD_BLACK/pythonpro/.venv/lib/python3.10/site-packages/camel/utils/token_counting.py", line 304, in count_tokens_from_messages return self.client.messages.count_tokens( File "/Volumes/WD_BLACK/pythonpro/.venv/lib/python3.10/site-packages/anthropic/resources/messages/messages.py", line 1259, in count_tokens return self._post( File "/Volumes/WD_BLACK/pythonpro/.venv/lib/python3.10/site-packages/anthropic/_base_client.py", line 1337, in post return cast(ResponseT, self.request(cast_to, opts, stream=stream, stream_cls=stream_cls)) File "/Volumes/WD_BLACK/pythonpro/.venv/lib/python3.10/site-packages/anthropic/_base_client.py", line 1014, in request return self._request( File "/Volumes/WD_BLACK/pythonpro/.venv/lib/python3.10/site-packages/anthropic/_base_client.py", line 1040, in _request request = self._build_request(options, retries_taken=retries_taken) File "/Volumes/WD_BLACK/pythonpro/.venv/lib/python3.10/site-packages/anthropic/_base_client.py", line 488, in _build_request headers = self._build_headers(options, retries_taken=retries_taken) File "/Volumes/WD_BLACK/pythonpro/.venv/lib/python3.10/site-packages/anthropic/_base_client.py", line 429, in _build_headers self._validate_headers(headers_dict, custom_headers) File "/Volumes/WD_BLACK/pythonpro/.venv/lib/python3.10/site-packages/anthropic/_client.py", line 181, in _validate_headers raise TypeError( TypeError: "Could not resolve authentication method. Expected either api_key or auth_token to be set. Or for one of the X-Api-Key or Authorization headers to be explicitly omitted"

Reproducible example code

The Python snippets:

from camel.models import ModelFactory
from camel.types import ModelPlatformType, ModelType
from camel.agents import ChatAgent
from camel.toolkits import MathToolkit, SearchToolkit

# 创建 Claude 模型
claude_model = ModelFactory.create(
    model_platform=ModelPlatformType.ANTHROPIC,
    model_type=ModelType.CLAUDE_3_5_SONNET,
    api_key=dependency_injector.open_router.key
    url=dependency_injector.open_router.base_url
)

# 创建 Claude 代理
claude_agent = ChatAgent(
    system_message="You are a helpful assistant.",
    model=claude_model,
    tools=[
        *MathToolkit().get_tools(),
        *SearchToolkit().get_tools(),
    ],
)

# 尝试使用代理
response = claude_agent.step("Hello, who are you?")

Command lines:

python your_script.py

Extra dependencies:

camel-ai
anthropic
dependency_injector

Steps to reproduce:

1.使用上述代码创建 Anthropic Claude 模型和代理 2.尝试调用 claude_agent.step() 方法 3.观察到抛出 TypeError 异常,提示无法解析认证方法

Traceback


Expected behavior

预期 Camel 库应该能够正确处理 Anthropic Claude API 的认证,使用提供的 API 密钥成功创建模型并进行交互,而不是抛出认证错误。

使用 dependency-injector==4.46.0 通过 json文件注入 key 和url。 env 没有设置ANTHROPIC_API_KEY。 通过以下代码初始化了一个claude_model。 使用时候报错

self.claude_model = ModelFactory.create(
            model_platform=ModelPlatformType.ANTHROPIC,
            model_type=ModelType.CLAUDE_3_5_SONNET,
            api_key=self.api_keys.open_router.key,
            url=self.api_keys.open_router.base_url,
        )

源代码 camel/utils/token_counting.py, self.client = Anthropic() 导致业务崩溃

class AnthropicTokenCounter(BaseTokenCounter):
    @dependencies_required('anthropic')
    def __init__(self, model: str):
        r"""Constructor for the token counter for Anthropic models.

        Args:
            model (str): The name of the Anthropic model being used.
        """
        from anthropic import Anthropic

        self.client = Anthropic()       // 崩溃
        self.model = model

Additional context

No response

jacksonzhang348 avatar Apr 17 '25 18:04 jacksonzhang348

ANTHROPIC_API_KEY is set to sk-or-v1-********** ANTHROPIC_API_BASE_URL is set to https://openrouter.ai/api/v1

当我设置了 env环境的 openrouter 的key 后报错下面错误, 应该是 openrouter 平台没有 /v1/messages/count_tokens api 导致。 至少不让client.messages.count_tokens 报错,或提供个降级方案

File "/Volumes/WD_BLACK/pythonpro/apps/svg_app/main.py", line 81, in sys.exit(main()) File "/Volumes/WD_BLACK/pythonpro/apps/svg_app/main.py", line 66, in main svg_result = svg_agent_crew.process_claude( File "/Volumes/WD_BLACK/pythonpro/agents/svg_agent/svg_agent_crew.py", line 110, in process_claude return claude_agent.step(svg_content) File "/Volumes/WD_BLACK/pythonpro/.venv/lib/python3.10/site-packages/camel/agents/chat_agent.py", line 603, in step openai_messages, num_tokens = self.memory.get_context() File "/Volumes/WD_BLACK/pythonpro/.venv/lib/python3.10/site-packages/camel/memories/base.py", line 150, in get_context return self.get_context_creator().create_context(self.retrieve()) File "/Volumes/WD_BLACK/pythonpro/.venv/lib/python3.10/site-packages/camel/memories/context_creators/score_based.py", line 93, in create_context system_unit, regular_units = self._extract_system_message(records) File "/Volumes/WD_BLACK/pythonpro/.venv/lib/python3.10/site-packages/camel/memories/context_creators/score_based.py", line 210, in _extract_system_message tokens = self.token_counter.count_tokens_from_messages([message]) File "/Volumes/WD_BLACK/pythonpro/.venv/lib/python3.10/site-packages/camel/utils/commons.py", line 220, in wrapper return func(*args, **kwargs) File "/Volumes/WD_BLACK/pythonpro/.venv/lib/python3.10/site-packages/camel/utils/token_counting.py", line 304, in count_tokens_from_messages return self.client.messages.count_tokens( File "/Volumes/WD_BLACK/pythonpro/.venv/lib/python3.10/site-packages/anthropic/resources/messages/messages.py", line 1259, in count_tokens return self._post( File "/Volumes/WD_BLACK/pythonpro/.venv/lib/python3.10/site-packages/anthropic/_base_client.py", line 1337, in post return cast(ResponseT, self.request(cast_to, opts, stream=stream, stream_cls=stream_cls)) File "/Volumes/WD_BLACK/pythonpro/.venv/lib/python3.10/site-packages/anthropic/_base_client.py", line 1014, in request return self._request( File "/Volumes/WD_BLACK/pythonpro/.venv/lib/python3.10/site-packages/anthropic/_base_client.py", line 1118, in _request raise self._make_status_error_from_response(err.response) from None anthropic.PermissionDeniedError: Error code: 403 - {'error': {'type': 'forbidden', 'message': 'Request not allowed'}}

jacksonzhang348 avatar Apr 17 '25 19:04 jacksonzhang348

thanks @jacksonzhang348 for reporting this issue! We will look into this and resolve it ASAP

Wendong-Fan avatar Apr 21 '25 10:04 Wendong-Fan

@jacksonzhang348 is this a region restriction? https://docs.anthropic.com/en/api/supported-regions

JINO-ROHIT avatar Apr 21 '25 12:04 JINO-ROHIT

I would like to work on this issue

zhjuzi avatar Apr 29 '25 14:04 zhjuzi

thanks @JINO-ROHIT , @zhjuzi , I think @jacksonzhang348 is trying to calling anthropic using open router, could you try using example code:https://github.com/camel-ai/camel/blob/master/examples/models/openrouter_llama3.1_example%20.py to take a try? I think maybe Anthropic client doesn't accept openrouter key and url?

Wendong-Fan avatar May 02 '25 18:05 Wendong-Fan

thanks @JINO-ROHIT , @zhjuzi , I think @jacksonzhang348 is trying to calling anthropic using open router, could you try using example code:https://github.com/camel-ai/camel/blob/master/examples/models/openrouter_llama3.1_example%20.py to take a try? I think maybe Anthropic client doesn't accept openrouter key and url?

yes. I can only use the open_router platform API and baseURL https://openrouter.ai/api/v1, It will report an error。 You support the baseURL feature, so I think this is a bug

self.claude_model = ModelFactory.create(
            model_platform=ModelPlatformType.ANTHROPIC,
            model_type=ModelType.CLAUDE_3_5_SONNET,
            api_key="sk-or-v1-*********",            
            url="https://openrouter.ai/api/v1",
        )

jacksonzhang348 avatar May 06 '25 06:05 jacksonzhang348

thanks @JINO-ROHIT , @zhjuzi , I think @jacksonzhang348 is trying to calling anthropic using open router, could you try using example code:https://github.com/camel-ai/camel/blob/master/examples/models/openrouter_llama3.1_example%20.py to take a try? I think maybe Anthropic client doesn't accept openrouter key and url?

I am currently using ModelPlatformType OPENROUTER has created a model, it can work.

self.openrouter_model = ModelFactory.create(
            model_platform=ModelPlatformType.OPENROUTER,
            model_type="anthropic/claude-3.7-sonnet",
            api_key=self.api_keys.open_router.key,
            url=self.api_keys.open_router.base_url,
            model_config_dict={"temperature": 0.1},
        )

jacksonzhang348 avatar May 06 '25 06:05 jacksonzhang348

thanks @jacksonzhang348 's feedback, the url for ModelPlatformType.ANTHROPIC should from ANTHROPIC or be accepted by ANTHROPIC

Wendong-Fan avatar May 18 '25 18:05 Wendong-Fan