atomic-agents 2.7.4__tar.gz → 2.8.0__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 (411) hide show
  1. {atomic_agents-2.7.4 → atomic_agents-2.8.0}/.claude-plugin/marketplace.json +2 -2
  2. {atomic_agents-2.7.4 → atomic_agents-2.8.0}/PKG-INFO +19 -5
  3. {atomic_agents-2.7.4 → atomic_agents-2.8.0}/README.md +17 -3
  4. {atomic_agents-2.7.4 → atomic_agents-2.8.0}/agents.md +8 -0
  5. {atomic_agents-2.7.4 → atomic_agents-2.8.0}/atomic-agents/atomic_agents/agents/atomic_agent.py +135 -9
  6. {atomic_agents-2.7.4 → atomic_agents-2.8.0}/atomic-agents/atomic_agents/connectors/mcp/mcp_factory.py +1 -1
  7. {atomic_agents-2.7.4 → atomic_agents-2.8.0}/atomic-agents/atomic_agents/context/__init__.py +2 -0
  8. {atomic_agents-2.7.4 → atomic_agents-2.8.0}/atomic-agents/atomic_agents/context/chat_history.py +1 -1
  9. {atomic_agents-2.7.4 → atomic_agents-2.8.0}/atomic-agents/atomic_agents/context/system_prompt_generator.py +14 -2
  10. {atomic_agents-2.7.4 → atomic_agents-2.8.0}/atomic-agents/tests/agents/test_atomic_agent.py +329 -3
  11. atomic_agents-2.8.0/atomic-agents/tests/agents/test_minimax_integration.py +79 -0
  12. atomic_agents-2.8.0/atomic-agents/tests/agents/test_minimax_provider.py +197 -0
  13. {atomic_agents-2.7.4 → atomic_agents-2.8.0}/atomic-agents/tests/context/test_chat_history.py +14 -14
  14. {atomic_agents-2.7.4 → atomic_agents-2.8.0}/atomic-agents/tests/context/test_system_prompt_generator.py +48 -1
  15. {atomic_agents-2.7.4 → atomic_agents-2.8.0}/atomic-examples/basic-multimodal/pyproject.toml +1 -4
  16. {atomic_agents-2.7.4 → atomic_agents-2.8.0}/atomic-examples/basic-pdf-analysis/basic_pdf_analysis/main.py +1 -1
  17. {atomic_agents-2.7.4 → atomic_agents-2.8.0}/atomic-examples/basic-pdf-analysis/pyproject.toml +1 -3
  18. atomic_agents-2.8.0/atomic-examples/deep-research/README.md +95 -0
  19. atomic_agents-2.8.0/atomic-examples/deep-research/deep_research/__main__.py +19 -0
  20. atomic_agents-2.8.0/atomic-examples/deep-research/deep_research/agents/decider_agent.py +73 -0
  21. atomic_agents-2.8.0/atomic-examples/deep-research/deep_research/agents/extractor_agent.py +75 -0
  22. atomic_agents-2.8.0/atomic-examples/deep-research/deep_research/agents/planner_agent.py +82 -0
  23. atomic_agents-2.8.0/atomic-examples/deep-research/deep_research/agents/qa_agent.py +77 -0
  24. atomic_agents-2.8.0/atomic-examples/deep-research/deep_research/agents/reflector_agent.py +85 -0
  25. atomic_agents-2.8.0/atomic-examples/deep-research/deep_research/agents/writer_agent.py +89 -0
  26. atomic_agents-2.8.0/atomic-examples/deep-research/deep_research/config.py +66 -0
  27. atomic_agents-2.8.0/atomic-examples/deep-research/deep_research/context_providers.py +63 -0
  28. atomic_agents-2.8.0/atomic-examples/deep-research/deep_research/main.py +396 -0
  29. atomic_agents-2.8.0/atomic-examples/deep-research/deep_research/state.py +82 -0
  30. atomic_agents-2.8.0/atomic-examples/deep-research/mermaid.md +46 -0
  31. {atomic_agents-2.7.4 → atomic_agents-2.8.0}/atomic-examples/fastapi-memory/pyproject.toml +1 -1
  32. {atomic_agents-2.7.4 → atomic_agents-2.8.0}/atomic-examples/hooks-example/pyproject.toml +1 -1
  33. {atomic_agents-2.7.4 → atomic_agents-2.8.0}/atomic-examples/mcp-agent/example-client/example_client/main_http.py +3 -3
  34. {atomic_agents-2.7.4 → atomic_agents-2.8.0}/atomic-examples/mcp-agent/example-client/example_client/main_sse.py +3 -3
  35. {atomic_agents-2.7.4 → atomic_agents-2.8.0}/atomic-examples/mcp-agent/example-client/example_client/main_stdio.py +3 -3
  36. {atomic_agents-2.7.4 → atomic_agents-2.8.0}/atomic-examples/mcp-agent/example-client/example_client/main_stdio_async.py +3 -3
  37. {atomic_agents-2.7.4 → atomic_agents-2.8.0}/atomic-examples/nested-multimodal/pyproject.toml +1 -1
  38. {atomic_agents-2.7.4 → atomic_agents-2.8.0}/atomic-examples/orchestration-agent/orchestration_agent/orchestrator.py +1 -1
  39. {atomic_agents-2.7.4 → atomic_agents-2.8.0}/atomic-examples/orchestration-agent/pyproject.toml +1 -1
  40. {atomic_agents-2.7.4 → atomic_agents-2.8.0}/atomic-examples/progressive-disclosure/progressive_disclosure/agents/orchestrator_agent.py +3 -3
  41. {atomic_agents-2.7.4 → atomic_agents-2.8.0}/atomic-examples/progressive-disclosure/pyproject.toml +1 -1
  42. {atomic_agents-2.7.4 → atomic_agents-2.8.0}/atomic-examples/quickstart/pyproject.toml +1 -4
  43. {atomic_agents-2.7.4 → atomic_agents-2.8.0}/atomic-examples/quickstart/quickstart/4_basic_chatbot_different_providers.py +25 -14
  44. {atomic_agents-2.7.4 → atomic_agents-2.8.0}/atomic-examples/web-search-agent/pyproject.toml +1 -1
  45. {atomic_agents-2.7.4 → atomic_agents-2.8.0}/atomic-examples/youtube-summarizer/pyproject.toml +1 -1
  46. {atomic_agents-2.7.4 → atomic_agents-2.8.0}/atomic-examples/youtube-to-recipe/pyproject.toml +1 -1
  47. {atomic_agents-2.7.4 → atomic_agents-2.8.0}/atomic-forge/README.md +9 -1
  48. atomic_agents-2.8.0/atomic-forge/atomic_tools/tavily_search/pyproject.toml +16 -0
  49. atomic_agents-2.8.0/atomic-forge/atomic_tools/tavily_search/requirements.txt +2 -0
  50. atomic_agents-2.8.0/atomic-forge/atomic_tools/tavily_search/tests/test_tavily_search.py +136 -0
  51. atomic_agents-2.8.0/atomic-forge/atomic_tools/tavily_search/tool/__init__.py +13 -0
  52. atomic_agents-2.8.0/atomic-forge/atomic_tools/tavily_search/tool/tavily_search.py +183 -0
  53. atomic_agents-2.8.0/atomic-forge/tools/arxiv_search/README.md +50 -0
  54. atomic_agents-2.8.0/atomic-forge/tools/arxiv_search/pyproject.toml +32 -0
  55. atomic_agents-2.8.0/atomic-forge/tools/arxiv_search/requirements.txt +3 -0
  56. atomic_agents-2.8.0/atomic-forge/tools/arxiv_search/tests/test_arxiv_search.py +137 -0
  57. atomic_agents-2.8.0/atomic-forge/tools/arxiv_search/tool/arxiv_search.py +255 -0
  58. atomic_agents-2.8.0/atomic-forge/tools/datetime_tool/README.md +63 -0
  59. atomic_agents-2.8.0/atomic-forge/tools/datetime_tool/pyproject.toml +31 -0
  60. atomic_agents-2.8.0/atomic-forge/tools/datetime_tool/requirements.txt +3 -0
  61. atomic_agents-2.8.0/atomic-forge/tools/datetime_tool/tests/test_datetime_tool.py +135 -0
  62. atomic_agents-2.8.0/atomic-forge/tools/datetime_tool/tool/datetime_tool.py +257 -0
  63. atomic_agents-2.8.0/atomic-forge/tools/fia_signals/README.md +55 -0
  64. atomic_agents-2.8.0/atomic-forge/tools/fia_signals/pyproject.toml +35 -0
  65. atomic_agents-2.8.0/atomic-forge/tools/fia_signals/requirements.txt +3 -0
  66. atomic_agents-2.8.0/atomic-forge/tools/fia_signals/tests/__init__.py +1 -0
  67. atomic_agents-2.8.0/atomic-forge/tools/fia_signals/tests/test_fia_signals.py +136 -0
  68. atomic_agents-2.8.0/atomic-forge/tools/fia_signals/tool/fia_signals.py +225 -0
  69. atomic_agents-2.8.0/atomic-forge/tools/hackernews_search/.coveragerc +8 -0
  70. atomic_agents-2.8.0/atomic-forge/tools/hackernews_search/README.md +50 -0
  71. atomic_agents-2.8.0/atomic-forge/tools/hackernews_search/pyproject.toml +32 -0
  72. atomic_agents-2.8.0/atomic-forge/tools/hackernews_search/requirements.txt +3 -0
  73. atomic_agents-2.8.0/atomic-forge/tools/hackernews_search/tests/test_hackernews_search.py +116 -0
  74. atomic_agents-2.8.0/atomic-forge/tools/hackernews_search/tool/hackernews_search.py +208 -0
  75. atomic_agents-2.8.0/atomic-forge/tools/pdf_reader/.coveragerc +8 -0
  76. atomic_agents-2.8.0/atomic-forge/tools/pdf_reader/README.md +60 -0
  77. atomic_agents-2.8.0/atomic-forge/tools/pdf_reader/pyproject.toml +33 -0
  78. atomic_agents-2.8.0/atomic-forge/tools/pdf_reader/requirements.txt +4 -0
  79. atomic_agents-2.8.0/atomic-forge/tools/pdf_reader/tests/test_pdf_reader.py +164 -0
  80. atomic_agents-2.8.0/atomic-forge/tools/pdf_reader/tool/pdf_reader.py +258 -0
  81. atomic_agents-2.8.0/atomic-forge/tools/searxng_search/.coveragerc +8 -0
  82. atomic_agents-2.8.0/atomic-forge/tools/tavily_search/.coveragerc +8 -0
  83. {atomic_agents-2.7.4 → atomic_agents-2.8.0}/atomic-forge/tools/tavily_search/tool/tavily_search.py +6 -4
  84. atomic_agents-2.8.0/atomic-forge/tools/weather/.coveragerc +8 -0
  85. atomic_agents-2.8.0/atomic-forge/tools/weather/README.md +57 -0
  86. atomic_agents-2.8.0/atomic-forge/tools/weather/pyproject.toml +31 -0
  87. atomic_agents-2.8.0/atomic-forge/tools/weather/requirements.txt +3 -0
  88. atomic_agents-2.8.0/atomic-forge/tools/weather/tests/test_weather.py +181 -0
  89. atomic_agents-2.8.0/atomic-forge/tools/weather/tool/weather.py +402 -0
  90. atomic_agents-2.8.0/atomic-forge/tools/wikipedia_search/.coveragerc +8 -0
  91. atomic_agents-2.8.0/atomic-forge/tools/wikipedia_search/README.md +48 -0
  92. atomic_agents-2.8.0/atomic-forge/tools/wikipedia_search/pyproject.toml +32 -0
  93. atomic_agents-2.8.0/atomic-forge/tools/wikipedia_search/requirements.txt +3 -0
  94. atomic_agents-2.8.0/atomic-forge/tools/wikipedia_search/tests/test_wikipedia_search.py +137 -0
  95. atomic_agents-2.8.0/atomic-forge/tools/wikipedia_search/tool/wikipedia_search.py +234 -0
  96. atomic_agents-2.8.0/atomic-forge/tools/youtube_transcript_scraper/.coveragerc +8 -0
  97. atomic_agents-2.8.0/claude-plugin/atomic-agents/.claude-plugin/plugin.json +12 -0
  98. atomic_agents-2.8.0/claude-plugin/atomic-agents/CHANGELOG.md +72 -0
  99. atomic_agents-2.8.0/claude-plugin/atomic-agents/README.md +110 -0
  100. atomic_agents-2.8.0/claude-plugin/atomic-agents/agents/atomic-explorer.md +134 -0
  101. atomic_agents-2.8.0/claude-plugin/atomic-agents/agents/atomic-reviewer.md +171 -0
  102. atomic_agents-2.8.0/claude-plugin/atomic-agents/skills/create-atomic-agent/SKILL.md +160 -0
  103. atomic_agents-2.8.0/claude-plugin/atomic-agents/skills/create-atomic-context-provider/SKILL.md +207 -0
  104. atomic_agents-2.8.0/claude-plugin/atomic-agents/skills/create-atomic-schema/SKILL.md +137 -0
  105. atomic_agents-2.8.0/claude-plugin/atomic-agents/skills/create-atomic-tool/SKILL.md +200 -0
  106. atomic_agents-2.8.0/claude-plugin/atomic-agents/skills/framework/SKILL.md +150 -0
  107. atomic_agents-2.8.0/claude-plugin/atomic-agents/skills/framework/references/agents.md +138 -0
  108. atomic_agents-2.8.0/claude-plugin/atomic-agents/skills/framework/references/context-providers.md +190 -0
  109. atomic_agents-2.8.0/claude-plugin/atomic-agents/skills/framework/references/hooks.md +174 -0
  110. atomic_agents-2.8.0/claude-plugin/atomic-agents/skills/framework/references/memory.md +163 -0
  111. atomic_agents-2.8.0/claude-plugin/atomic-agents/skills/framework/references/orchestration.md +154 -0
  112. atomic_agents-2.8.0/claude-plugin/atomic-agents/skills/framework/references/project-structure.md +188 -0
  113. atomic_agents-2.8.0/claude-plugin/atomic-agents/skills/framework/references/prompts.md +82 -0
  114. atomic_agents-2.8.0/claude-plugin/atomic-agents/skills/framework/references/providers.md +176 -0
  115. atomic_agents-2.8.0/claude-plugin/atomic-agents/skills/framework/references/schemas.md +180 -0
  116. atomic_agents-2.8.0/claude-plugin/atomic-agents/skills/framework/references/testing.md +150 -0
  117. atomic_agents-2.8.0/claude-plugin/atomic-agents/skills/framework/references/tools.md +205 -0
  118. atomic_agents-2.8.0/claude-plugin/atomic-agents/skills/new-app/SKILL.md +132 -0
  119. {atomic_agents-2.7.4 → atomic_agents-2.8.0}/docs/api/context.md +48 -0
  120. {atomic_agents-2.7.4 → atomic_agents-2.8.0}/docs/guides/cookbook.md +1 -1
  121. {atomic_agents-2.7.4 → atomic_agents-2.8.0}/docs/guides/faq.md +6 -6
  122. atomic_agents-2.8.0/docs/guides/tools.md +292 -0
  123. {atomic_agents-2.7.4 → atomic_agents-2.8.0}/docs/index.md +6 -2
  124. {atomic_agents-2.7.4 → atomic_agents-2.8.0}/pyproject.toml +2 -2
  125. {atomic_agents-2.7.4 → atomic_agents-2.8.0}/requirements.txt +1 -1
  126. {atomic_agents-2.7.4 → atomic_agents-2.8.0}/uv.lock +308 -101
  127. atomic_agents-2.7.4/atomic-examples/deep-research/README.md +0 -76
  128. atomic_agents-2.7.4/atomic-examples/deep-research/deep_research/agents/choice_agent.py +0 -58
  129. atomic_agents-2.7.4/atomic-examples/deep-research/deep_research/agents/qa_agent.py +0 -63
  130. atomic_agents-2.7.4/atomic-examples/deep-research/deep_research/agents/query_agent.py +0 -42
  131. atomic_agents-2.7.4/atomic-examples/deep-research/deep_research/config.py +0 -39
  132. atomic_agents-2.7.4/atomic-examples/deep-research/deep_research/context_providers.py +0 -33
  133. atomic_agents-2.7.4/atomic-examples/deep-research/deep_research/main.py +0 -211
  134. atomic_agents-2.7.4/atomic-examples/deep-research/mermaid.md +0 -68
  135. atomic_agents-2.7.4/claude-plugin/atomic-agents/.claude-plugin/plugin.json +0 -23
  136. atomic_agents-2.7.4/claude-plugin/atomic-agents/CHANGELOG.md +0 -48
  137. atomic_agents-2.7.4/claude-plugin/atomic-agents/README.md +0 -251
  138. atomic_agents-2.7.4/claude-plugin/atomic-agents/agents/atomic-architect.md +0 -275
  139. atomic_agents-2.7.4/claude-plugin/atomic-agents/agents/atomic-explorer.md +0 -175
  140. atomic_agents-2.7.4/claude-plugin/atomic-agents/agents/atomic-reviewer.md +0 -220
  141. atomic_agents-2.7.4/claude-plugin/atomic-agents/agents/schema-designer.md +0 -291
  142. atomic_agents-2.7.4/claude-plugin/atomic-agents/commands/atomic-agent.md +0 -136
  143. atomic_agents-2.7.4/claude-plugin/atomic-agents/commands/atomic-create.md +0 -264
  144. atomic_agents-2.7.4/claude-plugin/atomic-agents/commands/atomic-tool.md +0 -244
  145. atomic_agents-2.7.4/claude-plugin/atomic-agents/skills/atomic-agents/SKILL.md +0 -227
  146. atomic_agents-2.7.4/claude-plugin/atomic-agents/skills/atomic-agents/examples/basic-agent.py +0 -132
  147. atomic_agents-2.7.4/claude-plugin/atomic-agents/skills/atomic-context/SKILL.md +0 -234
  148. atomic_agents-2.7.4/claude-plugin/atomic-agents/skills/atomic-context/examples/rag-context.py +0 -212
  149. atomic_agents-2.7.4/claude-plugin/atomic-agents/skills/atomic-prompts/SKILL.md +0 -315
  150. atomic_agents-2.7.4/claude-plugin/atomic-agents/skills/atomic-schemas/SKILL.md +0 -189
  151. atomic_agents-2.7.4/claude-plugin/atomic-agents/skills/atomic-schemas/examples/common-schemas.py +0 -232
  152. atomic_agents-2.7.4/claude-plugin/atomic-agents/skills/atomic-structure/SKILL.md +0 -311
  153. atomic_agents-2.7.4/claude-plugin/atomic-agents/skills/atomic-tools/SKILL.md +0 -221
  154. atomic_agents-2.7.4/claude-plugin/atomic-agents/skills/atomic-tools/examples/api-tool.py +0 -222
  155. atomic_agents-2.7.4/docs/guides/tools.md +0 -165
  156. {atomic_agents-2.7.4 → atomic_agents-2.8.0}/.assets/architecture_highlevel_overview.png +0 -0
  157. {atomic_agents-2.7.4 → atomic_agents-2.8.0}/.assets/atomic-cli-tool-menu.png +0 -0
  158. {atomic_agents-2.7.4 → atomic_agents-2.8.0}/.assets/atomic-cli.png +0 -0
  159. {atomic_agents-2.7.4 → atomic_agents-2.8.0}/.assets/docs.png +0 -0
  160. {atomic_agents-2.7.4 → atomic_agents-2.8.0}/.assets/logo.png +0 -0
  161. {atomic_agents-2.7.4 → atomic_agents-2.8.0}/.assets/video-thumbnail-1.png +0 -0
  162. {atomic_agents-2.7.4 → atomic_agents-2.8.0}/.assets/video-thumbnail-2.png +0 -0
  163. {atomic_agents-2.7.4 → atomic_agents-2.8.0}/.assets/video-thumbnail.png +0 -0
  164. {atomic_agents-2.7.4 → atomic_agents-2.8.0}/.assets/what_is_sent_in_prompt.png +0 -0
  165. {atomic_agents-2.7.4 → atomic_agents-2.8.0}/.assets/whats-new-v2-thumbnail.png +0 -0
  166. {atomic_agents-2.7.4 → atomic_agents-2.8.0}/.claude/skills/release/SKILL.md +0 -0
  167. {atomic_agents-2.7.4 → atomic_agents-2.8.0}/.coveragerc +0 -0
  168. {atomic_agents-2.7.4 → atomic_agents-2.8.0}/.flake8 +0 -0
  169. {atomic_agents-2.7.4 → atomic_agents-2.8.0}/.github/funding.yml +0 -0
  170. {atomic_agents-2.7.4 → atomic_agents-2.8.0}/.github/workflows/code-quality.yml +0 -0
  171. {atomic_agents-2.7.4 → atomic_agents-2.8.0}/.github/workflows/docs.yml +0 -0
  172. {atomic_agents-2.7.4 → atomic_agents-2.8.0}/.gitignore +0 -0
  173. {atomic_agents-2.7.4 → atomic_agents-2.8.0}/.pre-commit-config.yaml +0 -0
  174. {atomic_agents-2.7.4 → atomic_agents-2.8.0}/LICENSE +0 -0
  175. {atomic_agents-2.7.4 → atomic_agents-2.8.0}/UPGRADE_DOC.md +0 -0
  176. {atomic_agents-2.7.4 → atomic_agents-2.8.0}/atomic-agents/LICENSE +0 -0
  177. {atomic_agents-2.7.4 → atomic_agents-2.8.0}/atomic-agents/MANIFEST.in +0 -0
  178. {atomic_agents-2.7.4 → atomic_agents-2.8.0}/atomic-agents/atomic_agents/__init__.py +0 -0
  179. {atomic_agents-2.7.4 → atomic_agents-2.8.0}/atomic-agents/atomic_agents/agents/__init__.py +0 -0
  180. {atomic_agents-2.7.4 → atomic_agents-2.8.0}/atomic-agents/atomic_agents/base/__init__.py +0 -0
  181. {atomic_agents-2.7.4 → atomic_agents-2.8.0}/atomic-agents/atomic_agents/base/base_io_schema.py +0 -0
  182. {atomic_agents-2.7.4 → atomic_agents-2.8.0}/atomic-agents/atomic_agents/base/base_prompt.py +0 -0
  183. {atomic_agents-2.7.4 → atomic_agents-2.8.0}/atomic-agents/atomic_agents/base/base_resource.py +0 -0
  184. {atomic_agents-2.7.4 → atomic_agents-2.8.0}/atomic-agents/atomic_agents/base/base_tool.py +0 -0
  185. {atomic_agents-2.7.4 → atomic_agents-2.8.0}/atomic-agents/atomic_agents/connectors/__init__.py +0 -0
  186. {atomic_agents-2.7.4 → atomic_agents-2.8.0}/atomic-agents/atomic_agents/connectors/mcp/__init__.py +0 -0
  187. {atomic_agents-2.7.4 → atomic_agents-2.8.0}/atomic-agents/atomic_agents/connectors/mcp/mcp_definition_service.py +0 -0
  188. {atomic_agents-2.7.4 → atomic_agents-2.8.0}/atomic-agents/atomic_agents/connectors/mcp/schema_transformer.py +0 -0
  189. {atomic_agents-2.7.4 → atomic_agents-2.8.0}/atomic-agents/atomic_agents/utils/__init__.py +0 -0
  190. {atomic_agents-2.7.4 → atomic_agents-2.8.0}/atomic-agents/atomic_agents/utils/format_tool_message.py +0 -0
  191. {atomic_agents-2.7.4 → atomic_agents-2.8.0}/atomic-agents/atomic_agents/utils/token_counter.py +0 -0
  192. {atomic_agents-2.7.4 → atomic_agents-2.8.0}/atomic-agents/tests/base/test_base_tool.py +0 -0
  193. {atomic_agents-2.7.4 → atomic_agents-2.8.0}/atomic-agents/tests/connectors/mcp/test_mcp_definition_service.py +0 -0
  194. {atomic_agents-2.7.4 → atomic_agents-2.8.0}/atomic-agents/tests/connectors/mcp/test_mcp_factory.py +0 -0
  195. {atomic_agents-2.7.4 → atomic_agents-2.8.0}/atomic-agents/tests/connectors/mcp/test_schema_transformer.py +0 -0
  196. {atomic_agents-2.7.4 → atomic_agents-2.8.0}/atomic-agents/tests/files/audio_sample.mp3 +0 -0
  197. {atomic_agents-2.7.4 → atomic_agents-2.8.0}/atomic-agents/tests/files/image_sample.jpg +0 -0
  198. {atomic_agents-2.7.4 → atomic_agents-2.8.0}/atomic-agents/tests/files/pdf_sample.pdf +0 -0
  199. {atomic_agents-2.7.4 → atomic_agents-2.8.0}/atomic-agents/tests/utils/test_format_tool_message.py +0 -0
  200. {atomic_agents-2.7.4 → atomic_agents-2.8.0}/atomic-agents/tests/utils/test_token_counter.py +0 -0
  201. {atomic_agents-2.7.4 → atomic_agents-2.8.0}/atomic-assembler/README.md +0 -0
  202. {atomic_agents-2.7.4 → atomic_agents-2.8.0}/atomic-assembler/atomic_assembler/__init__.py +0 -0
  203. {atomic_agents-2.7.4 → atomic_agents-2.8.0}/atomic-assembler/atomic_assembler/app.py +0 -0
  204. {atomic_agents-2.7.4 → atomic_agents-2.8.0}/atomic-assembler/atomic_assembler/color_utils.py +0 -0
  205. {atomic_agents-2.7.4 → atomic_agents-2.8.0}/atomic-assembler/atomic_assembler/constants.py +0 -0
  206. {atomic_agents-2.7.4 → atomic_agents-2.8.0}/atomic-assembler/atomic_assembler/main.py +0 -0
  207. {atomic_agents-2.7.4 → atomic_agents-2.8.0}/atomic-assembler/atomic_assembler/screens/atomic_tool_explorer.py +0 -0
  208. {atomic_agents-2.7.4 → atomic_agents-2.8.0}/atomic-assembler/atomic_assembler/screens/file_explorer.py +0 -0
  209. {atomic_agents-2.7.4 → atomic_agents-2.8.0}/atomic-assembler/atomic_assembler/screens/main_menu.py +0 -0
  210. {atomic_agents-2.7.4 → atomic_agents-2.8.0}/atomic-assembler/atomic_assembler/screens/tool_info_screen.py +0 -0
  211. {atomic_agents-2.7.4 → atomic_agents-2.8.0}/atomic-assembler/atomic_assembler/utils.py +0 -0
  212. {atomic_agents-2.7.4 → atomic_agents-2.8.0}/atomic-assembler/atomic_assembler/widgets/confirmation_modal.py +0 -0
  213. {atomic_agents-2.7.4 → atomic_agents-2.8.0}/atomic-assembler/atomic_assembler/widgets/generic_list.py +0 -0
  214. {atomic_agents-2.7.4 → atomic_agents-2.8.0}/atomic-assembler/atomic_assembler/widgets/gradient_title.py +0 -0
  215. {atomic_agents-2.7.4 → atomic_agents-2.8.0}/atomic-assembler/atomic_assembler/widgets/icon_selection_list.py +0 -0
  216. {atomic_agents-2.7.4 → atomic_agents-2.8.0}/atomic-assembler/atomic_assembler/widgets/menu.py +0 -0
  217. {atomic_agents-2.7.4 → atomic_agents-2.8.0}/atomic-assembler/atomic_assembler/widgets/new_item_input.py +0 -0
  218. {atomic_agents-2.7.4 → atomic_agents-2.8.0}/atomic-assembler/atomic_assembler/widgets/tool_info_display.py +0 -0
  219. {atomic_agents-2.7.4 → atomic_agents-2.8.0}/atomic-examples/basic-multimodal/README.md +0 -0
  220. {atomic_agents-2.7.4 → atomic_agents-2.8.0}/atomic-examples/basic-multimodal/basic_multimodal/main.py +0 -0
  221. {atomic_agents-2.7.4 → atomic_agents-2.8.0}/atomic-examples/basic-multimodal/test_images/nutrition_label_1.png +0 -0
  222. {atomic_agents-2.7.4 → atomic_agents-2.8.0}/atomic-examples/basic-multimodal/test_images/nutrition_label_2.jpg +0 -0
  223. {atomic_agents-2.7.4 → atomic_agents-2.8.0}/atomic-examples/basic-pdf-analysis/README.md +0 -0
  224. {atomic_agents-2.7.4 → atomic_agents-2.8.0}/atomic-examples/basic-pdf-analysis/test_media/pdf_sample.pdf +0 -0
  225. {atomic_agents-2.7.4 → atomic_agents-2.8.0}/atomic-examples/deep-research/deep_research/tools/searxng_search.py +0 -0
  226. {atomic_agents-2.7.4 → atomic_agents-2.8.0}/atomic-examples/deep-research/deep_research/tools/webpage_scraper.py +0 -0
  227. {atomic_agents-2.7.4 → atomic_agents-2.8.0}/atomic-examples/deep-research/pyproject.toml +0 -0
  228. {atomic_agents-2.7.4 → atomic_agents-2.8.0}/atomic-examples/dspy-integration/README.md +0 -0
  229. {atomic_agents-2.7.4 → atomic_agents-2.8.0}/atomic-examples/dspy-integration/dspy_integration/__init__.py +0 -0
  230. {atomic_agents-2.7.4 → atomic_agents-2.8.0}/atomic-examples/dspy-integration/dspy_integration/bridge.py +0 -0
  231. {atomic_agents-2.7.4 → atomic_agents-2.8.0}/atomic-examples/dspy-integration/dspy_integration/domain/__init__.py +0 -0
  232. {atomic_agents-2.7.4 → atomic_agents-2.8.0}/atomic-examples/dspy-integration/dspy_integration/domain/datasets.py +0 -0
  233. {atomic_agents-2.7.4 → atomic_agents-2.8.0}/atomic-examples/dspy-integration/dspy_integration/domain/evaluation.py +0 -0
  234. {atomic_agents-2.7.4 → atomic_agents-2.8.0}/atomic-examples/dspy-integration/dspy_integration/domain/models.py +0 -0
  235. {atomic_agents-2.7.4 → atomic_agents-2.8.0}/atomic-examples/dspy-integration/dspy_integration/main.py +0 -0
  236. {atomic_agents-2.7.4 → atomic_agents-2.8.0}/atomic-examples/dspy-integration/dspy_integration/presentation/__init__.py +0 -0
  237. {atomic_agents-2.7.4 → atomic_agents-2.8.0}/atomic-examples/dspy-integration/dspy_integration/presentation/console.py +0 -0
  238. {atomic_agents-2.7.4 → atomic_agents-2.8.0}/atomic-examples/dspy-integration/dspy_integration/schemas.py +0 -0
  239. {atomic_agents-2.7.4 → atomic_agents-2.8.0}/atomic-examples/dspy-integration/dspy_integration/stages/__init__.py +0 -0
  240. {atomic_agents-2.7.4 → atomic_agents-2.8.0}/atomic-examples/dspy-integration/dspy_integration/stages/stage1_dspy.py +0 -0
  241. {atomic_agents-2.7.4 → atomic_agents-2.8.0}/atomic-examples/dspy-integration/dspy_integration/stages/stage2_atomic.py +0 -0
  242. {atomic_agents-2.7.4 → atomic_agents-2.8.0}/atomic-examples/dspy-integration/dspy_integration/stages/stage3_combined.py +0 -0
  243. {atomic_agents-2.7.4 → atomic_agents-2.8.0}/atomic-examples/dspy-integration/pyproject.toml +0 -0
  244. {atomic_agents-2.7.4 → atomic_agents-2.8.0}/atomic-examples/fastapi-memory/README.md +0 -0
  245. {atomic_agents-2.7.4 → atomic_agents-2.8.0}/atomic-examples/fastapi-memory/fastapi_memory/__init__.py +0 -0
  246. {atomic_agents-2.7.4 → atomic_agents-2.8.0}/atomic-examples/fastapi-memory/fastapi_memory/client.py +0 -0
  247. {atomic_agents-2.7.4 → atomic_agents-2.8.0}/atomic-examples/fastapi-memory/fastapi_memory/lib/__init__.py +0 -0
  248. {atomic_agents-2.7.4 → atomic_agents-2.8.0}/atomic-examples/fastapi-memory/fastapi_memory/lib/agents/__init__.py +0 -0
  249. {atomic_agents-2.7.4 → atomic_agents-2.8.0}/atomic-examples/fastapi-memory/fastapi_memory/lib/agents/chat_agent.py +0 -0
  250. {atomic_agents-2.7.4 → atomic_agents-2.8.0}/atomic-examples/fastapi-memory/fastapi_memory/lib/config.py +0 -0
  251. {atomic_agents-2.7.4 → atomic_agents-2.8.0}/atomic-examples/fastapi-memory/fastapi_memory/lib/schemas.py +0 -0
  252. {atomic_agents-2.7.4 → atomic_agents-2.8.0}/atomic-examples/fastapi-memory/fastapi_memory/main.py +0 -0
  253. {atomic_agents-2.7.4 → atomic_agents-2.8.0}/atomic-examples/fastapi-memory/test_api.py +0 -0
  254. {atomic_agents-2.7.4 → atomic_agents-2.8.0}/atomic-examples/hooks-example/README.md +0 -0
  255. {atomic_agents-2.7.4 → atomic_agents-2.8.0}/atomic-examples/hooks-example/hooks_example/main.py +0 -0
  256. {atomic_agents-2.7.4 → atomic_agents-2.8.0}/atomic-examples/mcp-agent/README.md +0 -0
  257. {atomic_agents-2.7.4 → atomic_agents-2.8.0}/atomic-examples/mcp-agent/example-client/example_client/main.py +0 -0
  258. {atomic_agents-2.7.4 → atomic_agents-2.8.0}/atomic-examples/mcp-agent/example-client/example_client/main_fastapi.py +0 -0
  259. {atomic_agents-2.7.4 → atomic_agents-2.8.0}/atomic-examples/mcp-agent/example-client/pyproject.toml +0 -0
  260. {atomic_agents-2.7.4 → atomic_agents-2.8.0}/atomic-examples/mcp-agent/example-mcp-server/README.md +0 -0
  261. {atomic_agents-2.7.4 → atomic_agents-2.8.0}/atomic-examples/mcp-agent/example-mcp-server/demo_tools.py +0 -0
  262. {atomic_agents-2.7.4 → atomic_agents-2.8.0}/atomic-examples/mcp-agent/example-mcp-server/example_mcp_server/__init__.py +0 -0
  263. {atomic_agents-2.7.4 → atomic_agents-2.8.0}/atomic-examples/mcp-agent/example-mcp-server/example_mcp_server/interfaces/__init__.py +0 -0
  264. {atomic_agents-2.7.4 → atomic_agents-2.8.0}/atomic-examples/mcp-agent/example-mcp-server/example_mcp_server/interfaces/prompt.py +0 -0
  265. {atomic_agents-2.7.4 → atomic_agents-2.8.0}/atomic-examples/mcp-agent/example-mcp-server/example_mcp_server/interfaces/resource.py +0 -0
  266. {atomic_agents-2.7.4 → atomic_agents-2.8.0}/atomic-examples/mcp-agent/example-mcp-server/example_mcp_server/interfaces/tool.py +0 -0
  267. {atomic_agents-2.7.4 → atomic_agents-2.8.0}/atomic-examples/mcp-agent/example-mcp-server/example_mcp_server/prompts/sample_prompts.py +0 -0
  268. {atomic_agents-2.7.4 → atomic_agents-2.8.0}/atomic-examples/mcp-agent/example-mcp-server/example_mcp_server/resources/__init__.py +0 -0
  269. {atomic_agents-2.7.4 → atomic_agents-2.8.0}/atomic-examples/mcp-agent/example-mcp-server/example_mcp_server/resources/sample_resources.py +0 -0
  270. {atomic_agents-2.7.4 → atomic_agents-2.8.0}/atomic-examples/mcp-agent/example-mcp-server/example_mcp_server/server.py +0 -0
  271. {atomic_agents-2.7.4 → atomic_agents-2.8.0}/atomic-examples/mcp-agent/example-mcp-server/example_mcp_server/server_http.py +0 -0
  272. {atomic_agents-2.7.4 → atomic_agents-2.8.0}/atomic-examples/mcp-agent/example-mcp-server/example_mcp_server/server_sse.py +0 -0
  273. {atomic_agents-2.7.4 → atomic_agents-2.8.0}/atomic-examples/mcp-agent/example-mcp-server/example_mcp_server/server_stdio.py +0 -0
  274. {atomic_agents-2.7.4 → atomic_agents-2.8.0}/atomic-examples/mcp-agent/example-mcp-server/example_mcp_server/services/__init__.py +0 -0
  275. {atomic_agents-2.7.4 → atomic_agents-2.8.0}/atomic-examples/mcp-agent/example-mcp-server/example_mcp_server/services/prompt_service.py +0 -0
  276. {atomic_agents-2.7.4 → atomic_agents-2.8.0}/atomic-examples/mcp-agent/example-mcp-server/example_mcp_server/services/resource_service.py +0 -0
  277. {atomic_agents-2.7.4 → atomic_agents-2.8.0}/atomic-examples/mcp-agent/example-mcp-server/example_mcp_server/services/tool_service.py +0 -0
  278. {atomic_agents-2.7.4 → atomic_agents-2.8.0}/atomic-examples/mcp-agent/example-mcp-server/example_mcp_server/tools/__init__.py +0 -0
  279. {atomic_agents-2.7.4 → atomic_agents-2.8.0}/atomic-examples/mcp-agent/example-mcp-server/example_mcp_server/tools/add_numbers.py +0 -0
  280. {atomic_agents-2.7.4 → atomic_agents-2.8.0}/atomic-examples/mcp-agent/example-mcp-server/example_mcp_server/tools/batch_operations.py +0 -0
  281. {atomic_agents-2.7.4 → atomic_agents-2.8.0}/atomic-examples/mcp-agent/example-mcp-server/example_mcp_server/tools/divide_numbers.py +0 -0
  282. {atomic_agents-2.7.4 → atomic_agents-2.8.0}/atomic-examples/mcp-agent/example-mcp-server/example_mcp_server/tools/multiply_numbers.py +0 -0
  283. {atomic_agents-2.7.4 → atomic_agents-2.8.0}/atomic-examples/mcp-agent/example-mcp-server/example_mcp_server/tools/subtract_numbers.py +0 -0
  284. {atomic_agents-2.7.4 → atomic_agents-2.8.0}/atomic-examples/mcp-agent/example-mcp-server/pyproject.toml +0 -0
  285. {atomic_agents-2.7.4 → atomic_agents-2.8.0}/atomic-examples/nested-multimodal/README.md +0 -0
  286. {atomic_agents-2.7.4 → atomic_agents-2.8.0}/atomic-examples/nested-multimodal/nested_multimodal/main.py +0 -0
  287. {atomic_agents-2.7.4 → atomic_agents-2.8.0}/atomic-examples/nested-multimodal/test_images/nutrition_label_1.png +0 -0
  288. {atomic_agents-2.7.4 → atomic_agents-2.8.0}/atomic-examples/orchestration-agent/README.md +0 -0
  289. {atomic_agents-2.7.4 → atomic_agents-2.8.0}/atomic-examples/orchestration-agent/orchestration_agent/tools/calculator.py +0 -0
  290. {atomic_agents-2.7.4 → atomic_agents-2.8.0}/atomic-examples/orchestration-agent/orchestration_agent/tools/searxng_search.py +0 -0
  291. {atomic_agents-2.7.4 → atomic_agents-2.8.0}/atomic-examples/progressive-disclosure/README.md +0 -0
  292. {atomic_agents-2.7.4 → atomic_agents-2.8.0}/atomic-examples/progressive-disclosure/progressive_disclosure/__init__.py +0 -0
  293. {atomic_agents-2.7.4 → atomic_agents-2.8.0}/atomic-examples/progressive-disclosure/progressive_disclosure/agents/__init__.py +0 -0
  294. {atomic_agents-2.7.4 → atomic_agents-2.8.0}/atomic-examples/progressive-disclosure/progressive_disclosure/agents/tool_finder_agent.py +0 -0
  295. {atomic_agents-2.7.4 → atomic_agents-2.8.0}/atomic-examples/progressive-disclosure/progressive_disclosure/main.py +0 -0
  296. {atomic_agents-2.7.4 → atomic_agents-2.8.0}/atomic-examples/progressive-disclosure/progressive_disclosure/registry/__init__.py +0 -0
  297. {atomic_agents-2.7.4 → atomic_agents-2.8.0}/atomic-examples/progressive-disclosure/progressive_disclosure/registry/tool_registry.py +0 -0
  298. {atomic_agents-2.7.4 → atomic_agents-2.8.0}/atomic-examples/progressive-disclosure/progressive_disclosure/tools/__init__.py +0 -0
  299. {atomic_agents-2.7.4 → atomic_agents-2.8.0}/atomic-examples/progressive-disclosure/progressive_disclosure/tools/search_tools.py +0 -0
  300. {atomic_agents-2.7.4 → atomic_agents-2.8.0}/atomic-examples/progressive-disclosure/servers/data_server/data_server/__init__.py +0 -0
  301. {atomic_agents-2.7.4 → atomic_agents-2.8.0}/atomic-examples/progressive-disclosure/servers/data_server/data_server/server.py +0 -0
  302. {atomic_agents-2.7.4 → atomic_agents-2.8.0}/atomic-examples/progressive-disclosure/servers/data_server/pyproject.toml +0 -0
  303. {atomic_agents-2.7.4 → atomic_agents-2.8.0}/atomic-examples/progressive-disclosure/servers/math_server/math_server/__init__.py +0 -0
  304. {atomic_agents-2.7.4 → atomic_agents-2.8.0}/atomic-examples/progressive-disclosure/servers/math_server/math_server/server.py +0 -0
  305. {atomic_agents-2.7.4 → atomic_agents-2.8.0}/atomic-examples/progressive-disclosure/servers/math_server/pyproject.toml +0 -0
  306. {atomic_agents-2.7.4 → atomic_agents-2.8.0}/atomic-examples/progressive-disclosure/servers/text_server/pyproject.toml +0 -0
  307. {atomic_agents-2.7.4 → atomic_agents-2.8.0}/atomic-examples/progressive-disclosure/servers/text_server/text_server/__init__.py +0 -0
  308. {atomic_agents-2.7.4 → atomic_agents-2.8.0}/atomic-examples/progressive-disclosure/servers/text_server/text_server/server.py +0 -0
  309. {atomic_agents-2.7.4 → atomic_agents-2.8.0}/atomic-examples/quickstart/README.md +0 -0
  310. {atomic_agents-2.7.4 → atomic_agents-2.8.0}/atomic-examples/quickstart/quickstart/1_0_basic_chatbot.py +0 -0
  311. {atomic_agents-2.7.4 → atomic_agents-2.8.0}/atomic-examples/quickstart/quickstart/1_1_basic_chatbot_streaming.py +0 -0
  312. {atomic_agents-2.7.4 → atomic_agents-2.8.0}/atomic-examples/quickstart/quickstart/1_2_basic_chatbot_async_streaming.py +0 -0
  313. {atomic_agents-2.7.4 → atomic_agents-2.8.0}/atomic-examples/quickstart/quickstart/2_basic_custom_chatbot.py +0 -0
  314. {atomic_agents-2.7.4 → atomic_agents-2.8.0}/atomic-examples/quickstart/quickstart/3_0_basic_custom_chatbot_with_custom_schema.py +0 -0
  315. {atomic_agents-2.7.4 → atomic_agents-2.8.0}/atomic-examples/quickstart/quickstart/3_1_basic_custom_chatbot_with_custom_schema_streaming.py +0 -0
  316. {atomic_agents-2.7.4 → atomic_agents-2.8.0}/atomic-examples/quickstart/quickstart/5_custom_system_role_for_reasoning_models.py +0 -0
  317. {atomic_agents-2.7.4 → atomic_agents-2.8.0}/atomic-examples/quickstart/quickstart/6_0_asynchronous_processing.py +0 -0
  318. {atomic_agents-2.7.4 → atomic_agents-2.8.0}/atomic-examples/quickstart/quickstart/6_1_asynchronous_processing_streaming.py +0 -0
  319. {atomic_agents-2.7.4 → atomic_agents-2.8.0}/atomic-examples/rag-chatbot/.gitignore +0 -0
  320. {atomic_agents-2.7.4 → atomic_agents-2.8.0}/atomic-examples/rag-chatbot/README.md +0 -0
  321. {atomic_agents-2.7.4 → atomic_agents-2.8.0}/atomic-examples/rag-chatbot/pyproject.toml +0 -0
  322. {atomic_agents-2.7.4 → atomic_agents-2.8.0}/atomic-examples/rag-chatbot/rag_chatbot/agents/qa_agent.py +0 -0
  323. {atomic_agents-2.7.4 → atomic_agents-2.8.0}/atomic-examples/rag-chatbot/rag_chatbot/agents/query_agent.py +0 -0
  324. {atomic_agents-2.7.4 → atomic_agents-2.8.0}/atomic-examples/rag-chatbot/rag_chatbot/config.py +0 -0
  325. {atomic_agents-2.7.4 → atomic_agents-2.8.0}/atomic-examples/rag-chatbot/rag_chatbot/context_providers.py +0 -0
  326. {atomic_agents-2.7.4 → atomic_agents-2.8.0}/atomic-examples/rag-chatbot/rag_chatbot/main.py +0 -0
  327. {atomic_agents-2.7.4 → atomic_agents-2.8.0}/atomic-examples/rag-chatbot/rag_chatbot/services/__init__.py +0 -0
  328. {atomic_agents-2.7.4 → atomic_agents-2.8.0}/atomic-examples/rag-chatbot/rag_chatbot/services/base.py +0 -0
  329. {atomic_agents-2.7.4 → atomic_agents-2.8.0}/atomic-examples/rag-chatbot/rag_chatbot/services/chroma_db.py +0 -0
  330. {atomic_agents-2.7.4 → atomic_agents-2.8.0}/atomic-examples/rag-chatbot/rag_chatbot/services/factory.py +0 -0
  331. {atomic_agents-2.7.4 → atomic_agents-2.8.0}/atomic-examples/rag-chatbot/rag_chatbot/services/qdrant_db.py +0 -0
  332. {atomic_agents-2.7.4 → atomic_agents-2.8.0}/atomic-examples/web-search-agent/README.md +0 -0
  333. {atomic_agents-2.7.4 → atomic_agents-2.8.0}/atomic-examples/web-search-agent/web_search_agent/agents/query_agent.py +0 -0
  334. {atomic_agents-2.7.4 → atomic_agents-2.8.0}/atomic-examples/web-search-agent/web_search_agent/agents/question_answering_agent.py +0 -0
  335. {atomic_agents-2.7.4 → atomic_agents-2.8.0}/atomic-examples/web-search-agent/web_search_agent/main.py +0 -0
  336. {atomic_agents-2.7.4 → atomic_agents-2.8.0}/atomic-examples/web-search-agent/web_search_agent/tools/searxng_search.py +0 -0
  337. {atomic_agents-2.7.4 → atomic_agents-2.8.0}/atomic-examples/youtube-summarizer/README.md +0 -0
  338. {atomic_agents-2.7.4 → atomic_agents-2.8.0}/atomic-examples/youtube-summarizer/youtube_summarizer/agent.py +0 -0
  339. {atomic_agents-2.7.4 → atomic_agents-2.8.0}/atomic-examples/youtube-summarizer/youtube_summarizer/main.py +0 -0
  340. {atomic_agents-2.7.4 → atomic_agents-2.8.0}/atomic-examples/youtube-summarizer/youtube_summarizer/tools/youtube_transcript_scraper.py +0 -0
  341. {atomic_agents-2.7.4 → atomic_agents-2.8.0}/atomic-examples/youtube-to-recipe/README.md +0 -0
  342. {atomic_agents-2.7.4 → atomic_agents-2.8.0}/atomic-examples/youtube-to-recipe/youtube_to_recipe/agent.py +0 -0
  343. {atomic_agents-2.7.4 → atomic_agents-2.8.0}/atomic-examples/youtube-to-recipe/youtube_to_recipe/main.py +0 -0
  344. {atomic_agents-2.7.4 → atomic_agents-2.8.0}/atomic-examples/youtube-to-recipe/youtube_to_recipe/tools/youtube_transcript_scraper.py +0 -0
  345. {atomic_agents-2.7.4 → atomic_agents-2.8.0}/atomic-forge/guides/tool_structure.md +0 -0
  346. {atomic_agents-2.7.4/atomic-forge/tools/bocha_search → atomic_agents-2.8.0/atomic-forge/tools/arxiv_search}/.coveragerc +0 -0
  347. {atomic_agents-2.7.4/atomic-forge/tools/calculator → atomic_agents-2.8.0/atomic-forge/tools/bocha_search}/.coveragerc +0 -0
  348. {atomic_agents-2.7.4 → atomic_agents-2.8.0}/atomic-forge/tools/bocha_search/README.md +0 -0
  349. {atomic_agents-2.7.4 → atomic_agents-2.8.0}/atomic-forge/tools/bocha_search/pyproject.toml +0 -0
  350. {atomic_agents-2.7.4 → atomic_agents-2.8.0}/atomic-forge/tools/bocha_search/requirements.txt +0 -0
  351. {atomic_agents-2.7.4 → atomic_agents-2.8.0}/atomic-forge/tools/bocha_search/tests/test_bocha_search.py +0 -0
  352. {atomic_agents-2.7.4 → atomic_agents-2.8.0}/atomic-forge/tools/bocha_search/tool/bocha_search.py +0 -0
  353. {atomic_agents-2.7.4/atomic-forge/tools/searxng_search → atomic_agents-2.8.0/atomic-forge/tools/calculator}/.coveragerc +0 -0
  354. {atomic_agents-2.7.4 → atomic_agents-2.8.0}/atomic-forge/tools/calculator/README.md +0 -0
  355. {atomic_agents-2.7.4 → atomic_agents-2.8.0}/atomic-forge/tools/calculator/pyproject.toml +0 -0
  356. {atomic_agents-2.7.4 → atomic_agents-2.8.0}/atomic-forge/tools/calculator/requirements.txt +0 -0
  357. {atomic_agents-2.7.4 → atomic_agents-2.8.0}/atomic-forge/tools/calculator/tests/test_calculator.py +0 -0
  358. {atomic_agents-2.7.4 → atomic_agents-2.8.0}/atomic-forge/tools/calculator/tool/calculator.py +0 -0
  359. {atomic_agents-2.7.4/atomic-forge/tools/tavily_search → atomic_agents-2.8.0/atomic-forge/tools/datetime_tool}/.coveragerc +0 -0
  360. {atomic_agents-2.7.4/atomic-forge/tools/youtube_transcript_scraper → atomic_agents-2.8.0/atomic-forge/tools/fia_signals}/.coveragerc +0 -0
  361. {atomic_agents-2.7.4 → atomic_agents-2.8.0}/atomic-forge/tools/searxng_search/README.md +0 -0
  362. {atomic_agents-2.7.4 → atomic_agents-2.8.0}/atomic-forge/tools/searxng_search/pyproject.toml +0 -0
  363. {atomic_agents-2.7.4 → atomic_agents-2.8.0}/atomic-forge/tools/searxng_search/pytest.ini +0 -0
  364. {atomic_agents-2.7.4 → atomic_agents-2.8.0}/atomic-forge/tools/searxng_search/requirements.txt +0 -0
  365. {atomic_agents-2.7.4 → atomic_agents-2.8.0}/atomic-forge/tools/searxng_search/tests/test_searxng_search.py +0 -0
  366. {atomic_agents-2.7.4 → atomic_agents-2.8.0}/atomic-forge/tools/searxng_search/tool/searxng_search.py +0 -0
  367. {atomic_agents-2.7.4 → atomic_agents-2.8.0}/atomic-forge/tools/tavily_search/README.md +0 -0
  368. {atomic_agents-2.7.4 → atomic_agents-2.8.0}/atomic-forge/tools/tavily_search/pyproject.toml +0 -0
  369. {atomic_agents-2.7.4 → atomic_agents-2.8.0}/atomic-forge/tools/tavily_search/requirements.txt +0 -0
  370. {atomic_agents-2.7.4 → atomic_agents-2.8.0}/atomic-forge/tools/tavily_search/tests/test_tavily_seach.py +0 -0
  371. {atomic_agents-2.7.4 → atomic_agents-2.8.0}/atomic-forge/tools/webpage_scraper/README.md +0 -0
  372. {atomic_agents-2.7.4 → atomic_agents-2.8.0}/atomic-forge/tools/webpage_scraper/pyproject.toml +0 -0
  373. {atomic_agents-2.7.4 → atomic_agents-2.8.0}/atomic-forge/tools/webpage_scraper/requirements.txt +0 -0
  374. {atomic_agents-2.7.4 → atomic_agents-2.8.0}/atomic-forge/tools/webpage_scraper/tests/conftest.py +0 -0
  375. {atomic_agents-2.7.4 → atomic_agents-2.8.0}/atomic-forge/tools/webpage_scraper/tests/test_webpage_scraper.py +0 -0
  376. {atomic_agents-2.7.4 → atomic_agents-2.8.0}/atomic-forge/tools/webpage_scraper/tool/webpage_scraper.py +0 -0
  377. {atomic_agents-2.7.4 → atomic_agents-2.8.0}/atomic-forge/tools/youtube_transcript_scraper/README.md +0 -0
  378. {atomic_agents-2.7.4 → atomic_agents-2.8.0}/atomic-forge/tools/youtube_transcript_scraper/pyproject.toml +0 -0
  379. {atomic_agents-2.7.4 → atomic_agents-2.8.0}/atomic-forge/tools/youtube_transcript_scraper/requirements.txt +0 -0
  380. {atomic_agents-2.7.4 → atomic_agents-2.8.0}/atomic-forge/tools/youtube_transcript_scraper/tests/test_youtube_transcript_scraper.py +0 -0
  381. {atomic_agents-2.7.4 → atomic_agents-2.8.0}/atomic-forge/tools/youtube_transcript_scraper/tool/youtube_transcript_scraper.py +0 -0
  382. {atomic_agents-2.7.4 → atomic_agents-2.8.0}/build_and_deploy.ps1 +0 -0
  383. {atomic_agents-2.7.4 → atomic_agents-2.8.0}/claude-plugin/atomic-agents/LICENSE +0 -0
  384. {atomic_agents-2.7.4 → atomic_agents-2.8.0}/docs/.nojekyll +0 -0
  385. {atomic_agents-2.7.4 → atomic_agents-2.8.0}/docs/Makefile +0 -0
  386. {atomic_agents-2.7.4 → atomic_agents-2.8.0}/docs/_static/logo.png +0 -0
  387. {atomic_agents-2.7.4 → atomic_agents-2.8.0}/docs/api/agents.md +0 -0
  388. {atomic_agents-2.7.4 → atomic_agents-2.8.0}/docs/api/index.md +0 -0
  389. {atomic_agents-2.7.4 → atomic_agents-2.8.0}/docs/api/utils.md +0 -0
  390. {atomic_agents-2.7.4 → atomic_agents-2.8.0}/docs/conf.py +0 -0
  391. {atomic_agents-2.7.4 → atomic_agents-2.8.0}/docs/contributing.md +0 -0
  392. {atomic_agents-2.7.4 → atomic_agents-2.8.0}/docs/examples/index.md +0 -0
  393. {atomic_agents-2.7.4 → atomic_agents-2.8.0}/docs/examples/mcp_agent.md +0 -0
  394. {atomic_agents-2.7.4 → atomic_agents-2.8.0}/docs/guides/deployment.md +0 -0
  395. {atomic_agents-2.7.4 → atomic_agents-2.8.0}/docs/guides/error-handling.md +0 -0
  396. {atomic_agents-2.7.4 → atomic_agents-2.8.0}/docs/guides/hooks.md +0 -0
  397. {atomic_agents-2.7.4 → atomic_agents-2.8.0}/docs/guides/index.md +0 -0
  398. {atomic_agents-2.7.4 → atomic_agents-2.8.0}/docs/guides/logging.md +0 -0
  399. {atomic_agents-2.7.4 → atomic_agents-2.8.0}/docs/guides/memory.md +0 -0
  400. {atomic_agents-2.7.4 → atomic_agents-2.8.0}/docs/guides/orchestration.md +0 -0
  401. {atomic_agents-2.7.4 → atomic_agents-2.8.0}/docs/guides/performance.md +0 -0
  402. {atomic_agents-2.7.4 → atomic_agents-2.8.0}/docs/guides/quickstart.md +0 -0
  403. {atomic_agents-2.7.4 → atomic_agents-2.8.0}/docs/guides/security.md +0 -0
  404. {atomic_agents-2.7.4 → atomic_agents-2.8.0}/docs/guides/testing.md +0 -0
  405. {atomic_agents-2.7.4 → atomic_agents-2.8.0}/docs/make.bat +0 -0
  406. {atomic_agents-2.7.4 → atomic_agents-2.8.0}/greptile.json +0 -0
  407. {atomic_agents-2.7.4 → atomic_agents-2.8.0}/guides/DEV_GUIDE.md +0 -0
  408. {atomic_agents-2.7.4 → atomic_agents-2.8.0}/pytest.ini +0 -0
  409. {atomic_agents-2.7.4 → atomic_agents-2.8.0}/scripts/generate_llms_files.py +0 -0
  410. {atomic_agents-2.7.4 → atomic_agents-2.8.0}/scripts/sync_version.py +0 -0
  411. {atomic_agents-2.7.4 → atomic_agents-2.8.0}/setup.py +0 -0
