atomic-agents 2.7.4__tar.gz → 2.7.5__tar.gz
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.
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/PKG-INFO +9 -5
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/README.md +7 -3
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-agents/atomic_agents/agents/atomic_agent.py +49 -6
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-agents/atomic_agents/context/chat_history.py +1 -1
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-agents/tests/agents/test_atomic_agent.py +114 -2
- atomic_agents-2.7.5/atomic-agents/tests/agents/test_minimax_integration.py +79 -0
- atomic_agents-2.7.5/atomic-agents/tests/agents/test_minimax_provider.py +197 -0
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-agents/tests/context/test_chat_history.py +14 -14
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-examples/basic-multimodal/pyproject.toml +1 -4
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-examples/basic-pdf-analysis/basic_pdf_analysis/main.py +1 -1
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-examples/basic-pdf-analysis/pyproject.toml +1 -3
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-examples/fastapi-memory/pyproject.toml +1 -1
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-examples/hooks-example/pyproject.toml +1 -1
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-examples/mcp-agent/example-client/example_client/main_http.py +3 -3
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-examples/mcp-agent/example-client/example_client/main_sse.py +3 -3
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-examples/mcp-agent/example-client/example_client/main_stdio.py +3 -3
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-examples/mcp-agent/example-client/example_client/main_stdio_async.py +3 -3
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-examples/nested-multimodal/pyproject.toml +1 -1
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-examples/orchestration-agent/orchestration_agent/orchestrator.py +1 -1
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-examples/orchestration-agent/pyproject.toml +1 -1
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-examples/progressive-disclosure/progressive_disclosure/agents/orchestrator_agent.py +3 -3
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-examples/progressive-disclosure/pyproject.toml +1 -1
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-examples/quickstart/pyproject.toml +1 -4
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-examples/quickstart/quickstart/4_basic_chatbot_different_providers.py +25 -14
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-examples/web-search-agent/pyproject.toml +1 -1
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-examples/youtube-summarizer/pyproject.toml +1 -1
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-examples/youtube-to-recipe/pyproject.toml +1 -1
- atomic_agents-2.7.5/atomic-forge/atomic_tools/tavily_search/pyproject.toml +16 -0
- atomic_agents-2.7.5/atomic-forge/atomic_tools/tavily_search/requirements.txt +2 -0
- atomic_agents-2.7.5/atomic-forge/atomic_tools/tavily_search/tests/test_tavily_search.py +136 -0
- atomic_agents-2.7.5/atomic-forge/atomic_tools/tavily_search/tool/__init__.py +13 -0
- atomic_agents-2.7.5/atomic-forge/atomic_tools/tavily_search/tool/tavily_search.py +183 -0
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-forge/tools/tavily_search/tool/tavily_search.py +6 -4
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/docs/guides/cookbook.md +1 -1
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/docs/guides/faq.md +6 -6
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/docs/index.md +6 -2
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/pyproject.toml +2 -2
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/requirements.txt +1 -1
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/uv.lock +44 -101
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/.assets/architecture_highlevel_overview.png +0 -0
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/.assets/atomic-cli-tool-menu.png +0 -0
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/.assets/atomic-cli.png +0 -0
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/.assets/docs.png +0 -0
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/.assets/logo.png +0 -0
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/.assets/video-thumbnail-1.png +0 -0
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/.assets/video-thumbnail-2.png +0 -0
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/.assets/video-thumbnail.png +0 -0
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/.assets/what_is_sent_in_prompt.png +0 -0
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/.assets/whats-new-v2-thumbnail.png +0 -0
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/.claude/skills/release/SKILL.md +0 -0
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/.claude-plugin/marketplace.json +0 -0
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/.coveragerc +0 -0
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/.flake8 +0 -0
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/.github/funding.yml +0 -0
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/.github/workflows/code-quality.yml +0 -0
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/.github/workflows/docs.yml +0 -0
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/.gitignore +0 -0
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/.pre-commit-config.yaml +0 -0
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/LICENSE +0 -0
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/UPGRADE_DOC.md +0 -0
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/agents.md +0 -0
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-agents/LICENSE +0 -0
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-agents/MANIFEST.in +0 -0
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-agents/atomic_agents/__init__.py +0 -0
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-agents/atomic_agents/agents/__init__.py +0 -0
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-agents/atomic_agents/base/__init__.py +0 -0
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-agents/atomic_agents/base/base_io_schema.py +0 -0
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-agents/atomic_agents/base/base_prompt.py +0 -0
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-agents/atomic_agents/base/base_resource.py +0 -0
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-agents/atomic_agents/base/base_tool.py +0 -0
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-agents/atomic_agents/connectors/__init__.py +0 -0
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-agents/atomic_agents/connectors/mcp/__init__.py +0 -0
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-agents/atomic_agents/connectors/mcp/mcp_definition_service.py +0 -0
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-agents/atomic_agents/connectors/mcp/mcp_factory.py +0 -0
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-agents/atomic_agents/connectors/mcp/schema_transformer.py +0 -0
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-agents/atomic_agents/context/__init__.py +0 -0
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-agents/atomic_agents/context/system_prompt_generator.py +0 -0
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-agents/atomic_agents/utils/__init__.py +0 -0
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-agents/atomic_agents/utils/format_tool_message.py +0 -0
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-agents/atomic_agents/utils/token_counter.py +0 -0
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-agents/tests/base/test_base_tool.py +0 -0
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-agents/tests/connectors/mcp/test_mcp_definition_service.py +0 -0
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-agents/tests/connectors/mcp/test_mcp_factory.py +0 -0
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-agents/tests/connectors/mcp/test_schema_transformer.py +0 -0
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-agents/tests/context/test_system_prompt_generator.py +0 -0
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-agents/tests/files/audio_sample.mp3 +0 -0
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-agents/tests/files/image_sample.jpg +0 -0
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-agents/tests/files/pdf_sample.pdf +0 -0
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-agents/tests/utils/test_format_tool_message.py +0 -0
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-agents/tests/utils/test_token_counter.py +0 -0
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-assembler/README.md +0 -0
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-assembler/atomic_assembler/__init__.py +0 -0
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-assembler/atomic_assembler/app.py +0 -0
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-assembler/atomic_assembler/color_utils.py +0 -0
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-assembler/atomic_assembler/constants.py +0 -0
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-assembler/atomic_assembler/main.py +0 -0
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-assembler/atomic_assembler/screens/atomic_tool_explorer.py +0 -0
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-assembler/atomic_assembler/screens/file_explorer.py +0 -0
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-assembler/atomic_assembler/screens/main_menu.py +0 -0
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-assembler/atomic_assembler/screens/tool_info_screen.py +0 -0
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-assembler/atomic_assembler/utils.py +0 -0
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-assembler/atomic_assembler/widgets/confirmation_modal.py +0 -0
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-assembler/atomic_assembler/widgets/generic_list.py +0 -0
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-assembler/atomic_assembler/widgets/gradient_title.py +0 -0
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-assembler/atomic_assembler/widgets/icon_selection_list.py +0 -0
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-assembler/atomic_assembler/widgets/menu.py +0 -0
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-assembler/atomic_assembler/widgets/new_item_input.py +0 -0
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-assembler/atomic_assembler/widgets/tool_info_display.py +0 -0
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-examples/basic-multimodal/README.md +0 -0
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-examples/basic-multimodal/basic_multimodal/main.py +0 -0
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-examples/basic-multimodal/test_images/nutrition_label_1.png +0 -0
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-examples/basic-multimodal/test_images/nutrition_label_2.jpg +0 -0
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-examples/basic-pdf-analysis/README.md +0 -0
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-examples/basic-pdf-analysis/test_media/pdf_sample.pdf +0 -0
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-examples/deep-research/README.md +0 -0
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-examples/deep-research/deep_research/agents/choice_agent.py +0 -0
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-examples/deep-research/deep_research/agents/qa_agent.py +0 -0
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-examples/deep-research/deep_research/agents/query_agent.py +0 -0
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-examples/deep-research/deep_research/config.py +0 -0
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-examples/deep-research/deep_research/context_providers.py +0 -0
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-examples/deep-research/deep_research/main.py +0 -0
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-examples/deep-research/deep_research/tools/searxng_search.py +0 -0
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-examples/deep-research/deep_research/tools/webpage_scraper.py +0 -0
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-examples/deep-research/mermaid.md +0 -0
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-examples/deep-research/pyproject.toml +0 -0
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-examples/dspy-integration/README.md +0 -0
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-examples/dspy-integration/dspy_integration/__init__.py +0 -0
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-examples/dspy-integration/dspy_integration/bridge.py +0 -0
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-examples/dspy-integration/dspy_integration/domain/__init__.py +0 -0
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-examples/dspy-integration/dspy_integration/domain/datasets.py +0 -0
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-examples/dspy-integration/dspy_integration/domain/evaluation.py +0 -0
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-examples/dspy-integration/dspy_integration/domain/models.py +0 -0
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-examples/dspy-integration/dspy_integration/main.py +0 -0
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-examples/dspy-integration/dspy_integration/presentation/__init__.py +0 -0
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-examples/dspy-integration/dspy_integration/presentation/console.py +0 -0
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-examples/dspy-integration/dspy_integration/schemas.py +0 -0
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-examples/dspy-integration/dspy_integration/stages/__init__.py +0 -0
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-examples/dspy-integration/dspy_integration/stages/stage1_dspy.py +0 -0
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-examples/dspy-integration/dspy_integration/stages/stage2_atomic.py +0 -0
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-examples/dspy-integration/dspy_integration/stages/stage3_combined.py +0 -0
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-examples/dspy-integration/pyproject.toml +0 -0
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-examples/fastapi-memory/README.md +0 -0
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-examples/fastapi-memory/fastapi_memory/__init__.py +0 -0
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-examples/fastapi-memory/fastapi_memory/client.py +0 -0
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-examples/fastapi-memory/fastapi_memory/lib/__init__.py +0 -0
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-examples/fastapi-memory/fastapi_memory/lib/agents/__init__.py +0 -0
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-examples/fastapi-memory/fastapi_memory/lib/agents/chat_agent.py +0 -0
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-examples/fastapi-memory/fastapi_memory/lib/config.py +0 -0
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-examples/fastapi-memory/fastapi_memory/lib/schemas.py +0 -0
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-examples/fastapi-memory/fastapi_memory/main.py +0 -0
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-examples/fastapi-memory/test_api.py +0 -0
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-examples/hooks-example/README.md +0 -0
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-examples/hooks-example/hooks_example/main.py +0 -0
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-examples/mcp-agent/README.md +0 -0
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-examples/mcp-agent/example-client/example_client/main.py +0 -0
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-examples/mcp-agent/example-client/example_client/main_fastapi.py +0 -0
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-examples/mcp-agent/example-client/pyproject.toml +0 -0
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-examples/mcp-agent/example-mcp-server/README.md +0 -0
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-examples/mcp-agent/example-mcp-server/demo_tools.py +0 -0
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-examples/mcp-agent/example-mcp-server/example_mcp_server/__init__.py +0 -0
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-examples/mcp-agent/example-mcp-server/example_mcp_server/interfaces/__init__.py +0 -0
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-examples/mcp-agent/example-mcp-server/example_mcp_server/interfaces/prompt.py +0 -0
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-examples/mcp-agent/example-mcp-server/example_mcp_server/interfaces/resource.py +0 -0
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-examples/mcp-agent/example-mcp-server/example_mcp_server/interfaces/tool.py +0 -0
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-examples/mcp-agent/example-mcp-server/example_mcp_server/prompts/sample_prompts.py +0 -0
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-examples/mcp-agent/example-mcp-server/example_mcp_server/resources/__init__.py +0 -0
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-examples/mcp-agent/example-mcp-server/example_mcp_server/resources/sample_resources.py +0 -0
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-examples/mcp-agent/example-mcp-server/example_mcp_server/server.py +0 -0
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-examples/mcp-agent/example-mcp-server/example_mcp_server/server_http.py +0 -0
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-examples/mcp-agent/example-mcp-server/example_mcp_server/server_sse.py +0 -0
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-examples/mcp-agent/example-mcp-server/example_mcp_server/server_stdio.py +0 -0
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-examples/mcp-agent/example-mcp-server/example_mcp_server/services/__init__.py +0 -0
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-examples/mcp-agent/example-mcp-server/example_mcp_server/services/prompt_service.py +0 -0
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-examples/mcp-agent/example-mcp-server/example_mcp_server/services/resource_service.py +0 -0
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-examples/mcp-agent/example-mcp-server/example_mcp_server/services/tool_service.py +0 -0
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-examples/mcp-agent/example-mcp-server/example_mcp_server/tools/__init__.py +0 -0
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-examples/mcp-agent/example-mcp-server/example_mcp_server/tools/add_numbers.py +0 -0
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-examples/mcp-agent/example-mcp-server/example_mcp_server/tools/batch_operations.py +0 -0
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-examples/mcp-agent/example-mcp-server/example_mcp_server/tools/divide_numbers.py +0 -0
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-examples/mcp-agent/example-mcp-server/example_mcp_server/tools/multiply_numbers.py +0 -0
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-examples/mcp-agent/example-mcp-server/example_mcp_server/tools/subtract_numbers.py +0 -0
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-examples/mcp-agent/example-mcp-server/pyproject.toml +0 -0
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-examples/nested-multimodal/README.md +0 -0
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-examples/nested-multimodal/nested_multimodal/main.py +0 -0
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-examples/nested-multimodal/test_images/nutrition_label_1.png +0 -0
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-examples/orchestration-agent/README.md +0 -0
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-examples/orchestration-agent/orchestration_agent/tools/calculator.py +0 -0
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-examples/orchestration-agent/orchestration_agent/tools/searxng_search.py +0 -0
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-examples/progressive-disclosure/README.md +0 -0
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-examples/progressive-disclosure/progressive_disclosure/__init__.py +0 -0
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-examples/progressive-disclosure/progressive_disclosure/agents/__init__.py +0 -0
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-examples/progressive-disclosure/progressive_disclosure/agents/tool_finder_agent.py +0 -0
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-examples/progressive-disclosure/progressive_disclosure/main.py +0 -0
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-examples/progressive-disclosure/progressive_disclosure/registry/__init__.py +0 -0
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-examples/progressive-disclosure/progressive_disclosure/registry/tool_registry.py +0 -0
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-examples/progressive-disclosure/progressive_disclosure/tools/__init__.py +0 -0
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-examples/progressive-disclosure/progressive_disclosure/tools/search_tools.py +0 -0
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-examples/progressive-disclosure/servers/data_server/data_server/__init__.py +0 -0
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-examples/progressive-disclosure/servers/data_server/data_server/server.py +0 -0
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-examples/progressive-disclosure/servers/data_server/pyproject.toml +0 -0
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-examples/progressive-disclosure/servers/math_server/math_server/__init__.py +0 -0
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-examples/progressive-disclosure/servers/math_server/math_server/server.py +0 -0
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-examples/progressive-disclosure/servers/math_server/pyproject.toml +0 -0
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-examples/progressive-disclosure/servers/text_server/pyproject.toml +0 -0
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-examples/progressive-disclosure/servers/text_server/text_server/__init__.py +0 -0
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-examples/progressive-disclosure/servers/text_server/text_server/server.py +0 -0
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-examples/quickstart/README.md +0 -0
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-examples/quickstart/quickstart/1_0_basic_chatbot.py +0 -0
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-examples/quickstart/quickstart/1_1_basic_chatbot_streaming.py +0 -0
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-examples/quickstart/quickstart/1_2_basic_chatbot_async_streaming.py +0 -0
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-examples/quickstart/quickstart/2_basic_custom_chatbot.py +0 -0
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-examples/quickstart/quickstart/3_0_basic_custom_chatbot_with_custom_schema.py +0 -0
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-examples/quickstart/quickstart/3_1_basic_custom_chatbot_with_custom_schema_streaming.py +0 -0
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-examples/quickstart/quickstart/5_custom_system_role_for_reasoning_models.py +0 -0
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-examples/quickstart/quickstart/6_0_asynchronous_processing.py +0 -0
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-examples/quickstart/quickstart/6_1_asynchronous_processing_streaming.py +0 -0
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-examples/rag-chatbot/.gitignore +0 -0
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-examples/rag-chatbot/README.md +0 -0
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-examples/rag-chatbot/pyproject.toml +0 -0
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-examples/rag-chatbot/rag_chatbot/agents/qa_agent.py +0 -0
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-examples/rag-chatbot/rag_chatbot/agents/query_agent.py +0 -0
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-examples/rag-chatbot/rag_chatbot/config.py +0 -0
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-examples/rag-chatbot/rag_chatbot/context_providers.py +0 -0
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-examples/rag-chatbot/rag_chatbot/main.py +0 -0
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-examples/rag-chatbot/rag_chatbot/services/__init__.py +0 -0
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-examples/rag-chatbot/rag_chatbot/services/base.py +0 -0
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-examples/rag-chatbot/rag_chatbot/services/chroma_db.py +0 -0
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-examples/rag-chatbot/rag_chatbot/services/factory.py +0 -0
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-examples/rag-chatbot/rag_chatbot/services/qdrant_db.py +0 -0
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-examples/web-search-agent/README.md +0 -0
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-examples/web-search-agent/web_search_agent/agents/query_agent.py +0 -0
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-examples/web-search-agent/web_search_agent/agents/question_answering_agent.py +0 -0
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-examples/web-search-agent/web_search_agent/main.py +0 -0
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-examples/web-search-agent/web_search_agent/tools/searxng_search.py +0 -0
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-examples/youtube-summarizer/README.md +0 -0
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-examples/youtube-summarizer/youtube_summarizer/agent.py +0 -0
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-examples/youtube-summarizer/youtube_summarizer/main.py +0 -0
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-examples/youtube-summarizer/youtube_summarizer/tools/youtube_transcript_scraper.py +0 -0
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-examples/youtube-to-recipe/README.md +0 -0
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-examples/youtube-to-recipe/youtube_to_recipe/agent.py +0 -0
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-examples/youtube-to-recipe/youtube_to_recipe/main.py +0 -0
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-examples/youtube-to-recipe/youtube_to_recipe/tools/youtube_transcript_scraper.py +0 -0
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-forge/README.md +0 -0
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-forge/guides/tool_structure.md +0 -0
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-forge/tools/bocha_search/.coveragerc +0 -0
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-forge/tools/bocha_search/README.md +0 -0
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-forge/tools/bocha_search/pyproject.toml +0 -0
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-forge/tools/bocha_search/requirements.txt +0 -0
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-forge/tools/bocha_search/tests/test_bocha_search.py +0 -0
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-forge/tools/bocha_search/tool/bocha_search.py +0 -0
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-forge/tools/calculator/.coveragerc +0 -0
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-forge/tools/calculator/README.md +0 -0
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-forge/tools/calculator/pyproject.toml +0 -0
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-forge/tools/calculator/requirements.txt +0 -0
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-forge/tools/calculator/tests/test_calculator.py +0 -0
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-forge/tools/calculator/tool/calculator.py +0 -0
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-forge/tools/searxng_search/.coveragerc +0 -0
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-forge/tools/searxng_search/README.md +0 -0
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-forge/tools/searxng_search/pyproject.toml +0 -0
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-forge/tools/searxng_search/pytest.ini +0 -0
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-forge/tools/searxng_search/requirements.txt +0 -0
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-forge/tools/searxng_search/tests/test_searxng_search.py +0 -0
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-forge/tools/searxng_search/tool/searxng_search.py +0 -0
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-forge/tools/tavily_search/.coveragerc +0 -0
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-forge/tools/tavily_search/README.md +0 -0
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-forge/tools/tavily_search/pyproject.toml +0 -0
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-forge/tools/tavily_search/requirements.txt +0 -0
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-forge/tools/tavily_search/tests/test_tavily_seach.py +0 -0
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-forge/tools/webpage_scraper/README.md +0 -0
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-forge/tools/webpage_scraper/pyproject.toml +0 -0
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-forge/tools/webpage_scraper/requirements.txt +0 -0
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-forge/tools/webpage_scraper/tests/conftest.py +0 -0
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-forge/tools/webpage_scraper/tests/test_webpage_scraper.py +0 -0
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-forge/tools/webpage_scraper/tool/webpage_scraper.py +0 -0
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-forge/tools/youtube_transcript_scraper/.coveragerc +0 -0
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-forge/tools/youtube_transcript_scraper/README.md +0 -0
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-forge/tools/youtube_transcript_scraper/pyproject.toml +0 -0
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-forge/tools/youtube_transcript_scraper/requirements.txt +0 -0
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-forge/tools/youtube_transcript_scraper/tests/test_youtube_transcript_scraper.py +0 -0
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-forge/tools/youtube_transcript_scraper/tool/youtube_transcript_scraper.py +0 -0
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/build_and_deploy.ps1 +0 -0
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/claude-plugin/atomic-agents/.claude-plugin/plugin.json +0 -0
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/claude-plugin/atomic-agents/CHANGELOG.md +0 -0
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/claude-plugin/atomic-agents/LICENSE +0 -0
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/claude-plugin/atomic-agents/README.md +0 -0
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/claude-plugin/atomic-agents/agents/atomic-architect.md +0 -0
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/claude-plugin/atomic-agents/agents/atomic-explorer.md +0 -0
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/claude-plugin/atomic-agents/agents/atomic-reviewer.md +0 -0
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/claude-plugin/atomic-agents/agents/schema-designer.md +0 -0
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/claude-plugin/atomic-agents/commands/atomic-agent.md +0 -0
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/claude-plugin/atomic-agents/commands/atomic-create.md +0 -0
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/claude-plugin/atomic-agents/commands/atomic-tool.md +0 -0
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/claude-plugin/atomic-agents/skills/atomic-agents/SKILL.md +0 -0
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/claude-plugin/atomic-agents/skills/atomic-agents/examples/basic-agent.py +0 -0
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/claude-plugin/atomic-agents/skills/atomic-context/SKILL.md +0 -0
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/claude-plugin/atomic-agents/skills/atomic-context/examples/rag-context.py +0 -0
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/claude-plugin/atomic-agents/skills/atomic-prompts/SKILL.md +0 -0
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/claude-plugin/atomic-agents/skills/atomic-schemas/SKILL.md +0 -0
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/claude-plugin/atomic-agents/skills/atomic-schemas/examples/common-schemas.py +0 -0
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/claude-plugin/atomic-agents/skills/atomic-structure/SKILL.md +0 -0
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/claude-plugin/atomic-agents/skills/atomic-tools/SKILL.md +0 -0
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/claude-plugin/atomic-agents/skills/atomic-tools/examples/api-tool.py +0 -0
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/docs/.nojekyll +0 -0
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/docs/Makefile +0 -0
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/docs/_static/logo.png +0 -0
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/docs/api/agents.md +0 -0
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/docs/api/context.md +0 -0
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/docs/api/index.md +0 -0
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/docs/api/utils.md +0 -0
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/docs/conf.py +0 -0
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/docs/contributing.md +0 -0
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/docs/examples/index.md +0 -0
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/docs/examples/mcp_agent.md +0 -0
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/docs/guides/deployment.md +0 -0
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/docs/guides/error-handling.md +0 -0
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/docs/guides/hooks.md +0 -0
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/docs/guides/index.md +0 -0
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/docs/guides/logging.md +0 -0
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/docs/guides/memory.md +0 -0
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/docs/guides/orchestration.md +0 -0
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/docs/guides/performance.md +0 -0
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/docs/guides/quickstart.md +0 -0
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/docs/guides/security.md +0 -0
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/docs/guides/testing.md +0 -0
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/docs/guides/tools.md +0 -0
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/docs/make.bat +0 -0
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/greptile.json +0 -0
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/guides/DEV_GUIDE.md +0 -0
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/pytest.ini +0 -0
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/scripts/generate_llms_files.py +0 -0
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/scripts/sync_version.py +0 -0
- {atomic_agents-2.7.4 → atomic_agents-2.7.5}/setup.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: atomic-agents
|
|
3
|
-
Version: 2.7.
|
|
3
|
+
Version: 2.7.5
|
|
4
4
|
Summary: A versatile framework for creating and managing intelligent agents.
|
|
5
5
|
Project-URL: Homepage, https://github.com/BrainBlend-AI/atomic-agents
|
|
6
6
|
Project-URL: Repository, https://github.com/BrainBlend-AI/atomic-agents
|
|
@@ -18,7 +18,7 @@ Classifier: Topic :: Scientific/Engineering :: Artificial Intelligence
|
|
|
18
18
|
Classifier: Topic :: Software Development :: Libraries :: Python Modules
|
|
19
19
|
Requires-Python: >=3.12
|
|
20
20
|
Requires-Dist: gitpython<4.0.0,>=3.1.43
|
|
21
|
-
Requires-Dist: instructor==1.
|
|
21
|
+
Requires-Dist: instructor==1.14.5
|
|
22
22
|
Requires-Dist: litellm<2.0.0,>=1.50.0
|
|
23
23
|
Requires-Dist: mcp[cli]>=1.6.0
|
|
24
24
|
Requires-Dist: pydantic<3.0.0,>=2.11.0
|
|
@@ -96,12 +96,16 @@ To install Atomic Agents, you can use pip:
|
|
|
96
96
|
pip install atomic-agents
|
|
97
97
|
```
|
|
98
98
|
|
|
99
|
-
Make sure you also install the provider you want to use.
|
|
99
|
+
Make sure you also install the provider you want to use. Provider SDKs are available as instructor extras:
|
|
100
100
|
|
|
101
101
|
```bash
|
|
102
|
-
pip install
|
|
102
|
+
pip install instructor[groq] # for Groq
|
|
103
|
+
pip install instructor[anthropic] # for Anthropic
|
|
104
|
+
pip install instructor[google-genai] # for Gemini
|
|
103
105
|
```
|
|
104
106
|
|
|
107
|
+
OpenAI is included by default. For a full list of supported providers, see the [Instructor docs](https://python.useinstructor.com/integrations/).
|
|
108
|
+
|
|
105
109
|
This also installs the CLI *Atomic Assembler*, which can be used to download Tools (and soon also Agents and Pipelines).
|
|
106
110
|
|
|
107
111
|
### Quick Example
|
|
@@ -404,7 +408,7 @@ uv sync --all-packages
|
|
|
404
408
|
|
|
405
409
|
## Provider & Model Compatibility
|
|
406
410
|
|
|
407
|
-
Atomic Agents depends on the [Instructor](https://github.com/jxnl/instructor) package. This means that in all examples where OpenAI is used, any other API supported by Instructor can also be used—such as Ollama, Groq, Mistral, Cohere, Anthropic, Gemini, and more. For a complete list, please refer to the Instructor documentation on its [GitHub page](https://github.com/jxnl/instructor).
|
|
411
|
+
Atomic Agents depends on the [Instructor](https://github.com/jxnl/instructor) package. This means that in all examples where OpenAI is used, any other API supported by Instructor can also be used—such as Ollama, Groq, Mistral, Cohere, Anthropic, Gemini, [MiniMax](https://www.minimax.io/), and more. For a complete list, please refer to the Instructor documentation on its [GitHub page](https://github.com/jxnl/instructor).
|
|
408
412
|
|
|
409
413
|
## Contributing
|
|
410
414
|
|
|
@@ -65,12 +65,16 @@ To install Atomic Agents, you can use pip:
|
|
|
65
65
|
pip install atomic-agents
|
|
66
66
|
```
|
|
67
67
|
|
|
68
|
-
Make sure you also install the provider you want to use.
|
|
68
|
+
Make sure you also install the provider you want to use. Provider SDKs are available as instructor extras:
|
|
69
69
|
|
|
70
70
|
```bash
|
|
71
|
-
pip install
|
|
71
|
+
pip install instructor[groq] # for Groq
|
|
72
|
+
pip install instructor[anthropic] # for Anthropic
|
|
73
|
+
pip install instructor[google-genai] # for Gemini
|
|
72
74
|
```
|
|
73
75
|
|
|
76
|
+
OpenAI is included by default. For a full list of supported providers, see the [Instructor docs](https://python.useinstructor.com/integrations/).
|
|
77
|
+
|
|
74
78
|
This also installs the CLI *Atomic Assembler*, which can be used to download Tools (and soon also Agents and Pipelines).
|
|
75
79
|
|
|
76
80
|
### Quick Example
|
|
@@ -373,7 +377,7 @@ uv sync --all-packages
|
|
|
373
377
|
|
|
374
378
|
## Provider & Model Compatibility
|
|
375
379
|
|
|
376
|
-
Atomic Agents depends on the [Instructor](https://github.com/jxnl/instructor) package. This means that in all examples where OpenAI is used, any other API supported by Instructor can also be used—such as Ollama, Groq, Mistral, Cohere, Anthropic, Gemini, and more. For a complete list, please refer to the Instructor documentation on its [GitHub page](https://github.com/jxnl/instructor).
|
|
380
|
+
Atomic Agents depends on the [Instructor](https://github.com/jxnl/instructor) package. This means that in all examples where OpenAI is used, any other API supported by Instructor can also be used—such as Ollama, Groq, Mistral, Cohere, Anthropic, Gemini, [MiniMax](https://www.minimax.io/), and more. For a complete list, please refer to the Instructor documentation on its [GitHub page](https://github.com/jxnl/instructor).
|
|
377
381
|
|
|
378
382
|
## Contributing
|
|
379
383
|
|
{atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-agents/atomic_agents/agents/atomic_agent.py
RENAMED
|
@@ -63,7 +63,7 @@ class BasicChatOutputSchema(BaseIOSchema):
|
|
|
63
63
|
|
|
64
64
|
|
|
65
65
|
class AgentConfig(BaseModel):
|
|
66
|
-
client: instructor.client.Instructor = Field(..., description="Client for interacting with the language model.")
|
|
66
|
+
client: instructor.core.client.Instructor = Field(..., description="Client for interacting with the language model.")
|
|
67
67
|
model: str = Field(default="gpt-5-mini", description="The model to use for generating responses.")
|
|
68
68
|
history: Optional[ChatHistory] = Field(default=None, description="History component for storing chat history.")
|
|
69
69
|
system_prompt_generator: Optional[SystemPromptGenerator] = Field(
|
|
@@ -76,6 +76,14 @@ class AgentConfig(BaseModel):
|
|
|
76
76
|
default="assistant",
|
|
77
77
|
description="The role of the assistant in the conversation. Use 'model' for Gemini, 'assistant' for OpenAI/Anthropic.",
|
|
78
78
|
)
|
|
79
|
+
tool_result_role: Optional[str] = Field(
|
|
80
|
+
default=None,
|
|
81
|
+
description=(
|
|
82
|
+
"The role to use for mid-conversation tool results and context injections. "
|
|
83
|
+
"Defaults to 'user' when assistant_role is 'model' (Gemini), otherwise 'system'. "
|
|
84
|
+
"Set explicitly to override auto-detection."
|
|
85
|
+
),
|
|
86
|
+
)
|
|
79
87
|
model_config = {"arbitrary_types_allowed": True}
|
|
80
88
|
mode: Mode = Field(default=Mode.TOOLS, description="The Instructor mode used for structured outputs (TOOLS, JSON, etc.).")
|
|
81
89
|
model_api_parameters: Optional[dict] = Field(None, description="Additional parameters passed to the API provider.")
|
|
@@ -170,6 +178,12 @@ class AtomicAgent[InputSchema: BaseIOSchema, OutputSchema: BaseIOSchema]:
|
|
|
170
178
|
self.system_prompt_generator = config.system_prompt_generator or SystemPromptGenerator()
|
|
171
179
|
self.system_role = config.system_role
|
|
172
180
|
self.assistant_role = config.assistant_role
|
|
181
|
+
if config.tool_result_role is not None:
|
|
182
|
+
self.tool_result_role = config.tool_result_role
|
|
183
|
+
else:
|
|
184
|
+
# Auto-detect: Gemini drops mid-conversation "system" messages,
|
|
185
|
+
# so default to "user" for Gemini backends (identified by assistant_role="model")
|
|
186
|
+
self.tool_result_role = "user" if config.assistant_role == "model" else "system"
|
|
173
187
|
self.initial_history = self.history.copy()
|
|
174
188
|
self.current_user_input = None
|
|
175
189
|
self.mode = config.mode
|
|
@@ -185,6 +199,21 @@ class AtomicAgent[InputSchema: BaseIOSchema, OutputSchema: BaseIOSchema]:
|
|
|
185
199
|
"""
|
|
186
200
|
self.history = self.initial_history.copy()
|
|
187
201
|
|
|
202
|
+
def add_tool_result(self, content: BaseIOSchema) -> None:
|
|
203
|
+
"""
|
|
204
|
+
Adds a tool result or context injection to the chat history using the
|
|
205
|
+
backend-appropriate role.
|
|
206
|
+
|
|
207
|
+
This method should be used instead of ``history.add_message("system", ...)``
|
|
208
|
+
when injecting tool execution results, resource contents, or other mid-conversation
|
|
209
|
+
context into the agent's history. It automatically uses the correct role for the
|
|
210
|
+
configured backend (e.g. ``"user"`` for Gemini, ``"system"`` for OpenAI/Anthropic).
|
|
211
|
+
|
|
212
|
+
Args:
|
|
213
|
+
content (BaseIOSchema): The tool result or context to inject.
|
|
214
|
+
"""
|
|
215
|
+
self.history.add_message(self.tool_result_role, content)
|
|
216
|
+
|
|
188
217
|
@property
|
|
189
218
|
def input_schema(self) -> Type[BaseIOSchema]:
|
|
190
219
|
"""
|
|
@@ -247,7 +276,21 @@ class AtomicAgent[InputSchema: BaseIOSchema, OutputSchema: BaseIOSchema]:
|
|
|
247
276
|
|
|
248
277
|
def _prepare_messages(self):
|
|
249
278
|
self.messages = self._build_system_messages()
|
|
250
|
-
|
|
279
|
+
history = self.history.get_history()
|
|
280
|
+
# Remap "system" role messages in history when the backend doesn't support
|
|
281
|
+
# mid-conversation system messages (e.g. Gemini). The initial system prompt
|
|
282
|
+
# is built separately via _build_system_messages() and is unaffected.
|
|
283
|
+
if self.tool_result_role != "system":
|
|
284
|
+
logger = logging.getLogger(__name__)
|
|
285
|
+
for msg in history:
|
|
286
|
+
if msg["role"] == "system":
|
|
287
|
+
logger.debug(
|
|
288
|
+
"Remapping mid-conversation 'system' message to '%s' "
|
|
289
|
+
"(backend does not support mid-conversation system messages).",
|
|
290
|
+
self.tool_result_role,
|
|
291
|
+
)
|
|
292
|
+
msg["role"] = self.tool_result_role
|
|
293
|
+
self.messages += history
|
|
251
294
|
|
|
252
295
|
def _get_completion_kwargs(self) -> Dict[str, Any]:
|
|
253
296
|
"""
|
|
@@ -444,7 +487,7 @@ class AtomicAgent[InputSchema: BaseIOSchema, OutputSchema: BaseIOSchema]:
|
|
|
444
487
|
OutputSchema: The response from the chat agent.
|
|
445
488
|
"""
|
|
446
489
|
assert not isinstance(
|
|
447
|
-
self.client, instructor.client.AsyncInstructor
|
|
490
|
+
self.client, instructor.core.client.AsyncInstructor
|
|
448
491
|
), "The run method is not supported for async clients. Use run_async instead."
|
|
449
492
|
if user_input:
|
|
450
493
|
self.history.initialize_turn()
|
|
@@ -477,7 +520,7 @@ class AtomicAgent[InputSchema: BaseIOSchema, OutputSchema: BaseIOSchema]:
|
|
|
477
520
|
OutputSchema: The final response from the chat agent.
|
|
478
521
|
"""
|
|
479
522
|
assert not isinstance(
|
|
480
|
-
self.client, instructor.client.AsyncInstructor
|
|
523
|
+
self.client, instructor.core.client.AsyncInstructor
|
|
481
524
|
), "The run_stream method is not supported for async clients. Use run_async instead."
|
|
482
525
|
if user_input:
|
|
483
526
|
self.history.initialize_turn()
|
|
@@ -519,7 +562,7 @@ class AtomicAgent[InputSchema: BaseIOSchema, OutputSchema: BaseIOSchema]:
|
|
|
519
562
|
NotAsyncIterableError: If used as an async generator (in an async for loop).
|
|
520
563
|
Use run_async_stream() method instead for streaming responses.
|
|
521
564
|
"""
|
|
522
|
-
assert isinstance(self.client, instructor.client.AsyncInstructor), "The run_async method is for async clients."
|
|
565
|
+
assert isinstance(self.client, instructor.core.client.AsyncInstructor), "The run_async method is for async clients."
|
|
523
566
|
if user_input:
|
|
524
567
|
self.history.initialize_turn()
|
|
525
568
|
self.current_user_input = user_input
|
|
@@ -545,7 +588,7 @@ class AtomicAgent[InputSchema: BaseIOSchema, OutputSchema: BaseIOSchema]:
|
|
|
545
588
|
Yields:
|
|
546
589
|
OutputSchema: Partial responses from the chat agent.
|
|
547
590
|
"""
|
|
548
|
-
assert isinstance(self.client, instructor.client.AsyncInstructor), "The run_async method is for async clients."
|
|
591
|
+
assert isinstance(self.client, instructor.core.client.AsyncInstructor), "The run_async method is for async clients."
|
|
549
592
|
if user_input:
|
|
550
593
|
self.history.initialize_turn()
|
|
551
594
|
self.current_user_input = user_input
|
{atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-agents/atomic_agents/context/chat_history.py
RENAMED
|
@@ -4,7 +4,7 @@ from enum import Enum
|
|
|
4
4
|
from pathlib import Path
|
|
5
5
|
from typing import Dict, List, Optional, Type
|
|
6
6
|
|
|
7
|
-
from instructor.multimodal import PDF, Image, Audio
|
|
7
|
+
from instructor.processing.multimodal import PDF, Image, Audio
|
|
8
8
|
from pydantic import BaseModel, Field
|
|
9
9
|
|
|
10
10
|
from atomic_agents.base.base_io_schema import BaseIOSchema
|
|
@@ -35,8 +35,8 @@ def mock_instructor():
|
|
|
35
35
|
|
|
36
36
|
@pytest.fixture
|
|
37
37
|
def mock_instructor_async():
|
|
38
|
-
# Changed spec from instructor.Instructor to instructor.client.AsyncInstructor
|
|
39
|
-
mock = Mock(spec=instructor.client.AsyncInstructor)
|
|
38
|
+
# Changed spec from instructor.Instructor to instructor.core.client.AsyncInstructor
|
|
39
|
+
mock = Mock(spec=instructor.core.client.AsyncInstructor)
|
|
40
40
|
|
|
41
41
|
# Configure chat.completions structure
|
|
42
42
|
mock.chat = Mock()
|
|
@@ -1087,3 +1087,115 @@ def test_get_context_token_count_multimodal_content(mock_get_token_counter, mock
|
|
|
1087
1087
|
image_entry = next(item for item in content if item.get("type") == "image_url")
|
|
1088
1088
|
assert "image_url" in image_entry
|
|
1089
1089
|
assert image_entry["image_url"]["url"] == "https://example.com/test.png"
|
|
1090
|
+
|
|
1091
|
+
|
|
1092
|
+
# --- Tests for tool_result_role and Gemini system message remapping (issue #221) ---
|
|
1093
|
+
|
|
1094
|
+
|
|
1095
|
+
def test_tool_result_role_defaults_to_system_for_openai(mock_instructor, mock_system_prompt_generator):
|
|
1096
|
+
config = AgentConfig(
|
|
1097
|
+
client=mock_instructor,
|
|
1098
|
+
model="gpt-5-mini",
|
|
1099
|
+
system_prompt_generator=mock_system_prompt_generator,
|
|
1100
|
+
assistant_role="assistant",
|
|
1101
|
+
)
|
|
1102
|
+
agent = AtomicAgent[BasicChatInputSchema, BasicChatOutputSchema](config)
|
|
1103
|
+
assert agent.tool_result_role == "system"
|
|
1104
|
+
|
|
1105
|
+
|
|
1106
|
+
def test_tool_result_role_defaults_to_user_for_gemini(mock_instructor, mock_system_prompt_generator):
|
|
1107
|
+
config = AgentConfig(
|
|
1108
|
+
client=mock_instructor,
|
|
1109
|
+
model="gemini-2.0-flash",
|
|
1110
|
+
system_prompt_generator=mock_system_prompt_generator,
|
|
1111
|
+
assistant_role="model",
|
|
1112
|
+
)
|
|
1113
|
+
agent = AtomicAgent[BasicChatInputSchema, BasicChatOutputSchema](config)
|
|
1114
|
+
assert agent.tool_result_role == "user"
|
|
1115
|
+
|
|
1116
|
+
|
|
1117
|
+
def test_tool_result_role_explicit_override(mock_instructor, mock_system_prompt_generator):
|
|
1118
|
+
config = AgentConfig(
|
|
1119
|
+
client=mock_instructor,
|
|
1120
|
+
model="gemini-2.0-flash",
|
|
1121
|
+
system_prompt_generator=mock_system_prompt_generator,
|
|
1122
|
+
assistant_role="model",
|
|
1123
|
+
tool_result_role="system",
|
|
1124
|
+
)
|
|
1125
|
+
agent = AtomicAgent[BasicChatInputSchema, BasicChatOutputSchema](config)
|
|
1126
|
+
assert agent.tool_result_role == "system"
|
|
1127
|
+
|
|
1128
|
+
|
|
1129
|
+
def test_add_tool_result_uses_correct_role(mock_instructor, mock_system_prompt_generator):
|
|
1130
|
+
history = ChatHistory()
|
|
1131
|
+
config = AgentConfig(
|
|
1132
|
+
client=mock_instructor,
|
|
1133
|
+
model="gemini-2.0-flash",
|
|
1134
|
+
system_prompt_generator=mock_system_prompt_generator,
|
|
1135
|
+
assistant_role="model",
|
|
1136
|
+
history=history,
|
|
1137
|
+
)
|
|
1138
|
+
agent = AtomicAgent[BasicChatInputSchema, BasicChatOutputSchema](config)
|
|
1139
|
+
content = BasicChatInputSchema(chat_message="Tool result data")
|
|
1140
|
+
agent.add_tool_result(content)
|
|
1141
|
+
|
|
1142
|
+
messages = history.get_history()
|
|
1143
|
+
assert len(messages) == 1
|
|
1144
|
+
assert messages[0]["role"] == "user"
|
|
1145
|
+
|
|
1146
|
+
|
|
1147
|
+
def test_add_tool_result_uses_system_for_openai(mock_instructor, mock_system_prompt_generator):
|
|
1148
|
+
history = ChatHistory()
|
|
1149
|
+
config = AgentConfig(
|
|
1150
|
+
client=mock_instructor,
|
|
1151
|
+
model="gpt-5-mini",
|
|
1152
|
+
system_prompt_generator=mock_system_prompt_generator,
|
|
1153
|
+
history=history,
|
|
1154
|
+
)
|
|
1155
|
+
agent = AtomicAgent[BasicChatInputSchema, BasicChatOutputSchema](config)
|
|
1156
|
+
content = BasicChatInputSchema(chat_message="Tool result data")
|
|
1157
|
+
agent.add_tool_result(content)
|
|
1158
|
+
|
|
1159
|
+
messages = history.get_history()
|
|
1160
|
+
assert len(messages) == 1
|
|
1161
|
+
assert messages[0]["role"] == "system"
|
|
1162
|
+
|
|
1163
|
+
|
|
1164
|
+
def test_prepare_messages_remaps_system_to_user_for_gemini(mock_instructor, mock_system_prompt_generator):
|
|
1165
|
+
history = ChatHistory()
|
|
1166
|
+
config = AgentConfig(
|
|
1167
|
+
client=mock_instructor,
|
|
1168
|
+
model="gemini-2.0-flash",
|
|
1169
|
+
system_prompt_generator=mock_system_prompt_generator,
|
|
1170
|
+
assistant_role="model",
|
|
1171
|
+
history=history,
|
|
1172
|
+
)
|
|
1173
|
+
agent = AtomicAgent[BasicChatInputSchema, BasicChatOutputSchema](config)
|
|
1174
|
+
|
|
1175
|
+
# Simulate legacy pattern: add_message("system", ...) directly on history
|
|
1176
|
+
history.add_message("system", BasicChatInputSchema(chat_message="Tool output"))
|
|
1177
|
+
agent._prepare_messages()
|
|
1178
|
+
|
|
1179
|
+
# The system prompt message (first) should keep its role,
|
|
1180
|
+
# but mid-conversation "system" messages in history should be remapped to "user"
|
|
1181
|
+
history_messages = [m for m in agent.messages if m.get("content") != mock_system_prompt_generator.generate_prompt()]
|
|
1182
|
+
assert len(history_messages) == 1
|
|
1183
|
+
assert history_messages[0]["role"] == "user"
|
|
1184
|
+
|
|
1185
|
+
|
|
1186
|
+
def test_prepare_messages_keeps_system_for_openai(mock_instructor, mock_system_prompt_generator):
|
|
1187
|
+
history = ChatHistory()
|
|
1188
|
+
config = AgentConfig(
|
|
1189
|
+
client=mock_instructor,
|
|
1190
|
+
model="gpt-5-mini",
|
|
1191
|
+
system_prompt_generator=mock_system_prompt_generator,
|
|
1192
|
+
history=history,
|
|
1193
|
+
)
|
|
1194
|
+
agent = AtomicAgent[BasicChatInputSchema, BasicChatOutputSchema](config)
|
|
1195
|
+
|
|
1196
|
+
history.add_message("system", BasicChatInputSchema(chat_message="Tool output"))
|
|
1197
|
+
agent._prepare_messages()
|
|
1198
|
+
|
|
1199
|
+
history_messages = [m for m in agent.messages if m.get("content") != mock_system_prompt_generator.generate_prompt()]
|
|
1200
|
+
assert len(history_messages) == 1
|
|
1201
|
+
assert history_messages[0]["role"] == "system"
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
"""Integration tests for MiniMax provider with Atomic Agents.
|
|
2
|
+
|
|
3
|
+
These tests require a valid MINIMAX_API_KEY environment variable.
|
|
4
|
+
Run with: pytest -m integration tests/agents/test_minimax_integration.py
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
import os
|
|
8
|
+
import pytest
|
|
9
|
+
import instructor
|
|
10
|
+
from pydantic import Field
|
|
11
|
+
from atomic_agents import (
|
|
12
|
+
AtomicAgent,
|
|
13
|
+
AgentConfig,
|
|
14
|
+
BasicChatInputSchema,
|
|
15
|
+
BasicChatOutputSchema,
|
|
16
|
+
BaseIOSchema,
|
|
17
|
+
)
|
|
18
|
+
|
|
19
|
+
pytestmark = pytest.mark.skipif(
|
|
20
|
+
not os.getenv("MINIMAX_API_KEY"),
|
|
21
|
+
reason="MINIMAX_API_KEY not set",
|
|
22
|
+
)
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
def _make_minimax_agent(model="MiniMax-M2.7", **agent_kwargs):
|
|
26
|
+
"""Helper to create a MiniMax-backed agent."""
|
|
27
|
+
from openai import OpenAI
|
|
28
|
+
|
|
29
|
+
raw = OpenAI(
|
|
30
|
+
base_url="https://api.minimax.io/v1",
|
|
31
|
+
api_key=os.environ["MINIMAX_API_KEY"],
|
|
32
|
+
)
|
|
33
|
+
client = instructor.from_openai(raw, mode=instructor.Mode.JSON)
|
|
34
|
+
config = AgentConfig(client=client, model=model, mode=instructor.Mode.JSON, **agent_kwargs)
|
|
35
|
+
return AtomicAgent[BasicChatInputSchema, BasicChatOutputSchema](config)
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
@pytest.mark.integration
|
|
39
|
+
class TestMiniMaxLiveChat:
|
|
40
|
+
"""Live integration tests against MiniMax API."""
|
|
41
|
+
|
|
42
|
+
def test_basic_chat(self):
|
|
43
|
+
"""Test a basic chat completion with MiniMax."""
|
|
44
|
+
agent = _make_minimax_agent()
|
|
45
|
+
response = agent.run(BasicChatInputSchema(chat_message="Say hello in one word."))
|
|
46
|
+
assert response.chat_message
|
|
47
|
+
assert len(response.chat_message) > 0
|
|
48
|
+
|
|
49
|
+
def test_multi_turn_conversation(self):
|
|
50
|
+
"""Test multi-turn conversation with MiniMax."""
|
|
51
|
+
agent = _make_minimax_agent()
|
|
52
|
+
r1 = agent.run(BasicChatInputSchema(chat_message="Remember the number 42."))
|
|
53
|
+
assert r1.chat_message # first response should be non-empty
|
|
54
|
+
r2 = agent.run(BasicChatInputSchema(chat_message="What number did I ask you to remember?"))
|
|
55
|
+
assert r2.chat_message
|
|
56
|
+
# The model should recall "42" from the conversation history
|
|
57
|
+
assert "42" in r2.chat_message
|
|
58
|
+
|
|
59
|
+
def test_custom_output_schema(self):
|
|
60
|
+
"""Test structured output with a custom schema via MiniMax."""
|
|
61
|
+
from openai import OpenAI
|
|
62
|
+
|
|
63
|
+
class AnalysisOutput(BaseIOSchema):
|
|
64
|
+
"""Analysis output schema."""
|
|
65
|
+
|
|
66
|
+
sentiment: str = Field(..., description="One of: positive, negative, neutral")
|
|
67
|
+
confidence: float = Field(..., description="Confidence score between 0 and 1")
|
|
68
|
+
|
|
69
|
+
raw = OpenAI(
|
|
70
|
+
base_url="https://api.minimax.io/v1",
|
|
71
|
+
api_key=os.environ["MINIMAX_API_KEY"],
|
|
72
|
+
)
|
|
73
|
+
client = instructor.from_openai(raw, mode=instructor.Mode.JSON)
|
|
74
|
+
config = AgentConfig(client=client, model="MiniMax-M2.7", mode=instructor.Mode.JSON)
|
|
75
|
+
agent = AtomicAgent[BasicChatInputSchema, AnalysisOutput](config)
|
|
76
|
+
|
|
77
|
+
response = agent.run(BasicChatInputSchema(chat_message="I love this product, it's amazing!"))
|
|
78
|
+
assert response.sentiment in ("positive", "negative", "neutral")
|
|
79
|
+
assert 0 <= response.confidence <= 1
|
|
@@ -0,0 +1,197 @@
|
|
|
1
|
+
"""Unit tests for MiniMax provider integration with Atomic Agents."""
|
|
2
|
+
|
|
3
|
+
import os
|
|
4
|
+
import pytest
|
|
5
|
+
from unittest.mock import Mock, patch
|
|
6
|
+
import instructor
|
|
7
|
+
from atomic_agents import (
|
|
8
|
+
AtomicAgent,
|
|
9
|
+
AgentConfig,
|
|
10
|
+
BasicChatInputSchema,
|
|
11
|
+
BasicChatOutputSchema,
|
|
12
|
+
)
|
|
13
|
+
from atomic_agents.context import SystemPromptGenerator
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
def _create_minimax_client(api_key="test-key"):
|
|
17
|
+
"""Create a MiniMax client via OpenAI-compatible interface."""
|
|
18
|
+
from openai import OpenAI
|
|
19
|
+
|
|
20
|
+
return instructor.from_openai(OpenAI(base_url="https://api.minimax.io/v1", api_key=api_key))
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
class TestMiniMaxClientSetup:
|
|
24
|
+
"""Tests for MiniMax client initialization."""
|
|
25
|
+
|
|
26
|
+
def test_minimax_client_creation(self):
|
|
27
|
+
"""Test that MiniMax client can be created with correct base_url."""
|
|
28
|
+
from openai import OpenAI
|
|
29
|
+
|
|
30
|
+
raw_client = OpenAI(base_url="https://api.minimax.io/v1", api_key="test-key")
|
|
31
|
+
assert raw_client.base_url == "https://api.minimax.io/v1/"
|
|
32
|
+
|
|
33
|
+
def test_minimax_instructor_wrapping(self):
|
|
34
|
+
"""Test that MiniMax client can be wrapped with instructor."""
|
|
35
|
+
client = _create_minimax_client()
|
|
36
|
+
assert isinstance(client, instructor.Instructor)
|
|
37
|
+
|
|
38
|
+
def test_minimax_agent_config(self):
|
|
39
|
+
"""Test that AgentConfig accepts MiniMax client and model."""
|
|
40
|
+
client = _create_minimax_client()
|
|
41
|
+
config = AgentConfig(
|
|
42
|
+
client=client,
|
|
43
|
+
model="MiniMax-M2.7",
|
|
44
|
+
)
|
|
45
|
+
assert config.model == "MiniMax-M2.7"
|
|
46
|
+
assert config.assistant_role == "assistant"
|
|
47
|
+
|
|
48
|
+
def test_minimax_agent_initialization(self):
|
|
49
|
+
"""Test that AtomicAgent can be initialized with MiniMax config."""
|
|
50
|
+
client = _create_minimax_client()
|
|
51
|
+
config = AgentConfig(
|
|
52
|
+
client=client,
|
|
53
|
+
model="MiniMax-M2.7",
|
|
54
|
+
)
|
|
55
|
+
agent = AtomicAgent[BasicChatInputSchema, BasicChatOutputSchema](config)
|
|
56
|
+
assert agent.model == "MiniMax-M2.7"
|
|
57
|
+
assert agent.assistant_role == "assistant"
|
|
58
|
+
|
|
59
|
+
def test_minimax_m25_model(self):
|
|
60
|
+
"""Test that M2.5 model variant works."""
|
|
61
|
+
client = _create_minimax_client()
|
|
62
|
+
config = AgentConfig(
|
|
63
|
+
client=client,
|
|
64
|
+
model="MiniMax-M2.5",
|
|
65
|
+
)
|
|
66
|
+
agent = AtomicAgent[BasicChatInputSchema, BasicChatOutputSchema](config)
|
|
67
|
+
assert agent.model == "MiniMax-M2.5"
|
|
68
|
+
|
|
69
|
+
def test_minimax_m25_highspeed_model(self):
|
|
70
|
+
"""Test that M2.5-highspeed model variant works."""
|
|
71
|
+
client = _create_minimax_client()
|
|
72
|
+
config = AgentConfig(
|
|
73
|
+
client=client,
|
|
74
|
+
model="MiniMax-M2.5-highspeed",
|
|
75
|
+
)
|
|
76
|
+
agent = AtomicAgent[BasicChatInputSchema, BasicChatOutputSchema](config)
|
|
77
|
+
assert agent.model == "MiniMax-M2.5-highspeed"
|
|
78
|
+
|
|
79
|
+
|
|
80
|
+
class TestMiniMaxAgentBehavior:
|
|
81
|
+
"""Tests for agent behavior with MiniMax provider."""
|
|
82
|
+
|
|
83
|
+
@pytest.fixture
|
|
84
|
+
def mock_minimax_instructor(self):
|
|
85
|
+
mock = Mock(spec=instructor.Instructor)
|
|
86
|
+
mock.chat = Mock()
|
|
87
|
+
mock.chat.completions = Mock()
|
|
88
|
+
mock.chat.completions.create = Mock(return_value=BasicChatOutputSchema(chat_message="MiniMax response"))
|
|
89
|
+
mock_response = BasicChatOutputSchema(chat_message="MiniMax response")
|
|
90
|
+
mock_iter = Mock()
|
|
91
|
+
mock_iter.__iter__ = Mock(return_value=iter([mock_response]))
|
|
92
|
+
mock.chat.completions.create_partial.return_value = mock_iter
|
|
93
|
+
return mock
|
|
94
|
+
|
|
95
|
+
@pytest.fixture
|
|
96
|
+
def minimax_agent(self, mock_minimax_instructor):
|
|
97
|
+
config = AgentConfig(
|
|
98
|
+
client=mock_minimax_instructor,
|
|
99
|
+
model="MiniMax-M2.7",
|
|
100
|
+
)
|
|
101
|
+
return AtomicAgent[BasicChatInputSchema, BasicChatOutputSchema](config)
|
|
102
|
+
|
|
103
|
+
def test_run_with_minimax(self, minimax_agent, mock_minimax_instructor):
|
|
104
|
+
"""Test that agent.run works with MiniMax mock client."""
|
|
105
|
+
user_input = BasicChatInputSchema(chat_message="Hello from MiniMax test")
|
|
106
|
+
response = minimax_agent.run(user_input)
|
|
107
|
+
assert response.chat_message == "MiniMax response"
|
|
108
|
+
mock_minimax_instructor.chat.completions.create.assert_called_once()
|
|
109
|
+
|
|
110
|
+
def test_run_passes_correct_model(self, minimax_agent, mock_minimax_instructor):
|
|
111
|
+
"""Test that the correct model name is passed to the API."""
|
|
112
|
+
user_input = BasicChatInputSchema(chat_message="Test")
|
|
113
|
+
minimax_agent.run(user_input)
|
|
114
|
+
call_kwargs = mock_minimax_instructor.chat.completions.create.call_args
|
|
115
|
+
assert call_kwargs.kwargs["model"] == "MiniMax-M2.7"
|
|
116
|
+
|
|
117
|
+
def test_run_stream_with_minimax(self, minimax_agent):
|
|
118
|
+
"""Test that streaming works with MiniMax mock client."""
|
|
119
|
+
user_input = BasicChatInputSchema(chat_message="Stream test")
|
|
120
|
+
responses = list(minimax_agent.run_stream(user_input))
|
|
121
|
+
assert len(responses) == 1
|
|
122
|
+
assert responses[0].chat_message == "MiniMax response"
|
|
123
|
+
|
|
124
|
+
def test_history_tracking_with_minimax(self, minimax_agent):
|
|
125
|
+
"""Test that chat history is properly tracked."""
|
|
126
|
+
user_input = BasicChatInputSchema(chat_message="First message")
|
|
127
|
+
minimax_agent.run(user_input)
|
|
128
|
+
history = minimax_agent.history.get_history()
|
|
129
|
+
assert len(history) == 2 # user + assistant
|
|
130
|
+
|
|
131
|
+
def test_system_prompt_with_minimax(self, mock_minimax_instructor):
|
|
132
|
+
"""Test that system prompt works correctly with MiniMax."""
|
|
133
|
+
spg = SystemPromptGenerator(
|
|
134
|
+
background=["You are a helpful MiniMax-powered assistant."],
|
|
135
|
+
)
|
|
136
|
+
config = AgentConfig(
|
|
137
|
+
client=mock_minimax_instructor,
|
|
138
|
+
model="MiniMax-M2.7",
|
|
139
|
+
system_prompt_generator=spg,
|
|
140
|
+
)
|
|
141
|
+
agent = AtomicAgent[BasicChatInputSchema, BasicChatOutputSchema](config)
|
|
142
|
+
prompt = agent.system_prompt_generator.generate_prompt()
|
|
143
|
+
assert "MiniMax" in prompt
|
|
144
|
+
|
|
145
|
+
def test_model_api_parameters_with_minimax(self, mock_minimax_instructor):
|
|
146
|
+
"""Test that custom API parameters are passed through."""
|
|
147
|
+
config = AgentConfig(
|
|
148
|
+
client=mock_minimax_instructor,
|
|
149
|
+
model="MiniMax-M2.7",
|
|
150
|
+
model_api_parameters={"temperature": 0.7, "max_tokens": 1024},
|
|
151
|
+
)
|
|
152
|
+
agent = AtomicAgent[BasicChatInputSchema, BasicChatOutputSchema](config)
|
|
153
|
+
assert agent.model_api_parameters["temperature"] == 0.7
|
|
154
|
+
assert agent.model_api_parameters["max_tokens"] == 1024
|
|
155
|
+
|
|
156
|
+
def test_minimax_reset_history(self, minimax_agent):
|
|
157
|
+
"""Test that history reset works with MiniMax agent."""
|
|
158
|
+
user_input = BasicChatInputSchema(chat_message="Test")
|
|
159
|
+
minimax_agent.run(user_input)
|
|
160
|
+
minimax_agent.reset_history()
|
|
161
|
+
history = minimax_agent.history.get_history()
|
|
162
|
+
assert len(history) == 0
|
|
163
|
+
|
|
164
|
+
|
|
165
|
+
class TestMiniMaxProviderSetup:
|
|
166
|
+
"""Tests for the provider setup function from the quickstart example."""
|
|
167
|
+
|
|
168
|
+
def test_setup_client_minimax_by_number(self):
|
|
169
|
+
"""Test setup_client with provider number '7'."""
|
|
170
|
+
import sys
|
|
171
|
+
|
|
172
|
+
sys.path.insert(
|
|
173
|
+
0,
|
|
174
|
+
os.path.join(
|
|
175
|
+
os.path.dirname(__file__),
|
|
176
|
+
"..",
|
|
177
|
+
"..",
|
|
178
|
+
"..",
|
|
179
|
+
"atomic-examples",
|
|
180
|
+
"quickstart",
|
|
181
|
+
"quickstart",
|
|
182
|
+
),
|
|
183
|
+
)
|
|
184
|
+
# We can't import the example directly (it has top-level console input),
|
|
185
|
+
# but we can verify the pattern works
|
|
186
|
+
from openai import OpenAI
|
|
187
|
+
|
|
188
|
+
api_key = "test-minimax-key"
|
|
189
|
+
raw_client = OpenAI(base_url="https://api.minimax.io/v1", api_key=api_key)
|
|
190
|
+
client = instructor.from_openai(raw_client)
|
|
191
|
+
assert isinstance(client, instructor.Instructor)
|
|
192
|
+
|
|
193
|
+
def test_minimax_env_var_detection(self):
|
|
194
|
+
"""Test that MINIMAX_API_KEY env var can be used."""
|
|
195
|
+
with patch.dict(os.environ, {"MINIMAX_API_KEY": "test-env-key"}):
|
|
196
|
+
api_key = os.getenv("MINIMAX_API_KEY")
|
|
197
|
+
assert api_key == "test-env-key"
|