msgflux 0.2.0__tar.gz → 0.4.1__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 (480) hide show
  1. {msgflux-0.2.0 → msgflux-0.4.1}/.pre-commit-config.yaml +2 -2
  2. msgflux-0.4.1/CHANGELOG.md +35 -0
  3. {msgflux-0.2.0 → msgflux-0.4.1}/PKG-INFO +1 -1
  4. {msgflux-0.2.0 → msgflux-0.4.1}/docs/anatomy/index.md +2 -0
  5. msgflux-0.4.1/docs/anatomy/llm-as-a-verifier.md +317 -0
  6. {msgflux-0.2.0 → msgflux-0.4.1}/docs/dependency-management.md +21 -13
  7. {msgflux-0.2.0 → msgflux-0.4.1}/docs/index.md +2 -0
  8. {msgflux-0.2.0 → msgflux-0.4.1}/docs/learn/models/chat_completion.md +178 -18
  9. {msgflux-0.2.0 → msgflux-0.4.1}/docs/learn/nn/agent/reasoning.md +5 -6
  10. {msgflux-0.2.0 → msgflux-0.4.1}/docs/learn/nn/agent/tools.md +54 -0
  11. msgflux-0.4.1/docs/learn/retrievers/web.md +730 -0
  12. msgflux-0.4.1/docs/learn/verifiers.md +583 -0
  13. {msgflux-0.2.0 → msgflux-0.4.1}/mkdocs.yml +1 -0
  14. msgflux-0.4.1/src/msgflux/data/retrievers/providers/arxiv.py +229 -0
  15. msgflux-0.4.1/src/msgflux/data/retrievers/providers/brave.py +149 -0
  16. msgflux-0.4.1/src/msgflux/data/retrievers/providers/exa.py +196 -0
  17. msgflux-0.4.1/src/msgflux/data/retrievers/providers/linkup.py +162 -0
  18. msgflux-0.4.1/src/msgflux/data/retrievers/providers/serpapi.py +225 -0
  19. msgflux-0.4.1/src/msgflux/data/retrievers/providers/tavily.py +180 -0
  20. {msgflux-0.2.0 → msgflux-0.4.1}/src/msgflux/data/retrievers/retriever.py +5 -0
  21. msgflux-0.4.1/src/msgflux/generation/verifiers/__init__.py +62 -0
  22. msgflux-0.4.1/src/msgflux/generation/verifiers/formatters.py +149 -0
  23. msgflux-0.4.1/src/msgflux/generation/verifiers/llm_as_a_verifier.py +1633 -0
  24. msgflux-0.4.1/src/msgflux/models/providers/brave.py +27 -0
  25. msgflux-0.4.1/src/msgflux/models/providers/exa.py +57 -0
  26. {msgflux-0.2.0 → msgflux-0.4.1}/src/msgflux/models/providers/groq.py +1 -1
  27. {msgflux-0.2.0 → msgflux-0.4.1}/src/msgflux/models/providers/ollama.py +1 -1
  28. {msgflux-0.2.0 → msgflux-0.4.1}/src/msgflux/models/providers/openai.py +160 -35
  29. {msgflux-0.2.0 → msgflux-0.4.1}/src/msgflux/models/providers/openrouter.py +9 -1
  30. {msgflux-0.2.0 → msgflux-0.4.1}/src/msgflux/models/providers/vllm.py +1 -1
  31. {msgflux-0.2.0 → msgflux-0.4.1}/src/msgflux/tools/builtin/__init__.py +2 -1
  32. msgflux-0.4.1/src/msgflux/tools/builtin/web_search.py +257 -0
  33. msgflux-0.4.1/src/msgflux/version.py +1 -0
  34. msgflux-0.4.1/tests/data/retrievers/providers/test_arxiv.py +173 -0
  35. msgflux-0.4.1/tests/data/retrievers/providers/test_brave.py +114 -0
  36. msgflux-0.4.1/tests/data/retrievers/providers/test_exa.py +174 -0
  37. msgflux-0.4.1/tests/data/retrievers/providers/test_linkup.py +149 -0
  38. msgflux-0.4.1/tests/data/retrievers/providers/test_serpapi.py +275 -0
  39. msgflux-0.4.1/tests/data/retrievers/providers/test_tavily.py +146 -0
  40. msgflux-0.4.1/tests/generation/test_verifiers.py +842 -0
  41. msgflux-0.4.1/tests/models/providers/test_brave.py +35 -0
  42. msgflux-0.4.1/tests/models/providers/test_exa.py +49 -0
  43. {msgflux-0.2.0 → msgflux-0.4.1}/tests/models/providers/test_openai.py +203 -0
  44. msgflux-0.4.1/tests/models/providers/test_openrouter.py +96 -0
  45. {msgflux-0.2.0 → msgflux-0.4.1}/tests/models/providers/test_vllm.py +54 -0
  46. msgflux-0.4.1/tests/tools/builtin/test_web_search.py +303 -0
  47. {msgflux-0.2.0 → msgflux-0.4.1}/uv.lock +61 -163
  48. msgflux-0.2.0/CHANGELOG.md +0 -17
  49. msgflux-0.2.0/docs/learn/retrievers/web.md +0 -196
  50. msgflux-0.2.0/src/msgflux/version.py +0 -1
  51. {msgflux-0.2.0 → msgflux-0.4.1}/.github/CODEOWNERS +0 -0
  52. {msgflux-0.2.0 → msgflux-0.4.1}/.github/SECURITY.md +0 -0
  53. {msgflux-0.2.0 → msgflux-0.4.1}/.github/dependabot.yml +0 -0
  54. {msgflux-0.2.0 → msgflux-0.4.1}/.github/labeler.yml +0 -0
  55. {msgflux-0.2.0 → msgflux-0.4.1}/.github/pull_request_template.md +0 -0
  56. {msgflux-0.2.0 → msgflux-0.4.1}/.github/release-drafter.yml +0 -0
  57. {msgflux-0.2.0 → msgflux-0.4.1}/.github/workflows/ci.yml +0 -0
  58. {msgflux-0.2.0 → msgflux-0.4.1}/.github/workflows/docs.yml +0 -0
  59. {msgflux-0.2.0 → msgflux-0.4.1}/.github/workflows/labeler.yml +0 -0
  60. {msgflux-0.2.0 → msgflux-0.4.1}/.github/workflows/merge-bot.yml +0 -0
  61. {msgflux-0.2.0 → msgflux-0.4.1}/.github/workflows/pre-commit-autoupdate.yml +0 -0
  62. {msgflux-0.2.0 → msgflux-0.4.1}/.github/workflows/publish.yml +0 -0
  63. {msgflux-0.2.0 → msgflux-0.4.1}/.github/workflows/release-drafter.yml +0 -0
  64. {msgflux-0.2.0 → msgflux-0.4.1}/.github/workflows/validate-release.yml +0 -0
  65. {msgflux-0.2.0 → msgflux-0.4.1}/.gitignore +0 -0
  66. {msgflux-0.2.0 → msgflux-0.4.1}/.python-version +0 -0
  67. {msgflux-0.2.0 → msgflux-0.4.1}/.readthedocs.yaml +0 -0
  68. {msgflux-0.2.0 → msgflux-0.4.1}/CONTRIBUTING.md +0 -0
  69. {msgflux-0.2.0 → msgflux-0.4.1}/LICENSE +0 -0
  70. {msgflux-0.2.0 → msgflux-0.4.1}/README.md +0 -0
  71. {msgflux-0.2.0 → msgflux-0.4.1}/docs/CHANGELOG.md +0 -0
  72. {msgflux-0.2.0 → msgflux-0.4.1}/docs/CNAME +0 -0
  73. {msgflux-0.2.0 → msgflux-0.4.1}/docs/_includes/init_chat_completion_model.md +0 -0
  74. {msgflux-0.2.0 → msgflux-0.4.1}/docs/_includes/install.md +0 -0
  75. {msgflux-0.2.0 → msgflux-0.4.1}/docs/_includes/install_openai.md +0 -0
  76. {msgflux-0.2.0 → msgflux-0.4.1}/docs/anatomy/agent.md +0 -0
  77. {msgflux-0.2.0 → msgflux-0.4.1}/docs/anatomy/chat-schema-utils.md +0 -0
  78. {msgflux-0.2.0 → msgflux-0.4.1}/docs/anatomy/dict-lowering-and-restoration.md +0 -0
  79. {msgflux-0.2.0 → msgflux-0.4.1}/docs/anatomy/logical-vs-provider-schema.md +0 -0
  80. {msgflux-0.2.0 → msgflux-0.4.1}/docs/anatomy/msgspec-transport-lowering.md +0 -0
  81. {msgflux-0.2.0 → msgflux-0.4.1}/docs/anatomy/openai-chat-completion.md +0 -0
  82. {msgflux-0.2.0 → msgflux-0.4.1}/docs/anatomy/react-provider-schemas.md +0 -0
  83. {msgflux-0.2.0 → msgflux-0.4.1}/docs/anatomy/signatures.md +0 -0
  84. {msgflux-0.2.0 → msgflux-0.4.1}/docs/anatomy/tool-flow-control.md +0 -0
  85. {msgflux-0.2.0 → msgflux-0.4.1}/docs/anatomy/tool-library.md +0 -0
  86. {msgflux-0.2.0 → msgflux-0.4.1}/docs/api-reference/databases/database.md +0 -0
  87. {msgflux-0.2.0 → msgflux-0.4.1}/docs/api-reference/databases/types/kv.md +0 -0
  88. {msgflux-0.2.0 → msgflux-0.4.1}/docs/api-reference/databases/types/vector.md +0 -0
  89. {msgflux-0.2.0 → msgflux-0.4.1}/docs/api-reference/models/model.md +0 -0
  90. {msgflux-0.2.0 → msgflux-0.4.1}/docs/api-reference/models/model_gateway.md +0 -0
  91. {msgflux-0.2.0 → msgflux-0.4.1}/docs/api-reference/models/types/chat_completion.md +0 -0
  92. {msgflux-0.2.0 → msgflux-0.4.1}/docs/api-reference/models/types/image_classifier.md +0 -0
  93. {msgflux-0.2.0 → msgflux-0.4.1}/docs/api-reference/models/types/image_embedder.md +0 -0
  94. {msgflux-0.2.0 → msgflux-0.4.1}/docs/api-reference/models/types/image_text_to_image.md +0 -0
  95. {msgflux-0.2.0 → msgflux-0.4.1}/docs/api-reference/models/types/moderation.md +0 -0
  96. {msgflux-0.2.0 → msgflux-0.4.1}/docs/api-reference/models/types/speech_to_text.md +0 -0
  97. {msgflux-0.2.0 → msgflux-0.4.1}/docs/api-reference/models/types/text_classifier.md +0 -0
  98. {msgflux-0.2.0 → msgflux-0.4.1}/docs/api-reference/models/types/text_embedder.md +0 -0
  99. {msgflux-0.2.0 → msgflux-0.4.1}/docs/api-reference/models/types/text_reranker.md +0 -0
  100. {msgflux-0.2.0 → msgflux-0.4.1}/docs/api-reference/models/types/text_to_image.md +0 -0
  101. {msgflux-0.2.0 → msgflux-0.4.1}/docs/api-reference/models/types/text_to_speech.md +0 -0
  102. {msgflux-0.2.0 → msgflux-0.4.1}/docs/api-reference/nn/functional.md +0 -0
  103. {msgflux-0.2.0 → msgflux-0.4.1}/docs/api-reference/nn/modules/agent.md +0 -0
  104. {msgflux-0.2.0 → msgflux-0.4.1}/docs/api-reference/nn/modules/module.md +0 -0
  105. {msgflux-0.2.0 → msgflux-0.4.1}/docs/api-reference/nn/modules/module_dict.md +0 -0
  106. {msgflux-0.2.0 → msgflux-0.4.1}/docs/api-reference/nn/modules/module_list.md +0 -0
  107. {msgflux-0.2.0 → msgflux-0.4.1}/docs/api-reference/nn/modules/predictor.md +0 -0
  108. {msgflux-0.2.0 → msgflux-0.4.1}/docs/api-reference/nn/modules/searcher.md +0 -0
  109. {msgflux-0.2.0 → msgflux-0.4.1}/docs/api-reference/nn/modules/sequential.md +0 -0
  110. {msgflux-0.2.0 → msgflux-0.4.1}/docs/api-reference/nn/modules/speaker.md +0 -0
  111. {msgflux-0.2.0 → msgflux-0.4.1}/docs/api-reference/nn/modules/tool.md +0 -0
  112. {msgflux-0.2.0 → msgflux-0.4.1}/docs/api-reference/nn/modules/transcriber.md +0 -0
  113. {msgflux-0.2.0 → msgflux-0.4.1}/docs/api-reference.md +0 -0
  114. {msgflux-0.2.0 → msgflux-0.4.1}/docs/assets/logo-msgflux-horizon.png +0 -0
  115. {msgflux-0.2.0 → msgflux-0.4.1}/docs/assets/logo.png +0 -0
  116. {msgflux-0.2.0 → msgflux-0.4.1}/docs/assets/msgflux-wordmark.png +0 -0
  117. {msgflux-0.2.0 → msgflux-0.4.1}/docs/assets/msgflux.png +0 -0
  118. {msgflux-0.2.0 → msgflux-0.4.1}/docs/assets/tmd-mascot.png +0 -0
  119. {msgflux-0.2.0 → msgflux-0.4.1}/docs/blog/.authors.yml +0 -0
  120. {msgflux-0.2.0 → msgflux-0.4.1}/docs/blog/index.md +0 -0
  121. {msgflux-0.2.0 → msgflux-0.4.1}/docs/blog/posts/.meta.yml +0 -0
  122. {msgflux-0.2.0 → msgflux-0.4.1}/docs/blog/posts/26-04/why-msgflux-exists.md +0 -0
  123. {msgflux-0.2.0 → msgflux-0.4.1}/docs/changelog.md +0 -0
  124. {msgflux-0.2.0 → msgflux-0.4.1}/docs/hooks/copy_markdown.py +0 -0
  125. {msgflux-0.2.0 → msgflux-0.4.1}/docs/learn/dotdict.md +0 -0
  126. {msgflux-0.2.0 → msgflux-0.4.1}/docs/learn/inline.md +0 -0
  127. {msgflux-0.2.0 → msgflux-0.4.1}/docs/learn/models/image_text_to_image.md +0 -0
  128. {msgflux-0.2.0 → msgflux-0.4.1}/docs/learn/models/model.md +0 -0
  129. {msgflux-0.2.0 → msgflux-0.4.1}/docs/learn/models/model_gateway.md +0 -0
  130. {msgflux-0.2.0 → msgflux-0.4.1}/docs/learn/models/moderation.md +0 -0
  131. {msgflux-0.2.0 → msgflux-0.4.1}/docs/learn/models/speech_to_text.md +0 -0
  132. {msgflux-0.2.0 → msgflux-0.4.1}/docs/learn/models/text_classifier.md +0 -0
  133. {msgflux-0.2.0 → msgflux-0.4.1}/docs/learn/models/text_embedder.md +0 -0
  134. {msgflux-0.2.0 → msgflux-0.4.1}/docs/learn/models/text_reranker.md +0 -0
  135. {msgflux-0.2.0 → msgflux-0.4.1}/docs/learn/models/text_to_image.md +0 -0
  136. {msgflux-0.2.0 → msgflux-0.4.1}/docs/learn/models/text_to_speech.md +0 -0
  137. {msgflux-0.2.0 → msgflux-0.4.1}/docs/learn/nn/agent/async.md +0 -0
  138. {msgflux-0.2.0 → msgflux-0.4.1}/docs/learn/nn/agent/debug.md +0 -0
  139. {msgflux-0.2.0 → msgflux-0.4.1}/docs/learn/nn/agent/generation-schemas.md +0 -0
  140. {msgflux-0.2.0 → msgflux-0.4.1}/docs/learn/nn/agent/hooks.md +0 -0
  141. {msgflux-0.2.0 → msgflux-0.4.1}/docs/learn/nn/agent/index.md +0 -0
  142. {msgflux-0.2.0 → msgflux-0.4.1}/docs/learn/nn/agent/model-gateway.md +0 -0
  143. {msgflux-0.2.0 → msgflux-0.4.1}/docs/learn/nn/agent/prefilling.md +0 -0
  144. {msgflux-0.2.0 → msgflux-0.4.1}/docs/learn/nn/agent/quickstart.md +0 -0
  145. {msgflux-0.2.0 → msgflux-0.4.1}/docs/learn/nn/agent/signatures.md +0 -0
  146. {msgflux-0.2.0 → msgflux-0.4.1}/docs/learn/nn/agent/streaming.md +0 -0
  147. {msgflux-0.2.0 → msgflux-0.4.1}/docs/learn/nn/agent/system-prompt.md +0 -0
  148. {msgflux-0.2.0 → msgflux-0.4.1}/docs/learn/nn/agent/task-and-context.md +0 -0
  149. {msgflux-0.2.0 → msgflux-0.4.1}/docs/learn/nn/agent/vars.md +0 -0
  150. {msgflux-0.2.0 → msgflux-0.4.1}/docs/learn/nn/functional.md +0 -0
  151. {msgflux-0.2.0 → msgflux-0.4.1}/docs/learn/nn/mediamaker.md +0 -0
  152. {msgflux-0.2.0 → msgflux-0.4.1}/docs/learn/nn/message.md +0 -0
  153. {msgflux-0.2.0 → msgflux-0.4.1}/docs/learn/nn/module/composing.md +0 -0
  154. {msgflux-0.2.0 → msgflux-0.4.1}/docs/learn/nn/module/core-concepts.md +0 -0
  155. {msgflux-0.2.0 → msgflux-0.4.1}/docs/learn/nn/module/forward-and-async.md +0 -0
  156. {msgflux-0.2.0 → msgflux-0.4.1}/docs/learn/nn/module/index.md +0 -0
  157. {msgflux-0.2.0 → msgflux-0.4.1}/docs/learn/nn/module/module-dict.md +0 -0
  158. {msgflux-0.2.0 → msgflux-0.4.1}/docs/learn/nn/module/module-list.md +0 -0
  159. {msgflux-0.2.0 → msgflux-0.4.1}/docs/learn/nn/module/sequential.md +0 -0
  160. {msgflux-0.2.0 → msgflux-0.4.1}/docs/learn/nn/module/visualization.md +0 -0
  161. {msgflux-0.2.0 → msgflux-0.4.1}/docs/learn/nn/predictor.md +0 -0
  162. {msgflux-0.2.0 → msgflux-0.4.1}/docs/learn/nn/searcher.md +0 -0
  163. {msgflux-0.2.0 → msgflux-0.4.1}/docs/learn/nn/speaker.md +0 -0
  164. {msgflux-0.2.0 → msgflux-0.4.1}/docs/learn/nn/transcriber.md +0 -0
  165. {msgflux-0.2.0 → msgflux-0.4.1}/docs/learn/parsers.md +0 -0
  166. {msgflux-0.2.0 → msgflux-0.4.1}/docs/learn/retrievers/fuzzy.md +0 -0
  167. {msgflux-0.2.0 → msgflux-0.4.1}/docs/learn/retrievers/lexical.md +0 -0
  168. {msgflux-0.2.0 → msgflux-0.4.1}/docs/learn/retrievers/retriever.md +0 -0
  169. {msgflux-0.2.0 → msgflux-0.4.1}/docs/learn/telemetry.md +0 -0
  170. {msgflux-0.2.0 → msgflux-0.4.1}/docs/stylesheets/extra.css +0 -0
  171. {msgflux-0.2.0 → msgflux-0.4.1}/docs/tutorials/ad-focus-group.md +0 -0
  172. {msgflux-0.2.0 → msgflux-0.4.1}/docs/tutorials/advisor-specialist-tool.md +0 -0
  173. {msgflux-0.2.0 → msgflux-0.4.1}/docs/tutorials/call-transcript-analysis.md +0 -0
  174. {msgflux-0.2.0 → msgflux-0.4.1}/docs/tutorials/deal-briefing-generator.md +0 -0
  175. {msgflux-0.2.0 → msgflux-0.4.1}/docs/tutorials/email-auto-responder.md +0 -0
  176. {msgflux-0.2.0 → msgflux-0.4.1}/docs/tutorials/food-delivery-assistant.md +0 -0
  177. {msgflux-0.2.0 → msgflux-0.4.1}/docs/tutorials/index.md +0 -0
  178. {msgflux-0.2.0 → msgflux-0.4.1}/docs/tutorials/intent-router.md +0 -0
  179. {msgflux-0.2.0 → msgflux-0.4.1}/docs/tutorials/lead-scoring.md +0 -0
  180. {msgflux-0.2.0 → msgflux-0.4.1}/docs/tutorials/meeting-action-items.md +0 -0
  181. {msgflux-0.2.0 → msgflux-0.4.1}/docs/tutorials/meeting-assistant.md +0 -0
  182. {msgflux-0.2.0 → msgflux-0.4.1}/docs/tutorials/pix-assistant.md +0 -0
  183. {msgflux-0.2.0 → msgflux-0.4.1}/docs/tutorials/plan-tool-with-root-context.md +0 -0
  184. {msgflux-0.2.0 → msgflux-0.4.1}/docs/tutorials/product-poster.md +0 -0
  185. {msgflux-0.2.0 → msgflux-0.4.1}/docs/tutorials/restaurant-supply-assistant.md +0 -0
  186. {msgflux-0.2.0 → msgflux-0.4.1}/docs/tutorials/signature-router.md +0 -0
  187. {msgflux-0.2.0 → msgflux-0.4.1}/docs/tutorials/streaming-support-triage.md +0 -0
  188. {msgflux-0.2.0 → msgflux-0.4.1}/docs/tutorials/support-ticket-router.md +0 -0
  189. {msgflux-0.2.0 → msgflux-0.4.1}/docs/tutorials/visit-report.md +0 -0
  190. {msgflux-0.2.0 → msgflux-0.4.1}/docs/tutorials/workplace-incident-reporter.md +0 -0
  191. {msgflux-0.2.0 → msgflux-0.4.1}/docs/tutorials/youtube-cut-detector.md +0 -0
  192. {msgflux-0.2.0 → msgflux-0.4.1}/examples/ad_focus_group.py +0 -0
  193. {msgflux-0.2.0 → msgflux-0.4.1}/examples/advisor_specialist_tool.py +0 -0
  194. {msgflux-0.2.0 → msgflux-0.4.1}/examples/call_transcript_analysis.py +0 -0
  195. {msgflux-0.2.0 → msgflux-0.4.1}/examples/deal_briefing_generator.py +0 -0
  196. {msgflux-0.2.0 → msgflux-0.4.1}/examples/food_delivery_assistant.py +0 -0
  197. {msgflux-0.2.0 → msgflux-0.4.1}/examples/intent-router.py +0 -0
  198. {msgflux-0.2.0 → msgflux-0.4.1}/examples/lead_scoring.py +0 -0
  199. {msgflux-0.2.0 → msgflux-0.4.1}/examples/meeting_action_items.py +0 -0
  200. {msgflux-0.2.0 → msgflux-0.4.1}/examples/meeting_assistant.py +0 -0
  201. {msgflux-0.2.0 → msgflux-0.4.1}/examples/pix_assistant.py +0 -0
  202. {msgflux-0.2.0 → msgflux-0.4.1}/examples/plan_tool_with_root_history.py +0 -0
  203. {msgflux-0.2.0 → msgflux-0.4.1}/examples/restaurant-supply-assistant.py +0 -0
  204. {msgflux-0.2.0 → msgflux-0.4.1}/examples/streaming_support_triage.py +0 -0
  205. {msgflux-0.2.0 → msgflux-0.4.1}/examples/visit_report.py +0 -0
  206. {msgflux-0.2.0 → msgflux-0.4.1}/examples/youtube_cut_detector.py +0 -0
  207. {msgflux-0.2.0 → msgflux-0.4.1}/pyproject.toml +0 -0
  208. {msgflux-0.2.0 → msgflux-0.4.1}/scripts/release.sh +0 -0
  209. {msgflux-0.2.0 → msgflux-0.4.1}/scripts/setup-branch-protection.sh +0 -0
  210. {msgflux-0.2.0 → msgflux-0.4.1}/scripts/setup-labels.sh +0 -0
  211. {msgflux-0.2.0 → msgflux-0.4.1}/scripts/svg_render.py +0 -0
  212. {msgflux-0.2.0 → msgflux-0.4.1}/src/msgflux/__init__.py +0 -0
  213. {msgflux-0.2.0 → msgflux-0.4.1}/src/msgflux/_private/__init__.py +0 -0
  214. {msgflux-0.2.0 → msgflux-0.4.1}/src/msgflux/_private/client.py +0 -0
  215. {msgflux-0.2.0 → msgflux-0.4.1}/src/msgflux/_private/core.py +0 -0
  216. {msgflux-0.2.0 → msgflux-0.4.1}/src/msgflux/_private/executor.py +0 -0
  217. {msgflux-0.2.0 → msgflux-0.4.1}/src/msgflux/_private/response.py +0 -0
  218. {msgflux-0.2.0 → msgflux-0.4.1}/src/msgflux/auto/__init__.py +0 -0
  219. {msgflux-0.2.0 → msgflux-0.4.1}/src/msgflux/auto/params.py +0 -0
  220. {msgflux-0.2.0 → msgflux-0.4.1}/src/msgflux/cache.py +0 -0
  221. {msgflux-0.2.0 → msgflux-0.4.1}/src/msgflux/core/__init__.py +0 -0
  222. {msgflux-0.2.0 → msgflux-0.4.1}/src/msgflux/core/dotdict.py +0 -0
  223. {msgflux-0.2.0 → msgflux-0.4.1}/src/msgflux/core/examples.py +0 -0
  224. {msgflux-0.2.0 → msgflux-0.4.1}/src/msgflux/core/message.py +0 -0
  225. {msgflux-0.2.0 → msgflux-0.4.1}/src/msgflux/core/registry.py +0 -0
  226. {msgflux-0.2.0 → msgflux-0.4.1}/src/msgflux/data/__init__.py +0 -0
  227. {msgflux-0.2.0 → msgflux-0.4.1}/src/msgflux/data/audio.py +0 -0
  228. {msgflux-0.2.0 → msgflux-0.4.1}/src/msgflux/data/dbs/__init__.py +0 -0
  229. {msgflux-0.2.0 → msgflux-0.4.1}/src/msgflux/data/dbs/base.py +0 -0
  230. {msgflux-0.2.0 → msgflux-0.4.1}/src/msgflux/data/dbs/db.py +0 -0
  231. {msgflux-0.2.0 → msgflux-0.4.1}/src/msgflux/data/dbs/providers/__init__.py +0 -0
  232. {msgflux-0.2.0 → msgflux-0.4.1}/src/msgflux/data/dbs/providers/cachetools.py +0 -0
  233. {msgflux-0.2.0 → msgflux-0.4.1}/src/msgflux/data/dbs/providers/diskcache.py +0 -0
  234. {msgflux-0.2.0 → msgflux-0.4.1}/src/msgflux/data/dbs/providers/faiss.py +0 -0
  235. {msgflux-0.2.0 → msgflux-0.4.1}/src/msgflux/data/dbs/registry.py +0 -0
  236. {msgflux-0.2.0 → msgflux-0.4.1}/src/msgflux/data/dbs/response.py +0 -0
  237. {msgflux-0.2.0 → msgflux-0.4.1}/src/msgflux/data/dbs/types.py +0 -0
  238. {msgflux-0.2.0 → msgflux-0.4.1}/src/msgflux/data/parsers/__init__.py +0 -0
  239. {msgflux-0.2.0 → msgflux-0.4.1}/src/msgflux/data/parsers/base.py +0 -0
  240. {msgflux-0.2.0 → msgflux-0.4.1}/src/msgflux/data/parsers/parser.py +0 -0
  241. {msgflux-0.2.0 → msgflux-0.4.1}/src/msgflux/data/parsers/providers/__init__.py +0 -0
  242. {msgflux-0.2.0 → msgflux-0.4.1}/src/msgflux/data/parsers/providers/csv_parser.py +0 -0
  243. {msgflux-0.2.0 → msgflux-0.4.1}/src/msgflux/data/parsers/providers/email_parser.py +0 -0
  244. {msgflux-0.2.0 → msgflux-0.4.1}/src/msgflux/data/parsers/providers/html_parser.py +0 -0
  245. {msgflux-0.2.0 → msgflux-0.4.1}/src/msgflux/data/parsers/providers/openpyxl.py +0 -0
  246. {msgflux-0.2.0 → msgflux-0.4.1}/src/msgflux/data/parsers/providers/pypdf.py +0 -0
  247. {msgflux-0.2.0 → msgflux-0.4.1}/src/msgflux/data/parsers/providers/python_docx.py +0 -0
  248. {msgflux-0.2.0 → msgflux-0.4.1}/src/msgflux/data/parsers/providers/python_pptx.py +0 -0
  249. {msgflux-0.2.0 → msgflux-0.4.1}/src/msgflux/data/parsers/registry.py +0 -0
  250. {msgflux-0.2.0 → msgflux-0.4.1}/src/msgflux/data/parsers/response.py +0 -0
  251. {msgflux-0.2.0 → msgflux-0.4.1}/src/msgflux/data/parsers/types.py +0 -0
  252. {msgflux-0.2.0 → msgflux-0.4.1}/src/msgflux/data/retrievers/__init__.py +0 -0
  253. {msgflux-0.2.0 → msgflux-0.4.1}/src/msgflux/data/retrievers/base.py +0 -0
  254. {msgflux-0.2.0 → msgflux-0.4.1}/src/msgflux/data/retrievers/providers/__init__.py +0 -0
  255. {msgflux-0.2.0 → msgflux-0.4.1}/src/msgflux/data/retrievers/providers/bm25.py +0 -0
  256. {msgflux-0.2.0 → msgflux-0.4.1}/src/msgflux/data/retrievers/providers/bm25s.py +0 -0
  257. {msgflux-0.2.0 → msgflux-0.4.1}/src/msgflux/data/retrievers/providers/rank_bm25.py +0 -0
  258. {msgflux-0.2.0 → msgflux-0.4.1}/src/msgflux/data/retrievers/providers/rapidfuzz.py +0 -0
  259. {msgflux-0.2.0 → msgflux-0.4.1}/src/msgflux/data/retrievers/providers/wikipedia.py +0 -0
  260. {msgflux-0.2.0 → msgflux-0.4.1}/src/msgflux/data/retrievers/registry.py +0 -0
  261. {msgflux-0.2.0 → msgflux-0.4.1}/src/msgflux/data/retrievers/types.py +0 -0
  262. {msgflux-0.2.0 → msgflux-0.4.1}/src/msgflux/data/types/__init__.py +0 -0
  263. {msgflux-0.2.0 → msgflux-0.4.1}/src/msgflux/data/types/audio.py +0 -0
  264. {msgflux-0.2.0 → msgflux-0.4.1}/src/msgflux/data/types/base.py +0 -0
  265. {msgflux-0.2.0 → msgflux-0.4.1}/src/msgflux/data/types/file.py +0 -0
  266. {msgflux-0.2.0 → msgflux-0.4.1}/src/msgflux/data/types/image.py +0 -0
  267. {msgflux-0.2.0 → msgflux-0.4.1}/src/msgflux/data/types/video.py +0 -0
  268. {msgflux-0.2.0 → msgflux-0.4.1}/src/msgflux/dsl/__init__.py +0 -0
  269. {msgflux-0.2.0 → msgflux-0.4.1}/src/msgflux/dsl/inline.py +0 -0
  270. {msgflux-0.2.0 → msgflux-0.4.1}/src/msgflux/dsl/signature.py +0 -0
  271. {msgflux-0.2.0 → msgflux-0.4.1}/src/msgflux/dsl/typed_parsers/__init__.py +0 -0
  272. {msgflux-0.2.0 → msgflux-0.4.1}/src/msgflux/dsl/typed_parsers/base.py +0 -0
  273. {msgflux-0.2.0 → msgflux-0.4.1}/src/msgflux/dsl/typed_parsers/providers/__init__.py +0 -0
  274. {msgflux-0.2.0 → msgflux-0.4.1}/src/msgflux/dsl/typed_parsers/providers/xml.py +0 -0
  275. {msgflux-0.2.0 → msgflux-0.4.1}/src/msgflux/dsl/typed_parsers/registry.py +0 -0
  276. {msgflux-0.2.0 → msgflux-0.4.1}/src/msgflux/envs.py +0 -0
  277. {msgflux-0.2.0 → msgflux-0.4.1}/src/msgflux/exceptions.py +0 -0
  278. {msgflux-0.2.0 → msgflux-0.4.1}/src/msgflux/generation/__init__.py +0 -0
  279. {msgflux-0.2.0 → msgflux-0.4.1}/src/msgflux/generation/control_flow.py +0 -0
  280. {msgflux-0.2.0 → msgflux-0.4.1}/src/msgflux/generation/reasoning/__init__.py +0 -0
  281. {msgflux-0.2.0 → msgflux-0.4.1}/src/msgflux/generation/reasoning/cot.py +0 -0
  282. {msgflux-0.2.0 → msgflux-0.4.1}/src/msgflux/generation/reasoning/react.py +0 -0
  283. {msgflux-0.2.0 → msgflux-0.4.1}/src/msgflux/generation/reasoning/self_consistency.py +0 -0
  284. {msgflux-0.2.0 → msgflux-0.4.1}/src/msgflux/generation/templates.py +0 -0
  285. {msgflux-0.2.0 → msgflux-0.4.1}/src/msgflux/logger.py +0 -0
  286. {msgflux-0.2.0 → msgflux-0.4.1}/src/msgflux/models/__init__.py +0 -0
  287. {msgflux-0.2.0 → msgflux-0.4.1}/src/msgflux/models/base.py +0 -0
  288. {msgflux-0.2.0 → msgflux-0.4.1}/src/msgflux/models/cache.py +0 -0
  289. {msgflux-0.2.0 → msgflux-0.4.1}/src/msgflux/models/gateway.py +0 -0
  290. {msgflux-0.2.0 → msgflux-0.4.1}/src/msgflux/models/httpx.py +0 -0
  291. {msgflux-0.2.0 → msgflux-0.4.1}/src/msgflux/models/model.py +0 -0
  292. {msgflux-0.2.0 → msgflux-0.4.1}/src/msgflux/models/profiles/__init__.py +0 -0
  293. {msgflux-0.2.0 → msgflux-0.4.1}/src/msgflux/models/profiles/base.py +0 -0
  294. {msgflux-0.2.0 → msgflux-0.4.1}/src/msgflux/models/profiles/loader.py +0 -0
  295. {msgflux-0.2.0 → msgflux-0.4.1}/src/msgflux/models/profiles/registry.py +0 -0
  296. {msgflux-0.2.0 → msgflux-0.4.1}/src/msgflux/models/providers/__init__.py +0 -0
  297. {msgflux-0.2.0 → msgflux-0.4.1}/src/msgflux/models/providers/cerebras.py +0 -0
  298. {msgflux-0.2.0 → msgflux-0.4.1}/src/msgflux/models/providers/imagerouter.py +0 -0
  299. {msgflux-0.2.0 → msgflux-0.4.1}/src/msgflux/models/providers/jinaai.py +0 -0
  300. {msgflux-0.2.0 → msgflux-0.4.1}/src/msgflux/models/providers/replicate.py +0 -0
  301. {msgflux-0.2.0 → msgflux-0.4.1}/src/msgflux/models/providers/sambanova.py +0 -0
  302. {msgflux-0.2.0 → msgflux-0.4.1}/src/msgflux/models/providers/together.py +0 -0
  303. {msgflux-0.2.0 → msgflux-0.4.1}/src/msgflux/models/registry.py +0 -0
  304. {msgflux-0.2.0 → msgflux-0.4.1}/src/msgflux/models/response.py +0 -0
  305. {msgflux-0.2.0 → msgflux-0.4.1}/src/msgflux/models/tool_call_agg.py +0 -0
  306. {msgflux-0.2.0 → msgflux-0.4.1}/src/msgflux/models/types.py +0 -0
  307. {msgflux-0.2.0 → msgflux-0.4.1}/src/msgflux/nn/__init__.py +0 -0
  308. {msgflux-0.2.0 → msgflux-0.4.1}/src/msgflux/nn/functional.py +0 -0
  309. {msgflux-0.2.0 → msgflux-0.4.1}/src/msgflux/nn/hooks/__init__.py +0 -0
  310. {msgflux-0.2.0 → msgflux-0.4.1}/src/msgflux/nn/hooks/guard.py +0 -0
  311. {msgflux-0.2.0 → msgflux-0.4.1}/src/msgflux/nn/hooks/hook.py +0 -0
  312. {msgflux-0.2.0 → msgflux-0.4.1}/src/msgflux/nn/modules/__init__.py +0 -0
  313. {msgflux-0.2.0 → msgflux-0.4.1}/src/msgflux/nn/modules/agent.py +0 -0
  314. {msgflux-0.2.0 → msgflux-0.4.1}/src/msgflux/nn/modules/container.py +0 -0
  315. {msgflux-0.2.0 → msgflux-0.4.1}/src/msgflux/nn/modules/embedder.py +0 -0
  316. {msgflux-0.2.0 → msgflux-0.4.1}/src/msgflux/nn/modules/generator.py +0 -0
  317. {msgflux-0.2.0 → msgflux-0.4.1}/src/msgflux/nn/modules/mediamaker.py +0 -0
  318. {msgflux-0.2.0 → msgflux-0.4.1}/src/msgflux/nn/modules/module.py +0 -0
  319. {msgflux-0.2.0 → msgflux-0.4.1}/src/msgflux/nn/modules/predictor.py +0 -0
  320. {msgflux-0.2.0 → msgflux-0.4.1}/src/msgflux/nn/modules/searcher.py +0 -0
  321. {msgflux-0.2.0 → msgflux-0.4.1}/src/msgflux/nn/modules/speaker.py +0 -0
  322. {msgflux-0.2.0 → msgflux-0.4.1}/src/msgflux/nn/modules/tool.py +0 -0
  323. {msgflux-0.2.0 → msgflux-0.4.1}/src/msgflux/nn/modules/transcriber.py +0 -0
  324. {msgflux-0.2.0 → msgflux-0.4.1}/src/msgflux/nn/parameter.py +0 -0
  325. {msgflux-0.2.0 → msgflux-0.4.1}/src/msgflux/protocols/__init__.py +0 -0
  326. {msgflux-0.2.0 → msgflux-0.4.1}/src/msgflux/protocols/mcp/__init__.py +0 -0
  327. {msgflux-0.2.0 → msgflux-0.4.1}/src/msgflux/protocols/mcp/auth/__init__.py +0 -0
  328. {msgflux-0.2.0 → msgflux-0.4.1}/src/msgflux/protocols/mcp/auth/apikey.py +0 -0
  329. {msgflux-0.2.0 → msgflux-0.4.1}/src/msgflux/protocols/mcp/auth/base.py +0 -0
  330. {msgflux-0.2.0 → msgflux-0.4.1}/src/msgflux/protocols/mcp/auth/basic.py +0 -0
  331. {msgflux-0.2.0 → msgflux-0.4.1}/src/msgflux/protocols/mcp/auth/bearer.py +0 -0
  332. {msgflux-0.2.0 → msgflux-0.4.1}/src/msgflux/protocols/mcp/auth/custom.py +0 -0
  333. {msgflux-0.2.0 → msgflux-0.4.1}/src/msgflux/protocols/mcp/auth/oauth2.py +0 -0
  334. {msgflux-0.2.0 → msgflux-0.4.1}/src/msgflux/protocols/mcp/client.py +0 -0
  335. {msgflux-0.2.0 → msgflux-0.4.1}/src/msgflux/protocols/mcp/exceptions.py +0 -0
  336. {msgflux-0.2.0 → msgflux-0.4.1}/src/msgflux/protocols/mcp/integration.py +0 -0
  337. {msgflux-0.2.0 → msgflux-0.4.1}/src/msgflux/protocols/mcp/loglevels.py +0 -0
  338. {msgflux-0.2.0 → msgflux-0.4.1}/src/msgflux/protocols/mcp/transports.py +0 -0
  339. {msgflux-0.2.0 → msgflux-0.4.1}/src/msgflux/protocols/mcp/types.py +0 -0
  340. {msgflux-0.2.0 → msgflux-0.4.1}/src/msgflux/py.typed +0 -0
  341. {msgflux-0.2.0 → msgflux-0.4.1}/src/msgflux/telemetry/__init__.py +0 -0
  342. {msgflux-0.2.0 → msgflux-0.4.1}/src/msgflux/telemetry/config.py +0 -0
  343. {msgflux-0.2.0 → msgflux-0.4.1}/src/msgflux/telemetry/span.py +0 -0
  344. {msgflux-0.2.0 → msgflux-0.4.1}/src/msgflux/tools/__init__.py +0 -0
  345. {msgflux-0.2.0 → msgflux-0.4.1}/src/msgflux/tools/builtin/web_fetch.py +0 -0
  346. {msgflux-0.2.0 → msgflux-0.4.1}/src/msgflux/tools/config.py +0 -0
  347. {msgflux-0.2.0 → msgflux-0.4.1}/src/msgflux/tools/definitions.py +0 -0
  348. {msgflux-0.2.0 → msgflux-0.4.1}/src/msgflux/utils/__init__.py +0 -0
  349. {msgflux-0.2.0 → msgflux-0.4.1}/src/msgflux/utils/chat.py +0 -0
  350. {msgflux-0.2.0 → msgflux-0.4.1}/src/msgflux/utils/common.py +0 -0
  351. {msgflux-0.2.0 → msgflux-0.4.1}/src/msgflux/utils/console.py +0 -0
  352. {msgflux-0.2.0 → msgflux-0.4.1}/src/msgflux/utils/convert.py +0 -0
  353. {msgflux-0.2.0 → msgflux-0.4.1}/src/msgflux/utils/encode.py +0 -0
  354. {msgflux-0.2.0 → msgflux-0.4.1}/src/msgflux/utils/html.py +0 -0
  355. {msgflux-0.2.0 → msgflux-0.4.1}/src/msgflux/utils/imports.py +0 -0
  356. {msgflux-0.2.0 → msgflux-0.4.1}/src/msgflux/utils/inspect.py +0 -0
  357. {msgflux-0.2.0 → msgflux-0.4.1}/src/msgflux/utils/logging.py +0 -0
  358. {msgflux-0.2.0 → msgflux-0.4.1}/src/msgflux/utils/mermaid.py +0 -0
  359. {msgflux-0.2.0 → msgflux-0.4.1}/src/msgflux/utils/msgspec.py +0 -0
  360. {msgflux-0.2.0 → msgflux-0.4.1}/src/msgflux/utils/pooling.py +0 -0
  361. {msgflux-0.2.0 → msgflux-0.4.1}/src/msgflux/utils/templates.py +0 -0
  362. {msgflux-0.2.0 → msgflux-0.4.1}/src/msgflux/utils/tenacity.py +0 -0
  363. {msgflux-0.2.0 → msgflux-0.4.1}/src/msgflux/utils/torch.py +0 -0
  364. {msgflux-0.2.0 → msgflux-0.4.1}/src/msgflux/utils/validation.py +0 -0
  365. {msgflux-0.2.0 → msgflux-0.4.1}/src/msgflux/utils/xml.py +0 -0
  366. {msgflux-0.2.0 → msgflux-0.4.1}/tests/__init__.py +0 -0
  367. {msgflux-0.2.0 → msgflux-0.4.1}/tests/auto/__init__.py +0 -0
  368. {msgflux-0.2.0 → msgflux-0.4.1}/tests/auto/test_params.py +0 -0
  369. {msgflux-0.2.0 → msgflux-0.4.1}/tests/conftest.py +0 -0
  370. {msgflux-0.2.0 → msgflux-0.4.1}/tests/data/__init__.py +0 -0
  371. {msgflux-0.2.0 → msgflux-0.4.1}/tests/data/parsers/__init__.py +0 -0
  372. {msgflux-0.2.0 → msgflux-0.4.1}/tests/data/parsers/test_parsers.py +0 -0
  373. {msgflux-0.2.0 → msgflux-0.4.1}/tests/data/retrievers/__init__.py +0 -0
  374. {msgflux-0.2.0 → msgflux-0.4.1}/tests/data/retrievers/providers/__init__.py +0 -0
  375. {msgflux-0.2.0 → msgflux-0.4.1}/tests/data/retrievers/providers/test_bm25.py +0 -0
  376. {msgflux-0.2.0 → msgflux-0.4.1}/tests/data/retrievers/providers/test_bm25s.py +0 -0
  377. {msgflux-0.2.0 → msgflux-0.4.1}/tests/data/retrievers/providers/test_rank_bm25.py +0 -0
  378. {msgflux-0.2.0 → msgflux-0.4.1}/tests/data/retrievers/providers/test_rapidfuzz.py +0 -0
  379. {msgflux-0.2.0 → msgflux-0.4.1}/tests/data/retrievers/providers/test_wikipedia.py +0 -0
  380. {msgflux-0.2.0 → msgflux-0.4.1}/tests/dsl/test_inline.py +0 -0
  381. {msgflux-0.2.0 → msgflux-0.4.1}/tests/dsl/test_signature.py +0 -0
  382. {msgflux-0.2.0 → msgflux-0.4.1}/tests/dsl/test_typed_parsers.py +0 -0
  383. {msgflux-0.2.0 → msgflux-0.4.1}/tests/generation/__init__.py +0 -0
  384. {msgflux-0.2.0 → msgflux-0.4.1}/tests/generation/test_control_flow.py +0 -0
  385. {msgflux-0.2.0 → msgflux-0.4.1}/tests/generation/test_reasoning.py +0 -0
  386. {msgflux-0.2.0 → msgflux-0.4.1}/tests/generation/test_templates.py +0 -0
  387. {msgflux-0.2.0 → msgflux-0.4.1}/tests/integration/test_agent_reasoning.py +0 -0
  388. {msgflux-0.2.0 → msgflux-0.4.1}/tests/integration/test_guard_moderation.py +0 -0
  389. {msgflux-0.2.0 → msgflux-0.4.1}/tests/integration/test_reasoning.py +0 -0
  390. {msgflux-0.2.0 → msgflux-0.4.1}/tests/integration/test_tool_dict_e2e.py +0 -0
  391. {msgflux-0.2.0 → msgflux-0.4.1}/tests/models/__init__.py +0 -0
  392. {msgflux-0.2.0 → msgflux-0.4.1}/tests/models/providers/__init__.py +0 -0
  393. {msgflux-0.2.0 → msgflux-0.4.1}/tests/models/test_base.py +0 -0
  394. {msgflux-0.2.0 → msgflux-0.4.1}/tests/models/test_cache.py +0 -0
  395. {msgflux-0.2.0 → msgflux-0.4.1}/tests/models/test_gateway.py +0 -0
  396. {msgflux-0.2.0 → msgflux-0.4.1}/tests/models/test_httpx.py +0 -0
  397. {msgflux-0.2.0 → msgflux-0.4.1}/tests/models/test_model.py +0 -0
  398. {msgflux-0.2.0 → msgflux-0.4.1}/tests/models/test_profiles.py +0 -0
  399. {msgflux-0.2.0 → msgflux-0.4.1}/tests/models/test_registry.py +0 -0
  400. {msgflux-0.2.0 → msgflux-0.4.1}/tests/models/test_response.py +0 -0
  401. {msgflux-0.2.0 → msgflux-0.4.1}/tests/models/test_tool_call_agg.py +0 -0
  402. {msgflux-0.2.0 → msgflux-0.4.1}/tests/nn/__init__.py +0 -0
  403. {msgflux-0.2.0 → msgflux-0.4.1}/tests/nn/modules/__init__.py +0 -0
  404. {msgflux-0.2.0 → msgflux-0.4.1}/tests/nn/modules/test_agent.py +0 -0
  405. {msgflux-0.2.0 → msgflux-0.4.1}/tests/nn/modules/test_container.py +0 -0
  406. {msgflux-0.2.0 → msgflux-0.4.1}/tests/nn/modules/test_embedder.py +0 -0
  407. {msgflux-0.2.0 → msgflux-0.4.1}/tests/nn/modules/test_lm.py +0 -0
  408. {msgflux-0.2.0 → msgflux-0.4.1}/tests/nn/modules/test_mediamaker.py +0 -0
  409. {msgflux-0.2.0 → msgflux-0.4.1}/tests/nn/modules/test_module.py +0 -0
  410. {msgflux-0.2.0 → msgflux-0.4.1}/tests/nn/modules/test_predictor.py +0 -0
  411. {msgflux-0.2.0 → msgflux-0.4.1}/tests/nn/modules/test_searcher.py +0 -0
  412. {msgflux-0.2.0 → msgflux-0.4.1}/tests/nn/modules/test_speaker.py +0 -0
  413. {msgflux-0.2.0 → msgflux-0.4.1}/tests/nn/modules/test_tool.py +0 -0
  414. {msgflux-0.2.0 → msgflux-0.4.1}/tests/nn/modules/test_tool_transport_params.py +0 -0
  415. {msgflux-0.2.0 → msgflux-0.4.1}/tests/nn/modules/test_transcriber.py +0 -0
  416. {msgflux-0.2.0 → msgflux-0.4.1}/tests/nn/test_functional.py +0 -0
  417. {msgflux-0.2.0 → msgflux-0.4.1}/tests/nn/test_guard.py +0 -0
  418. {msgflux-0.2.0 → msgflux-0.4.1}/tests/nn/test_parameter.py +0 -0
  419. {msgflux-0.2.0 → msgflux-0.4.1}/tests/protocols/__init__.py +0 -0
  420. {msgflux-0.2.0 → msgflux-0.4.1}/tests/protocols/mcp/__init__.py +0 -0
  421. {msgflux-0.2.0 → msgflux-0.4.1}/tests/protocols/mcp/auth/test_auth_providers.py +0 -0
  422. {msgflux-0.2.0 → msgflux-0.4.1}/tests/protocols/mcp/conftest.py +0 -0
  423. {msgflux-0.2.0 → msgflux-0.4.1}/tests/protocols/mcp/mcp_simple_server.py +0 -0
  424. {msgflux-0.2.0 → msgflux-0.4.1}/tests/protocols/mcp/test_client.py +0 -0
  425. {msgflux-0.2.0 → msgflux-0.4.1}/tests/protocols/mcp/test_exceptions.py +0 -0
  426. {msgflux-0.2.0 → msgflux-0.4.1}/tests/protocols/mcp/test_integration.py +0 -0
  427. {msgflux-0.2.0 → msgflux-0.4.1}/tests/protocols/mcp/test_loglevels.py +0 -0
  428. {msgflux-0.2.0 → msgflux-0.4.1}/tests/protocols/mcp/test_mcp_live.py +0 -0
  429. {msgflux-0.2.0 → msgflux-0.4.1}/tests/protocols/mcp/test_toollibrary_mcp.py +0 -0
  430. {msgflux-0.2.0 → msgflux-0.4.1}/tests/protocols/mcp/test_transports.py +0 -0
  431. {msgflux-0.2.0 → msgflux-0.4.1}/tests/protocols/mcp/test_types.py +0 -0
  432. {msgflux-0.2.0 → msgflux-0.4.1}/tests/telemetry/__init__.py +0 -0
  433. {msgflux-0.2.0 → msgflux-0.4.1}/tests/telemetry/test_config.py +0 -0
  434. {msgflux-0.2.0 → msgflux-0.4.1}/tests/telemetry/test_span_agent_decorators.py +0 -0
  435. {msgflux-0.2.0 → msgflux-0.4.1}/tests/telemetry/test_span_tool_decorators.py +0 -0
  436. {msgflux-0.2.0 → msgflux-0.4.1}/tests/test_agent_as_tool_with_signature.py +0 -0
  437. {msgflux-0.2.0 → msgflux-0.4.1}/tests/test_agent_generation_schema.py +0 -0
  438. {msgflux-0.2.0 → msgflux-0.4.1}/tests/test_agent_image_detail.py +0 -0
  439. {msgflux-0.2.0 → msgflux-0.4.1}/tests/test_agent_include_date.py +0 -0
  440. {msgflux-0.2.0 → msgflux-0.4.1}/tests/test_agent_named_kwargs.py +0 -0
  441. {msgflux-0.2.0 → msgflux-0.4.1}/tests/test_agent_signature_annotations.py +0 -0
  442. {msgflux-0.2.0 → msgflux-0.4.1}/tests/test_agent_templates_fix.py +0 -0
  443. {msgflux-0.2.0 → msgflux-0.4.1}/tests/test_async_hooks.py +0 -0
  444. {msgflux-0.2.0 → msgflux-0.4.1}/tests/test_autoparams.py +0 -0
  445. {msgflux-0.2.0 → msgflux-0.4.1}/tests/test_data_types.py +0 -0
  446. {msgflux-0.2.0 → msgflux-0.4.1}/tests/test_dotdict.py +0 -0
  447. {msgflux-0.2.0 → msgflux-0.4.1}/tests/test_embedder.py +0 -0
  448. {msgflux-0.2.0 → msgflux-0.4.1}/tests/test_examples.py +0 -0
  449. {msgflux-0.2.0 → msgflux-0.4.1}/tests/test_image_block_kwargs_refactor.py +0 -0
  450. {msgflux-0.2.0 → msgflux-0.4.1}/tests/test_inject_message.py +0 -0
  451. {msgflux-0.2.0 → msgflux-0.4.1}/tests/test_mcp_fastmcp.py +0 -0
  452. {msgflux-0.2.0 → msgflux-0.4.1}/tests/test_registry.py +0 -0
  453. {msgflux-0.2.0 → msgflux-0.4.1}/tests/test_tool_config_decorator.py +0 -0
  454. {msgflux-0.2.0 → msgflux-0.4.1}/tests/test_tool_control.py +0 -0
  455. {msgflux-0.2.0 → msgflux-0.4.1}/tests/test_tools_visualization.py +0 -0
  456. {msgflux-0.2.0 → msgflux-0.4.1}/tests/test_type_inheritance_struct.py +0 -0
  457. {msgflux-0.2.0 → msgflux-0.4.1}/tests/test_video_block_kwargs.py +0 -0
  458. {msgflux-0.2.0 → msgflux-0.4.1}/tests/tools/__init__.py +0 -0
  459. {msgflux-0.2.0 → msgflux-0.4.1}/tests/tools/builtin/__init__.py +0 -0
  460. {msgflux-0.2.0 → msgflux-0.4.1}/tests/tools/builtin/test_web_fetch.py +0 -0
  461. {msgflux-0.2.0 → msgflux-0.4.1}/tests/tools/test_config.py +0 -0
  462. {msgflux-0.2.0 → msgflux-0.4.1}/tests/tools/test_toolflowcontrol.py +0 -0
  463. {msgflux-0.2.0 → msgflux-0.4.1}/tests/utils/test_chat.py +0 -0
  464. {msgflux-0.2.0 → msgflux-0.4.1}/tests/utils/test_common.py +0 -0
  465. {msgflux-0.2.0 → msgflux-0.4.1}/tests/utils/test_console.py +0 -0
  466. {msgflux-0.2.0 → msgflux-0.4.1}/tests/utils/test_convert.py +0 -0
  467. {msgflux-0.2.0 → msgflux-0.4.1}/tests/utils/test_encode.py +0 -0
  468. {msgflux-0.2.0 → msgflux-0.4.1}/tests/utils/test_hint_to_schema_dict.py +0 -0
  469. {msgflux-0.2.0 → msgflux-0.4.1}/tests/utils/test_hooks.py +0 -0
  470. {msgflux-0.2.0 → msgflux-0.4.1}/tests/utils/test_imports.py +0 -0
  471. {msgflux-0.2.0 → msgflux-0.4.1}/tests/utils/test_inspect.py +0 -0
  472. {msgflux-0.2.0 → msgflux-0.4.1}/tests/utils/test_logging.py +0 -0
  473. {msgflux-0.2.0 → msgflux-0.4.1}/tests/utils/test_mermaid.py +0 -0
  474. {msgflux-0.2.0 → msgflux-0.4.1}/tests/utils/test_msgspec.py +0 -0
  475. {msgflux-0.2.0 → msgflux-0.4.1}/tests/utils/test_pooling.py +0 -0
  476. {msgflux-0.2.0 → msgflux-0.4.1}/tests/utils/test_templates.py +0 -0
  477. {msgflux-0.2.0 → msgflux-0.4.1}/tests/utils/test_tenacity.py +0 -0
  478. {msgflux-0.2.0 → msgflux-0.4.1}/tests/utils/test_torch.py +0 -0
  479. {msgflux-0.2.0 → msgflux-0.4.1}/tests/utils/test_validation.py +0 -0
  480. {msgflux-0.2.0 → msgflux-0.4.1}/tests/utils/test_xml.py +0 -0