@@ -9,8 +9,8 @@
9
9
  "plugins": [
10
10
  {
11
11
  "name": "atomic-agents",
12
- "description": "Comprehensive development workflow for building well-organized Atomic Agents applications with specialized agents for schema design, architecture planning, code review, and tool development",
13
- "version": "1.0.0",
12
+ "description": "Skills plus explorer and reviewer subagents for building, scaffolding, understanding, and auditing applications with the Atomic Agents Python framework. Progressive-disclosure references for schemas, agents, tools, context providers, prompts, orchestration, memory, hooks, providers, project structure, and testing — plus isolated-context subagents for codebase mapping and code review, and a new-app scaffolder.",
13
+ "version": "2.0.1",
14
14
  "author": {
15
15
  "name": "BrainBlend AI",
16
16
  "email": "support@brainblend.ai"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: atomic-agents
3
- Version: 2.7.4
3
+ Version: 2.8.0
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
@@ -341,8 +345,18 @@ If you're upgrading from v1.x, please read our comprehensive [**Upgrade Guide**]
341
345
 
342
346
  Atomic Forge is a collection of tools that can be used with Atomic Agents to extend its functionality. Current tools include:
343
347
 
348
+ - arXiv Search
349
+ - BoCha Search
344
350
  - Calculator
351
+ - DateTime
352
+ - Fía Signals
353
+ - Hacker News Search
354
+ - PDF Reader
345
355
  - SearXNG Search
356
+ - Tavily Search
357
+ - Webpage Scraper
358
+ - Weather
359
+ - Wikipedia Search
346
360
  - YouTube Transcript Scraper
347
361
 
348
362
  For more information on using and creating tools, see the [Atomic Forge README](/atomic-forge/README.md).
@@ -404,7 +418,7 @@ uv sync --all-packages
404
418
 
405
419
  ## Provider & Model Compatibility
406
420
 
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).
421
+ 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
422
 
409
423
  ## Contributing
410
424
 
@@ -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
@@ -310,8 +314,18 @@ If you're upgrading from v1.x, please read our comprehensive [**Upgrade Guide**]
310
314
 
311
315
  Atomic Forge is a collection of tools that can be used with Atomic Agents to extend its functionality. Current tools include:
312
316
 
317
+ - arXiv Search
318
+ - BoCha Search
313
319
  - Calculator
320
+ - DateTime
321
+ - Fía Signals
322
+ - Hacker News Search
323
+ - PDF Reader
314
324
  - SearXNG Search
325
+ - Tavily Search
326
+ - Webpage Scraper
327
+ - Weather
328
+ - Wikipedia Search
315
329
  - YouTube Transcript Scraper
316
330
 
317
331
  For more information on using and creating tools, see the [Atomic Forge README](/atomic-forge/README.md).
@@ -373,7 +387,7 @@ uv sync --all-packages
373
387
 
374
388
  ## Provider & Model Compatibility
375
389
 
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).
390
+ 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
391
 
378
392
  ## Contributing
379
393
 
@@ -99,10 +99,18 @@ Each example is self-contained and demonstrates specific patterns and capabiliti
99
99
  **Philosophy:** Tools are NOT bundled with the framework. Instead, users download individual tools for full control and customization.
100
100
 
101
101
  **Available Tools:**
102
+ - `arxiv_search/` - Academic paper search via the public arXiv API
103
+ - `bocha_search/` - BoCha web search
102
104
  - `calculator/` - Mathematical computation tool
105
+ - `datetime_tool/` - Timezone-aware now / parse / convert / shift / diff
106
+ - `fia_signals/` - Crypto market intelligence (regime, signals, yields, gas, trending, wallet risk)
107
+ - `hackernews_search/` - Hacker News search via the free Algolia API
108
+ - `pdf_reader/` - PDF text + metadata extraction (local file or URL, page-range support)
103
109
  - `searxng_search/` - Privacy-focused search integration
104
110
  - `tavily_search/` - Tavily API search tool
111
+ - `weather/` - Current conditions and daily/hourly forecast via Open-Meteo (no key)
105
112
  - `webpage_scraper/` - Web scraping capabilities
113
+ - `wikipedia_search/` - Wikipedia search in any language edition (no key)
106
114
  - `youtube_transcript_scraper/` - YouTube transcript extraction
107
115
 
108
116
  **Benefits:**
@@ -8,6 +8,7 @@ from atomic_agents.context.chat_history import ChatHistory
8
8
  from atomic_agents.context.system_prompt_generator import (
9
9
  BaseDynamicContextProvider,
10
10
  SystemPromptGenerator,
11
+ BaseSystemPromptGenerator,
11
12
  )
12
13
  from atomic_agents.base.base_io_schema import BaseIOSchema
13
14
  from atomic_agents.utils.token_counter import get_token_counter, TokenCountResult
@@ -63,11 +64,15 @@ class BasicChatOutputSchema(BaseIOSchema):
63
64
 
64
65
 
65
66
  class AgentConfig(BaseModel):
66
- client: instructor.client.Instructor = Field(..., description="Client for interacting with the language model.")
67
+ client: instructor.core.client.Instructor = Field(..., description="Client for interacting with the language model.")
67
68
  model: str = Field(default="gpt-5-mini", description="The model to use for generating responses.")
68
69
  history: Optional[ChatHistory] = Field(default=None, description="History component for storing chat history.")
69
- system_prompt_generator: Optional[SystemPromptGenerator] = Field(
70
- default=None, description="Component for generating system prompts."
70
+ system_prompt_generator: Optional[BaseSystemPromptGenerator] = Field(
71
+ default=None,
72
+ description=(
73
+ "Component for generating system prompts. "
74
+ "Defaults to SystemPromptGenerator if no subclass of BaseSystemPromptGenerator is passed."
75
+ ),
71
76
  )
72
77
  system_role: Optional[str] = Field(
73
78
  default="system", description="The role of the system in the conversation. None means no system prompt."
@@ -76,9 +81,25 @@ class AgentConfig(BaseModel):
76
81
  default="assistant",
77
82
  description="The role of the assistant in the conversation. Use 'model' for Gemini, 'assistant' for OpenAI/Anthropic.",
78
83
  )
84
+ tool_result_role: Optional[str] = Field(
85
+ default=None,
86
+ description=(
87
+ "The role to use for mid-conversation tool results and context injections. "
88
+ "Defaults to 'user' when assistant_role is 'model' (Gemini), otherwise 'system'. "
89
+ "Set explicitly to override auto-detection."
90
+ ),
91
+ )
79
92
  model_config = {"arbitrary_types_allowed": True}
80
93
  mode: Mode = Field(default=Mode.TOOLS, description="The Instructor mode used for structured outputs (TOOLS, JSON, etc.).")
81
94
  model_api_parameters: Optional[dict] = Field(None, description="Additional parameters passed to the API provider.")
95
+ max_context_tokens: Optional[int] = Field(
96
+ None,
97
+ description=(
98
+ "Maximum tokens for the full context (system prompt + history + tools). "
99
+ "When exceeded, oldest conversation turns are automatically trimmed to stay within limit. "
100
+ "Uses LiteLLM's provider-agnostic token counter — works with any supported model."
101
+ ),
102
+ )
82
103
 
83
104
 
84
105
  class AtomicAgent[InputSchema: BaseIOSchema, OutputSchema: BaseIOSchema]:
@@ -97,13 +118,15 @@ class AtomicAgent[InputSchema: BaseIOSchema, OutputSchema: BaseIOSchema]:
97
118
  client: Client for interacting with the language model.
98
119
  model (str): The model to use for generating responses.
99
120
  history (ChatHistory): History component for storing chat history.
100
- system_prompt_generator (SystemPromptGenerator): Component for generating system prompts.
121
+ system_prompt_generator (BaseSystemPromptGenerator): Component for generating system prompts.
101
122
  system_role (Optional[str]): The role of the system in the conversation. None means no system prompt.
102
123
  assistant_role (str): The role of the assistant in the conversation. Use 'model' for Gemini, 'assistant' for OpenAI/Anthropic.
103
124
  initial_history (ChatHistory): Initial state of the history.
104
125
  current_user_input (Optional[InputSchema]): The current user input being processed.
105
126
  model_api_parameters (dict): Additional parameters passed to the API provider.
106
127
  - Use this for parameters like 'temperature', 'max_tokens', etc.
128
+ max_context_tokens (Optional[int]): Maximum tokens for the full context. When exceeded,
129
+ oldest conversation turns are automatically trimmed. Uses LiteLLM's token counter.
107
130
 
108
131
  Hook System:
109
132
  The AtomicAgent integrates with Instructor's hook system to provide comprehensive monitoring
@@ -170,10 +193,17 @@ class AtomicAgent[InputSchema: BaseIOSchema, OutputSchema: BaseIOSchema]:
170
193
  self.system_prompt_generator = config.system_prompt_generator or SystemPromptGenerator()
171
194
  self.system_role = config.system_role
172
195
  self.assistant_role = config.assistant_role
196
+ if config.tool_result_role is not None:
197
+ self.tool_result_role = config.tool_result_role
198
+ else:
199
+ # Auto-detect: Gemini drops mid-conversation "system" messages,
200
+ # so default to "user" for Gemini backends (identified by assistant_role="model")
201
+ self.tool_result_role = "user" if config.assistant_role == "model" else "system"
173
202
  self.initial_history = self.history.copy()
174
203
  self.current_user_input = None
175
204
  self.mode = config.mode
176
205
  self.model_api_parameters = config.model_api_parameters or {}
206
+ self.max_context_tokens = config.max_context_tokens
177
207
 
178
208
  # Hook management attributes
179
209
  self._hook_handlers: Dict[str, List[Callable]] = {}
@@ -185,6 +215,21 @@ class AtomicAgent[InputSchema: BaseIOSchema, OutputSchema: BaseIOSchema]:
185
215
  """
186
216
  self.history = self.initial_history.copy()
187
217
 
218
+ def add_tool_result(self, content: BaseIOSchema) -> None:
219
+ """
220
+ Adds a tool result or context injection to the chat history using the
221
+ backend-appropriate role.
222
+
223
+ This method should be used instead of ``history.add_message("system", ...)``
224
+ when injecting tool execution results, resource contents, or other mid-conversation
225
+ context into the agent's history. It automatically uses the correct role for the
226
+ configured backend (e.g. ``"user"`` for Gemini, ``"system"`` for OpenAI/Anthropic).
227
+
228
+ Args:
229
+ content (BaseIOSchema): The tool result or context to inject.
230
+ """
231
+ self.history.add_message(self.tool_result_role, content)
232
+
188
233
  @property
189
234
  def input_schema(self) -> Type[BaseIOSchema]:
190
235
  """
@@ -245,9 +290,79 @@ class AtomicAgent[InputSchema: BaseIOSchema, OutputSchema: BaseIOSchema]:
245
290
  }
246
291
  ]
