mojentic 0.7.3__tar.gz → 0.7.4__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 (144) hide show
  1. {mojentic-0.7.3/src/mojentic.egg-info → mojentic-0.7.4}/PKG-INFO +1 -1
  2. {mojentic-0.7.3 → mojentic-0.7.4}/pyproject.toml +1 -1
  3. mojentic-0.7.4/src/_examples/model_characterization.py +73 -0
  4. {mojentic-0.7.3 → mojentic-0.7.4}/src/mojentic/llm/gateways/openai.py +66 -8
  5. {mojentic-0.7.3 → mojentic-0.7.4/src/mojentic.egg-info}/PKG-INFO +1 -1
  6. {mojentic-0.7.3 → mojentic-0.7.4}/src/mojentic.egg-info/SOURCES.txt +1 -0
  7. {mojentic-0.7.3 → mojentic-0.7.4}/LICENSE.md +0 -0
  8. {mojentic-0.7.3 → mojentic-0.7.4}/README.md +0 -0
  9. {mojentic-0.7.3 → mojentic-0.7.4}/setup.cfg +0 -0
  10. {mojentic-0.7.3 → mojentic-0.7.4}/src/_examples/__init__.py +0 -0
  11. {mojentic-0.7.3 → mojentic-0.7.4}/src/_examples/async_dispatcher_example.py +0 -0
  12. {mojentic-0.7.3 → mojentic-0.7.4}/src/_examples/async_llm_example.py +0 -0
  13. {mojentic-0.7.3 → mojentic-0.7.4}/src/_examples/broker_as_tool.py +0 -0
  14. {mojentic-0.7.3 → mojentic-0.7.4}/src/_examples/broker_examples.py +0 -0
  15. {mojentic-0.7.3 → mojentic-0.7.4}/src/_examples/broker_image_examples.py +0 -0
  16. {mojentic-0.7.3 → mojentic-0.7.4}/src/_examples/characterize_ollama.py +0 -0
  17. {mojentic-0.7.3 → mojentic-0.7.4}/src/_examples/characterize_openai.py +0 -0
  18. {mojentic-0.7.3 → mojentic-0.7.4}/src/_examples/chat_session.py +0 -0
  19. {mojentic-0.7.3 → mojentic-0.7.4}/src/_examples/chat_session_with_tool.py +0 -0
  20. {mojentic-0.7.3 → mojentic-0.7.4}/src/_examples/coding_file_tool.py +0 -0
  21. {mojentic-0.7.3 → mojentic-0.7.4}/src/_examples/current_datetime_tool_example.py +0 -0
  22. {mojentic-0.7.3 → mojentic-0.7.4}/src/_examples/design_analysis.py +0 -0
  23. {mojentic-0.7.3 → mojentic-0.7.4}/src/_examples/embeddings.py +0 -0
  24. {mojentic-0.7.3 → mojentic-0.7.4}/src/_examples/ensures_files_exist.py +0 -0
  25. {mojentic-0.7.3 → mojentic-0.7.4}/src/_examples/ephemeral_task_manager_example.py +0 -0
  26. {mojentic-0.7.3 → mojentic-0.7.4}/src/_examples/file_deduplication.py +0 -0
  27. {mojentic-0.7.3 → mojentic-0.7.4}/src/_examples/file_tool.py +0 -0
  28. {mojentic-0.7.3 → mojentic-0.7.4}/src/_examples/image_analysis.py +0 -0
  29. {mojentic-0.7.3 → mojentic-0.7.4}/src/_examples/image_broker.py +0 -0
  30. {mojentic-0.7.3 → mojentic-0.7.4}/src/_examples/image_broker_splat.py +0 -0
  31. {mojentic-0.7.3 → mojentic-0.7.4}/src/_examples/iterative_solver.py +0 -0
  32. {mojentic-0.7.3 → mojentic-0.7.4}/src/_examples/list_models.py +0 -0
  33. {mojentic-0.7.3 → mojentic-0.7.4}/src/_examples/oversized_embeddings.py +0 -0
  34. {mojentic-0.7.3 → mojentic-0.7.4}/src/_examples/raw.py +0 -0
  35. {mojentic-0.7.3 → mojentic-0.7.4}/src/_examples/react/__init__.py +0 -0
  36. {mojentic-0.7.3 → mojentic-0.7.4}/src/_examples/react/agents/__init__.py +0 -0
  37. {mojentic-0.7.3 → mojentic-0.7.4}/src/_examples/react/agents/decisioning_agent.py +0 -0
  38. {mojentic-0.7.3 → mojentic-0.7.4}/src/_examples/react/agents/thinking_agent.py +0 -0
  39. {mojentic-0.7.3 → mojentic-0.7.4}/src/_examples/react/formatters.py +0 -0
  40. {mojentic-0.7.3 → mojentic-0.7.4}/src/_examples/react/models/__init__.py +0 -0
  41. {mojentic-0.7.3 → mojentic-0.7.4}/src/_examples/react/models/base.py +0 -0
  42. {mojentic-0.7.3 → mojentic-0.7.4}/src/_examples/react/models/events.py +0 -0
  43. {mojentic-0.7.3 → mojentic-0.7.4}/src/_examples/react.py +0 -0
  44. {mojentic-0.7.3 → mojentic-0.7.4}/src/_examples/recursive_agent.py +0 -0
  45. {mojentic-0.7.3 → mojentic-0.7.4}/src/_examples/routed_send_response.py +0 -0
  46. {mojentic-0.7.3 → mojentic-0.7.4}/src/_examples/simple_llm.py +0 -0
  47. {mojentic-0.7.3 → mojentic-0.7.4}/src/_examples/simple_llm_repl.py +0 -0
  48. {mojentic-0.7.3 → mojentic-0.7.4}/src/_examples/simple_structured.py +0 -0
  49. {mojentic-0.7.3 → mojentic-0.7.4}/src/_examples/simple_tool.py +0 -0
  50. {mojentic-0.7.3 → mojentic-0.7.4}/src/_examples/solver_chat_session.py +0 -0
  51. {mojentic-0.7.3 → mojentic-0.7.4}/src/_examples/streaming.py +0 -0
  52. {mojentic-0.7.3 → mojentic-0.7.4}/src/_examples/tell_user_example.py +0 -0
  53. {mojentic-0.7.3 → mojentic-0.7.4}/src/_examples/tracer_demo.py +0 -0
  54. {mojentic-0.7.3 → mojentic-0.7.4}/src/_examples/working_memory.py +0 -0
  55. {mojentic-0.7.3 → mojentic-0.7.4}/src/mojentic/__init__.py +0 -0
  56. {mojentic-0.7.3 → mojentic-0.7.4}/src/mojentic/agents/__init__.py +0 -0
  57. {mojentic-0.7.3 → mojentic-0.7.4}/src/mojentic/agents/agent_broker.py +0 -0
  58. {mojentic-0.7.3 → mojentic-0.7.4}/src/mojentic/agents/async_aggregator_agent.py +0 -0
  59. {mojentic-0.7.3 → mojentic-0.7.4}/src/mojentic/agents/async_aggregator_agent_spec.py +0 -0
  60. {mojentic-0.7.3 → mojentic-0.7.4}/src/mojentic/agents/async_llm_agent.py +0 -0
  61. {mojentic-0.7.3 → mojentic-0.7.4}/src/mojentic/agents/async_llm_agent_spec.py +0 -0
  62. {mojentic-0.7.3 → mojentic-0.7.4}/src/mojentic/agents/base_agent.py +0 -0
  63. {mojentic-0.7.3 → mojentic-0.7.4}/src/mojentic/agents/base_async_agent.py +0 -0
  64. {mojentic-0.7.3 → mojentic-0.7.4}/src/mojentic/agents/base_llm_agent.py +0 -0
  65. {mojentic-0.7.3 → mojentic-0.7.4}/src/mojentic/agents/base_llm_agent_spec.py +0 -0
  66. {mojentic-0.7.3 → mojentic-0.7.4}/src/mojentic/agents/correlation_aggregator_agent.py +0 -0
  67. {mojentic-0.7.3 → mojentic-0.7.4}/src/mojentic/agents/iterative_problem_solver.py +0 -0
  68. {mojentic-0.7.3 → mojentic-0.7.4}/src/mojentic/agents/output_agent.py +0 -0
  69. {mojentic-0.7.3 → mojentic-0.7.4}/src/mojentic/agents/simple_recursive_agent.py +0 -0
  70. {mojentic-0.7.3 → mojentic-0.7.4}/src/mojentic/async_dispatcher.py +0 -0
  71. {mojentic-0.7.3 → mojentic-0.7.4}/src/mojentic/async_dispatcher_spec.py +0 -0
  72. {mojentic-0.7.3 → mojentic-0.7.4}/src/mojentic/context/__init__.py +0 -0
  73. {mojentic-0.7.3 → mojentic-0.7.4}/src/mojentic/context/shared_working_memory.py +0 -0
  74. {mojentic-0.7.3 → mojentic-0.7.4}/src/mojentic/dispatcher.py +0 -0
  75. {mojentic-0.7.3 → mojentic-0.7.4}/src/mojentic/event.py +0 -0
  76. {mojentic-0.7.3 → mojentic-0.7.4}/src/mojentic/llm/__init__.py +0 -0
  77. {mojentic-0.7.3 → mojentic-0.7.4}/src/mojentic/llm/chat_session.py +0 -0
  78. {mojentic-0.7.3 → mojentic-0.7.4}/src/mojentic/llm/chat_session_spec.py +0 -0
  79. {mojentic-0.7.3 → mojentic-0.7.4}/src/mojentic/llm/gateways/__init__.py +0 -0
  80. {mojentic-0.7.3 → mojentic-0.7.4}/src/mojentic/llm/gateways/anthropic.py +0 -0
  81. {mojentic-0.7.3 → mojentic-0.7.4}/src/mojentic/llm/gateways/anthropic_messages_adapter.py +0 -0
  82. {mojentic-0.7.3 → mojentic-0.7.4}/src/mojentic/llm/gateways/embeddings_gateway.py +0 -0
  83. {mojentic-0.7.3 → mojentic-0.7.4}/src/mojentic/llm/gateways/file_gateway.py +0 -0
  84. {mojentic-0.7.3 → mojentic-0.7.4}/src/mojentic/llm/gateways/llm_gateway.py +0 -0
  85. {mojentic-0.7.3 → mojentic-0.7.4}/src/mojentic/llm/gateways/models.py +0 -0
  86. {mojentic-0.7.3 → mojentic-0.7.4}/src/mojentic/llm/gateways/ollama.py +0 -0
  87. {mojentic-0.7.3 → mojentic-0.7.4}/src/mojentic/llm/gateways/ollama_messages_adapter.py +0 -0
  88. {mojentic-0.7.3 → mojentic-0.7.4}/src/mojentic/llm/gateways/ollama_messages_adapter_spec.py +0 -0
  89. {mojentic-0.7.3 → mojentic-0.7.4}/src/mojentic/llm/gateways/openai_message_adapter_spec.py +0 -0
  90. {mojentic-0.7.3 → mojentic-0.7.4}/src/mojentic/llm/gateways/openai_messages_adapter.py +0 -0
  91. {mojentic-0.7.3 → mojentic-0.7.4}/src/mojentic/llm/gateways/tokenizer_gateway.py +0 -0
  92. {mojentic-0.7.3 → mojentic-0.7.4}/src/mojentic/llm/llm_broker.py +0 -0
  93. {mojentic-0.7.3 → mojentic-0.7.4}/src/mojentic/llm/llm_broker_spec.py +0 -0
  94. {mojentic-0.7.3 → mojentic-0.7.4}/src/mojentic/llm/message_composers.py +0 -0
  95. {mojentic-0.7.3 → mojentic-0.7.4}/src/mojentic/llm/message_composers_spec.py +0 -0
  96. {mojentic-0.7.3 → mojentic-0.7.4}/src/mojentic/llm/registry/__init__.py +0 -0
  97. {mojentic-0.7.3 → mojentic-0.7.4}/src/mojentic/llm/registry/llm_registry.py +0 -0
  98. {mojentic-0.7.3 → mojentic-0.7.4}/src/mojentic/llm/registry/models.py +0 -0
  99. {mojentic-0.7.3 → mojentic-0.7.4}/src/mojentic/llm/registry/populate_registry_from_ollama.py +0 -0
  100. {mojentic-0.7.3 → mojentic-0.7.4}/src/mojentic/llm/tools/__init__.py +0 -0
  101. {mojentic-0.7.3 → mojentic-0.7.4}/src/mojentic/llm/tools/ask_user_tool.py +0 -0
  102. {mojentic-0.7.3 → mojentic-0.7.4}/src/mojentic/llm/tools/current_datetime.py +0 -0
  103. {mojentic-0.7.3 → mojentic-0.7.4}/src/mojentic/llm/tools/date_resolver.py +0 -0
  104. {mojentic-0.7.3 → mojentic-0.7.4}/src/mojentic/llm/tools/date_resolver_spec.py +0 -0
  105. {mojentic-0.7.3 → mojentic-0.7.4}/src/mojentic/llm/tools/ephemeral_task_manager/__init__.py +0 -0
  106. {mojentic-0.7.3 → mojentic-0.7.4}/src/mojentic/llm/tools/ephemeral_task_manager/append_task_tool.py +0 -0
  107. {mojentic-0.7.3 → mojentic-0.7.4}/src/mojentic/llm/tools/ephemeral_task_manager/append_task_tool_spec.py +0 -0
  108. {mojentic-0.7.3 → mojentic-0.7.4}/src/mojentic/llm/tools/ephemeral_task_manager/clear_tasks_tool.py +0 -0
  109. {mojentic-0.7.3 → mojentic-0.7.4}/src/mojentic/llm/tools/ephemeral_task_manager/clear_tasks_tool_spec.py +0 -0
  110. {mojentic-0.7.3 → mojentic-0.7.4}/src/mojentic/llm/tools/ephemeral_task_manager/complete_task_tool.py +0 -0
  111. {mojentic-0.7.3 → mojentic-0.7.4}/src/mojentic/llm/tools/ephemeral_task_manager/complete_task_tool_spec.py +0 -0
  112. {mojentic-0.7.3 → mojentic-0.7.4}/src/mojentic/llm/tools/ephemeral_task_manager/ephemeral_task_list.py +0 -0
  113. {mojentic-0.7.3 → mojentic-0.7.4}/src/mojentic/llm/tools/ephemeral_task_manager/ephemeral_task_list_spec.py +0 -0
  114. {mojentic-0.7.3 → mojentic-0.7.4}/src/mojentic/llm/tools/ephemeral_task_manager/insert_task_after_tool.py +0 -0
  115. {mojentic-0.7.3 → mojentic-0.7.4}/src/mojentic/llm/tools/ephemeral_task_manager/insert_task_after_tool_spec.py +0 -0
  116. {mojentic-0.7.3 → mojentic-0.7.4}/src/mojentic/llm/tools/ephemeral_task_manager/list_tasks_tool.py +0 -0
  117. {mojentic-0.7.3 → mojentic-0.7.4}/src/mojentic/llm/tools/ephemeral_task_manager/list_tasks_tool_spec.py +0 -0
  118. {mojentic-0.7.3 → mojentic-0.7.4}/src/mojentic/llm/tools/ephemeral_task_manager/prepend_task_tool.py +0 -0
  119. {mojentic-0.7.3 → mojentic-0.7.4}/src/mojentic/llm/tools/ephemeral_task_manager/prepend_task_tool_spec.py +0 -0
  120. {mojentic-0.7.3 → mojentic-0.7.4}/src/mojentic/llm/tools/ephemeral_task_manager/start_task_tool.py +0 -0
  121. {mojentic-0.7.3 → mojentic-0.7.4}/src/mojentic/llm/tools/ephemeral_task_manager/start_task_tool_spec.py +0 -0
  122. {mojentic-0.7.3 → mojentic-0.7.4}/src/mojentic/llm/tools/file_manager.py +0 -0
  123. {mojentic-0.7.3 → mojentic-0.7.4}/src/mojentic/llm/tools/file_manager_spec.py +0 -0
  124. {mojentic-0.7.3 → mojentic-0.7.4}/src/mojentic/llm/tools/llm_tool.py +0 -0
  125. {mojentic-0.7.3 → mojentic-0.7.4}/src/mojentic/llm/tools/llm_tool_spec.py +0 -0
  126. {mojentic-0.7.3 → mojentic-0.7.4}/src/mojentic/llm/tools/organic_web_search.py +0 -0
  127. {mojentic-0.7.3 → mojentic-0.7.4}/src/mojentic/llm/tools/tell_user_tool.py +0 -0
  128. {mojentic-0.7.3 → mojentic-0.7.4}/src/mojentic/llm/tools/tool_wrapper.py +0 -0
  129. {mojentic-0.7.3 → mojentic-0.7.4}/src/mojentic/llm/tools/tool_wrapper_spec.py +0 -0
  130. {mojentic-0.7.3 → mojentic-0.7.4}/src/mojentic/router.py +0 -0
  131. {mojentic-0.7.3 → mojentic-0.7.4}/src/mojentic/router_spec.py +0 -0
  132. {mojentic-0.7.3 → mojentic-0.7.4}/src/mojentic/tracer/__init__.py +0 -0
  133. {mojentic-0.7.3 → mojentic-0.7.4}/src/mojentic/tracer/event_store.py +0 -0
  134. {mojentic-0.7.3 → mojentic-0.7.4}/src/mojentic/tracer/event_store_spec.py +0 -0
  135. {mojentic-0.7.3 → mojentic-0.7.4}/src/mojentic/tracer/null_tracer.py +0 -0
  136. {mojentic-0.7.3 → mojentic-0.7.4}/src/mojentic/tracer/tracer_events.py +0 -0
  137. {mojentic-0.7.3 → mojentic-0.7.4}/src/mojentic/tracer/tracer_events_spec.py +0 -0
  138. {mojentic-0.7.3 → mojentic-0.7.4}/src/mojentic/tracer/tracer_system.py +0 -0
  139. {mojentic-0.7.3 → mojentic-0.7.4}/src/mojentic/tracer/tracer_system_spec.py +0 -0
  140. {mojentic-0.7.3 → mojentic-0.7.4}/src/mojentic/utils/__init__.py +0 -0
  141. {mojentic-0.7.3 → mojentic-0.7.4}/src/mojentic/utils/formatting.py +0 -0
  142. {mojentic-0.7.3 → mojentic-0.7.4}/src/mojentic.egg-info/dependency_links.txt +0 -0
  143. {mojentic-0.7.3 → mojentic-0.7.4}/src/mojentic.egg-info/requires.txt +0 -0
  144. {mojentic-0.7.3 → mojentic-0.7.4}/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: 0.7.3
