mojentic 0.5.7__py3-none-any.whl → 0.6.1__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/recursive_agent.py +4 -3
- _examples/tracer_demo.py +170 -0
- mojentic/agents/simple_recursive_agent.py +20 -21
- mojentic/dispatcher.py +17 -1
- mojentic/llm/gateways/openai_message_adapter_spec.py +7 -7
- mojentic/llm/gateways/openai_messages_adapter.py +58 -15
- mojentic/llm/llm_broker.py +97 -4
- mojentic/llm/message_composers_spec.py +43 -25
- mojentic/llm/tools/llm_tool.py +28 -1
- mojentic/llm/tools/llm_tool_spec.py +2 -1
- mojentic/tracer/__init__.py +16 -0
- mojentic/tracer/event_store.py +111 -0
- mojentic/tracer/event_store_spec.py +210 -0
- mojentic/tracer/null_tracer.py +203 -0
- mojentic/tracer/tracer_events.py +138 -0
- mojentic/tracer/tracer_events_spec.py +116 -0
- mojentic/tracer/tracer_system.py +301 -0
- mojentic/tracer/tracer_system_spec.py +266 -0
- {mojentic-0.5.7.dist-info → mojentic-0.6.1.dist-info}/METADATA +20 -10
- {mojentic-0.5.7.dist-info → mojentic-0.6.1.dist-info}/RECORD +23 -16
- {mojentic-0.5.7.dist-info → mojentic-0.6.1.dist-info}/WHEEL +1 -1
- mojentic/audit/event_store.py +0 -6
- mojentic/audit/event_store_spec.py +0 -26
- {mojentic-0.5.7.dist-info → mojentic-0.6.1.dist-info}/licenses/LICENSE.md +0 -0
- {mojentic-0.5.7.dist-info → mojentic-0.6.1.dist-info}/top_level.txt +0 -0
|
@@ -0,0 +1,266 @@
|
|
|
1
|
+
import time
|
|
2
|
+
from typing import Dict, List, Optional, Type, Union
|
|
3
|
+
|
|
4
|
+
import pytest
|
|
5
|
+
|
|
6
|
+
from mojentic.tracer.tracer_events import (
|
|
7
|
+
TracerEvent,
|
|
8
|
+
LLMCallTracerEvent,
|
|
9
|
+
LLMResponseTracerEvent,
|
|
10
|
+
ToolCallTracerEvent,
|
|
11
|
+
AgentInteractionTracerEvent
|
|
12
|
+
)
|
|
13
|
+
from mojentic.tracer.tracer_system import TracerSystem
|
|
14
|
+
from mojentic.tracer.event_store import EventStore
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
class DescribeTracerSystem:
|
|
18
|
+
"""
|
|
19
|
+
Tests for the TracerSystem class.
|
|
20
|
+
"""
|
|
21
|
+
|
|
22
|
+
def should_initialize_with_default_event_store(self):
|
|
23
|
+
"""
|
|
24
|
+
Given no event store
|
|
25
|
+
When initializing a tracer system
|
|
26
|
+
Then it should create a default event store
|
|
27
|
+
"""
|
|
28
|
+
# Given / When
|
|
29
|
+
tracer_system = TracerSystem()
|
|
30
|
+
|
|
31
|
+
# Then
|
|
32
|
+
assert tracer_system.event_store is not None
|
|
33
|
+
assert isinstance(tracer_system.event_store, EventStore)
|
|
34
|
+
assert tracer_system.enabled is True
|
|
35
|
+
|
|
36
|
+
def should_initialize_with_provided_event_store(self):
|
|
37
|
+
"""
|
|
38
|
+
Given an event store
|
|
39
|
+
When initializing a tracer system with it
|
|
40
|
+
Then it should use the provided event store
|
|
41
|
+
"""
|
|
42
|
+
# Given
|
|
43
|
+
event_store = EventStore()
|
|
44
|
+
|
|
45
|
+
# When
|
|
46
|
+
tracer_system = TracerSystem(event_store=event_store)
|
|
47
|
+
|
|
48
|
+
# Then
|
|
49
|
+
assert tracer_system.event_store is event_store
|
|
50
|
+
|
|
51
|
+
def should_record_llm_call(self):
|
|
52
|
+
"""
|
|
53
|
+
Given an enabled tracer system
|
|
54
|
+
When recording an LLM call
|
|
55
|
+
Then it should store an LLMCallTracerEvent
|
|
56
|
+
"""
|
|
57
|
+
# Given
|
|
58
|
+
tracer_system = TracerSystem()
|
|
59
|
+
|
|
60
|
+
# When
|
|
61
|
+
messages = [{"role": "system", "content": "You are a helpful assistant."}]
|
|
62
|
+
correlation_id = "test-correlation-id"
|
|
63
|
+
tracer_system.record_llm_call("test-model", messages, 0.7, correlation_id=correlation_id)
|
|
64
|
+
|
|
65
|
+
# Then
|
|
66
|
+
events = tracer_system.get_events(event_type=LLMCallTracerEvent)
|
|
67
|
+
assert len(events) == 1
|
|
68
|
+
event = events[0]
|
|
69
|
+
assert event.model == "test-model"
|
|
70
|
+
assert event.messages == messages
|
|
71
|
+
assert event.temperature == 0.7
|
|
72
|
+
|
|
73
|
+
def should_record_llm_response(self):
|
|
74
|
+
"""
|
|
75
|
+
Given an enabled tracer system
|
|
76
|
+
When recording an LLM response
|
|
77
|
+
Then it should store an LLMResponseTracerEvent
|
|
78
|
+
"""
|
|
79
|
+
# Given
|
|
80
|
+
tracer_system = TracerSystem()
|
|
81
|
+
|
|
82
|
+
# When
|
|
83
|
+
correlation_id = "test-correlation-id"
|
|
84
|
+
tracer_system.record_llm_response(
|
|
85
|
+
"test-model",
|
|
86
|
+
"This is a test response",
|
|
87
|
+
call_duration_ms=150.5,
|
|
88
|
+
correlation_id=correlation_id
|
|
89
|
+
)
|
|
90
|
+
|
|
91
|
+
# Then
|
|
92
|
+
events = tracer_system.get_events(event_type=LLMResponseTracerEvent)
|
|
93
|
+
assert len(events) == 1
|
|
94
|
+
event = events[0]
|
|
95
|
+
assert event.model == "test-model"
|
|
96
|
+
assert event.content == "This is a test response"
|
|
97
|
+
assert event.call_duration_ms == 150.5
|
|
98
|
+
|
|
99
|
+
def should_record_tool_call(self):
|
|
100
|
+
"""
|
|
101
|
+
Given an enabled tracer system
|
|
102
|
+
When recording a tool call
|
|
103
|
+
Then it should store a ToolCallTracerEvent
|
|
104
|
+
"""
|
|
105
|
+
# Given
|
|
106
|
+
tracer_system = TracerSystem()
|
|
107
|
+
|
|
108
|
+
# When
|
|
109
|
+
arguments = {"query": "test query"}
|
|
110
|
+
correlation_id = "test-correlation-id"
|
|
111
|
+
tracer_system.record_tool_call(
|
|
112
|
+
"test-tool",
|
|
113
|
+
arguments,
|
|
114
|
+
"test result",
|
|
115
|
+
"TestAgent",
|
|
116
|
+
correlation_id=correlation_id
|
|
117
|
+
)
|
|
118
|
+
|
|
119
|
+
# Then
|
|
120
|
+
events = tracer_system.get_events(event_type=ToolCallTracerEvent)
|
|
121
|
+
assert len(events) == 1
|
|
122
|
+
event = events[0]
|
|
123
|
+
assert event.tool_name == "test-tool"
|
|
124
|
+
assert event.arguments == arguments
|
|
125
|
+
assert event.result == "test result"
|
|
126
|
+
assert event.caller == "TestAgent"
|
|
127
|
+
|
|
128
|
+
def should_record_agent_interaction(self):
|
|
129
|
+
"""
|
|
130
|
+
Given an enabled tracer system
|
|
131
|
+
When recording an agent interaction
|
|
132
|
+
Then it should store an AgentInteractionTracerEvent
|
|
133
|
+
"""
|
|
134
|
+
# Given
|
|
135
|
+
tracer_system = TracerSystem()
|
|
136
|
+
|
|
137
|
+
# When
|
|
138
|
+
correlation_id = "test-correlation-id"
|
|
139
|
+
tracer_system.record_agent_interaction(
|
|
140
|
+
"AgentA",
|
|
141
|
+
"AgentB",
|
|
142
|
+
"RequestEvent",
|
|
143
|
+
"12345",
|
|
144
|
+
correlation_id=correlation_id
|
|
145
|
+
)
|
|
146
|
+
|
|
147
|
+
# Then
|
|
148
|
+
events = tracer_system.get_events(event_type=AgentInteractionTracerEvent)
|
|
149
|
+
assert len(events) == 1
|
|
150
|
+
event = events[0]
|
|
151
|
+
assert event.from_agent == "AgentA"
|
|
152
|
+
assert event.to_agent == "AgentB"
|
|
153
|
+
assert event.event_type == "RequestEvent"
|
|
154
|
+
assert event.event_id == "12345"
|
|
155
|
+
|
|
156
|
+
def should_not_record_when_disabled(self):
|
|
157
|
+
"""
|
|
158
|
+
Given a disabled tracer system
|
|
159
|
+
When recording events
|
|
160
|
+
Then no events should be stored
|
|
161
|
+
"""
|
|
162
|
+
# Given
|
|
163
|
+
tracer_system = TracerSystem(enabled=False)
|
|
164
|
+
|
|
165
|
+
# When
|
|
166
|
+
correlation_id = "test-correlation-id"
|
|
167
|
+
tracer_system.record_llm_call("test-model", [], correlation_id=correlation_id)
|
|
168
|
+
tracer_system.record_llm_response("test-model", "response", correlation_id=correlation_id)
|
|
169
|
+
tracer_system.record_tool_call("test-tool", {}, "result", correlation_id=correlation_id)
|
|
170
|
+
tracer_system.record_agent_interaction("AgentA", "AgentB", "Event", correlation_id=correlation_id)
|
|
171
|
+
|
|
172
|
+
# Then
|
|
173
|
+
assert len(tracer_system.get_events()) == 0
|
|
174
|
+
|
|
175
|
+
def should_filter_events_by_time_range(self):
|
|
176
|
+
"""
|
|
177
|
+
Given several tracer events with different timestamps
|
|
178
|
+
When filtered by time range
|
|
179
|
+
Then only events within that time range should be returned
|
|
180
|
+
"""
|
|
181
|
+
# Given
|
|
182
|
+
tracer_system = TracerSystem()
|
|
183
|
+
|
|
184
|
+
# Create events with specific timestamps
|
|
185
|
+
now = time.time()
|
|
186
|
+
correlation_id = "test-correlation-id"
|
|
187
|
+
tracer_system.event_store.store(
|
|
188
|
+
LLMCallTracerEvent(source=DescribeTracerSystem, timestamp=now - 100, model="model1", messages=[], correlation_id=correlation_id)
|
|
189
|
+
)
|
|
190
|
+
tracer_system.event_store.store(
|
|
191
|
+
LLMCallTracerEvent(source=DescribeTracerSystem, timestamp=now - 50, model="model2", messages=[], correlation_id=correlation_id)
|
|
192
|
+
)
|
|
193
|
+
tracer_system.event_store.store(
|
|
194
|
+
LLMCallTracerEvent(source=DescribeTracerSystem, timestamp=now, model="model3", messages=[], correlation_id=correlation_id)
|
|
195
|
+
)
|
|
196
|
+
|
|
197
|
+
# When
|
|
198
|
+
result = tracer_system.get_events(start_time=now - 75, end_time=now - 25)
|
|
199
|
+
|
|
200
|
+
# Then
|
|
201
|
+
assert len(result) == 1
|
|
202
|
+
assert result[0].model == "model2"
|
|
203
|
+
|
|
204
|
+
def should_get_last_n_tracer_events(self):
|
|
205
|
+
"""
|
|
206
|
+
Given several tracer events of different types
|
|
207
|
+
When requesting the last N tracer events of a specific type
|
|
208
|
+
Then only the most recent N events of that type should be returned
|
|
209
|
+
"""
|
|
210
|
+
# Given
|
|
211
|
+
tracer_system = TracerSystem()
|
|
212
|
+
|
|
213
|
+
correlation_id = "test-correlation-id"
|
|
214
|
+
tracer_system.record_llm_call("model1", [], correlation_id=correlation_id)
|
|
215
|
+
tracer_system.record_tool_call("tool1", {}, "result1", correlation_id=correlation_id)
|
|
216
|
+
tracer_system.record_llm_call("model2", [], correlation_id=correlation_id)
|
|
217
|
+
tracer_system.record_llm_call("model3", [], correlation_id=correlation_id)
|
|
218
|
+
|
|
219
|
+
# When
|
|
220
|
+
result = tracer_system.get_last_n_tracer_events(2, event_type=LLMCallTracerEvent)
|
|
221
|
+
|
|
222
|
+
# Then
|
|
223
|
+
assert len(result) == 2
|
|
224
|
+
assert result[0].model == "model2"
|
|
225
|
+
assert result[1].model == "model3"
|
|
226
|
+
|
|
227
|
+
def should_enable_and_disable(self):
|
|
228
|
+
"""
|
|
229
|
+
Given a tracer system
|
|
230
|
+
When enabling and disabling it
|
|
231
|
+
Then its enabled state should change accordingly
|
|
232
|
+
"""
|
|
233
|
+
# Given
|
|
234
|
+
tracer_system = TracerSystem(enabled=False)
|
|
235
|
+
assert not tracer_system.enabled
|
|
236
|
+
|
|
237
|
+
# When
|
|
238
|
+
tracer_system.enable()
|
|
239
|
+
|
|
240
|
+
# Then
|
|
241
|
+
assert tracer_system.enabled
|
|
242
|
+
|
|
243
|
+
# When
|
|
244
|
+
tracer_system.disable()
|
|
245
|
+
|
|
246
|
+
# Then
|
|
247
|
+
assert not tracer_system.enabled
|
|
248
|
+
|
|
249
|
+
def should_clear_events(self):
|
|
250
|
+
"""
|
|
251
|
+
Given a tracer system with events
|
|
252
|
+
When clearing events
|
|
253
|
+
Then all events should be removed
|
|
254
|
+
"""
|
|
255
|
+
# Given
|
|
256
|
+
tracer_system = TracerSystem()
|
|
257
|
+
correlation_id = "test-correlation-id"
|
|
258
|
+
tracer_system.record_llm_call("model1", [], correlation_id=correlation_id)
|
|
259
|
+
tracer_system.record_tool_call("tool1", {}, "result1", correlation_id=correlation_id)
|
|
260
|
+
assert len(tracer_system.get_events()) == 2
|
|
261
|
+
|
|
262
|
+
# When
|
|
263
|
+
tracer_system.clear()
|
|
264
|
+
|
|
265
|
+
# Then
|
|
266
|
+
assert len(tracer_system.get_events()) == 0
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: mojentic
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.6.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
|
-
Project-URL: Homepage, https://github.com/
|
|
7
|
-
Project-URL: Issues, https://github.com/
|
|
6
|
+
Project-URL: Homepage, https://github.com/svetzal/mojentic
|
|
7
|
+
Project-URL: Issues, https://github.com/svetzal/mojentic/issues
|
|
8
8
|
Classifier: Programming Language :: Python :: 3
|
|
9
9
|
Classifier: License :: OSI Approved :: MIT License
|
|
10
10
|
Classifier: Operating System :: OS Independent
|
|
@@ -22,15 +22,26 @@ Requires-Dist: parsedatetime
|
|
|
22
22
|
Requires-Dist: pytz
|
|
23
23
|
Requires-Dist: serpapi
|
|
24
24
|
Requires-Dist: colorama
|
|
25
|
+
Provides-Extra: dev
|
|
26
|
+
Requires-Dist: pytest>=7.0.0; extra == "dev"
|
|
27
|
+
Requires-Dist: pytest-spec; extra == "dev"
|
|
28
|
+
Requires-Dist: pytest-cov; extra == "dev"
|
|
29
|
+
Requires-Dist: pytest-mock>=3.10.0; extra == "dev"
|
|
30
|
+
Requires-Dist: flake8>=6.0.0; extra == "dev"
|
|
31
|
+
Requires-Dist: mkdocs; extra == "dev"
|
|
32
|
+
Requires-Dist: mkdocstrings[python]; extra == "dev"
|
|
33
|
+
Requires-Dist: griffe-fieldz; extra == "dev"
|
|
34
|
+
Requires-Dist: mkdocs-material; extra == "dev"
|
|
35
|
+
Requires-Dist: pymdown-extensions; extra == "dev"
|
|
25
36
|
Dynamic: license-file
|
|
26
37
|
|
|
27
38
|
# Mojentic
|
|
28
39
|
|
|
29
40
|
Mojentic is a framework that provides a simple and flexible way to interact with Large Language Models (LLMs). It offers integration with various LLM providers and includes tools for structured output generation, task automation, and more. The future direction is to facilitate a team of agents, but the current focus is on robust LLM interaction capabilities.
|
|
30
41
|
|
|
31
|
-
[](LICENSE.md)
|
|
32
43
|
[](https://www.python.org/downloads/)
|
|
33
|
-
[](https://
|
|
44
|
+
[](https://svetzal.github.io/mojentic/)
|
|
34
45
|
|
|
35
46
|
## 🚀 Features
|
|
36
47
|
|
|
@@ -57,7 +68,7 @@ pip install mojentic
|
|
|
57
68
|
Or install from source
|
|
58
69
|
|
|
59
70
|
```bash
|
|
60
|
-
git clone https://github.com/
|
|
71
|
+
git clone https://github.com/svetzal/mojentic.git
|
|
61
72
|
cd mojentic
|
|
62
73
|
pip install -e .
|
|
63
74
|
```
|
|
@@ -123,18 +134,17 @@ The primary focus is currently on the `llm` module, which provides robust capabi
|
|
|
123
134
|
|
|
124
135
|
## 📚 Documentation
|
|
125
136
|
|
|
126
|
-
Visit [the documentation](https://
|
|
137
|
+
Visit [the documentation](https://svetzal.github.io/mojentic/) for comprehensive guides, API reference, and examples.
|
|
127
138
|
|
|
128
139
|
## 🧪 Development
|
|
129
140
|
|
|
130
141
|
```bash
|
|
131
142
|
# Clone the repository
|
|
132
|
-
git clone https://github.com/
|
|
143
|
+
git clone https://github.com/svetzal/mojentic.git
|
|
133
144
|
cd mojentic
|
|
134
145
|
|
|
135
146
|
# Install dependencies
|
|
136
|
-
pip install -
|
|
137
|
-
pip install -r dev-requirements.txt
|
|
147
|
+
pip install -e ".[dev]"
|
|
138
148
|
|
|
139
149
|
# Run tests
|
|
140
150
|
pytest
|
|
@@ -22,7 +22,7 @@ _examples/list_models.py,sha256=8noMpGeXOdX5Pf0NXCt_CRurOKEg_5luhWveGntBhe8,578
|
|
|
22
22
|
_examples/oversized_embeddings.py,sha256=_z2JoqZn0g7VtRsFVWIkngVqzjhQQvCEUYWVxs1I7MM,284
|
|
23
23
|
_examples/raw.py,sha256=Y2wvgynFuoUs28agE4ijsLYec8VRjiReklqlCH2lERs,442
|
|
24
24
|
_examples/react.py,sha256=VQ-5MmjUXoHzBFPTV_JrocuOkDzZ8oyUUSYLlEToJ_0,939
|
|
25
|
-
_examples/recursive_agent.py,sha256=
|
|
25
|
+
_examples/recursive_agent.py,sha256=ZDQ9Ts35JdxK6-LfO5GNmXZM2ru9w3Wpa1HXsmzbmqw,3016
|
|
26
26
|
_examples/routed_send_response.py,sha256=FHhTy7y2f7GY_WAWZYqOnFqF1xeJTBuS5EjfJGsJ3S8,4146
|
|
27
27
|
_examples/simple_llm.py,sha256=Cpjj1S8wXLovta1OcutTqp-fls-zVY4l5TAkbEqpA0s,1231
|
|
28
28
|
_examples/simple_llm_repl.py,sha256=bpk7S1-yQ-oZdRD_0ICV37NQxntgvgjiFD5KdIU40Ig,1406
|
|
@@ -31,6 +31,7 @@ _examples/simple_tool.py,sha256=9hRo2YZk7NmprTIkLmEyueCbZ0Ls1Ey4l4eDvvgoWy8,1288
|
|
|
31
31
|
_examples/solver_chat_session.py,sha256=4mTsgQVJWwujDFX6NUIK6kKr45E09Q4yIkZF-FdoTtg,2148
|
|
32
32
|
_examples/streaming.py,sha256=P1CGvm11yi_tojnha2Qmp_OFB5A3T-F5dWIzxEclNhM,1137
|
|
33
33
|
_examples/tell_user_example.py,sha256=gPGS_3KAHUIFsnvkDXX6u1mVqlsB67zsyNdGuEho60o,1274
|
|
34
|
+
_examples/tracer_demo.py,sha256=X4nZtMX4yPDLF0i-pb0gXDHvjUwgCDJ6Q6RS7lNRlVs,7101
|
|
34
35
|
_examples/working_memory.py,sha256=xbCHb6Y0Um6ai5T9fWAX4oQOcCQJDinsn902qm8q48E,1935
|
|
35
36
|
_examples/react/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
36
37
|
_examples/react/formatters.py,sha256=nbgWve0YGKaRY6P4tXV84PYw8YDN4neefiq7mR2I_tI,1065
|
|
@@ -41,7 +42,7 @@ _examples/react/models/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3
|
|
|
41
42
|
_examples/react/models/base.py,sha256=F3hR023XQofs3Op37sruuONxAU7eRjGnLnf4515BeYU,1239
|
|
42
43
|
_examples/react/models/events.py,sha256=0lRY0D5VrSkIGEKnSEQQBRyxxMQl71yxPkdMBuVBKHw,1062
|
|
43
44
|
mojentic/__init__.py,sha256=Jrllv5OKZKjkfVNLRJV6yT3NZA8ZELSrqj3798H4cDs,1172
|
|
44
|
-
mojentic/dispatcher.py,sha256=
|
|
45
|
+
mojentic/dispatcher.py,sha256=Jx73v1799pYqzdLBDnq1tbPzXVEs3xArwtMhZvByyH8,2760
|
|
45
46
|
mojentic/event.py,sha256=P0kgI0Si41ifCTLNtpfkks0OktlK4wuAj3oMCDtdUyo,330
|
|
46
47
|
mojentic/router.py,sha256=7z2xqgpsuHmA32HfH3rAgDk3zLhUBxz8DHPt2vDlVOU,377
|
|
47
48
|
mojentic/router_spec.py,sha256=CRYeKEa7dz_yN8ABAi5DgY5C0mJW7she3Kw0NzxoHx4,876
|
|
@@ -53,18 +54,16 @@ mojentic/agents/base_llm_agent_spec.py,sha256=1kzayCtAZY7oWloaFMh7-NkTtiKihDCLD3
|
|
|
53
54
|
mojentic/agents/correlation_aggregator_agent.py,sha256=okdq92rMNwIXTgnuwwn3zp4JzSxTh05vGWzTGocOgbU,1134
|
|
54
55
|
mojentic/agents/iterative_problem_solver.py,sha256=RLt8MCM99d-Z26EhC5UnmE0M97EM475VGBVsNio8DSA,4329
|
|
55
56
|
mojentic/agents/output_agent.py,sha256=I9GHcWvQhWxEcvjzj47scKo_QF8_6yR17ZUEHhwC94Y,231
|
|
56
|
-
mojentic/agents/simple_recursive_agent.py,sha256=
|
|
57
|
-
mojentic/audit/event_store.py,sha256=uw5ploNym9CvI-WDeW3Y4qHJupPWBQaGrfrubxOfmpA,130
|
|
58
|
-
mojentic/audit/event_store_spec.py,sha256=mCryZGWNXP9CmukvD3hUyQGs_7afjwbTK3RdT831Lzc,594
|
|
57
|
+
mojentic/agents/simple_recursive_agent.py,sha256=B3QcOeIuamoLp0MsAwCjJLgVCaODsEi03xAAfpMWFRM,9846
|
|
59
58
|
mojentic/context/__init__.py,sha256=MKMP7ViQg8gMtLFvn9pf47XMc5beA5Wx95K4dEw93z8,55
|
|
60
59
|
mojentic/context/shared_working_memory.py,sha256=Zt9MNGErEkDIUAaHvyhEOiTaEobI9l0MV4Z59lQFBr0,396
|
|
61
60
|
mojentic/llm/__init__.py,sha256=mwdPpTRofw7_KSlW6ZQmcM-GSpyISWyI2bxphKpV7A0,180
|
|
62
61
|
mojentic/llm/chat_session.py,sha256=H2gY0mZYVym8jC69VHsmKaRZ9T87Suyw0-TW5r850nA,3992
|
|
63
62
|
mojentic/llm/chat_session_spec.py,sha256=8-jj-EHV2WwWuvo3t8I75kSEAYiG1nR-OEwkkLTi_z0,3872
|
|
64
|
-
mojentic/llm/llm_broker.py,sha256=
|
|
63
|
+
mojentic/llm/llm_broker.py,sha256=DFi0zgFYgdOKrJx7DomktnbBQKppi4mB_RcDvXTf9-4,9170
|
|
65
64
|
mojentic/llm/llm_broker_spec.py,sha256=40lzmYm_6Zje6z5MQ7_o3gSBThLsNW_l_1mZTUVll6A,5342
|
|
66
65
|
mojentic/llm/message_composers.py,sha256=Fo9o7UGZOOIYoGI_DyOfP_oMiEiCMQz-zdWdTKtozVk,12108
|
|
67
|
-
mojentic/llm/message_composers_spec.py,sha256=
|
|
66
|
+
mojentic/llm/message_composers_spec.py,sha256=RNW14Zb-kIBWT5Wy9cZQyxHPrcRIaBFjBYCR9N-m0kE,12109
|
|
68
67
|
mojentic/llm/gateways/__init__.py,sha256=u7hXzngoRw_qbsJeiCH2NQ8vC2hF5DnqcXsfLVVPSSw,104
|
|
69
68
|
mojentic/llm/gateways/anthropic.py,sha256=SsyNjq9QaXaqiMM43C9fwLp57hpgFtwNPJUnOAYVrtc,1788
|
|
70
69
|
mojentic/llm/gateways/anthropic_messages_adapter.py,sha256=K6kEZeVt7E1endbGMLsh5l9SxC3Y5dnvbcejVqi_qUs,3003
|
|
@@ -76,8 +75,8 @@ mojentic/llm/gateways/ollama.py,sha256=629fpZhC0zVCYqj360-PKTT4mQOLec5nzzvfMtS_m
|
|
|
76
75
|
mojentic/llm/gateways/ollama_messages_adapter.py,sha256=kUN_p2FyN88_trXMcL-Xsn9xPBU7pGKlJwTUEUCf6G4,1404
|
|
77
76
|
mojentic/llm/gateways/ollama_messages_adapter_spec.py,sha256=gVRbWDrHOa1EiZ0CkEWe0pGn-GKRqdGb-x56HBQeYSE,4981
|
|
78
77
|
mojentic/llm/gateways/openai.py,sha256=NQECA41PS21RhXjwQdbH3DAP15WqkEl22UlS1ka_lLM,5434
|
|
79
|
-
mojentic/llm/gateways/openai_message_adapter_spec.py,sha256=
|
|
80
|
-
mojentic/llm/gateways/openai_messages_adapter.py,sha256=
|
|
78
|
+
mojentic/llm/gateways/openai_message_adapter_spec.py,sha256=ITBSV5njldV_x0NPgjmg8Okf9KzevQJ8dTXM-t6ubcg,6612
|
|
79
|
+
mojentic/llm/gateways/openai_messages_adapter.py,sha256=9Btcr77RzlqZIdkNuGDGitk9D7SQTv4GsdKXaN2Fuv4,3863
|
|
81
80
|
mojentic/llm/gateways/tokenizer_gateway.py,sha256=ztuqfunlJ6xmyUPPHcC_69-kegiNJD6jdSEde7hDh2w,485
|
|
82
81
|
mojentic/llm/registry/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
83
82
|
mojentic/llm/registry/llm_registry.py,sha256=beyrgGrkXx5ZckUJzC1nQ461vra0fF6s_qRaEdi5bsg,2508
|
|
@@ -89,8 +88,8 @@ mojentic/llm/tools/current_datetime.py,sha256=JkIFlBBnvE4CMcgZizqITVTtNfL7zeeLxD
|
|
|
89
88
|
mojentic/llm/tools/date_resolver.py,sha256=VDxX59PTHo0PstDxaJUo3SF7vkvQoG92bo6j8ABq8y4,2185
|
|
90
89
|
mojentic/llm/tools/date_resolver_spec.py,sha256=OaRvJyhSN8sgi75euk4E5ImaqUmvQdgZKY8u_NOiPWE,1185
|
|
91
90
|
mojentic/llm/tools/file_manager.py,sha256=X8Uw4XtdH_Ol2EB3SN11-GYlC1diJ1cAywU9_EuCjCg,3788
|
|
92
|
-
mojentic/llm/tools/llm_tool.py,sha256=
|
|
93
|
-
mojentic/llm/tools/llm_tool_spec.py,sha256=
|
|
91
|
+
mojentic/llm/tools/llm_tool.py,sha256=MV1aexLjiPhcm1B1lvIkSJlokpPfuhF_Amqg7zCa6VQ,1695
|
|
92
|
+
mojentic/llm/tools/llm_tool_spec.py,sha256=OPudmuqSxkJBUaL0-qABri-tvrAyb6QI9Ac5B5iTo3I,2112
|
|
94
93
|
mojentic/llm/tools/organic_web_search.py,sha256=X_WQSSFgeMp5jlm0tnqGOHDIZ2KHDvz3k6GF-XqsuN4,1301
|
|
95
94
|
mojentic/llm/tools/tell_user_tool.py,sha256=bF_PTfF0-skCi_Exw6EPpdfoNUZRJ4MWg-XCe4VYd6s,999
|
|
96
95
|
mojentic/llm/tools/tool_wrapper.py,sha256=6YZOhckgNsSUc7YK6bKjODjRTwi6wcH9bdcySUDPt3Q,1391
|
|
@@ -112,10 +111,18 @@ mojentic/llm/tools/ephemeral_task_manager/prepend_task_tool.py,sha256=GGqPTdBTkj
|
|
|
112
111
|
mojentic/llm/tools/ephemeral_task_manager/prepend_task_tool_spec.py,sha256=lUCnejAON9g0DDNS64EVHwapPjF8b87RsXPUVvvG0b4,1174
|
|
113
112
|
mojentic/llm/tools/ephemeral_task_manager/start_task_tool.py,sha256=VH8Wa4-ZmkMIsyLuLXJx4pGidiT0KeT55DnujFpK-0o,2414
|
|
114
113
|
mojentic/llm/tools/ephemeral_task_manager/start_task_tool_spec.py,sha256=oDeVPPfquM2ojwG0aaNnbWCB_LRgm8runtG-CumZkLg,1490
|
|
114
|
+
mojentic/tracer/__init__.py,sha256=075nYiRvYTzkzombGY-31Gy0JMPM7Zn645F6_j5-k6I,445
|
|
115
|
+
mojentic/tracer/event_store.py,sha256=eqbze4YRuiMDr8TCtMNHi-U_6-CLgstOHkLmtM5hc6Q,3691
|
|
116
|
+
mojentic/tracer/event_store_spec.py,sha256=OWXWbeMCYU9dfySmbpmDA4KmwLlSaFy4ZpRt6BsTkFE,6522
|
|
117
|
+
mojentic/tracer/null_tracer.py,sha256=zvNLKjQSu3na6SWoFa16k9fFyjmSD3Ihw5rTjRUXrSs,6872
|
|
118
|
+
mojentic/tracer/tracer_events.py,sha256=mtONmApybFmbbt_4xN6h-wGrcZZneI3sJJ_8Z68V-tA,5405
|
|
119
|
+
mojentic/tracer/tracer_events_spec.py,sha256=v84P3IjVr0_TGjwJD1w2SSNlTDJj0a4P8tMkDrsbOTA,3549
|
|
120
|
+
mojentic/tracer/tracer_system.py,sha256=7CPy_2tlsHtXQ4DcO5oo52N9a9WS0GH-mjeINzu62ls,9989
|
|
121
|
+
mojentic/tracer/tracer_system_spec.py,sha256=TNm0f9LV__coBx0JGEKyzzNN9mFjCSG_SSrRISO8Xeg,8632
|
|
115
122
|
mojentic/utils/__init__.py,sha256=lqECkkoFvHFttDnafRE1vvh0Dmna_lwupMToP5VvX5k,115
|
|
116
123
|
mojentic/utils/formatting.py,sha256=bPrwwdluXdQ8TsFxfWtHNOeMWKNvAfABSoUnnA1g7c8,947
|
|
117
|
-
mojentic-0.
|
|
118
|
-
mojentic-0.
|
|
119
|
-
mojentic-0.
|
|
120
|
-
mojentic-0.
|
|
121
|
-
mojentic-0.
|
|
124
|
+
mojentic-0.6.1.dist-info/licenses/LICENSE.md,sha256=txSgV8n5zY1W3NiF5HHsCwlaW0e8We1cSC6TuJUqxXA,1060
|
|
125
|
+
mojentic-0.6.1.dist-info/METADATA,sha256=9qU1X0uRQiZLgINOO9rEibCg2WQ_20AQzjUqI9POan0,5383
|
|
126
|
+
mojentic-0.6.1.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
|
127
|
+
mojentic-0.6.1.dist-info/top_level.txt,sha256=Q-BvPQ8Eu1jnEqK8Xkr6A9C8Xa1z38oPZRHuA5MCTqg,19
|
|
128
|
+
mojentic-0.6.1.dist-info/RECORD,,
|
mojentic/audit/event_store.py
DELETED
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
from mojentic import Event
|
|
2
|
-
from mojentic.audit.event_store import EventStore
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
class DescribeEventStore:
|
|
6
|
-
"""
|
|
7
|
-
The immutable event store is key to the auditability of agent interactions.
|
|
8
|
-
"""
|
|
9
|
-
|
|
10
|
-
def should_store_an_event(self):
|
|
11
|
-
"""
|
|
12
|
-
Given an event
|
|
13
|
-
When asked to store the event
|
|
14
|
-
Then the event should be stored
|
|
15
|
-
"""
|
|
16
|
-
# Given
|
|
17
|
-
event = Event(
|
|
18
|
-
source=DescribeEventStore,
|
|
19
|
-
)
|
|
20
|
-
event_store = EventStore()
|
|
21
|
-
|
|
22
|
-
# When
|
|
23
|
-
event_store.store(event)
|
|
24
|
-
|
|
25
|
-
# Then
|
|
26
|
-
assert event in event_store.events
|
|
File without changes
|
|
File without changes
|