evermemos 0.3.6__tar.gz → 0.3.8__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (102) hide show
  1. evermemos-0.3.8/.release-please-manifest.json +3 -0
  2. {evermemos-0.3.6 → evermemos-0.3.8}/CHANGELOG.md +29 -0
  3. {evermemos-0.3.6 → evermemos-0.3.8}/PKG-INFO +49 -21
  4. {evermemos-0.3.6 → evermemos-0.3.8}/README.md +48 -20
  5. {evermemos-0.3.6 → evermemos-0.3.8}/api.md +18 -2
  6. {evermemos-0.3.6 → evermemos-0.3.8}/pyproject.toml +1 -1
  7. {evermemos-0.3.6 → evermemos-0.3.8}/src/evermemos/_version.py +1 -1
  8. {evermemos-0.3.6 → evermemos-0.3.8}/src/evermemos/resources/v1/__init__.py +14 -0
  9. {evermemos-0.3.6 → evermemos-0.3.8}/src/evermemos/resources/v1/memories/conversation_meta.py +2 -78
  10. {evermemos-0.3.6 → evermemos-0.3.8}/src/evermemos/resources/v1/memories/memories.py +182 -101
  11. evermemos-0.3.8/src/evermemos/resources/v1/stats/__init__.py +33 -0
  12. evermemos-0.3.8/src/evermemos/resources/v1/stats/request.py +175 -0
  13. evermemos-0.3.8/src/evermemos/resources/v1/stats/stats.py +102 -0
  14. {evermemos-0.3.6 → evermemos-0.3.8}/src/evermemos/resources/v1/v1.py +32 -0
  15. {evermemos-0.3.6 → evermemos-0.3.8}/src/evermemos/types/v1/__init__.py +3 -1
  16. evermemos-0.3.8/src/evermemos/types/v1/global_user_profile/__init__.py +3 -0
  17. {evermemos-0.3.6 → evermemos-0.3.8}/src/evermemos/types/v1/memories/conversation_meta_create_params.py +0 -3
  18. {evermemos-0.3.6 → evermemos-0.3.8}/src/evermemos/types/v1/memories/conversation_meta_create_response.py +0 -3
  19. {evermemos-0.3.6 → evermemos-0.3.8}/src/evermemos/types/v1/memories/conversation_meta_get_response.py +0 -3
  20. {evermemos-0.3.6 → evermemos-0.3.8}/src/evermemos/types/v1/memory_create_params.py +17 -2
  21. evermemos-0.3.8/src/evermemos/types/v1/memory_create_response.py +13 -0
  22. {evermemos-0.3.6 → evermemos-0.3.8}/src/evermemos/types/v1/memory_delete_params.py +3 -3
  23. evermemos-0.3.6/src/evermemos/types/v1/memory_list_response.py → evermemos-0.3.8/src/evermemos/types/v1/memory_get_response.py +88 -5
  24. evermemos-0.3.8/src/evermemos/types/v1/memory_load_params.py +83 -0
  25. evermemos-0.3.8/src/evermemos/types/v1/memory_load_response.py +26 -0
  26. evermemos-0.3.8/src/evermemos/types/v1/stats/__init__.py +6 -0
  27. evermemos-0.3.8/src/evermemos/types/v1/stats/request_get_params.py +13 -0
  28. evermemos-0.3.8/src/evermemos/types/v1/stats/request_get_response.py +26 -0
  29. {evermemos-0.3.6 → evermemos-0.3.8}/tests/api_resources/v1/memories/test_conversation_meta.py +68 -52
  30. evermemos-0.3.8/tests/api_resources/v1/stats/__init__.py +1 -0
  31. evermemos-0.3.8/tests/api_resources/v1/stats/test_request.py +92 -0
  32. {evermemos-0.3.6 → evermemos-0.3.8}/tests/api_resources/v1/test_memories.py +214 -73
  33. {evermemos-0.3.6 → evermemos-0.3.8}/tests/test_client.py +20 -20
  34. evermemos-0.3.6/.release-please-manifest.json +0 -3
  35. evermemos-0.3.6/src/evermemos/types/v1/memory_create_response.py +0 -39
  36. {evermemos-0.3.6 → evermemos-0.3.8}/.gitignore +0 -0
  37. {evermemos-0.3.6 → evermemos-0.3.8}/CONTRIBUTING.md +0 -0
  38. {evermemos-0.3.6 → evermemos-0.3.8}/LICENSE +0 -0
  39. {evermemos-0.3.6 → evermemos-0.3.8}/SECURITY.md +0 -0
  40. {evermemos-0.3.6 → evermemos-0.3.8}/bin/check-release-environment +0 -0
  41. {evermemos-0.3.6 → evermemos-0.3.8}/bin/publish-pypi +0 -0
  42. {evermemos-0.3.6 → evermemos-0.3.8}/examples/.keep +0 -0
  43. {evermemos-0.3.6 → evermemos-0.3.8}/release-please-config.json +0 -0
  44. {evermemos-0.3.6 → evermemos-0.3.8}/requirements-dev.lock +0 -0
  45. {evermemos-0.3.6 → evermemos-0.3.8}/src/EverMemOS/lib/.keep +0 -0
  46. {evermemos-0.3.6 → evermemos-0.3.8}/src/evermemos/__init__.py +0 -0
  47. {evermemos-0.3.6 → evermemos-0.3.8}/src/evermemos/_base_client.py +0 -0
  48. {evermemos-0.3.6 → evermemos-0.3.8}/src/evermemos/_client.py +0 -0
  49. {evermemos-0.3.6 → evermemos-0.3.8}/src/evermemos/_compat.py +0 -0
  50. {evermemos-0.3.6 → evermemos-0.3.8}/src/evermemos/_constants.py +0 -0
  51. {evermemos-0.3.6 → evermemos-0.3.8}/src/evermemos/_exceptions.py +0 -0
  52. {evermemos-0.3.6 → evermemos-0.3.8}/src/evermemos/_files.py +0 -0
  53. {evermemos-0.3.6 → evermemos-0.3.8}/src/evermemos/_models.py +0 -0
  54. {evermemos-0.3.6 → evermemos-0.3.8}/src/evermemos/_qs.py +0 -0
  55. {evermemos-0.3.6 → evermemos-0.3.8}/src/evermemos/_resource.py +0 -0
  56. {evermemos-0.3.6 → evermemos-0.3.8}/src/evermemos/_response.py +0 -0
  57. {evermemos-0.3.6 → evermemos-0.3.8}/src/evermemos/_streaming.py +0 -0
  58. {evermemos-0.3.6 → evermemos-0.3.8}/src/evermemos/_types.py +0 -0
  59. {evermemos-0.3.6 → evermemos-0.3.8}/src/evermemos/_utils/__init__.py +0 -0
  60. {evermemos-0.3.6 → evermemos-0.3.8}/src/evermemos/_utils/_compat.py +0 -0
  61. {evermemos-0.3.6 → evermemos-0.3.8}/src/evermemos/_utils/_datetime_parse.py +0 -0
  62. {evermemos-0.3.6 → evermemos-0.3.8}/src/evermemos/_utils/_logs.py +0 -0
  63. {evermemos-0.3.6 → evermemos-0.3.8}/src/evermemos/_utils/_proxy.py +0 -0
  64. {evermemos-0.3.6 → evermemos-0.3.8}/src/evermemos/_utils/_reflection.py +0 -0
  65. {evermemos-0.3.6 → evermemos-0.3.8}/src/evermemos/_utils/_resources_proxy.py +0 -0
  66. {evermemos-0.3.6 → evermemos-0.3.8}/src/evermemos/_utils/_streams.py +0 -0
  67. {evermemos-0.3.6 → evermemos-0.3.8}/src/evermemos/_utils/_sync.py +0 -0
  68. {evermemos-0.3.6 → evermemos-0.3.8}/src/evermemos/_utils/_transform.py +0 -0
  69. {evermemos-0.3.6 → evermemos-0.3.8}/src/evermemos/_utils/_typing.py +0 -0
  70. {evermemos-0.3.6 → evermemos-0.3.8}/src/evermemos/_utils/_utils.py +0 -0
  71. {evermemos-0.3.6 → evermemos-0.3.8}/src/evermemos/lib/.keep +0 -0
  72. {evermemos-0.3.6 → evermemos-0.3.8}/src/evermemos/py.typed +0 -0
  73. {evermemos-0.3.6 → evermemos-0.3.8}/src/evermemos/resources/__init__.py +0 -0
  74. {evermemos-0.3.6 → evermemos-0.3.8}/src/evermemos/resources/v1/memories/__init__.py +0 -0
  75. {evermemos-0.3.6 → evermemos-0.3.8}/src/evermemos/types/__init__.py +0 -0
  76. {evermemos-0.3.6 → evermemos-0.3.8}/src/evermemos/types/v1/memories/__init__.py +0 -0
  77. {evermemos-0.3.6 → evermemos-0.3.8}/src/evermemos/types/v1/memories/conversation_meta_update_params.py +0 -0
  78. {evermemos-0.3.6 → evermemos-0.3.8}/src/evermemos/types/v1/memories/conversation_meta_update_response.py +0 -0
  79. {evermemos-0.3.6 → evermemos-0.3.8}/src/evermemos/types/v1/memory_delete_response.py +0 -0
  80. {evermemos-0.3.6 → evermemos-0.3.8}/src/evermemos/types/v1/memory_search_response.py +0 -0
  81. {evermemos-0.3.6 → evermemos-0.3.8}/src/evermemos/types/v1/memory_type.py +0 -0
  82. {evermemos-0.3.6 → evermemos-0.3.8}/src/evermemos/types/v1/metadata.py +0 -0
  83. {evermemos-0.3.6 → evermemos-0.3.8}/tests/__init__.py +0 -0
  84. {evermemos-0.3.6 → evermemos-0.3.8}/tests/api_resources/__init__.py +0 -0
  85. {evermemos-0.3.6 → evermemos-0.3.8}/tests/api_resources/v1/__init__.py +0 -0
  86. {evermemos-0.3.6 → evermemos-0.3.8}/tests/api_resources/v1/memories/__init__.py +0 -0
  87. {evermemos-0.3.6 → evermemos-0.3.8}/tests/conftest.py +0 -0
  88. {evermemos-0.3.6 → evermemos-0.3.8}/tests/sample_file.txt +0 -0
  89. {evermemos-0.3.6 → evermemos-0.3.8}/tests/test_deepcopy.py +0 -0
  90. {evermemos-0.3.6 → evermemos-0.3.8}/tests/test_extract_files.py +0 -0
  91. {evermemos-0.3.6 → evermemos-0.3.8}/tests/test_files.py +0 -0
  92. {evermemos-0.3.6 → evermemos-0.3.8}/tests/test_models.py +0 -0
  93. {evermemos-0.3.6 → evermemos-0.3.8}/tests/test_qs.py +0 -0
  94. {evermemos-0.3.6 → evermemos-0.3.8}/tests/test_required_args.py +0 -0
  95. {evermemos-0.3.6 → evermemos-0.3.8}/tests/test_response.py +0 -0
  96. {evermemos-0.3.6 → evermemos-0.3.8}/tests/test_streaming.py +0 -0
  97. {evermemos-0.3.6 → evermemos-0.3.8}/tests/test_transform.py +0 -0
  98. {evermemos-0.3.6 → evermemos-0.3.8}/tests/test_utils/test_datetime_parse.py +0 -0
  99. {evermemos-0.3.6 → evermemos-0.3.8}/tests/test_utils/test_proxy.py +0 -0
  100. {evermemos-0.3.6 → evermemos-0.3.8}/tests/test_utils/test_typing.py +0 -0
  101. {evermemos-0.3.6 → evermemos-0.3.8}/tests/utils.py +0 -0
  102. {evermemos-0.3.6 → evermemos-0.3.8}/uv.lock +0 -0