3
+ Version: 0.7.4
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
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "mojentic"
3
- version = "0.7.3"
3
+ version = "0.7.4"
4
4
  authors = [
5
5
  { name = "Stacey Vetzal", email = "stacey@vetzal.com" },
6
6
  ]
@@ -0,0 +1,73 @@
1
+ import os
2
+ from mojentic.llm.gateways.openai import OpenAIGateway
3
+ from mojentic.llm.gateways.models import LLMMessage, MessageRole
4
+
5
+ def check_model_characterization():
6
+ """
7
+ Test the model characterization functionality with different OpenAI models.
8
+ This demonstrates how the gateway adapts parameters based on model type.
9
+ """
10
+ api_key = os.getenv("OPENAI_API_KEY")
11
+ if not api_key:
12
+ print("OPENAI_API_KEY environment variable not set. Skipping actual API calls.")
13
+ return
14
+
15
+ gateway = OpenAIGateway(api_key)
16
+
17
+ # Test messages for chat models
18
+ chat_messages = [
19
+ LLMMessage(role=MessageRole.System, content="You are a helpful assistant."),
20
+ LLMMessage(role=MessageRole.User, content="What is 2 + 2? Give a brief answer.")
21
+ ]
22
+
23
+ # Test messages for reasoning models (no system message supported)
24
+ reasoning_messages = [
25
+ LLMMessage(role=MessageRole.User, content="What is 2 + 2? Give a brief answer.")
26
+ ]
27
+
28
+ # Test with different model types
29
+ test_models = [
30
+ ("gpt-4o", "chat model"),
31
+ ("gpt-4o-mini", "chat model"),
32
+ ("o1-mini", "reasoning model"),
33
+ ("o1-preview", "reasoning model")
34
+ ]
35
+
36
+ print("Testing model characterization and parameter adaptation:")
37
+ print("=" * 60)
38
+
39
+ for model, model_type in test_models:
40
+ print(f"\nTesting {model} ({model_type}):")
41
+
42
+ # Test model classification
43
+ is_reasoning = gateway._is_reasoning_model(model)
44
+ print(f" Classified as reasoning model: {is_reasoning}")
45
+
46
+ # Use appropriate messages based on model type
47
+ messages = reasoning_messages if gateway._is_reasoning_model(model) else chat_messages
48
+
49
+ # Test parameter adaptation
50
+ original_args = {
51
+ 'model': model,
52
+ 'messages': messages,
53
+ 'max_tokens': 100
54
+ }
55
+
56
+ adapted_args = gateway._adapt_parameters_for_model(model, original_args)
57
+
58
+ if 'max_tokens' in adapted_args:
59
+ print(f" Using parameter: max_tokens = {adapted_args['max_tokens']}")
60
+ elif 'max_completion_tokens' in adapted_args:
61
+ print(f" Using parameter: max_completion_tokens = {adapted_args['max_completion_tokens']}")
62
+
63
+ try:
64
+ response = gateway.complete(**adapted_args)
65
+ print(f" Response: {response.content[:50]}...")
66
+ except Exception as e:
67
+ print(f" Error: {str(e)}")
68
+
69
+ print("\n" + "=" * 60)
70
+ print("Model characterization test completed!")
71
+
72
+ if __name__ == "__main__":
73
+ check_model_characterization()
@@ -27,6 +27,58 @@ class OpenAIGateway(LLMGateway):
27
27
  def __init__(self, api_key: str, base_url: str = None):
