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.
Files changed (332) hide show
  1. {atomic_agents-2.7.4 → atomic_agents-2.7.5}/PKG-INFO +9 -5
  2. {atomic_agents-2.7.4 → atomic_agents-2.7.5}/README.md +7 -3
  3. {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-agents/atomic_agents/agents/atomic_agent.py +49 -6
  4. {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-agents/atomic_agents/context/chat_history.py +1 -1
  5. {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-agents/tests/agents/test_atomic_agent.py +114 -2
  6. atomic_agents-2.7.5/atomic-agents/tests/agents/test_minimax_integration.py +79 -0
  7. atomic_agents-2.7.5/atomic-agents/tests/agents/test_minimax_provider.py +197 -0
  8. {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-agents/tests/context/test_chat_history.py +14 -14
  9. {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-examples/basic-multimodal/pyproject.toml +1 -4
  10. {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-examples/basic-pdf-analysis/basic_pdf_analysis/main.py +1 -1
  11. {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-examples/basic-pdf-analysis/pyproject.toml +1 -3
  12. {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-examples/fastapi-memory/pyproject.toml +1 -1
  13. {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-examples/hooks-example/pyproject.toml +1 -1
  14. {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-examples/mcp-agent/example-client/example_client/main_http.py +3 -3
  15. {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-examples/mcp-agent/example-client/example_client/main_sse.py +3 -3
  16. {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-examples/mcp-agent/example-client/example_client/main_stdio.py +3 -3
  17. {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-examples/mcp-agent/example-client/example_client/main_stdio_async.py +3 -3
  18. {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-examples/nested-multimodal/pyproject.toml +1 -1
  19. {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-examples/orchestration-agent/orchestration_agent/orchestrator.py +1 -1
  20. {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-examples/orchestration-agent/pyproject.toml +1 -1
  21. {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-examples/progressive-disclosure/progressive_disclosure/agents/orchestrator_agent.py +3 -3
  22. {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-examples/progressive-disclosure/pyproject.toml +1 -1
  23. {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-examples/quickstart/pyproject.toml +1 -4
  24. {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-examples/quickstart/quickstart/4_basic_chatbot_different_providers.py +25 -14
  25. {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-examples/web-search-agent/pyproject.toml +1 -1
  26. {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-examples/youtube-summarizer/pyproject.toml +1 -1
  27. {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-examples/youtube-to-recipe/pyproject.toml +1 -1
  28. atomic_agents-2.7.5/atomic-forge/atomic_tools/tavily_search/pyproject.toml +16 -0
  29. atomic_agents-2.7.5/atomic-forge/atomic_tools/tavily_search/requirements.txt +2 -0
  30. atomic_agents-2.7.5/atomic-forge/atomic_tools/tavily_search/tests/test_tavily_search.py +136 -0
  31. atomic_agents-2.7.5/atomic-forge/atomic_tools/tavily_search/tool/__init__.py +13 -0
  32. atomic_agents-2.7.5/atomic-forge/atomic_tools/tavily_search/tool/tavily_search.py +183 -0
  33. {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-forge/tools/tavily_search/tool/tavily_search.py +6 -4
  34. {atomic_agents-2.7.4 → atomic_agents-2.7.5}/docs/guides/cookbook.md +1 -1
  35. {atomic_agents-2.7.4 → atomic_agents-2.7.5}/docs/guides/faq.md +6 -6
  36. {atomic_agents-2.7.4 → atomic_agents-2.7.5}/docs/index.md +6 -2
  37. {atomic_agents-2.7.4 → atomic_agents-2.7.5}/pyproject.toml +2 -2
  38. {atomic_agents-2.7.4 → atomic_agents-2.7.5}/requirements.txt +1 -1
  39. {atomic_agents-2.7.4 → atomic_agents-2.7.5}/uv.lock +44 -101
  40. {atomic_agents-2.7.4 → atomic_agents-2.7.5}/.assets/architecture_highlevel_overview.png +0 -0
  41. {atomic_agents-2.7.4 → atomic_agents-2.7.5}/.assets/atomic-cli-tool-menu.png +0 -0
  42. {atomic_agents-2.7.4 → atomic_agents-2.7.5}/.assets/atomic-cli.png +0 -0
  43. {atomic_agents-2.7.4 → atomic_agents-2.7.5}/.assets/docs.png +0 -0
  44. {atomic_agents-2.7.4 → atomic_agents-2.7.5}/.assets/logo.png +0 -0
  45. {atomic_agents-2.7.4 → atomic_agents-2.7.5}/.assets/video-thumbnail-1.png +0 -0
  46. {atomic_agents-2.7.4 → atomic_agents-2.7.5}/.assets/video-thumbnail-2.png +0 -0
  47. {atomic_agents-2.7.4 → atomic_agents-2.7.5}/.assets/video-thumbnail.png +0 -0
  48. {atomic_agents-2.7.4 → atomic_agents-2.7.5}/.assets/what_is_sent_in_prompt.png +0 -0
  49. {atomic_agents-2.7.4 → atomic_agents-2.7.5}/.assets/whats-new-v2-thumbnail.png +0 -0
  50. {atomic_agents-2.7.4 → atomic_agents-2.7.5}/.claude/skills/release/SKILL.md +0 -0
  51. {atomic_agents-2.7.4 → atomic_agents-2.7.5}/.claude-plugin/marketplace.json +0 -0
  52. {atomic_agents-2.7.4 → atomic_agents-2.7.5}/.coveragerc +0 -0
  53. {atomic_agents-2.7.4 → atomic_agents-2.7.5}/.flake8 +0 -0
  54. {atomic_agents-2.7.4 → atomic_agents-2.7.5}/.github/funding.yml +0 -0
  55. {atomic_agents-2.7.4 → atomic_agents-2.7.5}/.github/workflows/code-quality.yml +0 -0
  56. {atomic_agents-2.7.4 → atomic_agents-2.7.5}/.github/workflows/docs.yml +0 -0
  57. {atomic_agents-2.7.4 → atomic_agents-2.7.5}/.gitignore +0 -0
  58. {atomic_agents-2.7.4 → atomic_agents-2.7.5}/.pre-commit-config.yaml +0 -0
  59. {atomic_agents-2.7.4 → atomic_agents-2.7.5}/LICENSE +0 -0
  60. {atomic_agents-2.7.4 → atomic_agents-2.7.5}/UPGRADE_DOC.md +0 -0
  61. {atomic_agents-2.7.4 → atomic_agents-2.7.5}/agents.md +0 -0
  62. {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-agents/LICENSE +0 -0
  63. {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-agents/MANIFEST.in +0 -0
  64. {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-agents/atomic_agents/__init__.py +0 -0
  65. {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-agents/atomic_agents/agents/__init__.py +0 -0
  66. {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-agents/atomic_agents/base/__init__.py +0 -0
  67. {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-agents/atomic_agents/base/base_io_schema.py +0 -0
  68. {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-agents/atomic_agents/base/base_prompt.py +0 -0
  69. {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-agents/atomic_agents/base/base_resource.py +0 -0
  70. {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-agents/atomic_agents/base/base_tool.py +0 -0
  71. {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-agents/atomic_agents/connectors/__init__.py +0 -0
  72. {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-agents/atomic_agents/connectors/mcp/__init__.py +0 -0
  73. {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-agents/atomic_agents/connectors/mcp/mcp_definition_service.py +0 -0
  74. {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-agents/atomic_agents/connectors/mcp/mcp_factory.py +0 -0
  75. {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-agents/atomic_agents/connectors/mcp/schema_transformer.py +0 -0
  76. {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-agents/atomic_agents/context/__init__.py +0 -0
  77. {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-agents/atomic_agents/context/system_prompt_generator.py +0 -0
  78. {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-agents/atomic_agents/utils/__init__.py +0 -0
  79. {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-agents/atomic_agents/utils/format_tool_message.py +0 -0
  80. {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-agents/atomic_agents/utils/token_counter.py +0 -0
  81. {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-agents/tests/base/test_base_tool.py +0 -0
  82. {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-agents/tests/connectors/mcp/test_mcp_definition_service.py +0 -0
  83. {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-agents/tests/connectors/mcp/test_mcp_factory.py +0 -0
  84. {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-agents/tests/connectors/mcp/test_schema_transformer.py +0 -0
  85. {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-agents/tests/context/test_system_prompt_generator.py +0 -0
  86. {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-agents/tests/files/audio_sample.mp3 +0 -0
  87. {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-agents/tests/files/image_sample.jpg +0 -0
  88. {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-agents/tests/files/pdf_sample.pdf +0 -0
  89. {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-agents/tests/utils/test_format_tool_message.py +0 -0
  90. {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-agents/tests/utils/test_token_counter.py +0 -0
  91. {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-assembler/README.md +0 -0
  92. {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-assembler/atomic_assembler/__init__.py +0 -0
  93. {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-assembler/atomic_assembler/app.py +0 -0
  94. {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-assembler/atomic_assembler/color_utils.py +0 -0
  95. {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-assembler/atomic_assembler/constants.py +0 -0
  96. {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-assembler/atomic_assembler/main.py +0 -0
  97. {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-assembler/atomic_assembler/screens/atomic_tool_explorer.py +0 -0
  98. {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-assembler/atomic_assembler/screens/file_explorer.py +0 -0
  99. {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-assembler/atomic_assembler/screens/main_menu.py +0 -0
  100. {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-assembler/atomic_assembler/screens/tool_info_screen.py +0 -0
  101. {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-assembler/atomic_assembler/utils.py +0 -0
  102. {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-assembler/atomic_assembler/widgets/confirmation_modal.py +0 -0
  103. {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-assembler/atomic_assembler/widgets/generic_list.py +0 -0
  104. {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-assembler/atomic_assembler/widgets/gradient_title.py +0 -0
  105. {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-assembler/atomic_assembler/widgets/icon_selection_list.py +0 -0
  106. {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-assembler/atomic_assembler/widgets/menu.py +0 -0
  107. {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-assembler/atomic_assembler/widgets/new_item_input.py +0 -0
  108. {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-assembler/atomic_assembler/widgets/tool_info_display.py +0 -0
  109. {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-examples/basic-multimodal/README.md +0 -0
  110. {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-examples/basic-multimodal/basic_multimodal/main.py +0 -0
  111. {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-examples/basic-multimodal/test_images/nutrition_label_1.png +0 -0
  112. {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-examples/basic-multimodal/test_images/nutrition_label_2.jpg +0 -0
  113. {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-examples/basic-pdf-analysis/README.md +0 -0
  114. {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-examples/basic-pdf-analysis/test_media/pdf_sample.pdf +0 -0
  115. {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-examples/deep-research/README.md +0 -0
  116. {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-examples/deep-research/deep_research/agents/choice_agent.py +0 -0
  117. {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-examples/deep-research/deep_research/agents/qa_agent.py +0 -0
  118. {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-examples/deep-research/deep_research/agents/query_agent.py +0 -0
  119. {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-examples/deep-research/deep_research/config.py +0 -0
  120. {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-examples/deep-research/deep_research/context_providers.py +0 -0
  121. {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-examples/deep-research/deep_research/main.py +0 -0
  122. {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-examples/deep-research/deep_research/tools/searxng_search.py +0 -0
  123. {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-examples/deep-research/deep_research/tools/webpage_scraper.py +0 -0
  124. {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-examples/deep-research/mermaid.md +0 -0
  125. {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-examples/deep-research/pyproject.toml +0 -0
  126. {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-examples/dspy-integration/README.md +0 -0
  127. {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-examples/dspy-integration/dspy_integration/__init__.py +0 -0
  128. {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-examples/dspy-integration/dspy_integration/bridge.py +0 -0
  129. {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-examples/dspy-integration/dspy_integration/domain/__init__.py +0 -0
  130. {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-examples/dspy-integration/dspy_integration/domain/datasets.py +0 -0
  131. {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-examples/dspy-integration/dspy_integration/domain/evaluation.py +0 -0
  132. {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-examples/dspy-integration/dspy_integration/domain/models.py +0 -0
  133. {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-examples/dspy-integration/dspy_integration/main.py +0 -0
  134. {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-examples/dspy-integration/dspy_integration/presentation/__init__.py +0 -0
  135. {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-examples/dspy-integration/dspy_integration/presentation/console.py +0 -0
  136. {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-examples/dspy-integration/dspy_integration/schemas.py +0 -0
  137. {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-examples/dspy-integration/dspy_integration/stages/__init__.py +0 -0
  138. {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-examples/dspy-integration/dspy_integration/stages/stage1_dspy.py +0 -0
  139. {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-examples/dspy-integration/dspy_integration/stages/stage2_atomic.py +0 -0
  140. {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-examples/dspy-integration/dspy_integration/stages/stage3_combined.py +0 -0
  141. {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-examples/dspy-integration/pyproject.toml +0 -0
  142. {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-examples/fastapi-memory/README.md +0 -0
  143. {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-examples/fastapi-memory/fastapi_memory/__init__.py +0 -0
  144. {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-examples/fastapi-memory/fastapi_memory/client.py +0 -0
  145. {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-examples/fastapi-memory/fastapi_memory/lib/__init__.py +0 -0
  146. {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-examples/fastapi-memory/fastapi_memory/lib/agents/__init__.py +0 -0
  147. {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-examples/fastapi-memory/fastapi_memory/lib/agents/chat_agent.py +0 -0
  148. {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-examples/fastapi-memory/fastapi_memory/lib/config.py +0 -0
  149. {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-examples/fastapi-memory/fastapi_memory/lib/schemas.py +0 -0
  150. {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-examples/fastapi-memory/fastapi_memory/main.py +0 -0
  151. {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-examples/fastapi-memory/test_api.py +0 -0
  152. {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-examples/hooks-example/README.md +0 -0
  153. {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-examples/hooks-example/hooks_example/main.py +0 -0
  154. {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-examples/mcp-agent/README.md +0 -0
  155. {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-examples/mcp-agent/example-client/example_client/main.py +0 -0
  156. {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-examples/mcp-agent/example-client/example_client/main_fastapi.py +0 -0
  157. {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-examples/mcp-agent/example-client/pyproject.toml +0 -0
  158. {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-examples/mcp-agent/example-mcp-server/README.md +0 -0
  159. {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-examples/mcp-agent/example-mcp-server/demo_tools.py +0 -0
  160. {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-examples/mcp-agent/example-mcp-server/example_mcp_server/__init__.py +0 -0
  161. {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
  162. {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
  163. {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
  164. {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
  165. {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
  166. {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
  167. {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
  168. {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-examples/mcp-agent/example-mcp-server/example_mcp_server/server.py +0 -0
  169. {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
  170. {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
  171. {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
  172. {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
  173. {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
  174. {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
  175. {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
  176. {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
  177. {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
  178. {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
  179. {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
  180. {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
  181. {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
  182. {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-examples/mcp-agent/example-mcp-server/pyproject.toml +0 -0
  183. {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-examples/nested-multimodal/README.md +0 -0
  184. {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-examples/nested-multimodal/nested_multimodal/main.py +0 -0
  185. {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-examples/nested-multimodal/test_images/nutrition_label_1.png +0 -0
  186. {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-examples/orchestration-agent/README.md +0 -0
  187. {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-examples/orchestration-agent/orchestration_agent/tools/calculator.py +0 -0
  188. {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-examples/orchestration-agent/orchestration_agent/tools/searxng_search.py +0 -0
  189. {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-examples/progressive-disclosure/README.md +0 -0
  190. {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-examples/progressive-disclosure/progressive_disclosure/__init__.py +0 -0
  191. {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-examples/progressive-disclosure/progressive_disclosure/agents/__init__.py +0 -0
  192. {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-examples/progressive-disclosure/progressive_disclosure/agents/tool_finder_agent.py +0 -0
  193. {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-examples/progressive-disclosure/progressive_disclosure/main.py +0 -0
  194. {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-examples/progressive-disclosure/progressive_disclosure/registry/__init__.py +0 -0
  195. {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-examples/progressive-disclosure/progressive_disclosure/registry/tool_registry.py +0 -0
  196. {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-examples/progressive-disclosure/progressive_disclosure/tools/__init__.py +0 -0
  197. {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-examples/progressive-disclosure/progressive_disclosure/tools/search_tools.py +0 -0
  198. {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-examples/progressive-disclosure/servers/data_server/data_server/__init__.py +0 -0
  199. {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-examples/progressive-disclosure/servers/data_server/data_server/server.py +0 -0
  200. {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-examples/progressive-disclosure/servers/data_server/pyproject.toml +0 -0
  201. {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-examples/progressive-disclosure/servers/math_server/math_server/__init__.py +0 -0
  202. {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-examples/progressive-disclosure/servers/math_server/math_server/server.py +0 -0
  203. {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-examples/progressive-disclosure/servers/math_server/pyproject.toml +0 -0
  204. {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-examples/progressive-disclosure/servers/text_server/pyproject.toml +0 -0
  205. {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-examples/progressive-disclosure/servers/text_server/text_server/__init__.py +0 -0
  206. {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-examples/progressive-disclosure/servers/text_server/text_server/server.py +0 -0
  207. {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-examples/quickstart/README.md +0 -0
  208. {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-examples/quickstart/quickstart/1_0_basic_chatbot.py +0 -0
  209. {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-examples/quickstart/quickstart/1_1_basic_chatbot_streaming.py +0 -0
  210. {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-examples/quickstart/quickstart/1_2_basic_chatbot_async_streaming.py +0 -0
  211. {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-examples/quickstart/quickstart/2_basic_custom_chatbot.py +0 -0
  212. {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
  213. {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
  214. {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-examples/quickstart/quickstart/5_custom_system_role_for_reasoning_models.py +0 -0
  215. {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-examples/quickstart/quickstart/6_0_asynchronous_processing.py +0 -0
  216. {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-examples/quickstart/quickstart/6_1_asynchronous_processing_streaming.py +0 -0
  217. {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-examples/rag-chatbot/.gitignore +0 -0
  218. {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-examples/rag-chatbot/README.md +0 -0
  219. {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-examples/rag-chatbot/pyproject.toml +0 -0
  220. {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-examples/rag-chatbot/rag_chatbot/agents/qa_agent.py +0 -0
  221. {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-examples/rag-chatbot/rag_chatbot/agents/query_agent.py +0 -0
  222. {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-examples/rag-chatbot/rag_chatbot/config.py +0 -0
  223. {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-examples/rag-chatbot/rag_chatbot/context_providers.py +0 -0
  224. {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-examples/rag-chatbot/rag_chatbot/main.py +0 -0
  225. {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-examples/rag-chatbot/rag_chatbot/services/__init__.py +0 -0
  226. {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-examples/rag-chatbot/rag_chatbot/services/base.py +0 -0
  227. {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-examples/rag-chatbot/rag_chatbot/services/chroma_db.py +0 -0
  228. {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-examples/rag-chatbot/rag_chatbot/services/factory.py +0 -0
  229. {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-examples/rag-chatbot/rag_chatbot/services/qdrant_db.py +0 -0
  230. {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-examples/web-search-agent/README.md +0 -0
  231. {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-examples/web-search-agent/web_search_agent/agents/query_agent.py +0 -0
  232. {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
  233. {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-examples/web-search-agent/web_search_agent/main.py +0 -0
  234. {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-examples/web-search-agent/web_search_agent/tools/searxng_search.py +0 -0
  235. {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-examples/youtube-summarizer/README.md +0 -0
  236. {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-examples/youtube-summarizer/youtube_summarizer/agent.py +0 -0
  237. {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-examples/youtube-summarizer/youtube_summarizer/main.py +0 -0
  238. {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-examples/youtube-summarizer/youtube_summarizer/tools/youtube_transcript_scraper.py +0 -0
  239. {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-examples/youtube-to-recipe/README.md +0 -0
  240. {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-examples/youtube-to-recipe/youtube_to_recipe/agent.py +0 -0
  241. {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-examples/youtube-to-recipe/youtube_to_recipe/main.py +0 -0
  242. {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
  243. {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-forge/README.md +0 -0
  244. {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-forge/guides/tool_structure.md +0 -0
  245. {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-forge/tools/bocha_search/.coveragerc +0 -0
  246. {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-forge/tools/bocha_search/README.md +0 -0
  247. {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-forge/tools/bocha_search/pyproject.toml +0 -0
  248. {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-forge/tools/bocha_search/requirements.txt +0 -0
  249. {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-forge/tools/bocha_search/tests/test_bocha_search.py +0 -0
  250. {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-forge/tools/bocha_search/tool/bocha_search.py +0 -0
  251. {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-forge/tools/calculator/.coveragerc +0 -0
  252. {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-forge/tools/calculator/README.md +0 -0
  253. {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-forge/tools/calculator/pyproject.toml +0 -0
  254. {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-forge/tools/calculator/requirements.txt +0 -0
  255. {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-forge/tools/calculator/tests/test_calculator.py +0 -0
  256. {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-forge/tools/calculator/tool/calculator.py +0 -0
  257. {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-forge/tools/searxng_search/.coveragerc +0 -0
  258. {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-forge/tools/searxng_search/README.md +0 -0
  259. {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-forge/tools/searxng_search/pyproject.toml +0 -0
  260. {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-forge/tools/searxng_search/pytest.ini +0 -0
  261. {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-forge/tools/searxng_search/requirements.txt +0 -0
  262. {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-forge/tools/searxng_search/tests/test_searxng_search.py +0 -0
  263. {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-forge/tools/searxng_search/tool/searxng_search.py +0 -0
  264. {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-forge/tools/tavily_search/.coveragerc +0 -0
  265. {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-forge/tools/tavily_search/README.md +0 -0
  266. {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-forge/tools/tavily_search/pyproject.toml +0 -0
  267. {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-forge/tools/tavily_search/requirements.txt +0 -0
  268. {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-forge/tools/tavily_search/tests/test_tavily_seach.py +0 -0
  269. {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-forge/tools/webpage_scraper/README.md +0 -0
  270. {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-forge/tools/webpage_scraper/pyproject.toml +0 -0
  271. {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-forge/tools/webpage_scraper/requirements.txt +0 -0
  272. {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-forge/tools/webpage_scraper/tests/conftest.py +0 -0
  273. {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-forge/tools/webpage_scraper/tests/test_webpage_scraper.py +0 -0
  274. {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-forge/tools/webpage_scraper/tool/webpage_scraper.py +0 -0
  275. {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-forge/tools/youtube_transcript_scraper/.coveragerc +0 -0
  276. {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-forge/tools/youtube_transcript_scraper/README.md +0 -0
  277. {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-forge/tools/youtube_transcript_scraper/pyproject.toml +0 -0
  278. {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-forge/tools/youtube_transcript_scraper/requirements.txt +0 -0
  279. {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-forge/tools/youtube_transcript_scraper/tests/test_youtube_transcript_scraper.py +0 -0
  280. {atomic_agents-2.7.4 → atomic_agents-2.7.5}/atomic-forge/tools/youtube_transcript_scraper/tool/youtube_transcript_scraper.py +0 -0
  281. {atomic_agents-2.7.4 → atomic_agents-2.7.5}/build_and_deploy.ps1 +0 -0
  282. {atomic_agents-2.7.4 → atomic_agents-2.7.5}/claude-plugin/atomic-agents/.claude-plugin/plugin.json +0 -0
  283. {atomic_agents-2.7.4 → atomic_agents-2.7.5}/claude-plugin/atomic-agents/CHANGELOG.md +0 -0
  284. {atomic_agents-2.7.4 → atomic_agents-2.7.5}/claude-plugin/atomic-agents/LICENSE +0 -0
  285. {atomic_agents-2.7.4 → atomic_agents-2.7.5}/claude-plugin/atomic-agents/README.md +0 -0
  286. {atomic_agents-2.7.4 → atomic_agents-2.7.5}/claude-plugin/atomic-agents/agents/atomic-architect.md +0 -0
  287. {atomic_agents-2.7.4 → atomic_agents-2.7.5}/claude-plugin/atomic-agents/agents/atomic-explorer.md +0 -0
  288. {atomic_agents-2.7.4 → atomic_agents-2.7.5}/claude-plugin/atomic-agents/agents/atomic-reviewer.md +0 -0
  289. {atomic_agents-2.7.4 → atomic_agents-2.7.5}/claude-plugin/atomic-agents/agents/schema-designer.md +0 -0
  290. {atomic_agents-2.7.4 → atomic_agents-2.7.5}/claude-plugin/atomic-agents/commands/atomic-agent.md +0 -0
  291. {atomic_agents-2.7.4 → atomic_agents-2.7.5}/claude-plugin/atomic-agents/commands/atomic-create.md +0 -0
  292. {atomic_agents-2.7.4 → atomic_agents-2.7.5}/claude-plugin/atomic-agents/commands/atomic-tool.md +0 -0
  293. {atomic_agents-2.7.4 → atomic_agents-2.7.5}/claude-plugin/atomic-agents/skills/atomic-agents/SKILL.md +0 -0
  294. {atomic_agents-2.7.4 → atomic_agents-2.7.5}/claude-plugin/atomic-agents/skills/atomic-agents/examples/basic-agent.py +0 -0
  295. {atomic_agents-2.7.4 → atomic_agents-2.7.5}/claude-plugin/atomic-agents/skills/atomic-context/SKILL.md +0 -0
  296. {atomic_agents-2.7.4 → atomic_agents-2.7.5}/claude-plugin/atomic-agents/skills/atomic-context/examples/rag-context.py +0 -0
  297. {atomic_agents-2.7.4 → atomic_agents-2.7.5}/claude-plugin/atomic-agents/skills/atomic-prompts/SKILL.md +0 -0
  298. {atomic_agents-2.7.4 → atomic_agents-2.7.5}/claude-plugin/atomic-agents/skills/atomic-schemas/SKILL.md +0 -0
  299. {atomic_agents-2.7.4 → atomic_agents-2.7.5}/claude-plugin/atomic-agents/skills/atomic-schemas/examples/common-schemas.py +0 -0
  300. {atomic_agents-2.7.4 → atomic_agents-2.7.5}/claude-plugin/atomic-agents/skills/atomic-structure/SKILL.md +0 -0
  301. {atomic_agents-2.7.4 → atomic_agents-2.7.5}/claude-plugin/atomic-agents/skills/atomic-tools/SKILL.md +0 -0
  302. {atomic_agents-2.7.4 → atomic_agents-2.7.5}/claude-plugin/atomic-agents/skills/atomic-tools/examples/api-tool.py +0 -0
  303. {atomic_agents-2.7.4 → atomic_agents-2.7.5}/docs/.nojekyll +0 -0
  304. {atomic_agents-2.7.4 → atomic_agents-2.7.5}/docs/Makefile +0 -0
  305. {atomic_agents-2.7.4 → atomic_agents-2.7.5}/docs/_static/logo.png +0 -0
  306. {atomic_agents-2.7.4 → atomic_agents-2.7.5}/docs/api/agents.md +0 -0
  307. {atomic_agents-2.7.4 → atomic_agents-2.7.5}/docs/api/context.md +0 -0
  308. {atomic_agents-2.7.4 → atomic_agents-2.7.5}/docs/api/index.md +0 -0
  309. {atomic_agents-2.7.4 → atomic_agents-2.7.5}/docs/api/utils.md +0 -0
  310. {atomic_agents-2.7.4 → atomic_agents-2.7.5}/docs/conf.py +0 -0
  311. {atomic_agents-2.7.4 → atomic_agents-2.7.5}/docs/contributing.md +0 -0
  312. {atomic_agents-2.7.4 → atomic_agents-2.7.5}/docs/examples/index.md +0 -0
  313. {atomic_agents-2.7.4 → atomic_agents-2.7.5}/docs/examples/mcp_agent.md +0 -0
  314. {atomic_agents-2.7.4 → atomic_agents-2.7.5}/docs/guides/deployment.md +0 -0
  315. {atomic_agents-2.7.4 → atomic_agents-2.7.5}/docs/guides/error-handling.md +0 -0
  316. {atomic_agents-2.7.4 → atomic_agents-2.7.5}/docs/guides/hooks.md +0 -0
  317. {atomic_agents-2.7.4 → atomic_agents-2.7.5}/docs/guides/index.md +0 -0
  318. {atomic_agents-2.7.4 → atomic_agents-2.7.5}/docs/guides/logging.md +0 -0
  319. {atomic_agents-2.7.4 → atomic_agents-2.7.5}/docs/guides/memory.md +0 -0
  320. {atomic_agents-2.7.4 → atomic_agents-2.7.5}/docs/guides/orchestration.md +0 -0
  321. {atomic_agents-2.7.4 → atomic_agents-2.7.5}/docs/guides/performance.md +0 -0
  322. {atomic_agents-2.7.4 → atomic_agents-2.7.5}/docs/guides/quickstart.md +0 -0
  323. {atomic_agents-2.7.4 → atomic_agents-2.7.5}/docs/guides/security.md +0 -0
  324. {atomic_agents-2.7.4 → atomic_agents-2.7.5}/docs/guides/testing.md +0 -0
  325. {atomic_agents-2.7.4 → atomic_agents-2.7.5}/docs/guides/tools.md +0 -0
  326. {atomic_agents-2.7.4 → atomic_agents-2.7.5}/docs/make.bat +0 -0
  327. {atomic_agents-2.7.4 → atomic_agents-2.7.5}/greptile.json +0 -0
  328. {atomic_agents-2.7.4 → atomic_agents-2.7.5}/guides/DEV_GUIDE.md +0 -0
  329. {atomic_agents-2.7.4 → atomic_agents-2.7.5}/pytest.ini +0 -0
  330. {atomic_agents-2.7.4 → atomic_agents-2.7.5}/scripts/generate_llms_files.py +0 -0
  331. {atomic_agents-2.7.4 → atomic_agents-2.7.5}/scripts/sync_version.py +0 -0
  332. {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.4
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.13.0
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. For example, to use OpenAI and Groq, you can install the `openai` and `groq` packages:
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 openai groq
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. For example, to use OpenAI and Groq, you can install the `openai` and `groq` packages:
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 openai groq
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
 
@@ -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
- self.messages += self.history.get_history()
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
@@ -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"