247
292
 
293
+ def _trim_context(self) -> None:
294
+ """
295
+ Trim oldest conversation turns to stay within max_context_tokens limit.
296
+
297
+ Called before building the messages list. Uses the full context token count
298
+ (system prompt + history + tools) via get_context_token_count().
299
+ Removes oldest turns one at a time until the context fits within the limit.
300
+
301
+ Turn-preserving: always removes complete turns, never individual messages.
302
+
303
+ Raises:
304
+ ValueError: If a single turn itself exceeds max_context_tokens.
305
+ """
306
+ if self.max_context_tokens is None:
307
+ return
308
+
309
+ result = self.get_context_token_count()
310
+ total_tokens = result.total
311
+
312
+ if total_tokens <= self.max_context_tokens:
313
+ return
314
+
315
+ logger = logging.getLogger(__name__)
316
+
317
+ # Collect unique turn_ids in order (oldest first)
318
+ turn_ids_ordered = []
319
+ seen = set()
320
+ for msg in self.history.history:
321
+ if msg.turn_id and msg.turn_id not in seen:
322
+ turn_ids_ordered.append(msg.turn_id)
323
+ seen.add(msg.turn_id)
324
+
325
+ # Remove oldest turns until within limit
326
+ for turn_id in turn_ids_ordered:
327
+ if total_tokens <= self.max_context_tokens:
328
+ break
329
+
330
+ self.history.delete_turn_id(turn_id)
331
+ new_result = self.get_context_token_count()
332
+ removed = total_tokens - new_result.total
333
+ total_tokens = new_result.total
334
+ logger.warning(
335
+ "Context exceeded max_context_tokens (%d). " "Trimmed turn '%s' (%d tokens). New total: %d.",
336
+ self.max_context_tokens,
337
+ turn_id,
338
+ removed,
339
+ total_tokens,
340
+ )
341
+
342
+ if total_tokens > self.max_context_tokens:
343
+ raise ValueError(
344
+ f"max_context_tokens ({self.max_context_tokens}) is smaller than the "
345
+ f"minimum required for a single turn ({total_tokens} tokens). "
346
+ "Increase max_context_tokens or reduce system prompt size."
347
+ )
348
+
248
349
  def _prepare_messages(self):
