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/samba_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,7 +10,7 @@
|
|
|
10
10
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
11
11
|
# See the License for the specific language governing permissions and
|
|
12
12
|
# limitations under the License.
|
|
13
|
-
# ========= Copyright 2023-
|
|
13
|
+
# ========= Copyright 2023-2025 @ CAMEL-AI.org. All Rights Reserved. =========
|
|
14
14
|
import json
|
|
15
15
|
import os
|
|
16
16
|
import time
|
|
@@ -22,8 +22,6 @@ from openai import AsyncOpenAI, AsyncStream, OpenAI, Stream
|
|
|
22
22
|
from pydantic import BaseModel
|
|
23
23
|
|
|
24
24
|
from camel.configs import (
|
|
25
|
-
SAMBA_CLOUD_API_PARAMS,
|
|
26
|
-
SAMBA_VERSE_API_PARAMS,
|
|
27
25
|
SambaCloudAPIConfig,
|
|
28
26
|
)
|
|
29
27
|
from camel.messages import OpenAIMessage
|
|
@@ -38,6 +36,9 @@ from camel.utils import (
|
|
|
38
36
|
BaseTokenCounter,
|
|
39
37
|
OpenAITokenCounter,
|
|
40
38
|
api_keys_required,
|
|
39
|
+
get_current_agent_session_id,
|
|
40
|
+
update_current_observation,
|
|
41
|
+
update_langfuse_trace,
|
|
41
42
|
)
|
|
42
43
|
|
|
43
44
|
try:
|
|
@@ -48,6 +49,14 @@ try:
|
|
|
48
49
|
except (ImportError, AttributeError):
|
|
49
50
|
LLMEvent = None
|
|
50
51
|
|
|
52
|
+
if os.environ.get("LANGFUSE_ENABLED", "False").lower() == "true":
|
|
53
|
+
try:
|
|
54
|
+
from langfuse.decorators import observe
|
|
55
|
+
except ImportError:
|
|
56
|
+
from camel.utils import observe
|
|
57
|
+
else:
|
|
58
|
+
from camel.utils import observe
|
|
59
|
+
|
|
51
60
|
|
|
52
61
|
class SambaModel(BaseModelBackend):
|
|
53
62
|
r"""SambaNova service interface.
|
|
@@ -77,6 +86,18 @@ class SambaModel(BaseModelBackend):
|
|
|
77
86
|
API calls. If not provided, will fall back to the MODEL_TIMEOUT
|
|
78
87
|
environment variable or default to 180 seconds.
|
|
79
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
|
|
92
|
+
OpenAI-compatible client instance. If provided, this client will
|
|
93
|
+
be used instead of creating a new one. Only applicable when using
|
|
94
|
+
SambaNova Cloud API. (default: :obj:`None`)
|
|
95
|
+
async_client (Optional[Any], optional): A custom asynchronous
|
|
96
|
+
OpenAI-compatible client instance. If provided, this client will
|
|
97
|
+
be used instead of creating a new one. Only applicable when using
|
|
98
|
+
SambaNova Cloud API. (default: :obj:`None`)
|
|
99
|
+
**kwargs (Any): Additional arguments to pass to the client
|
|
100
|
+
initialization. Ignored if custom clients are provided.
|
|
80
101
|
"""
|
|
81
102
|
|
|
82
103
|
@api_keys_required(
|
|
@@ -92,6 +113,10 @@ class SambaModel(BaseModelBackend):
|
|
|
92
113
|
url: Optional[str] = None,
|
|
93
114
|
token_counter: Optional[BaseTokenCounter] = None,
|
|
94
115
|
timeout: Optional[float] = None,
|
|
116
|
+
max_retries: int = 3,
|
|
117
|
+
client: Optional[Any] = None,
|
|
118
|
+
async_client: Optional[Any] = None,
|
|
119
|
+
**kwargs: Any,
|
|
95
120
|
) -> None:
|
|
96
121
|
if model_config_dict is None:
|
|
97
122
|
model_config_dict = SambaCloudAPIConfig().as_dict()
|
|
@@ -102,22 +127,39 @@ class SambaModel(BaseModelBackend):
|
|
|
102
127
|
)
|
|
103
128
|
timeout = timeout or float(os.environ.get("MODEL_TIMEOUT", 180))
|
|
104
129
|
super().__init__(
|
|
105
|
-
model_type,
|
|
130
|
+
model_type,
|
|
131
|
+
model_config_dict,
|
|
132
|
+
api_key,
|
|
133
|
+
url,
|
|
134
|
+
token_counter,
|
|
135
|
+
timeout,
|
|
136
|
+
max_retries,
|
|
106
137
|
)
|
|
107
138
|
|
|
139
|
+
# Only create clients for Cloud API mode
|
|
108
140
|
if self._url == "https://api.sambanova.ai/v1":
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
141
|
+
# Use custom clients if provided, otherwise create new ones
|
|
142
|
+
if client is not None:
|
|
143
|
+
self._client = client
|
|
144
|
+
else:
|
|
145
|
+
self._client = OpenAI(
|
|
146
|
+
timeout=self._timeout,
|
|
147
|
+
max_retries=self._max_retries,
|
|
148
|
+
base_url=self._url,
|
|
149
|
+
api_key=self._api_key,
|
|
150
|
+
**kwargs,
|
|
151
|
+
)
|
|
152
|
+
|
|
153
|
+
if async_client is not None:
|
|
154
|
+
self._async_client = async_client
|
|
155
|
+
else:
|
|
156
|
+
self._async_client = AsyncOpenAI(
|
|
157
|
+
timeout=self._timeout,
|
|
158
|
+
max_retries=self._max_retries,
|
|
159
|
+
base_url=self._url,
|
|
160
|
+
api_key=self._api_key,
|
|
161
|
+
**kwargs,
|
|
162
|
+
)
|
|
121
163
|
|
|
122
164
|
@property
|
|
123
165
|
def token_counter(self) -> BaseTokenCounter:
|
|
@@ -131,36 +173,7 @@ class SambaModel(BaseModelBackend):
|
|
|
131
173
|
self._token_counter = OpenAITokenCounter(ModelType.GPT_4O_MINI)
|
|
132
174
|
return self._token_counter
|
|
133
175
|
|
|
134
|
-
|
|
135
|
-
r"""Check whether the model configuration contains any
|
|
136
|
-
unexpected arguments to SambaNova API.
|
|
137
|
-
|
|
138
|
-
Raises:
|
|
139
|
-
ValueError: If the model configuration dictionary contains any
|
|
140
|
-
unexpected arguments to SambaNova API.
|
|
141
|
-
"""
|
|
142
|
-
if self._url == "https://sambaverse.sambanova.ai/api/predict":
|
|
143
|
-
for param in self.model_config_dict:
|
|
144
|
-
if param not in SAMBA_VERSE_API_PARAMS:
|
|
145
|
-
raise ValueError(
|
|
146
|
-
f"Unexpected argument `{param}` is "
|
|
147
|
-
"input into SambaVerse API."
|
|
148
|
-
)
|
|
149
|
-
|
|
150
|
-
elif self._url == "https://api.sambanova.ai/v1":
|
|
151
|
-
for param in self.model_config_dict:
|
|
152
|
-
if param not in SAMBA_CLOUD_API_PARAMS:
|
|
153
|
-
raise ValueError(
|
|
154
|
-
f"Unexpected argument `{param}` is "
|
|
155
|
-
"input into SambaCloud API."
|
|
156
|
-
)
|
|
157
|
-
|
|
158
|
-
else:
|
|
159
|
-
raise ValueError(
|
|
160
|
-
f"{self._url} is not supported, please check the url to the"
|
|
161
|
-
" SambaNova service"
|
|
162
|
-
)
|
|
163
|
-
|
|
176
|
+
@observe(as_type="generation")
|
|
164
177
|
async def _arun( # type: ignore[misc]
|
|
165
178
|
self,
|
|
166
179
|
messages: List[OpenAIMessage],
|
|
@@ -178,13 +191,42 @@ class SambaModel(BaseModelBackend):
|
|
|
178
191
|
`ChatCompletion` in the non-stream mode, or
|
|
179
192
|
`AsyncStream[ChatCompletionChunk]` in the stream mode.
|
|
180
193
|
"""
|
|
194
|
+
|
|
195
|
+
update_current_observation(
|
|
196
|
+
input={
|
|
197
|
+
"messages": messages,
|
|
198
|
+
"tools": tools,
|
|
199
|
+
},
|
|
200
|
+
model=str(self.model_type),
|
|
201
|
+
model_parameters=self.model_config_dict,
|
|
202
|
+
)
|
|
203
|
+
|
|
204
|
+
# Update Langfuse trace with current agent session and metadata
|
|
205
|
+
agent_session_id = get_current_agent_session_id()
|
|
206
|
+
if agent_session_id:
|
|
207
|
+
update_langfuse_trace(
|
|
208
|
+
session_id=agent_session_id,
|
|
209
|
+
metadata={
|
|
210
|
+
"source": "camel",
|
|
211
|
+
"agent_id": agent_session_id,
|
|
212
|
+
"agent_type": "camel_chat_agent",
|
|
213
|
+
"model_type": str(self.model_type),
|
|
214
|
+
},
|
|
215
|
+
tags=["CAMEL-AI", str(self.model_type)],
|
|
216
|
+
)
|
|
217
|
+
|
|
181
218
|
if "tools" in self.model_config_dict:
|
|
182
219
|
del self.model_config_dict["tools"]
|
|
183
220
|
if self.model_config_dict.get("stream") is True:
|
|
184
221
|
return await self._arun_streaming(messages)
|
|
185
222
|
else:
|
|
186
|
-
|
|
223
|
+
response = await self._arun_non_streaming(messages)
|
|
224
|
+
update_current_observation(
|
|
225
|
+
usage=response.usage,
|
|
226
|
+
)
|
|
227
|
+
return response
|
|
187
228
|
|
|
229
|
+
@observe(as_type="generation")
|
|
188
230
|
def _run( # type: ignore[misc]
|
|
189
231
|
self,
|
|
190
232
|
messages: List[OpenAIMessage],
|
|
@@ -202,12 +244,38 @@ class SambaModel(BaseModelBackend):
|
|
|
202
244
|
`ChatCompletion` in the non-stream mode, or
|
|
203
245
|
`Stream[ChatCompletionChunk]` in the stream mode.
|
|
204
246
|
"""
|
|
247
|
+
update_current_observation(
|
|
248
|
+
input={
|
|
249
|
+
"messages": messages,
|
|
250
|
+
"tools": tools,
|
|
251
|
+
},
|
|
252
|
+
model=str(self.model_type),
|
|
253
|
+
model_parameters=self.model_config_dict,
|
|
254
|
+
)
|
|
255
|
+
# Update Langfuse trace with current agent session and metadata
|
|
256
|
+
agent_session_id = get_current_agent_session_id()
|
|
257
|
+
if agent_session_id:
|
|
258
|
+
update_langfuse_trace(
|
|
259
|
+
session_id=agent_session_id,
|
|
260
|
+
metadata={
|
|
261
|
+
"source": "camel",
|
|
262
|
+
"agent_id": agent_session_id,
|
|
263
|
+
"agent_type": "camel_chat_agent",
|
|
264
|
+
"model_type": str(self.model_type),
|
|
265
|
+
},
|
|
266
|
+
tags=["CAMEL-AI", str(self.model_type)],
|
|
267
|
+
)
|
|
268
|
+
|
|
205
269
|
if "tools" in self.model_config_dict:
|
|
206
270
|
del self.model_config_dict["tools"]
|
|
207
271
|
if self.model_config_dict.get("stream") is True:
|
|
208
272
|
return self._run_streaming(messages)
|
|
209
273
|
else:
|
|
210
|
-
|
|
274
|
+
response = self._run_non_streaming(messages)
|
|
275
|
+
update_current_observation(
|
|
276
|
+
usage=response.usage,
|
|
277
|
+
)
|
|
278
|
+
return response
|
|
211
279
|
|
|
212
280
|
def _run_streaming(
|
|
213
281
|
self, messages: List[OpenAIMessage]
|
camel/models/sglang_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,7 +10,7 @@
|
|
|
10
10
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
11
11
|
# See the License for the specific language governing permissions and
|
|
12
12
|
# limitations under the License.
|
|
13
|
-
# ========= Copyright 2023-
|
|
13
|
+
# ========= Copyright 2023-2025 @ CAMEL-AI.org. All Rights Reserved. =========
|
|
14
14
|
import logging
|
|
15
15
|
import os
|
|
16
16
|
import subprocess
|
|
@@ -21,7 +21,7 @@ from typing import Any, Dict, List, Optional, Type, Union
|
|
|
21
21
|
from openai import AsyncOpenAI, AsyncStream, OpenAI, Stream
|
|
22
22
|
from pydantic import BaseModel
|
|
23
23
|
|
|
24
|
-
from camel.configs import
|
|
24
|
+
from camel.configs import SGLangConfig
|
|
25
25
|
from camel.messages import OpenAIMessage
|
|
26
26
|
from camel.models import BaseModelBackend
|
|
27
27
|
from camel.types import (
|
|
@@ -29,7 +29,21 @@ from camel.types import (
|
|
|
29
29
|
ChatCompletionChunk,
|
|
30
30
|
ModelType,
|
|
31
31
|
)
|
|
32
|
-
from camel.utils import
|
|
32
|
+
from camel.utils import (
|
|
33
|
+
BaseTokenCounter,
|
|
34
|
+
OpenAITokenCounter,
|
|
35
|
+
get_current_agent_session_id,
|
|
36
|
+
update_current_observation,
|
|
37
|
+
update_langfuse_trace,
|
|
38
|
+
)
|
|
39
|
+
|
|
40
|
+
if os.environ.get("LANGFUSE_ENABLED", "False").lower() == "true":
|
|
41
|
+
try:
|
|
42
|
+
from langfuse.decorators import observe
|
|
43
|
+
except ImportError:
|
|
44
|
+
from camel.utils import observe
|
|
45
|
+
else:
|
|
46
|
+
from camel.utils import observe
|
|
33
47
|
|
|
34
48
|
|
|
35
49
|
class SGLangModel(BaseModelBackend):
|
|
@@ -56,8 +70,21 @@ class SGLangModel(BaseModelBackend):
|
|
|
56
70
|
API calls. If not provided, will fall back to the MODEL_TIMEOUT
|
|
57
71
|
environment variable or default to 180 seconds.
|
|
58
72
|
(default: :obj:`None`)
|
|
59
|
-
|
|
60
|
-
|
|
73
|
+
max_retries (int, optional): Maximum number of retries for API calls.
|
|
74
|
+
(default: :obj:`3`)
|
|
75
|
+
client (Optional[Any], optional): A custom synchronous
|
|
76
|
+
OpenAI-compatible client instance. If provided, this client will
|
|
77
|
+
be used instead of creating a new one. Note: When using custom
|
|
78
|
+
clients with SGLang, server auto-start features will be disabled.
|
|
79
|
+
(default: :obj:`None`)
|
|
80
|
+
async_client (Optional[Any], optional): A custom asynchronous
|
|
81
|
+
OpenAI-compatible client instance. If provided, this client will
|
|
82
|
+
be used instead of creating a new one. (default: :obj:`None`)
|
|
83
|
+
**kwargs (Any): Additional arguments to pass to the client
|
|
84
|
+
initialization. Ignored if custom clients are provided.
|
|
85
|
+
|
|
86
|
+
Reference: https://sgl-project.github.io/backend/openai_api_completions.
|
|
87
|
+
html
|
|
61
88
|
"""
|
|
62
89
|
|
|
63
90
|
def __init__(
|
|
@@ -68,6 +95,10 @@ class SGLangModel(BaseModelBackend):
|
|
|
68
95
|
url: Optional[str] = None,
|
|
69
96
|
token_counter: Optional[BaseTokenCounter] = None,
|
|
70
97
|
timeout: Optional[float] = None,
|
|
98
|
+
max_retries: int = 3,
|
|
99
|
+
client: Optional[Any] = None,
|
|
100
|
+
async_client: Optional[Any] = None,
|
|
101
|
+
**kwargs: Any,
|
|
71
102
|
) -> None:
|
|
72
103
|
if model_config_dict is None:
|
|
73
104
|
model_config_dict = SGLangConfig().as_dict()
|
|
@@ -81,25 +112,42 @@ class SGLangModel(BaseModelBackend):
|
|
|
81
112
|
|
|
82
113
|
timeout = timeout or float(os.environ.get("MODEL_TIMEOUT", 180))
|
|
83
114
|
super().__init__(
|
|
84
|
-
model_type,
|
|
115
|
+
model_type,
|
|
116
|
+
model_config_dict,
|
|
117
|
+
api_key,
|
|
118
|
+
url,
|
|
119
|
+
token_counter,
|
|
120
|
+
timeout,
|
|
121
|
+
max_retries,
|
|
85
122
|
)
|
|
86
123
|
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
124
|
+
# Use custom clients if provided, otherwise create new ones
|
|
125
|
+
if client is not None:
|
|
126
|
+
self._client = client
|
|
127
|
+
elif self._url:
|
|
90
128
|
# Initialize the client if an existing URL is provided
|
|
91
129
|
self._client = OpenAI(
|
|
92
130
|
timeout=self._timeout,
|
|
93
|
-
max_retries=
|
|
131
|
+
max_retries=self._max_retries,
|
|
94
132
|
api_key="Set-but-ignored", # required but ignored
|
|
95
133
|
base_url=self._url,
|
|
134
|
+
**kwargs,
|
|
96
135
|
)
|
|
136
|
+
else:
|
|
137
|
+
self._client = None
|
|
138
|
+
|
|
139
|
+
if async_client is not None:
|
|
140
|
+
self._async_client = async_client
|
|
141
|
+
elif self._url:
|
|
97
142
|
self._async_client = AsyncOpenAI(
|
|
98
143
|
timeout=self._timeout,
|
|
99
|
-
max_retries=
|
|
144
|
+
max_retries=self._max_retries,
|
|
100
145
|
api_key="Set-but-ignored", # required but ignored
|
|
101
146
|
base_url=self._url,
|
|
147
|
+
**kwargs,
|
|
102
148
|
)
|
|
149
|
+
else:
|
|
150
|
+
self._async_client = None
|
|
103
151
|
|
|
104
152
|
def _start_server(self) -> None:
|
|
105
153
|
try:
|
|
@@ -130,13 +178,24 @@ class SGLangModel(BaseModelBackend):
|
|
|
130
178
|
)
|
|
131
179
|
self._inactivity_thread.start()
|
|
132
180
|
self.last_run_time = time.time()
|
|
133
|
-
# Initialize
|
|
134
|
-
self._client
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
181
|
+
# Initialize client after server starts if not already set
|
|
182
|
+
if self._client is None:
|
|
183
|
+
self._client = OpenAI(
|
|
184
|
+
timeout=self._timeout,
|
|
185
|
+
max_retries=self._max_retries,
|
|
186
|
+
api_key="Set-but-ignored", # required but ignored
|
|
187
|
+
base_url=self._url,
|
|
188
|
+
)
|
|
189
|
+
if (
|
|
190
|
+
not hasattr(self, '_async_client')
|
|
191
|
+
or self._async_client is None
|
|
192
|
+
):
|
|
193
|
+
self._async_client = AsyncOpenAI(
|
|
194
|
+
timeout=self._timeout,
|
|
195
|
+
max_retries=self._max_retries,
|
|
196
|
+
api_key="Set-but-ignored", # required but ignored
|
|
197
|
+
base_url=self._url,
|
|
198
|
+
)
|
|
140
199
|
except Exception as e:
|
|
141
200
|
raise RuntimeError(f"Failed to start SGLang server: {e}") from e
|
|
142
201
|
|
|
@@ -180,21 +239,7 @@ class SGLangModel(BaseModelBackend):
|
|
|
180
239
|
self._token_counter = OpenAITokenCounter(ModelType.GPT_4O_MINI)
|
|
181
240
|
return self._token_counter
|
|
182
241
|
|
|
183
|
-
|
|
184
|
-
r"""Check whether the model configuration contains any
|
|
185
|
-
unexpected arguments to SGLang API.
|
|
186
|
-
|
|
187
|
-
Raises:
|
|
188
|
-
ValueError: If the model configuration dictionary contains any
|
|
189
|
-
unexpected arguments to OpenAI API.
|
|
190
|
-
"""
|
|
191
|
-
for param in self.model_config_dict:
|
|
192
|
-
if param not in SGLANG_API_PARAMS:
|
|
193
|
-
raise ValueError(
|
|
194
|
-
f"Unexpected argument `{param}` is "
|
|
195
|
-
"input into SGLang model backend."
|
|
196
|
-
)
|
|
197
|
-
|
|
242
|
+
@observe(as_type='generation')
|
|
198
243
|
async def _arun(
|
|
199
244
|
self,
|
|
200
245
|
messages: List[OpenAIMessage],
|
|
@@ -213,26 +258,64 @@ class SGLangModel(BaseModelBackend):
|
|
|
213
258
|
`AsyncStream[ChatCompletionChunk]` in the stream mode.
|
|
214
259
|
"""
|
|
215
260
|
|
|
261
|
+
update_current_observation(
|
|
262
|
+
input={
|
|
263
|
+
"messages": messages,
|
|
264
|
+
"tools": tools,
|
|
265
|
+
},
|
|
266
|
+
model=str(self.model_type),
|
|
267
|
+
model_parameters=self.model_config_dict,
|
|
268
|
+
)
|
|
269
|
+
# Update Langfuse trace with current agent session and metadata
|
|
270
|
+
agent_session_id = get_current_agent_session_id()
|
|
271
|
+
if agent_session_id:
|
|
272
|
+
update_langfuse_trace(
|
|
273
|
+
session_id=agent_session_id,
|
|
274
|
+
metadata={
|
|
275
|
+
"source": "camel",
|
|
276
|
+
"agent_id": agent_session_id,
|
|
277
|
+
"agent_type": "camel_chat_agent",
|
|
278
|
+
"model_type": str(self.model_type),
|
|
279
|
+
},
|
|
280
|
+
tags=["CAMEL-AI", str(self.model_type)],
|
|
281
|
+
)
|
|
282
|
+
|
|
216
283
|
# Ensure server is running
|
|
217
284
|
self._ensure_server_running()
|
|
218
285
|
|
|
219
286
|
with self._lock:
|
|
220
287
|
# Update last run time
|
|
221
288
|
self.last_run_time = time.time()
|
|
289
|
+
async_client = self._async_client
|
|
222
290
|
|
|
223
|
-
if
|
|
291
|
+
if async_client is None:
|
|
224
292
|
raise RuntimeError(
|
|
225
293
|
"Client is not initialized. Ensure the server is running."
|
|
226
294
|
)
|
|
227
295
|
|
|
228
|
-
|
|
296
|
+
# Prepare additional parameters
|
|
297
|
+
extra_params: Dict[str, Any] = {}
|
|
298
|
+
if response_format is not None:
|
|
299
|
+
extra_params["response_format"] = response_format
|
|
300
|
+
if tools is not None:
|
|
301
|
+
extra_params["tools"] = tools
|
|
302
|
+
|
|
303
|
+
response = await async_client.chat.completions.create(
|
|
229
304
|
messages=messages,
|
|
230
305
|
model=self.model_type,
|
|
306
|
+
**extra_params,
|
|
231
307
|
**self.model_config_dict,
|
|
232
308
|
)
|
|
233
|
-
|
|
309
|
+
update_current_observation(
|
|
310
|
+
usage_details={
|
|
311
|
+
"prompt_tokens": response.usage.prompt_tokens,
|
|
312
|
+
"completion_tokens": response.usage.completion_tokens,
|
|
313
|
+
"total_tokens": response.usage.total_tokens,
|
|
314
|
+
},
|
|
315
|
+
)
|
|
234
316
|
return response
|
|
235
317
|
|
|
318
|
+
@observe(as_type='generation')
|
|
236
319
|
def _run(
|
|
237
320
|
self,
|
|
238
321
|
messages: List[OpenAIMessage],
|
|
@@ -250,6 +333,27 @@ class SGLangModel(BaseModelBackend):
|
|
|
250
333
|
`ChatCompletion` in the non-stream mode, or
|
|
251
334
|
`Stream[ChatCompletionChunk]` in the stream mode.
|
|
252
335
|
"""
|
|
336
|
+
update_current_observation(
|
|
337
|
+
input={
|
|
338
|
+
"messages": messages,
|
|
339
|
+
"tools": tools,
|
|
340
|
+
},
|
|
341
|
+
model=str(self.model_type),
|
|
342
|
+
model_parameters=self.model_config_dict,
|
|
343
|
+
)
|
|
344
|
+
# Update Langfuse trace with current agent session and metadata
|
|
345
|
+
agent_session_id = get_current_agent_session_id()
|
|
346
|
+
if agent_session_id:
|
|
347
|
+
update_langfuse_trace(
|
|
348
|
+
session_id=agent_session_id,
|
|
349
|
+
metadata={
|
|
350
|
+
"source": "camel",
|
|
351
|
+
"agent_id": agent_session_id,
|
|
352
|
+
"agent_type": "camel_chat_agent",
|
|
353
|
+
"model_type": str(self.model_type),
|
|
354
|
+
},
|
|
355
|
+
tags=["CAMEL-AI", str(self.model_type)],
|
|
356
|
+
)
|
|
253
357
|
|
|
254
358
|
# Ensure server is running
|
|
255
359
|
self._ensure_server_running()
|
|
@@ -257,17 +361,33 @@ class SGLangModel(BaseModelBackend):
|
|
|
257
361
|
with self._lock:
|
|
258
362
|
# Update last run time
|
|
259
363
|
self.last_run_time = time.time()
|
|
364
|
+
client = self._client
|
|
260
365
|
|
|
261
|
-
if
|
|
366
|
+
if client is None:
|
|
262
367
|
raise RuntimeError(
|
|
263
368
|
"Client is not initialized. Ensure the server is running."
|
|
264
369
|
)
|
|
265
370
|
|
|
266
|
-
|
|
371
|
+
# Prepare additional parameters
|
|
372
|
+
extra_params: Dict[str, Any] = {}
|
|
373
|
+
if response_format is not None:
|
|
374
|
+
extra_params["response_format"] = response_format
|
|
375
|
+
if tools is not None:
|
|
376
|
+
extra_params["tools"] = tools
|
|
377
|
+
|
|
378
|
+
response = client.chat.completions.create(
|
|
267
379
|
messages=messages,
|
|
268
380
|
model=self.model_type,
|
|
381
|
+
**extra_params,
|
|
269
382
|
**self.model_config_dict,
|
|
270
383
|
)
|
|
384
|
+
update_current_observation(
|
|
385
|
+
usage_details={
|
|
386
|
+
"prompt_tokens": response.usage.prompt_tokens,
|
|
387
|
+
"completion_tokens": response.usage.completion_tokens,
|
|
388
|
+
"total_tokens": response.usage.total_tokens,
|
|
389
|
+
},
|
|
390
|
+
)
|
|
271
391
|
|
|
272
392
|
return response
|
|
273
393
|
|
|
@@ -384,10 +504,10 @@ def _wait_for_server(base_url: str, timeout: Optional[float] = 30) -> None:
|
|
|
384
504
|
print(
|
|
385
505
|
"""\n
|
|
386
506
|
NOTE: Typically, the server runs in a separate terminal.
|
|
387
|
-
In this notebook, we run the server and notebook code
|
|
507
|
+
In this notebook, we run the server and notebook code
|
|
388
508
|
together, so their outputs are combined.
|
|
389
|
-
To improve clarity, the server logs are displayed in the
|
|
390
|
-
original black color, while the notebook outputs are
|
|
509
|
+
To improve clarity, the server logs are displayed in the
|
|
510
|
+
original black color, while the notebook outputs are
|
|
391
511
|
highlighted in blue.
|
|
392
512
|
"""
|
|
393
513
|
)
|
|
@@ -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,19 +10,13 @@
|
|
|
10
10
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
11
11
|
# See the License for the specific language governing permissions and
|
|
12
12
|
# limitations under the License.
|
|
13
|
-
# ========= Copyright 2023-
|
|
13
|
+
# ========= Copyright 2023-2025 @ CAMEL-AI.org. All Rights Reserved. =========
|
|
14
14
|
import os
|
|
15
|
-
from typing import Any, Dict,
|
|
15
|
+
from typing import Any, Dict, Optional, Union
|
|
16
16
|
|
|
17
|
-
from
|
|
18
|
-
from pydantic import BaseModel
|
|
19
|
-
|
|
20
|
-
from camel.configs import SILICONFLOW_API_PARAMS, SiliconFlowConfig
|
|
21
|
-
from camel.messages import OpenAIMessage
|
|
17
|
+
from camel.configs import SiliconFlowConfig
|
|
22
18
|
from camel.models.openai_compatible_model import OpenAICompatibleModel
|
|
23
19
|
from camel.types import (
|
|
24
|
-
ChatCompletion,
|
|
25
|
-
ChatCompletionChunk,
|
|
26
20
|
ModelType,
|
|
27
21
|
)
|
|
28
22
|
from camel.utils import (
|
|
@@ -54,6 +48,10 @@ class SiliconFlowModel(OpenAICompatibleModel):
|
|
|
54
48
|
API calls. If not provided, will fall back to the MODEL_TIMEOUT
|
|
55
49
|
environment variable or default to 180 seconds.
|
|
56
50
|
(default: :obj:`None`)
|
|
51
|
+
max_retries (int, optional): Maximum number of retries for API calls.
|
|
52
|
+
(default: :obj:`3`)
|
|
53
|
+
**kwargs (Any): Additional arguments to pass to the client
|
|
54
|
+
initialization.
|
|
57
55
|
"""
|
|
58
56
|
|
|
59
57
|
@api_keys_required(
|
|
@@ -69,6 +67,8 @@ class SiliconFlowModel(OpenAICompatibleModel):
|
|
|
69
67
|
url: Optional[str] = None,
|
|
70
68
|
token_counter: Optional[BaseTokenCounter] = None,
|
|
71
69
|
timeout: Optional[float] = None,
|
|
70
|
+
max_retries: int = 3,
|
|
71
|
+
**kwargs: Any,
|
|
72
72
|
) -> None:
|
|
73
73
|
if model_config_dict is None:
|
|
74
74
|
model_config_dict = SiliconFlowConfig().as_dict()
|
|
@@ -85,29 +85,6 @@ class SiliconFlowModel(OpenAICompatibleModel):
|
|
|
85
85
|
url=url,
|
|
86
86
|
token_counter=token_counter,
|
|
87
87
|
timeout=timeout,
|
|
88
|
+
max_retries=max_retries,
|
|
89
|
+
**kwargs,
|
|
88
90
|
)
|
|
89
|
-
|
|
90
|
-
async def _arun(
|
|
91
|
-
self,
|
|
92
|
-
messages: List[OpenAIMessage],
|
|
93
|
-
response_format: Optional[Type[BaseModel]] = None,
|
|
94
|
-
tools: Optional[List[Dict[str, Any]]] = None,
|
|
95
|
-
) -> Union[ChatCompletion, AsyncStream[ChatCompletionChunk]]:
|
|
96
|
-
raise NotImplementedError(
|
|
97
|
-
"SiliconFlow does not support async inference."
|
|
98
|
-
)
|
|
99
|
-
|
|
100
|
-
def check_model_config(self):
|
|
101
|
-
r"""Check whether the model configuration contains any
|
|
102
|
-
unexpected arguments to SiliconFlow API.
|
|
103
|
-
|
|
104
|
-
Raises:
|
|
105
|
-
ValueError: If the model configuration dictionary contains any
|
|
106
|
-
unexpected arguments to SiliconFlow API.
|
|
107
|
-
"""
|
|
108
|
-
for param in self.model_config_dict:
|
|
109
|
-
if param not in SILICONFLOW_API_PARAMS:
|
|
110
|
-
raise ValueError(
|
|
111
|
-
f"Unexpected argument `{param}` is "
|
|
112
|
-
"input into SiliconFlow model backend."
|
|
113
|
-
)
|