mojentic 0.8.4__py3-none-any.whl → 1.0.0__py3-none-any.whl
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.
- _examples/async_dispatcher_example.py +12 -4
- _examples/async_llm_example.py +1 -2
- _examples/broker_as_tool.py +42 -17
- _examples/broker_examples.py +5 -7
- _examples/broker_image_examples.py +1 -1
- _examples/characterize_ollama.py +3 -3
- _examples/characterize_openai.py +1 -1
- _examples/chat_session.py +2 -2
- _examples/chat_session_with_tool.py +2 -2
- _examples/coding_file_tool.py +16 -18
- _examples/current_datetime_tool_example.py +2 -2
- _examples/embeddings.py +1 -1
- _examples/ephemeral_task_manager_example.py +15 -11
- _examples/fetch_openai_models.py +10 -3
- _examples/file_deduplication.py +6 -6
- _examples/file_tool.py +5 -5
- _examples/image_analysis.py +2 -3
- _examples/image_broker.py +1 -1
- _examples/image_broker_splat.py +1 -1
- _examples/iterative_solver.py +3 -3
- _examples/model_characterization.py +2 -0
- _examples/openai_gateway_enhanced_demo.py +15 -5
- _examples/raw.py +1 -1
- _examples/react/agents/decisioning_agent.py +173 -15
- _examples/react/agents/summarization_agent.py +89 -0
- _examples/react/agents/thinking_agent.py +84 -14
- _examples/react/agents/tool_call_agent.py +83 -0
- _examples/react/formatters.py +38 -4
- _examples/react/models/base.py +60 -11
- _examples/react/models/events.py +76 -8
- _examples/react.py +71 -21
- _examples/recursive_agent.py +2 -2
- _examples/simple_llm.py +3 -3
- _examples/simple_llm_repl.py +1 -1
- _examples/simple_structured.py +1 -1
- _examples/simple_tool.py +2 -2
- _examples/solver_chat_session.py +5 -11
- _examples/streaming.py +36 -18
- _examples/tell_user_example.py +4 -4
- _examples/tracer_demo.py +18 -20
- _examples/tracer_qt_viewer.py +49 -46
- _examples/working_memory.py +1 -1
- mojentic/__init__.py +3 -3
- mojentic/agents/__init__.py +26 -8
- mojentic/agents/{agent_broker.py → agent_event_adapter.py} +3 -3
- mojentic/agents/async_aggregator_agent_spec.py +32 -33
- mojentic/agents/async_llm_agent.py +9 -5
- mojentic/agents/async_llm_agent_spec.py +21 -22
- mojentic/agents/base_async_agent.py +2 -2
- mojentic/agents/base_llm_agent.py +6 -2
- mojentic/agents/iterative_problem_solver.py +11 -5
- mojentic/agents/simple_recursive_agent.py +11 -10
- mojentic/agents/simple_recursive_agent_spec.py +423 -0
- mojentic/async_dispatcher.py +0 -1
- mojentic/async_dispatcher_spec.py +1 -1
- mojentic/context/__init__.py +0 -2
- mojentic/dispatcher.py +7 -8
- mojentic/llm/__init__.py +5 -5
- mojentic/llm/gateways/__init__.py +19 -18
- mojentic/llm/gateways/anthropic.py +1 -0
- mojentic/llm/gateways/anthropic_messages_adapter.py +0 -1
- mojentic/llm/gateways/llm_gateway.py +1 -1
- mojentic/llm/gateways/ollama.py +23 -18
- mojentic/llm/gateways/openai.py +243 -44
- mojentic/llm/gateways/openai_message_adapter_spec.py +3 -3
- mojentic/llm/gateways/openai_model_registry.py +7 -6
- mojentic/llm/gateways/openai_model_registry_spec.py +1 -2
- mojentic/llm/gateways/openai_temperature_handling_spec.py +2 -2
- mojentic/llm/llm_broker.py +162 -2
- mojentic/llm/llm_broker_spec.py +76 -2
- mojentic/llm/message_composers.py +6 -3
- mojentic/llm/message_composers_spec.py +5 -1
- mojentic/llm/registry/__init__.py +0 -3
- mojentic/llm/registry/populate_registry_from_ollama.py +2 -2
- mojentic/llm/tools/__init__.py +0 -9
- mojentic/llm/tools/ask_user_tool.py +11 -5
- mojentic/llm/tools/current_datetime.py +9 -6
- mojentic/llm/tools/date_resolver.py +10 -4
- mojentic/llm/tools/date_resolver_spec.py +0 -1
- mojentic/llm/tools/ephemeral_task_manager/append_task_tool.py +4 -1
- mojentic/llm/tools/ephemeral_task_manager/ephemeral_task_list.py +1 -1
- mojentic/llm/tools/ephemeral_task_manager/insert_task_after_tool.py +4 -1
- mojentic/llm/tools/ephemeral_task_manager/prepend_task_tool.py +5 -2
- mojentic/llm/tools/file_manager.py +131 -28
- mojentic/llm/tools/file_manager_spec.py +0 -3
- mojentic/llm/tools/llm_tool.py +1 -1
- mojentic/llm/tools/llm_tool_spec.py +0 -2
- mojentic/llm/tools/organic_web_search.py +4 -2
- mojentic/llm/tools/tell_user_tool.py +6 -2
- mojentic/llm/tools/tool_wrapper.py +2 -2
- mojentic/tracer/__init__.py +1 -10
- mojentic/tracer/event_store.py +7 -8
- mojentic/tracer/event_store_spec.py +1 -2
- mojentic/tracer/null_tracer.py +37 -43
- mojentic/tracer/tracer_events.py +8 -2
- mojentic/tracer/tracer_events_spec.py +6 -7
- mojentic/tracer/tracer_system.py +37 -36
- mojentic/tracer/tracer_system_spec.py +21 -6
- mojentic/utils/__init__.py +1 -1
- mojentic/utils/formatting.py +1 -0
- {mojentic-0.8.4.dist-info → mojentic-1.0.0.dist-info}/METADATA +76 -27
- mojentic-1.0.0.dist-info/RECORD +149 -0
- mojentic-0.8.4.dist-info/RECORD +0 -146
- {mojentic-0.8.4.dist-info → mojentic-1.0.0.dist-info}/WHEEL +0 -0
- {mojentic-0.8.4.dist-info → mojentic-1.0.0.dist-info}/licenses/LICENSE.md +0 -0
- {mojentic-0.8.4.dist-info → mojentic-1.0.0.dist-info}/top_level.txt +0 -0
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import time
|
|
2
|
-
from typing import Dict, List
|
|
3
2
|
|
|
4
3
|
from mojentic.tracer.tracer_events import (
|
|
5
4
|
TracerEvent,
|
|
@@ -24,7 +23,7 @@ class DescribeTracerEvents:
|
|
|
24
23
|
source=DescribeTracerEvents,
|
|
25
24
|
timestamp=time.time()
|
|
26
25
|
)
|
|
27
|
-
|
|
26
|
+
|
|
28
27
|
# Then
|
|
29
28
|
assert isinstance(event, TracerEvent)
|
|
30
29
|
assert isinstance(event.timestamp, float)
|
|
@@ -44,7 +43,7 @@ class DescribeTracerEvents:
|
|
|
44
43
|
temperature=0.7,
|
|
45
44
|
tools=None
|
|
46
45
|
)
|
|
47
|
-
|
|
46
|
+
|
|
48
47
|
# Then
|
|
49
48
|
assert isinstance(event, LLMCallTracerEvent)
|
|
50
49
|
assert event.model == "test-model"
|
|
@@ -64,7 +63,7 @@ class DescribeTracerEvents:
|
|
|
64
63
|
content="This is a test response",
|
|
65
64
|
call_duration_ms=150.5
|
|
66
65
|
)
|
|
67
|
-
|
|
66
|
+
|
|
68
67
|
# Then
|
|
69
68
|
assert isinstance(event, LLMResponseTracerEvent)
|
|
70
69
|
assert event.model == "test-model"
|
|
@@ -86,7 +85,7 @@ class DescribeTracerEvents:
|
|
|
86
85
|
result="test result",
|
|
87
86
|
caller="TestAgent"
|
|
88
87
|
)
|
|
89
|
-
|
|
88
|
+
|
|
90
89
|
# Then
|
|
91
90
|
assert isinstance(event, ToolCallTracerEvent)
|
|
92
91
|
assert event.tool_name == "test-tool"
|
|
@@ -107,10 +106,10 @@ class DescribeTracerEvents:
|
|
|
107
106
|
event_type="RequestEvent",
|
|
108
107
|
event_id="12345"
|
|
109
108
|
)
|
|
110
|
-
|
|
109
|
+
|
|
111
110
|
# Then
|
|
112
111
|
assert isinstance(event, AgentInteractionTracerEvent)
|
|
113
112
|
assert event.from_agent == "AgentA"
|
|
114
113
|
assert event.to_agent == "AgentB"
|
|
115
114
|
assert event.event_type == "RequestEvent"
|
|
116
|
-
assert event.event_id == "12345"
|
|
115
|
+
assert event.event_id == "12345"
|
mojentic/tracer/tracer_system.py
CHANGED
|
@@ -4,19 +4,18 @@ TracerSystem module for coordinating tracer events.
|
|
|
4
4
|
This provides a central system for recording, filtering, and querying tracer events.
|
|
5
5
|
"""
|
|
6
6
|
import time
|
|
7
|
-
from typing import Any, Callable, Dict, List, Optional, Type
|
|
7
|
+
from typing import Any, Callable, Dict, List, Optional, Type
|
|
8
8
|
|
|
9
9
|
import structlog
|
|
10
10
|
|
|
11
11
|
from mojentic.tracer.tracer_events import (
|
|
12
|
-
TracerEvent,
|
|
12
|
+
TracerEvent,
|
|
13
13
|
LLMCallTracerEvent,
|
|
14
14
|
LLMResponseTracerEvent,
|
|
15
15
|
ToolCallTracerEvent,
|
|
16
16
|
AgentInteractionTracerEvent
|
|
17
17
|
)
|
|
18
18
|
from mojentic.tracer.event_store import EventStore
|
|
19
|
-
from mojentic.event import Event
|
|
20
19
|
|
|
21
20
|
logger = structlog.get_logger()
|
|
22
21
|
|
|
@@ -58,13 +57,13 @@ class TracerSystem:
|
|
|
58
57
|
|
|
59
58
|
self.event_store.store(event)
|
|
60
59
|
|
|
61
|
-
def record_llm_call(self,
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
60
|
+
def record_llm_call(self,
|
|
61
|
+
model: str,
|
|
62
|
+
messages: List[Dict],
|
|
63
|
+
temperature: float = 1.0,
|
|
64
|
+
tools: Optional[List[Dict]] = None,
|
|
65
|
+
source: Any = None,
|
|
66
|
+
correlation_id: str = None) -> None:
|
|
68
67
|
"""
|
|
69
68
|
Record an LLM call event.
|
|
70
69
|
|
|
@@ -97,13 +96,13 @@ class TracerSystem:
|
|
|
97
96
|
)
|
|
98
97
|
self.event_store.store(event)
|
|
99
98
|
|
|
100
|
-
def record_llm_response(self,
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
99
|
+
def record_llm_response(self,
|
|
100
|
+
model: str,
|
|
101
|
+
content: str,
|
|
102
|
+
tool_calls: Optional[List[Dict]] = None,
|
|
103
|
+
call_duration_ms: Optional[float] = None,
|
|
104
|
+
source: Any = None,
|
|
105
|
+
correlation_id: str = None) -> None:
|
|
107
106
|
"""
|
|
108
107
|
Record an LLM response event.
|
|
109
108
|
|
|
@@ -137,13 +136,13 @@ class TracerSystem:
|
|
|
137
136
|
self.event_store.store(event)
|
|
138
137
|
|
|
139
138
|
def record_tool_call(self,
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
139
|
+
tool_name: str,
|
|
140
|
+
arguments: Dict[str, Any],
|
|
141
|
+
result: Any,
|
|
142
|
+
caller: Optional[str] = None,
|
|
143
|
+
call_duration_ms: Optional[float] = None,
|
|
144
|
+
source: Any = None,
|
|
145
|
+
correlation_id: str = None) -> None:
|
|
147
146
|
"""
|
|
148
147
|
Record a tool call event.
|
|
149
148
|
|
|
@@ -179,13 +178,14 @@ class TracerSystem:
|
|
|
179
178
|
)
|
|
180
179
|
self.event_store.store(event)
|
|
181
180
|
|
|
182
|
-
def record_agent_interaction(
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
181
|
+
def record_agent_interaction(
|
|
182
|
+
self,
|
|
183
|
+
from_agent: str,
|
|
184
|
+
to_agent: str,
|
|
185
|
+
event_type: str,
|
|
186
|
+
event_id: Optional[str] = None,
|
|
187
|
+
source: Any = None,
|
|
188
|
+
correlation_id: str = None) -> None:
|
|
189
189
|
"""
|
|
190
190
|
Record an agent interaction event.
|
|
191
191
|
|
|
@@ -218,11 +218,12 @@ class TracerSystem:
|
|
|
218
218
|
)
|
|
219
219
|
self.event_store.store(event)
|
|
220
220
|
|
|
221
|
-
def get_events(
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
221
|
+
def get_events(
|
|
222
|
+
self,
|
|
223
|
+
event_type: Optional[Type[TracerEvent]] = None,
|
|
224
|
+
start_time: Optional[float] = None,
|
|
225
|
+
end_time: Optional[float] = None,
|
|
226
|
+
filter_func: Optional[Callable[[TracerEvent], bool]] = None) -> List[TracerEvent]:
|
|
226
227
|
"""
|
|
227
228
|
Get tracer events from the store, optionally filtered.
|
|
228
229
|
|
|
@@ -1,10 +1,7 @@
|
|
|
1
1
|
import time
|
|
2
|
-
from typing import Dict, List, Optional, Type, Union
|
|
3
2
|
|
|
4
|
-
import pytest
|
|
5
3
|
|
|
6
4
|
from mojentic.tracer.tracer_events import (
|
|
7
|
-
TracerEvent,
|
|
8
5
|
LLMCallTracerEvent,
|
|
9
6
|
LLMResponseTracerEvent,
|
|
10
7
|
ToolCallTracerEvent,
|
|
@@ -185,13 +182,31 @@ class DescribeTracerSystem:
|
|
|
185
182
|
now = time.time()
|
|
186
183
|
correlation_id = "test-correlation-id"
|
|
187
184
|
tracer_system.event_store.store(
|
|
188
|
-
LLMCallTracerEvent(
|
|
185
|
+
LLMCallTracerEvent(
|
|
186
|
+
source=DescribeTracerSystem,
|
|
187
|
+
timestamp=now - 100,
|
|
188
|
+
model="model1",
|
|
189
|
+
messages=[],
|
|
190
|
+
correlation_id=correlation_id
|
|
191
|
+
)
|
|
189
192
|
)
|
|
190
193
|
tracer_system.event_store.store(
|
|
191
|
-
LLMCallTracerEvent(
|
|
194
|
+
LLMCallTracerEvent(
|
|
195
|
+
source=DescribeTracerSystem,
|
|
196
|
+
timestamp=now - 50,
|
|
197
|
+
model="model2",
|
|
198
|
+
messages=[],
|
|
199
|
+
correlation_id=correlation_id
|
|
200
|
+
)
|
|
192
201
|
)
|
|
193
202
|
tracer_system.event_store.store(
|
|
194
|
-
LLMCallTracerEvent(
|
|
203
|
+
LLMCallTracerEvent(
|
|
204
|
+
source=DescribeTracerSystem,
|
|
205
|
+
timestamp=now,
|
|
206
|
+
model="model3",
|
|
207
|
+
messages=[],
|
|
208
|
+
correlation_id=correlation_id
|
|
209
|
+
)
|
|
195
210
|
)
|
|
196
211
|
|
|
197
212
|
# When
|
mojentic/utils/__init__.py
CHANGED
mojentic/utils/formatting.py
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: mojentic
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 1.0.0
|
|
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,30 +11,32 @@ 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
|
|
15
|
-
Requires-Dist: structlog
|
|
16
|
-
Requires-Dist: numpy
|
|
17
|
-
Requires-Dist: ollama
|
|
18
|
-
Requires-Dist: openai
|
|
19
|
-
Requires-Dist: anthropic
|
|
20
|
-
Requires-Dist: tiktoken
|
|
21
|
-
Requires-Dist: parsedatetime
|
|
22
|
-
Requires-Dist: pytz
|
|
23
|
-
Requires-Dist: serpapi
|
|
24
|
-
Requires-Dist: colorama
|
|
14
|
+
Requires-Dist: pydantic>=2.8.0
|
|
15
|
+
Requires-Dist: structlog>=25.5.0
|
|
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
|
|
20
|
+
Requires-Dist: tiktoken>=0.12.0
|
|
21
|
+
Requires-Dist: parsedatetime>=2.6
|
|
22
|
+
Requires-Dist: pytz>=2025.2
|
|
23
|
+
Requires-Dist: serpapi>=0.1.5
|
|
24
|
+
Requires-Dist: colorama>=0.4.6
|
|
25
25
|
Provides-Extra: dev
|
|
26
|
-
Requires-Dist: pytest>=
|
|
27
|
-
Requires-Dist: pytest-asyncio; extra == "dev"
|
|
28
|
-
Requires-Dist: pytest-spec; extra == "dev"
|
|
29
|
-
Requires-Dist: pytest-cov; extra == "dev"
|
|
26
|
+
Requires-Dist: pytest>=9.0.1; extra == "dev"
|
|
27
|
+
Requires-Dist: pytest-asyncio>=1.3.0; extra == "dev"
|
|
28
|
+
Requires-Dist: pytest-spec>=5.2.0; extra == "dev"
|
|
29
|
+
Requires-Dist: pytest-cov>=7.0.0; extra == "dev"
|
|
30
30
|
Requires-Dist: pytest-mock>=3.10.0; extra == "dev"
|
|
31
|
-
Requires-Dist: flake8>=
|
|
32
|
-
Requires-Dist:
|
|
33
|
-
Requires-Dist:
|
|
34
|
-
Requires-Dist: mkdocs
|
|
35
|
-
Requires-Dist:
|
|
36
|
-
Requires-Dist:
|
|
37
|
-
Requires-Dist:
|
|
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"
|
|
36
|
+
Requires-Dist: mkdocs-llmstxt>=0.4.0; extra == "dev"
|
|
37
|
+
Requires-Dist: mkdocstrings[python]>=0.21.0; extra == "dev"
|
|
38
|
+
Requires-Dist: griffe-fieldz>=0.3.0; extra == "dev"
|
|
39
|
+
Requires-Dist: pymdown-extensions>=10.3; extra == "dev"
|
|
38
40
|
Dynamic: license-file
|
|
39
41
|
|
|
40
42
|
# Mojentic
|
|
@@ -64,16 +66,26 @@ Mojentic is a framework that provides a simple and flexible way to interact with
|
|
|
64
66
|
|
|
65
67
|
## 🔧 Installation
|
|
66
68
|
|
|
69
|
+
We recommend using [uv](https://docs.astral.sh/uv/) for fast, reliable Python project management.
|
|
70
|
+
|
|
67
71
|
```bash
|
|
68
|
-
# Install from PyPI
|
|
72
|
+
# Install from PyPI using uv
|
|
73
|
+
uv pip install mojentic
|
|
74
|
+
|
|
75
|
+
# Or with pip
|
|
69
76
|
pip install mojentic
|
|
70
77
|
```
|
|
71
78
|
|
|
72
|
-
Or install from source
|
|
79
|
+
Or install from source:
|
|
73
80
|
|
|
74
81
|
```bash
|
|
75
82
|
git clone https://github.com/svetzal/mojentic.git
|
|
76
83
|
cd mojentic
|
|
84
|
+
|
|
85
|
+
# Using uv (recommended)
|
|
86
|
+
uv sync
|
|
87
|
+
|
|
88
|
+
# Or with pip
|
|
77
89
|
pip install -e .
|
|
78
90
|
```
|
|
79
91
|
|
|
@@ -91,7 +103,7 @@ openai_llm = LLMBroker(model="gpt-5", gateway=OpenAIGateway(api_key="your_api_ke
|
|
|
91
103
|
# Or use other models: "gpt-4o", "gpt-4.1", "o1-mini", "o3-mini", etc.
|
|
92
104
|
|
|
93
105
|
# Or use Ollama for local LLMs
|
|
94
|
-
ollama_llm = LLMBroker(model="
|
|
106
|
+
ollama_llm = LLMBroker(model="qwen3:32b")
|
|
95
107
|
|
|
96
108
|
# Simple text generation
|
|
97
109
|
result = openai_llm.generate(messages=[LLMMessage(content='Hello, how are you?')])
|
|
@@ -121,6 +133,35 @@ result = openai_llm.generate(messages=[
|
|
|
121
133
|
print(result)
|
|
122
134
|
```
|
|
123
135
|
|
|
136
|
+
## 🔑 OpenAI configuration
|
|
137
|
+
|
|
138
|
+
OpenAIGateway now supports environment-variable defaults so you can get started without hardcoding secrets:
|
|
139
|
+
|
|
140
|
+
- If you omit `api_key`, it will use the `OPENAI_API_KEY` environment variable.
|
|
141
|
+
- If you omit `base_url`, it will use the `OPENAI_API_ENDPOINT` environment variable (useful for custom endpoints like Azure/OpenAI-compatible proxies).
|
|
142
|
+
- Precedence: values you pass explicitly to `OpenAIGateway(api_key=..., base_url=...)` always override environment variables.
|
|
143
|
+
|
|
144
|
+
Examples:
|
|
145
|
+
|
|
146
|
+
```python
|
|
147
|
+
from mojentic.llm import LLMBroker
|
|
148
|
+
from mojentic.llm.gateways import OpenAIGateway
|
|
149
|
+
|
|
150
|
+
# 1) Easiest: rely on environment variables
|
|
151
|
+
# export OPENAI_API_KEY=sk-...
|
|
152
|
+
# export OPENAI_API_ENDPOINT=https://api.openai.com/v1 # optional
|
|
153
|
+
llm = LLMBroker(
|
|
154
|
+
model="gpt-4o-mini",
|
|
155
|
+
gateway=OpenAIGateway() # picks up OPENAI_API_KEY/OPENAI_API_ENDPOINT automatically
|
|
156
|
+
)
|
|
157
|
+
|
|
158
|
+
# 2) Explicitly override one or both values
|
|
159
|
+
llm = LLMBroker(
|
|
160
|
+
model="gpt-4o-mini",
|
|
161
|
+
gateway=OpenAIGateway(api_key="your_key", base_url="https://api.openai.com/v1")
|
|
162
|
+
)
|
|
163
|
+
```
|
|
164
|
+
|
|
124
165
|
## 🤖 OpenAI Model Support
|
|
125
166
|
|
|
126
167
|
The framework automatically handles parameter differences between model types, so you can switch between any models without code changes.
|
|
@@ -163,11 +204,19 @@ Visit [the documentation](https://svetzal.github.io/mojentic/) for comprehensive
|
|
|
163
204
|
git clone https://github.com/svetzal/mojentic.git
|
|
164
205
|
cd mojentic
|
|
165
206
|
|
|
166
|
-
#
|
|
207
|
+
# Using uv (recommended)
|
|
208
|
+
uv sync --extra dev
|
|
209
|
+
|
|
210
|
+
# Or with pip
|
|
167
211
|
pip install -e ".[dev]"
|
|
168
212
|
|
|
169
213
|
# Run tests
|
|
170
214
|
pytest
|
|
215
|
+
|
|
216
|
+
# Quality checks
|
|
217
|
+
flake8 src # Linting
|
|
218
|
+
bandit -r src # Security scan
|
|
219
|
+
pip-audit # Dependency vulnerabilities
|
|
171
220
|
```
|
|
172
221
|
|
|
173
222
|
## ✅ Project Status
|
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
_examples/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
2
|
+
_examples/async_dispatcher_example.py,sha256=Iy01lFd3NTKdgeFc6wMRGFD9FTNH7LEd9nGMtzrbXVo,8592
|
|
3
|
+
_examples/async_llm_example.py,sha256=WPb6ML_xXCSuRMbYWs-w2X28tzj9EosFiQv31gAAPBo,8627
|
|
4
|
+
_examples/broker_as_tool.py,sha256=ixcz8wuhdTZS-0OR9L1CeBMsrKz6SBBAaDhwAoD60e4,3195
|
|
5
|
+
_examples/broker_examples.py,sha256=eheXbzoslI9x_sPEt399hkxpDRI_VkscHL-br1LJqD4,2388
|
|
6
|
+
_examples/broker_image_examples.py,sha256=NGuZQ0x28winv0Sxw7ClBvqj8oD1tdbADITVjXIF0yk,1126
|
|
7
|
+
_examples/characterize_ollama.py,sha256=1XxV6SOoDQXBpRRH2kvres7_gpl1nGoEBRcsf7lplIg,2498
|
|
8
|
+
_examples/characterize_openai.py,sha256=4SDvfzOWfZkMQQdpoEFdR7cj38s1rh1jBJ55PBAbPV0,551
|
|
9
|
+
_examples/chat_session.py,sha256=bg1xFSVCHheDKPs4O4HWiZMRuzVfehpTpcpbG37fXSI,282
|
|
10
|
+
_examples/chat_session_with_tool.py,sha256=4v32BaLtE5y--goPEf_WjAjx9I19WSrRs6tzPaN29Dg,370
|
|
11
|
+
_examples/coding_file_tool.py,sha256=uyN4fA1rfOpkJ0jzgnQ9ZVfUGNAyXyrLHsAXuYDnchI,7140
|
|
12
|
+
_examples/current_datetime_tool_example.py,sha256=-MviImD6D_77YZUVmoOQu-VvFHeqMaae8N-c7wNDszE,918
|
|
13
|
+
_examples/design_analysis.py,sha256=66JxvnA065QV__WXpxJX_eTBDan34nGcKvao75UPLlw,1321
|
|
14
|
+
_examples/embeddings.py,sha256=Wj5H_rf5czv6f8Lwfx20t3GmOHDFouT1JyHp16vSPdg,268
|
|
15
|
+
_examples/ensures_files_exist.py,sha256=LAwX9YtUZGI6NT254PY7oC5yg6q-b9Q_Dez9gGrabQM,2009
|
|
16
|
+
_examples/ephemeral_task_manager_example.py,sha256=DPniyqb4KfRWx-HqxvmZum2SkXqgfXE_MHLfAZeIA-o,1490
|
|
17
|
+
_examples/fetch_openai_models.py,sha256=bLa6ADHy-ntxAy_JZnEc2FvndxsDlVuIaRBf_yzyEKs,3591
|
|
18
|
+
_examples/file_deduplication.py,sha256=wlkG5-TFuBjZTEUrc7DzgNGS_2CaOixCMD3V0LXTWbs,1659
|
|
19
|
+
_examples/file_tool.py,sha256=KomRhY_bRnfhj96BIdxDKncU56r9xoXRHM7GMi8IV-c,2321
|
|
20
|
+
_examples/image_analysis.py,sha256=d45xW9TeMsyqZqJqUy5e7UQ1vig-awVLRwLzlR5UyrQ,479
|
|
21
|
+
_examples/image_broker.py,sha256=YCPeIxAdUzxUYjp9V-VokJxTJFWmbWZNZUjLxdI9rTY,338
|
|
22
|
+
_examples/image_broker_splat.py,sha256=BNwR0ZrA8ajLorDSsPFMup-KGlpsyZ1DjsxhOOp5NYU,1935
|
|
23
|
+
_examples/iterative_solver.py,sha256=QFEwT1aTNW9CViSTSftf6AdSMEz4AS3uWY912VSX2Bw,1324
|
|
24
|
+
_examples/list_models.py,sha256=8noMpGeXOdX5Pf0NXCt_CRurOKEg_5luhWveGntBhe8,578
|
|
25
|
+
_examples/model_characterization.py,sha256=UnF5tXPRSsZKxvZncFD5breVdPufukZS6MyT_w5e5zw,2573
|
|
26
|
+
_examples/openai_gateway_enhanced_demo.py,sha256=VyaCpWdSFxvCL2izyhqn7PvGk-luxfXICzVLhL6J97o,6042
|
|
27
|
+
_examples/oversized_embeddings.py,sha256=_z2JoqZn0g7VtRsFVWIkngVqzjhQQvCEUYWVxs1I7MM,284
|
|
28
|
+
_examples/raw.py,sha256=Y9OR1Tq8NtpQZr7O5dfaa2BN2oKpEMgQVN_9-aleFpo,443
|
|
29
|
+
_examples/react.py,sha256=bGnTxF8PyV0qouDBDenUhpcYm8HrhwrXDbKsvh-47MA,2581
|
|
30
|
+
_examples/recursive_agent.py,sha256=s36FksfaRiUq7t7_GVEpDQ6R115ZLbFIdAZ0NjDhvdE,2997
|
|
31
|
+
_examples/routed_send_response.py,sha256=FHhTy7y2f7GY_WAWZYqOnFqF1xeJTBuS5EjfJGsJ3S8,4146
|
|
32
|
+
_examples/simple_llm.py,sha256=y-maBN5eKDQZOsaEK4uYq0KnU1x_-et0mpzWELPhFX0,1211
|
|
33
|
+
_examples/simple_llm_repl.py,sha256=l3Ul67AttvLrteC4Eikos2562ujxH9RAfJbr2WNkx2A,1391
|
|
34
|
+
_examples/simple_structured.py,sha256=V5c1RfhHb8ay8q7Xek_l8A2KEaIugKd0QHOePny6cQY,1312
|
|
35
|
+
_examples/simple_tool.py,sha256=Yr4y7q4-GyvvHEiRPFqVWcAe14IFHcatqVw5ypuaNZs,1279
|
|
36
|
+
_examples/solver_chat_session.py,sha256=uVBsqXRmyj3Vh0JrfZeCw5GzgwrL3-CR_xZOVTnYXGU,2015
|
|
37
|
+
_examples/streaming.py,sha256=XV9v0FkrE8eI5e4Nilq5-OM0Oox0kBpNaz9eLqWnCXI,1451
|
|
38
|
+
_examples/tell_user_example.py,sha256=l3nYYyKh45e4wbMtHONnwmYPPlkSFv5Erh1dEukyUL4,1268
|
|
39
|
+
_examples/tracer_demo.py,sha256=KfHr0mpC3G97tIKo470OVDwYWYE7jRLAj0Bp_gZ1D4M,6984
|
|
40
|
+
_examples/tracer_qt_viewer.py,sha256=AOxupJGzkVyNZ_1LATKFz0s9VN-cdiwJ1waJGtVfUtA,14988
|
|
41
|
+
_examples/working_memory.py,sha256=EuUXMQbJyquXmYUl63keQ8uI_suq8hq15Apn_kB-Ex8,1936
|
|
42
|
+
_examples/react/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
43
|
+
_examples/react/formatters.py,sha256=uL4s0tJaD4cvZKP37UY_xV742wuONOmbXeYgAc1pBiE,2402
|
|
44
|
+
_examples/react/agents/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
45
|
+
_examples/react/agents/decisioning_agent.py,sha256=-xaow3ohl1WABsolg-UXaHZ3Gaz6Tg3CS61kho6n0SE,6481
|
|
46
|
+
_examples/react/agents/summarization_agent.py,sha256=WBafMCvlf6mPpvcXz1HQT6mxrB243cCH6lZJtJHeSXI,2750
|
|
47
|
+
_examples/react/agents/thinking_agent.py,sha256=cPxsqTTqWorF1_mejpI5OVb8xJIyNTvycSyNd-uXQrM,3550
|
|
48
|
+
_examples/react/agents/tool_call_agent.py,sha256=nxiEfQwF5TDZCbW_GonzyHthqTe5Y8jHqwdLcJvPwN4,2742
|
|
49
|
+
_examples/react/models/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
50
|
+
_examples/react/models/base.py,sha256=yC94y5er04Z_5ZVqmEdMUY4YwnnGPggOIWnhrf_KnDg,2238
|
|
51
|
+
_examples/react/models/events.py,sha256=P8B1Arqv7vPK6X4wH99l1T4voxATQJwA_9izQ7SJbSs,2649
|
|
52
|
+
mojentic/__init__.py,sha256=hGAX3qaP6_Pf6wF-rpUmMprPUw3Rne1LKb7kgCMq4bY,1015
|
|
53
|
+
mojentic/async_dispatcher.py,sha256=8mAxjX-5YrriQeKbQ4sAWllJP7SYRVoffHkY85lh8GM,4701
|
|
54
|
+
mojentic/async_dispatcher_spec.py,sha256=UanNiy-torD1_-yHoXH1tnlTFo5fZ0kC7PJoZ_e0tY0,7268
|
|
55
|
+
mojentic/dispatcher.py,sha256=gqQAQPo9HTsVxwLTqXKoyx1IYvfVqyeY1NNEqFz_S80,2654
|
|
56
|
+
mojentic/event.py,sha256=P0kgI0Si41ifCTLNtpfkks0OktlK4wuAj3oMCDtdUyo,330
|
|
57
|
+
mojentic/router.py,sha256=7z2xqgpsuHmA32HfH3rAgDk3zLhUBxz8DHPt2vDlVOU,377
|
|
58
|
+
mojentic/router_spec.py,sha256=CRYeKEa7dz_yN8ABAi5DgY5C0mJW7she3Kw0NzxoHx4,876
|
|
59
|
+
mojentic/agents/__init__.py,sha256=msLtfyCzBEPv3ydPQkKQ_MZ1S6tQfn9_CGZirrZUxG4,1065
|
|
60
|
+
mojentic/agents/agent_event_adapter.py,sha256=Vgia6oIzTRayx2swrGYM3rzKBlJCPy5tOy5fVYWQu80,934
|
|
61
|
+
mojentic/agents/async_aggregator_agent.py,sha256=mv4iFND6krvZQjnBmR9Z9Quu6a_b1zl_opSquKIjqFk,5355
|
|
62
|
+
mojentic/agents/async_aggregator_agent_spec.py,sha256=WRszNGpVdYLNz31Q0noD6co2CttLs7eqyiV643j2RCw,8166
|
|
63
|
+
mojentic/agents/async_llm_agent.py,sha256=CMEjdbVQ71BBcVL8pvS5Duh2mvSlrLVM6vWstRsbM5w,6533
|
|
64
|
+
mojentic/agents/async_llm_agent_spec.py,sha256=b-HyakHEhjKobd0idpTsdHVXs4uMHwcAuKJC-TwtZGM,5248
|
|
65
|
+
mojentic/agents/base_agent.py,sha256=m1SRyzY9ou4tesFDszonC4Y8moQMg9eofvJeuhoXmM0,722
|
|
66
|
+
mojentic/agents/base_async_agent.py,sha256=n5Cuw0t-D10YQONa4bbq4-NRzC12nAAL5J2NB7j3DLk,888
|
|
67
|
+
mojentic/agents/base_llm_agent.py,sha256=HSHnheWJ4H4FRLFPVAWt7xivXUNi3FSBbWw5MgwcCeg,3178
|
|
68
|
+
mojentic/agents/base_llm_agent_spec.py,sha256=1kzayCtAZY7oWloaFMh7-NkTtiKihDCLD3i9HwH3_Uc,2571
|
|
69
|
+
mojentic/agents/correlation_aggregator_agent.py,sha256=okdq92rMNwIXTgnuwwn3zp4JzSxTh05vGWzTGocOgbU,1134
|
|
70
|
+
mojentic/agents/iterative_problem_solver.py,sha256=WDs40oQkxlZN9zyVKONzVY6QBb2PVGFOEJLDqJqCl74,4360
|
|
71
|
+
mojentic/agents/output_agent.py,sha256=I9GHcWvQhWxEcvjzj47scKo_QF8_6yR17ZUEHhwC94Y,231
|
|
72
|
+
mojentic/agents/simple_recursive_agent.py,sha256=nNUzamDzBL7AU79mCb_NZsVQazAxSTnKXh9s5g_A8Ls,9856
|
|
73
|
+
mojentic/agents/simple_recursive_agent_spec.py,sha256=rcIT2BWjT-sc2WevZ0ts9qi9Feh-ypNjeKYfULZmqo8,14945
|
|
74
|
+
mojentic/context/__init__.py,sha256=RKDcfejikUZMDuFYIfJpmLnoXoRCOCfLjOTiicjq1Yo,80
|
|
75
|
+
mojentic/context/shared_working_memory.py,sha256=Zt9MNGErEkDIUAaHvyhEOiTaEobI9l0MV4Z59lQFBr0,396
|
|
76
|
+
mojentic/llm/__init__.py,sha256=pHWdS6XRdPKhEWv1YpXaD5B5mUPojWM9ncYB-bXI2Qo,484
|
|
77
|
+
mojentic/llm/chat_session.py,sha256=0lhCZDxGfq3ma4m-SmJqfQYdyxPQElSFPQOcqAacFlQ,4005
|
|
78
|
+
mojentic/llm/chat_session_spec.py,sha256=8-jj-EHV2WwWuvo3t8I75kSEAYiG1nR-OEwkkLTi_z0,3872
|
|
79
|
+
mojentic/llm/llm_broker.py,sha256=d59MvUBNgVAZbL4T6GUp-tMroTwwmcTJfyOzJSvejAw,16924
|
|
80
|
+
mojentic/llm/llm_broker_spec.py,sha256=N0wSAIakWXn-4cxwG3dPR0MycZNTW-lQl9jWHlchC2w,8662
|
|
81
|
+
mojentic/llm/message_composers.py,sha256=8_5fA-J1I3BZ_0YlgZkQhsn_u7H8yMGEVNYHUPYW1X8,12142
|
|
82
|
+
mojentic/llm/message_composers_spec.py,sha256=pR-npU5KL7lzYpAl0gWTJIP6obcnMxMpkEudoZs5-0M,12133
|
|
83
|
+
mojentic/llm/gateways/__init__.py,sha256=y8zI9dGVhFkwDPSVU5NFFyaTTDWOkCfQYMzlFN72Ihg,786
|
|
84
|
+
mojentic/llm/gateways/anthropic.py,sha256=DfaNgCrx33O4KfPrP5za_yKXlncIMexBnVKxOYk2Bew,1813
|
|
85
|
+
mojentic/llm/gateways/anthropic_messages_adapter.py,sha256=FtDJMyeDOIei0Ign83C_jpWG06c73VAo6pXxk0zI3nI,2991
|
|
86
|
+
mojentic/llm/gateways/embeddings_gateway.py,sha256=kcOhiyHzOyQgKgwPDQJD5oVvfwk71GsBgMYJOIDv5NU,1347
|
|
87
|
+
mojentic/llm/gateways/file_gateway.py,sha256=3bZpalSyl_R4016WzCmmjUBDtAgPsmx19eVGv6p1Ufk,1418
|
|
88
|
+
mojentic/llm/gateways/llm_gateway.py,sha256=1J-FWKlFNxqd9_YP8Ul6J0cORYQoF_czgEfpAUaWFtQ,2677
|
|
89
|
+
mojentic/llm/gateways/models.py,sha256=OyIaMHKrrx6dHo5FbC8qOFct7PRql9wqbe_BJlgDSDE,3015
|
|
90
|
+
mojentic/llm/gateways/ollama.py,sha256=9DhNRC2sjBwnzyZplS3kd8-s3famxHUf4WfBycFH0GE,7737
|
|
91
|
+
mojentic/llm/gateways/ollama_messages_adapter.py,sha256=kUN_p2FyN88_trXMcL-Xsn9xPBU7pGKlJwTUEUCf6G4,1404
|
|
92
|
+
mojentic/llm/gateways/ollama_messages_adapter_spec.py,sha256=gVRbWDrHOa1EiZ0CkEWe0pGn-GKRqdGb-x56HBQeYSE,4981
|
|
93
|
+
mojentic/llm/gateways/openai.py,sha256=S19AIooYoBZYELVPrSeOwKslpYc7jrhu-sLjDXUFF3w,23161
|
|
94
|
+
mojentic/llm/gateways/openai_message_adapter_spec.py,sha256=3nObWsf6cPuWuCK_IhrQoRdQdz7gndqeSSvJIxtQkp8,6609
|
|
95
|
+
mojentic/llm/gateways/openai_messages_adapter.py,sha256=Scal68JKKdBHB35ok1c5DeWYdD6Wra5oXSsPxJyyXSQ,3947
|
|
96
|
+
mojentic/llm/gateways/openai_model_registry.py,sha256=0_X7YE48Hri9Sp8Ao440-2gqUoPl9xY5M0wMn733u2U,14041
|
|
97
|
+
mojentic/llm/gateways/openai_model_registry_spec.py,sha256=p7eiGZrgX7NIkRkraqFXA3WODnGAsIhqq9rVM98Z5qA,6698
|
|
98
|
+
mojentic/llm/gateways/openai_spec.py,sha256=eazIk8bLQ2d9CNPGhcw0WedX7CZz-TEkmwGz74c39CM,4161
|
|
99
|
+
mojentic/llm/gateways/openai_temperature_handling_spec.py,sha256=9KU4L9Zqdvot0yBfGPNREOsSIAOjvR7v88s_f_bq1kw,9928
|
|
100
|
+
mojentic/llm/gateways/tokenizer_gateway.py,sha256=ztuqfunlJ6xmyUPPHcC_69-kegiNJD6jdSEde7hDh2w,485
|
|
101
|
+
mojentic/llm/registry/__init__.py,sha256=FFokdoVYhtHslv-hZekONfG8ZdNA11Tto9chFLFVImE,71
|
|
102
|
+
mojentic/llm/registry/llm_registry.py,sha256=beyrgGrkXx5ZckUJzC1nQ461vra0fF6s_qRaEdi5bsg,2508
|
|
103
|
+
mojentic/llm/registry/models.py,sha256=XOZ0ElTL5mEicpcUk9lrVr0GRFgR1uFmDm7GGWm7yYg,2043
|
|
104
|
+
mojentic/llm/registry/populate_registry_from_ollama.py,sha256=4Pk_2t5WI8IbyMBoeIvl5Jd1hGom_OSQHZVZmhWjjqE,2606
|
|
105
|
+
mojentic/llm/tools/__init__.py,sha256=fFxqYgjzenR4DSULMlkNp6W5FCs2x-CklKKUjVO0JvA,124
|
|
106
|
+
mojentic/llm/tools/ask_user_tool.py,sha256=fJNUtqrp1VSJ7qvkQcsYur88-FMLn1wRABTB_z1_bfw,1145
|
|
107
|
+
mojentic/llm/tools/current_datetime.py,sha256=NDZuvcsvNoDGItXQX_ut1O2FUtlRpKrJ3nBUIJir8EY,1653
|
|
108
|
+
mojentic/llm/tools/date_resolver.py,sha256=lo2wlTOPEA0gNm4J_vyc9f3lnLq6Uxy_sFgmzgf86tU,2388
|
|
109
|
+
mojentic/llm/tools/date_resolver_spec.py,sha256=RF-1YRBgwPKe-nQYJThWxc1HuH6Y1yRBOm0vpJ6VquA,1184
|
|
110
|
+
mojentic/llm/tools/file_manager.py,sha256=7U_JtiRWyNjfZF-i43tKfV5Q5-VraWXAAvgHpbWANP0,33170
|
|
111
|
+
mojentic/llm/tools/file_manager_spec.py,sha256=gb3f9AlKbwuy2XJGQJYjq8Vu4J0BA2qERpKiEvbVmNA,25838
|
|
112
|
+
mojentic/llm/tools/llm_tool.py,sha256=7m-bwqtejC3c-445IB237UV1GHBBMkWLLt76mQsSDYs,1684
|
|
113
|
+
mojentic/llm/tools/llm_tool_spec.py,sha256=rgbRmun0mz9OhV3mnD5DZKxTlMEvrcRtbtpwZ6AJMQY,2047
|
|
114
|
+
mojentic/llm/tools/organic_web_search.py,sha256=JbzNCSePjFLoV2uoz_oAtu4_JxMMquvxtcWFmwNR1Jc,1344
|
|
115
|
+
mojentic/llm/tools/tell_user_tool.py,sha256=AVA915lVVEvv3gPjwki3lZ7-y5fbFuQyh0sDeabaJ_4,1086
|
|
116
|
+
mojentic/llm/tools/tool_wrapper.py,sha256=huVubOEDnrM4crCL07_PB1vkb6qxVnNA3r6HcIEw7pY,1460
|
|
117
|
+
mojentic/llm/tools/tool_wrapper_spec.py,sha256=LGqtre-g8SzOy3xtpbMdgTnw2EdYutmFOsMpediE8_0,2543
|
|
118
|
+
mojentic/llm/tools/ephemeral_task_manager/__init__.py,sha256=kqJjgm0WhgANWxgpji474xz19ee6Y0BeiZ5LxwIOp-Q,865
|
|
119
|
+
mojentic/llm/tools/ephemeral_task_manager/append_task_tool.py,sha256=Yzg_aKwXlXdpcMiqCb-ZwkBoF34rsHEs91KLiFiOtNc,2380
|
|
120
|
+
mojentic/llm/tools/ephemeral_task_manager/append_task_tool_spec.py,sha256=cqJ2HSAgBge3S76-hC6T8Bv1Ox3buWeSdsEpVbMjNPs,1159
|
|
121
|
+
mojentic/llm/tools/ephemeral_task_manager/clear_tasks_tool.py,sha256=GCBGVVlRnYS3llZwMUgNgsKBkZKu4FFTaKTb95F9b10,1476
|
|
122
|
+
mojentic/llm/tools/ephemeral_task_manager/clear_tasks_tool_spec.py,sha256=-MMHdu1e8CVfyDeKIpxfI5wyi26Uob3weDPR9rNPEe0,948
|
|
123
|
+
mojentic/llm/tools/ephemeral_task_manager/complete_task_tool.py,sha256=ZW_7DYRLruErdeuBUBuEfgKgE4Hlf-p5lY3W14D5Au8,2454
|
|
124
|
+
mojentic/llm/tools/ephemeral_task_manager/complete_task_tool_spec.py,sha256=qFTJHwLAASyo89kVGX2ATb-2x2hbkxz9hRALMUsZ8RE,1549
|
|
125
|
+
mojentic/llm/tools/ephemeral_task_manager/ephemeral_task_list.py,sha256=PQIEAKbo1eFdEcurRtmXwSoJeBQG5855qv2wPvQhP9A,5420
|
|
126
|
+
mojentic/llm/tools/ephemeral_task_manager/ephemeral_task_list_spec.py,sha256=TmaQCsPoZ7IYSnaRiMj8Y7wuaZEzEuGK1n8aSjZQORg,4740
|
|
127
|
+
mojentic/llm/tools/ephemeral_task_manager/insert_task_after_tool.py,sha256=4_stC3f_iOD_83OP4HXGb-Mud9M9c0iF9CrQz2xDqKA,3010
|
|
128
|
+
mojentic/llm/tools/ephemeral_task_manager/insert_task_after_tool_spec.py,sha256=8UrjnLlEjF28RLPnsg5CESuSmaVUGULMdUjtYu5KW9w,1791
|
|
129
|
+
mojentic/llm/tools/ephemeral_task_manager/list_tasks_tool.py,sha256=jnkmmxOcytygDDvqEZT8cdqDZCedyC54FI2Gee7igrA,2103
|
|
130
|
+
mojentic/llm/tools/ephemeral_task_manager/list_tasks_tool_spec.py,sha256=xwPAhx5ix7In8NFMm6VVbxoYG1iwLHcn_7wqMHE6HH8,1162
|
|
131
|
+
mojentic/llm/tools/ephemeral_task_manager/prepend_task_tool.py,sha256=CDQa8LdNJTaSS0sAFzmFPFsVt2umW6Adn8JW7A6gj5c,2413
|
|
132
|
+
mojentic/llm/tools/ephemeral_task_manager/prepend_task_tool_spec.py,sha256=lUCnejAON9g0DDNS64EVHwapPjF8b87RsXPUVvvG0b4,1174
|
|
133
|
+
mojentic/llm/tools/ephemeral_task_manager/start_task_tool.py,sha256=VH8Wa4-ZmkMIsyLuLXJx4pGidiT0KeT55DnujFpK-0o,2414
|
|
134
|
+
mojentic/llm/tools/ephemeral_task_manager/start_task_tool_spec.py,sha256=oDeVPPfquM2ojwG0aaNnbWCB_LRgm8runtG-CumZkLg,1490
|
|
135
|
+
mojentic/tracer/__init__.py,sha256=41xivQN9c0GJTtFIuHChL1zl2MS2o68sEdFM6yd9nlQ,252
|
|
136
|
+
mojentic/tracer/event_store.py,sha256=a8Iwg31oJaM5aa-d_-5F2SixbbflbYRXSm7RqTgXOpI,3618
|
|
137
|
+
mojentic/tracer/event_store_spec.py,sha256=FG2XpY55dvOhyDqQ6ulkkgSNCfH31dgReHhJy2smRD4,6449
|
|
138
|
+
mojentic/tracer/null_tracer.py,sha256=R7nl3FC808ia0p0ag--FtyyFponyb4huPlT90FtbBeE,6861
|
|
139
|
+
mojentic/tracer/tracer_events.py,sha256=ZLlzd-kZKTb4B2ggxJcwjBPydcMr6KYD1Us-Jk_lBqU,5687
|
|
140
|
+
mojentic/tracer/tracer_events_spec.py,sha256=EKh1K55ipIapbhjTqScKBSQUaIC09cO1VviYb0WTRZo,3480
|
|
141
|
+
mojentic/tracer/tracer_system.py,sha256=KPSVIfGVOjSx6Vj_SvrisqJXKT6ddwBc_UCMQC6DQU8,10088
|
|
142
|
+
mojentic/tracer/tracer_system_spec.py,sha256=8hpQlmAWyjUvk7ihy339L0buQ-eH5rluaFvyMl-mSH4,8830
|
|
143
|
+
mojentic/utils/__init__.py,sha256=WvNYbtVeliMZn2sMX53CrOQlQLJBXi4mJNoocG7s_kI,116
|
|
144
|
+
mojentic/utils/formatting.py,sha256=YtXh0aYzLB9GKP8ZD6u1By1OBqPOXUtHirtq0GmHNag,948
|
|
145
|
+
mojentic-1.0.0.dist-info/licenses/LICENSE.md,sha256=txSgV8n5zY1W3NiF5HHsCwlaW0e8We1cSC6TuJUqxXA,1060
|
|
146
|
+
mojentic-1.0.0.dist-info/METADATA,sha256=DSiDA6rxRnPJ_v6VNpjn5_ebXgphpDBzAWgWhgc2kig,8709
|
|
147
|
+
mojentic-1.0.0.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
|
148
|
+
mojentic-1.0.0.dist-info/top_level.txt,sha256=Q-BvPQ8Eu1jnEqK8Xkr6A9C8Xa1z38oPZRHuA5MCTqg,19
|
|
149
|
+
mojentic-1.0.0.dist-info/RECORD,,
|