mojentic 1.0.0__tar.gz → 1.0.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 (154) hide show
  1. {mojentic-1.0.0 → mojentic-1.0.1}/PKG-INFO +11 -11
  2. {mojentic-1.0.0 → mojentic-1.0.1}/pyproject.toml +11 -11
  3. {mojentic-1.0.0 → mojentic-1.0.1}/src/_examples/streaming.py +0 -1
  4. {mojentic-1.0.0 → mojentic-1.0.1}/src/mojentic/llm/chat_session.py +24 -1
  5. {mojentic-1.0.0 → mojentic-1.0.1}/src/mojentic/llm/chat_session_spec.py +40 -0
  6. {mojentic-1.0.0 → mojentic-1.0.1}/src/mojentic.egg-info/PKG-INFO +11 -11
  7. {mojentic-1.0.0 → mojentic-1.0.1}/src/mojentic.egg-info/requires.txt +10 -10
  8. {mojentic-1.0.0 → mojentic-1.0.1}/LICENSE.md +0 -0
  9. {mojentic-1.0.0 → mojentic-1.0.1}/README.md +0 -0
  10. {mojentic-1.0.0 → mojentic-1.0.1}/setup.cfg +0 -0
  11. {mojentic-1.0.0 → mojentic-1.0.1}/src/_examples/__init__.py +0 -0
  12. {mojentic-1.0.0 → mojentic-1.0.1}/src/_examples/async_dispatcher_example.py +0 -0
  13. {mojentic-1.0.0 → mojentic-1.0.1}/src/_examples/async_llm_example.py +0 -0
  14. {mojentic-1.0.0 → mojentic-1.0.1}/src/_examples/broker_as_tool.py +0 -0
  15. {mojentic-1.0.0 → mojentic-1.0.1}/src/_examples/broker_examples.py +0 -0
  16. {mojentic-1.0.0 → mojentic-1.0.1}/src/_examples/broker_image_examples.py +0 -0
  17. {mojentic-1.0.0 → mojentic-1.0.1}/src/_examples/characterize_ollama.py +0 -0
  18. {mojentic-1.0.0 → mojentic-1.0.1}/src/_examples/characterize_openai.py +0 -0
  19. {mojentic-1.0.0 → mojentic-1.0.1}/src/_examples/chat_session.py +0 -0
  20. {mojentic-1.0.0 → mojentic-1.0.1}/src/_examples/chat_session_with_tool.py +0 -0
  21. {mojentic-1.0.0 → mojentic-1.0.1}/src/_examples/coding_file_tool.py +0 -0
  22. {mojentic-1.0.0 → mojentic-1.0.1}/src/_examples/current_datetime_tool_example.py +0 -0
  23. {mojentic-1.0.0 → mojentic-1.0.1}/src/_examples/design_analysis.py +0 -0
  24. {mojentic-1.0.0 → mojentic-1.0.1}/src/_examples/embeddings.py +0 -0
  25. {mojentic-1.0.0 → mojentic-1.0.1}/src/_examples/ensures_files_exist.py +0 -0
  26. {mojentic-1.0.0 → mojentic-1.0.1}/src/_examples/ephemeral_task_manager_example.py +0 -0
  27. {mojentic-1.0.0 → mojentic-1.0.1}/src/_examples/fetch_openai_models.py +0 -0
  28. {mojentic-1.0.0 → mojentic-1.0.1}/src/_examples/file_deduplication.py +0 -0
  29. {mojentic-1.0.0 → mojentic-1.0.1}/src/_examples/file_tool.py +0 -0
  30. {mojentic-1.0.0 → mojentic-1.0.1}/src/_examples/image_analysis.py +0 -0
  31. {mojentic-1.0.0 → mojentic-1.0.1}/src/_examples/image_broker.py +0 -0
  32. {mojentic-1.0.0 → mojentic-1.0.1}/src/_examples/image_broker_splat.py +0 -0
  33. {mojentic-1.0.0 → mojentic-1.0.1}/src/_examples/iterative_solver.py +0 -0
  34. {mojentic-1.0.0 → mojentic-1.0.1}/src/_examples/list_models.py +0 -0
  35. {mojentic-1.0.0 → mojentic-1.0.1}/src/_examples/model_characterization.py +0 -0
  36. {mojentic-1.0.0 → mojentic-1.0.1}/src/_examples/openai_gateway_enhanced_demo.py +0 -0
  37. {mojentic-1.0.0 → mojentic-1.0.1}/src/_examples/oversized_embeddings.py +0 -0
  38. {mojentic-1.0.0 → mojentic-1.0.1}/src/_examples/raw.py +0 -0
  39. {mojentic-1.0.0 → mojentic-1.0.1}/src/_examples/react/__init__.py +0 -0
  40. {mojentic-1.0.0 → mojentic-1.0.1}/src/_examples/react/agents/__init__.py +0 -0
  41. {mojentic-1.0.0 → mojentic-1.0.1}/src/_examples/react/agents/decisioning_agent.py +0 -0
  42. {mojentic-1.0.0 → mojentic-1.0.1}/src/_examples/react/agents/summarization_agent.py +0 -0
  43. {mojentic-1.0.0 → mojentic-1.0.1}/src/_examples/react/agents/thinking_agent.py +0 -0
  44. {mojentic-1.0.0 → mojentic-1.0.1}/src/_examples/react/agents/tool_call_agent.py +0 -0
  45. {mojentic-1.0.0 → mojentic-1.0.1}/src/_examples/react/formatters.py +0 -0
  46. {mojentic-1.0.0 → mojentic-1.0.1}/src/_examples/react/models/__init__.py +0 -0
  47. {mojentic-1.0.0 → mojentic-1.0.1}/src/_examples/react/models/base.py +0 -0
  48. {mojentic-1.0.0 → mojentic-1.0.1}/src/_examples/react/models/events.py +0 -0
  49. {mojentic-1.0.0 → mojentic-1.0.1}/src/_examples/react.py +0 -0
  50. {mojentic-1.0.0 → mojentic-1.0.1}/src/_examples/recursive_agent.py +0 -0
  51. {mojentic-1.0.0 → mojentic-1.0.1}/src/_examples/routed_send_response.py +0 -0
  52. {mojentic-1.0.0 → mojentic-1.0.1}/src/_examples/simple_llm.py +0 -0
  53. {mojentic-1.0.0 → mojentic-1.0.1}/src/_examples/simple_llm_repl.py +0 -0
  54. {mojentic-1.0.0 → mojentic-1.0.1}/src/_examples/simple_structured.py +0 -0
  55. {mojentic-1.0.0 → mojentic-1.0.1}/src/_examples/simple_tool.py +0 -0
  56. {mojentic-1.0.0 → mojentic-1.0.1}/src/_examples/solver_chat_session.py +0 -0
  57. {mojentic-1.0.0 → mojentic-1.0.1}/src/_examples/tell_user_example.py +0 -0
  58. {mojentic-1.0.0 → mojentic-1.0.1}/src/_examples/tracer_demo.py +0 -0
  59. {mojentic-1.0.0 → mojentic-1.0.1}/src/_examples/tracer_qt_viewer.py +0 -0
  60. {mojentic-1.0.0 → mojentic-1.0.1}/src/_examples/working_memory.py +0 -0
  61. {mojentic-1.0.0 → mojentic-1.0.1}/src/mojentic/__init__.py +0 -0
  62. {mojentic-1.0.0 → mojentic-1.0.1}/src/mojentic/agents/__init__.py +0 -0
  63. {mojentic-1.0.0 → mojentic-1.0.1}/src/mojentic/agents/agent_event_adapter.py +0 -0
  64. {mojentic-1.0.0 → mojentic-1.0.1}/src/mojentic/agents/async_aggregator_agent.py +0 -0
  65. {mojentic-1.0.0 → mojentic-1.0.1}/src/mojentic/agents/async_aggregator_agent_spec.py +0 -0
  66. {mojentic-1.0.0 → mojentic-1.0.1}/src/mojentic/agents/async_llm_agent.py +0 -0
  67. {mojentic-1.0.0 → mojentic-1.0.1}/src/mojentic/agents/async_llm_agent_spec.py +0 -0
  68. {mojentic-1.0.0 → mojentic-1.0.1}/src/mojentic/agents/base_agent.py +0 -0
  69. {mojentic-1.0.0 → mojentic-1.0.1}/src/mojentic/agents/base_async_agent.py +0 -0
  70. {mojentic-1.0.0 → mojentic-1.0.1}/src/mojentic/agents/base_llm_agent.py +0 -0
  71. {mojentic-1.0.0 → mojentic-1.0.1}/src/mojentic/agents/base_llm_agent_spec.py +0 -0
  72. {mojentic-1.0.0 → mojentic-1.0.1}/src/mojentic/agents/correlation_aggregator_agent.py +0 -0
  73. {mojentic-1.0.0 → mojentic-1.0.1}/src/mojentic/agents/iterative_problem_solver.py +0 -0
  74. {mojentic-1.0.0 → mojentic-1.0.1}/src/mojentic/agents/output_agent.py +0 -0
  75. {mojentic-1.0.0 → mojentic-1.0.1}/src/mojentic/agents/simple_recursive_agent.py +0 -0
  76. {mojentic-1.0.0 → mojentic-1.0.1}/src/mojentic/agents/simple_recursive_agent_spec.py +0 -0
  77. {mojentic-1.0.0 → mojentic-1.0.1}/src/mojentic/async_dispatcher.py +0 -0
  78. {mojentic-1.0.0 → mojentic-1.0.1}/src/mojentic/async_dispatcher_spec.py +0 -0
  79. {mojentic-1.0.0 → mojentic-1.0.1}/src/mojentic/context/__init__.py +0 -0
  80. {mojentic-1.0.0 → mojentic-1.0.1}/src/mojentic/context/shared_working_memory.py +0 -0
  81. {mojentic-1.0.0 → mojentic-1.0.1}/src/mojentic/dispatcher.py +0 -0
  82. {mojentic-1.0.0 → mojentic-1.0.1}/src/mojentic/event.py +0 -0
  83. {mojentic-1.0.0 → mojentic-1.0.1}/src/mojentic/llm/__init__.py +0 -0
  84. {mojentic-1.0.0 → mojentic-1.0.1}/src/mojentic/llm/gateways/__init__.py +0 -0
  85. {mojentic-1.0.0 → mojentic-1.0.1}/src/mojentic/llm/gateways/anthropic.py +0 -0
  86. {mojentic-1.0.0 → mojentic-1.0.1}/src/mojentic/llm/gateways/anthropic_messages_adapter.py +0 -0
  87. {mojentic-1.0.0 → mojentic-1.0.1}/src/mojentic/llm/gateways/embeddings_gateway.py +0 -0
  88. {mojentic-1.0.0 → mojentic-1.0.1}/src/mojentic/llm/gateways/file_gateway.py +0 -0
  89. {mojentic-1.0.0 → mojentic-1.0.1}/src/mojentic/llm/gateways/llm_gateway.py +0 -0
  90. {mojentic-1.0.0 → mojentic-1.0.1}/src/mojentic/llm/gateways/models.py +0 -0
  91. {mojentic-1.0.0 → mojentic-1.0.1}/src/mojentic/llm/gateways/ollama.py +0 -0
  92. {mojentic-1.0.0 → mojentic-1.0.1}/src/mojentic/llm/gateways/ollama_messages_adapter.py +0 -0
  93. {mojentic-1.0.0 → mojentic-1.0.1}/src/mojentic/llm/gateways/ollama_messages_adapter_spec.py +0 -0
  94. {mojentic-1.0.0 → mojentic-1.0.1}/src/mojentic/llm/gateways/openai.py +0 -0
  95. {mojentic-1.0.0 → mojentic-1.0.1}/src/mojentic/llm/gateways/openai_message_adapter_spec.py +0 -0
  96. {mojentic-1.0.0 → mojentic-1.0.1}/src/mojentic/llm/gateways/openai_messages_adapter.py +0 -0
  97. {mojentic-1.0.0 → mojentic-1.0.1}/src/mojentic/llm/gateways/openai_model_registry.py +0 -0
  98. {mojentic-1.0.0 → mojentic-1.0.1}/src/mojentic/llm/gateways/openai_model_registry_spec.py +0 -0
  99. {mojentic-1.0.0 → mojentic-1.0.1}/src/mojentic/llm/gateways/openai_spec.py +0 -0
  100. {mojentic-1.0.0 → mojentic-1.0.1}/src/mojentic/llm/gateways/openai_temperature_handling_spec.py +0 -0
  101. {mojentic-1.0.0 → mojentic-1.0.1}/src/mojentic/llm/gateways/tokenizer_gateway.py +0 -0
  102. {mojentic-1.0.0 → mojentic-1.0.1}/src/mojentic/llm/llm_broker.py +0 -0
  103. {mojentic-1.0.0 → mojentic-1.0.1}/src/mojentic/llm/llm_broker_spec.py +0 -0
  104. {mojentic-1.0.0 → mojentic-1.0.1}/src/mojentic/llm/message_composers.py +0 -0
  105. {mojentic-1.0.0 → mojentic-1.0.1}/src/mojentic/llm/message_composers_spec.py +0 -0
  106. {mojentic-1.0.0 → mojentic-1.0.1}/src/mojentic/llm/registry/__init__.py +0 -0
  107. {mojentic-1.0.0 → mojentic-1.0.1}/src/mojentic/llm/registry/llm_registry.py +0 -0
  108. {mojentic-1.0.0 → mojentic-1.0.1}/src/mojentic/llm/registry/models.py +0 -0
  109. {mojentic-1.0.0 → mojentic-1.0.1}/src/mojentic/llm/registry/populate_registry_from_ollama.py +0 -0
  110. {mojentic-1.0.0 → mojentic-1.0.1}/src/mojentic/llm/tools/__init__.py +0 -0
  111. {mojentic-1.0.0 → mojentic-1.0.1}/src/mojentic/llm/tools/ask_user_tool.py +0 -0
  112. {mojentic-1.0.0 → mojentic-1.0.1}/src/mojentic/llm/tools/current_datetime.py +0 -0
  113. {mojentic-1.0.0 → mojentic-1.0.1}/src/mojentic/llm/tools/date_resolver.py +0 -0
  114. {mojentic-1.0.0 → mojentic-1.0.1}/src/mojentic/llm/tools/date_resolver_spec.py +0 -0
  115. {mojentic-1.0.0 → mojentic-1.0.1}/src/mojentic/llm/tools/ephemeral_task_manager/__init__.py +0 -0
  116. {mojentic-1.0.0 → mojentic-1.0.1}/src/mojentic/llm/tools/ephemeral_task_manager/append_task_tool.py +0 -0
  117. {mojentic-1.0.0 → mojentic-1.0.1}/src/mojentic/llm/tools/ephemeral_task_manager/append_task_tool_spec.py +0 -0
  118. {mojentic-1.0.0 → mojentic-1.0.1}/src/mojentic/llm/tools/ephemeral_task_manager/clear_tasks_tool.py +0 -0
  119. {mojentic-1.0.0 → mojentic-1.0.1}/src/mojentic/llm/tools/ephemeral_task_manager/clear_tasks_tool_spec.py +0 -0
  120. {mojentic-1.0.0 → mojentic-1.0.1}/src/mojentic/llm/tools/ephemeral_task_manager/complete_task_tool.py +0 -0
  121. {mojentic-1.0.0 → mojentic-1.0.1}/src/mojentic/llm/tools/ephemeral_task_manager/complete_task_tool_spec.py +0 -0
  122. {mojentic-1.0.0 → mojentic-1.0.1}/src/mojentic/llm/tools/ephemeral_task_manager/ephemeral_task_list.py +0 -0
  123. {mojentic-1.0.0 → mojentic-1.0.1}/src/mojentic/llm/tools/ephemeral_task_manager/ephemeral_task_list_spec.py +0 -0
  124. {mojentic-1.0.0 → mojentic-1.0.1}/src/mojentic/llm/tools/ephemeral_task_manager/insert_task_after_tool.py +0 -0
  125. {mojentic-1.0.0 → mojentic-1.0.1}/src/mojentic/llm/tools/ephemeral_task_manager/insert_task_after_tool_spec.py +0 -0
  126. {mojentic-1.0.0 → mojentic-1.0.1}/src/mojentic/llm/tools/ephemeral_task_manager/list_tasks_tool.py +0 -0
  127. {mojentic-1.0.0 → mojentic-1.0.1}/src/mojentic/llm/tools/ephemeral_task_manager/list_tasks_tool_spec.py +0 -0
  128. {mojentic-1.0.0 → mojentic-1.0.1}/src/mojentic/llm/tools/ephemeral_task_manager/prepend_task_tool.py +0 -0
  129. {mojentic-1.0.0 → mojentic-1.0.1}/src/mojentic/llm/tools/ephemeral_task_manager/prepend_task_tool_spec.py +0 -0
  130. {mojentic-1.0.0 → mojentic-1.0.1}/src/mojentic/llm/tools/ephemeral_task_manager/start_task_tool.py +0 -0
  131. {mojentic-1.0.0 → mojentic-1.0.1}/src/mojentic/llm/tools/ephemeral_task_manager/start_task_tool_spec.py +0 -0
  132. {mojentic-1.0.0 → mojentic-1.0.1}/src/mojentic/llm/tools/file_manager.py +0 -0
  133. {mojentic-1.0.0 → mojentic-1.0.1}/src/mojentic/llm/tools/file_manager_spec.py +0 -0
  134. {mojentic-1.0.0 → mojentic-1.0.1}/src/mojentic/llm/tools/llm_tool.py +0 -0
  135. {mojentic-1.0.0 → mojentic-1.0.1}/src/mojentic/llm/tools/llm_tool_spec.py +0 -0
  136. {mojentic-1.0.0 → mojentic-1.0.1}/src/mojentic/llm/tools/organic_web_search.py +0 -0
  137. {mojentic-1.0.0 → mojentic-1.0.1}/src/mojentic/llm/tools/tell_user_tool.py +0 -0
  138. {mojentic-1.0.0 → mojentic-1.0.1}/src/mojentic/llm/tools/tool_wrapper.py +0 -0
  139. {mojentic-1.0.0 → mojentic-1.0.1}/src/mojentic/llm/tools/tool_wrapper_spec.py +0 -0
  140. {mojentic-1.0.0 → mojentic-1.0.1}/src/mojentic/router.py +0 -0
  141. {mojentic-1.0.0 → mojentic-1.0.1}/src/mojentic/router_spec.py +0 -0
  142. {mojentic-1.0.0 → mojentic-1.0.1}/src/mojentic/tracer/__init__.py +0 -0
  143. {mojentic-1.0.0 → mojentic-1.0.1}/src/mojentic/tracer/event_store.py +0 -0
  144. {mojentic-1.0.0 → mojentic-1.0.1}/src/mojentic/tracer/event_store_spec.py +0 -0
  145. {mojentic-1.0.0 → mojentic-1.0.1}/src/mojentic/tracer/null_tracer.py +0 -0
  146. {mojentic-1.0.0 → mojentic-1.0.1}/src/mojentic/tracer/tracer_events.py +0 -0
  147. {mojentic-1.0.0 → mojentic-1.0.1}/src/mojentic/tracer/tracer_events_spec.py +0 -0
  148. {mojentic-1.0.0 → mojentic-1.0.1}/src/mojentic/tracer/tracer_system.py +0 -0
  149. {mojentic-1.0.0 → mojentic-1.0.1}/src/mojentic/tracer/tracer_system_spec.py +0 -0
  150. {mojentic-1.0.0 → mojentic-1.0.1}/src/mojentic/utils/__init__.py +0 -0
  151. {mojentic-1.0.0 → mojentic-1.0.1}/src/mojentic/utils/formatting.py +0 -0
  152. {mojentic-1.0.0 → mojentic-1.0.1}/src/mojentic.egg-info/SOURCES.txt +0 -0
  153. {mojentic-1.0.0 → mojentic-1.0.1}/src/mojentic.egg-info/dependency_links.txt +0 -0
  154. {mojentic-1.0.0 → mojentic-1.0.1}/src/mojentic.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: mojentic
