camel-ai 0.2.59__py3-none-any.whl → 0.2.82__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of camel-ai might be problematic. Click here for more details.
- camel/__init__.py +3 -3
- camel/agents/__init__.py +2 -2
- camel/agents/_types.py +9 -4
- camel/agents/_utils.py +40 -2
- camel/agents/base.py +2 -2
- camel/agents/chat_agent.py +5012 -902
- camel/agents/critic_agent.py +2 -2
- camel/agents/deductive_reasoner_agent.py +56 -56
- camel/agents/embodied_agent.py +2 -2
- camel/agents/knowledge_graph_agent.py +20 -20
- camel/agents/mcp_agent.py +39 -36
- camel/agents/multi_hop_generator_agent.py +3 -3
- camel/agents/programmed_agent_instruction.py +2 -2
- camel/agents/repo_agent.py +4 -3
- camel/agents/role_assignment_agent.py +2 -2
- camel/agents/search_agent.py +2 -2
- camel/agents/task_agent.py +2 -2
- camel/agents/tool_agents/__init__.py +2 -2
- camel/agents/tool_agents/base.py +2 -2
- camel/agents/tool_agents/hugging_face_tool_agent.py +3 -3
- camel/benchmarks/__init__.py +2 -2
- camel/benchmarks/apibank.py +5 -5
- camel/benchmarks/apibench.py +2 -2
- camel/benchmarks/base.py +2 -2
- camel/benchmarks/browsecomp.py +44 -33
- camel/benchmarks/gaia.py +17 -13
- camel/benchmarks/mock_website/README.md +94 -0
- camel/benchmarks/mock_website/mock_web.py +299 -0
- camel/benchmarks/mock_website/requirements.txt +3 -0
- camel/benchmarks/mock_website/shopping_mall/app.py +465 -0
- camel/benchmarks/mock_website/task.json +104 -0
- camel/benchmarks/nexus.py +3 -3
- camel/benchmarks/ragbench.py +2 -2
- camel/bots/__init__.py +2 -2
- camel/bots/discord/__init__.py +2 -2
- camel/bots/discord/discord_app.py +2 -2
- camel/bots/discord/discord_installation.py +2 -2
- camel/bots/discord/discord_store.py +3 -3
- camel/bots/slack/__init__.py +2 -2
- camel/bots/slack/models.py +4 -4
- camel/bots/slack/slack_app.py +2 -2
- camel/bots/telegram_bot.py +2 -2
- camel/configs/__init__.py +26 -2
- camel/configs/aihubmix_config.py +90 -0
- camel/configs/aiml_config.py +2 -2
- camel/configs/amd_config.py +70 -0
- camel/configs/anthropic_config.py +8 -7
- camel/configs/base_config.py +2 -2
- camel/configs/bedrock_config.py +5 -3
- camel/configs/cerebras_config.py +98 -0
- camel/configs/cohere_config.py +3 -3
- camel/configs/cometapi_config.py +106 -0
- camel/configs/crynux_config.py +94 -0
- camel/configs/deepseek_config.py +9 -8
- camel/configs/gemini_config.py +6 -4
- camel/configs/groq_config.py +6 -4
- camel/configs/internlm_config.py +6 -4
- camel/configs/litellm_config.py +2 -2
- camel/configs/lmstudio_config.py +6 -4
- camel/configs/minimax_config.py +95 -0
- camel/configs/mistral_config.py +3 -3
- camel/configs/modelscope_config.py +5 -3
- camel/configs/moonshot_config.py +2 -2
- camel/configs/nebius_config.py +105 -0
- camel/configs/netmind_config.py +2 -2
- camel/configs/novita_config.py +2 -2
- camel/configs/nvidia_config.py +2 -2
- camel/configs/ollama_config.py +2 -2
- camel/configs/openai_config.py +8 -3
- camel/configs/openrouter_config.py +6 -4
- camel/configs/ppio_config.py +2 -2
- camel/configs/qianfan_config.py +85 -0
- camel/configs/qwen_config.py +2 -2
- camel/configs/reka_config.py +3 -3
- camel/configs/samba_config.py +8 -6
- camel/configs/sglang_config.py +2 -2
- camel/configs/siliconflow_config.py +2 -2
- camel/configs/togetherai_config.py +2 -2
- camel/configs/vllm_config.py +4 -2
- camel/configs/watsonx_config.py +2 -2
- camel/configs/yi_config.py +6 -4
- camel/configs/zhipuai_config.py +6 -4
- camel/{data_collector → data_collectors}/__init__.py +2 -2
- camel/{data_collector → data_collectors}/alpaca_collector.py +19 -10
- camel/{data_collector → data_collectors}/base.py +2 -2
- camel/{data_collector → data_collectors}/sharegpt_collector.py +3 -3
- camel/datagen/__init__.py +2 -2
- camel/datagen/cot_datagen.py +32 -37
- camel/datagen/evol_instruct/__init__.py +2 -2
- camel/datagen/evol_instruct/evol_instruct.py +2 -2
- camel/datagen/evol_instruct/scorer.py +24 -25
- camel/datagen/evol_instruct/templates.py +48 -48
- camel/datagen/self_improving_cot.py +5 -5
- camel/datagen/self_instruct/__init__.py +2 -2
- camel/datagen/self_instruct/filter/__init__.py +2 -2
- camel/datagen/self_instruct/filter/filter_function.py +2 -2
- camel/datagen/self_instruct/filter/filter_registry.py +2 -2
- camel/datagen/self_instruct/filter/instruction_filter.py +2 -2
- camel/datagen/self_instruct/self_instruct.py +2 -2
- camel/datagen/self_instruct/templates.py +47 -47
- camel/datagen/source2synth/__init__.py +2 -2
- camel/datagen/source2synth/data_processor.py +2 -2
- camel/datagen/source2synth/models.py +2 -2
- camel/datagen/source2synth/user_data_processor_config.py +2 -2
- camel/datahubs/__init__.py +2 -2
- camel/datahubs/base.py +2 -2
- camel/datahubs/huggingface.py +2 -2
- camel/datahubs/models.py +2 -2
- camel/datasets/__init__.py +2 -2
- camel/datasets/base_generator.py +41 -12
- camel/datasets/few_shot_generator.py +18 -18
- camel/datasets/models.py +3 -3
- camel/datasets/self_instruct_generator.py +2 -2
- camel/datasets/static_dataset.py +152 -2
- camel/embeddings/__init__.py +2 -2
- camel/embeddings/azure_embedding.py +2 -2
- camel/embeddings/base.py +2 -2
- camel/embeddings/gemini_embedding.py +2 -2
- camel/embeddings/jina_embedding.py +10 -3
- camel/embeddings/mistral_embedding.py +2 -2
- camel/embeddings/openai_compatible_embedding.py +2 -2
- camel/embeddings/openai_embedding.py +2 -2
- camel/embeddings/sentence_transformers_embeddings.py +4 -4
- camel/embeddings/together_embedding.py +2 -2
- camel/embeddings/vlm_embedding.py +11 -4
- camel/environments/__init__.py +14 -2
- camel/environments/models.py +2 -2
- camel/environments/multi_step.py +2 -2
- camel/environments/rlcards_env.py +860 -0
- camel/environments/single_step.py +30 -5
- camel/environments/tic_tac_toe.py +3 -3
- camel/extractors/__init__.py +2 -2
- camel/extractors/base.py +2 -2
- camel/extractors/python_strategies.py +2 -2
- camel/generators.py +2 -2
- camel/human.py +2 -2
- camel/interpreters/__init__.py +4 -2
- camel/interpreters/base.py +16 -3
- camel/interpreters/docker/Dockerfile +53 -7
- camel/interpreters/docker_interpreter.py +70 -11
- camel/interpreters/e2b_interpreter.py +59 -11
- camel/interpreters/internal_python_interpreter.py +81 -4
- camel/interpreters/interpreter_error.py +2 -2
- camel/interpreters/ipython_interpreter.py +23 -5
- camel/interpreters/microsandbox_interpreter.py +395 -0
- camel/interpreters/subprocess_interpreter.py +36 -4
- camel/loaders/__init__.py +17 -5
- camel/loaders/apify_reader.py +2 -2
- camel/loaders/base_io.py +2 -2
- camel/loaders/base_loader.py +85 -0
- camel/loaders/chunkr_reader.py +128 -93
- camel/loaders/crawl4ai_reader.py +2 -2
- camel/loaders/firecrawl_reader.py +6 -6
- camel/loaders/jina_url_reader.py +2 -2
- camel/loaders/markitdown.py +2 -2
- camel/loaders/mineru_extractor.py +2 -2
- camel/loaders/mistral_reader.py +148 -0
- camel/loaders/scrapegraph_reader.py +2 -2
- camel/loaders/unstructured_io.py +2 -2
- camel/logger.py +5 -5
- camel/memories/__init__.py +2 -2
- camel/memories/agent_memories.py +86 -3
- camel/memories/base.py +36 -2
- camel/memories/blocks/__init__.py +2 -2
- camel/memories/blocks/chat_history_block.py +126 -9
- camel/memories/blocks/vectordb_block.py +10 -3
- camel/memories/context_creators/__init__.py +2 -2
- camel/memories/context_creators/score_based.py +31 -239
- camel/memories/records.py +98 -13
- camel/messages/__init__.py +2 -2
- camel/messages/base.py +193 -46
- camel/messages/conversion/__init__.py +2 -2
- camel/messages/conversion/alpaca.py +2 -2
- camel/messages/conversion/conversation_models.py +2 -2
- camel/messages/conversion/sharegpt/__init__.py +2 -2
- camel/messages/conversion/sharegpt/function_call_formatter.py +2 -2
- camel/messages/conversion/sharegpt/hermes/__init__.py +2 -2
- camel/messages/conversion/sharegpt/hermes/hermes_function_formatter.py +2 -2
- camel/messages/func_message.py +54 -17
- camel/models/__init__.py +18 -2
- camel/models/_utils.py +3 -3
- camel/models/aihubmix_model.py +83 -0
- camel/models/aiml_model.py +11 -18
- camel/models/amd_model.py +101 -0
- camel/models/anthropic_model.py +127 -20
- camel/models/aws_bedrock_model.py +12 -35
- camel/models/azure_openai_model.py +263 -63
- camel/models/base_audio_model.py +5 -3
- camel/models/base_model.py +195 -26
- camel/models/cerebras_model.py +83 -0
- camel/models/cohere_model.py +81 -21
- camel/models/cometapi_model.py +83 -0
- camel/models/crynux_model.py +87 -0
- camel/models/deepseek_model.py +61 -59
- camel/models/fish_audio_model.py +8 -2
- camel/models/gemini_model.py +439 -30
- camel/models/groq_model.py +11 -19
- camel/models/internlm_model.py +11 -18
- camel/models/litellm_model.py +94 -34
- camel/models/lmstudio_model.py +17 -20
- camel/models/minimax_model.py +83 -0
- camel/models/mistral_model.py +84 -19
- camel/models/model_factory.py +49 -6
- camel/models/model_manager.py +33 -11
- camel/models/modelscope_model.py +13 -193
- camel/models/moonshot_model.py +195 -21
- camel/models/nebius_model.py +83 -0
- camel/models/nemotron_model.py +19 -9
- camel/models/netmind_model.py +11 -18
- camel/models/novita_model.py +11 -18
- camel/models/nvidia_model.py +11 -18
- camel/models/ollama_model.py +14 -21
- camel/models/openai_audio_models.py +2 -2
- camel/models/openai_compatible_model.py +234 -27
- camel/models/openai_model.py +255 -39
- camel/models/openrouter_model.py +11 -19
- camel/models/ppio_model.py +11 -18
- camel/models/qianfan_model.py +89 -0
- camel/models/qwen_model.py +13 -193
- camel/models/reka_model.py +90 -21
- camel/models/reward/__init__.py +2 -2
- camel/models/reward/base_reward_model.py +2 -2
- camel/models/reward/evaluator.py +2 -2
- camel/models/reward/nemotron_model.py +2 -2
- camel/models/reward/skywork_model.py +2 -2
- camel/models/samba_model.py +117 -49
- camel/models/sglang_model.py +162 -42
- camel/models/siliconflow_model.py +12 -35
- camel/models/stub_model.py +10 -7
- camel/models/togetherai_model.py +11 -18
- camel/models/vllm_model.py +10 -18
- camel/models/volcano_model.py +16 -20
- camel/models/watsonx_model.py +69 -19
- camel/models/yi_model.py +11 -18
- camel/models/zhipuai_model.py +70 -18
- camel/parsers/__init__.py +18 -0
- camel/parsers/mcp_tool_call_parser.py +176 -0
- camel/personas/__init__.py +2 -2
- camel/personas/persona.py +2 -2
- camel/personas/persona_hub.py +2 -2
- camel/prompts/__init__.py +2 -2
- camel/prompts/ai_society.py +2 -2
- camel/prompts/base.py +2 -2
- camel/prompts/code.py +2 -2
- camel/prompts/evaluation.py +2 -2
- camel/prompts/generate_text_embedding_data.py +2 -2
- camel/prompts/image_craft.py +2 -2
- camel/prompts/misalignment.py +2 -2
- camel/prompts/multi_condition_image_craft.py +2 -2
- camel/prompts/object_recognition.py +2 -2
- camel/prompts/persona_hub.py +3 -3
- camel/prompts/prompt_templates.py +2 -2
- camel/prompts/role_description_prompt_template.py +2 -2
- camel/prompts/solution_extraction.py +8 -8
- camel/prompts/task_prompt_template.py +2 -2
- camel/prompts/translation.py +2 -2
- camel/prompts/video_description_prompt.py +3 -3
- camel/responses/__init__.py +2 -2
- camel/responses/agent_responses.py +2 -2
- camel/retrievers/__init__.py +2 -2
- camel/retrievers/auto_retriever.py +23 -3
- camel/retrievers/base.py +2 -2
- camel/retrievers/bm25_retriever.py +3 -4
- camel/retrievers/cohere_rerank_retriever.py +2 -2
- camel/retrievers/hybrid_retrival.py +4 -4
- camel/retrievers/vector_retriever.py +2 -2
- camel/runtimes/Dockerfile.multi-toolkit +90 -0
- camel/{runtime → runtimes}/__init__.py +2 -2
- camel/runtimes/api.py +153 -0
- camel/{runtime → runtimes}/base.py +2 -2
- camel/{runtime → runtimes}/configs.py +13 -13
- camel/{runtime → runtimes}/daytona_runtime.py +18 -19
- camel/{runtime → runtimes}/docker_runtime.py +13 -13
- camel/{runtime → runtimes}/llm_guard_runtime.py +28 -28
- camel/{runtime → runtimes}/remote_http_runtime.py +12 -12
- camel/{runtime → runtimes}/ubuntu_docker_runtime.py +3 -3
- camel/{runtime → runtimes}/utils/__init__.py +2 -2
- camel/{runtime → runtimes}/utils/function_risk_toolkit.py +2 -2
- camel/{runtime → runtimes}/utils/ignore_risk_toolkit.py +2 -2
- camel/schemas/__init__.py +2 -2
- camel/schemas/base.py +2 -2
- camel/schemas/openai_converter.py +3 -3
- camel/schemas/outlines_converter.py +2 -2
- camel/services/agent_openapi_server.py +380 -0
- camel/societies/__init__.py +4 -2
- camel/societies/babyagi_playing.py +2 -2
- camel/societies/role_playing.py +201 -80
- camel/societies/workforce/__init__.py +10 -3
- camel/societies/workforce/base.py +9 -5
- camel/societies/workforce/events.py +143 -0
- camel/societies/workforce/prompts.py +258 -33
- camel/societies/workforce/role_playing_worker.py +95 -30
- camel/societies/workforce/single_agent_worker.py +659 -30
- camel/societies/workforce/structured_output_handler.py +512 -0
- camel/societies/workforce/task_channel.py +182 -38
- camel/societies/workforce/utils.py +784 -18
- camel/societies/workforce/worker.py +96 -28
- camel/societies/workforce/workflow_memory_manager.py +1746 -0
- camel/societies/workforce/workforce.py +5730 -366
- camel/societies/workforce/workforce_callback.py +103 -0
- camel/societies/workforce/workforce_logger.py +647 -0
- camel/societies/workforce/workforce_metrics.py +33 -0
- camel/storages/__init__.py +10 -2
- camel/storages/graph_storages/__init__.py +2 -2
- camel/storages/graph_storages/base.py +2 -2
- camel/storages/graph_storages/graph_element.py +2 -2
- camel/storages/graph_storages/nebula_graph.py +4 -4
- camel/storages/graph_storages/neo4j_graph.py +7 -7
- camel/storages/key_value_storages/__init__.py +2 -2
- camel/storages/key_value_storages/base.py +2 -2
- camel/storages/key_value_storages/in_memory.py +2 -2
- camel/storages/key_value_storages/json.py +17 -4
- camel/storages/key_value_storages/mem0_cloud.py +50 -49
- camel/storages/key_value_storages/redis.py +2 -2
- camel/storages/object_storages/__init__.py +2 -2
- camel/storages/object_storages/amazon_s3.py +2 -2
- camel/storages/object_storages/azure_blob.py +2 -2
- camel/storages/object_storages/base.py +2 -2
- camel/storages/object_storages/google_cloud.py +3 -3
- camel/storages/vectordb_storages/__init__.py +12 -2
- camel/storages/vectordb_storages/base.py +2 -2
- camel/storages/vectordb_storages/chroma.py +731 -0
- camel/storages/vectordb_storages/faiss.py +712 -0
- camel/storages/vectordb_storages/milvus.py +2 -2
- camel/storages/vectordb_storages/oceanbase.py +16 -17
- camel/storages/vectordb_storages/pgvector.py +349 -0
- camel/storages/vectordb_storages/qdrant.py +6 -6
- camel/storages/vectordb_storages/surreal.py +372 -0
- camel/storages/vectordb_storages/tidb.py +11 -8
- camel/storages/vectordb_storages/weaviate.py +714 -0
- camel/tasks/__init__.py +2 -2
- camel/tasks/task.py +366 -27
- camel/tasks/task_prompt.py +3 -3
- camel/terminators/__init__.py +2 -2
- camel/terminators/base.py +2 -2
- camel/terminators/response_terminator.py +2 -2
- camel/terminators/token_limit_terminator.py +2 -2
- camel/toolkits/__init__.py +58 -10
- camel/toolkits/aci_toolkit.py +66 -21
- camel/toolkits/arxiv_toolkit.py +8 -8
- camel/toolkits/ask_news_toolkit.py +2 -2
- camel/toolkits/async_browser_toolkit.py +174 -575
- camel/toolkits/audio_analysis_toolkit.py +3 -3
- camel/toolkits/base.py +65 -7
- camel/toolkits/bohrium_toolkit.py +318 -0
- camel/toolkits/browser_toolkit.py +306 -566
- camel/toolkits/browser_toolkit_commons.py +568 -0
- camel/toolkits/code_execution.py +67 -11
- camel/toolkits/context_summarizer_toolkit.py +684 -0
- camel/toolkits/craw4ai_toolkit.py +93 -0
- camel/toolkits/dappier_toolkit.py +12 -8
- camel/toolkits/data_commons_toolkit.py +2 -2
- camel/toolkits/dingtalk.py +1135 -0
- camel/toolkits/earth_science_toolkit.py +5367 -0
- camel/toolkits/edgeone_pages_mcp_toolkit.py +49 -0
- camel/toolkits/excel_toolkit.py +910 -70
- camel/toolkits/file_toolkit.py +1402 -0
- camel/toolkits/function_tool.py +128 -20
- camel/toolkits/github_toolkit.py +148 -43
- camel/toolkits/gmail_toolkit.py +1839 -0
- camel/toolkits/google_calendar_toolkit.py +40 -6
- camel/toolkits/google_drive_mcp_toolkit.py +54 -0
- camel/toolkits/google_maps_toolkit.py +2 -2
- camel/toolkits/google_scholar_toolkit.py +2 -2
- camel/toolkits/human_toolkit.py +36 -12
- camel/toolkits/hybrid_browser_toolkit/__init__.py +18 -0
- camel/toolkits/hybrid_browser_toolkit/config_loader.py +185 -0
- camel/toolkits/hybrid_browser_toolkit/hybrid_browser_toolkit.py +246 -0
- camel/toolkits/hybrid_browser_toolkit/hybrid_browser_toolkit_ts.py +1973 -0
- camel/toolkits/hybrid_browser_toolkit/installer.py +203 -0
- camel/toolkits/hybrid_browser_toolkit/ts/package-lock.json +4589 -0
- camel/toolkits/hybrid_browser_toolkit/ts/package.json +33 -0
- camel/toolkits/hybrid_browser_toolkit/ts/src/browser-scripts.js +125 -0
- camel/toolkits/hybrid_browser_toolkit/ts/src/browser-session.ts +1929 -0
- camel/toolkits/hybrid_browser_toolkit/ts/src/config-loader.ts +233 -0
- camel/toolkits/hybrid_browser_toolkit/ts/src/hybrid-browser-toolkit.ts +589 -0
- camel/toolkits/hybrid_browser_toolkit/ts/src/index.ts +7 -0
- camel/toolkits/hybrid_browser_toolkit/ts/src/parent-child-filter.ts +226 -0
- camel/toolkits/hybrid_browser_toolkit/ts/src/snapshot-parser.ts +219 -0
- camel/toolkits/hybrid_browser_toolkit/ts/src/som-screenshot-injected.ts +543 -0
- camel/toolkits/hybrid_browser_toolkit/ts/src/types.ts +129 -0
- camel/toolkits/hybrid_browser_toolkit/ts/tsconfig.json +27 -0
- camel/toolkits/hybrid_browser_toolkit/ts/websocket-server.js +319 -0
- camel/toolkits/hybrid_browser_toolkit/ws_wrapper.py +1037 -0
- camel/toolkits/hybrid_browser_toolkit_py/__init__.py +17 -0
- camel/toolkits/hybrid_browser_toolkit_py/actions.py +575 -0
- camel/toolkits/hybrid_browser_toolkit_py/agent.py +311 -0
- camel/toolkits/hybrid_browser_toolkit_py/browser_session.py +787 -0
- camel/toolkits/hybrid_browser_toolkit_py/config_loader.py +490 -0
- camel/toolkits/hybrid_browser_toolkit_py/hybrid_browser_toolkit.py +2390 -0
- camel/toolkits/hybrid_browser_toolkit_py/snapshot.py +233 -0
- camel/toolkits/hybrid_browser_toolkit_py/stealth_script.js +0 -0
- camel/toolkits/hybrid_browser_toolkit_py/unified_analyzer.js +1043 -0
- camel/toolkits/image_analysis_toolkit.py +3 -3
- camel/toolkits/image_generation_toolkit.py +390 -0
- camel/toolkits/jina_reranker_toolkit.py +195 -79
- camel/toolkits/klavis_toolkit.py +7 -3
- camel/toolkits/linkedin_toolkit.py +2 -2
- camel/toolkits/markitdown_toolkit.py +104 -0
- camel/toolkits/math_toolkit.py +66 -12
- camel/toolkits/mcp_toolkit.py +841 -600
- camel/toolkits/memory_toolkit.py +7 -3
- camel/toolkits/meshy_toolkit.py +2 -2
- camel/toolkits/message_agent_toolkit.py +608 -0
- camel/toolkits/message_integration.py +724 -0
- camel/toolkits/mineru_toolkit.py +2 -2
- camel/toolkits/minimax_mcp_toolkit.py +195 -0
- camel/toolkits/networkx_toolkit.py +2 -2
- camel/toolkits/note_taking_toolkit.py +277 -0
- camel/toolkits/notion_mcp_toolkit.py +224 -0
- camel/toolkits/notion_toolkit.py +2 -2
- camel/toolkits/open_api_specs/biztoc/__init__.py +2 -2
- camel/toolkits/open_api_specs/biztoc/ai-plugin.json +1 -1
- camel/toolkits/open_api_specs/coursera/__init__.py +2 -2
- camel/toolkits/open_api_specs/create_qr_code/__init__.py +2 -2
- camel/toolkits/open_api_specs/klarna/__init__.py +2 -2
- camel/toolkits/open_api_specs/nasa_apod/__init__.py +2 -2
- camel/toolkits/open_api_specs/outschool/__init__.py +2 -2
- camel/toolkits/open_api_specs/outschool/ai-plugin.json +1 -1
- camel/toolkits/open_api_specs/outschool/openapi.yaml +1 -1
- camel/toolkits/open_api_specs/outschool/paths/__init__.py +2 -2
- camel/toolkits/open_api_specs/outschool/paths/get_classes.py +2 -2
- camel/toolkits/open_api_specs/outschool/paths/search_teachers.py +2 -2
- camel/toolkits/open_api_specs/security_config.py +2 -2
- camel/toolkits/open_api_specs/speak/__init__.py +2 -2
- camel/toolkits/open_api_specs/web_scraper/__init__.py +2 -2
- camel/toolkits/open_api_specs/web_scraper/ai-plugin.json +1 -1
- camel/toolkits/open_api_specs/web_scraper/paths/__init__.py +2 -2
- camel/toolkits/open_api_specs/web_scraper/paths/scraper.py +2 -2
- camel/toolkits/open_api_toolkit.py +2 -2
- camel/toolkits/openbb_toolkit.py +7 -3
- camel/toolkits/origene_mcp_toolkit.py +56 -0
- camel/toolkits/page_script.js +86 -74
- camel/toolkits/playwright_mcp_toolkit.py +27 -32
- camel/toolkits/pptx_toolkit.py +790 -0
- camel/toolkits/pubmed_toolkit.py +2 -2
- camel/toolkits/pulse_mcp_search_toolkit.py +2 -2
- camel/toolkits/pyautogui_toolkit.py +2 -2
- camel/toolkits/reddit_toolkit.py +2 -2
- camel/toolkits/resend_toolkit.py +168 -0
- camel/toolkits/retrieval_toolkit.py +2 -2
- camel/toolkits/screenshot_toolkit.py +213 -0
- camel/toolkits/search_toolkit.py +539 -146
- camel/toolkits/searxng_toolkit.py +2 -2
- camel/toolkits/semantic_scholar_toolkit.py +2 -2
- camel/toolkits/slack_toolkit.py +108 -58
- camel/toolkits/sql_toolkit.py +712 -0
- camel/toolkits/stripe_toolkit.py +2 -2
- camel/toolkits/sympy_toolkit.py +3 -3
- camel/toolkits/task_planning_toolkit.py +134 -0
- camel/toolkits/terminal_toolkit/__init__.py +18 -0
- camel/toolkits/terminal_toolkit/terminal_toolkit.py +1070 -0
- camel/toolkits/terminal_toolkit/utils.py +532 -0
- camel/toolkits/thinking_toolkit.py +3 -3
- camel/toolkits/twitter_toolkit.py +8 -3
- camel/toolkits/vertex_ai_veo_toolkit.py +590 -0
- camel/toolkits/video_analysis_toolkit.py +112 -29
- camel/toolkits/video_download_toolkit.py +22 -16
- camel/toolkits/weather_toolkit.py +2 -2
- camel/toolkits/web_deploy_toolkit.py +1219 -0
- camel/toolkits/wechat_official_toolkit.py +483 -0
- camel/toolkits/whatsapp_toolkit.py +2 -2
- camel/toolkits/wolfram_alpha_toolkit.py +53 -25
- camel/toolkits/zapier_toolkit.py +7 -3
- camel/types/__init__.py +4 -4
- camel/types/agents/__init__.py +2 -2
- camel/types/agents/tool_calling_record.py +6 -3
- camel/types/enums.py +454 -35
- camel/types/mcp_registries.py +2 -2
- camel/types/openai_types.py +4 -4
- camel/types/unified_model_type.py +43 -6
- camel/utils/__init__.py +20 -2
- camel/utils/async_func.py +2 -2
- camel/utils/chunker/__init__.py +2 -2
- camel/utils/chunker/base.py +2 -2
- camel/utils/chunker/code_chunker.py +2 -2
- camel/utils/chunker/uio_chunker.py +2 -2
- camel/utils/commons.py +65 -7
- camel/utils/constants.py +5 -2
- camel/utils/context_utils.py +1134 -0
- camel/utils/deduplication.py +2 -2
- camel/utils/filename.py +2 -2
- camel/utils/langfuse.py +258 -0
- camel/utils/mcp.py +140 -6
- camel/utils/mcp_client.py +1056 -0
- camel/utils/message_summarizer.py +148 -0
- camel/utils/response_format.py +2 -2
- camel/utils/token_counting.py +45 -22
- camel/utils/tool_result.py +44 -0
- camel/verifiers/__init__.py +2 -2
- camel/verifiers/base.py +2 -2
- camel/verifiers/math_verifier.py +2 -2
- camel/verifiers/models.py +2 -2
- camel/verifiers/physics_verifier.py +2 -2
- camel/verifiers/python_verifier.py +2 -2
- {camel_ai-0.2.59.dist-info → camel_ai-0.2.82.dist-info}/METADATA +349 -108
- camel_ai-0.2.82.dist-info/RECORD +507 -0
- {camel_ai-0.2.59.dist-info → camel_ai-0.2.82.dist-info}/WHEEL +1 -1
- {camel_ai-0.2.59.dist-info → camel_ai-0.2.82.dist-info}/licenses/LICENSE +1 -1
- camel/loaders/pandas_reader.py +0 -368
- camel/runtime/api.py +0 -97
- camel/toolkits/dalle_toolkit.py +0 -171
- camel/toolkits/file_write_toolkit.py +0 -395
- camel/toolkits/openai_agent_toolkit.py +0 -135
- camel/toolkits/terminal_toolkit.py +0 -1037
- camel_ai-0.2.59.dist-info/RECORD +0 -410
camel/models/_utils.py
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
# ========= Copyright 2023-
|
|
1
|
+
# ========= Copyright 2023-2025 @ CAMEL-AI.org. All Rights Reserved. =========
|
|
2
2
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
3
3
|
# you may not use this file except in compliance with the License.
|
|
4
4
|
# You may obtain a copy of the License at
|
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
11
11
|
# See the License for the specific language governing permissions and
|
|
12
12
|
# limitations under the License.
|
|
13
|
-
# ========= Copyright 2023-
|
|
13
|
+
# ========= Copyright 2023-2025 @ CAMEL-AI.org. All Rights Reserved. =========
|
|
14
14
|
import textwrap
|
|
15
15
|
from typing import Optional, Type
|
|
16
16
|
|
|
@@ -48,7 +48,7 @@ def try_modify_message_with_format(
|
|
|
48
48
|
updated_prompt = textwrap.dedent(
|
|
49
49
|
f"""\
|
|
50
50
|
{message["content"]}
|
|
51
|
-
|
|
51
|
+
|
|
52
52
|
Please generate a JSON response adhering to the following JSON schema:
|
|
53
53
|
{json_schema}
|
|
54
54
|
Make sure the JSON response is valid and matches the EXACT structure defined in the schema. Your result should ONLY be a valid json object, WITHOUT ANY OTHER TEXT OR COMMENTS.
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
# ========= Copyright 2023-2025 @ CAMEL-AI.org. All Rights Reserved. =========
|
|
2
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
3
|
+
# you may not use this file except in compliance with the License.
|
|
4
|
+
# You may obtain a copy of the License at
|
|
5
|
+
#
|
|
6
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
7
|
+
#
|
|
8
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
9
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
10
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
11
|
+
# See the License for the specific language governing permissions and
|
|
12
|
+
# limitations under the License.
|
|
13
|
+
# ========= Copyright 2023-2025 @ CAMEL-AI.org. All Rights Reserved. =========
|
|
14
|
+
import os
|
|
15
|
+
from typing import Any, Dict, Optional, Union
|
|
16
|
+
|
|
17
|
+
from camel.models.openai_compatible_model import OpenAICompatibleModel
|
|
18
|
+
from camel.types import ModelType
|
|
19
|
+
from camel.utils import (
|
|
20
|
+
BaseTokenCounter,
|
|
21
|
+
api_keys_required,
|
|
22
|
+
)
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
class AihubMixModel(OpenAICompatibleModel):
|
|
26
|
+
r"""AihubMix API in a unified OpenAICompatibleModel interface.
|
|
27
|
+
|
|
28
|
+
Args:
|
|
29
|
+
model_type (Union[ModelType, str]): Model for which a backend is
|
|
30
|
+
created.
|
|
31
|
+
model_config_dict (Optional[Dict[str, Any]], optional): A dictionary
|
|
32
|
+
that will be fed into OpenAI client. If :obj:`None`,
|
|
33
|
+
:obj:`{}` will be used.
|
|
34
|
+
(default: :obj:`None`)
|
|
35
|
+
api_key (Optional[str], optional): The API key for authenticating with
|
|
36
|
+
AihubMix service. (default: :obj:`None`)
|
|
37
|
+
url (Optional[str], optional): The URL to AihubMix service. If
|
|
38
|
+
not provided, :obj:`https://aihubmix.com/v1` will be used.
|
|
39
|
+
(default: :obj:`None`)
|
|
40
|
+
token_counter (Optional[BaseTokenCounter], optional): Token counter to
|
|
41
|
+
use for the model. If not provided, :obj:`OpenAITokenCounter(
|
|
42
|
+
ModelType.GPT_4O_MINI)` will be used.
|
|
43
|
+
(default: :obj:`None`)
|
|
44
|
+
timeout (Optional[float], optional): The timeout value in seconds for
|
|
45
|
+
API calls. If not provided, will fall back to the MODEL_TIMEOUT
|
|
46
|
+
environment variable or default to 180 seconds.
|
|
47
|
+
(default: :obj:`None`)
|
|
48
|
+
max_retries (int, optional): Maximum number of retries for API calls.
|
|
49
|
+
(default: :obj:`3`)
|
|
50
|
+
**kwargs (Any): Additional arguments to pass to the client
|
|
51
|
+
initialization.
|
|
52
|
+
"""
|
|
53
|
+
|
|
54
|
+
@api_keys_required([("api_key", "AIHUBMIX_API_KEY")])
|
|
55
|
+
def __init__(
|
|
56
|
+
self,
|
|
57
|
+
model_type: Union[ModelType, str],
|
|
58
|
+
model_config_dict: Optional[Dict[str, Any]] = None,
|
|
59
|
+
api_key: Optional[str] = None,
|
|
60
|
+
url: Optional[str] = None,
|
|
61
|
+
token_counter: Optional[BaseTokenCounter] = None,
|
|
62
|
+
timeout: Optional[float] = None,
|
|
63
|
+
max_retries: int = 3,
|
|
64
|
+
**kwargs: Any,
|
|
65
|
+
) -> None:
|
|
66
|
+
if model_config_dict is None:
|
|
67
|
+
model_config_dict = {}
|
|
68
|
+
api_key = api_key or os.environ.get("AIHUBMIX_API_KEY")
|
|
69
|
+
url = url or os.environ.get(
|
|
70
|
+
"AIHUBMIX_API_BASE_URL",
|
|
71
|
+
"https://aihubmix.com/v1",
|
|
72
|
+
)
|
|
73
|
+
timeout = timeout or float(os.environ.get("MODEL_TIMEOUT", 180))
|
|
74
|
+
super().__init__(
|
|
75
|
+
model_type=model_type,
|
|
76
|
+
model_config_dict=model_config_dict,
|
|
77
|
+
api_key=api_key,
|
|
78
|
+
url=url,
|
|
79
|
+
token_counter=token_counter,
|
|
80
|
+
timeout=timeout,
|
|
81
|
+
max_retries=max_retries,
|
|
82
|
+
**kwargs,
|
|
83
|
+
)
|
camel/models/aiml_model.py
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
# ========= Copyright 2023-
|
|
1
|
+
# ========= Copyright 2023-2025 @ CAMEL-AI.org. All Rights Reserved. =========
|
|
2
2
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
3
3
|
# you may not use this file except in compliance with the License.
|
|
4
4
|
# You may obtain a copy of the License at
|
|
@@ -10,11 +10,11 @@
|
|
|
10
10
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
11
11
|
# See the License for the specific language governing permissions and
|
|
12
12
|
# limitations under the License.
|
|
13
|
-
# ========= Copyright 2023-
|
|
13
|
+
# ========= Copyright 2023-2025 @ CAMEL-AI.org. All Rights Reserved. =========
|
|
14
14
|
import os
|
|
15
15
|
from typing import Any, Dict, Optional, Union
|
|
16
16
|
|
|
17
|
-
from camel.configs import
|
|
17
|
+
from camel.configs import AIMLConfig
|
|
18
18
|
from camel.models.openai_compatible_model import OpenAICompatibleModel
|
|
19
19
|
from camel.types import ModelType
|
|
20
20
|
from camel.utils import (
|
|
@@ -46,6 +46,10 @@ class AIMLModel(OpenAICompatibleModel):
|
|
|
46
46
|
API calls. If not provided, will fall back to the MODEL_TIMEOUT
|
|
47
47
|
environment variable or default to 180 seconds.
|
|
48
48
|
(default: :obj:`None`)
|
|
49
|
+
max_retries (int, optional): Maximum number of retries for API calls.
|
|
50
|
+
(default: :obj:`3`)
|
|
51
|
+
**kwargs (Any): Additional arguments to pass to the client
|
|
52
|
+
initialization.
|
|
49
53
|
"""
|
|
50
54
|
|
|
51
55
|
@api_keys_required([("api_key", "AIML_API_KEY")])
|
|
@@ -57,6 +61,8 @@ class AIMLModel(OpenAICompatibleModel):
|
|
|
57
61
|
url: Optional[str] = None,
|
|
58
62
|
token_counter: Optional[BaseTokenCounter] = None,
|
|
59
63
|
timeout: Optional[float] = None,
|
|
64
|
+
max_retries: int = 3,
|
|
65
|
+
**kwargs: Any,
|
|
60
66
|
) -> None:
|
|
61
67
|
if model_config_dict is None:
|
|
62
68
|
model_config_dict = AIMLConfig().as_dict()
|
|
@@ -73,19 +79,6 @@ class AIMLModel(OpenAICompatibleModel):
|
|
|
73
79
|
url=url,
|
|
74
80
|
token_counter=token_counter,
|
|
75
81
|
timeout=timeout,
|
|
82
|
+
max_retries=max_retries,
|
|
83
|
+
**kwargs,
|
|
76
84
|
)
|
|
77
|
-
|
|
78
|
-
def check_model_config(self):
|
|
79
|
-
r"""Check whether the model configuration contains any
|
|
80
|
-
unexpected arguments to AIML API.
|
|
81
|
-
|
|
82
|
-
Raises:
|
|
83
|
-
ValueError: If the model configuration dictionary contains any
|
|
84
|
-
unexpected arguments to AIML API.
|
|
85
|
-
"""
|
|
86
|
-
for param in self.model_config_dict:
|
|
87
|
-
if param not in AIML_API_PARAMS:
|
|
88
|
-
raise ValueError(
|
|
89
|
-
f"Unexpected argument `{param}` is "
|
|
90
|
-
"input into AIML model backend."
|
|
91
|
-
)
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
# ========= Copyright 2023-2025 @ CAMEL-AI.org. All Rights Reserved. =========
|
|
2
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
3
|
+
# you may not use this file except in compliance with the License.
|
|
4
|
+
# You may obtain a copy of the License at
|
|
5
|
+
#
|
|
6
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
7
|
+
#
|
|
8
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
9
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
10
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
11
|
+
# See the License for the specific language governing permissions and
|
|
12
|
+
# limitations under the License.
|
|
13
|
+
# ========= Copyright 2023-2025 @ CAMEL-AI.org. All Rights Reserved. =========
|
|
14
|
+
|
|
15
|
+
import os
|
|
16
|
+
from typing import Any, Dict, Optional, Union
|
|
17
|
+
|
|
18
|
+
from camel.configs import AMD_API_PARAMS, AMDConfig
|
|
19
|
+
from camel.models.openai_compatible_model import OpenAICompatibleModel
|
|
20
|
+
from camel.types import ModelType
|
|
21
|
+
from camel.utils import BaseTokenCounter, api_keys_required
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
class AMDModel(OpenAICompatibleModel):
|
|
25
|
+
r"""AMD API in a unified OpenAICompatibleModel interface.
|
|
26
|
+
|
|
27
|
+
Args:
|
|
28
|
+
model_type (Union[ModelType, str]): Model for which a backend is
|
|
29
|
+
created, one of AMD series.
|
|
30
|
+
model_config_dict (Optional[Dict[str, Any]], optional): A dictionary
|
|
31
|
+
that will be fed into:obj:`openai.ChatCompletion.create()`. If
|
|
32
|
+
:obj:`None`, :obj:`AMDConfig().as_dict()` will be used.
|
|
33
|
+
(default: :obj:`None`)
|
|
34
|
+
api_key (Optional[str], optional): The API key for authenticating with
|
|
35
|
+
the AMD service. (default: :obj:`None`)
|
|
36
|
+
url (Optional[str], optional): The url to the AMD service.
|
|
37
|
+
(default: :obj:`None`)
|
|
38
|
+
token_counter (Optional[BaseTokenCounter], optional): Token counter to
|
|
39
|
+
use for the model. If not provided, :obj:`OpenAITokenCounter(
|
|
40
|
+
ModelType.GPT_4)` will be used.
|
|
41
|
+
(default: :obj:`None`)
|
|
42
|
+
timeout (Optional[float], optional): The timeout value in seconds for
|
|
43
|
+
API calls. If not provided, will fall back to the MODEL_TIMEOUT
|
|
44
|
+
environment variable or default to 180 seconds.
|
|
45
|
+
(default: :obj:`None`)
|
|
46
|
+
max_retries (int, optional): Maximum number of retries for API calls.
|
|
47
|
+
(default: :obj:`3`)
|
|
48
|
+
**kwargs (Any): Additional arguments to pass to the client
|
|
49
|
+
initialization.
|
|
50
|
+
"""
|
|
51
|
+
|
|
52
|
+
@api_keys_required(
|
|
53
|
+
[
|
|
54
|
+
("api_key", "AMD_API_KEY"),
|
|
55
|
+
]
|
|
56
|
+
)
|
|
57
|
+
def __init__(
|
|
58
|
+
self,
|
|
59
|
+
model_type: Union[ModelType, str],
|
|
60
|
+
model_config_dict: Optional[Dict[str, Any]] = None,
|
|
61
|
+
api_key: Optional[str] = None,
|
|
62
|
+
url: Optional[str] = None,
|
|
63
|
+
token_counter: Optional[BaseTokenCounter] = None,
|
|
64
|
+
timeout: Optional[float] = None,
|
|
65
|
+
max_retries: int = 3,
|
|
66
|
+
**kwargs: Any,
|
|
67
|
+
) -> None:
|
|
68
|
+
if model_config_dict is None:
|
|
69
|
+
model_config_dict = AMDConfig().as_dict()
|
|
70
|
+
api_key = api_key or os.environ.get("AMD_API_KEY")
|
|
71
|
+
url = url or os.environ.get(
|
|
72
|
+
"AMD_API_BASE_URL", "https://llm-api.amd.com"
|
|
73
|
+
)
|
|
74
|
+
headers = {'Ocp-Apim-Subscription-Key': api_key}
|
|
75
|
+
kwargs["default_headers"] = headers
|
|
76
|
+
timeout = timeout or float(os.environ.get("MODEL_TIMEOUT", 180))
|
|
77
|
+
super().__init__(
|
|
78
|
+
model_type=model_type,
|
|
79
|
+
model_config_dict=model_config_dict,
|
|
80
|
+
api_key=api_key,
|
|
81
|
+
url=url,
|
|
82
|
+
token_counter=token_counter,
|
|
83
|
+
timeout=timeout,
|
|
84
|
+
max_retries=max_retries,
|
|
85
|
+
**kwargs,
|
|
86
|
+
)
|
|
87
|
+
|
|
88
|
+
def check_model_config(self):
|
|
89
|
+
r"""Check whether the model configuration contains any
|
|
90
|
+
unexpected arguments to AMD API.
|
|
91
|
+
|
|
92
|
+
Raises:
|
|
93
|
+
ValueError: If the model configuration dictionary contains any
|
|
94
|
+
unexpected arguments to AMD API.
|
|
95
|
+
"""
|
|
96
|
+
for param in self.model_config_dict:
|
|
97
|
+
if param not in AMD_API_PARAMS:
|
|
98
|
+
raise ValueError(
|
|
99
|
+
f"Unexpected argument `{param}` is "
|
|
100
|
+
"input into AMD model backend."
|
|
101
|
+
)
|
camel/models/anthropic_model.py
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
# ========= Copyright 2023-
|
|
1
|
+
# ========= Copyright 2023-2025 @ CAMEL-AI.org. All Rights Reserved. =========
|
|
2
2
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
3
3
|
# you may not use this file except in compliance with the License.
|
|
4
4
|
# You may obtain a copy of the License at
|
|
@@ -10,21 +10,65 @@
|
|
|
10
10
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
11
11
|
# See the License for the specific language governing permissions and
|
|
12
12
|
# limitations under the License.
|
|
13
|
-
# ========= Copyright 2023-
|
|
13
|
+
# ========= Copyright 2023-2025 @ CAMEL-AI.org. All Rights Reserved. =========
|
|
14
14
|
import os
|
|
15
|
-
from typing import Any, Dict, Optional, Union
|
|
15
|
+
from typing import Any, Dict, List, Optional, Union
|
|
16
16
|
|
|
17
|
-
from
|
|
17
|
+
from openai import AsyncStream, Stream
|
|
18
|
+
|
|
19
|
+
from camel.configs import AnthropicConfig
|
|
20
|
+
from camel.messages import OpenAIMessage
|
|
18
21
|
from camel.models.openai_compatible_model import OpenAICompatibleModel
|
|
19
|
-
from camel.types import ModelType
|
|
22
|
+
from camel.types import ChatCompletion, ChatCompletionChunk, ModelType
|
|
20
23
|
from camel.utils import (
|
|
21
|
-
AnthropicTokenCounter,
|
|
22
24
|
BaseTokenCounter,
|
|
25
|
+
OpenAITokenCounter,
|
|
23
26
|
api_keys_required,
|
|
24
27
|
dependencies_required,
|
|
25
28
|
)
|
|
26
29
|
|
|
27
30
|
|
|
31
|
+
def strip_trailing_whitespace_from_messages(
|
|
32
|
+
messages: List[OpenAIMessage],
|
|
33
|
+
) -> List[OpenAIMessage]:
|
|
34
|
+
r"""Strip trailing whitespace from all message contents in a list of
|
|
35
|
+
messages. This is necessary because the Anthropic API doesn't allow
|
|
36
|
+
trailing whitespace in message content.
|
|
37
|
+
|
|
38
|
+
Args:
|
|
39
|
+
messages (List[OpenAIMessage]): List of messages to process
|
|
40
|
+
|
|
41
|
+
Returns:
|
|
42
|
+
List[OpenAIMessage]: The processed messages with trailing whitespace
|
|
43
|
+
removed
|
|
44
|
+
"""
|
|
45
|
+
if not messages:
|
|
46
|
+
return messages
|
|
47
|
+
|
|
48
|
+
# Create a deep copy to avoid modifying the original messages
|
|
49
|
+
processed_messages = [dict(msg) for msg in messages]
|
|
50
|
+
|
|
51
|
+
# Process each message
|
|
52
|
+
for msg in processed_messages:
|
|
53
|
+
if "content" in msg and msg["content"] is not None:
|
|
54
|
+
if isinstance(msg["content"], str):
|
|
55
|
+
msg["content"] = msg["content"].rstrip()
|
|
56
|
+
elif isinstance(msg["content"], list):
|
|
57
|
+
# Handle content that's a list of content parts (e.g., for
|
|
58
|
+
# multimodal content)
|
|
59
|
+
for i, part in enumerate(msg["content"]):
|
|
60
|
+
if (
|
|
61
|
+
isinstance(part, dict)
|
|
62
|
+
and "text" in part
|
|
63
|
+
and isinstance(part["text"], str)
|
|
64
|
+
):
|
|
65
|
+
part["text"] = part["text"].rstrip()
|
|
66
|
+
elif isinstance(part, str):
|
|
67
|
+
msg["content"][i] = part.rstrip()
|
|
68
|
+
|
|
69
|
+
return processed_messages # type: ignore[return-value]
|
|
70
|
+
|
|
71
|
+
|
|
28
72
|
class AnthropicModel(OpenAICompatibleModel):
|
|
29
73
|
r"""Anthropic API in a unified OpenAICompatibleModel interface.
|
|
30
74
|
|
|
@@ -46,6 +90,10 @@ class AnthropicModel(OpenAICompatibleModel):
|
|
|
46
90
|
API calls. If not provided, will fall back to the MODEL_TIMEOUT
|
|
47
91
|
environment variable or default to 180 seconds.
|
|
48
92
|
(default: :obj:`None`)
|
|
93
|
+
max_retries (int, optional): Maximum number of retries for API calls.
|
|
94
|
+
(default: :obj:`3`)
|
|
95
|
+
**kwargs (Any): Additional arguments to pass to the client
|
|
96
|
+
initialization.
|
|
49
97
|
"""
|
|
50
98
|
|
|
51
99
|
@api_keys_required(
|
|
@@ -62,6 +110,8 @@ class AnthropicModel(OpenAICompatibleModel):
|
|
|
62
110
|
url: Optional[str] = None,
|
|
63
111
|
token_counter: Optional[BaseTokenCounter] = None,
|
|
64
112
|
timeout: Optional[float] = None,
|
|
113
|
+
max_retries: int = 3,
|
|
114
|
+
**kwargs: Any,
|
|
65
115
|
) -> None:
|
|
66
116
|
if model_config_dict is None:
|
|
67
117
|
model_config_dict = AnthropicConfig().as_dict()
|
|
@@ -79,31 +129,88 @@ class AnthropicModel(OpenAICompatibleModel):
|
|
|
79
129
|
url=url,
|
|
80
130
|
token_counter=token_counter,
|
|
81
131
|
timeout=timeout,
|
|
132
|
+
max_retries=max_retries,
|
|
133
|
+
**kwargs,
|
|
82
134
|
)
|
|
83
135
|
|
|
136
|
+
# Monkey patch the AnthropicTokenCounter to handle trailing whitespace
|
|
137
|
+
self._patch_anthropic_token_counter()
|
|
138
|
+
|
|
84
139
|
@property
|
|
85
140
|
def token_counter(self) -> BaseTokenCounter:
|
|
86
141
|
r"""Initialize the token counter for the model backend.
|
|
87
142
|
|
|
88
143
|
Returns:
|
|
89
|
-
|
|
144
|
+
OpenAITokenCounter: The token counter following the model's
|
|
90
145
|
tokenization style.
|
|
91
146
|
"""
|
|
147
|
+
# TODO: use anthropic token counter
|
|
148
|
+
|
|
92
149
|
if not self._token_counter:
|
|
93
|
-
self._token_counter =
|
|
150
|
+
self._token_counter = OpenAITokenCounter(ModelType.GPT_4O_MINI)
|
|
94
151
|
return self._token_counter
|
|
95
152
|
|
|
96
|
-
def
|
|
97
|
-
|
|
98
|
-
|
|
153
|
+
def _request_chat_completion(
|
|
154
|
+
self,
|
|
155
|
+
messages: List[OpenAIMessage],
|
|
156
|
+
tools: Optional[List[Dict[str, Any]]] = None,
|
|
157
|
+
) -> Union[ChatCompletion, Stream[ChatCompletionChunk]]:
|
|
158
|
+
# Strip trailing whitespace from all message contents to prevent
|
|
159
|
+
# Anthropic API errors
|
|
160
|
+
processed_messages = strip_trailing_whitespace_from_messages(messages)
|
|
161
|
+
|
|
162
|
+
# Call the parent class method
|
|
163
|
+
return super()._request_chat_completion(processed_messages, tools)
|
|
164
|
+
|
|
165
|
+
async def _arequest_chat_completion(
|
|
166
|
+
self,
|
|
167
|
+
messages: List[OpenAIMessage],
|
|
168
|
+
tools: Optional[List[Dict[str, Any]]] = None,
|
|
169
|
+
) -> Union[ChatCompletion, AsyncStream[ChatCompletionChunk]]:
|
|
170
|
+
# Strip trailing whitespace from all message contents to prevent
|
|
171
|
+
# Anthropic API errors
|
|
172
|
+
processed_messages = strip_trailing_whitespace_from_messages(messages)
|
|
99
173
|
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
174
|
+
# Call the parent class method
|
|
175
|
+
return await super()._arequest_chat_completion(
|
|
176
|
+
processed_messages, tools
|
|
177
|
+
)
|
|
178
|
+
|
|
179
|
+
def _patch_anthropic_token_counter(self):
|
|
180
|
+
r"""Monkey patch the AnthropicTokenCounter class to handle trailing
|
|
181
|
+
whitespace.
|
|
182
|
+
|
|
183
|
+
This patches the count_tokens_from_messages method to strip trailing
|
|
184
|
+
whitespace from message content before sending to the Anthropic API.
|
|
103
185
|
"""
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
186
|
+
import functools
|
|
187
|
+
|
|
188
|
+
from anthropic.types import MessageParam
|
|
189
|
+
|
|
190
|
+
from camel.utils import AnthropicTokenCounter
|
|
191
|
+
|
|
192
|
+
original_count_tokens = (
|
|
193
|
+
AnthropicTokenCounter.count_tokens_from_messages
|
|
194
|
+
)
|
|
195
|
+
|
|
196
|
+
@functools.wraps(original_count_tokens)
|
|
197
|
+
def patched_count_tokens(self, messages):
|
|
198
|
+
# Process messages to remove trailing whitespace
|
|
199
|
+
processed_messages = strip_trailing_whitespace_from_messages(
|
|
200
|
+
messages
|
|
201
|
+
)
|
|
202
|
+
|
|
203
|
+
# Use the processed messages with the original method
|
|
204
|
+
return self.client.messages.count_tokens(
|
|
205
|
+
messages=[
|
|
206
|
+
MessageParam(
|
|
207
|
+
content=str(msg["content"]),
|
|
208
|
+
role="user" if msg["role"] == "user" else "assistant",
|
|
209
|
+
)
|
|
210
|
+
for msg in processed_messages
|
|
211
|
+
],
|
|
212
|
+
model=self.model,
|
|
213
|
+
).input_tokens
|
|
214
|
+
|
|
215
|
+
# Apply the monkey patch
|
|
216
|
+
AnthropicTokenCounter.count_tokens_from_messages = patched_count_tokens
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
# ========= Copyright 2023-
|
|
1
|
+
# ========= Copyright 2023-2025 @ CAMEL-AI.org. All Rights Reserved. =========
|
|
2
2
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
3
3
|
# you may not use this file except in compliance with the License.
|
|
4
4
|
# You may obtain a copy of the License at
|
|
@@ -10,20 +10,14 @@
|
|
|
10
10
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
11
11
|
# See the License for the specific language governing permissions and
|
|
12
12
|
# limitations under the License.
|
|
13
|
-
# ========= Copyright 2023-
|
|
13
|
+
# ========= Copyright 2023-2025 @ CAMEL-AI.org. All Rights Reserved. =========
|
|
14
14
|
|
|
15
15
|
import os
|
|
16
|
-
from typing import Any, Dict,
|
|
16
|
+
from typing import Any, Dict, Optional, Union
|
|
17
17
|
|
|
18
|
-
from
|
|
19
|
-
from pydantic import BaseModel
|
|
20
|
-
|
|
21
|
-
from camel.configs import BEDROCK_API_PARAMS, BedrockConfig
|
|
22
|
-
from camel.messages import OpenAIMessage
|
|
18
|
+
from camel.configs import BedrockConfig
|
|
23
19
|
from camel.models.openai_compatible_model import OpenAICompatibleModel
|
|
24
20
|
from camel.types import (
|
|
25
|
-
ChatCompletion,
|
|
26
|
-
ChatCompletionChunk,
|
|
27
21
|
ModelType,
|
|
28
22
|
)
|
|
29
23
|
from camel.utils import BaseTokenCounter, api_keys_required
|
|
@@ -50,6 +44,10 @@ class AWSBedrockModel(OpenAICompatibleModel):
|
|
|
50
44
|
API calls. If not provided, will fall back to the MODEL_TIMEOUT
|
|
51
45
|
environment variable or default to 180 seconds.
|
|
52
46
|
(default: :obj:`None`)
|
|
47
|
+
max_retries (int, optional): Maximum number of retries for API calls.
|
|
48
|
+
(default: :obj:`3`)
|
|
49
|
+
**kwargs (Any): Additional arguments to pass to the client
|
|
50
|
+
initialization.
|
|
53
51
|
|
|
54
52
|
References:
|
|
55
53
|
https://docs.aws.amazon.com/bedrock/latest/APIReference/welcome.html
|
|
@@ -69,6 +67,8 @@ class AWSBedrockModel(OpenAICompatibleModel):
|
|
|
69
67
|
url: Optional[str] = None,
|
|
70
68
|
token_counter: Optional[BaseTokenCounter] = None,
|
|
71
69
|
timeout: Optional[float] = None,
|
|
70
|
+
max_retries: int = 3,
|
|
71
|
+
**kwargs: Any,
|
|
72
72
|
) -> None:
|
|
73
73
|
if model_config_dict is None:
|
|
74
74
|
model_config_dict = BedrockConfig().as_dict()
|
|
@@ -84,29 +84,6 @@ class AWSBedrockModel(OpenAICompatibleModel):
|
|
|
84
84
|
url=url,
|
|
85
85
|
token_counter=token_counter,
|
|
86
86
|
timeout=timeout,
|
|
87
|
+
max_retries=max_retries,
|
|
88
|
+
**kwargs,
|
|
87
89
|
)
|
|
88
|
-
|
|
89
|
-
async def _arun(
|
|
90
|
-
self,
|
|
91
|
-
messages: List[OpenAIMessage],
|
|
92
|
-
response_format: Optional[Type[BaseModel]] = None,
|
|
93
|
-
tools: Optional[List[Dict[str, Any]]] = None,
|
|
94
|
-
) -> Union[ChatCompletion, AsyncStream[ChatCompletionChunk]]:
|
|
95
|
-
raise NotImplementedError(
|
|
96
|
-
"AWS Bedrock does not support async inference."
|
|
97
|
-
)
|
|
98
|
-
|
|
99
|
-
def check_model_config(self):
|
|
100
|
-
r"""Check whether the input model configuration contains unexpected
|
|
101
|
-
arguments.
|
|
102
|
-
|
|
103
|
-
Raises:
|
|
104
|
-
ValueError: If the model configuration dictionary contains any
|
|
105
|
-
unexpected argument for this model class.
|
|
106
|
-
"""
|
|
107
|
-
for param in self.model_config_dict:
|
|
108
|
-
if param not in BEDROCK_API_PARAMS:
|
|
109
|
-
raise ValueError(
|
|
110
|
-
f"Invalid parameter '{param}' in model_config_dict. "
|
|
111
|
-
f"Valid parameters are: {BEDROCK_API_PARAMS}"
|
|
112
|
-
)
|