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.
@@ -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.5.7
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/mojility/mojentic
7
- Project-URL: Issues, https://github.com/mojility/mojentic/issues
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
- [![GitHub](https://img.shields.io/github/license/mojility/mojentic)](LICENSE.md)
42
+ [![GitHub](https://img.shields.io/github/license/svetzal/mojentic)](LICENSE.md)
32
43
  [![Python Version](https://img.shields.io/badge/python-3.11%2B-blue)](https://www.python.org/downloads/)
33
- [![Documentation](https://img.shields.io/badge/docs-latest-brightgreen)](https://mojility.github.io/mojentic/)
44
+ [![Documentation](https://img.shields.io/badge/docs-latest-brightgreen)](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/mojility/mojentic.git
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://mojility.github.io/mojentic/) for comprehensive guides, API reference, and examples.
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/mojility/mojentic.git
143
+ git clone https://github.com/svetzal/mojentic.git
133
144
  cd mojentic
134
145
 
135
146
  # Install dependencies
136
- pip install -r requirements.txt
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=NHmX8iQc1y43AKh1ZlAdV9OZ18qVaRRmSaKALE_KI6k,2966
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=NwgyLnZ2f9Et30LBgMAVSsVyIP74pU7LOuRsiuGzBao,1993
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=DcJFttTAYurRIObTL8kfbHUs5uvuqh6prEgA5nmxCLo,9950
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=8dEgqU-cPesPk4-jx36oPnvKxB34bLONbpyAW_2L-es,5884
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=VbaDR-fXWogI5ONSpkzvgPY9Tv9HQX6eEqB8J0ev2jQ,11641
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=IgXyio15nXn11MiFpUnAxm5fFpPU9m-c4qerd9gbpBA,6473
80
- mojentic/llm/gateways/openai_messages_adapter.py,sha256=Qwidv7C-wXDOEV8NYNjgIbHnJSlkcoK10FaeLos5zTc,2882
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=En88CSBMSKegXMe1A2eaWnEiYYuKkK2x-cD384B33is,758
93
- mojentic/llm/tools/llm_tool_spec.py,sha256=mj9nX10v8jKC5ahscmmKVe3IMNdBpRqc6C6LmROLkZw,2059
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.5.7.dist-info/licenses/LICENSE.md,sha256=txSgV8n5zY1W3NiF5HHsCwlaW0e8We1cSC6TuJUqxXA,1060
118
- mojentic-0.5.7.dist-info/METADATA,sha256=X6AdtcNt3_haoPVzJv_WijbYkovQlUhjIHV51uf6DEs,4956
119
- mojentic-0.5.7.dist-info/WHEEL,sha256=DnLRTWE75wApRYVsjgc6wsVswC54sMSJhAEd4xhDpBk,91
120
- mojentic-0.5.7.dist-info/top_level.txt,sha256=Q-BvPQ8Eu1jnEqK8Xkr6A9C8Xa1z38oPZRHuA5MCTqg,19
121
- mojentic-0.5.7.dist-info/RECORD,,
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,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (80.4.0)
2
+ Generator: setuptools (80.9.0)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5
 
@@ -1,6 +0,0 @@
1
- class EventStore:
2
- def __init__(self):
3
- self.events = []
4
-
5
- def store(self, event):
6
- self.events.append(event)
@@ -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