3
- Version: 1.0.0
3
+ Version: 1.0.1
4
4
  Summary: Mojentic is an agentic framework that aims to provide a simple and flexible way to assemble teams of agents to solve complex problems.
5
5
  Author-email: Stacey Vetzal <stacey@vetzal.com>
6
6
  Project-URL: Homepage, https://github.com/svetzal/mojentic
@@ -11,28 +11,28 @@ Classifier: Operating System :: OS Independent
11
11
  Requires-Python: >=3.11
12
12
  Description-Content-Type: text/markdown
13
13
  License-File: LICENSE.md
14
- Requires-Dist: pydantic>=2.8.0
14
+ Requires-Dist: pydantic>=2.12.5
15
15
  Requires-Dist: structlog>=25.5.0
16
16
  Requires-Dist: numpy>=2.3.5
17
- Requires-Dist: ollama>=0.1.6
18
- Requires-Dist: openai>=2.8.1
19
- Requires-Dist: anthropic>=0.74.1
17
+ Requires-Dist: ollama>=0.6.1
18
+ Requires-Dist: openai>=2.12.0
19
+ Requires-Dist: anthropic>=0.75.0
20
20
  Requires-Dist: tiktoken>=0.12.0
21
21
  Requires-Dist: parsedatetime>=2.6
