memmachine-common 0.3.0__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.
@@ -0,0 +1,20 @@
1
+ Metadata-Version: 2.4
2
+ Name: memmachine-common
3
+ Version: 0.3.0
4
+ Summary: MemMachine Common - Shared API models for MemMachine client and server
5
+ Author-email: MemMachine <noreply@memmachine.ai>
6
+ License-Expression: Apache-2.0
7
+ Project-URL: Homepage, https://github.com/MemMachine/MemMachine
8
+ Project-URL: Issues, https://github.com/MemMachine/MemMachine/issues
9
+ Keywords: memmachine,common,api,models
10
+ Classifier: Programming Language :: Python :: 3
11
+ Classifier: Programming Language :: Python :: 3.10
12
+ Classifier: Programming Language :: Python :: 3.11
13
+ Classifier: Programming Language :: Python :: 3.12
14
+ Classifier: Programming Language :: Python :: 3.13
15
+ Classifier: Programming Language :: Python :: 3.14
16
+ Classifier: Operating System :: OS Independent
17
+ Requires-Python: >=3.10
18
+ Requires-Dist: pydantic>=2.0.0
19
+ Requires-Dist: regex>=2023.0.0
20
+ Requires-Dist: typing-extensions>=4.0.0
@@ -0,0 +1,48 @@
1
+ [build-system]
2
+ requires = ["setuptools>=68.0", "wheel", "setuptools-scm>=8.0"]
3
+ build-backend = "setuptools.build_meta"
4
+
5
+ [project]
6
+ name = "memmachine-common"
7
+ dynamic = ["version"]
8
+ dependencies = [
9
+ "pydantic>=2.0.0",
10
+ "regex>=2023.0.0",
11
+ "typing-extensions>=4.0.0",
12
+ ]
13
+ requires-python = ">= 3.10"
14
+ authors = [
15
+ {name="MemMachine", email="noreply@memmachine.ai"},
16
+ ]
17
+ description = "MemMachine Common - Shared API models for MemMachine client and server"
18
+ keywords = ["memmachine", "common", "api", "models"]
19
+ classifiers = [
20
+ "Programming Language :: Python :: 3",
21
+ "Programming Language :: Python :: 3.10",
22
+ "Programming Language :: Python :: 3.11",
23
+ "Programming Language :: Python :: 3.12",
24
+ "Programming Language :: Python :: 3.13",
25
+ "Programming Language :: Python :: 3.14",
26
+ "Operating System :: OS Independent",
27
+ ]
28
+ license = "Apache-2.0"
29
+
30
+ [project.urls]
31
+ Homepage = "https://github.com/MemMachine/MemMachine"
32
+ Issues = "https://github.com/MemMachine/MemMachine/issues"
33
+
34
+ [tool.setuptools.packages.find]
35
+ where = ["src"]
36
+
37
+ [tool.setuptools_scm]
38
+ root = "../.."
39
+
40
+ [tool.uv]
41
+ package = true
42
+
43
+ [tool.ty.environment]
44
+ python-version = "3.10"
45
+
46
+ [tool.ruff]
47
+ extend = "../../pyproject.toml"
48
+ target-version = "py310"
@@ -0,0 +1,4 @@
1
+ [egg_info]
2
+ tag_build =
3
+ tag_date = 0
4
+
@@ -0,0 +1 @@
1
+ """MemMachine Common - Shared API models for MemMachine client and server."""
@@ -0,0 +1,19 @@
1
+ """Shared API definitions for MemMachine client and server."""
2
+
3
+ from enum import Enum
4
+
5
+
6
+ class MemoryType(Enum):
7
+ """Memory type."""
8
+
9
+ Semantic = "semantic"
10
+ Episodic = "episodic"
11
+
12
+
13
+ class EpisodeType(Enum):
14
+ """Episode type."""
15
+
16
+ MESSAGE = "message"
17
+
18
+
19
+ __all__ = ["EpisodeType", "MemoryType"]
@@ -0,0 +1,508 @@
1
+ """Configuration API specification models for request and response structures."""
2
+
3
+ from enum import Enum
4
+ from typing import Annotated, Any, Literal
5
+
6
+ from pydantic import BaseModel, Field
7
+
8
+ from memmachine_common.api.doc import SpecDoc
9
+
10
+
11
+ class ResourceStatus(str, Enum):
12
+ """Status of a resource."""
13
+
14
+ READY = "ready"
15
+ FAILED = "failed"
16
+ PENDING = "pending"
17
+
18
+
19
+ class ResourceInfo(BaseModel):
20
+ """Information about a configured resource."""
21
+
22
+ name: Annotated[
23
+ str,
24
+ Field(..., description=SpecDoc.RESOURCE_NAME),
25
+ ]
26
+ provider: Annotated[
27
+ str,
28
+ Field(..., description=SpecDoc.RESOURCE_PROVIDER),
29
+ ]
30
+ status: Annotated[
31
+ ResourceStatus,
32
+ Field(..., description=SpecDoc.RESOURCE_STATUS),
33
+ ]
34
+ error: Annotated[
35
+ str | None,
36
+ Field(default=None, description=SpecDoc.RESOURCE_ERROR_MSG),
37
+ ]
38
+
39
+
40
+ class ResourcesStatus(BaseModel):
41
+ """Status of all configured resources."""
42
+
43
+ embedders: Annotated[
44
+ list[ResourceInfo],
45
+ Field(default_factory=list, description=SpecDoc.EMBEDDERS_STATUS),
46
+ ]
47
+ language_models: Annotated[
48
+ list[ResourceInfo],
49
+ Field(default_factory=list, description=SpecDoc.LANGUAGE_MODELS_STATUS),
50
+ ]
51
+ rerankers: Annotated[
52
+ list[ResourceInfo],
53
+ Field(default_factory=list, description=SpecDoc.RERANKERS_STATUS),
54
+ ]
55
+ databases: Annotated[
56
+ list[ResourceInfo],
57
+ Field(default_factory=list, description=SpecDoc.DATABASES_STATUS),
58
+ ]
59
+
60
+
61
+ class LongTermMemoryConfigResponse(BaseModel):
62
+ """Response model for long-term memory configuration."""
63
+
64
+ embedder: Annotated[
65
+ str | None,
66
+ Field(default=None, description=SpecDoc.LTM_CONFIG_EMBEDDER),
67
+ ]
68
+ reranker: Annotated[
69
+ str | None,
70
+ Field(default=None, description=SpecDoc.LTM_CONFIG_RERANKER),
71
+ ]
72
+ vector_graph_store: Annotated[
73
+ str | None,
74
+ Field(default=None, description=SpecDoc.LTM_CONFIG_VECTOR_GRAPH_STORE),
75
+ ]
76
+ enabled: Annotated[
77
+ bool,
78
+ Field(default=True, description=SpecDoc.LTM_CONFIG_ENABLED),
79
+ ]
80
+
81
+
82
+ class ShortTermMemoryConfigResponse(BaseModel):
83
+ """Response model for short-term memory configuration."""
84
+
85
+ llm_model: Annotated[
86
+ str | None,
87
+ Field(default=None, description=SpecDoc.STM_CONFIG_LLM_MODEL),
88
+ ]
89
+ message_capacity: Annotated[
90
+ int | None,
91
+ Field(default=None, description=SpecDoc.STM_CONFIG_MESSAGE_CAPACITY),
92
+ ]
93
+ enabled: Annotated[
94
+ bool,
95
+ Field(default=True, description=SpecDoc.STM_CONFIG_ENABLED),
96
+ ]
97
+
98
+
99
+ class EpisodicMemoryConfigResponse(BaseModel):
100
+ """Response model for episodic memory configuration."""
101
+
102
+ long_term_memory: Annotated[
103
+ LongTermMemoryConfigResponse,
104
+ Field(
105
+ default_factory=LongTermMemoryConfigResponse, description=SpecDoc.LTM_CONFIG
106
+ ),
107
+ ]
108
+ short_term_memory: Annotated[
109
+ ShortTermMemoryConfigResponse,
110
+ Field(
111
+ default_factory=ShortTermMemoryConfigResponse,
112
+ description=SpecDoc.STM_CONFIG,
113
+ ),
114
+ ]
115
+ enabled: Annotated[
116
+ bool,
117
+ Field(default=True, description=SpecDoc.EPISODIC_ENABLED),
118
+ ]
119
+
120
+
121
+ class SemanticMemoryConfigResponse(BaseModel):
122
+ """Response model for semantic memory configuration."""
123
+
124
+ enabled: Annotated[
125
+ bool,
126
+ Field(default=False, description=SpecDoc.SEMANTIC_ENABLED),
127
+ ]
128
+ database: Annotated[
129
+ str | None,
130
+ Field(default=None, description=SpecDoc.SEMANTIC_DATABASE),
131
+ ]
132
+ llm_model: Annotated[
133
+ str | None,
134
+ Field(default=None, description=SpecDoc.SEMANTIC_LLM_MODEL),
135
+ ]
136
+ embedding_model: Annotated[
137
+ str | None,
138
+ Field(default=None, description=SpecDoc.SEMANTIC_EMBEDDING_MODEL),
139
+ ]
140
+
141
+
142
+ class GetConfigResponse(BaseModel):
143
+ """Response model for configuration retrieval."""
144
+
145
+ resources: Annotated[
146
+ ResourcesStatus,
147
+ Field(..., description=SpecDoc.RESOURCES_STATUS),
148
+ ]
149
+ episodic_memory: Annotated[
150
+ EpisodicMemoryConfigResponse,
151
+ Field(
152
+ default_factory=EpisodicMemoryConfigResponse,
153
+ description=SpecDoc.EPISODIC_MEMORY_CONFIG,
154
+ ),
155
+ ]
156
+ semantic_memory: Annotated[
157
+ SemanticMemoryConfigResponse,
158
+ Field(
159
+ default_factory=SemanticMemoryConfigResponse,
160
+ description=SpecDoc.SEMANTIC_MEMORY_CONFIG,
161
+ ),
162
+ ]
163
+
164
+
165
+ # --- Add Embedder Models ---
166
+
167
+
168
+ class AddOpenAIEmbedderConfig(BaseModel):
169
+ """Configuration for adding an OpenAI embedder."""
170
+
171
+ api_key: Annotated[
172
+ str,
173
+ Field(..., description=SpecDoc.API_KEY_OPENAI),
174
+ ]
175
+ model: Annotated[
176
+ str,
177
+ Field(default="text-embedding-3-small", description=SpecDoc.MODEL_NAME),
178
+ ]
179
+ dimensions: Annotated[
180
+ int | None,
181
+ Field(default=1536, description=SpecDoc.EMBEDDING_DIMENSIONS),
182
+ ]
183
+ base_url: Annotated[
184
+ str | None,
185
+ Field(default=None, description=SpecDoc.API_BASE_URL),
186
+ ]
187
+ max_input_length: Annotated[
188
+ int | None,
189
+ Field(default=None, description=SpecDoc.MAX_INPUT_LENGTH),
190
+ ]
191
+ max_retry_interval_seconds: Annotated[
192
+ int,
193
+ Field(default=120, description=SpecDoc.MAX_RETRY_INTERVAL),
194
+ ]
195
+
196
+
197
+ class AddAmazonBedrockEmbedderConfig(BaseModel):
198
+ """Configuration for adding an Amazon Bedrock embedder."""
199
+
200
+ region: Annotated[
201
+ str,
202
+ Field(..., description=SpecDoc.AWS_REGION),
203
+ ]
204
+ model_id: Annotated[
205
+ str,
206
+ Field(
207
+ default="amazon.titan-embed-text-v2:0",
208
+ description=SpecDoc.MODEL_ID_BEDROCK,
209
+ ),
210
+ ]
211
+ aws_access_key_id: Annotated[
212
+ str | None,
213
+ Field(default=None, description=SpecDoc.AWS_ACCESS_KEY_ID),
214
+ ]
215
+ aws_secret_access_key: Annotated[
216
+ str | None,
217
+ Field(default=None, description=SpecDoc.AWS_SECRET_ACCESS_KEY),
218
+ ]
219
+ aws_session_token: Annotated[
220
+ str | None,
221
+ Field(default=None, description=SpecDoc.AWS_SESSION_TOKEN),
222
+ ]
223
+ max_input_length: Annotated[
224
+ int | None,
225
+ Field(default=None, description=SpecDoc.MAX_INPUT_LENGTH),
226
+ ]
227
+ max_retry_interval_seconds: Annotated[
228
+ int,
229
+ Field(default=120, description=SpecDoc.MAX_RETRY_INTERVAL),
230
+ ]
231
+
232
+
233
+ class AddSentenceTransformerEmbedderConfig(BaseModel):
234
+ """Configuration for adding a SentenceTransformer embedder."""
235
+
236
+ model: Annotated[
237
+ str,
238
+ Field(..., description=SpecDoc.SENTENCE_TRANSFORMER_MODEL),
239
+ ]
240
+ max_input_length: Annotated[
241
+ int | None,
242
+ Field(default=None, description=SpecDoc.MAX_INPUT_LENGTH),
243
+ ]
244
+
245
+
246
+ class AddEmbedderSpec(BaseModel):
247
+ """Specification for adding a new embedder."""
248
+
249
+ name: Annotated[
250
+ str,
251
+ Field(..., description=SpecDoc.EMBEDDER_NAME),
252
+ ]
253
+ provider: Annotated[
254
+ Literal["openai", "amazon-bedrock", "sentence-transformer"],
255
+ Field(..., description=SpecDoc.EMBEDDER_PROVIDER_TYPE),
256
+ ]
257
+ config: Annotated[
258
+ dict[str, Any],
259
+ Field(..., description=SpecDoc.PROVIDER_CONFIG),
260
+ ]
261
+
262
+
263
+ # --- Add Language Model Models ---
264
+
265
+
266
+ class AddOpenAIResponsesLanguageModelConfig(BaseModel):
267
+ """Configuration for adding an OpenAI Responses language model."""
268
+
269
+ api_key: Annotated[
270
+ str,
271
+ Field(..., description=SpecDoc.API_KEY_OPENAI),
272
+ ]
273
+ model: Annotated[
274
+ str,
275
+ Field(default="gpt-4o", description=SpecDoc.MODEL_NAME),
276
+ ]
277
+ base_url: Annotated[
278
+ str | None,
279
+ Field(default=None, description=SpecDoc.API_BASE_URL),
280
+ ]
281
+ max_retry_interval_seconds: Annotated[
282
+ int,
283
+ Field(default=120, description=SpecDoc.MAX_RETRY_INTERVAL),
284
+ ]
285
+
286
+
287
+ class AddOpenAIChatCompletionsLanguageModelConfig(BaseModel):
288
+ """Configuration for adding an OpenAI Chat Completions language model."""
289
+
290
+ api_key: Annotated[
291
+ str,
292
+ Field(..., description=SpecDoc.API_KEY_OPENAI),
293
+ ]
294
+ model: Annotated[
295
+ str,
296
+ Field(default="gpt-4o", description=SpecDoc.MODEL_NAME),
297
+ ]
298
+ base_url: Annotated[
299
+ str | None,
300
+ Field(default=None, description=SpecDoc.API_BASE_URL),
301
+ ]
302
+ max_retry_interval_seconds: Annotated[
303
+ int,
304
+ Field(default=120, description=SpecDoc.MAX_RETRY_INTERVAL),
305
+ ]
306
+
307
+
308
+ class AddAmazonBedrockLanguageModelConfig(BaseModel):
309
+ """Configuration for adding an Amazon Bedrock language model."""
310
+
311
+ region: Annotated[
312
+ str,
313
+ Field(..., description=SpecDoc.AWS_REGION),
314
+ ]
315
+ model_id: Annotated[
316
+ str,
317
+ Field(..., description=SpecDoc.MODEL_ID_BEDROCK),
318
+ ]
319
+ aws_access_key_id: Annotated[
320
+ str | None,
321
+ Field(default=None, description=SpecDoc.AWS_ACCESS_KEY_ID),
322
+ ]
323
+ aws_secret_access_key: Annotated[
324
+ str | None,
325
+ Field(default=None, description=SpecDoc.AWS_SECRET_ACCESS_KEY),
326
+ ]
327
+ aws_session_token: Annotated[
328
+ str | None,
329
+ Field(default=None, description=SpecDoc.AWS_SESSION_TOKEN),
330
+ ]
331
+ max_retry_interval_seconds: Annotated[
332
+ int,
333
+ Field(default=120, description=SpecDoc.MAX_RETRY_INTERVAL),
334
+ ]
335
+ inference_config: Annotated[
336
+ dict[str, Any] | None,
337
+ Field(default=None, description=SpecDoc.INFERENCE_CONFIG),
338
+ ]
339
+ additional_model_request_fields: Annotated[
340
+ dict[str, Any] | None,
341
+ Field(default=None, description=SpecDoc.ADDITIONAL_MODEL_FIELDS),
342
+ ]
343
+
344
+
345
+ class AddLanguageModelSpec(BaseModel):
346
+ """Specification for adding a new language model."""
347
+
348
+ name: Annotated[
349
+ str,
350
+ Field(..., description=SpecDoc.LM_NAME),
351
+ ]
352
+ provider: Annotated[
353
+ Literal["openai-responses", "openai-chat-completions", "amazon-bedrock"],
354
+ Field(..., description=SpecDoc.LM_PROVIDER_TYPE),
355
+ ]
356
+ config: Annotated[
357
+ dict[str, Any],
358
+ Field(..., description=SpecDoc.PROVIDER_CONFIG),
359
+ ]
360
+
361
+
362
+ # --- Response Models ---
363
+
364
+
365
+ # --- Update Memory Configuration Models ---
366
+
367
+
368
+ class UpdateLongTermMemorySpec(BaseModel):
369
+ """Partial update for long-term memory configuration."""
370
+
371
+ embedder: Annotated[
372
+ str | None,
373
+ Field(default=None, description=SpecDoc.LTM_EMBEDDER),
374
+ ]
375
+ reranker: Annotated[
376
+ str | None,
377
+ Field(default=None, description=SpecDoc.LTM_RERANKER),
378
+ ]
379
+ vector_graph_store: Annotated[
380
+ str | None,
381
+ Field(default=None, description=SpecDoc.LTM_VECTOR_GRAPH_STORE),
382
+ ]
383
+
384
+
385
+ class UpdateShortTermMemorySpec(BaseModel):
386
+ """Partial update for short-term memory configuration."""
387
+
388
+ llm_model: Annotated[
389
+ str | None,
390
+ Field(default=None, description=SpecDoc.STM_LLM_MODEL),
391
+ ]
392
+ message_capacity: Annotated[
393
+ int | None,
394
+ Field(default=None, gt=0, description=SpecDoc.STM_MESSAGE_CAPACITY),
395
+ ]
396
+
397
+
398
+ class UpdateEpisodicMemorySpec(BaseModel):
399
+ """Partial update for episodic memory configuration."""
400
+
401
+ long_term_memory: Annotated[
402
+ UpdateLongTermMemorySpec | None,
403
+ Field(default=None, description=SpecDoc.EPISODIC_LTM_UPDATE),
404
+ ]
405
+ short_term_memory: Annotated[
406
+ UpdateShortTermMemorySpec | None,
407
+ Field(default=None, description=SpecDoc.EPISODIC_STM_UPDATE),
408
+ ]
409
+ long_term_memory_enabled: Annotated[
410
+ bool | None,
411
+ Field(default=None, description=SpecDoc.EPISODIC_LTM_ENABLED),
412
+ ]
413
+ short_term_memory_enabled: Annotated[
414
+ bool | None,
415
+ Field(default=None, description=SpecDoc.EPISODIC_STM_ENABLED),
416
+ ]
417
+ enabled: Annotated[
418
+ bool | None,
419
+ Field(default=None, description=SpecDoc.EPISODIC_ENABLED),
420
+ ]
421
+
422
+
423
+ class UpdateSemanticMemorySpec(BaseModel):
424
+ """Partial update for semantic memory configuration."""
425
+
426
+ enabled: Annotated[
427
+ bool | None,
428
+ Field(default=None, description=SpecDoc.SEMANTIC_ENABLED),
429
+ ]
430
+ database: Annotated[
431
+ str | None,
432
+ Field(default=None, description=SpecDoc.SEMANTIC_DATABASE),
433
+ ]
434
+ llm_model: Annotated[
435
+ str | None,
436
+ Field(default=None, description=SpecDoc.SEMANTIC_LLM_MODEL),
437
+ ]
438
+ embedding_model: Annotated[
439
+ str | None,
440
+ Field(default=None, description=SpecDoc.SEMANTIC_EMBEDDING_MODEL),
441
+ ]
442
+ ingestion_trigger_messages: Annotated[
443
+ int | None,
444
+ Field(default=None, gt=0, description=SpecDoc.SEMANTIC_INGESTION_MESSAGES),
445
+ ]
446
+ ingestion_trigger_age_seconds: Annotated[
447
+ int | None,
448
+ Field(default=None, gt=0, description=SpecDoc.SEMANTIC_INGESTION_AGE),
449
+ ]
450
+
451
+
452
+ class UpdateMemoryConfigSpec(BaseModel):
453
+ """Specification for updating memory configuration."""
454
+
455
+ episodic_memory: Annotated[
456
+ UpdateEpisodicMemorySpec | None,
457
+ Field(default=None, description=SpecDoc.UPDATE_EPISODIC_MEMORY),
458
+ ]
459
+ semantic_memory: Annotated[
460
+ UpdateSemanticMemorySpec | None,
461
+ Field(default=None, description=SpecDoc.UPDATE_SEMANTIC_MEMORY),
462
+ ]
463
+
464
+
465
+ class UpdateMemoryConfigResponse(BaseModel):
466
+ """Response model for memory configuration update."""
467
+
468
+ success: Annotated[
469
+ bool,
470
+ Field(..., description=SpecDoc.OPERATION_SUCCESS),
471
+ ]
472
+ message: Annotated[
473
+ str,
474
+ Field(..., description=SpecDoc.STATUS_MESSAGE),
475
+ ]
476
+
477
+
478
+ # --- Response Models ---
479
+
480
+
481
+ class UpdateResourceResponse(BaseModel):
482
+ """Response model for resource update operations."""
483
+
484
+ success: Annotated[
485
+ bool,
486
+ Field(..., description=SpecDoc.OPERATION_SUCCESS),
487
+ ]
488
+ status: Annotated[
489
+ ResourceStatus,
490
+ Field(..., description=SpecDoc.RESOURCE_STATUS_AFTER_OP),
491
+ ]
492
+ error: Annotated[
493
+ str | None,
494
+ Field(default=None, description=SpecDoc.OPERATION_ERROR),
495
+ ]
496
+
497
+
498
+ class DeleteResourceResponse(BaseModel):
499
+ """Response model for resource deletion operations."""
500
+
501
+ success: Annotated[
502
+ bool,
503
+ Field(..., description=SpecDoc.DELETION_SUCCESS),
504
+ ]
505
+ message: Annotated[
506
+ str,
507
+ Field(..., description=SpecDoc.STATUS_MESSAGE),
508
+ ]