camel-ai 0.2.65__py3-none-any.whl → 0.2.83a6__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 +5107 -995
- 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 +35 -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 +1 -3
- camel/benchmarks/mock_website/mock_web.py +2 -2
- camel/benchmarks/mock_website/requirements.txt +1 -1
- camel/benchmarks/mock_website/shopping_mall/app.py +2 -2
- camel/benchmarks/mock_website/task.json +1 -1
- 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 +29 -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 +2 -2
- 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 +2 -2
- camel/configs/cometapi_config.py +106 -0
- camel/configs/crynux_config.py +2 -2
- camel/configs/deepseek_config.py +9 -8
- camel/configs/function_gemma_config.py +59 -0
- 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 +2 -2
- 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 +5 -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 +2 -2
- camel/configs/samba_config.py +6 -4
- 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_collectors/__init__.py +2 -2
- camel/data_collectors/alpaca_collector.py +18 -9
- camel/data_collectors/base.py +2 -2
- camel/data_collectors/sharegpt_collector.py +2 -2
- camel/datagen/__init__.py +2 -2
- camel/datagen/cot_datagen.py +3 -3
- camel/datagen/evol_instruct/__init__.py +2 -2
- camel/datagen/evol_instruct/evol_instruct.py +2 -2
- camel/datagen/evol_instruct/scorer.py +12 -12
- camel/datagen/evol_instruct/templates.py +16 -16
- 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 +2 -2
- camel/datasets/self_instruct_generator.py +2 -2
- camel/datasets/static_dataset.py +2 -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 +2 -2
- 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 +2 -2
- camel/embeddings/together_embedding.py +2 -2
- camel/embeddings/vlm_embedding.py +2 -2
- 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 +2 -2
- camel/interpreters/docker/Dockerfile +14 -24
- camel/interpreters/docker_interpreter.py +5 -4
- camel/interpreters/e2b_interpreter.py +36 -3
- camel/interpreters/internal_python_interpreter.py +53 -4
- camel/interpreters/interpreter_error.py +2 -2
- camel/interpreters/ipython_interpreter.py +2 -2
- camel/interpreters/microsandbox_interpreter.py +395 -0
- camel/interpreters/subprocess_interpreter.py +2 -2
- camel/loaders/__init__.py +13 -4
- 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 +11 -2
- 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 +2 -2
- 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 +125 -7
- camel/memories/blocks/vectordb_block.py +10 -3
- camel/memories/context_creators/__init__.py +2 -2
- camel/memories/context_creators/score_based.py +109 -230
- camel/memories/records.py +90 -10
- camel/messages/__init__.py +2 -2
- camel/messages/base.py +178 -43
- 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 +214 -115
- camel/models/base_audio_model.py +5 -3
- camel/models/base_model.py +378 -31
- camel/models/cerebras_model.py +83 -0
- camel/models/cohere_model.py +18 -49
- camel/models/cometapi_model.py +83 -0
- camel/models/crynux_model.py +11 -18
- camel/models/deepseek_model.py +20 -84
- camel/models/fish_audio_model.py +8 -2
- camel/models/function_gemma_model.py +889 -0
- camel/models/gemini_model.py +391 -52
- camel/models/groq_model.py +11 -19
- camel/models/internlm_model.py +11 -18
- camel/models/litellm_model.py +57 -49
- camel/models/lmstudio_model.py +17 -20
- camel/models/minimax_model.py +83 -0
- camel/models/mistral_model.py +20 -47
- camel/models/model_factory.py +39 -3
- camel/models/model_manager.py +26 -8
- camel/models/modelscope_model.py +13 -193
- camel/models/moonshot_model.py +183 -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 +190 -71
- camel/models/openai_model.py +192 -86
- 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 +23 -49
- 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 +50 -75
- camel/models/sglang_model.py +90 -68
- 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 +158 -19
- camel/models/watsonx_model.py +9 -47
- 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 +3 -2
- camel/retrievers/base.py +2 -2
- camel/retrievers/bm25_retriever.py +2 -2
- camel/retrievers/cohere_rerank_retriever.py +2 -2
- camel/retrievers/hybrid_retrival.py +2 -2
- camel/retrievers/vector_retriever.py +2 -2
- camel/runtimes/Dockerfile.multi-toolkit +90 -0
- camel/runtimes/__init__.py +2 -2
- camel/runtimes/api.py +79 -23
- camel/runtimes/base.py +2 -2
- camel/runtimes/configs.py +13 -13
- camel/runtimes/daytona_runtime.py +17 -18
- camel/runtimes/docker_runtime.py +12 -12
- camel/runtimes/llm_guard_runtime.py +26 -26
- camel/runtimes/remote_http_runtime.py +11 -11
- camel/runtimes/ubuntu_docker_runtime.py +2 -2
- camel/runtimes/utils/__init__.py +2 -2
- camel/runtimes/utils/function_risk_toolkit.py +2 -2
- camel/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 +2 -2
- camel/societies/workforce/events.py +145 -0
- camel/societies/workforce/prompts.py +259 -33
- camel/societies/workforce/role_playing_worker.py +88 -31
- camel/societies/workforce/single_agent_worker.py +638 -40
- camel/societies/workforce/structured_output_handler.py +512 -0
- camel/societies/workforce/task_channel.py +182 -38
- camel/societies/workforce/utils.py +780 -65
- camel/societies/workforce/worker.py +92 -26
- camel/societies/workforce/workflow_memory_manager.py +1746 -0
- camel/societies/workforce/workforce.py +5354 -372
- 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 +6 -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 +8 -2
- camel/storages/vectordb_storages/base.py +2 -2
- camel/storages/vectordb_storages/chroma.py +731 -0
- camel/storages/vectordb_storages/faiss.py +2 -2
- camel/storages/vectordb_storages/milvus.py +2 -2
- camel/storages/vectordb_storages/oceanbase.py +15 -15
- 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 +2 -2
- camel/tasks/__init__.py +2 -2
- camel/tasks/task.py +348 -26
- 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 +57 -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 +4 -4
- camel/toolkits/audio_analysis_toolkit.py +3 -3
- camel/toolkits/base.py +106 -6
- camel/toolkits/bohrium_toolkit.py +2 -2
- camel/toolkits/browser_toolkit.py +34 -21
- camel/toolkits/browser_toolkit_commons.py +4 -4
- camel/toolkits/code_execution.py +31 -4
- 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 +905 -71
- camel/toolkits/file_toolkit.py +1402 -0
- camel/toolkits/function_tool.py +205 -27
- camel/toolkits/github_toolkit.py +109 -22
- 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 +1958 -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 +1940 -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 +325 -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 -6
- camel/toolkits/image_generation_toolkit.py +390 -0
- camel/toolkits/jina_reranker_toolkit.py +5 -6
- 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 +412 -36
- 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 +728 -0
- camel/toolkits/microsoft_outlook_mail_toolkit.py +1885 -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 +53 -53
- camel/toolkits/playwright_mcp_toolkit.py +13 -31
- camel/toolkits/pptx_toolkit.py +36 -23
- 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 +606 -156
- 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 +5 -5
- camel/toolkits/terminal_toolkit/__init__.py +18 -0
- camel/toolkits/terminal_toolkit/terminal_toolkit.py +1281 -0
- camel/toolkits/terminal_toolkit/utils.py +659 -0
- camel/toolkits/thinking_toolkit.py +3 -3
- camel/toolkits/twitter_toolkit.py +2 -2
- camel/toolkits/vertex_ai_veo_toolkit.py +590 -0
- camel/toolkits/video_analysis_toolkit.py +109 -29
- camel/toolkits/video_download_toolkit.py +19 -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 +2 -2
- 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 +381 -41
- camel/types/mcp_registries.py +2 -2
- camel/types/openai_types.py +4 -4
- camel/types/unified_model_type.py +46 -10
- camel/utils/__init__.py +5 -2
- camel/utils/agent_context.py +41 -0
- 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 +38 -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 +18 -10
- camel/utils/mcp.py +140 -6
- camel/utils/mcp_client.py +48 -38
- 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.65.dist-info → camel_ai-0.2.83a6.dist-info}/METADATA +355 -117
- camel_ai-0.2.83a6.dist-info/RECORD +511 -0
- {camel_ai-0.2.65.dist-info → camel_ai-0.2.83a6.dist-info}/WHEEL +1 -1
- {camel_ai-0.2.65.dist-info → camel_ai-0.2.83a6.dist-info}/licenses/LICENSE +1 -1
- camel/loaders/pandas_reader.py +0 -368
- camel/toolkits/dalle_toolkit.py +0 -175
- camel/toolkits/file_write_toolkit.py +0 -444
- camel/toolkits/openai_agent_toolkit.py +0 -135
- camel/toolkits/terminal_toolkit.py +0 -1037
- camel_ai-0.2.65.dist-info/RECORD +0 -426
camel/models/openai_model.py
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
# ========= Copyright 2023-
|
|
1
|
+
# ========= Copyright 2023-2026 @ 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,15 +10,20 @@
|
|
|
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-2026 @ CAMEL-AI.org. All Rights Reserved. =========
|
|
14
14
|
import os
|
|
15
15
|
import warnings
|
|
16
16
|
from typing import Any, Dict, List, Optional, Type, Union
|
|
17
17
|
|
|
18
18
|
from openai import AsyncOpenAI, AsyncStream, OpenAI, Stream
|
|
19
|
+
from openai.lib.streaming.chat import (
|
|
20
|
+
AsyncChatCompletionStreamManager,
|
|
21
|
+
ChatCompletionStreamManager,
|
|
22
|
+
)
|
|
19
23
|
from pydantic import BaseModel
|
|
20
24
|
|
|
21
|
-
from camel.configs import
|
|
25
|
+
from camel.configs import ChatGPTConfig
|
|
26
|
+
from camel.logger import get_logger
|
|
22
27
|
from camel.messages import OpenAIMessage
|
|
23
28
|
from camel.models import BaseModelBackend
|
|
24
29
|
from camel.types import (
|
|
@@ -30,16 +35,21 @@ from camel.utils import (
|
|
|
30
35
|
BaseTokenCounter,
|
|
31
36
|
OpenAITokenCounter,
|
|
32
37
|
api_keys_required,
|
|
33
|
-
get_current_agent_session_id,
|
|
34
38
|
is_langfuse_available,
|
|
35
|
-
update_langfuse_trace,
|
|
36
39
|
)
|
|
37
40
|
|
|
41
|
+
logger = get_logger(__name__)
|
|
42
|
+
|
|
38
43
|
if os.environ.get("LANGFUSE_ENABLED", "False").lower() == "true":
|
|
39
44
|
try:
|
|
40
45
|
from langfuse.decorators import observe
|
|
41
46
|
except ImportError:
|
|
42
47
|
from camel.utils import observe
|
|
48
|
+
elif os.environ.get("TRACEROOT_ENABLED", "False").lower() == "true":
|
|
49
|
+
try:
|
|
50
|
+
from traceroot import trace as observe # type: ignore[import]
|
|
51
|
+
except ImportError:
|
|
52
|
+
from camel.utils import observe
|
|
43
53
|
else:
|
|
44
54
|
from camel.utils import observe
|
|
45
55
|
|
|
@@ -76,6 +86,23 @@ class OpenAIModel(BaseModelBackend):
|
|
|
76
86
|
API calls. If not provided, will fall back to the MODEL_TIMEOUT
|
|
77
87
|
environment variable or default to 180 seconds.
|
|
78
88
|
(default: :obj:`None`)
|
|
89
|
+
max_retries (int, optional): Maximum number of retries for API calls.
|
|
90
|
+
(default: :obj:`3`)
|
|
91
|
+
client (Optional[Any], optional): A custom synchronous OpenAI client
|
|
92
|
+
instance. If provided, this client will be used instead of
|
|
93
|
+
creating a new one. Useful for RL frameworks like AReaL or rLLM
|
|
94
|
+
that provide OpenAI-compatible clients. The client should
|
|
95
|
+
implement the OpenAI client interface with
|
|
96
|
+
`.chat.completions.create()` and `.beta.chat.completions.parse()`
|
|
97
|
+
methods. (default: :obj:`None`)
|
|
98
|
+
async_client (Optional[Any], optional): A custom asynchronous OpenAI
|
|
99
|
+
client instance. If provided, this client will be used instead of
|
|
100
|
+
creating a new one. The client should implement the AsyncOpenAI
|
|
101
|
+
client interface. (default: :obj:`None`)
|
|
102
|
+
**kwargs (Any): Additional arguments to pass to the
|
|
103
|
+
OpenAI client initialization. These can include parameters like
|
|
104
|
+
'organization', 'default_headers', 'http_client', etc.
|
|
105
|
+
Ignored if custom clients are provided.
|
|
79
106
|
"""
|
|
80
107
|
|
|
81
108
|
@api_keys_required(
|
|
@@ -91,6 +118,10 @@ class OpenAIModel(BaseModelBackend):
|
|
|
91
118
|
url: Optional[str] = None,
|
|
92
119
|
token_counter: Optional[BaseTokenCounter] = None,
|
|
93
120
|
timeout: Optional[float] = None,
|
|
121
|
+
max_retries: int = 3,
|
|
122
|
+
client: Optional[Any] = None,
|
|
123
|
+
async_client: Optional[Any] = None,
|
|
124
|
+
**kwargs: Any,
|
|
94
125
|
) -> None:
|
|
95
126
|
if model_config_dict is None:
|
|
96
127
|
model_config_dict = ChatGPTConfig().as_dict()
|
|
@@ -98,39 +129,61 @@ class OpenAIModel(BaseModelBackend):
|
|
|
98
129
|
url = url or os.environ.get("OPENAI_API_BASE_URL")
|
|
99
130
|
timeout = timeout or float(os.environ.get("MODEL_TIMEOUT", 180))
|
|
100
131
|
|
|
132
|
+
# Store additional client args for later use
|
|
133
|
+
self._max_retries = max_retries
|
|
134
|
+
|
|
101
135
|
super().__init__(
|
|
102
136
|
model_type, model_config_dict, api_key, url, token_counter, timeout
|
|
103
137
|
)
|
|
104
138
|
|
|
105
|
-
if
|
|
106
|
-
|
|
107
|
-
|
|
139
|
+
# Use custom clients if provided, otherwise create new ones
|
|
140
|
+
if client is not None:
|
|
141
|
+
# Use the provided custom sync client
|
|
142
|
+
self._client = client
|
|
143
|
+
else:
|
|
144
|
+
# Create default sync client
|
|
145
|
+
if is_langfuse_available():
|
|
146
|
+
from langfuse.openai import OpenAI as LangfuseOpenAI
|
|
147
|
+
|
|
148
|
+
self._client = LangfuseOpenAI(
|
|
149
|
+
timeout=self._timeout,
|
|
150
|
+
max_retries=self._max_retries,
|
|
151
|
+
base_url=self._url,
|
|
152
|
+
api_key=self._api_key,
|
|
153
|
+
**kwargs,
|
|
154
|
+
)
|
|
155
|
+
else:
|
|
156
|
+
self._client = OpenAI(
|
|
157
|
+
timeout=self._timeout,
|
|
158
|
+
max_retries=self._max_retries,
|
|
159
|
+
base_url=self._url,
|
|
160
|
+
api_key=self._api_key,
|
|
161
|
+
**kwargs,
|
|
162
|
+
)
|
|
108
163
|
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
base_url=self._url,
|
|
113
|
-
api_key=self._api_key,
|
|
114
|
-
)
|
|
115
|
-
self._async_client = LangfuseAsyncOpenAI(
|
|
116
|
-
timeout=self._timeout,
|
|
117
|
-
max_retries=3,
|
|
118
|
-
base_url=self._url,
|
|
119
|
-
api_key=self._api_key,
|
|
120
|
-
)
|
|
164
|
+
if async_client is not None:
|
|
165
|
+
# Use the provided custom async client
|
|
166
|
+
self._async_client = async_client
|
|
121
167
|
else:
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
168
|
+
# Create default async client
|
|
169
|
+
if is_langfuse_available():
|
|
170
|
+
from langfuse.openai import AsyncOpenAI as LangfuseAsyncOpenAI
|
|
171
|
+
|
|
172
|
+
self._async_client = LangfuseAsyncOpenAI(
|
|
173
|
+
timeout=self._timeout,
|
|
174
|
+
max_retries=self._max_retries,
|
|
175
|
+
base_url=self._url,
|
|
176
|
+
api_key=self._api_key,
|
|
177
|
+
**kwargs,
|
|
178
|
+
)
|
|
179
|
+
else:
|
|
180
|
+
self._async_client = AsyncOpenAI(
|
|
181
|
+
timeout=self._timeout,
|
|
182
|
+
max_retries=self._max_retries,
|
|
183
|
+
base_url=self._url,
|
|
184
|
+
api_key=self._api_key,
|
|
185
|
+
**kwargs,
|
|
186
|
+
)
|
|
134
187
|
|
|
135
188
|
def _sanitize_config(self, config_dict: Dict[str, Any]) -> Dict[str, Any]:
|
|
136
189
|
r"""Sanitize the model configuration for O1 models."""
|
|
@@ -221,7 +274,11 @@ class OpenAIModel(BaseModelBackend):
|
|
|
221
274
|
messages: List[OpenAIMessage],
|
|
222
275
|
response_format: Optional[Type[BaseModel]] = None,
|
|
223
276
|
tools: Optional[List[Dict[str, Any]]] = None,
|
|
224
|
-
) -> Union[
|
|
277
|
+
) -> Union[
|
|
278
|
+
ChatCompletion,
|
|
279
|
+
Stream[ChatCompletionChunk],
|
|
280
|
+
ChatCompletionStreamManager[BaseModel],
|
|
281
|
+
]:
|
|
225
282
|
r"""Runs inference of OpenAI chat completion.
|
|
226
283
|
|
|
227
284
|
Args:
|
|
@@ -233,33 +290,32 @@ class OpenAIModel(BaseModelBackend):
|
|
|
233
290
|
use for the request.
|
|
234
291
|
|
|
235
292
|
Returns:
|
|
236
|
-
Union[ChatCompletion, Stream[ChatCompletionChunk]
|
|
237
|
-
|
|
238
|
-
`
|
|
293
|
+
Union[ChatCompletion, Stream[ChatCompletionChunk],
|
|
294
|
+
ChatCompletionStreamManager[BaseModel]]:
|
|
295
|
+
`ChatCompletion` in the non-stream mode,
|
|
296
|
+
`Stream[ChatCompletionChunk]`in the stream mode,
|
|
297
|
+
or `ChatCompletionStreamManager[BaseModel]` for
|
|
298
|
+
structured output streaming.
|
|
239
299
|
"""
|
|
240
|
-
|
|
241
|
-
# Update Langfuse trace with current agent session and metadata
|
|
242
|
-
agent_session_id = get_current_agent_session_id()
|
|
243
|
-
if agent_session_id:
|
|
244
|
-
update_langfuse_trace(
|
|
245
|
-
session_id=agent_session_id,
|
|
246
|
-
metadata={
|
|
247
|
-
"source": "camel",
|
|
248
|
-
"agent_id": agent_session_id,
|
|
249
|
-
"agent_type": "camel_chat_agent",
|
|
250
|
-
"model_type": str(self.model_type),
|
|
251
|
-
},
|
|
252
|
-
tags=["CAMEL-AI", str(self.model_type)],
|
|
253
|
-
)
|
|
300
|
+
self._log_and_trace()
|
|
254
301
|
|
|
255
302
|
messages = self._adapt_messages_for_o1_models(messages)
|
|
256
303
|
response_format = response_format or self.model_config_dict.get(
|
|
257
304
|
"response_format", None
|
|
258
305
|
)
|
|
306
|
+
|
|
307
|
+
# Check if streaming is enabled
|
|
308
|
+
is_streaming = self.model_config_dict.get("stream", False)
|
|
309
|
+
|
|
259
310
|
if response_format:
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
311
|
+
if is_streaming:
|
|
312
|
+
# Use streaming parse for structured output
|
|
313
|
+
return self._request_stream_parse(
|
|
314
|
+
messages, response_format, tools
|
|
315
|
+
)
|
|
316
|
+
else:
|
|
317
|
+
# Use non-streaming parse for structured output
|
|
318
|
+
return self._request_parse(messages, response_format, tools)
|
|
263
319
|
else:
|
|
264
320
|
result = self._request_chat_completion(messages, tools)
|
|
265
321
|
|
|
@@ -271,7 +327,11 @@ class OpenAIModel(BaseModelBackend):
|
|
|
271
327
|
messages: List[OpenAIMessage],
|
|
272
328
|
response_format: Optional[Type[BaseModel]] = None,
|
|
273
329
|
tools: Optional[List[Dict[str, Any]]] = None,
|
|
274
|
-
) -> Union[
|
|
330
|
+
) -> Union[
|
|
331
|
+
ChatCompletion,
|
|
332
|
+
AsyncStream[ChatCompletionChunk],
|
|
333
|
+
AsyncChatCompletionStreamManager[BaseModel],
|
|
334
|
+
]:
|
|
275
335
|
r"""Runs inference of OpenAI chat completion in async mode.
|
|
276
336
|
|
|
277
337
|
Args:
|
|
@@ -283,33 +343,34 @@ class OpenAIModel(BaseModelBackend):
|
|
|
283
343
|
use for the request.
|
|
284
344
|
|
|
285
345
|
Returns:
|
|
286
|
-
Union[ChatCompletion, AsyncStream[ChatCompletionChunk]
|
|
287
|
-
|
|
288
|
-
`
|
|
346
|
+
Union[ChatCompletion, AsyncStream[ChatCompletionChunk],
|
|
347
|
+
AsyncChatCompletionStreamManager[BaseModel]]:
|
|
348
|
+
`ChatCompletion` in the non-stream mode,
|
|
349
|
+
`AsyncStream[ChatCompletionChunk]` in the stream mode, or
|
|
350
|
+
`AsyncChatCompletionStreamManager[BaseModel]` for
|
|
351
|
+
structured output streaming.
|
|
289
352
|
"""
|
|
290
|
-
|
|
291
|
-
# Update Langfuse trace with current agent session and metadata
|
|
292
|
-
agent_session_id = get_current_agent_session_id()
|
|
293
|
-
if agent_session_id:
|
|
294
|
-
update_langfuse_trace(
|
|
295
|
-
session_id=agent_session_id,
|
|
296
|
-
metadata={
|
|
297
|
-
"source": "camel",
|
|
298
|
-
"agent_id": agent_session_id,
|
|
299
|
-
"agent_type": "camel_chat_agent",
|
|
300
|
-
"model_type": str(self.model_type),
|
|
301
|
-
},
|
|
302
|
-
tags=["CAMEL-AI", str(self.model_type)],
|
|
303
|
-
)
|
|
353
|
+
self._log_and_trace()
|
|
304
354
|
|
|
305
355
|
messages = self._adapt_messages_for_o1_models(messages)
|
|
306
356
|
response_format = response_format or self.model_config_dict.get(
|
|
307
357
|
"response_format", None
|
|
308
358
|
)
|
|
359
|
+
|
|
360
|
+
# Check if streaming is enabled
|
|
361
|
+
is_streaming = self.model_config_dict.get("stream", False)
|
|
362
|
+
|
|
309
363
|
if response_format:
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
364
|
+
if is_streaming:
|
|
365
|
+
# Use streaming parse for structured output
|
|
366
|
+
return await self._arequest_stream_parse(
|
|
367
|
+
messages, response_format, tools
|
|
368
|
+
)
|
|
369
|
+
else:
|
|
370
|
+
# Use non-streaming parse for structured output
|
|
371
|
+
return await self._arequest_parse(
|
|
372
|
+
messages, response_format, tools
|
|
373
|
+
)
|
|
313
374
|
else:
|
|
314
375
|
result = await self._arequest_chat_completion(messages, tools)
|
|
315
376
|
|
|
@@ -405,20 +466,65 @@ class OpenAIModel(BaseModelBackend):
|
|
|
405
466
|
**request_config,
|
|
406
467
|
)
|
|
407
468
|
|
|
408
|
-
def
|
|
409
|
-
|
|
410
|
-
|
|
469
|
+
def _request_stream_parse(
|
|
470
|
+
self,
|
|
471
|
+
messages: List[OpenAIMessage],
|
|
472
|
+
response_format: Type[BaseModel],
|
|
473
|
+
tools: Optional[List[Dict[str, Any]]] = None,
|
|
474
|
+
) -> ChatCompletionStreamManager[BaseModel]:
|
|
475
|
+
r"""Request streaming structured output parsing.
|
|
411
476
|
|
|
412
|
-
|
|
413
|
-
ValueError: If the model configuration dictionary contains any
|
|
414
|
-
unexpected arguments to OpenAI API.
|
|
477
|
+
Note: This uses OpenAI's beta streaming API for structured outputs.
|
|
415
478
|
"""
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
479
|
+
import copy
|
|
480
|
+
|
|
481
|
+
request_config = copy.deepcopy(self.model_config_dict)
|
|
482
|
+
|
|
483
|
+
# Remove stream from config as it's handled by the stream method
|
|
484
|
+
request_config.pop("stream", None)
|
|
485
|
+
|
|
486
|
+
if tools is not None:
|
|
487
|
+
request_config["tools"] = tools
|
|
488
|
+
|
|
489
|
+
request_config = self._sanitize_config(request_config)
|
|
490
|
+
|
|
491
|
+
# Use the beta streaming API for structured outputs
|
|
492
|
+
return self._client.beta.chat.completions.stream(
|
|
493
|
+
messages=messages,
|
|
494
|
+
model=self.model_type,
|
|
495
|
+
response_format=response_format,
|
|
496
|
+
**request_config,
|
|
497
|
+
)
|
|
498
|
+
|
|
499
|
+
async def _arequest_stream_parse(
|
|
500
|
+
self,
|
|
501
|
+
messages: List[OpenAIMessage],
|
|
502
|
+
response_format: Type[BaseModel],
|
|
503
|
+
tools: Optional[List[Dict[str, Any]]] = None,
|
|
504
|
+
) -> AsyncChatCompletionStreamManager[BaseModel]:
|
|
505
|
+
r"""Request async streaming structured output parsing.
|
|
506
|
+
|
|
507
|
+
Note: This uses OpenAI's beta streaming API for structured outputs.
|
|
508
|
+
"""
|
|
509
|
+
import copy
|
|
510
|
+
|
|
511
|
+
request_config = copy.deepcopy(self.model_config_dict)
|
|
512
|
+
|
|
513
|
+
# Remove stream from config as it's handled by the stream method
|
|
514
|
+
request_config.pop("stream", None)
|
|
515
|
+
|
|
516
|
+
if tools is not None:
|
|
517
|
+
request_config["tools"] = tools
|
|
518
|
+
|
|
519
|
+
request_config = self._sanitize_config(request_config)
|
|
520
|
+
|
|
521
|
+
# Use the beta streaming API for structured outputs
|
|
522
|
+
return self._async_client.beta.chat.completions.stream(
|
|
523
|
+
messages=messages,
|
|
524
|
+
model=self.model_type,
|
|
525
|
+
response_format=response_format,
|
|
526
|
+
**request_config,
|
|
527
|
+
)
|
|
422
528
|
|
|
423
529
|
@property
|
|
424
530
|
def stream(self) -> bool:
|
camel/models/openrouter_model.py
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
# ========= Copyright 2023-
|
|
1
|
+
# ========= Copyright 2023-2026 @ 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-2026 @ 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 OpenRouterConfig
|
|
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 OpenRouterModel(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", "OPENROUTER_API_KEY")])
|
|
@@ -57,6 +61,8 @@ class OpenRouterModel(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 = OpenRouterConfig().as_dict()
|
|
@@ -72,20 +78,6 @@ class OpenRouterModel(OpenAICompatibleModel):
|
|
|
72
78
|
url=url,
|
|
73
79
|
token_counter=token_counter,
|
|
74
80
|
timeout=timeout,
|
|
81
|
+
max_retries=max_retries,
|
|
82
|
+
**kwargs,
|
|
75
83
|
)
|
|
76
|
-
|
|
77
|
-
def check_model_config(self):
|
|
78
|
-
r"""Check whether the model configuration contains any unexpected
|
|
79
|
-
arguments to OpenRouter API. But OpenRouter API does not have any
|
|
80
|
-
additional arguments to check.
|
|
81
|
-
|
|
82
|
-
Raises:
|
|
83
|
-
ValueError: If the model configuration dictionary contains any
|
|
84
|
-
unexpected arguments to OpenRouter API.
|
|
85
|
-
"""
|
|
86
|
-
for param in self.model_config_dict:
|
|
87
|
-
if param not in OPENROUTER_API_PARAMS:
|
|
88
|
-
raise ValueError(
|
|
89
|
-
f"Unexpected argument `{param}` is "
|
|
90
|
-
"input into OpenRouter model backend."
|
|
91
|
-
)
|
camel/models/ppio_model.py
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
# ========= Copyright 2023-
|
|
1
|
+
# ========= Copyright 2023-2026 @ 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,12 +10,12 @@
|
|
|
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-2026 @ CAMEL-AI.org. All Rights Reserved. =========
|
|
14
14
|
|
|
15
15
|
import os
|
|
16
16
|
from typing import Any, Dict, Optional, Union
|
|
17
17
|
|
|
18
|
-
from camel.configs import
|
|
18
|
+
from camel.configs import PPIOConfig
|
|
19
19
|
from camel.models.openai_compatible_model import OpenAICompatibleModel
|
|
20
20
|
from camel.types import ModelType
|
|
21
21
|
from camel.utils import (
|
|
@@ -47,6 +47,10 @@ class PPIOModel(OpenAICompatibleModel):
|
|
|
47
47
|
API calls. If not provided, will fall back to the MODEL_TIMEOUT
|
|
48
48
|
environment variable or default to 180 seconds.
|
|
49
49
|
(default: :obj:`None`)
|
|
50
|
+
max_retries (int, optional): Maximum number of retries for API calls.
|
|
51
|
+
(default: :obj:`3`)
|
|
52
|
+
**kwargs (Any): Additional arguments to pass to the client
|
|
53
|
+
initialization.
|
|
50
54
|
"""
|
|
51
55
|
|
|
52
56
|
@api_keys_required(
|
|
@@ -62,6 +66,8 @@ class PPIOModel(OpenAICompatibleModel):
|
|
|
62
66
|
url: Optional[str] = None,
|
|
63
67
|
token_counter: Optional[BaseTokenCounter] = None,
|
|
64
68
|
timeout: Optional[float] = None,
|
|
69
|
+
max_retries: int = 3,
|
|
70
|
+
**kwargs: Any,
|
|
65
71
|
) -> None:
|
|
66
72
|
if model_config_dict is None:
|
|
67
73
|
model_config_dict = PPIOConfig().as_dict()
|
|
@@ -77,19 +83,6 @@ class PPIOModel(OpenAICompatibleModel):
|
|
|
77
83
|
url=url,
|
|
78
84
|
token_counter=token_counter,
|
|
79
85
|
timeout=timeout,
|
|
86
|
+
max_retries=max_retries,
|
|
87
|
+
**kwargs,
|
|
80
88
|
)
|
|
81
|
-
|
|
82
|
-
def check_model_config(self):
|
|
83
|
-
r"""Check whether the model configuration contains any
|
|
84
|
-
unexpected arguments to PPIO API.
|
|
85
|
-
|
|
86
|
-
Raises:
|
|
87
|
-
ValueError: If the model configuration dictionary contains any
|
|
88
|
-
unexpected arguments to PPIO API.
|
|
89
|
-
"""
|
|
90
|
-
for param in self.model_config_dict:
|
|
91
|
-
if param not in PPIO_API_PARAMS:
|
|
92
|
-
raise ValueError(
|
|
93
|
-
f"Unexpected argument `{param}` is "
|
|
94
|
-
"input into PPIO model backend."
|
|
95
|
-
)
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
# ========= Copyright 2023-2026 @ 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-2026 @ CAMEL-AI.org. All Rights Reserved. =========
|
|
14
|
+
|
|
15
|
+
import os
|
|
16
|
+
from typing import Any, Dict, Optional, Union
|
|
17
|
+
|
|
18
|
+
from camel.configs import QianfanConfig
|
|
19
|
+
from camel.models.openai_compatible_model import OpenAICompatibleModel
|
|
20
|
+
from camel.types import ModelType
|
|
21
|
+
from camel.utils import (
|
|
22
|
+
BaseTokenCounter,
|
|
23
|
+
api_keys_required,
|
|
24
|
+
)
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
class QianfanModel(OpenAICompatibleModel):
|
|
28
|
+
r"""Constructor for Qianfan backend with OpenAI compatibility.
|
|
29
|
+
|
|
30
|
+
Args:
|
|
31
|
+
model_type (Union[ModelType, str]): Model for which a backend is
|
|
32
|
+
created, supported model can be found here:
|
|
33
|
+
https://cloud.baidu.com/doc/QIANFANWORKSHOP/s/Wm9cvy6rl
|
|
34
|
+
model_config_dict (Optional[Dict[str, Any]], optional): A dictionary
|
|
35
|
+
that will be fed into:obj:`openai.ChatCompletion.create()`. If
|
|
36
|
+
:obj:`None`, :obj:`QianfanConfig().as_dict()` will be used.
|
|
37
|
+
(default: :obj:`None`)
|
|
38
|
+
api_key (Optional[str], optional): The API key for authenticating with
|
|
39
|
+
the Qianfan service. (default: :obj:`None`)
|
|
40
|
+
url (Optional[str], optional): The url to the Qianfan service.
|
|
41
|
+
If not provided, "https://qianfan.baidubce.com/v2/chat/completions"
|
|
42
|
+
will be used.(default: :obj:`None`)
|
|
43
|
+
token_counter (Optional[BaseTokenCounter], optional): Token counter to
|
|
44
|
+
use for the model. If not provided, :obj:`OpenAITokenCounter(
|
|
45
|
+
ModelType.GPT_4O_MINI)` will be used.
|
|
46
|
+
timeout (Optional[float], optional): The timeout value in seconds for
|
|
47
|
+
API calls. If not provided, will fall back to the MODEL_TIMEOUT
|
|
48
|
+
environment variable or default to 180 seconds.
|
|
49
|
+
(default: :obj:`None`)
|
|
50
|
+
max_retries (Optional[int], optional): Maximum number of retries
|
|
51
|
+
for API calls. (default: :obj:`None`)
|
|
52
|
+
**kwargs: Additional model-specific parameters that will be passed
|
|
53
|
+
to the model constructor.
|
|
54
|
+
"""
|
|
55
|
+
|
|
56
|
+
@api_keys_required(
|
|
57
|
+
[
|
|
58
|
+
("api_key", 'QIANFAN_API_KEY'),
|
|
59
|
+
]
|
|
60
|
+
)
|
|
61
|
+
def __init__(
|
|
62
|
+
self,
|
|
63
|
+
model_type: Union[ModelType, str],
|
|
64
|
+
model_config_dict: Optional[Dict[str, Any]] = None,
|
|
65
|
+
api_key: Optional[str] = None,
|
|
66
|
+
url: Optional[str] = None,
|
|
67
|
+
token_counter: Optional[BaseTokenCounter] = None,
|
|
68
|
+
timeout: Optional[float] = None,
|
|
69
|
+
max_retries: int = 3,
|
|
70
|
+
**kwargs,
|
|
71
|
+
) -> None:
|
|
72
|
+
if model_config_dict is None:
|
|
73
|
+
model_config_dict = QianfanConfig().as_dict()
|
|
74
|
+
api_key = api_key or os.environ.get("QIANFAN_API_KEY")
|
|
75
|
+
url = url or os.environ.get(
|
|
76
|
+
"QIANFAN_API_BASE_URL",
|
|
77
|
+
"https://qianfan.baidubce.com/v2",
|
|
78
|
+
)
|
|
79
|
+
timeout = timeout or float(os.environ.get("MODEL_TIMEOUT", 180))
|
|
80
|
+
super().__init__(
|
|
81
|
+
model_type=model_type,
|
|
82
|
+
model_config_dict=model_config_dict,
|
|
83
|
+
api_key=api_key,
|
|
84
|
+
url=url,
|
|
85
|
+
token_counter=token_counter,
|
|
86
|
+
timeout=timeout,
|
|
87
|
+
max_retries=max_retries,
|
|
88
|
+
**kwargs,
|
|
89
|
+
)
|