22
22
  Requires-Dist: pytz>=2025.2
23
23
  Requires-Dist: serpapi>=0.1.5
24
24
  Requires-Dist: colorama>=0.4.6
25
25
  Provides-Extra: dev
26
- Requires-Dist: pytest>=9.0.1; extra == "dev"
26
+ Requires-Dist: pytest>=9.0.2; extra == "dev"
27
27
  Requires-Dist: pytest-asyncio>=1.3.0; extra == "dev"
28
28
  Requires-Dist: pytest-spec>=5.2.0; extra == "dev"
29
29
  Requires-Dist: pytest-cov>=7.0.0; extra == "dev"
30
- Requires-Dist: pytest-mock>=3.10.0; extra == "dev"
30
+ Requires-Dist: pytest-mock>=3.15.0; extra == "dev"
31
31
  Requires-Dist: flake8>=7.3.0; extra == "dev"
32
- Requires-Dist: bandit>=1.7.0; extra == "dev"
33
- Requires-Dist: pip-audit>=2.0.0; extra == "dev"
34
- Requires-Dist: mkdocs>=1.5.2; extra == "dev"
35
- Requires-Dist: mkdocs-material>=9.6.10; extra == "dev"
32
+ Requires-Dist: bandit>=1.9.2; extra == "dev"
33
+ Requires-Dist: pip-audit>=2.10.0; extra == "dev"
34
+ Requires-Dist: mkdocs>=1.6.1; extra == "dev"
35
+ Requires-Dist: mkdocs-material>=9.7.0; extra == "dev"
36
36
  Requires-Dist: mkdocs-llmstxt>=0.4.0; extra == "dev"
