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/openai_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,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-2025 @ 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,8 +35,27 @@ from camel.utils import (
|
|
|
30
35
|
BaseTokenCounter,
|
|
31
36
|
OpenAITokenCounter,
|
|
32
37
|
api_keys_required,
|
|
38
|
+
get_current_agent_session_id,
|
|
39
|
+
is_langfuse_available,
|
|
40
|
+
update_langfuse_trace,
|
|
33
41
|
)
|
|
34
42
|
|
|
43
|
+
logger = get_logger(__name__)
|
|
44
|
+
|
|
45
|
+
if os.environ.get("LANGFUSE_ENABLED", "False").lower() == "true":
|
|
46
|
+
try:
|
|
47
|
+
from langfuse.decorators import observe
|
|
48
|
+
except ImportError:
|
|
49
|
+
from camel.utils import observe
|
|
50
|
+
elif os.environ.get("TRACEROOT_ENABLED", "False").lower() == "true":
|
|
51
|
+
try:
|
|
52
|
+
from traceroot import trace as observe # type: ignore[import]
|
|
53
|
+
except ImportError:
|
|
54
|
+
from camel.utils import observe
|
|
55
|
+
else:
|
|
56
|
+
from camel.utils import observe
|
|
57
|
+
|
|
58
|
+
|
|
35
59
|
UNSUPPORTED_PARAMS = {
|
|
36
60
|
"temperature",
|
|
37
61
|
"top_p",
|
|
@@ -64,6 +88,23 @@ class OpenAIModel(BaseModelBackend):
|
|
|
64
88
|
API calls. If not provided, will fall back to the MODEL_TIMEOUT
|
|
65
89
|
environment variable or default to 180 seconds.
|
|
66
90
|
(default: :obj:`None`)
|
|
91
|
+
max_retries (int, optional): Maximum number of retries for API calls.
|
|
92
|
+
(default: :obj:`3`)
|
|
93
|
+
client (Optional[Any], optional): A custom synchronous OpenAI client
|
|
94
|
+
instance. If provided, this client will be used instead of
|
|
95
|
+
creating a new one. Useful for RL frameworks like AReaL or rLLM
|
|
96
|
+
that provide OpenAI-compatible clients. The client should
|
|
97
|
+
implement the OpenAI client interface with
|
|
98
|
+
`.chat.completions.create()` and `.beta.chat.completions.parse()`
|
|
99
|
+
methods. (default: :obj:`None`)
|
|
100
|
+
async_client (Optional[Any], optional): A custom asynchronous OpenAI
|
|
101
|
+
client instance. If provided, this client will be used instead of
|
|
102
|
+
creating a new one. The client should implement the AsyncOpenAI
|
|
103
|
+
client interface. (default: :obj:`None`)
|
|
104
|
+
**kwargs (Any): Additional arguments to pass to the
|
|
105
|
+
OpenAI client initialization. These can include parameters like
|
|
106
|
+
'organization', 'default_headers', 'http_client', etc.
|
|
107
|
+
Ignored if custom clients are provided.
|
|
67
108
|
"""
|
|
68
109
|
|
|
69
110
|
@api_keys_required(
|
|
@@ -79,6 +120,10 @@ class OpenAIModel(BaseModelBackend):
|
|
|
79
120
|
url: Optional[str] = None,
|
|
80
121
|
token_counter: Optional[BaseTokenCounter] = None,
|
|
81
122
|
timeout: Optional[float] = None,
|
|
123
|
+
max_retries: int = 3,
|
|
124
|
+
client: Optional[Any] = None,
|
|
125
|
+
async_client: Optional[Any] = None,
|
|
126
|
+
**kwargs: Any,
|
|
82
127
|
) -> None:
|
|
83
128
|
if model_config_dict is None:
|
|
84
129
|
model_config_dict = ChatGPTConfig().as_dict()
|
|
@@ -86,22 +131,61 @@ class OpenAIModel(BaseModelBackend):
|
|
|
86
131
|
url = url or os.environ.get("OPENAI_API_BASE_URL")
|
|
87
132
|
timeout = timeout or float(os.environ.get("MODEL_TIMEOUT", 180))
|
|
88
133
|
|
|
134
|
+
# Store additional client args for later use
|
|
135
|
+
self._max_retries = max_retries
|
|
136
|
+
|
|
89
137
|
super().__init__(
|
|
90
138
|
model_type, model_config_dict, api_key, url, token_counter, timeout
|
|
91
139
|
)
|
|
92
140
|
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
141
|
+
# Use custom clients if provided, otherwise create new ones
|
|
142
|
+
if client is not None:
|
|
143
|
+
# Use the provided custom sync client
|
|
144
|
+
self._client = client
|
|
145
|
+
else:
|
|
146
|
+
# Create default sync client
|
|
147
|
+
if is_langfuse_available():
|
|
148
|
+
from langfuse.openai import OpenAI as LangfuseOpenAI
|
|
149
|
+
|
|
150
|
+
self._client = LangfuseOpenAI(
|
|
151
|
+
timeout=self._timeout,
|
|
152
|
+
max_retries=self._max_retries,
|
|
153
|
+
base_url=self._url,
|
|
154
|
+
api_key=self._api_key,
|
|
155
|
+
**kwargs,
|
|
156
|
+
)
|
|
157
|
+
else:
|
|
158
|
+
self._client = OpenAI(
|
|
159
|
+
timeout=self._timeout,
|
|
160
|
+
max_retries=self._max_retries,
|
|
161
|
+
base_url=self._url,
|
|
162
|
+
api_key=self._api_key,
|
|
163
|
+
**kwargs,
|
|
164
|
+
)
|
|
165
|
+
|
|
166
|
+
if async_client is not None:
|
|
167
|
+
# Use the provided custom async client
|
|
168
|
+
self._async_client = async_client
|
|
169
|
+
else:
|
|
170
|
+
# Create default async client
|
|
171
|
+
if is_langfuse_available():
|
|
172
|
+
from langfuse.openai import AsyncOpenAI as LangfuseAsyncOpenAI
|
|
173
|
+
|
|
174
|
+
self._async_client = LangfuseAsyncOpenAI(
|
|
175
|
+
timeout=self._timeout,
|
|
176
|
+
max_retries=self._max_retries,
|
|
177
|
+
base_url=self._url,
|
|
178
|
+
api_key=self._api_key,
|
|
179
|
+
**kwargs,
|
|
180
|
+
)
|
|
181
|
+
else:
|
|
182
|
+
self._async_client = AsyncOpenAI(
|
|
183
|
+
timeout=self._timeout,
|
|
184
|
+
max_retries=self._max_retries,
|
|
185
|
+
base_url=self._url,
|
|
186
|
+
api_key=self._api_key,
|
|
187
|
+
**kwargs,
|
|
188
|
+
)
|
|
105
189
|
|
|
106
190
|
def _sanitize_config(self, config_dict: Dict[str, Any]) -> Dict[str, Any]:
|
|
107
191
|
r"""Sanitize the model configuration for O1 models."""
|
|
@@ -113,6 +197,7 @@ class OpenAIModel(BaseModelBackend):
|
|
|
113
197
|
ModelType.O3_MINI,
|
|
114
198
|
ModelType.O3,
|
|
115
199
|
ModelType.O4_MINI,
|
|
200
|
+
ModelType.O3_PRO,
|
|
116
201
|
]:
|
|
117
202
|
warnings.warn(
|
|
118
203
|
"Warning: You are using an reasoning model (O series), "
|
|
@@ -185,12 +270,17 @@ class OpenAIModel(BaseModelBackend):
|
|
|
185
270
|
self._token_counter = OpenAITokenCounter(self.model_type)
|
|
186
271
|
return self._token_counter
|
|
187
272
|
|
|
273
|
+
@observe()
|
|
188
274
|
def _run(
|
|
189
275
|
self,
|
|
190
276
|
messages: List[OpenAIMessage],
|
|
191
277
|
response_format: Optional[Type[BaseModel]] = None,
|
|
192
278
|
tools: Optional[List[Dict[str, Any]]] = None,
|
|
193
|
-
) -> Union[
|
|
279
|
+
) -> Union[
|
|
280
|
+
ChatCompletion,
|
|
281
|
+
Stream[ChatCompletionChunk],
|
|
282
|
+
ChatCompletionStreamManager[BaseModel],
|
|
283
|
+
]:
|
|
194
284
|
r"""Runs inference of OpenAI chat completion.
|
|
195
285
|
|
|
196
286
|
Args:
|
|
@@ -202,25 +292,67 @@ class OpenAIModel(BaseModelBackend):
|
|
|
202
292
|
use for the request.
|
|
203
293
|
|
|
204
294
|
Returns:
|
|
205
|
-
Union[ChatCompletion, Stream[ChatCompletionChunk]
|
|
206
|
-
|
|
207
|
-
`
|
|
295
|
+
Union[ChatCompletion, Stream[ChatCompletionChunk],
|
|
296
|
+
ChatCompletionStreamManager[BaseModel]]:
|
|
297
|
+
`ChatCompletion` in the non-stream mode,
|
|
298
|
+
`Stream[ChatCompletionChunk]`in the stream mode,
|
|
299
|
+
or `ChatCompletionStreamManager[BaseModel]` for
|
|
300
|
+
structured output streaming.
|
|
208
301
|
"""
|
|
302
|
+
|
|
303
|
+
# Update Langfuse trace with current agent session and metadata
|
|
304
|
+
agent_session_id = get_current_agent_session_id()
|
|
305
|
+
model_type_str = str(self.model_type)
|
|
306
|
+
if not agent_session_id:
|
|
307
|
+
agent_session_id = "no-session-id"
|
|
308
|
+
metadata = {
|
|
309
|
+
"source": "camel",
|
|
310
|
+
"agent_id": agent_session_id,
|
|
311
|
+
"agent_type": "camel_chat_agent",
|
|
312
|
+
"model_type": model_type_str,
|
|
313
|
+
}
|
|
314
|
+
metadata = {k: str(v) for k, v in metadata.items()}
|
|
315
|
+
if agent_session_id:
|
|
316
|
+
update_langfuse_trace(
|
|
317
|
+
session_id=agent_session_id,
|
|
318
|
+
metadata=metadata,
|
|
319
|
+
tags=["CAMEL-AI", model_type_str],
|
|
320
|
+
)
|
|
321
|
+
logger.info(f"metadata: {metadata}")
|
|
322
|
+
|
|
209
323
|
messages = self._adapt_messages_for_o1_models(messages)
|
|
210
324
|
response_format = response_format or self.model_config_dict.get(
|
|
211
325
|
"response_format", None
|
|
212
326
|
)
|
|
327
|
+
|
|
328
|
+
# Check if streaming is enabled
|
|
329
|
+
is_streaming = self.model_config_dict.get("stream", False)
|
|
330
|
+
|
|
213
331
|
if response_format:
|
|
214
|
-
|
|
332
|
+
if is_streaming:
|
|
333
|
+
# Use streaming parse for structured output
|
|
334
|
+
return self._request_stream_parse(
|
|
335
|
+
messages, response_format, tools
|
|
336
|
+
)
|
|
337
|
+
else:
|
|
338
|
+
# Use non-streaming parse for structured output
|
|
339
|
+
return self._request_parse(messages, response_format, tools)
|
|
215
340
|
else:
|
|
216
|
-
|
|
341
|
+
result = self._request_chat_completion(messages, tools)
|
|
342
|
+
|
|
343
|
+
return result
|
|
217
344
|
|
|
345
|
+
@observe()
|
|
218
346
|
async def _arun(
|
|
219
347
|
self,
|
|
220
348
|
messages: List[OpenAIMessage],
|
|
221
349
|
response_format: Optional[Type[BaseModel]] = None,
|
|
222
350
|
tools: Optional[List[Dict[str, Any]]] = None,
|
|
223
|
-
) -> Union[
|
|
351
|
+
) -> Union[
|
|
352
|
+
ChatCompletion,
|
|
353
|
+
AsyncStream[ChatCompletionChunk],
|
|
354
|
+
AsyncChatCompletionStreamManager[BaseModel],
|
|
355
|
+
]:
|
|
224
356
|
r"""Runs inference of OpenAI chat completion in async mode.
|
|
225
357
|
|
|
226
358
|
Args:
|
|
@@ -232,17 +364,56 @@ class OpenAIModel(BaseModelBackend):
|
|
|
232
364
|
use for the request.
|
|
233
365
|
|
|
234
366
|
Returns:
|
|
235
|
-
Union[ChatCompletion, AsyncStream[ChatCompletionChunk]
|
|
236
|
-
|
|
237
|
-
`
|
|
367
|
+
Union[ChatCompletion, AsyncStream[ChatCompletionChunk],
|
|
368
|
+
AsyncChatCompletionStreamManager[BaseModel]]:
|
|
369
|
+
`ChatCompletion` in the non-stream mode,
|
|
370
|
+
`AsyncStream[ChatCompletionChunk]` in the stream mode, or
|
|
371
|
+
`AsyncChatCompletionStreamManager[BaseModel]` for
|
|
372
|
+
structured output streaming.
|
|
238
373
|
"""
|
|
374
|
+
|
|
375
|
+
# Update Langfuse trace with current agent session and metadata
|
|
376
|
+
agent_session_id = get_current_agent_session_id()
|
|
377
|
+
model_type_str = str(self.model_type)
|
|
378
|
+
if not agent_session_id:
|
|
379
|
+
agent_session_id = "no-session-id"
|
|
380
|
+
metadata = {
|
|
381
|
+
"source": "camel",
|
|
382
|
+
"agent_id": agent_session_id,
|
|
383
|
+
"agent_type": "camel_chat_agent",
|
|
384
|
+
"model_type": model_type_str,
|
|
385
|
+
}
|
|
386
|
+
metadata = {k: str(v) for k, v in metadata.items()}
|
|
387
|
+
update_langfuse_trace(
|
|
388
|
+
session_id=agent_session_id,
|
|
389
|
+
metadata=metadata,
|
|
390
|
+
tags=["CAMEL-AI", model_type_str],
|
|
391
|
+
)
|
|
392
|
+
logger.info(f"metadata: {metadata}")
|
|
393
|
+
|
|
394
|
+
messages = self._adapt_messages_for_o1_models(messages)
|
|
239
395
|
response_format = response_format or self.model_config_dict.get(
|
|
240
396
|
"response_format", None
|
|
241
397
|
)
|
|
398
|
+
|
|
399
|
+
# Check if streaming is enabled
|
|
400
|
+
is_streaming = self.model_config_dict.get("stream", False)
|
|
401
|
+
|
|
242
402
|
if response_format:
|
|
243
|
-
|
|
403
|
+
if is_streaming:
|
|
404
|
+
# Use streaming parse for structured output
|
|
405
|
+
return await self._arequest_stream_parse(
|
|
406
|
+
messages, response_format, tools
|
|
407
|
+
)
|
|
408
|
+
else:
|
|
409
|
+
# Use non-streaming parse for structured output
|
|
410
|
+
return await self._arequest_parse(
|
|
411
|
+
messages, response_format, tools
|
|
412
|
+
)
|
|
244
413
|
else:
|
|
245
|
-
|
|
414
|
+
result = await self._arequest_chat_completion(messages, tools)
|
|
415
|
+
|
|
416
|
+
return result
|
|
246
417
|
|
|
247
418
|
def _request_chat_completion(
|
|
248
419
|
self,
|
|
@@ -334,20 +505,65 @@ class OpenAIModel(BaseModelBackend):
|
|
|
334
505
|
**request_config,
|
|
335
506
|
)
|
|
336
507
|
|
|
337
|
-
def
|
|
338
|
-
|
|
339
|
-
|
|
508
|
+
def _request_stream_parse(
|
|
509
|
+
self,
|
|
510
|
+
messages: List[OpenAIMessage],
|
|
511
|
+
response_format: Type[BaseModel],
|
|
512
|
+
tools: Optional[List[Dict[str, Any]]] = None,
|
|
513
|
+
) -> ChatCompletionStreamManager[BaseModel]:
|
|
514
|
+
r"""Request streaming structured output parsing.
|
|
340
515
|
|
|
341
|
-
|
|
342
|
-
ValueError: If the model configuration dictionary contains any
|
|
343
|
-
unexpected arguments to OpenAI API.
|
|
516
|
+
Note: This uses OpenAI's beta streaming API for structured outputs.
|
|
344
517
|
"""
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
518
|
+
import copy
|
|
519
|
+
|
|
520
|
+
request_config = copy.deepcopy(self.model_config_dict)
|
|
521
|
+
|
|
522
|
+
# Remove stream from config as it's handled by the stream method
|
|
523
|
+
request_config.pop("stream", None)
|
|
524
|
+
|
|
525
|
+
if tools is not None:
|
|
526
|
+
request_config["tools"] = tools
|
|
527
|
+
|
|
528
|
+
request_config = self._sanitize_config(request_config)
|
|
529
|
+
|
|
530
|
+
# Use the beta streaming API for structured outputs
|
|
531
|
+
return self._client.beta.chat.completions.stream(
|
|
532
|
+
messages=messages,
|
|
533
|
+
model=self.model_type,
|
|
534
|
+
response_format=response_format,
|
|
535
|
+
**request_config,
|
|
536
|
+
)
|
|
537
|
+
|
|
538
|
+
async def _arequest_stream_parse(
|
|
539
|
+
self,
|
|
540
|
+
messages: List[OpenAIMessage],
|
|
541
|
+
response_format: Type[BaseModel],
|
|
542
|
+
tools: Optional[List[Dict[str, Any]]] = None,
|
|
543
|
+
) -> AsyncChatCompletionStreamManager[BaseModel]:
|
|
544
|
+
r"""Request async streaming structured output parsing.
|
|
545
|
+
|
|
546
|
+
Note: This uses OpenAI's beta streaming API for structured outputs.
|
|
547
|
+
"""
|
|
548
|
+
import copy
|
|
549
|
+
|
|
550
|
+
request_config = copy.deepcopy(self.model_config_dict)
|
|
551
|
+
|
|
552
|
+
# Remove stream from config as it's handled by the stream method
|
|
553
|
+
request_config.pop("stream", None)
|
|
554
|
+
|
|
555
|
+
if tools is not None:
|
|
556
|
+
request_config["tools"] = tools
|
|
557
|
+
|
|
558
|
+
request_config = self._sanitize_config(request_config)
|
|
559
|
+
|
|
560
|
+
# Use the beta streaming API for structured outputs
|
|
561
|
+
return self._async_client.beta.chat.completions.stream(
|
|
562
|
+
messages=messages,
|
|
563
|
+
model=self.model_type,
|
|
564
|
+
response_format=response_format,
|
|
565
|
+
**request_config,
|
|
566
|
+
)
|
|
351
567
|
|
|
352
568
|
@property
|
|
353
569
|
def stream(self) -> bool:
|
camel/models/openrouter_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 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-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,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-2025 @ 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-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 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
|
+
)
|