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/model_factory.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,27 +10,33 @@
|
|
|
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
|
-
|
|
16
|
-
|
|
17
|
-
import yaml
|
|
15
|
+
import os
|
|
16
|
+
from typing import Any, ClassVar, Dict, Optional, Type, Union
|
|
18
17
|
|
|
18
|
+
from camel.models.aihubmix_model import AihubMixModel
|
|
19
19
|
from camel.models.aiml_model import AIMLModel
|
|
20
|
+
from camel.models.amd_model import AMDModel
|
|
20
21
|
from camel.models.anthropic_model import AnthropicModel
|
|
21
22
|
from camel.models.aws_bedrock_model import AWSBedrockModel
|
|
22
23
|
from camel.models.azure_openai_model import AzureOpenAIModel
|
|
23
24
|
from camel.models.base_model import BaseModelBackend
|
|
25
|
+
from camel.models.cerebras_model import CerebrasModel
|
|
24
26
|
from camel.models.cohere_model import CohereModel
|
|
27
|
+
from camel.models.cometapi_model import CometAPIModel
|
|
28
|
+
from camel.models.crynux_model import CrynuxModel
|
|
25
29
|
from camel.models.deepseek_model import DeepSeekModel
|
|
26
30
|
from camel.models.gemini_model import GeminiModel
|
|
27
31
|
from camel.models.groq_model import GroqModel
|
|
28
32
|
from camel.models.internlm_model import InternLMModel
|
|
29
33
|
from camel.models.litellm_model import LiteLLMModel
|
|
30
34
|
from camel.models.lmstudio_model import LMStudioModel
|
|
35
|
+
from camel.models.minimax_model import MinimaxModel
|
|
31
36
|
from camel.models.mistral_model import MistralModel
|
|
32
37
|
from camel.models.modelscope_model import ModelScopeModel
|
|
33
38
|
from camel.models.moonshot_model import MoonshotModel
|
|
39
|
+
from camel.models.nebius_model import NebiusModel
|
|
34
40
|
from camel.models.netmind_model import NetmindModel
|
|
35
41
|
from camel.models.novita_model import NovitaModel
|
|
36
42
|
from camel.models.nvidia_model import NvidiaModel
|
|
@@ -39,6 +45,7 @@ from camel.models.openai_compatible_model import OpenAICompatibleModel
|
|
|
39
45
|
from camel.models.openai_model import OpenAIModel
|
|
40
46
|
from camel.models.openrouter_model import OpenRouterModel
|
|
41
47
|
from camel.models.ppio_model import PPIOModel
|
|
48
|
+
from camel.models.qianfan_model import QianfanModel
|
|
42
49
|
from camel.models.qwen_model import QwenModel
|
|
43
50
|
from camel.models.reka_model import RekaModel
|
|
44
51
|
from camel.models.samba_model import SambaModel
|
|
@@ -52,7 +59,7 @@ from camel.models.watsonx_model import WatsonXModel
|
|
|
52
59
|
from camel.models.yi_model import YiModel
|
|
53
60
|
from camel.models.zhipuai_model import ZhipuAIModel
|
|
54
61
|
from camel.types import ModelPlatformType, ModelType, UnifiedModelType
|
|
55
|
-
from camel.utils import BaseTokenCounter
|
|
62
|
+
from camel.utils import BaseTokenCounter, configure_langfuse
|
|
56
63
|
|
|
57
64
|
|
|
58
65
|
class ModelFactory:
|
|
@@ -75,6 +82,7 @@ class ModelFactory:
|
|
|
75
82
|
ModelPlatformType.AWS_BEDROCK: AWSBedrockModel,
|
|
76
83
|
ModelPlatformType.NVIDIA: NvidiaModel,
|
|
77
84
|
ModelPlatformType.SILICONFLOW: SiliconFlowModel,
|
|
85
|
+
ModelPlatformType.AMD: AMDModel,
|
|
78
86
|
ModelPlatformType.AIML: AIMLModel,
|
|
79
87
|
ModelPlatformType.VOLCANO: VolcanoModel,
|
|
80
88
|
ModelPlatformType.NETMIND: NetmindModel,
|
|
@@ -82,7 +90,11 @@ class ModelFactory:
|
|
|
82
90
|
ModelPlatformType.AZURE: AzureOpenAIModel,
|
|
83
91
|
ModelPlatformType.ANTHROPIC: AnthropicModel,
|
|
84
92
|
ModelPlatformType.GROQ: GroqModel,
|
|
93
|
+
ModelPlatformType.CEREBRAS: CerebrasModel,
|
|
94
|
+
ModelPlatformType.COMETAPI: CometAPIModel,
|
|
95
|
+
ModelPlatformType.NEBIUS: NebiusModel,
|
|
85
96
|
ModelPlatformType.LMSTUDIO: LMStudioModel,
|
|
97
|
+
ModelPlatformType.MINIMAX: MinimaxModel,
|
|
86
98
|
ModelPlatformType.OPENROUTER: OpenRouterModel,
|
|
87
99
|
ModelPlatformType.ZHIPU: ZhipuAIModel,
|
|
88
100
|
ModelPlatformType.GEMINI: GeminiModel,
|
|
@@ -98,6 +110,9 @@ class ModelFactory:
|
|
|
98
110
|
ModelPlatformType.MODELSCOPE: ModelScopeModel,
|
|
99
111
|
ModelPlatformType.NOVITA: NovitaModel,
|
|
100
112
|
ModelPlatformType.WATSONX: WatsonXModel,
|
|
113
|
+
ModelPlatformType.QIANFAN: QianfanModel,
|
|
114
|
+
ModelPlatformType.CRYNUX: CrynuxModel,
|
|
115
|
+
ModelPlatformType.AIHUBMIX: AihubMixModel,
|
|
101
116
|
}
|
|
102
117
|
|
|
103
118
|
@staticmethod
|
|
@@ -109,6 +124,9 @@ class ModelFactory:
|
|
|
109
124
|
api_key: Optional[str] = None,
|
|
110
125
|
url: Optional[str] = None,
|
|
111
126
|
timeout: Optional[float] = None,
|
|
127
|
+
max_retries: int = 3,
|
|
128
|
+
client: Optional[Any] = None,
|
|
129
|
+
async_client: Optional[Any] = None,
|
|
112
130
|
**kwargs,
|
|
113
131
|
) -> BaseModelBackend:
|
|
114
132
|
r"""Creates an instance of `BaseModelBackend` of the specified type.
|
|
@@ -133,6 +151,16 @@ class ModelFactory:
|
|
|
133
151
|
(default: :obj:`None`)
|
|
134
152
|
timeout (Optional[float], optional): The timeout value in seconds
|
|
135
153
|
for API calls. (default: :obj:`None`)
|
|
154
|
+
max_retries (int, optional): Maximum number of retries
|
|
155
|
+
for API calls. (default: :obj:`3`)
|
|
156
|
+
client (Optional[Any], optional): A custom synchronous client
|
|
157
|
+
instance. Supported by models that use OpenAI-compatible APIs
|
|
158
|
+
. The client should implement the appropriate client interface
|
|
159
|
+
for the platform. (default: :obj:`None`)
|
|
160
|
+
async_client (Optional[Any], optional): A custom asynchronous
|
|
161
|
+
client instance. Supported by models that use OpenAI-compatible
|
|
162
|
+
APIs. The client should implement the appropriate async client
|
|
163
|
+
interface for the platform. (default: :obj:`None`)
|
|
136
164
|
**kwargs: Additional model-specific parameters that will be passed
|
|
137
165
|
to the model constructor. For example, Azure OpenAI models may
|
|
138
166
|
require `api_version`, `azure_deployment_name`,
|
|
@@ -144,6 +172,12 @@ class ModelFactory:
|
|
|
144
172
|
Raises:
|
|
145
173
|
ValueError: If there is no backend for the model.
|
|
146
174
|
"""
|
|
175
|
+
|
|
176
|
+
# Auto-configure Langfuse only if explicitly enabled
|
|
177
|
+
env_enabled_str = os.environ.get("LANGFUSE_ENABLED")
|
|
178
|
+
if env_enabled_str and env_enabled_str.lower() == "true":
|
|
179
|
+
configure_langfuse()
|
|
180
|
+
|
|
147
181
|
# Convert string to ModelPlatformType enum if needed
|
|
148
182
|
if isinstance(model_platform, str):
|
|
149
183
|
try:
|
|
@@ -172,6 +206,12 @@ class ModelFactory:
|
|
|
172
206
|
if model_class is None:
|
|
173
207
|
raise ValueError(f"Unknown model platform `{model_platform}`")
|
|
174
208
|
|
|
209
|
+
# Pass client and async_client via kwargs if provided
|
|
210
|
+
if client is not None:
|
|
211
|
+
kwargs['client'] = client
|
|
212
|
+
if async_client is not None:
|
|
213
|
+
kwargs['async_client'] = async_client
|
|
214
|
+
|
|
175
215
|
return model_class(
|
|
176
216
|
model_type=model_type,
|
|
177
217
|
model_config_dict=model_config_dict,
|
|
@@ -179,6 +219,7 @@ class ModelFactory:
|
|
|
179
219
|
url=url,
|
|
180
220
|
token_counter=token_counter,
|
|
181
221
|
timeout=timeout,
|
|
222
|
+
max_retries=max_retries,
|
|
182
223
|
**kwargs,
|
|
183
224
|
)
|
|
184
225
|
|
|
@@ -221,6 +262,8 @@ class ModelFactory:
|
|
|
221
262
|
|
|
222
263
|
@classmethod
|
|
223
264
|
def __load_yaml(cls, filepath: str) -> Dict:
|
|
265
|
+
import yaml
|
|
266
|
+
|
|
224
267
|
r"""Loads and parses a YAML file into a dictionary.
|
|
225
268
|
|
|
226
269
|
Args:
|
camel/models/model_manager.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,8 +10,9 @@
|
|
|
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
|
+
import asyncio
|
|
15
16
|
import logging
|
|
16
17
|
from itertools import cycle
|
|
17
18
|
from random import choice
|
|
@@ -26,6 +27,10 @@ from typing import (
|
|
|
26
27
|
)
|
|
27
28
|
|
|
28
29
|
from openai import AsyncStream, Stream
|
|
30
|
+
from openai.lib.streaming.chat import (
|
|
31
|
+
AsyncChatCompletionStreamManager,
|
|
32
|
+
ChatCompletionStreamManager,
|
|
33
|
+
)
|
|
29
34
|
from pydantic import BaseModel
|
|
30
35
|
|
|
31
36
|
from camel.messages import OpenAIMessage
|
|
@@ -69,6 +74,7 @@ class ModelManager:
|
|
|
69
74
|
self.models = [models]
|
|
70
75
|
self.models_cycle = cycle(self.models)
|
|
71
76
|
self.current_model = self.models[0]
|
|
77
|
+
self.lock = asyncio.Lock()
|
|
72
78
|
|
|
73
79
|
# Set the scheduling strategy; default is round-robin
|
|
74
80
|
try:
|
|
@@ -194,7 +200,11 @@ class ModelManager:
|
|
|
194
200
|
messages: List[OpenAIMessage],
|
|
195
201
|
response_format: Optional[Type[BaseModel]] = None,
|
|
196
202
|
tools: Optional[List[Dict[str, Any]]] = None,
|
|
197
|
-
) -> Union[
|
|
203
|
+
) -> Union[
|
|
204
|
+
ChatCompletion,
|
|
205
|
+
Stream[ChatCompletionChunk],
|
|
206
|
+
ChatCompletionStreamManager[BaseModel],
|
|
207
|
+
]:
|
|
198
208
|
r"""Process a list of messages by selecting a model based on
|
|
199
209
|
the scheduling strategy.
|
|
200
210
|
Sends the entire list of messages to the selected model,
|
|
@@ -205,9 +215,12 @@ class ModelManager:
|
|
|
205
215
|
history in OpenAI API format.
|
|
206
216
|
|
|
207
217
|
Returns:
|
|
208
|
-
Union[ChatCompletion, Stream[ChatCompletionChunk]
|
|
218
|
+
Union[ChatCompletion, Stream[ChatCompletionChunk],
|
|
219
|
+
ChatCompletionStreamManager[BaseModel]]:
|
|
209
220
|
`ChatCompletion` in the non-stream mode, or
|
|
210
|
-
`Stream[ChatCompletionChunk]` in the stream mode
|
|
221
|
+
`Stream[ChatCompletionChunk]` in the stream mode, or
|
|
222
|
+
`ChatCompletionStreamManager[BaseModel]` for
|
|
223
|
+
structured-output stream.
|
|
211
224
|
"""
|
|
212
225
|
self.current_model = self.scheduling_strategy()
|
|
213
226
|
|
|
@@ -231,7 +244,11 @@ class ModelManager:
|
|
|
231
244
|
messages: List[OpenAIMessage],
|
|
232
245
|
response_format: Optional[Type[BaseModel]] = None,
|
|
233
246
|
tools: Optional[List[Dict[str, Any]]] = None,
|
|
234
|
-
) -> Union[
|
|
247
|
+
) -> Union[
|
|
248
|
+
ChatCompletion,
|
|
249
|
+
AsyncStream[ChatCompletionChunk],
|
|
250
|
+
AsyncChatCompletionStreamManager[BaseModel],
|
|
251
|
+
]:
|
|
235
252
|
r"""Process a list of messages by selecting a model based on
|
|
236
253
|
the scheduling strategy.
|
|
237
254
|
Sends the entire list of messages to the selected model,
|
|
@@ -242,11 +259,15 @@ class ModelManager:
|
|
|
242
259
|
history in OpenAI API format.
|
|
243
260
|
|
|
244
261
|
Returns:
|
|
245
|
-
Union[ChatCompletion, AsyncStream[ChatCompletionChunk]
|
|
262
|
+
Union[ChatCompletion, AsyncStream[ChatCompletionChunk],
|
|
263
|
+
AsyncChatCompletionStreamManager[BaseModel]]:
|
|
246
264
|
`ChatCompletion` in the non-stream mode, or
|
|
247
|
-
`AsyncStream[ChatCompletionChunk]` in the stream mode
|
|
265
|
+
`AsyncStream[ChatCompletionChunk]` in the stream mode, or
|
|
266
|
+
`AsyncChatCompletionStreamManager[BaseModel]` for
|
|
267
|
+
structured-output stream.
|
|
248
268
|
"""
|
|
249
|
-
|
|
269
|
+
async with self.lock:
|
|
270
|
+
self.current_model = self.scheduling_strategy()
|
|
250
271
|
|
|
251
272
|
# Pass all messages to the selected model and get the response
|
|
252
273
|
try:
|
|
@@ -260,7 +281,8 @@ class ModelManager:
|
|
|
260
281
|
logger.warning(
|
|
261
282
|
"The scheduling strategy has been changed to 'round_robin'"
|
|
262
283
|
)
|
|
263
|
-
|
|
264
|
-
|
|
284
|
+
async with self.lock:
|
|
285
|
+
# Skip already used one
|
|
286
|
+
self.current_model = self.scheduling_strategy()
|
|
265
287
|
raise exc
|
|
266
288
|
return response
|
camel/models/modelscope_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,22 +10,14 @@
|
|
|
10
10
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
11
11
|
# See the License for the specific language governing permissions and
|
|
12
12
|
# limitations under the License.
|
|
13
|
-
# ========= Copyright 2023-
|
|
13
|
+
# ========= Copyright 2023-2025 @ CAMEL-AI.org. All Rights Reserved. =========
|
|
14
14
|
|
|
15
15
|
import os
|
|
16
|
-
import
|
|
17
|
-
from typing import Any, Dict, List, Optional, Union
|
|
16
|
+
from typing import Any, Dict, Optional, Union
|
|
18
17
|
|
|
19
|
-
from
|
|
20
|
-
|
|
21
|
-
from camel.configs import MODELSCOPE_API_PARAMS, ModelScopeConfig
|
|
22
|
-
from camel.messages import OpenAIMessage
|
|
18
|
+
from camel.configs import ModelScopeConfig
|
|
23
19
|
from camel.models.openai_compatible_model import OpenAICompatibleModel
|
|
24
|
-
from camel.types import
|
|
25
|
-
ChatCompletion,
|
|
26
|
-
ChatCompletionChunk,
|
|
27
|
-
ModelType,
|
|
28
|
-
)
|
|
20
|
+
from camel.types import ModelType
|
|
29
21
|
from camel.utils import (
|
|
30
22
|
BaseTokenCounter,
|
|
31
23
|
api_keys_required,
|
|
@@ -56,6 +48,10 @@ class ModelScopeModel(OpenAICompatibleModel):
|
|
|
56
48
|
API calls. If not provided, will fall back to the MODEL_TIMEOUT
|
|
57
49
|
environment variable or default to 180 seconds.
|
|
58
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.
|
|
59
55
|
"""
|
|
60
56
|
|
|
61
57
|
@api_keys_required(
|
|
@@ -71,6 +67,8 @@ class ModelScopeModel(OpenAICompatibleModel):
|
|
|
71
67
|
url: Optional[str] = None,
|
|
72
68
|
token_counter: Optional[BaseTokenCounter] = None,
|
|
73
69
|
timeout: Optional[float] = None,
|
|
70
|
+
max_retries: int = 3,
|
|
71
|
+
**kwargs: Any,
|
|
74
72
|
) -> None:
|
|
75
73
|
if model_config_dict is None:
|
|
76
74
|
model_config_dict = ModelScopeConfig().as_dict()
|
|
@@ -87,184 +85,6 @@ class ModelScopeModel(OpenAICompatibleModel):
|
|
|
87
85
|
url=url,
|
|
88
86
|
token_counter=token_counter,
|
|
89
87
|
timeout=timeout,
|
|
88
|
+
max_retries=max_retries,
|
|
89
|
+
**kwargs,
|
|
90
90
|
)
|
|
91
|
-
|
|
92
|
-
def _post_handle_response(
|
|
93
|
-
self, response: Union[ChatCompletion, Stream[ChatCompletionChunk]]
|
|
94
|
-
) -> ChatCompletion:
|
|
95
|
-
r"""Handle reasoning content with <think> tags at the beginning."""
|
|
96
|
-
if not isinstance(response, Stream):
|
|
97
|
-
# Handle non-streaming response (existing logic)
|
|
98
|
-
if self.model_config_dict.get("extra_body", {}).get(
|
|
99
|
-
"enable_thinking", False
|
|
100
|
-
):
|
|
101
|
-
reasoning_content = response.choices[
|
|
102
|
-
0
|
|
103
|
-
].message.reasoning_content # type: ignore[attr-defined]
|
|
104
|
-
combined_content = (
|
|
105
|
-
f"<think>\n{reasoning_content}\n</think>\n"
|
|
106
|
-
if reasoning_content
|
|
107
|
-
else ""
|
|
108
|
-
)
|
|
109
|
-
response_content = response.choices[0].message.content or ""
|
|
110
|
-
combined_content += response_content
|
|
111
|
-
|
|
112
|
-
# Construct a new ChatCompletion with combined content
|
|
113
|
-
return ChatCompletion.construct(
|
|
114
|
-
id=response.id,
|
|
115
|
-
choices=[
|
|
116
|
-
dict(
|
|
117
|
-
finish_reason=response.choices[0].finish_reason,
|
|
118
|
-
index=response.choices[0].index,
|
|
119
|
-
logprobs=response.choices[0].logprobs,
|
|
120
|
-
message=dict(
|
|
121
|
-
role=response.choices[0].message.role,
|
|
122
|
-
content=combined_content,
|
|
123
|
-
),
|
|
124
|
-
)
|
|
125
|
-
],
|
|
126
|
-
created=response.created,
|
|
127
|
-
model=response.model,
|
|
128
|
-
object="chat.completion",
|
|
129
|
-
system_fingerprint=response.system_fingerprint,
|
|
130
|
-
usage=response.usage,
|
|
131
|
-
)
|
|
132
|
-
else:
|
|
133
|
-
return response # Return original if no thinking enabled
|
|
134
|
-
|
|
135
|
-
# Handle streaming response
|
|
136
|
-
accumulated_reasoning = ""
|
|
137
|
-
accumulated_content = ""
|
|
138
|
-
final_chunk = None
|
|
139
|
-
usage_data = None # Initialize usage data
|
|
140
|
-
role = "assistant" # Default role
|
|
141
|
-
|
|
142
|
-
for chunk in response:
|
|
143
|
-
final_chunk = chunk # Keep track of the last chunk for metadata
|
|
144
|
-
if chunk.choices:
|
|
145
|
-
delta = chunk.choices[0].delta
|
|
146
|
-
if delta.role:
|
|
147
|
-
role = delta.role # Update role if provided
|
|
148
|
-
if (
|
|
149
|
-
hasattr(delta, 'reasoning_content')
|
|
150
|
-
and delta.reasoning_content
|
|
151
|
-
):
|
|
152
|
-
accumulated_reasoning += delta.reasoning_content
|
|
153
|
-
if delta.content:
|
|
154
|
-
accumulated_content += delta.content
|
|
155
|
-
|
|
156
|
-
if hasattr(chunk, 'usage') and chunk.usage:
|
|
157
|
-
usage_data = chunk.usage
|
|
158
|
-
|
|
159
|
-
combined_content = (
|
|
160
|
-
f"<think>\n{accumulated_reasoning}\n</think>\n"
|
|
161
|
-
if accumulated_reasoning
|
|
162
|
-
else ""
|
|
163
|
-
) + accumulated_content
|
|
164
|
-
|
|
165
|
-
# Construct the final ChatCompletion object from accumulated
|
|
166
|
-
# stream data
|
|
167
|
-
if final_chunk:
|
|
168
|
-
finish_reason = "stop" # Default finish reason
|
|
169
|
-
logprobs = None
|
|
170
|
-
if final_chunk.choices:
|
|
171
|
-
finish_reason = (
|
|
172
|
-
final_chunk.choices[0].finish_reason or finish_reason
|
|
173
|
-
)
|
|
174
|
-
if hasattr(final_chunk.choices[0], 'logprobs'):
|
|
175
|
-
logprobs = final_chunk.choices[0].logprobs
|
|
176
|
-
|
|
177
|
-
return ChatCompletion.construct(
|
|
178
|
-
# Use data from the final chunk or defaults
|
|
179
|
-
id=final_chunk.id
|
|
180
|
-
if hasattr(final_chunk, 'id')
|
|
181
|
-
else "streamed-completion",
|
|
182
|
-
choices=[
|
|
183
|
-
dict(
|
|
184
|
-
finish_reason=finish_reason,
|
|
185
|
-
index=0,
|
|
186
|
-
logprobs=logprobs,
|
|
187
|
-
message=dict(
|
|
188
|
-
role=role,
|
|
189
|
-
content=combined_content,
|
|
190
|
-
),
|
|
191
|
-
)
|
|
192
|
-
],
|
|
193
|
-
created=final_chunk.created
|
|
194
|
-
if hasattr(final_chunk, 'created')
|
|
195
|
-
else int(time.time()),
|
|
196
|
-
model=final_chunk.model
|
|
197
|
-
if hasattr(final_chunk, 'model')
|
|
198
|
-
else self.model_type,
|
|
199
|
-
object="chat.completion",
|
|
200
|
-
system_fingerprint=final_chunk.system_fingerprint
|
|
201
|
-
if hasattr(final_chunk, 'system_fingerprint')
|
|
202
|
-
else None,
|
|
203
|
-
usage=usage_data,
|
|
204
|
-
)
|
|
205
|
-
else:
|
|
206
|
-
# Handle cases where the stream was empty or invalid
|
|
207
|
-
return ChatCompletion.construct(
|
|
208
|
-
id="empty-stream",
|
|
209
|
-
choices=[
|
|
210
|
-
dict(
|
|
211
|
-
finish_reason="error",
|
|
212
|
-
index=0,
|
|
213
|
-
message=dict(role="assistant", content=""),
|
|
214
|
-
)
|
|
215
|
-
],
|
|
216
|
-
created=int(time.time()),
|
|
217
|
-
model=self.model_type,
|
|
218
|
-
object="chat.completion",
|
|
219
|
-
usage=usage_data,
|
|
220
|
-
)
|
|
221
|
-
|
|
222
|
-
def _request_chat_completion(
|
|
223
|
-
self,
|
|
224
|
-
messages: List[OpenAIMessage],
|
|
225
|
-
tools: Optional[List[Dict[str, Any]]] = None,
|
|
226
|
-
) -> Union[ChatCompletion, Stream[ChatCompletionChunk]]:
|
|
227
|
-
request_config = self.model_config_dict.copy()
|
|
228
|
-
|
|
229
|
-
if tools:
|
|
230
|
-
request_config["tools"] = tools
|
|
231
|
-
|
|
232
|
-
return self._post_handle_response(
|
|
233
|
-
self._client.chat.completions.create(
|
|
234
|
-
messages=messages,
|
|
235
|
-
model=self.model_type,
|
|
236
|
-
**request_config,
|
|
237
|
-
)
|
|
238
|
-
)
|
|
239
|
-
|
|
240
|
-
async def _arequest_chat_completion(
|
|
241
|
-
self,
|
|
242
|
-
messages: List[OpenAIMessage],
|
|
243
|
-
tools: Optional[List[Dict[str, Any]]] = None,
|
|
244
|
-
) -> Union[ChatCompletion, AsyncStream[ChatCompletionChunk]]:
|
|
245
|
-
request_config = self.model_config_dict.copy()
|
|
246
|
-
|
|
247
|
-
if tools:
|
|
248
|
-
request_config["tools"] = tools
|
|
249
|
-
|
|
250
|
-
response = await self._async_client.chat.completions.create(
|
|
251
|
-
messages=messages,
|
|
252
|
-
model=self.model_type,
|
|
253
|
-
**request_config,
|
|
254
|
-
)
|
|
255
|
-
return self._post_handle_response(response)
|
|
256
|
-
|
|
257
|
-
def check_model_config(self):
|
|
258
|
-
r"""Check whether the model configuration contains any
|
|
259
|
-
unexpected arguments to ModelScope API.
|
|
260
|
-
|
|
261
|
-
Raises:
|
|
262
|
-
ValueError: If the model configuration dictionary contains any
|
|
263
|
-
unexpected arguments to ModelScope API.
|
|
264
|
-
"""
|
|
265
|
-
for param in self.model_config_dict:
|
|
266
|
-
if param not in MODELSCOPE_API_PARAMS:
|
|
267
|
-
raise ValueError(
|
|
268
|
-
f"Unexpected argument `{param}` is "
|
|
269
|
-
"input into ModelScope model backend."
|
|
270
|
-
)
|