@@ -7,12 +7,12 @@ repos:
7
7
  - id: gitleaks
8
8
 
9
9
  - repo: https://github.com/astral-sh/uv-pre-commit
10
- rev: 0.11.6 # uv version.
10
+ rev: 0.11.7 # uv version.
11
11
  hooks:
12
12
  - id: uv-lock
13
13
 
14
14
  - repo: https://github.com/astral-sh/ruff-pre-commit
15
- rev: v0.15.10
15
+ rev: v0.15.11
16
16
  hooks:
17
17
  - id: ruff
18
18
  args: [--fix]
@@ -0,0 +1,35 @@
1
+ # Changelog
2
+
3
+ ## [0.4.1] - 2026-04-22
4
+
5
+ - Fixes: restored uv.lock file for CI compatibility (#78).
6
+
7
+ ## [0.4.0] - 2026-04-22
8
+
9
+ - Features: added new web retrievers (Arxiv, Brave, Exa, LinkUp, SerpAPI, Tavily) and model integrations (Brave, Exa), plus configurable WebSearch tool (#71).
10
+ - Web Retriever: added support for Wikipedia highlighting in web retriever section (#73).
11
+ - Providers: added OpenAI-compatible `extra_body` support for chat completions (#72).
12
+ - Maintenance: removed uv.lock file (#74).
13
+
14
+ ## [0.3.0] - 2026-04-20
15
+
16
+ - Features: added OpenAI prompt cache retention support (#52), token logprobs metadata for chat completions (#53), and the `LLMAsVerifier` workflow with docs and examples (#54).
17
+ - Fixes: mapped OpenRouter `reasoning_max_tokens` to `extra_body.reasoning.max_tokens` and enforced the `reasoning_effort` conflict rule (#57).
18
+ - Docs: updated chat completion and agent reasoning docs to reflect the OpenRouter-only reasoning budget behavior (#56, #57).
19
+ - Maintenance: updated pre-commit hooks (#55).
20
+
21
+ ## [0.2.0] - 2026-04-17
22
+
23
+ - Features: added `provider/model-id` string shorthand support to `Agent`, `Speaker`, and `Transcriber` (#26, #27, #28), plus runtime tool controls for `Agent` (#30).
24
+ - Fixes: fixed registry naming for generic callables (#29).
25
+ - Maintenance: updated release automation and cleaned up the release script (#36, #49).
26
+
27
+ ## [0.1.1] - 2026-04-15
28
+
29
+ - Fixed message copying in the OpenAI provider (#47).
30
+ - Fixed isolation of injected messages for agent tools (#46).
31
+ - Updated CI and dependency tooling to keep release checks passing (#45, #44, #38, #37, #35, #34, #33, #32).
32
+
33
+ ## [0.1.0] - 2026-04-09
34
+
35
+ ## [0.1.0a31] - 2026-04-09
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: msgflux
3
- Version: 0.2.0
3
+ Version: 0.4.1
4
4
  Summary: Messages and Dynamic AI Systems in Python powered by pretrained models
5
5
  Project-URL: Homepage, https://github.com/msgflux/msgflux
6
6
  Project-URL: Documentation, https://github.com/msgflux/msgflux
@@ -41,3 +41,5 @@ Use this section when you need to answer questions like:
41
41
  `dict[K, V]` is encoded for strict structured outputs and restored at runtime.
42
42
  - [ReAct Provider Schemas](react-provider-schemas.md): how ReAct uses tool
43
43
  schemas to build a dynamic provider-facing response format.
44
+ - [LLM-as-a-Verifier](llm-as-a-verifier.md): how verifier prompts, concurrent
45
+ execution, score-token parsing, and weighted aggregation fit together.
@@ -0,0 +1,317 @@
1
+ # LLM-as-a-Verifier
2
+
3
+ `src/msgflux/generation/verifiers/llm_as_a_verifier.py` is the first verifier
4
+ module in msgFlux.
5
+
6
+ At a high level, it turns a verification task into a reusable runtime with four
7
+ main jobs:
8
+
9
+ - build a verifier prompt from task, criteria, candidates, and context
10
+ - request discrete score tokens from the model
11
+ - estimate a stable score from `logprobs` instead of trusting only the chosen
12
+ token
13
+ - aggregate repeated attempts and multiple criteria into a final verdict
14
+
15
+ It is not tied to `Agent`. It is a callable verification layer that can be used
16
+ from plain generation code, tool workflows, candidate reranking, or future
17
+ optimizers.
18
+
19
+ ## Mental Model
20
+
21
+ The verifier pipeline looks like this:
22
+
23
+ ```text
24
+ task + candidates + criteria
25
+ -> prompt builder
26
+ -> request batch
27
+ -> concurrent model calls
28
+ -> per-attempt evidence extraction
29
+ -> text token
30
+ -> logprob distribution
31
+ -> criterion aggregation
32
+ -> final verifier result
33
+ ```
34
+
35
+ The important part is that the verifier does not ask the model for an open-ended
36
+ score. It asks for a small discrete token from a known scale, then uses the
37
+ token distribution to estimate the final normalized score.
38
+
39
+ ## Why The Output Is A Score Token
40
+
41
+ The verifier uses a discrete score scale such as `A..T`.
42
+
43
+ That choice is deliberate:
44
+
45
+ - it keeps the scoring space bounded
46
+ - it makes the provider response easier to parse
47
+ - it makes `logprobs` directly useful
48
+ - it lets the runtime compute an expected score instead of a brittle hard label
49
+
50
+ Letters are preferred over digits for the default scale because they behave
51
+ more like single symbolic labels as granularity grows.
52
+
53
+ That matters for `logprobs` extraction:
54
+
55
+ - `A..T` is a cleaner discrete label set than `1..20`
56
+ - multi-digit numeric scales are more likely to split across tokens
57
+ - numeric labels are more likely to attach to punctuation or formatting noise
58
+ - letter labels are easier to rank, normalize, and recover from imperfect tag
59
+ formatting
60
+
61
+ So the default runtime chooses a letter-based scale not for presentation, but
62
+ for tokenization stability and better score-distribution extraction.
63
+
64
+ So the model is not asked to emit a floating-point score. It is asked to emit a
65
+ single token inside a known tag:
66
+
67
+ ```text
68
+ <score>A</score>
69
+ ```
70
+
71
+ or, in pairwise mode:
72
+
73
+ ```text
74
+ <score_A>A</score_A>
75
+ <score_B>H</score_B>
76
+ ```
77
+
78
+ `ScoreScale.letter(granularity=20)` is the public way to ask for 20 score
79
+ levels explicitly. That is also the default runtime scale.
80
+
81
+ ## Prompt Construction
82
+
83
+ `default_prompt_builder(...)` assembles the verifier prompt from
84
+ `VerificationPromptInput`.
85
+
86
+ That input contains:
87
+
88
+ - `task`
89
+ - `criterion`
90
+ - `candidates`
91
+ - `score_scale`
92
+ - optional `context`
93
+ - optional verifier-level instructions
94
+
95
+ The default builder always explains:
96
+
97
+ - the criterion being judged
98
+ - the valid score-token range
99
+ - the exact tag format expected at the end
100
+
101
+ This is why the verifier can support custom prompting without changing the rest
102
+ of the execution pipeline. The builder is only responsible for prompt text; the
103
+ runtime remains responsible for scoring and aggregation.
104
+
105
+ ## Trajectory Formatting Helpers
106
+
107
+ Benchmark-style presets work best when the candidate contains the full execution
108
+ evidence, not only the final answer.
109
+
110
+ The public API therefore exposes:
111
+
112
+ - `format_terminal_trajectory(...)`
113
+ - `format_swe_bench_trajectory(...)`
114
+
115
+ These helpers deliberately format only candidate evidence:
116
+
117
+ - summaries
118
+ - command/output steps
119
+ - metadata such as expected output
120
+ - final patch text for SWE-style runs
121
+ - final answer or final narration
122
+
123
+ The task or issue description stays outside the helper and should still be
124
+ passed through the verifier's `task` argument. That keeps the verifier API
125
+ clean: `task` carries the evaluation target, while the formatted candidate
126
+ string carries the evidence being judged.
127
+
128
+ ## Request Batching And Concurrency
129
+
130
+ The verifier builds a `VerificationRequest` for each independent
131
+ criterion/repetition pair.
132
+
133
+ That means the number of model calls in a single verification is:
134
+
135
+ ```text
136
+ len(criteria) * n_verifications
137
+ ```
138
+
139
+ Those requests are independent, so the verifier fans them out concurrently:
140
+
141
+ - `__call__` uses `F.map_gather(...)`
142
+ - `acall` uses `F.amap_gather(...)`
143
+
144
+ This matters because a verifier with multiple criteria and repeated attempts can
145
+ otherwise accumulate latency linearly.
146
+
147
+ The runtime still keeps the final result deterministic:
148
+
149
+ - requests are built in criterion order, then repetition order
150
+ - gather responses preserve input order
151
+ - attempts are regrouped per criterion after execution
152
+
153
+ So the work is concurrent, but the aggregation order remains stable.
154
+
155
+ ## Why `select_best(...)` Is Separate
156
+
157
+ `__call__` and `acall` support only one or two candidates.
158
+
159
+ That boundary is intentional:
160
+
161
+ - one candidate -> verification
162
+ - two candidates -> pairwise comparison
163
+ - more than two candidates -> tournament selection
164
+
165
+ `select_best(...)` and `aselect_best(...)` implement the tournament layer on top
166
+ of the base verifier. They run pairwise matches, accumulate wins, and use
167
+ average score as a tiebreaker.
168
+
169
+ The tournament layer can also fan out its pairwise matches concurrently. That
170
+ means a multi-candidate selection now has two concurrency layers:
171
+
172
+ - concurrent attempts inside each verifier call
173
+ - concurrent pairwise matches across the tournament
174
+
175
+ This keeps the core verifier simple instead of making `__call__` return
176
+ different shapes for different candidate counts.
177
+
178
+ ## Scoring From Logprobs
179
+
180
+ The central scoring path is:
181
+
182
+ ```text
183
+ model response
184
+ -> locate score token
185
+ -> collect chosen token + top_logprobs alternatives
186
+ -> convert logprobs to probabilities
187
+ -> compute expected value on the discrete score scale
188
+ -> normalize to [0, 1]
189
+ ```
190
+
191
+ This is why `LLMAsVerifier` always requests:
192
+
193
+ - `logprobs=True`
194
+ - `top_logprobs=<scale size or override>`
195
+
196
+ If the provider returns a good token distribution, the verifier uses that
197
+ distribution directly.
198
+
199
+ If not, and `strict_logprobs=False`, it falls back to parsing the score from the
200
+ response text.
201
+
202
+ ## Why The Parser Has Heuristics
203
+
204
+ Provider tokenization around XML-like tags is not always clean.
205
+
206
+ The verifier therefore uses a layered extraction strategy:
207
+
208
+ 1. parse the text tag if possible
209
+ 2. try to find the matching score entry directly in `logprobs`
210
+ 3. fall back to finding the expected score token near the closing tag
211
+ 4. if strict mode is disabled, fall back to text-only extraction
212
+
213
+ This is also why the parser tolerates malformed openings such as:
214
+
215
+ ```text
216
+ <20A</score>
217
+ ```
218
+
219
+ The runtime treats the text and token stream as evidence that must be reconciled,
220
+ not as perfectly formatted output.
221
+
222
+ ## Aggregation Model
223
+
224
+ There are two aggregation stages.
225
+
226
+ ### Attempt Aggregation
227
+
228
+ Each criterion can run multiple repetitions.
229
+
230
+ Those repeated attempts are averaged into a single score per criterion and
231
+ candidate.
232
+
233
+ ### Criterion Aggregation
234
+
235
+ Each criterion carries a weight.
236
+
237
+ The final score per candidate is the weighted average of all criterion scores.
238
+
239
+ That is what makes the verifier reusable across different presets: the
240
+ execution path stays the same while the criteria set changes.
241
+
242
+ ## Verdict Semantics
243
+
244
+ The final verdict depends on candidate count.
245
+
246
+ For a single candidate:
247
+
248
+ - `pass`
249
+ - `fail`
250
+ - `uncertain`
251
+
252
+ For two candidates:
253
+
254
+ - winner label
255
+ - `tie`
256
+
257
+ This is why `VerifierResult` exposes both:
258
+
259
+ - `verdict`
260
+ - optional `winner`
261
+
262
+ ## Verbose Mode
263
+
264
+ When `verbose=True`, the verifier stores enough information to debug prompt and
265
+ scoring behavior without rerunning the call.
266
+
267
+ Per attempt, it keeps:
268
+
269
+ - final prompt text
270
+ - raw response text
271
+ - per-candidate evidence
272
+ - extracted token probabilities
273
+
274
+ That data is exposed both in:
275
+
276
+ - `criteria_results[*].attempts[*]`
277
+ - `result.metadata["raw_outputs"]`
278
+
279
+ Tournament mode mirrors that same information in each match entry of
280
+ `TournamentResult.metadata["raw_outputs"]`.
281
+
282
+ ## Presets
283
+
284
+ The preset constructors are thin wrappers around the same runtime:
285
+
286
+ - `trajectory_analysis`
287
+ - `answer_reranking`
288
+ - `grounded_answer_verification`
289
+ - `patch_selection`
290
+ - `terminal_bench`
291
+ - `swe_bench_verified`
292
+ - `tool_trace_verification`
293
+ - `synthetic_data_filtering`
294
+
295
+ Each preset only supplies:
296
+
297
+ - a default criteria set
298
+ - optional default instructions or ground-truth notes
299
+
300
+ The runtime path stays identical.
301
+
302
+ This is important for maintenance because it means new verifier presets should
303
+ usually be data/config additions, not new execution engines.
304
+
305
+ ## Main Design Choices
306
+
307
+ The current design makes a few explicit tradeoffs:
308
+
309
+ - verifier core is independent from `Agent`
310
+ - prompt building is pluggable, scoring is centralized
311
+ - discrete score tokens are preferred over free-form numeric scores
312
+ - `logprobs` are first-class evidence
313
+ - tournament selection is built on top of pairwise verification
314
+ - verbose debugging is part of the runtime, not an external wrapper
315
+
316
+ These choices make the verifier easier to reuse for reranking, trajectory
317
+ selection, patch selection, and future optimizer integrations.
@@ -10,16 +10,17 @@ hide:
10
10
 
11
11
  ### Chat Completion
12
12
 
13
- | Provider | Dependency | Auth Env |
14
- |-------------|-------------------|----------------------|
15
- | Cerebras | `msgflux[openai]` | `CEREBRAS_API_KEY` |
16
- | Groq | `msgflux[openai]` | `GROQ_API_KEY` |
17
- | Ollama | `msgflux[openai]` | |
18
- | OpenAI | `msgflux[openai]` | `OPENAI_API_KEY` |
19
- | OpenRouter | `msgflux[openai]` | `OPENROUTER_API_KEY` |
20
- | SambaNova | `msgflux[openai]` | `SAMBANOVA_API_KEY` |
21
- | Together | `msgflux[openai]` | `TOGETHER_API_KEY` |
22
- | vLLM | `msgflux[openai]` | |
13
+ | Provider | Dependency | Auth Env |
14
+ |-------------|-------------------|------------------------|
15
+ | Brave | `msgflux[openai]` | `BRAVE_SEARCH_API_KEY` |
16
+ | Cerebras | `msgflux[openai]` | `CEREBRAS_API_KEY` |
17
+ | Groq | `msgflux[openai]` | `GROQ_API_KEY` |
18
+ | Ollama | `msgflux[openai]` | |
19
+ | OpenAI | `msgflux[openai]` | `OPENAI_API_KEY` |
20
+ | OpenRouter | `msgflux[openai]` | `OPENROUTER_API_KEY` |
21
+ | SambaNova | `msgflux[openai]` | `SAMBANOVA_API_KEY` |
22
+ | Together | `msgflux[openai]` | `TOGETHER_API_KEY` |
23
+ | vLLM | `msgflux[openai]` | |
23
24
 
24
25
  ### Image Embedder
25
26
 
@@ -144,6 +145,13 @@ hide:
144
145
 
145
146
  ### Web Search
146
147
 
147
- | Provider | Dependency |
148
- |-------------|---------------|
149
- | Wikipedia | `wikipedia` |
148
+ | Provider | Installation | Auth Env |
149
+ |-------------|----------------------------------|-----------------------------------|
150
+ | Trafilatura | `httpx`, `trafilatura` | |
151
+ | SerpApi | `httpx` | `SERPAPI_KEY` |
152
+ | Linkup | `linkup-sdk` | `LINKUP_API_KEY` |
153
+ | Tavily | `tavily-python` | `TAVILY_API_KEY` |
154
+ | Exa | `exa-py` | `EXA_API_KEY` |
155
+ | Brave | `brave-search-python-client` | `BRAVE_SEARCH_API_KEY` |
156
+ | arXiv | `arxiv` | |
157
+ | Wikipedia | `wikipedia` | |
@@ -34,6 +34,8 @@ hide:
34
34
 
35
35
  msgFlux is an open-source framework for building dynamic AI systems with **composable modules**. It treats prompts, signatures, tools, and message flow as explicit program structure instead of ad-hoc glue. Architecture, data flow, and prompting remain separate layers, so systems can evolve by changing contracts, modules, or routes without forcing everything to change together.
36
36
 
37
+ For web search, msgFlux includes both retriever-backed and model-backed options. The built-in `WebSearch` tool can be pointed at a retriever backend like `retriever/wikipedia` or a model backend like `model/openai/gpt-4o-search-preview`, returns `data` plus `annotations` when the backend supplies citations, and can read its engine plus JSON params from `MSGFLUX_TOOL_WEB_SEARCH_*` environment variables.
38
+
37
39
  ## **AI Systems *not* ML Systems**
38
40
 
39
41
  **ML systems** are systems *for* AI - they train, evaluate, and deploy models. **AI systems** are systems *with* AI - software where pretrained models operate as components inside a broader application. In that setting, the model is not the whole product; it is one building block among many. You are not optimizing weights - you are designing behavior, interfaces, and flow around a model. This is the space msgFlux occupies.