28
28
  self.client = OpenAI(api_key=api_key, base_url=base_url)
29
29
 
30
+ def _is_reasoning_model(self, model: str) -> bool:
31
+ """
32
+ Determine if a model is a reasoning model that requires max_completion_tokens.
33
+
34
+ Parameters
35
+ ----------
36
+ model : str
37
+ The model name to classify.
38
+
39
+ Returns
40
+ -------
41
+ bool
42
+ True if the model is a reasoning model, False if it's a chat model.
43
+ """
44
+ # OpenAI reasoning models typically start with "o1" or contain "o4"
45
+ reasoning_model_patterns = [
46
+ "o1-",
47
+ "o3-",
48
+ "o4-",
49
+ "o1",
50
+ "o3"
51
+ ]
52
+
53
+ model_lower = model.lower()
54
+ return any(pattern in model_lower for pattern in reasoning_model_patterns)
55
+
56
+ def _adapt_parameters_for_model(self, model: str, args: dict) -> dict:
57
+ """
58
+ Adapt parameters based on the model type.
59
+
60
+ Parameters
61
+ ----------
62
+ model : str
63
+ The model name.
64
+ args : dict
65
+ The original arguments.
66
+
67
+ Returns
68
+ -------
69
+ dict
70
+ The adapted arguments with correct parameter names for the model type.
71
+ """
72
+ adapted_args = args.copy()
73
+
74
+ if self._is_reasoning_model(model) and 'max_tokens' in adapted_args:
75
+ # For reasoning models, use max_completion_tokens instead of max_tokens
76
+ adapted_args['max_completion_tokens'] = adapted_args.pop('max_tokens')
77
+ logger.debug("Adapted max_tokens to max_completion_tokens for reasoning model",
78
+ model=model, max_completion_tokens=adapted_args['max_completion_tokens'])
79
+
80
+ return adapted_args
81
+
30
82
  def complete(self, **args) -> LLMGatewayResponse:
