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
|
@@ -0,0 +1,465 @@
|
|
|
1
|
+
# ========= Copyright 2023-2025 @ CAMEL-AI.org. All Rights Reserved. =========
|
|
2
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
3
|
+
# you may not use this file except in compliance with the License.
|
|
4
|
+
# You may obtain a copy of the License at
|
|
5
|
+
#
|
|
6
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
7
|
+
#
|
|
8
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
9
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
10
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
11
|
+
# See the License for the specific language governing permissions and
|
|
12
|
+
# limitations under the License.
|
|
13
|
+
# ========= Copyright 2023-2025 @ CAMEL-AI.org. All Rights Reserved. =========
|
|
14
|
+
import argparse
|
|
15
|
+
import json
|
|
16
|
+
import logging
|
|
17
|
+
import os
|
|
18
|
+
import sys # Import the sys module
|
|
19
|
+
from logging.handlers import RotatingFileHandler
|
|
20
|
+
from typing import Any, Dict, List
|
|
21
|
+
|
|
22
|
+
app = None
|
|
23
|
+
products: List[Dict[str, Any]] = []
|
|
24
|
+
products_by_id: Dict[int, Dict[str, Any]] = {}
|
|
25
|
+
cart: List[Dict[str, Any]] = []
|
|
26
|
+
ACTION_COUNT: int = 0
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
def load_products(file_path: str = 'products.json') -> None:
|
|
30
|
+
global products, products_by_id
|
|
31
|
+
try:
|
|
32
|
+
# The products.json is expected to be
|
|
33
|
+
# in the same directory as this app.py
|
|
34
|
+
# or given by mock_web.py
|
|
35
|
+
script_dir = os.path.dirname(__file__)
|
|
36
|
+
abs_file_path = os.path.join(script_dir, file_path)
|
|
37
|
+
with open(abs_file_path, 'r') as f:
|
|
38
|
+
products = json.load(f)
|
|
39
|
+
products_by_id = {product['id']: product for product in products}
|
|
40
|
+
except FileNotFoundError:
|
|
41
|
+
sys.stderr.write(f"Error: {file_path} not found.\n")
|
|
42
|
+
products = []
|
|
43
|
+
products_by_id = {}
|
|
44
|
+
except json.JSONDecodeError:
|
|
45
|
+
sys.stderr.write(f"Error: Could not decode JSON from {file_path}.\n")
|
|
46
|
+
products = []
|
|
47
|
+
products_by_id = {}
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
# --- Logging Setup ---
|
|
51
|
+
def setup_logging(application):
|
|
52
|
+
log_formatter = logging.Formatter(
|
|
53
|
+
'%(asctime)s %(levelname)s: %(message)s [in %(pathname)s:%(lineno)d]'
|
|
54
|
+
)
|
|
55
|
+
# Log to a file in the same directory as this script
|
|
56
|
+
script_dir = os.path.dirname(__file__)
|
|
57
|
+
log_file = os.path.join(script_dir, 'app.log')
|
|
58
|
+
|
|
59
|
+
# File Handler
|
|
60
|
+
file_handler = RotatingFileHandler(
|
|
61
|
+
log_file, maxBytes=1024 * 1024 * 10, backupCount=5
|
|
62
|
+
) # 10MB per file, 5 backups
|
|
63
|
+
file_handler.setFormatter(log_formatter)
|
|
64
|
+
file_handler.setLevel(logging.INFO)
|
|
65
|
+
|
|
66
|
+
# Stream Handler (for console output)
|
|
67
|
+
stream_handler = logging.StreamHandler(
|
|
68
|
+
sys.stdout
|
|
69
|
+
) # Explicitly set to stdout
|
|
70
|
+
stream_handler.setFormatter(log_formatter)
|
|
71
|
+
stream_handler.setLevel(logging.INFO)
|
|
72
|
+
|
|
73
|
+
application.logger.addHandler(file_handler)
|
|
74
|
+
application.logger.addHandler(stream_handler)
|
|
75
|
+
application.logger.setLevel(logging.INFO)
|
|
76
|
+
application.logger.info(
|
|
77
|
+
f"Logging setup complete. Logs will be saved to {log_file}"
|
|
78
|
+
)
|
|
79
|
+
|
|
80
|
+
|
|
81
|
+
# --- End Logging Setup ---
|
|
82
|
+
|
|
83
|
+
|
|
84
|
+
# --- Task Mode Helper ---
|
|
85
|
+
def check_task_completion(current_cart_raw, ground_truth_spec):
|
|
86
|
+
if not ground_truth_spec: # No ground truth defined
|
|
87
|
+
return False
|
|
88
|
+
|
|
89
|
+
# Group current cart by product ID and count quantity
|
|
90
|
+
current_cart_grouped = {}
|
|
91
|
+
for item in current_cart_raw:
|
|
92
|
+
pid = item['id']
|
|
93
|
+
current_cart_grouped[pid] = current_cart_grouped.get(pid, 0) + 1
|
|
94
|
+
|
|
95
|
+
# Convert ground truth spec to a comparable dictionary {product_id:
|
|
96
|
+
# quantity}
|
|
97
|
+
ground_truth_dict = {}
|
|
98
|
+
for item_spec in ground_truth_spec:
|
|
99
|
+
ground_truth_dict[item_spec['id']] = item_spec['quantity']
|
|
100
|
+
|
|
101
|
+
# Check if current cart exactly matches ground truth
|
|
102
|
+
# 1. Same number of unique product types
|
|
103
|
+
if len(current_cart_grouped) != len(ground_truth_dict):
|
|
104
|
+
return False
|
|
105
|
+
|
|
106
|
+
# 2. Each product in current cart matches ground truth quantity, and all
|
|
107
|
+
# ground truth items are present
|
|
108
|
+
for pid, qty_spec in ground_truth_dict.items():
|
|
109
|
+
if (
|
|
110
|
+
pid not in current_cart_grouped
|
|
111
|
+
or current_cart_grouped[pid] != qty_spec
|
|
112
|
+
):
|
|
113
|
+
return False
|
|
114
|
+
|
|
115
|
+
# Ensure no extra items in current_cart_grouped that are not in
|
|
116
|
+
# ground_truth_dict (already covered by length check if all ground truth
|
|
117
|
+
# items are found)
|
|
118
|
+
# For robustness, explicitly check this too:
|
|
119
|
+
for pid_current in current_cart_grouped.keys():
|
|
120
|
+
if pid_current not in ground_truth_dict:
|
|
121
|
+
return False
|
|
122
|
+
|
|
123
|
+
return True
|
|
124
|
+
|
|
125
|
+
|
|
126
|
+
# --- End Task Mode Helper ---
|
|
127
|
+
|
|
128
|
+
|
|
129
|
+
# --- Task Completion Helper ---
|
|
130
|
+
def _trigger_task_completion_check():
|
|
131
|
+
r"""Checks for task completion if in task mode and not already signaled."""
|
|
132
|
+
# Uses global `app` and `cart`
|
|
133
|
+
if app.config.get('TASK_ACTIVE') and not app.config.get(
|
|
134
|
+
'TASK_COMPLETION_SIGNALED'
|
|
135
|
+
):
|
|
136
|
+
if check_task_completion(cart, app.config.get('GROUND_TRUTH_CART')):
|
|
137
|
+
app.config['TASK_COMPLETION_SIGNALED'] = True
|
|
138
|
+
app.logger.info(
|
|
139
|
+
"TASK COMPLETED: Ground truth cart state achieved."
|
|
140
|
+
)
|
|
141
|
+
|
|
142
|
+
|
|
143
|
+
# --- End Task Completion Helper ---
|
|
144
|
+
def create_app():
|
|
145
|
+
global app
|
|
146
|
+
try:
|
|
147
|
+
from flask import Flask, jsonify, render_template, request
|
|
148
|
+
except ImportError:
|
|
149
|
+
raise ImportError(
|
|
150
|
+
"Flask not installed. Please install it with `pip install Flask`"
|
|
151
|
+
)
|
|
152
|
+
|
|
153
|
+
# Adjust template and static folder paths
|
|
154
|
+
script_dir = os.path.dirname(os.path.abspath(__file__))
|
|
155
|
+
app = Flask(
|
|
156
|
+
__name__,
|
|
157
|
+
template_folder=os.path.join(script_dir, 'templates'),
|
|
158
|
+
static_folder=os.path.join(script_dir, 'static'),
|
|
159
|
+
)
|
|
160
|
+
setup_logging(app)
|
|
161
|
+
|
|
162
|
+
# --- Global Task Config ---
|
|
163
|
+
app.config['TASK_ACTIVE'] = False
|
|
164
|
+
app.config['GROUND_TRUTH_CART'] = []
|
|
165
|
+
app.config['TASK_COMPLETION_SIGNALED'] = False
|
|
166
|
+
|
|
167
|
+
@app.route('/')
|
|
168
|
+
def home():
|
|
169
|
+
global ACTION_COUNT
|
|
170
|
+
ACTION_COUNT += 1
|
|
171
|
+
unique_categories = sorted({p["category"] for p in products})
|
|
172
|
+
products_by_category = {}
|
|
173
|
+
for product in products:
|
|
174
|
+
category = product["category"]
|
|
175
|
+
if category not in products_by_category:
|
|
176
|
+
products_by_category[category] = []
|
|
177
|
+
products_by_category[category].append(product)
|
|
178
|
+
|
|
179
|
+
app.logger.info(
|
|
180
|
+
"Home page requested. "
|
|
181
|
+
f"Categories: {unique_categories}. Cart count: {len(cart)}"
|
|
182
|
+
)
|
|
183
|
+
# Pass products_by_category to the template instead of the flat
|
|
184
|
+
# products list for main display
|
|
185
|
+
return render_template(
|
|
186
|
+
'index.html',
|
|
187
|
+
products_by_category=products_by_category,
|
|
188
|
+
categories=unique_categories,
|
|
189
|
+
cart_count=len(cart),
|
|
190
|
+
all_products=products,
|
|
191
|
+
)
|
|
192
|
+
|
|
193
|
+
@app.route('/product/<int:product_id>')
|
|
194
|
+
def product_detail(product_id):
|
|
195
|
+
global ACTION_COUNT
|
|
196
|
+
ACTION_COUNT += 1
|
|
197
|
+
product = products_by_id.get(product_id)
|
|
198
|
+
app.logger.info(
|
|
199
|
+
f"Product detail page requested for ID: {product_id}. "
|
|
200
|
+
f"Cart count: {len(cart)}"
|
|
201
|
+
)
|
|
202
|
+
if product:
|
|
203
|
+
return render_template(
|
|
204
|
+
'product-detail.html', product=product, cart_count=len(cart)
|
|
205
|
+
)
|
|
206
|
+
return "Product not found", 404
|
|
207
|
+
|
|
208
|
+
@app.route('/cart')
|
|
209
|
+
def view_cart():
|
|
210
|
+
global ACTION_COUNT
|
|
211
|
+
ACTION_COUNT += 1
|
|
212
|
+
total_price = sum(
|
|
213
|
+
item['price'] * item.get('quantity', 1) for item in cart
|
|
214
|
+
)
|
|
215
|
+
app.logger.info(f"Cart page requested. Cart count: {len(cart)}")
|
|
216
|
+
return render_template(
|
|
217
|
+
'cart.html', cart_items=cart, total_price=total_price
|
|
218
|
+
)
|
|
219
|
+
|
|
220
|
+
@app.route('/api/products')
|
|
221
|
+
def get_products():
|
|
222
|
+
return jsonify(products)
|
|
223
|
+
|
|
224
|
+
@app.route('/api/cart', methods=['GET'])
|
|
225
|
+
def get_cart_api():
|
|
226
|
+
total_price = sum(
|
|
227
|
+
item['price'] * item.get('quantity', 1) for item in cart
|
|
228
|
+
)
|
|
229
|
+
return jsonify({'cart': cart, 'total_price': total_price})
|
|
230
|
+
|
|
231
|
+
@app.route('/api/cart/add', methods=['POST'])
|
|
232
|
+
def add_to_cart_api():
|
|
233
|
+
global ACTION_COUNT
|
|
234
|
+
data = request.json
|
|
235
|
+
product_id = data.get('productId')
|
|
236
|
+
|
|
237
|
+
if not product_id:
|
|
238
|
+
return jsonify(
|
|
239
|
+
{'success': False, 'message': 'Product ID is required'}
|
|
240
|
+
), 400
|
|
241
|
+
|
|
242
|
+
product = products_by_id.get(product_id)
|
|
243
|
+
if not product:
|
|
244
|
+
return jsonify(
|
|
245
|
+
{'success': False, 'message': 'Product not found'}
|
|
246
|
+
), 404
|
|
247
|
+
|
|
248
|
+
# Check if product is already in cart
|
|
249
|
+
for item in cart:
|
|
250
|
+
if item['id'] == product_id:
|
|
251
|
+
# If yes, just increment quantity
|
|
252
|
+
item.get('quantity', 1)
|
|
253
|
+
item['quantity'] = item.get('quantity', 1) + 1
|
|
254
|
+
app.logger.info(
|
|
255
|
+
f"Incremented quantity for product {product_id} in cart."
|
|
256
|
+
)
|
|
257
|
+
return jsonify(
|
|
258
|
+
{'success': True, 'cart': cart, 'cart_count': len(cart)}
|
|
259
|
+
)
|
|
260
|
+
|
|
261
|
+
# If not, add new item to cart
|
|
262
|
+
cart_item = product.copy()
|
|
263
|
+
cart_item['quantity'] = 1 # Start with quantity 1
|
|
264
|
+
cart.append(cart_item)
|
|
265
|
+
ACTION_COUNT += 1 # Increment on successful add
|
|
266
|
+
|
|
267
|
+
_trigger_task_completion_check()
|
|
268
|
+
|
|
269
|
+
app.logger.info(f"Added product {product_id} to cart.")
|
|
270
|
+
return jsonify(
|
|
271
|
+
{'success': True, 'cart': cart, 'cart_count': len(cart)}
|
|
272
|
+
)
|
|
273
|
+
|
|
274
|
+
@app.route('/api/cart/update', methods=['POST'])
|
|
275
|
+
def update_cart_item_api():
|
|
276
|
+
data = request.json
|
|
277
|
+
product_id = data.get('productId')
|
|
278
|
+
quantity = data.get('quantity')
|
|
279
|
+
|
|
280
|
+
if not product_id:
|
|
281
|
+
return jsonify(
|
|
282
|
+
{'success': False, 'message': 'Product ID is required'}
|
|
283
|
+
), 400
|
|
284
|
+
|
|
285
|
+
try:
|
|
286
|
+
# Ensure quantity is a non-negative integer
|
|
287
|
+
quantity = int(quantity)
|
|
288
|
+
if quantity < 0:
|
|
289
|
+
raise ValueError
|
|
290
|
+
except (ValueError, TypeError):
|
|
291
|
+
return jsonify(
|
|
292
|
+
{'success': False, 'message': 'Invalid quantity'}
|
|
293
|
+
), 400
|
|
294
|
+
|
|
295
|
+
found_item = False
|
|
296
|
+
for item in cart:
|
|
297
|
+
if item['id'] == product_id:
|
|
298
|
+
if quantity > 0:
|
|
299
|
+
item['quantity'] = quantity
|
|
300
|
+
app.logger.info(
|
|
301
|
+
"Updated quantity for product "
|
|
302
|
+
f"{product_id} to {quantity}."
|
|
303
|
+
)
|
|
304
|
+
else:
|
|
305
|
+
# If quantity is 0, remove the item
|
|
306
|
+
cart.remove(item)
|
|
307
|
+
app.logger.info(f"Removed product {product_id} from cart.")
|
|
308
|
+
found_item = True
|
|
309
|
+
break
|
|
310
|
+
|
|
311
|
+
if not found_item:
|
|
312
|
+
return jsonify(
|
|
313
|
+
{'success': False, 'message': 'Product not in cart'}
|
|
314
|
+
), 404
|
|
315
|
+
|
|
316
|
+
_trigger_task_completion_check()
|
|
317
|
+
|
|
318
|
+
total_price = sum(
|
|
319
|
+
item['price'] * item.get('quantity', 1) for item in cart
|
|
320
|
+
)
|
|
321
|
+
return jsonify(
|
|
322
|
+
{
|
|
323
|
+
'success': True,
|
|
324
|
+
'cart': cart,
|
|
325
|
+
'cart_count': len(cart),
|
|
326
|
+
'total_price': total_price,
|
|
327
|
+
}
|
|
328
|
+
)
|
|
329
|
+
|
|
330
|
+
@app.route('/api/cart/remove', methods=['POST'])
|
|
331
|
+
def remove_from_cart_api():
|
|
332
|
+
global cart, ACTION_COUNT
|
|
333
|
+
data = request.json
|
|
334
|
+
product_id = data.get('productId')
|
|
335
|
+
|
|
336
|
+
if not product_id:
|
|
337
|
+
return jsonify(
|
|
338
|
+
{'success': False, 'message': 'Product ID is required'}
|
|
339
|
+
), 400
|
|
340
|
+
|
|
341
|
+
original_cart_len = len(cart)
|
|
342
|
+
# List comprehension to create a new list excluding the item to be
|
|
343
|
+
# removed This is simpler than finding index and deleting
|
|
344
|
+
cart[:] = [item for item in cart if item['id'] != product_id]
|
|
345
|
+
|
|
346
|
+
if len(cart) < original_cart_len:
|
|
347
|
+
ACTION_COUNT += 1 # Increment on successful remove
|
|
348
|
+
app.logger.info(f"Removed product {product_id} from cart.")
|
|
349
|
+
|
|
350
|
+
_trigger_task_completion_check()
|
|
351
|
+
|
|
352
|
+
total_price = sum(
|
|
353
|
+
item['price'] * item.get('quantity', 1) for item in cart
|
|
354
|
+
)
|
|
355
|
+
return jsonify(
|
|
356
|
+
{
|
|
357
|
+
'success': True,
|
|
358
|
+
'cart': cart,
|
|
359
|
+
'cart_count': len(cart),
|
|
360
|
+
'total_price': total_price,
|
|
361
|
+
}
|
|
362
|
+
)
|
|
363
|
+
|
|
364
|
+
return jsonify(
|
|
365
|
+
{'success': False, 'message': 'Product not in cart'}
|
|
366
|
+
), 404
|
|
367
|
+
|
|
368
|
+
@app.route('/task/start', methods=['POST'])
|
|
369
|
+
def start_task():
|
|
370
|
+
global cart, ACTION_COUNT
|
|
371
|
+
ACTION_COUNT = 0 # Reset action counter
|
|
372
|
+
data = request.json
|
|
373
|
+
ground_truth = data.get('ground_truth_cart')
|
|
374
|
+
|
|
375
|
+
if not isinstance(ground_truth, list):
|
|
376
|
+
return jsonify(
|
|
377
|
+
{
|
|
378
|
+
'success': False,
|
|
379
|
+
'message': '`ground_truth_cart` must be a list.',
|
|
380
|
+
}
|
|
381
|
+
), 400
|
|
382
|
+
|
|
383
|
+
# Validate ground truth spec
|
|
384
|
+
for item_spec in ground_truth:
|
|
385
|
+
if not all(k in item_spec for k in ['id', 'quantity']):
|
|
386
|
+
return jsonify(
|
|
387
|
+
{
|
|
388
|
+
'success': False,
|
|
389
|
+
'message': (
|
|
390
|
+
'Each item in `ground_truth_cart` must have '
|
|
391
|
+
'`id` and `quantity`.'
|
|
392
|
+
),
|
|
393
|
+
}
|
|
394
|
+
), 400
|
|
395
|
+
|
|
396
|
+
app.config['TASK_ACTIVE'] = True
|
|
397
|
+
app.config['GROUND_TRUTH_CART'] = ground_truth
|
|
398
|
+
app.config['TASK_COMPLETION_SIGNALED'] = False # Reset signal
|
|
399
|
+
cart = [] # Reset cart
|
|
400
|
+
app.logger.info(f"TASK MODE STARTED. Ground truth: {ground_truth}")
|
|
401
|
+
return jsonify(
|
|
402
|
+
{'success': True, 'message': 'Task mode started. Cart reset.'}
|
|
403
|
+
)
|
|
404
|
+
|
|
405
|
+
@app.route('/task/check', methods=['GET'])
|
|
406
|
+
def check_task():
|
|
407
|
+
global ACTION_COUNT
|
|
408
|
+
if not app.config.get('TASK_ACTIVE'):
|
|
409
|
+
return jsonify(
|
|
410
|
+
{'success': False, 'message': 'Task mode is not active.'}
|
|
411
|
+
), 400
|
|
412
|
+
|
|
413
|
+
completed = app.config.get('TASK_COMPLETION_SIGNALED', False)
|
|
414
|
+
if completed:
|
|
415
|
+
message = "Task completed successfully."
|
|
416
|
+
else:
|
|
417
|
+
message = "Task not yet completed."
|
|
418
|
+
|
|
419
|
+
return jsonify(
|
|
420
|
+
{
|
|
421
|
+
'success': True,
|
|
422
|
+
'completed': completed,
|
|
423
|
+
'steps': ACTION_COUNT,
|
|
424
|
+
'message': message,
|
|
425
|
+
}
|
|
426
|
+
)
|
|
427
|
+
|
|
428
|
+
@app.route('/task/stop', methods=['POST'])
|
|
429
|
+
def stop_task():
|
|
430
|
+
global cart
|
|
431
|
+
app.config['TASK_ACTIVE'] = False
|
|
432
|
+
app.config['GROUND_TRUTH_CART'] = []
|
|
433
|
+
app.config['TASK_COMPLETION_SIGNALED'] = False
|
|
434
|
+
cart = [] # Reset cart
|
|
435
|
+
app.logger.info("TASK MODE STOPPED. Cart reset.")
|
|
436
|
+
return jsonify(
|
|
437
|
+
{'success': True, 'message': 'Task mode stopped. Cart reset.'}
|
|
438
|
+
)
|
|
439
|
+
|
|
440
|
+
return app
|
|
441
|
+
|
|
442
|
+
|
|
443
|
+
def main():
|
|
444
|
+
parser = argparse.ArgumentParser(
|
|
445
|
+
description="Run the mock website server."
|
|
446
|
+
)
|
|
447
|
+
parser.add_argument(
|
|
448
|
+
'--port', type=int, default=5000, help='Port to run the server on.'
|
|
449
|
+
)
|
|
450
|
+
args = parser.parse_args()
|
|
451
|
+
|
|
452
|
+
# Load products specific to this app
|
|
453
|
+
load_products()
|
|
454
|
+
flask_app = create_app()
|
|
455
|
+
|
|
456
|
+
if flask_app:
|
|
457
|
+
# Use 0.0.0.0 to make it accessible from the dispatcher
|
|
458
|
+
# Disable the reloader to prevent state loss on logging
|
|
459
|
+
flask_app.run(
|
|
460
|
+
debug=True, port=args.port, host='0.0.0.0', use_reloader=False
|
|
461
|
+
)
|
|
462
|
+
|
|
463
|
+
|
|
464
|
+
if __name__ == "__main__":
|
|
465
|
+
main()
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
{
|
|
2
|
+
"products": [
|
|
3
|
+
{
|
|
4
|
+
"id": 1,
|
|
5
|
+
"name": "Gaming Laptop",
|
|
6
|
+
"price": 1200,
|
|
7
|
+
"image": "assets/img/products/laptop.jpg",
|
|
8
|
+
"category": "Electronics",
|
|
9
|
+
"rating": 4.5,
|
|
10
|
+
"description": "High-performance gaming laptop with latest specs."
|
|
11
|
+
},
|
|
12
|
+
{
|
|
13
|
+
"id": 2,
|
|
14
|
+
"name": "Wireless Mouse",
|
|
15
|
+
"price": 25,
|
|
16
|
+
"image": "assets/img/products/mouse.jpg",
|
|
17
|
+
"category": "Electronics",
|
|
18
|
+
"rating": 4.0,
|
|
19
|
+
"description": "Ergonomic wireless mouse with long battery life."
|
|
20
|
+
},
|
|
21
|
+
{
|
|
22
|
+
"id": 3,
|
|
23
|
+
"name": "Mechanical Keyboard",
|
|
24
|
+
"price": 75,
|
|
25
|
+
"image": "assets/img/products/keyboard.jpg",
|
|
26
|
+
"category": "Electronics",
|
|
27
|
+
"rating": 4.8,
|
|
28
|
+
"description": "RGB mechanical keyboard with customizable keys."
|
|
29
|
+
},
|
|
30
|
+
{
|
|
31
|
+
"id": 4,
|
|
32
|
+
"name": "Coffee Maker",
|
|
33
|
+
"price": 50,
|
|
34
|
+
"image": "assets/img/products/coffeemaker.jpg",
|
|
35
|
+
"category": "Home Goods",
|
|
36
|
+
"rating": 3.9,
|
|
37
|
+
"description": "Drip coffee maker with programmable timer."
|
|
38
|
+
},
|
|
39
|
+
{
|
|
40
|
+
"id": 5,
|
|
41
|
+
"name": "Bluetooth Speaker",
|
|
42
|
+
"price": 45,
|
|
43
|
+
"image": "assets/img/products/speaker.jpg",
|
|
44
|
+
"category": "Electronics",
|
|
45
|
+
"rating": 4.2,
|
|
46
|
+
"description": "Portable Bluetooth speaker with rich sound."
|
|
47
|
+
},
|
|
48
|
+
{
|
|
49
|
+
"id": 6,
|
|
50
|
+
"name": "Smartphone",
|
|
51
|
+
"price": 699,
|
|
52
|
+
"image": "assets/img/products/smartphone.jpg",
|
|
53
|
+
"category": "Electronics",
|
|
54
|
+
"rating": 4.6,
|
|
55
|
+
"description": "Latest-gen smartphone with stunning display and fast performance."
|
|
56
|
+
},
|
|
57
|
+
{
|
|
58
|
+
"id": 7,
|
|
59
|
+
"name": "Air Purifier",
|
|
60
|
+
"price": 130,
|
|
61
|
+
"image": "assets/img/products/airpurifier.jpg",
|
|
62
|
+
"category": "Home Goods",
|
|
63
|
+
"rating": 4.3,
|
|
64
|
+
"description": "HEPA air purifier with quiet operation and multiple fan speeds."
|
|
65
|
+
},
|
|
66
|
+
{
|
|
67
|
+
"id": 8,
|
|
68
|
+
"name": "Fitness Tracker",
|
|
69
|
+
"price": 85,
|
|
70
|
+
"image": "assets/img/products/fitnesstracker.jpg",
|
|
71
|
+
"category": "Electronics",
|
|
72
|
+
"rating": 4.1,
|
|
73
|
+
"description": "Waterproof fitness tracker with heart rate and sleep monitoring."
|
|
74
|
+
},
|
|
75
|
+
{
|
|
76
|
+
"id": 9,
|
|
77
|
+
"name": "Electric Kettle",
|
|
78
|
+
"price": 35,
|
|
79
|
+
"image": "assets/img/products/kettle.jpg",
|
|
80
|
+
"category": "Home Goods",
|
|
81
|
+
"rating": 4.0,
|
|
82
|
+
"description": "Stainless steel electric kettle with auto shut-off feature."
|
|
83
|
+
},
|
|
84
|
+
{
|
|
85
|
+
"id": 10,
|
|
86
|
+
"name": "Noise Cancelling Headphones",
|
|
87
|
+
"price": 150,
|
|
88
|
+
"image": "assets/img/products/headphones.jpg",
|
|
89
|
+
"category": "Electronics",
|
|
90
|
+
"rating": 4.7,
|
|
91
|
+
"description": "Over-ear headphones with active noise cancellation and long battery life."
|
|
92
|
+
}
|
|
93
|
+
],
|
|
94
|
+
"ground_truth_cart": [
|
|
95
|
+
{
|
|
96
|
+
"id": 1,
|
|
97
|
+
"quantity": 1
|
|
98
|
+
},
|
|
99
|
+
{
|
|
100
|
+
"id": 2,
|
|
101
|
+
"quantity": 1
|
|
102
|
+
}
|
|
103
|
+
]
|
|
104
|
+
}
|
camel/benchmarks/nexus.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
|
|
|
15
15
|
import ast
|
|
16
16
|
import json
|
|
@@ -68,7 +68,7 @@ with the proper arguments that best answers the given prompt.
|
|
|
68
68
|
|
|
69
69
|
Respond with nothing but the function call ONLY, such that I can \
|
|
70
70
|
directly execute your function call without any post processing \
|
|
71
|
-
necessary from my end. Do not use variables.
|
|
71
|
+
necessary from my end. Do not use variables.
|
|
72
72
|
If there are more than two function calls, separate them with a semicolon (;).
|
|
73
73
|
|
|
74
74
|
{tools}
|
camel/benchmarks/ragbench.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
|
|
|
15
15
|
from typing import Any, Callable, Dict, List, Literal, Optional, Sequence
|
|
16
16
|
|
camel/bots/__init__.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
|
from .discord import DiscordApp
|
|
15
15
|
from .slack.models import (
|
|
16
16
|
SlackAppMentionEventBody,
|
camel/bots/discord/__init__.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
|
from .discord_app import DiscordApp
|
|
15
15
|
from .discord_installation import DiscordInstallation
|
|
16
16
|
from .discord_store import (
|
|
@@ -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 os
|
|
15
15
|
from datetime import datetime, timedelta
|
|
16
16
|
from typing import TYPE_CHECKING, List, Optional
|
|
@@ -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
|
from datetime import datetime
|
|
15
15
|
from typing import Optional
|
|
16
16
|
|