37
37
  Requires-Dist: mkdocstrings[python]>=0.21.0; extra == "dev"
38
38
  Requires-Dist: griffe-fieldz>=0.3.0; extra == "dev"
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "mojentic"
3
- version = "1.0.0"
3
+ version = "1.0.1"
4
4
  authors = [
5
5
  { name = "Stacey Vetzal", email = "stacey@vetzal.com" },
6
6
  ]
@@ -14,12 +14,12 @@ classifiers = [
14
14
  ]
15
15
 
16
16
  dependencies = [
17
- "pydantic>=2.8.0",
17
+ "pydantic>=2.12.5",
18
18
  "structlog>=25.5.0",
19
19
  "numpy>=2.3.5",
20
- "ollama>=0.1.6",
21
- "openai>=2.8.1",
22
- "anthropic>=0.74.1",
20
+ "ollama>=0.6.1",
21
+ "openai>=2.12.0",
22
+ "anthropic>=0.75.0",
23
23
  "tiktoken>=0.12.0",
24
24
  "parsedatetime>=2.6",
25
25
  "pytz>=2025.2",
@@ -29,16 +29,16 @@ dependencies = [
29
29
 
30
30
  [project.optional-dependencies]
31
31
  dev = [
32
- "pytest>=9.0.1",
32
+ "pytest>=9.0.2",
33
33
  "pytest-asyncio>=1.3.0",
34
34
  "pytest-spec>=5.2.0",
35
35
  "pytest-cov>=7.0.0",
36
- "pytest-mock>=3.10.0",
36
+ "pytest-mock>=3.15.0",
37
37
  "flake8>=7.3.0",
38
- "bandit>=1.7.0",
39
- "pip-audit>=2.0.0",
40
- "mkdocs>=1.5.2",
41
- "mkdocs-material>=9.6.10",
38
+ "bandit>=1.9.2",
39
+ "pip-audit>=2.10.0",
40
+ "mkdocs>=1.6.1",
41
+ "mkdocs-material>=9.7.0",
42
42
  "mkdocs-llmstxt>=0.4.0",
43
43
  "mkdocstrings[python]>=0.21.0",
44
44
  "griffe-fieldz>=0.3.0",
@@ -41,7 +41,6 @@ def main():
41
41
  num_ctx=32768,
42
42
  num_predict=-1
43
43
  )
44
-
45
44
  for chunk in stream:
46
45
  print(chunk, end='', flush=True)
47
46
 
@@ -1,4 +1,4 @@
1
- from typing import List, Optional
1
+ from typing import Iterator, List, Optional
2
2
 
3
3
  from mojentic.llm import LLMBroker
4
4
  from mojentic.llm.gateways.models import LLMMessage, MessageRole
@@ -78,6 +78,29 @@ class ChatSession:
78
78
  self.insert_message(LLMMessage(role=MessageRole.Assistant, content=response))
79
79
  return response
80
80
 
81
+ def send_stream(self, query) -> Iterator[str]:
82
+ """
83
+ Send a query to the LLM and yield response chunks as they arrive. Records the query and
84
+ the full assembled response in the ongoing chat session after the stream is consumed.
85
+
86
+ Parameters
87
+ ----------
88
+ query : str
89
+ The query to send to the LLM.
90
+
91
+ Yields
92
+ ------
93
+ str
94
+ Content chunks from the LLM response as they arrive.
95
+ """
96
+ self.insert_message(LLMMessage(role=MessageRole.User, content=query))
97
+ accumulated = []
98
+ for chunk in self.llm.generate_stream(self.messages, tools=self.tools, temperature=self.temperature):
99
+ accumulated.append(chunk)
100
+ yield chunk
101
+ self._ensure_all_messages_are_sized()
102
+ self.insert_message(LLMMessage(role=MessageRole.Assistant, content="".join(accumulated)))
103
+
81
104
  def insert_message(self, message: LLMMessage):
82
105
  """
83
106
  Add a message onto the end of the chat session. If the total token count exceeds the max context, the oldest
@@ -94,6 +94,46 @@ class DescribeChatSession:
94
94
  assert chat_session.messages[1].content == "Query message 2"
95
95
  assert chat_session.messages[2].content == INTENDED_RESPONSE_MESSAGE
96
96
 
97
+ class DescribeStreamingSend:
98
+
99
+ def should_yield_content_chunks(self, chat_session):
100
+ chat_session.llm.generate_stream.return_value = iter(["Hello", " world"])
101
+
102
+ chunks = list(chat_session.send_stream("Query message"))
103
+
104
+ assert chunks == ["Hello", " world"]
105
+
106
+ def should_grow_message_history_after_stream_consumed(self, chat_session):
107
+ chat_session.llm.generate_stream.return_value = iter(["Response"])
108
+
109
+ list(chat_session.send_stream("Query message"))
110
+
111
+ assert len(chat_session.messages) == 3
112
+
113
+ def should_record_full_assembled_response_in_history(self, chat_session):
114
+ chat_session.llm.generate_stream.return_value = iter(["Hello", " world"])
115
+
116
+ list(chat_session.send_stream("Query message"))
117
+
118
+ assert chat_session.messages[2].content == "Hello world"
119
+
120
+ def should_record_user_message_in_history(self, chat_session):
121
+ chat_session.llm.generate_stream.return_value = iter(["Response"])
122
+
123
+ list(chat_session.send_stream("Query message"))
124
+
125
+ assert chat_session.messages[1].role == MessageRole.User
126
+ assert chat_session.messages[1].content == "Query message"
127
+
128
+ def should_respect_context_capacity(self, chat_session):
129
+ chat_session.llm.generate_stream.return_value = iter(["Response 1"])
130
+ list(chat_session.send_stream("Query 1"))
131
+
132
+ chat_session.llm.generate_stream.return_value = iter(["Response 2"])
133
+ list(chat_session.send_stream("Query 2"))
134
+
135
+ assert len(chat_session.messages) == 3
136
+
97
137
  class DescribeMessageRoles:
98
138
  """
99
139
  Specifications for message role handling
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: mojentic
3
- Version: 1.0.0
3
+ Version: 1.0.1
4
4
  Summary: Mojentic is an agentic framework that aims to provide a simple and flexible way to assemble teams of agents to solve complex problems.
5
5
  Author-email: Stacey Vetzal <stacey@vetzal.com>
6
6
  Project-URL: Homepage, https://github.com/svetzal/mojentic
@@ -11,28 +11,28 @@ Classifier: Operating System :: OS Independent
11
11
  Requires-Python: >=3.11
12
12
  Description-Content-Type: text/markdown
13
13
  License-File: LICENSE.md
14
- Requires-Dist: pydantic>=2.8.0
14
+ Requires-Dist: pydantic>=2.12.5
15
15
  Requires-Dist: structlog>=25.5.0
16
16
  Requires-Dist: numpy>=2.3.5
17
- Requires-Dist: ollama>=0.1.6
18
- Requires-Dist: openai>=2.8.1
19
- Requires-Dist: anthropic>=0.74.1
17
+ Requires-Dist: ollama>=0.6.1
18
+ Requires-Dist: openai>=2.12.0
19
+ Requires-Dist: anthropic>=0.75.0
20
20
  Requires-Dist: tiktoken>=0.12.0
21
21
  Requires-Dist: parsedatetime>=2.6
22
22
  Requires-Dist: pytz>=2025.2
23
23
  Requires-Dist: serpapi>=0.1.5
24
24
  Requires-Dist: colorama>=0.4.6
25
25
  Provides-Extra: dev
26
- Requires-Dist: pytest>=9.0.1; extra == "dev"
26
+ Requires-Dist: pytest>=9.0.2; extra == "dev"
27
27
  Requires-Dist: pytest-asyncio>=1.3.0; extra == "dev"
28
28
  Requires-Dist: pytest-spec>=5.2.0; extra == "dev"
29
29
  Requires-Dist: pytest-cov>=7.0.0; extra == "dev"
30
- Requires-Dist: pytest-mock>=3.10.0; extra == "dev"
30
+ Requires-Dist: pytest-mock>=3.15.0; extra == "dev"
31
31
  Requires-Dist: flake8>=7.3.0; extra == "dev"
32
- Requires-Dist: bandit>=1.7.0; extra == "dev"
33
- Requires-Dist: pip-audit>=2.0.0; extra == "dev"
34
- Requires-Dist: mkdocs>=1.5.2; extra == "dev"
35
- Requires-Dist: mkdocs-material>=9.6.10; extra == "dev"
32
+ Requires-Dist: bandit>=1.9.2; extra == "dev"
33
+ Requires-Dist: pip-audit>=2.10.0; extra == "dev"
34
+ Requires-Dist: mkdocs>=1.6.1; extra == "dev"
35
+ Requires-Dist: mkdocs-material>=9.7.0; extra == "dev"
36
36
  Requires-Dist: mkdocs-llmstxt>=0.4.0; extra == "dev"
37
37
  Requires-Dist: mkdocstrings[python]>=0.21.0; extra == "dev"
38
38
  Requires-Dist: griffe-fieldz>=0.3.0; extra == "dev"
@@ -1,9 +1,9 @@
1
- pydantic>=2.8.0
1
+ pydantic>=2.12.5
2
2
  structlog>=25.5.0
3
3
  numpy>=2.3.5
4
- ollama>=0.1.6
5
- openai>=2.8.1
6
- anthropic>=0.74.1
4
+ ollama>=0.6.1
5
+ openai>=2.12.0
6
+ anthropic>=0.75.0
7
7
  tiktoken>=0.12.0
8
8
  parsedatetime>=2.6
9
9
  pytz>=2025.2
@@ -11,16 +11,16 @@ serpapi>=0.1.5
11
11
  colorama>=0.4.6
12
12
 
13
13
  [dev]
14
- pytest>=9.0.1
14
+ pytest>=9.0.2
15
15
  pytest-asyncio>=1.3.0
16
16
  pytest-spec>=5.2.0
17
17
  pytest-cov>=7.0.0
18
- pytest-mock>=3.10.0
18
+ pytest-mock>=3.15.0
19
19
  flake8>=7.3.0
20
- bandit>=1.7.0
21
- pip-audit>=2.0.0
22
- mkdocs>=1.5.2
23
- mkdocs-material>=9.6.10
20
+ bandit>=1.9.2
21
+ pip-audit>=2.10.0
22
+ mkdocs>=1.6.1
23
+ mkdocs-material>=9.7.0
24
24
  mkdocs-llmstxt>=0.4.0
25
25
  mkdocstrings[python]>=0.21.0
26
26
  griffe-fieldz>=0.3.0
File without changes
File without changes
File without changes
File without changes
File without changes