31
83
  """
32
84
  Complete the LLM request by delegating to the OpenAI service.
@@ -56,22 +108,28 @@ class OpenAIGateway(LLMGateway):
56
108
  LLMGatewayResponse
57
109
  The response from the OpenAI service.
58
110
  """
111
+ # Adapt parameters based on model type
112
+ adapted_args = self._adapt_parameters_for_model(args['model'], args)
113
+
59
114
  openai_args = {
60
- 'model': args['model'],
61
- 'messages': adapt_messages_to_openai(args['messages']),
115
+ 'model': adapted_args['model'],
116
+ 'messages': adapt_messages_to_openai(adapted_args['messages']),
62
117
  }
63
118
 
64
119
  completion = self.client.chat.completions.create
65
120
 
66
- if 'object_model' in args and args['object_model'] is not None:
121
+ if 'object_model' in adapted_args and adapted_args['object_model'] is not None:
67
122
  completion = self.client.beta.chat.completions.parse
68
- openai_args['response_format'] = args['object_model']
123
+ openai_args['response_format'] = adapted_args['object_model']
69
124
 
70
- if 'tools' in args and args['tools'] is not None:
71
- openai_args['tools'] = [t.descriptor for t in args['tools']]
125
+ if 'tools' in adapted_args and adapted_args['tools'] is not None:
126
+ openai_args['tools'] = [t.descriptor for t in adapted_args['tools']]
72
127
 
73
- if 'max_tokens' in args:
74
- openai_args['max_tokens'] = args['max_tokens']
128
+ # Handle both max_tokens (for chat models) and max_completion_tokens (for reasoning models)
129
+ if 'max_tokens' in adapted_args:
130
+ openai_args['max_tokens'] = adapted_args['max_tokens']
131
+ elif 'max_completion_tokens' in adapted_args:
132
+ openai_args['max_completion_tokens'] = adapted_args['max_completion_tokens']
75
133
 
76
134
  response = completion(**openai_args)
77
135
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: mojentic
3
- Version: 0.7.3
3
+ Version: 0.7.4
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
@@ -25,6 +25,7 @@ src/_examples/image_broker.py
25
25
  src/_examples/image_broker_splat.py
26
26
  src/_examples/iterative_solver.py
27
27
  src/_examples/list_models.py
28
+ src/_examples/model_characterization.py
28
29
  src/_examples/oversized_embeddings.py
29
30
  src/_examples/raw.py
30
31
  src/_examples/react.py
File without changes
File without changes
File without changes
File without changes
File without changes