@@ -0,0 +1,3 @@
1
+ {
2
+ ".": "0.3.8"
3
+ }
@@ -1,5 +1,34 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.3.8 (2026-01-28)
4
+
5
+ Full Changelog: [v0.3.7...v0.3.8](https://github.com/evermemos/evermemos-python/compare/v0.3.7...v0.3.8)
6
+
7
+ ### Features
8
+
9
+ * **api:** api update ([e2cc79c](https://github.com/evermemos/evermemos-python/commit/e2cc79c7b19cd8da12385d59bd6fcb7e83be6c84))
10
+
11
+
12
+ ### Chores
13
+
14
+ * update SDK settings ([c6d796d](https://github.com/evermemos/evermemos-python/commit/c6d796d7bbbec539954c1802094932a919d0b8e5))
15
+ * update SDK settings ([11a1c09](https://github.com/evermemos/evermemos-python/commit/11a1c09da854becb6567ad5428db716e38e81ee0))
16
+
17
+ ## 0.3.7 (2026-01-27)
18
+
19
+ Full Changelog: [v0.3.6...v0.3.7](https://github.com/evermemos/evermemos-python/compare/v0.3.6...v0.3.7)
20
+
21
+ ### Features
22
+
23
+ * **api:** api update ([b5a5ad3](https://github.com/evermemos/evermemos-python/commit/b5a5ad30160d7b74918456a269d2be73feb173ba))
24
+ * **api:** api update ([ff8658d](https://github.com/evermemos/evermemos-python/commit/ff8658dbfa447af49ad0bf42ddf3a7bf84c5af08))
25
+
26
+
27
+ ### Chores
28
+
29
+ * update SDK settings ([7846bc7](https://github.com/evermemos/evermemos-python/commit/7846bc750ca4ab190a39feeb9dfd096854618cb1))
30
+ * update SDK settings ([fa846b9](https://github.com/evermemos/evermemos-python/commit/fa846b9647c78fbd9b072b6d397b8c74bbdfa2d4))
31
+
3
32
  ## 0.3.6 (2026-01-26)
4
33
 
5
34
  Full Changelog: [v0.3.6...v0.3.6](https://github.com/evermemos/evermemos-python/compare/v0.3.6...v0.3.6)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: evermemos
3
- Version: 0.3.6
3
+ Version: 0.3.8
4
4
  Summary: The official Python library for the EverMemOS API
5
5
  Project-URL: Homepage, https://github.com/evermemos/evermemos-python
6
6
  Project-URL: Repository, https://github.com/evermemos/evermemos-python
@@ -68,12 +68,12 @@ client = EverMemOS(
68
68
  )
69
69
 
70
70
  memory = client.v1.memories.create(
71
- content="I prefer morning meetings, usually around 9am works best for me.",
71
+ content="Let's discuss the technical solution for the new feature today",
72
72
  create_time="2025-01-15T10:00:00+00:00",
73
73
  message_id="msg_001",
74
- sender="user_alice",
74
+ sender="user_001",
75
75
  )
76
- print(memory.message)
76
+ print(memory.request_id)
77
77
  ```
78
78
 
79
79
  While you can provide an `api_key` keyword argument,
@@ -97,12 +97,12 @@ client = AsyncEverMemOS(
97
97
 
98
98
  async def main() -> None:
99
99
  memory = await client.v1.memories.create(
100
- content="I prefer morning meetings, usually around 9am works best for me.",
100
+ content="Let's discuss the technical solution for the new feature today",
101
101
  create_time="2025-01-15T10:00:00+00:00",
102
102
  message_id="msg_001",
103
- sender="user_alice",
103
+ sender="user_001",
104
104
  )
105
- print(memory.message)
105
+ print(memory.request_id)
106
106
 
107
107
 
108
108
  asyncio.run(main())
@@ -136,12 +136,12 @@ async def main() -> None:
136
136
  http_client=DefaultAioHttpClient(),
137
137
  ) as client:
138
138
  memory = await client.v1.memories.create(
139
- content="I prefer morning meetings, usually around 9am works best for me.",
139
+ content="Let's discuss the technical solution for the new feature today",
140
140
  create_time="2025-01-15T10:00:00+00:00",
141
141
  message_id="msg_001",
142
- sender="user_alice",
142
+ sender="user_001",
143
143
  )
144
- print(memory.message)
144
+ print(memory.request_id)
145
145
 
146
146
 
147
147
  asyncio.run(main())
@@ -156,6 +156,34 @@ Nested request parameters are [TypedDicts](https://docs.python.org/3/library/typ
156
156
 
157
157
  Typed requests and responses provide autocomplete and documentation within your editor. If you would like to see type errors in VS Code to help catch bugs earlier, set `python.analysis.typeCheckingMode` to `basic`.
158
158
 
159
+ ## Nested params
160
+
161
+ Nested parameters are dictionaries, typed using `TypedDict`, for example:
162
+
163
+ ```python
164
+ from evermemos import EverMemOS
165
+
166
+ client = EverMemOS()
167
+
168
+ response = client.v1.memories.load(
169
+ conversation_meta={
170
+ "group_id": "chat_user_001_assistant",
171
+ "created_at": "2025-06-26T00:00:00Z",
172
+ "default_timezone": "UTC",
173
+ "description": "Conversation between user and assistant",
174
+ "name": "User Support Chat",
175
+ "scene": "assistant",
176
+ "scene_desc": {"description": "bar"},
177
+ "tags": ["support"],
178
+ "user_details": {
179
+ "user_001": "bar",
180
+ "robot_001": "bar",
181
+ },
182
+ },
183
+ )
184
+ print(response.conversation_meta)
185
+ ```
186
+
159
187
  ## Handling errors
160
188
 
161
189
  When the library is unable to connect to the API (for example, due to network connection problems or a timeout), a subclass of `evermemos.APIConnectionError` is raised.
@@ -173,10 +201,10 @@ client = EverMemOS()
173
201
 
174
202
  try:
175
203
  client.v1.memories.create(
176
- content="I prefer morning meetings, usually around 9am works best for me.",
204
+ content="Let's discuss the technical solution for the new feature today",
177
205
  create_time="2025-01-15T10:00:00+00:00",
178
206
  message_id="msg_001",
179
- sender="user_alice",
207
+ sender="user_001",
180
208
  )
181
209
  except evermemos.APIConnectionError as e:
182
210
  print("The server could not be reached")
@@ -221,10 +249,10 @@ client = EverMemOS(
221
249
 
222
250
  # Or, configure per-request:
223
251
  client.with_options(max_retries=5).v1.memories.create(
224
- content="I prefer morning meetings, usually around 9am works best for me.",
252
+ content="Let's discuss the technical solution for the new feature today",
225
253
  create_time="2025-01-15T10:00:00+00:00",
226
254
  message_id="msg_001",
227
- sender="user_alice",
255
+ sender="user_001",
228
256
  )
229
257
  ```
230
258
 
@@ -249,10 +277,10 @@ client = EverMemOS(
249
277
 
250
278
  # Override per-request:
251
279
  client.with_options(timeout=5.0).v1.memories.create(
252
- content="I prefer morning meetings, usually around 9am works best for me.",
280
+ content="Let's discuss the technical solution for the new feature today",
253
281
  create_time="2025-01-15T10:00:00+00:00",
254
282
  message_id="msg_001",
255
- sender="user_alice",
283
+ sender="user_001",
256
284
  )
257
285
  ```
258
286
 
@@ -295,15 +323,15 @@ from evermemos import EverMemOS
295
323
 
296
324
  client = EverMemOS()
297
325
  response = client.v1.memories.with_raw_response.create(
298
- content="I prefer morning meetings, usually around 9am works best for me.",
326
+ content="Let's discuss the technical solution for the new feature today",
299
327
  create_time="2025-01-15T10:00:00+00:00",
300
328
  message_id="msg_001",
301
- sender="user_alice",
329
+ sender="user_001",
302
330
  )
303
331
  print(response.headers.get('X-My-Header'))
304
332
 
305
333
  memory = response.parse() # get the object that `v1.memories.create()` would have returned
306
- print(memory.message)
334
+ print(memory.request_id)
307
335
  ```
308
336
 
309
337
  These methods return an [`APIResponse`](https://github.com/evermemos/evermemos-python/tree/main/src/evermemos/_response.py) object.
@@ -318,10 +346,10 @@ To stream the response body, use `.with_streaming_response` instead, which requi
318
346
 
319
347
  ```python
320
348
  with client.v1.memories.with_streaming_response.create(
321
- content="I prefer morning meetings, usually around 9am works best for me.",
349
+ content="Let's discuss the technical solution for the new feature today",
322
350
  create_time="2025-01-15T10:00:00+00:00",
323
351
  message_id="msg_001",
324
- sender="user_alice",
352
+ sender="user_001",
325
353
  ) as response:
326
354
  print(response.headers.get("X-My-Header"))
327
355
 
@@ -33,12 +33,12 @@ client = EverMemOS(
33
33
  )
34
34
 
35
35
  memory = client.v1.memories.create(
36
- content="I prefer morning meetings, usually around 9am works best for me.",
36
+ content="Let's discuss the technical solution for the new feature today",
37
37
  create_time="2025-01-15T10:00:00+00:00",
38
38
  message_id="msg_001",
39
- sender="user_alice",
39
+ sender="user_001",
40
40
  )
41
- print(memory.message)
41
+ print(memory.request_id)
42
42
  ```
43
43
 
44
44
  While you can provide an `api_key` keyword argument,
@@ -62,12 +62,12 @@ client = AsyncEverMemOS(
62
62
 
63
63
  async def main() -> None:
64
64
  memory = await client.v1.memories.create(
65
- content="I prefer morning meetings, usually around 9am works best for me.",
65
+ content="Let's discuss the technical solution for the new feature today",
66
66
  create_time="2025-01-15T10:00:00+00:00",
67
67
  message_id="msg_001",
68
- sender="user_alice",
68
+ sender="user_001",
69
69
  )
70
- print(memory.message)
70
+ print(memory.request_id)
71
71
 
72
72
 
73
73
  asyncio.run(main())
@@ -101,12 +101,12 @@ async def main() -> None:
101
101
  http_client=DefaultAioHttpClient(),
102
102
  ) as client:
103
103
  memory = await client.v1.memories.create(
104
- content="I prefer morning meetings, usually around 9am works best for me.",
104
+ content="Let's discuss the technical solution for the new feature today",
105
105
  create_time="2025-01-15T10:00:00+00:00",
106
106
  message_id="msg_001",
107
- sender="user_alice",
107
+ sender="user_001",
108
108
  )
109
- print(memory.message)
109
+ print(memory.request_id)
110
110
 
111
111
 
112
112
  asyncio.run(main())
@@ -121,6 +121,34 @@ Nested request parameters are [TypedDicts](https://docs.python.org/3/library/typ
121
121
 
122
122
  Typed requests and responses provide autocomplete and documentation within your editor. If you would like to see type errors in VS Code to help catch bugs earlier, set `python.analysis.typeCheckingMode` to `basic`.
123
123
 
124
+ ## Nested params
125
+
126
+ Nested parameters are dictionaries, typed using `TypedDict`, for example:
127
+
128
+ ```python
129
+ from evermemos import EverMemOS
130
+
131
+ client = EverMemOS()
132
+
133
+ response = client.v1.memories.load(
134
+ conversation_meta={
135
+ "group_id": "chat_user_001_assistant",
136
+ "created_at": "2025-06-26T00:00:00Z",
137
+ "default_timezone": "UTC",
138
+ "description": "Conversation between user and assistant",
139
+ "name": "User Support Chat",
140
+ "scene": "assistant",
141
+ "scene_desc": {"description": "bar"},
142
+ "tags": ["support"],
143
+ "user_details": {
144
+ "user_001": "bar",
145
+ "robot_001": "bar",
146
+ },
147
+ },
148
+ )
149
+ print(response.conversation_meta)
150
+ ```
151
+
124
152
  ## Handling errors
125
153
 
126
154
  When the library is unable to connect to the API (for example, due to network connection problems or a timeout), a subclass of `evermemos.APIConnectionError` is raised.
@@ -138,10 +166,10 @@ client = EverMemOS()
138
166
 
139
167
  try:
140
168
  client.v1.memories.create(
141
- content="I prefer morning meetings, usually around 9am works best for me.",
169
+ content="Let's discuss the technical solution for the new feature today",
142
170
  create_time="2025-01-15T10:00:00+00:00",
143
171
  message_id="msg_001",
144
- sender="user_alice",
172
+ sender="user_001",
145
173
  )
146
174
  except evermemos.APIConnectionError as e:
147
175
  print("The server could not be reached")
@@ -186,10 +214,10 @@ client = EverMemOS(
186
214
 
187
215
  # Or, configure per-request:
188
216
  client.with_options(max_retries=5).v1.memories.create(
189
- content="I prefer morning meetings, usually around 9am works best for me.",
217
+ content="Let's discuss the technical solution for the new feature today",
190
218
  create_time="2025-01-15T10:00:00+00:00",
191
219
  message_id="msg_001",
192
- sender="user_alice",
220
+ sender="user_001",
193
221
  )
194
222
  ```
195
223
 
@@ -214,10 +242,10 @@ client = EverMemOS(
214
242
 
215
243
  # Override per-request:
216
244
  client.with_options(timeout=5.0).v1.memories.create(
217
- content="I prefer morning meetings, usually around 9am works best for me.",
245
+ content="Let's discuss the technical solution for the new feature today",
218
246
  create_time="2025-01-15T10:00:00+00:00",
219
247
  message_id="msg_001",
220
- sender="user_alice",
248
+ sender="user_001",
221
249
  )
222
250
  ```
223
251
 
@@ -260,15 +288,15 @@ from evermemos import EverMemOS
260
288
 
261
289
  client = EverMemOS()
262
290
  response = client.v1.memories.with_raw_response.create(
263
- content="I prefer morning meetings, usually around 9am works best for me.",
291
+ content="Let's discuss the technical solution for the new feature today",
264
292
  create_time="2025-01-15T10:00:00+00:00",
265
293
  message_id="msg_001",
266
- sender="user_alice",
294
+ sender="user_001",
267
295
  )
268
296
  print(response.headers.get('X-My-Header'))
269
297
 
270
298
  memory = response.parse() # get the object that `v1.memories.create()` would have returned
271
- print(memory.message)
299
+ print(memory.request_id)
272
300
  ```
273
301
 
274
302
  These methods return an [`APIResponse`](https://github.com/evermemos/evermemos-python/tree/main/src/evermemos/_response.py) object.
@@ -283,10 +311,10 @@ To stream the response body, use `.with_streaming_response` instead, which requi
283
311
 
284
312
  ```python
285
313
  with client.v1.memories.with_streaming_response.create(
286
- content="I prefer morning meetings, usually around 9am works best for me.",
314
+ content="Let's discuss the technical solution for the new feature today",
287
315
  create_time="2025-01-15T10:00:00+00:00",
288
316
  message_id="msg_001",
289
- sender="user_alice",
317
+ sender="user_001",
290
318
  ) as response:
291
319
  print(response.headers.get("X-My-Header"))
292
320
 
@@ -9,8 +9,9 @@ from evermemos.types.v1 import (
9
9
  MemoryType,
10
10
  Metadata,
11
11
  MemoryCreateResponse,
12
- MemoryListResponse,
13
12
  MemoryDeleteResponse,
13
+ MemoryGetResponse,
14
+ MemoryLoadResponse,
14
15
  MemorySearchResponse,
15
16
  )
16
17
  ```
@@ -18,8 +19,9 @@ from evermemos.types.v1 import (
18
19
  Methods:
19
20
 
20
21
  - <code title="post /api/v1/memories">client.v1.memories.<a href="./src/evermemos/resources/v1/memories/memories.py">create</a>(\*\*<a href="src/evermemos/types/v1/memory_create_params.py">params</a>) -> <a href="./src/evermemos/types/v1/memory_create_response.py">MemoryCreateResponse</a></code>
21
- - <code title="get /api/v1/memories">client.v1.memories.<a href="./src/evermemos/resources/v1/memories/memories.py">list</a>() -> <a href="./src/evermemos/types/v1/memory_list_response.py">MemoryListResponse</a></code>
22
22
  - <code title="delete /api/v1/memories">client.v1.memories.<a href="./src/evermemos/resources/v1/memories/memories.py">delete</a>(\*\*<a href="src/evermemos/types/v1/memory_delete_params.py">params</a>) -> <a href="./src/evermemos/types/v1/memory_delete_response.py">MemoryDeleteResponse</a></code>
23
+ - <code title="get /api/v1/memories">client.v1.memories.<a href="./src/evermemos/resources/v1/memories/memories.py">get</a>() -> <a href="./src/evermemos/types/v1/memory_get_response.py">MemoryGetResponse</a></code>
24
+ - <code title="post /api/v1/memories/import">client.v1.memories.<a href="./src/evermemos/resources/v1/memories/memories.py">load</a>(\*\*<a href="src/evermemos/types/v1/memory_load_params.py">params</a>) -> <a href="./src/evermemos/types/v1/memory_load_response.py">MemoryLoadResponse</a></code>
23
25
  - <code title="get /api/v1/memories/search">client.v1.memories.<a href="./src/evermemos/resources/v1/memories/memories.py">search</a>() -> <a href="./src/evermemos/types/v1/memory_search_response.py">MemorySearchResponse</a></code>
24
26
 
25
27
  ### ConversationMeta
@@ -39,3 +41,17 @@ Methods:
39
41
  - <code title="post /api/v1/memories/conversation-meta">client.v1.memories.conversation_meta.<a href="./src/evermemos/resources/v1/memories/conversation_meta.py">create</a>(\*\*<a href="src/evermemos/types/v1/memories/conversation_meta_create_params.py">params</a>) -> <a href="./src/evermemos/types/v1/memories/conversation_meta_create_response.py">ConversationMetaCreateResponse</a></code>
40
42
  - <code title="patch /api/v1/memories/conversation-meta">client.v1.memories.conversation_meta.<a href="./src/evermemos/resources/v1/memories/conversation_meta.py">update</a>(\*\*<a href="src/evermemos/types/v1/memories/conversation_meta_update_params.py">params</a>) -> <a href="./src/evermemos/types/v1/memories/conversation_meta_update_response.py">ConversationMetaUpdateResponse</a></code>
41
43
  - <code title="get /api/v1/memories/conversation-meta">client.v1.memories.conversation_meta.<a href="./src/evermemos/resources/v1/memories/conversation_meta.py">get</a>() -> <a href="./src/evermemos/types/v1/memories/conversation_meta_get_response.py">ConversationMetaGetResponse</a></code>
44
+
45
+ ## Stats
46
+
47
+ ### Request
48
+
49
+ Types:
50
+
51
+ ```python
52
+ from evermemos.types.v1.stats import RequestGetResponse
53
+ ```
54
+
55
+ Methods:
56
+
57
+ - <code title="get /api/v1/stats/request">client.v1.stats.request.<a href="./src/evermemos/resources/v1/stats/request.py">get</a>(\*\*<a href="src/evermemos/types/v1/stats/request_get_params.py">params</a>) -> <a href="./src/evermemos/types/v1/stats/request_get_response.py">RequestGetResponse</a></code>
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "evermemos"
3
- version = "0.3.6"
3
+ version = "0.3.8"
4
4
  description = "The official Python library for the EverMemOS API"
5
5
  dynamic = ["readme"]
6
6
  license = "Apache-2.0"
@@ -1,4 +1,4 @@
1
1
  # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
2
2
 
3
3
  __title__ = "evermemos"
4
- __version__ = "0.3.6" # x-release-please-version
4
+ __version__ = "0.3.8" # x-release-please-version
@@ -8,6 +8,14 @@ from .v1 import (
8
8
  V1ResourceWithStreamingResponse,
9
9
  AsyncV1ResourceWithStreamingResponse,
10
10
  )
11
+ from .stats import (
12
+ StatsResource,
13
+ AsyncStatsResource,
14
+ StatsResourceWithRawResponse,
15
+ AsyncStatsResourceWithRawResponse,
16
+ StatsResourceWithStreamingResponse,
17
+ AsyncStatsResourceWithStreamingResponse,
18
+ )
11
19
  from .memories import (
12
20
  MemoriesResource,
13
21
  AsyncMemoriesResource,
@@ -24,6 +32,12 @@ __all__ = [
24
32
  "AsyncMemoriesResourceWithRawResponse",
25
33
  "MemoriesResourceWithStreamingResponse",
26
34
  "AsyncMemoriesResourceWithStreamingResponse",
35
+ "StatsResource",
36
+ "AsyncStatsResource",
37
+ "StatsResourceWithRawResponse",
38
+ "AsyncStatsResourceWithRawResponse",
39
+ "StatsResourceWithStreamingResponse",
40
+ "AsyncStatsResourceWithStreamingResponse",
27
41
  "V1Resource",
28
42
  "AsyncV1Resource",
29
43
  "V1ResourceWithRawResponse",
@@ -52,7 +52,6 @@ class ConversationMetaResource(SyncAPIResource):
52
52
  name: str,
53
53
  scene: str,
54
54
  scene_desc: Dict[str, object],
55
- version: str,
56
55
  default_timezone: Optional[str] | Omit = omit,
57
56
  description: Optional[str] | Omit = omit,
58
57
  group_id: Optional[str] | Omit = omit,
@@ -69,19 +68,6 @@ class ConversationMetaResource(SyncAPIResource):
69
68
  Save conversation metadata information, including scene, participants, tags,
70
69
  etc.
71
70
 
72
- ## Functionality:
73
- - If group_id exists, update the entire record (upsert)
74
- - If group_id does not exist, create a new record
75
- - If group_id is omitted, save as default config for the scene
76
- - All fields must be provided with complete data
77
-
78
- ## Default Config:
79
- - Default config is used as fallback when specific group_id config not found
80
-
81
- ## Notes:
82
- - This is a full update interface that will replace the entire record
83
- - If you only need to update partial fields, use the PATCH /conversation-meta interface
84
-
85
71
  Args:
86
72
  created_at: Conversation creation time (ISO 8601 format)
87
73
 
@@ -97,8 +83,6 @@ class ConversationMetaResource(SyncAPIResource):
97
83
 
98
84
  scene_desc: Scene description object, can include fields like description
99
85
 
100
- version: Metadata version number
101
-
102
86
  default_timezone: Default timezone
103
87
 
104
88
  description: Conversation description
@@ -126,7 +110,6 @@ class ConversationMetaResource(SyncAPIResource):
126
110
  "name": name,
127
111
  "scene": scene,
128
112
  "scene_desc": scene_desc,
129
- "version": version,
130
113
  "default_timezone": default_timezone,
131
114
  "description": description,
132
115
  "group_id": group_id,
@@ -161,12 +144,6 @@ class ConversationMetaResource(SyncAPIResource):
161
144
  """
162
145
  Partially update conversation metadata, only updating provided fields
163
146
 
164
- ## Functionality:
165
- - Locate the conversation metadata to update by group_id
166
- - When group_id is null or not provided, updates the default config
167
- - Only update fields provided in the request, keep unchanged fields as-is
168
- - Suitable for scenarios requiring modification of partial information
169
-
170
147
  Args:
171
148
  default_timezone: New default timezone
172
149
 
@@ -220,22 +197,7 @@ class ConversationMetaResource(SyncAPIResource):
220
197
  extra_body: Body | None = None,
221
198
  timeout: float | httpx.Timeout | None | NotGiven = not_given,
222
199
  ) -> ConversationMetaGetResponse:
223
- """
224
- Retrieve conversation metadata by group_id with fallback to default config
225
-
226
- ## Functionality:
227
- - Query by group_id to get conversation metadata
228
- - If group_id not found, fallback to default config
229
- - If group_id not provided, returns default config
230
-
231
- ## Fallback Logic:
232
- - Try exact group_id first, then use default config
233
-
234
- ## Use Cases:
235
- - Get specific group's metadata
236
- - Get default settings (group_id not provided or null)
237
- - Auto-fallback to defaults when group config not set
238
- """
200
+ """Retrieve conversation metadata by group_id with fallback to default config"""
239
201
  return self._get(
240
202
  "/api/v1/memories/conversation-meta",
241
203
  options=make_request_options(
@@ -272,7 +234,6 @@ class AsyncConversationMetaResource(AsyncAPIResource):
272
234
  name: str,
273
235
  scene: str,
274
236
  scene_desc: Dict[str, object],
275
- version: str,
276
237
  default_timezone: Optional[str] | Omit = omit,
277
238
  description: Optional[str] | Omit = omit,
278
239
  group_id: Optional[str] | Omit = omit,
@@ -289,19 +250,6 @@ class AsyncConversationMetaResource(AsyncAPIResource):
289
250
  Save conversation metadata information, including scene, participants, tags,
290
251
  etc.
291
252
 
292
- ## Functionality:
293
- - If group_id exists, update the entire record (upsert)
294
- - If group_id does not exist, create a new record
295
- - If group_id is omitted, save as default config for the scene
296
- - All fields must be provided with complete data
297
-
298
- ## Default Config:
299
- - Default config is used as fallback when specific group_id config not found
300
-
301
- ## Notes:
302
- - This is a full update interface that will replace the entire record
303
- - If you only need to update partial fields, use the PATCH /conversation-meta interface
304
-
305
253
  Args:
306
254
  created_at: Conversation creation time (ISO 8601 format)
307
255
 
@@ -317,8 +265,6 @@ class AsyncConversationMetaResource(AsyncAPIResource):
317
265
 
318
266
  scene_desc: Scene description object, can include fields like description
319
267
 
320
- version: Metadata version number
321
-
322
268
  default_timezone: Default timezone
323
269
 
324
270
  description: Conversation description
@@ -346,7 +292,6 @@ class AsyncConversationMetaResource(AsyncAPIResource):
346
292
  "name": name,
347
293
  "scene": scene,
348
294
  "scene_desc": scene_desc,
349
- "version": version,
350
295
  "default_timezone": default_timezone,
351
296
  "description": description,
352
297
  "group_id": group_id,
@@ -381,12 +326,6 @@ class AsyncConversationMetaResource(AsyncAPIResource):
381
326
  """
382
327
  Partially update conversation metadata, only updating provided fields
383
328
 
384
- ## Functionality:
385
- - Locate the conversation metadata to update by group_id
386
- - When group_id is null or not provided, updates the default config
387
- - Only update fields provided in the request, keep unchanged fields as-is
388
- - Suitable for scenarios requiring modification of partial information
389
-
390
329
  Args:
391
330
  default_timezone: New default timezone
392
331
 
@@ -440,22 +379,7 @@ class AsyncConversationMetaResource(AsyncAPIResource):
440
379
  extra_body: Body | None = None,
441
380
  timeout: float | httpx.Timeout | None | NotGiven = not_given,
442
381
  ) -> ConversationMetaGetResponse:
443
- """
444
- Retrieve conversation metadata by group_id with fallback to default config
445
-
446
- ## Functionality:
447
- - Query by group_id to get conversation metadata
448
- - If group_id not found, fallback to default config
449
- - If group_id not provided, returns default config
450
-
451
- ## Fallback Logic:
452
- - Try exact group_id first, then use default config
453
-
454
- ## Use Cases:
455
- - Get specific group's metadata
456
- - Get default settings (group_id not provided or null)
457
- - Auto-fallback to defaults when group config not set
458
- """
382
+ """Retrieve conversation metadata by group_id with fallback to default config"""
459
383
  return await self._get(
460
384
  "/api/v1/memories/conversation-meta",
461
385
  options=make_request_options(