249
350
  self.messages = self._build_system_messages()
250
- self.messages += self.history.get_history()
351
+ history = self.history.get_history()
352
+ # Remap "system" role messages in history when the backend doesn't support
353
+ # mid-conversation system messages (e.g. Gemini). The initial system prompt
354
+ # is built separately via _build_system_messages() and is unaffected.
355
+ if self.tool_result_role != "system":
356
+ logger = logging.getLogger(__name__)
357
+ for msg in history:
358
+ if msg["role"] == "system":
359
+ logger.debug(
360
+ "Remapping mid-conversation 'system' message to '%s' "
361
+ "(backend does not support mid-conversation system messages).",
362
+ self.tool_result_role,
363
+ )
364
+ msg["role"] = self.tool_result_role
365
+ self.messages += history
251
366
 
252
367
  def _get_completion_kwargs(self) -> Dict[str, Any]:
253
368
  """
@@ -444,8 +559,12 @@ class AtomicAgent[InputSchema: BaseIOSchema, OutputSchema: BaseIOSchema]:
444
559
  OutputSchema: The response from the chat agent.
445
560
  """
446
561
  assert not isinstance(
447
- self.client, instructor.client.AsyncInstructor
562
+ self.client, instructor.core.client.AsyncInstructor
448
563
  ), "The run method is not supported for async clients. Use run_async instead."
