camel-ai 0.2.65__py3-none-any.whl → 0.2.83a6__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of camel-ai might be problematic. Click here for more details.
- camel/__init__.py +3 -3
- camel/agents/__init__.py +2 -2
- camel/agents/_types.py +9 -4
- camel/agents/_utils.py +40 -2
- camel/agents/base.py +2 -2
- camel/agents/chat_agent.py +5107 -995
- camel/agents/critic_agent.py +2 -2
- camel/agents/deductive_reasoner_agent.py +56 -56
- camel/agents/embodied_agent.py +2 -2
- camel/agents/knowledge_graph_agent.py +20 -20
- camel/agents/mcp_agent.py +35 -36
- camel/agents/multi_hop_generator_agent.py +3 -3
- camel/agents/programmed_agent_instruction.py +2 -2
- camel/agents/repo_agent.py +4 -3
- camel/agents/role_assignment_agent.py +2 -2
- camel/agents/search_agent.py +2 -2
- camel/agents/task_agent.py +2 -2
- camel/agents/tool_agents/__init__.py +2 -2
- camel/agents/tool_agents/base.py +2 -2
- camel/agents/tool_agents/hugging_face_tool_agent.py +3 -3
- camel/benchmarks/__init__.py +2 -2
- camel/benchmarks/apibank.py +5 -5
- camel/benchmarks/apibench.py +2 -2
- camel/benchmarks/base.py +2 -2
- camel/benchmarks/browsecomp.py +44 -33
- camel/benchmarks/gaia.py +17 -13
- camel/benchmarks/mock_website/README.md +1 -3
- camel/benchmarks/mock_website/mock_web.py +2 -2
- camel/benchmarks/mock_website/requirements.txt +1 -1
- camel/benchmarks/mock_website/shopping_mall/app.py +2 -2
- camel/benchmarks/mock_website/task.json +1 -1
- camel/benchmarks/nexus.py +3 -3
- camel/benchmarks/ragbench.py +2 -2
- camel/bots/__init__.py +2 -2
- camel/bots/discord/__init__.py +2 -2
- camel/bots/discord/discord_app.py +2 -2
- camel/bots/discord/discord_installation.py +2 -2
- camel/bots/discord/discord_store.py +3 -3
- camel/bots/slack/__init__.py +2 -2
- camel/bots/slack/models.py +4 -4
- camel/bots/slack/slack_app.py +2 -2
- camel/bots/telegram_bot.py +2 -2
- camel/configs/__init__.py +29 -2
- camel/configs/aihubmix_config.py +90 -0
- camel/configs/aiml_config.py +2 -2
- camel/configs/amd_config.py +70 -0
- camel/configs/anthropic_config.py +2 -2
- camel/configs/base_config.py +2 -2
- camel/configs/bedrock_config.py +5 -3
- camel/configs/cerebras_config.py +98 -0
- camel/configs/cohere_config.py +2 -2
- camel/configs/cometapi_config.py +106 -0
- camel/configs/crynux_config.py +2 -2
- camel/configs/deepseek_config.py +9 -8
- camel/configs/function_gemma_config.py +59 -0
- camel/configs/gemini_config.py +6 -4
- camel/configs/groq_config.py +6 -4
- camel/configs/internlm_config.py +6 -4
- camel/configs/litellm_config.py +2 -2
- camel/configs/lmstudio_config.py +6 -4
- camel/configs/minimax_config.py +95 -0
- camel/configs/mistral_config.py +2 -2
- camel/configs/modelscope_config.py +5 -3
- camel/configs/moonshot_config.py +2 -2
- camel/configs/nebius_config.py +105 -0
- camel/configs/netmind_config.py +2 -2
- camel/configs/novita_config.py +2 -2
- camel/configs/nvidia_config.py +2 -2
- camel/configs/ollama_config.py +2 -2
- camel/configs/openai_config.py +5 -3
- camel/configs/openrouter_config.py +6 -4
- camel/configs/ppio_config.py +2 -2
- camel/configs/qianfan_config.py +85 -0
- camel/configs/qwen_config.py +2 -2
- camel/configs/reka_config.py +2 -2
- camel/configs/samba_config.py +6 -4
- camel/configs/sglang_config.py +2 -2
- camel/configs/siliconflow_config.py +2 -2
- camel/configs/togetherai_config.py +2 -2
- camel/configs/vllm_config.py +4 -2
- camel/configs/watsonx_config.py +2 -2
- camel/configs/yi_config.py +6 -4
- camel/configs/zhipuai_config.py +6 -4
- camel/data_collectors/__init__.py +2 -2
- camel/data_collectors/alpaca_collector.py +18 -9
- camel/data_collectors/base.py +2 -2
- camel/data_collectors/sharegpt_collector.py +2 -2
- camel/datagen/__init__.py +2 -2
- camel/datagen/cot_datagen.py +3 -3
- camel/datagen/evol_instruct/__init__.py +2 -2
- camel/datagen/evol_instruct/evol_instruct.py +2 -2
- camel/datagen/evol_instruct/scorer.py +12 -12
- camel/datagen/evol_instruct/templates.py +16 -16
- camel/datagen/self_improving_cot.py +5 -5
- camel/datagen/self_instruct/__init__.py +2 -2
- camel/datagen/self_instruct/filter/__init__.py +2 -2
- camel/datagen/self_instruct/filter/filter_function.py +2 -2
- camel/datagen/self_instruct/filter/filter_registry.py +2 -2
- camel/datagen/self_instruct/filter/instruction_filter.py +2 -2
- camel/datagen/self_instruct/self_instruct.py +2 -2
- camel/datagen/self_instruct/templates.py +47 -47
- camel/datagen/source2synth/__init__.py +2 -2
- camel/datagen/source2synth/data_processor.py +2 -2
- camel/datagen/source2synth/models.py +2 -2
- camel/datagen/source2synth/user_data_processor_config.py +2 -2
- camel/datahubs/__init__.py +2 -2
- camel/datahubs/base.py +2 -2
- camel/datahubs/huggingface.py +2 -2
- camel/datahubs/models.py +2 -2
- camel/datasets/__init__.py +2 -2
- camel/datasets/base_generator.py +41 -12
- camel/datasets/few_shot_generator.py +18 -18
- camel/datasets/models.py +2 -2
- camel/datasets/self_instruct_generator.py +2 -2
- camel/datasets/static_dataset.py +2 -2
- camel/embeddings/__init__.py +2 -2
- camel/embeddings/azure_embedding.py +2 -2
- camel/embeddings/base.py +2 -2
- camel/embeddings/gemini_embedding.py +2 -2
- camel/embeddings/jina_embedding.py +2 -2
- camel/embeddings/mistral_embedding.py +2 -2
- camel/embeddings/openai_compatible_embedding.py +2 -2
- camel/embeddings/openai_embedding.py +2 -2
- camel/embeddings/sentence_transformers_embeddings.py +2 -2
- camel/embeddings/together_embedding.py +2 -2
- camel/embeddings/vlm_embedding.py +2 -2
- camel/environments/__init__.py +14 -2
- camel/environments/models.py +2 -2
- camel/environments/multi_step.py +2 -2
- camel/environments/rlcards_env.py +860 -0
- camel/environments/single_step.py +30 -5
- camel/environments/tic_tac_toe.py +3 -3
- camel/extractors/__init__.py +2 -2
- camel/extractors/base.py +2 -2
- camel/extractors/python_strategies.py +2 -2
- camel/generators.py +2 -2
- camel/human.py +2 -2
- camel/interpreters/__init__.py +4 -2
- camel/interpreters/base.py +2 -2
- camel/interpreters/docker/Dockerfile +14 -24
- camel/interpreters/docker_interpreter.py +5 -4
- camel/interpreters/e2b_interpreter.py +36 -3
- camel/interpreters/internal_python_interpreter.py +53 -4
- camel/interpreters/interpreter_error.py +2 -2
- camel/interpreters/ipython_interpreter.py +2 -2
- camel/interpreters/microsandbox_interpreter.py +395 -0
- camel/interpreters/subprocess_interpreter.py +2 -2
- camel/loaders/__init__.py +13 -4
- camel/loaders/apify_reader.py +2 -2
- camel/loaders/base_io.py +2 -2
- camel/loaders/base_loader.py +85 -0
- camel/loaders/chunkr_reader.py +11 -2
- camel/loaders/crawl4ai_reader.py +2 -2
- camel/loaders/firecrawl_reader.py +6 -6
- camel/loaders/jina_url_reader.py +2 -2
- camel/loaders/markitdown.py +2 -2
- camel/loaders/mineru_extractor.py +2 -2
- camel/loaders/mistral_reader.py +2 -2
- camel/loaders/scrapegraph_reader.py +2 -2
- camel/loaders/unstructured_io.py +2 -2
- camel/logger.py +5 -5
- camel/memories/__init__.py +2 -2
- camel/memories/agent_memories.py +86 -3
- camel/memories/base.py +36 -2
- camel/memories/blocks/__init__.py +2 -2
- camel/memories/blocks/chat_history_block.py +125 -7
- camel/memories/blocks/vectordb_block.py +10 -3
- camel/memories/context_creators/__init__.py +2 -2
- camel/memories/context_creators/score_based.py +109 -230
- camel/memories/records.py +90 -10
- camel/messages/__init__.py +2 -2
- camel/messages/base.py +178 -43
- camel/messages/conversion/__init__.py +2 -2
- camel/messages/conversion/alpaca.py +2 -2
- camel/messages/conversion/conversation_models.py +2 -2
- camel/messages/conversion/sharegpt/__init__.py +2 -2
- camel/messages/conversion/sharegpt/function_call_formatter.py +2 -2
- camel/messages/conversion/sharegpt/hermes/__init__.py +2 -2
- camel/messages/conversion/sharegpt/hermes/hermes_function_formatter.py +2 -2
- camel/messages/func_message.py +54 -17
- camel/models/__init__.py +18 -2
- camel/models/_utils.py +3 -3
- camel/models/aihubmix_model.py +83 -0
- camel/models/aiml_model.py +11 -18
- camel/models/amd_model.py +101 -0
- camel/models/anthropic_model.py +127 -20
- camel/models/aws_bedrock_model.py +12 -35
- camel/models/azure_openai_model.py +214 -115
- camel/models/base_audio_model.py +5 -3
- camel/models/base_model.py +378 -31
- camel/models/cerebras_model.py +83 -0
- camel/models/cohere_model.py +18 -49
- camel/models/cometapi_model.py +83 -0
- camel/models/crynux_model.py +11 -18
- camel/models/deepseek_model.py +20 -84
- camel/models/fish_audio_model.py +8 -2
- camel/models/function_gemma_model.py +889 -0
- camel/models/gemini_model.py +391 -52
- camel/models/groq_model.py +11 -19
- camel/models/internlm_model.py +11 -18
- camel/models/litellm_model.py +57 -49
- camel/models/lmstudio_model.py +17 -20
- camel/models/minimax_model.py +83 -0
- camel/models/mistral_model.py +20 -47
- camel/models/model_factory.py +39 -3
- camel/models/model_manager.py +26 -8
- camel/models/modelscope_model.py +13 -193
- camel/models/moonshot_model.py +183 -21
- camel/models/nebius_model.py +83 -0
- camel/models/nemotron_model.py +19 -9
- camel/models/netmind_model.py +11 -18
- camel/models/novita_model.py +11 -18
- camel/models/nvidia_model.py +11 -18
- camel/models/ollama_model.py +14 -21
- camel/models/openai_audio_models.py +2 -2
- camel/models/openai_compatible_model.py +190 -71
- camel/models/openai_model.py +192 -86
- camel/models/openrouter_model.py +11 -19
- camel/models/ppio_model.py +11 -18
- camel/models/qianfan_model.py +89 -0
- camel/models/qwen_model.py +13 -193
- camel/models/reka_model.py +23 -49
- camel/models/reward/__init__.py +2 -2
- camel/models/reward/base_reward_model.py +2 -2
- camel/models/reward/evaluator.py +2 -2
- camel/models/reward/nemotron_model.py +2 -2
- camel/models/reward/skywork_model.py +2 -2
- camel/models/samba_model.py +50 -75
- camel/models/sglang_model.py +90 -68
- camel/models/siliconflow_model.py +12 -35
- camel/models/stub_model.py +10 -7
- camel/models/togetherai_model.py +11 -18
- camel/models/vllm_model.py +10 -18
- camel/models/volcano_model.py +158 -19
- camel/models/watsonx_model.py +9 -47
- camel/models/yi_model.py +11 -18
- camel/models/zhipuai_model.py +70 -18
- camel/parsers/__init__.py +18 -0
- camel/parsers/mcp_tool_call_parser.py +176 -0
- camel/personas/__init__.py +2 -2
- camel/personas/persona.py +2 -2
- camel/personas/persona_hub.py +2 -2
- camel/prompts/__init__.py +2 -2
- camel/prompts/ai_society.py +2 -2
- camel/prompts/base.py +2 -2
- camel/prompts/code.py +2 -2
- camel/prompts/evaluation.py +2 -2
- camel/prompts/generate_text_embedding_data.py +2 -2
- camel/prompts/image_craft.py +2 -2
- camel/prompts/misalignment.py +2 -2
- camel/prompts/multi_condition_image_craft.py +2 -2
- camel/prompts/object_recognition.py +2 -2
- camel/prompts/persona_hub.py +3 -3
- camel/prompts/prompt_templates.py +2 -2
- camel/prompts/role_description_prompt_template.py +2 -2
- camel/prompts/solution_extraction.py +8 -8
- camel/prompts/task_prompt_template.py +2 -2
- camel/prompts/translation.py +2 -2
- camel/prompts/video_description_prompt.py +3 -3
- camel/responses/__init__.py +2 -2
- camel/responses/agent_responses.py +2 -2
- camel/retrievers/__init__.py +2 -2
- camel/retrievers/auto_retriever.py +3 -2
- camel/retrievers/base.py +2 -2
- camel/retrievers/bm25_retriever.py +2 -2
- camel/retrievers/cohere_rerank_retriever.py +2 -2
- camel/retrievers/hybrid_retrival.py +2 -2
- camel/retrievers/vector_retriever.py +2 -2
- camel/runtimes/Dockerfile.multi-toolkit +90 -0
- camel/runtimes/__init__.py +2 -2
- camel/runtimes/api.py +79 -23
- camel/runtimes/base.py +2 -2
- camel/runtimes/configs.py +13 -13
- camel/runtimes/daytona_runtime.py +17 -18
- camel/runtimes/docker_runtime.py +12 -12
- camel/runtimes/llm_guard_runtime.py +26 -26
- camel/runtimes/remote_http_runtime.py +11 -11
- camel/runtimes/ubuntu_docker_runtime.py +2 -2
- camel/runtimes/utils/__init__.py +2 -2
- camel/runtimes/utils/function_risk_toolkit.py +2 -2
- camel/runtimes/utils/ignore_risk_toolkit.py +2 -2
- camel/schemas/__init__.py +2 -2
- camel/schemas/base.py +2 -2
- camel/schemas/openai_converter.py +3 -3
- camel/schemas/outlines_converter.py +2 -2
- camel/services/agent_openapi_server.py +380 -0
- camel/societies/__init__.py +4 -2
- camel/societies/babyagi_playing.py +2 -2
- camel/societies/role_playing.py +201 -80
- camel/societies/workforce/__init__.py +10 -3
- camel/societies/workforce/base.py +2 -2
- camel/societies/workforce/events.py +145 -0
- camel/societies/workforce/prompts.py +259 -33
- camel/societies/workforce/role_playing_worker.py +88 -31
- camel/societies/workforce/single_agent_worker.py +638 -40
- camel/societies/workforce/structured_output_handler.py +512 -0
- camel/societies/workforce/task_channel.py +182 -38
- camel/societies/workforce/utils.py +780 -65
- camel/societies/workforce/worker.py +92 -26
- camel/societies/workforce/workflow_memory_manager.py +1746 -0
- camel/societies/workforce/workforce.py +5354 -372
- camel/societies/workforce/workforce_callback.py +103 -0
- camel/societies/workforce/workforce_logger.py +647 -0
- camel/societies/workforce/workforce_metrics.py +33 -0
- camel/storages/__init__.py +6 -2
- camel/storages/graph_storages/__init__.py +2 -2
- camel/storages/graph_storages/base.py +2 -2
- camel/storages/graph_storages/graph_element.py +2 -2
- camel/storages/graph_storages/nebula_graph.py +4 -4
- camel/storages/graph_storages/neo4j_graph.py +7 -7
- camel/storages/key_value_storages/__init__.py +2 -2
- camel/storages/key_value_storages/base.py +2 -2
- camel/storages/key_value_storages/in_memory.py +2 -2
- camel/storages/key_value_storages/json.py +17 -4
- camel/storages/key_value_storages/mem0_cloud.py +50 -49
- camel/storages/key_value_storages/redis.py +2 -2
- camel/storages/object_storages/__init__.py +2 -2
- camel/storages/object_storages/amazon_s3.py +2 -2
- camel/storages/object_storages/azure_blob.py +2 -2
- camel/storages/object_storages/base.py +2 -2
- camel/storages/object_storages/google_cloud.py +3 -3
- camel/storages/vectordb_storages/__init__.py +8 -2
- camel/storages/vectordb_storages/base.py +2 -2
- camel/storages/vectordb_storages/chroma.py +731 -0
- camel/storages/vectordb_storages/faiss.py +2 -2
- camel/storages/vectordb_storages/milvus.py +2 -2
- camel/storages/vectordb_storages/oceanbase.py +15 -15
- camel/storages/vectordb_storages/pgvector.py +349 -0
- camel/storages/vectordb_storages/qdrant.py +6 -6
- camel/storages/vectordb_storages/surreal.py +372 -0
- camel/storages/vectordb_storages/tidb.py +11 -8
- camel/storages/vectordb_storages/weaviate.py +2 -2
- camel/tasks/__init__.py +2 -2
- camel/tasks/task.py +348 -26
- camel/tasks/task_prompt.py +3 -3
- camel/terminators/__init__.py +2 -2
- camel/terminators/base.py +2 -2
- camel/terminators/response_terminator.py +2 -2
- camel/terminators/token_limit_terminator.py +2 -2
- camel/toolkits/__init__.py +57 -10
- camel/toolkits/aci_toolkit.py +66 -21
- camel/toolkits/arxiv_toolkit.py +8 -8
- camel/toolkits/ask_news_toolkit.py +2 -2
- camel/toolkits/async_browser_toolkit.py +4 -4
- camel/toolkits/audio_analysis_toolkit.py +3 -3
- camel/toolkits/base.py +106 -6
- camel/toolkits/bohrium_toolkit.py +2 -2
- camel/toolkits/browser_toolkit.py +34 -21
- camel/toolkits/browser_toolkit_commons.py +4 -4
- camel/toolkits/code_execution.py +31 -4
- camel/toolkits/context_summarizer_toolkit.py +684 -0
- camel/toolkits/craw4ai_toolkit.py +93 -0
- camel/toolkits/dappier_toolkit.py +12 -8
- camel/toolkits/data_commons_toolkit.py +2 -2
- camel/toolkits/dingtalk.py +1135 -0
- camel/toolkits/earth_science_toolkit.py +5367 -0
- camel/toolkits/edgeone_pages_mcp_toolkit.py +49 -0
- camel/toolkits/excel_toolkit.py +905 -71
- camel/toolkits/file_toolkit.py +1402 -0
- camel/toolkits/function_tool.py +205 -27
- camel/toolkits/github_toolkit.py +109 -22
- camel/toolkits/gmail_toolkit.py +1839 -0
- camel/toolkits/google_calendar_toolkit.py +40 -6
- camel/toolkits/google_drive_mcp_toolkit.py +54 -0
- camel/toolkits/google_maps_toolkit.py +2 -2
- camel/toolkits/google_scholar_toolkit.py +2 -2
- camel/toolkits/human_toolkit.py +36 -12
- camel/toolkits/hybrid_browser_toolkit/__init__.py +18 -0
- camel/toolkits/hybrid_browser_toolkit/config_loader.py +185 -0
- camel/toolkits/hybrid_browser_toolkit/hybrid_browser_toolkit.py +246 -0
- camel/toolkits/hybrid_browser_toolkit/hybrid_browser_toolkit_ts.py +1958 -0
- camel/toolkits/hybrid_browser_toolkit/installer.py +203 -0
- camel/toolkits/hybrid_browser_toolkit/ts/package-lock.json +4589 -0
- camel/toolkits/hybrid_browser_toolkit/ts/package.json +33 -0
- camel/toolkits/hybrid_browser_toolkit/ts/src/browser-scripts.js +125 -0
- camel/toolkits/hybrid_browser_toolkit/ts/src/browser-session.ts +1940 -0
- camel/toolkits/hybrid_browser_toolkit/ts/src/config-loader.ts +233 -0
- camel/toolkits/hybrid_browser_toolkit/ts/src/hybrid-browser-toolkit.ts +589 -0
- camel/toolkits/hybrid_browser_toolkit/ts/src/index.ts +7 -0
- camel/toolkits/hybrid_browser_toolkit/ts/src/parent-child-filter.ts +226 -0
- camel/toolkits/hybrid_browser_toolkit/ts/src/snapshot-parser.ts +219 -0
- camel/toolkits/hybrid_browser_toolkit/ts/src/som-screenshot-injected.ts +543 -0
- camel/toolkits/hybrid_browser_toolkit/ts/src/types.ts +129 -0
- camel/toolkits/hybrid_browser_toolkit/ts/tsconfig.json +27 -0
- camel/toolkits/hybrid_browser_toolkit/ts/websocket-server.js +325 -0
- camel/toolkits/hybrid_browser_toolkit/ws_wrapper.py +1037 -0
- camel/toolkits/hybrid_browser_toolkit_py/__init__.py +17 -0
- camel/toolkits/hybrid_browser_toolkit_py/actions.py +575 -0
- camel/toolkits/hybrid_browser_toolkit_py/agent.py +311 -0
- camel/toolkits/hybrid_browser_toolkit_py/browser_session.py +787 -0
- camel/toolkits/hybrid_browser_toolkit_py/config_loader.py +490 -0
- camel/toolkits/hybrid_browser_toolkit_py/hybrid_browser_toolkit.py +2390 -0
- camel/toolkits/hybrid_browser_toolkit_py/snapshot.py +233 -0
- camel/toolkits/hybrid_browser_toolkit_py/stealth_script.js +0 -0
- camel/toolkits/hybrid_browser_toolkit_py/unified_analyzer.js +1043 -0
- camel/toolkits/image_analysis_toolkit.py +3 -6
- camel/toolkits/image_generation_toolkit.py +390 -0
- camel/toolkits/jina_reranker_toolkit.py +5 -6
- camel/toolkits/klavis_toolkit.py +7 -3
- camel/toolkits/linkedin_toolkit.py +2 -2
- camel/toolkits/markitdown_toolkit.py +104 -0
- camel/toolkits/math_toolkit.py +66 -12
- camel/toolkits/mcp_toolkit.py +412 -36
- camel/toolkits/memory_toolkit.py +7 -3
- camel/toolkits/meshy_toolkit.py +2 -2
- camel/toolkits/message_agent_toolkit.py +608 -0
- camel/toolkits/message_integration.py +728 -0
- camel/toolkits/microsoft_outlook_mail_toolkit.py +1885 -0
- camel/toolkits/mineru_toolkit.py +2 -2
- camel/toolkits/minimax_mcp_toolkit.py +195 -0
- camel/toolkits/networkx_toolkit.py +2 -2
- camel/toolkits/note_taking_toolkit.py +277 -0
- camel/toolkits/notion_mcp_toolkit.py +224 -0
- camel/toolkits/notion_toolkit.py +2 -2
- camel/toolkits/open_api_specs/biztoc/__init__.py +2 -2
- camel/toolkits/open_api_specs/biztoc/ai-plugin.json +1 -1
- camel/toolkits/open_api_specs/coursera/__init__.py +2 -2
- camel/toolkits/open_api_specs/create_qr_code/__init__.py +2 -2
- camel/toolkits/open_api_specs/klarna/__init__.py +2 -2
- camel/toolkits/open_api_specs/nasa_apod/__init__.py +2 -2
- camel/toolkits/open_api_specs/outschool/__init__.py +2 -2
- camel/toolkits/open_api_specs/outschool/ai-plugin.json +1 -1
- camel/toolkits/open_api_specs/outschool/openapi.yaml +1 -1
- camel/toolkits/open_api_specs/outschool/paths/__init__.py +2 -2
- camel/toolkits/open_api_specs/outschool/paths/get_classes.py +2 -2
- camel/toolkits/open_api_specs/outschool/paths/search_teachers.py +2 -2
- camel/toolkits/open_api_specs/security_config.py +2 -2
- camel/toolkits/open_api_specs/speak/__init__.py +2 -2
- camel/toolkits/open_api_specs/web_scraper/__init__.py +2 -2
- camel/toolkits/open_api_specs/web_scraper/ai-plugin.json +1 -1
- camel/toolkits/open_api_specs/web_scraper/paths/__init__.py +2 -2
- camel/toolkits/open_api_specs/web_scraper/paths/scraper.py +2 -2
- camel/toolkits/open_api_toolkit.py +2 -2
- camel/toolkits/openbb_toolkit.py +7 -3
- camel/toolkits/origene_mcp_toolkit.py +56 -0
- camel/toolkits/page_script.js +53 -53
- camel/toolkits/playwright_mcp_toolkit.py +13 -31
- camel/toolkits/pptx_toolkit.py +36 -23
- camel/toolkits/pubmed_toolkit.py +2 -2
- camel/toolkits/pulse_mcp_search_toolkit.py +2 -2
- camel/toolkits/pyautogui_toolkit.py +2 -2
- camel/toolkits/reddit_toolkit.py +2 -2
- camel/toolkits/resend_toolkit.py +168 -0
- camel/toolkits/retrieval_toolkit.py +2 -2
- camel/toolkits/screenshot_toolkit.py +213 -0
- camel/toolkits/search_toolkit.py +606 -156
- camel/toolkits/searxng_toolkit.py +2 -2
- camel/toolkits/semantic_scholar_toolkit.py +2 -2
- camel/toolkits/slack_toolkit.py +108 -58
- camel/toolkits/sql_toolkit.py +712 -0
- camel/toolkits/stripe_toolkit.py +2 -2
- camel/toolkits/sympy_toolkit.py +3 -3
- camel/toolkits/task_planning_toolkit.py +5 -5
- camel/toolkits/terminal_toolkit/__init__.py +18 -0
- camel/toolkits/terminal_toolkit/terminal_toolkit.py +1281 -0
- camel/toolkits/terminal_toolkit/utils.py +659 -0
- camel/toolkits/thinking_toolkit.py +3 -3
- camel/toolkits/twitter_toolkit.py +2 -2
- camel/toolkits/vertex_ai_veo_toolkit.py +590 -0
- camel/toolkits/video_analysis_toolkit.py +109 -29
- camel/toolkits/video_download_toolkit.py +19 -16
- camel/toolkits/weather_toolkit.py +2 -2
- camel/toolkits/web_deploy_toolkit.py +1219 -0
- camel/toolkits/wechat_official_toolkit.py +483 -0
- camel/toolkits/whatsapp_toolkit.py +2 -2
- camel/toolkits/wolfram_alpha_toolkit.py +2 -2
- camel/toolkits/zapier_toolkit.py +7 -3
- camel/types/__init__.py +4 -4
- camel/types/agents/__init__.py +2 -2
- camel/types/agents/tool_calling_record.py +6 -3
- camel/types/enums.py +381 -41
- camel/types/mcp_registries.py +2 -2
- camel/types/openai_types.py +4 -4
- camel/types/unified_model_type.py +46 -10
- camel/utils/__init__.py +5 -2
- camel/utils/agent_context.py +41 -0
- camel/utils/async_func.py +2 -2
- camel/utils/chunker/__init__.py +2 -2
- camel/utils/chunker/base.py +2 -2
- camel/utils/chunker/code_chunker.py +2 -2
- camel/utils/chunker/uio_chunker.py +2 -2
- camel/utils/commons.py +38 -7
- camel/utils/constants.py +5 -2
- camel/utils/context_utils.py +1134 -0
- camel/utils/deduplication.py +2 -2
- camel/utils/filename.py +2 -2
- camel/utils/langfuse.py +18 -10
- camel/utils/mcp.py +140 -6
- camel/utils/mcp_client.py +48 -38
- camel/utils/message_summarizer.py +148 -0
- camel/utils/response_format.py +2 -2
- camel/utils/token_counting.py +45 -22
- camel/utils/tool_result.py +44 -0
- camel/verifiers/__init__.py +2 -2
- camel/verifiers/base.py +2 -2
- camel/verifiers/math_verifier.py +2 -2
- camel/verifiers/models.py +2 -2
- camel/verifiers/physics_verifier.py +2 -2
- camel/verifiers/python_verifier.py +2 -2
- {camel_ai-0.2.65.dist-info → camel_ai-0.2.83a6.dist-info}/METADATA +355 -117
- camel_ai-0.2.83a6.dist-info/RECORD +511 -0
- {camel_ai-0.2.65.dist-info → camel_ai-0.2.83a6.dist-info}/WHEEL +1 -1
- {camel_ai-0.2.65.dist-info → camel_ai-0.2.83a6.dist-info}/licenses/LICENSE +1 -1
- camel/loaders/pandas_reader.py +0 -368
- camel/toolkits/dalle_toolkit.py +0 -175
- camel/toolkits/file_write_toolkit.py +0 -444
- camel/toolkits/openai_agent_toolkit.py +0 -135
- camel/toolkits/terminal_toolkit.py +0 -1037
- camel_ai-0.2.65.dist-info/RECORD +0 -426
|
@@ -0,0 +1,589 @@
|
|
|
1
|
+
import {HybridBrowserSession} from './browser-session';
|
|
2
|
+
import {ActionResult, BrowserAction, BrowserToolkitConfig, SnapshotResult, TabInfo, VisualMarkResult} from './types';
|
|
3
|
+
import {ConfigLoader} from './config-loader';
|
|
4
|
+
import {ConsoleMessage} from 'playwright';
|
|
5
|
+
import {SomScreenshotInjected} from './som-screenshot-injected';
|
|
6
|
+
import {filterClickableByHierarchy} from './snapshot-parser';
|
|
7
|
+
|
|
8
|
+
export class HybridBrowserToolkit {
|
|
9
|
+
private session: HybridBrowserSession;
|
|
10
|
+
private config: BrowserToolkitConfig;
|
|
11
|
+
private configLoader: ConfigLoader;
|
|
12
|
+
private viewportLimit: boolean;
|
|
13
|
+
private fullVisualMode: boolean;
|
|
14
|
+
|
|
15
|
+
constructor(config: BrowserToolkitConfig = {}) {
|
|
16
|
+
this.configLoader = ConfigLoader.fromPythonConfig(config);
|
|
17
|
+
this.config = config; // Store original config for backward compatibility
|
|
18
|
+
this.session = new HybridBrowserSession(config); // Pass original config
|
|
19
|
+
this.viewportLimit = this.configLoader.getWebSocketConfig().viewport_limit;
|
|
20
|
+
this.fullVisualMode = this.configLoader.getWebSocketConfig().fullVisualMode || false;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
async openBrowser(startUrl?: string): Promise<ActionResult> {
|
|
24
|
+
const startTime = Date.now();
|
|
25
|
+
|
|
26
|
+
try {
|
|
27
|
+
await this.session.ensureBrowser();
|
|
28
|
+
|
|
29
|
+
// Check if we should skip navigation in CDP keep-current-page mode
|
|
30
|
+
const browserConfig = this.configLoader.getBrowserConfig();
|
|
31
|
+
if (browserConfig.cdpUrl && browserConfig.cdpKeepCurrentPage && !startUrl) {
|
|
32
|
+
// In CDP keep-current-page mode without explicit URL, just ensure browser and return current page
|
|
33
|
+
const snapshotStart = Date.now();
|
|
34
|
+
const snapshot = await this.getSnapshotForAction(this.viewportLimit);
|
|
35
|
+
const snapshotTime = Date.now() - snapshotStart;
|
|
36
|
+
|
|
37
|
+
const page = await this.session.getCurrentPage();
|
|
38
|
+
const currentUrl = page ? await page.url() : 'unknown';
|
|
39
|
+
|
|
40
|
+
const totalTime = Date.now() - startTime;
|
|
41
|
+
|
|
42
|
+
return {
|
|
43
|
+
success: true,
|
|
44
|
+
message: `Browser opened in CDP keep-current-page mode (current page: ${currentUrl})`,
|
|
45
|
+
snapshot,
|
|
46
|
+
timing: {
|
|
47
|
+
total_time_ms: totalTime,
|
|
48
|
+
snapshot_time_ms: snapshotTime,
|
|
49
|
+
},
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
// For normal mode or CDP with cdpKeepCurrentPage=false: navigate to URL
|
|
54
|
+
if (!browserConfig.cdpUrl || !browserConfig.cdpKeepCurrentPage) {
|
|
55
|
+
const url = startUrl || this.config.defaultStartUrl || 'https://google.com/';
|
|
56
|
+
const result = await this.session.visitPage(url);
|
|
57
|
+
|
|
58
|
+
const snapshotStart = Date.now();
|
|
59
|
+
const snapshot = await this.getSnapshotForAction(this.viewportLimit);
|
|
60
|
+
const snapshotTime = Date.now() - snapshotStart;
|
|
61
|
+
|
|
62
|
+
const totalTime = Date.now() - startTime;
|
|
63
|
+
|
|
64
|
+
return {
|
|
65
|
+
success: true,
|
|
66
|
+
message: result.message,
|
|
67
|
+
snapshot,
|
|
68
|
+
timing: {
|
|
69
|
+
total_time_ms: totalTime,
|
|
70
|
+
page_load_time_ms: result.timing?.page_load_time_ms || 0,
|
|
71
|
+
snapshot_time_ms: snapshotTime,
|
|
72
|
+
},
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
// Fallback: Just return current page snapshot without any navigation
|
|
77
|
+
const snapshotStart = Date.now();
|
|
78
|
+
const snapshot = await this.getSnapshotForAction(this.viewportLimit);
|
|
79
|
+
const snapshotTime = Date.now() - snapshotStart;
|
|
80
|
+
|
|
81
|
+
const totalTime = Date.now() - startTime;
|
|
82
|
+
|
|
83
|
+
return {
|
|
84
|
+
success: true,
|
|
85
|
+
message: `Browser opened without navigation`,
|
|
86
|
+
snapshot,
|
|
87
|
+
timing: {
|
|
88
|
+
total_time_ms: totalTime,
|
|
89
|
+
snapshot_time_ms: snapshotTime,
|
|
90
|
+
},
|
|
91
|
+
};
|
|
92
|
+
} catch (error) {
|
|
93
|
+
const totalTime = Date.now() - startTime;
|
|
94
|
+
return {
|
|
95
|
+
success: false,
|
|
96
|
+
message: `Failed to open browser: ${error}`,
|
|
97
|
+
timing: {
|
|
98
|
+
total_time_ms: totalTime,
|
|
99
|
+
},
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
async closeBrowser(): Promise<ActionResult> {
|
|
105
|
+
try {
|
|
106
|
+
await this.session.close();
|
|
107
|
+
return {
|
|
108
|
+
success: true,
|
|
109
|
+
message: 'Browser closed successfully',
|
|
110
|
+
};
|
|
111
|
+
} catch (error) {
|
|
112
|
+
return {
|
|
113
|
+
success: false,
|
|
114
|
+
message: `Failed to close browser: ${error}`,
|
|
115
|
+
};
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
async visitPage(url: string): Promise<any> {
|
|
120
|
+
try {
|
|
121
|
+
// Ensure browser is initialized before visiting page
|
|
122
|
+
await this.session.ensureBrowser();
|
|
123
|
+
|
|
124
|
+
const result = await this.session.visitPage(url);
|
|
125
|
+
|
|
126
|
+
// Format response for Python layer compatibility
|
|
127
|
+
const response: any = {
|
|
128
|
+
result: result.message,
|
|
129
|
+
snapshot: '',
|
|
130
|
+
};
|
|
131
|
+
|
|
132
|
+
if (result.success) {
|
|
133
|
+
const snapshotStart = Date.now();
|
|
134
|
+
response.snapshot = await this.getSnapshotForAction(this.viewportLimit);
|
|
135
|
+
const snapshotTime = Date.now() - snapshotStart;
|
|
136
|
+
|
|
137
|
+
if (result.timing) {
|
|
138
|
+
result.timing.snapshot_time_ms = snapshotTime;
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
// Include timing if available
|
|
143
|
+
if (result.timing) {
|
|
144
|
+
response.timing = result.timing;
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
// Include newTabId if present
|
|
148
|
+
if (result.newTabId) {
|
|
149
|
+
response.newTabId = result.newTabId;
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
return response;
|
|
153
|
+
} catch (error) {
|
|
154
|
+
console.error('[visitPage] Error:', error);
|
|
155
|
+
return {
|
|
156
|
+
result: `Navigation to ${url} failed: ${error}`,
|
|
157
|
+
snapshot: '',
|
|
158
|
+
timing: {
|
|
159
|
+
total_time_ms: 0,
|
|
160
|
+
navigation_time_ms: 0,
|
|
161
|
+
dom_content_loaded_time_ms: 0,
|
|
162
|
+
network_idle_time_ms: 0,
|
|
163
|
+
}
|
|
164
|
+
};
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
async getPageSnapshot(viewportLimit: boolean = false): Promise<string> {
|
|
169
|
+
try {
|
|
170
|
+
// Always return real snapshot when explicitly called
|
|
171
|
+
// If viewport limiting is enabled, we need coordinates for filtering
|
|
172
|
+
const snapshotResult = await this.session.getSnapshotForAI(viewportLimit, viewportLimit);
|
|
173
|
+
return snapshotResult.snapshot;
|
|
174
|
+
} catch (error) {
|
|
175
|
+
return `Error capturing snapshot: ${error}`;
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
// Internal method for getting snapshot in actions (respects fullVisualMode)
|
|
180
|
+
private async getSnapshotForAction(viewportLimit: boolean = false): Promise<string> {
|
|
181
|
+
if (this.fullVisualMode) {
|
|
182
|
+
return 'full visual mode';
|
|
183
|
+
}
|
|
184
|
+
return this.getPageSnapshot(viewportLimit);
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
|
|
188
|
+
async getSnapshotForAI(): Promise<SnapshotResult> {
|
|
189
|
+
return await this.session.getSnapshotForAI();
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
async getSomScreenshot(): Promise<VisualMarkResult & { timing: any }> {
|
|
193
|
+
const startTime = Date.now();
|
|
194
|
+
console.log('[HybridBrowserToolkit] Starting getSomScreenshot...');
|
|
195
|
+
|
|
196
|
+
try {
|
|
197
|
+
// Get page and snapshot data
|
|
198
|
+
const page = await this.session.getCurrentPage();
|
|
199
|
+
const snapshotResult = await this.session.getSnapshotForAI(true); // Include coordinates
|
|
200
|
+
|
|
201
|
+
// Parse clickable elements from snapshot text
|
|
202
|
+
const clickableElements = this.parseClickableElements(snapshotResult.snapshot);
|
|
203
|
+
console.log(`[HybridBrowserToolkit] Found ${clickableElements.size} clickable elements`);
|
|
204
|
+
|
|
205
|
+
// Apply hierarchy-based filtering
|
|
206
|
+
const filteredElements = filterClickableByHierarchy(snapshotResult.snapshot, clickableElements);
|
|
207
|
+
console.log(`[HybridBrowserToolkit] After filtering: ${filteredElements.size} elements remain`);
|
|
208
|
+
|
|
209
|
+
// Use injected SOM-screenshot method without export path
|
|
210
|
+
const result = await SomScreenshotInjected.captureOptimized(
|
|
211
|
+
page,
|
|
212
|
+
snapshotResult,
|
|
213
|
+
filteredElements,
|
|
214
|
+
undefined // No export path - don't generate files
|
|
215
|
+
);
|
|
216
|
+
|
|
217
|
+
// Add snapshot timing info to result
|
|
218
|
+
result.timing.snapshot_time_ms = snapshotResult.timing.snapshot_time_ms;
|
|
219
|
+
result.timing.coordinate_enrichment_time_ms = snapshotResult.timing.coordinate_enrichment_time_ms;
|
|
220
|
+
|
|
221
|
+
return result;
|
|
222
|
+
} catch (error) {
|
|
223
|
+
const totalTime = Date.now() - startTime;
|
|
224
|
+
return {
|
|
225
|
+
text: `Error capturing screenshot: ${error}`,
|
|
226
|
+
images: [],
|
|
227
|
+
timing: {
|
|
228
|
+
total_time_ms: totalTime,
|
|
229
|
+
screenshot_time_ms: 0,
|
|
230
|
+
snapshot_time_ms: 0,
|
|
231
|
+
coordinate_enrichment_time_ms: 0,
|
|
232
|
+
visual_marking_time_ms: 0,
|
|
233
|
+
},
|
|
234
|
+
};
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
|
|
239
|
+
/**
|
|
240
|
+
* Parse clickable elements from snapshot text
|
|
241
|
+
*/
|
|
242
|
+
private parseClickableElements(snapshotText: string): Set<string> {
|
|
243
|
+
const clickableElements = new Set<string>();
|
|
244
|
+
const lines = snapshotText.split('\n');
|
|
245
|
+
|
|
246
|
+
for (const line of lines) {
|
|
247
|
+
// Look for lines containing [cursor=pointer] or [active] and extract ref
|
|
248
|
+
if (line.includes('[cursor=pointer]') || line.includes('[active]')) {
|
|
249
|
+
const refMatch = line.match(/\[ref=([^\]]+)\]/);
|
|
250
|
+
if (refMatch) {
|
|
251
|
+
clickableElements.add(refMatch[1]);
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
return clickableElements;
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
|
|
260
|
+
private async executeActionWithSnapshot(action: BrowserAction): Promise<any> {
|
|
261
|
+
const result = await this.session.executeAction(action);
|
|
262
|
+
|
|
263
|
+
const response: any = {
|
|
264
|
+
result: result.message,
|
|
265
|
+
snapshot: '',
|
|
266
|
+
};
|
|
267
|
+
|
|
268
|
+
if (result.success) {
|
|
269
|
+
if (result.details?.diffSnapshot) {
|
|
270
|
+
response.snapshot = result.details.diffSnapshot;
|
|
271
|
+
|
|
272
|
+
if (result.timing) {
|
|
273
|
+
result.timing.snapshot_time_ms = 0; // Diff snapshot time is included in action time
|
|
274
|
+
}
|
|
275
|
+
} else {
|
|
276
|
+
// Get full snapshot as usual
|
|
277
|
+
const snapshotStart = Date.now();
|
|
278
|
+
response.snapshot = await this.getPageSnapshot(this.viewportLimit);
|
|
279
|
+
const snapshotTime = Date.now() - snapshotStart;
|
|
280
|
+
|
|
281
|
+
if (result.timing) {
|
|
282
|
+
result.timing.snapshot_time_ms = snapshotTime;
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
|
|
287
|
+
// Include timing if available
|
|
288
|
+
if (result.timing) {
|
|
289
|
+
response.timing = result.timing;
|
|
290
|
+
}
|
|
291
|
+
|
|
292
|
+
// Include newTabId if present
|
|
293
|
+
if (result.newTabId) {
|
|
294
|
+
response.newTabId = result.newTabId;
|
|
295
|
+
}
|
|
296
|
+
|
|
297
|
+
// Include details if present (excluding diffSnapshot as it's already in snapshot)
|
|
298
|
+
if (result.details) {
|
|
299
|
+
const { diffSnapshot, ...otherDetails } = result.details;
|
|
300
|
+
if (Object.keys(otherDetails).length > 0) {
|
|
301
|
+
response.details = otherDetails;
|
|
302
|
+
}
|
|
303
|
+
}
|
|
304
|
+
|
|
305
|
+
return response;
|
|
306
|
+
}
|
|
307
|
+
|
|
308
|
+
async click(ref: string): Promise<any> {
|
|
309
|
+
const action: BrowserAction = { type: 'click', ref };
|
|
310
|
+
return this.executeActionWithSnapshot(action);
|
|
311
|
+
}
|
|
312
|
+
|
|
313
|
+
async type(refOrInputs: string | Array<{ ref: string; text: string }>, text?: string): Promise<any> {
|
|
314
|
+
let action: BrowserAction;
|
|
315
|
+
|
|
316
|
+
if (typeof refOrInputs === 'string') {
|
|
317
|
+
// Single input mode (backward compatibility)
|
|
318
|
+
if (text === undefined) {
|
|
319
|
+
throw new Error('Text parameter is required when ref is a string');
|
|
320
|
+
}
|
|
321
|
+
action = { type: 'type', ref: refOrInputs, text };
|
|
322
|
+
} else {
|
|
323
|
+
// Multiple inputs mode
|
|
324
|
+
action = { type: 'type', inputs: refOrInputs };
|
|
325
|
+
}
|
|
326
|
+
|
|
327
|
+
return this.executeActionWithSnapshot(action);
|
|
328
|
+
}
|
|
329
|
+
|
|
330
|
+
async select(ref: string, value: string): Promise<any> {
|
|
331
|
+
const action: BrowserAction = { type: 'select', ref, value };
|
|
332
|
+
return this.executeActionWithSnapshot(action);
|
|
333
|
+
}
|
|
334
|
+
|
|
335
|
+
async scroll(direction: 'up' | 'down', amount: number): Promise<any> {
|
|
336
|
+
const action: BrowserAction = { type: 'scroll', direction, amount };
|
|
337
|
+
return this.executeActionWithSnapshot(action);
|
|
338
|
+
}
|
|
339
|
+
|
|
340
|
+
async enter(): Promise<any> {
|
|
341
|
+
const action: BrowserAction = { type: 'enter' };
|
|
342
|
+
return this.executeActionWithSnapshot(action);
|
|
343
|
+
}
|
|
344
|
+
|
|
345
|
+
async mouseControl(control: 'click' | 'right_click'| 'dblclick', x: number, y: number): Promise<any> {
|
|
346
|
+
const action: BrowserAction = { type: 'mouse_control', control, x, y };
|
|
347
|
+
return this.executeActionWithSnapshot(action);
|
|
348
|
+
}
|
|
349
|
+
|
|
350
|
+
async mouseDrag(from_ref: string, to_ref: string): Promise<any> {
|
|
351
|
+
const action: BrowserAction = { type: 'mouse_drag', from_ref, to_ref };
|
|
352
|
+
return this.executeActionWithSnapshot(action);
|
|
353
|
+
}
|
|
354
|
+
|
|
355
|
+
async pressKeys(keys: string[]): Promise<any> {
|
|
356
|
+
const action: BrowserAction = { type: 'press_key', keys};
|
|
357
|
+
return this.executeActionWithSnapshot(action);
|
|
358
|
+
}
|
|
359
|
+
|
|
360
|
+
async batchKeyboardInput(operations: Array<{type: string, keys?: string[], text?: string, delay?: number}>, skipStabilityWait: boolean = true): Promise<any> {
|
|
361
|
+
return this.session.batchKeyboardInput(operations, skipStabilityWait);
|
|
362
|
+
}
|
|
363
|
+
|
|
364
|
+
async back(): Promise<ActionResult> {
|
|
365
|
+
const startTime = Date.now();
|
|
366
|
+
|
|
367
|
+
try {
|
|
368
|
+
const page = await this.session.getCurrentPage();
|
|
369
|
+
|
|
370
|
+
const navigationStart = Date.now();
|
|
371
|
+
await page.goBack({ waitUntil: 'domcontentloaded' });
|
|
372
|
+
const navigationTime = Date.now() - navigationStart;
|
|
373
|
+
|
|
374
|
+
const snapshotStart = Date.now();
|
|
375
|
+
const snapshot = await this.getSnapshotForAction(this.viewportLimit);
|
|
376
|
+
const snapshotTime = Date.now() - snapshotStart;
|
|
377
|
+
|
|
378
|
+
const totalTime = Date.now() - startTime;
|
|
379
|
+
|
|
380
|
+
return {
|
|
381
|
+
success: true,
|
|
382
|
+
message: 'Navigated back successfully',
|
|
383
|
+
snapshot,
|
|
384
|
+
timing: {
|
|
385
|
+
total_time_ms: totalTime,
|
|
386
|
+
navigation_time_ms: navigationTime,
|
|
387
|
+
snapshot_time_ms: snapshotTime,
|
|
388
|
+
},
|
|
389
|
+
};
|
|
390
|
+
} catch (error) {
|
|
391
|
+
const totalTime = Date.now() - startTime;
|
|
392
|
+
return {
|
|
393
|
+
success: false,
|
|
394
|
+
message: `Back navigation failed: ${error}`,
|
|
395
|
+
timing: {
|
|
396
|
+
total_time_ms: totalTime,
|
|
397
|
+
navigation_time_ms: 0,
|
|
398
|
+
snapshot_time_ms: 0,
|
|
399
|
+
},
|
|
400
|
+
};
|
|
401
|
+
}
|
|
402
|
+
}
|
|
403
|
+
|
|
404
|
+
async forward(): Promise<ActionResult> {
|
|
405
|
+
const startTime = Date.now();
|
|
406
|
+
|
|
407
|
+
try {
|
|
408
|
+
const page = await this.session.getCurrentPage();
|
|
409
|
+
|
|
410
|
+
const navigationStart = Date.now();
|
|
411
|
+
await page.goForward({ waitUntil: 'domcontentloaded' });
|
|
412
|
+
const navigationTime = Date.now() - navigationStart;
|
|
413
|
+
|
|
414
|
+
const snapshotStart = Date.now();
|
|
415
|
+
const snapshot = await this.getSnapshotForAction(this.viewportLimit);
|
|
416
|
+
const snapshotTime = Date.now() - snapshotStart;
|
|
417
|
+
|
|
418
|
+
const totalTime = Date.now() - startTime;
|
|
419
|
+
|
|
420
|
+
return {
|
|
421
|
+
success: true,
|
|
422
|
+
message: 'Navigated forward successfully',
|
|
423
|
+
snapshot,
|
|
424
|
+
timing: {
|
|
425
|
+
total_time_ms: totalTime,
|
|
426
|
+
navigation_time_ms: navigationTime,
|
|
427
|
+
snapshot_time_ms: snapshotTime,
|
|
428
|
+
},
|
|
429
|
+
};
|
|
430
|
+
} catch (error) {
|
|
431
|
+
const totalTime = Date.now() - startTime;
|
|
432
|
+
return {
|
|
433
|
+
success: false,
|
|
434
|
+
message: `Forward navigation failed: ${error}`,
|
|
435
|
+
timing: {
|
|
436
|
+
total_time_ms: totalTime,
|
|
437
|
+
navigation_time_ms: 0,
|
|
438
|
+
snapshot_time_ms: 0,
|
|
439
|
+
},
|
|
440
|
+
};
|
|
441
|
+
}
|
|
442
|
+
}
|
|
443
|
+
|
|
444
|
+
|
|
445
|
+
async switchTab(tabId: string): Promise<any> {
|
|
446
|
+
const startTime = Date.now();
|
|
447
|
+
|
|
448
|
+
try {
|
|
449
|
+
const success = await this.session.switchToTab(tabId);
|
|
450
|
+
|
|
451
|
+
if (success) {
|
|
452
|
+
const snapshotStart = Date.now();
|
|
453
|
+
const snapshot = await this.getPageSnapshot(this.viewportLimit);
|
|
454
|
+
const snapshotTime = Date.now() - snapshotStart;
|
|
455
|
+
|
|
456
|
+
const totalTime = Date.now() - startTime;
|
|
457
|
+
|
|
458
|
+
return {
|
|
459
|
+
result: `Switched to tab ${tabId}`,
|
|
460
|
+
snapshot: snapshot,
|
|
461
|
+
timing: {
|
|
462
|
+
total_time_ms: totalTime,
|
|
463
|
+
snapshot_time_ms: snapshotTime,
|
|
464
|
+
},
|
|
465
|
+
};
|
|
466
|
+
} else {
|
|
467
|
+
return {
|
|
468
|
+
result: `Failed to switch to tab ${tabId}`,
|
|
469
|
+
snapshot: '',
|
|
470
|
+
};
|
|
471
|
+
}
|
|
472
|
+
} catch (error) {
|
|
473
|
+
return {
|
|
474
|
+
result: `Error switching tab: ${error}`,
|
|
475
|
+
snapshot: '',
|
|
476
|
+
};
|
|
477
|
+
}
|
|
478
|
+
}
|
|
479
|
+
|
|
480
|
+
async closeTab(tabId: string): Promise<ActionResult> {
|
|
481
|
+
const success = await this.session.closeTab(tabId);
|
|
482
|
+
|
|
483
|
+
if (success) {
|
|
484
|
+
return {
|
|
485
|
+
success: true,
|
|
486
|
+
message: `Closed tab ${tabId}`,
|
|
487
|
+
snapshot: await this.getSnapshotForAction(this.viewportLimit),
|
|
488
|
+
};
|
|
489
|
+
} else {
|
|
490
|
+
return {
|
|
491
|
+
success: false,
|
|
492
|
+
message: `Failed to close tab ${tabId}`,
|
|
493
|
+
};
|
|
494
|
+
}
|
|
495
|
+
}
|
|
496
|
+
|
|
497
|
+
async getTabInfo(): Promise<TabInfo[]> {
|
|
498
|
+
return await this.session.getTabInfo();
|
|
499
|
+
}
|
|
500
|
+
|
|
501
|
+
async getConsoleView(): Promise<any> {
|
|
502
|
+
const currentLogs = await this.session.getCurrentLogs();
|
|
503
|
+
// Format logs
|
|
504
|
+
return currentLogs.map(item => ({
|
|
505
|
+
type: item.type(),
|
|
506
|
+
text: item.text(),
|
|
507
|
+
}));
|
|
508
|
+
}
|
|
509
|
+
|
|
510
|
+
async consoleExecute(code: string): Promise<any> {
|
|
511
|
+
const startTime = Date.now();
|
|
512
|
+
try {
|
|
513
|
+
const page = await this.session.getCurrentPage();
|
|
514
|
+
|
|
515
|
+
// Wrap the code to capture console.log output
|
|
516
|
+
const wrappedCode = `
|
|
517
|
+
(function() {
|
|
518
|
+
const _logs = [];
|
|
519
|
+
const originalLog = console.log;
|
|
520
|
+
console.log = function(...args) {
|
|
521
|
+
_logs.push(args.map(arg => {
|
|
522
|
+
try {
|
|
523
|
+
return typeof arg === 'object' ? JSON.stringify(arg) : String(arg);
|
|
524
|
+
} catch (e) {
|
|
525
|
+
return String(arg);
|
|
526
|
+
}
|
|
527
|
+
}).join(' '));
|
|
528
|
+
originalLog.apply(console, args);
|
|
529
|
+
};
|
|
530
|
+
|
|
531
|
+
let result;
|
|
532
|
+
try {
|
|
533
|
+
result = eval(${JSON.stringify(code)});
|
|
534
|
+
} catch (e) {
|
|
535
|
+
try {
|
|
536
|
+
result = (function() { ${code} })();
|
|
537
|
+
} catch (error) {
|
|
538
|
+
console.log = originalLog;
|
|
539
|
+
throw error;
|
|
540
|
+
}
|
|
541
|
+
}
|
|
542
|
+
|
|
543
|
+
console.log = originalLog;
|
|
544
|
+
return { result, logs: _logs };
|
|
545
|
+
})()
|
|
546
|
+
`;
|
|
547
|
+
|
|
548
|
+
const evalResult = await page.evaluate(wrappedCode) as { result: any; logs: string[] };
|
|
549
|
+
const { result, logs } = evalResult;
|
|
550
|
+
|
|
551
|
+
const snapshotStart = Date.now();
|
|
552
|
+
const snapshot = await this.getSnapshotForAction(this.viewportLimit);
|
|
553
|
+
const snapshotTime = Date.now() - snapshotStart;
|
|
554
|
+
const totalTime = Date.now() - startTime;
|
|
555
|
+
|
|
556
|
+
// Properly serialize the result
|
|
557
|
+
let resultStr: string;
|
|
558
|
+
try {
|
|
559
|
+
resultStr = JSON.stringify(result, null, 2);
|
|
560
|
+
} catch (e) {
|
|
561
|
+
// Fallback for non-serializable values
|
|
562
|
+
resultStr = String(result);
|
|
563
|
+
}
|
|
564
|
+
|
|
565
|
+
return {
|
|
566
|
+
result: `Console execution result: ${resultStr}`,
|
|
567
|
+
console_output: logs,
|
|
568
|
+
snapshot: snapshot,
|
|
569
|
+
timing: {
|
|
570
|
+
total_time_ms: totalTime,
|
|
571
|
+
snapshot_time_ms: snapshotTime,
|
|
572
|
+
},
|
|
573
|
+
};
|
|
574
|
+
|
|
575
|
+
} catch (error) {
|
|
576
|
+
const totalTime = Date.now() - startTime;
|
|
577
|
+
return {
|
|
578
|
+
result: `Console execution failed: ${error}`,
|
|
579
|
+
console_output: [],
|
|
580
|
+
snapshot: '',
|
|
581
|
+
timing: {
|
|
582
|
+
total_time_ms: totalTime,
|
|
583
|
+
snapshot_time_ms: 0,
|
|
584
|
+
},
|
|
585
|
+
};
|
|
586
|
+
}
|
|
587
|
+
}
|
|
588
|
+
|
|
589
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export { HybridBrowserToolkit } from './hybrid-browser-toolkit';
|
|
2
|
+
export { HybridBrowserSession } from './browser-session';
|
|
3
|
+
export { ConfigLoader, StealthConfig, BrowserConfig, WebSocketConfig } from './config-loader';
|
|
4
|
+
export * from './types';
|
|
5
|
+
|
|
6
|
+
// Default export for convenience
|
|
7
|
+
export { HybridBrowserToolkit as default } from './hybrid-browser-toolkit';
|