564
+
565
+ # Trim history BEFORE adding new user message to protect the new input
566
+ self._trim_context()
567
+
449
568
  if user_input:
450
569
  self.history.initialize_turn()
451
570
  self.current_user_input = user_input
@@ -477,8 +596,11 @@ class AtomicAgent[InputSchema: BaseIOSchema, OutputSchema: BaseIOSchema]:
477
596
  OutputSchema: The final response from the chat agent.
478
597
  """
479
598
  assert not isinstance(
480
- self.client, instructor.client.AsyncInstructor
599
+ self.client, instructor.core.client.AsyncInstructor
481
600
  ), "The run_stream method is not supported for async clients. Use run_async instead."
601
+
602
+ self._trim_context()
603
+
482
604
  if user_input:
483
605
  self.history.initialize_turn()
484
606
  self.current_user_input = user_input
@@ -519,7 +641,10 @@ class AtomicAgent[InputSchema: BaseIOSchema, OutputSchema: BaseIOSchema]:
519
641
  NotAsyncIterableError: If used as an async generator (in an async for loop).
520
642
  Use run_async_stream() method instead for streaming responses.
521
643
  """
522
- assert isinstance(self.client, instructor.client.AsyncInstructor), "The run_async method is for async clients."
644
+ assert isinstance(self.client, instructor.core.client.AsyncInstructor), "The run_async method is for async clients."
645
+
646
+ self._trim_context()
647
+
523
648
  if user_input:
524
649
  self.history.initialize_turn()
525
650
  self.current_user_input = user_input
@@ -545,7 +670,8 @@ class AtomicAgent[InputSchema: BaseIOSchema, OutputSchema: BaseIOSchema]:
545
670
  Yields:
546
671
  OutputSchema: Partial responses from the chat agent.
547
672
  """
548
- assert isinstance(self.client, instructor.client.AsyncInstructor), "The run_async method is for async clients."
673
+ assert isinstance(self.client, instructor.core.client.AsyncInstructor), "The run_async method is for async clients."
674
+ self._trim_context()
549
675
  if user_input:
550
676
  self.history.initialize_turn()
551
677
  self.current_user_input = user_input
@@ -848,7 +848,7 @@ class MCPFactory:
848
848
  if isinstance(content, str):
849
849
  texts.append(content)
850
850
  elif isinstance(content, dict):
851
- texts.append(content.get("text"))
851
+ texts.append(content.get("text", ""))
852
852
  elif getattr(content, "text", None):
853
853
  texts.append(content.text) # type: ignore
854
854
  else:
@@ -2,6 +2,7 @@ from .chat_history import Message, ChatHistory
2
2
  from .system_prompt_generator import (
3
3
  BaseDynamicContextProvider,
4
4
  SystemPromptGenerator,
5
+ BaseSystemPromptGenerator,
5
6
  )
6
7
 
7
8
  __all__ = [
@@ -9,4 +10,5 @@ __all__ = [
9
10
  "ChatHistory",
10
11
  "SystemPromptGenerator",
11
12
  "BaseDynamicContextProvider",
13
+ "BaseSystemPromptGenerator",
12
14
  ]
@@ -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
@@ -14,7 +14,19 @@ class BaseDynamicContextProvider(ABC):
14
14
  return self.get_info()
15
15
 
16
16
 
17
- class SystemPromptGenerator:
17
+ class BaseSystemPromptGenerator(ABC):
18
+ def __init__(self, context_providers: Optional[Dict[str, BaseDynamicContextProvider]] = None):
19
+ self.context_providers = context_providers or {}
20
+
21
+ @abstractmethod
22
+ def generate_prompt(self) -> str:
23
+ pass
24
+
25
+ def __repr__(self) -> str:
26
+ return f"{self.__class__.__name__} (providers={list(self.context_providers)})"
27
+
28
+
29
+ class SystemPromptGenerator(BaseSystemPromptGenerator):
18
30
  def __init__(
19
31
  self,
20
32
  background: Optional[List[str]] = None,
@@ -22,10 +34,10 @@ class SystemPromptGenerator:
22
34
  output_instructions: Optional[List[str]] = None,
23
35
  context_providers: Optional[Dict[str, BaseDynamicContextProvider]] = None,
24
36
  ):
37
+ super().__init__(context_providers=context_providers)
25
38
  self.background = background or ["This is a conversation with a helpful and friendly AI assistant."]
26
39
  self.steps = steps or []
27
40
  self.output_instructions = output_instructions or []
28
- self.context_providers = context_providers or {}
29
41
 
30
42
  self.output_instructions.extend(
31
43
  [