evermemos 0.3.8__tar.gz → 0.3.10__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 (108) hide show
  1. evermemos-0.3.10/.release-please-manifest.json +3 -0
  2. {evermemos-0.3.8 → evermemos-0.3.10}/CHANGELOG.md +30 -0
  3. {evermemos-0.3.8 → evermemos-0.3.10}/PKG-INFO +24 -27
  4. {evermemos-0.3.8 → evermemos-0.3.10}/README.md +23 -26
  5. {evermemos-0.3.8 → evermemos-0.3.10}/api.md +5 -7
  6. {evermemos-0.3.8 → evermemos-0.3.10}/bin/check-release-environment +0 -4
  7. evermemos-0.3.10/bin/publish-pypi +11 -0
  8. {evermemos-0.3.8 → evermemos-0.3.10}/pyproject.toml +1 -1
  9. {evermemos-0.3.8 → evermemos-0.3.10}/src/evermemos/_base_client.py +5 -2
  10. {evermemos-0.3.8 → evermemos-0.3.10}/src/evermemos/_compat.py +3 -3
  11. evermemos-0.3.10/src/evermemos/_utils/_json.py +35 -0
  12. {evermemos-0.3.8 → evermemos-0.3.10}/src/evermemos/_version.py +1 -1
  13. {evermemos-0.3.8 → evermemos-0.3.10}/src/evermemos/resources/v1/__init__.py +13 -13
  14. {evermemos-0.3.8 → evermemos-0.3.10}/src/evermemos/resources/v1/memories/conversation_meta.py +82 -40
  15. {evermemos-0.3.8 → evermemos-0.3.10}/src/evermemos/resources/v1/memories/memories.py +133 -228
  16. {evermemos-0.3.8/src/evermemos/resources/v1/stats → evermemos-0.3.10/src/evermemos/resources/v1/status}/__init__.py +13 -13
  17. {evermemos-0.3.8/src/evermemos/resources/v1/stats → evermemos-0.3.10/src/evermemos/resources/v1/status}/request.py +6 -6
  18. evermemos-0.3.8/src/evermemos/resources/v1/stats/stats.py → evermemos-0.3.10/src/evermemos/resources/v1/status/status.py +27 -27
  19. {evermemos-0.3.8 → evermemos-0.3.10}/src/evermemos/resources/v1/v1.py +19 -19
  20. {evermemos-0.3.8 → evermemos-0.3.10}/src/evermemos/types/v1/__init__.py +2 -4
  21. evermemos-0.3.10/src/evermemos/types/v1/memories/conversation_meta_create_params.py +144 -0
  22. evermemos-0.3.10/src/evermemos/types/v1/memories/conversation_meta_create_response.py +109 -0
  23. evermemos-0.3.10/src/evermemos/types/v1/memories/conversation_meta_get_response.py +109 -0
  24. evermemos-0.3.10/src/evermemos/types/v1/memories/conversation_meta_update_params.py +117 -0
  25. {evermemos-0.3.8 → evermemos-0.3.10}/src/evermemos/types/v1/memories/conversation_meta_update_response.py +0 -5
  26. evermemos-0.3.8/src/evermemos/types/v1/memory_create_params.py → evermemos-0.3.10/src/evermemos/types/v1/memory_add_params.py +2 -2
  27. evermemos-0.3.8/src/evermemos/types/v1/memory_create_response.py → evermemos-0.3.10/src/evermemos/types/v1/memory_add_response.py +2 -2
  28. {evermemos-0.3.8 → evermemos-0.3.10}/src/evermemos/types/v1/memory_delete_params.py +6 -0
  29. {evermemos-0.3.8 → evermemos-0.3.10}/src/evermemos/types/v1/memory_delete_response.py +0 -5
  30. {evermemos-0.3.8 → evermemos-0.3.10}/src/evermemos/types/v1/memory_get_response.py +7 -10
  31. {evermemos-0.3.8 → evermemos-0.3.10}/src/evermemos/types/v1/memory_search_response.py +5 -18
  32. {evermemos-0.3.8/src/evermemos/types/v1/stats → evermemos-0.3.10/src/evermemos/types/v1/status}/request_get_params.py +1 -1
  33. {evermemos-0.3.8/src/evermemos/types/v1/stats → evermemos-0.3.10/src/evermemos/types/v1/status}/request_get_response.py +0 -5
  34. {evermemos-0.3.8 → evermemos-0.3.10}/tests/api_resources/v1/memories/test_conversation_meta.py +84 -44
  35. {evermemos-0.3.8/tests/api_resources/v1/stats → evermemos-0.3.10/tests/api_resources/v1/status}/test_request.py +7 -7
  36. {evermemos-0.3.8 → evermemos-0.3.10}/tests/api_resources/v1/test_memories.py +103 -238
  37. {evermemos-0.3.8 → evermemos-0.3.10}/tests/test_client.py +10 -10
  38. evermemos-0.3.10/tests/test_utils/test_json.py +126 -0
  39. evermemos-0.3.8/.release-please-manifest.json +0 -3
  40. evermemos-0.3.8/bin/publish-pypi +0 -7
  41. evermemos-0.3.8/src/evermemos/types/v1/global_user_profile/__init__.py +0 -3
  42. evermemos-0.3.8/src/evermemos/types/v1/memories/conversation_meta_create_params.py +0 -73
  43. evermemos-0.3.8/src/evermemos/types/v1/memories/conversation_meta_create_response.py +0 -66
  44. evermemos-0.3.8/src/evermemos/types/v1/memories/conversation_meta_get_response.py +0 -66
  45. evermemos-0.3.8/src/evermemos/types/v1/memories/conversation_meta_update_params.py +0 -58
  46. evermemos-0.3.8/src/evermemos/types/v1/memory_load_params.py +0 -83
  47. evermemos-0.3.8/src/evermemos/types/v1/memory_load_response.py +0 -26
  48. {evermemos-0.3.8 → evermemos-0.3.10}/.gitignore +0 -0
  49. {evermemos-0.3.8 → evermemos-0.3.10}/CONTRIBUTING.md +0 -0
  50. {evermemos-0.3.8 → evermemos-0.3.10}/LICENSE +0 -0
  51. {evermemos-0.3.8 → evermemos-0.3.10}/SECURITY.md +0 -0
  52. {evermemos-0.3.8 → evermemos-0.3.10}/examples/.keep +0 -0
  53. {evermemos-0.3.8 → evermemos-0.3.10}/release-please-config.json +0 -0
  54. {evermemos-0.3.8 → evermemos-0.3.10}/requirements-dev.lock +0 -0
  55. {evermemos-0.3.8 → evermemos-0.3.10}/src/EverMemOS/lib/.keep +0 -0
  56. {evermemos-0.3.8 → evermemos-0.3.10}/src/evermemos/__init__.py +0 -0
  57. {evermemos-0.3.8 → evermemos-0.3.10}/src/evermemos/_client.py +0 -0
  58. {evermemos-0.3.8 → evermemos-0.3.10}/src/evermemos/_constants.py +0 -0
  59. {evermemos-0.3.8 → evermemos-0.3.10}/src/evermemos/_exceptions.py +0 -0
  60. {evermemos-0.3.8 → evermemos-0.3.10}/src/evermemos/_files.py +0 -0
  61. {evermemos-0.3.8 → evermemos-0.3.10}/src/evermemos/_models.py +0 -0
  62. {evermemos-0.3.8 → evermemos-0.3.10}/src/evermemos/_qs.py +0 -0
  63. {evermemos-0.3.8 → evermemos-0.3.10}/src/evermemos/_resource.py +0 -0
  64. {evermemos-0.3.8 → evermemos-0.3.10}/src/evermemos/_response.py +0 -0
  65. {evermemos-0.3.8 → evermemos-0.3.10}/src/evermemos/_streaming.py +0 -0
  66. {evermemos-0.3.8 → evermemos-0.3.10}/src/evermemos/_types.py +0 -0
  67. {evermemos-0.3.8 → evermemos-0.3.10}/src/evermemos/_utils/__init__.py +0 -0
  68. {evermemos-0.3.8 → evermemos-0.3.10}/src/evermemos/_utils/_compat.py +0 -0
  69. {evermemos-0.3.8 → evermemos-0.3.10}/src/evermemos/_utils/_datetime_parse.py +0 -0
  70. {evermemos-0.3.8 → evermemos-0.3.10}/src/evermemos/_utils/_logs.py +0 -0
  71. {evermemos-0.3.8 → evermemos-0.3.10}/src/evermemos/_utils/_proxy.py +0 -0
  72. {evermemos-0.3.8 → evermemos-0.3.10}/src/evermemos/_utils/_reflection.py +0 -0
  73. {evermemos-0.3.8 → evermemos-0.3.10}/src/evermemos/_utils/_resources_proxy.py +0 -0
  74. {evermemos-0.3.8 → evermemos-0.3.10}/src/evermemos/_utils/_streams.py +0 -0
  75. {evermemos-0.3.8 → evermemos-0.3.10}/src/evermemos/_utils/_sync.py +0 -0
  76. {evermemos-0.3.8 → evermemos-0.3.10}/src/evermemos/_utils/_transform.py +0 -0
  77. {evermemos-0.3.8 → evermemos-0.3.10}/src/evermemos/_utils/_typing.py +0 -0
  78. {evermemos-0.3.8 → evermemos-0.3.10}/src/evermemos/_utils/_utils.py +0 -0
  79. {evermemos-0.3.8 → evermemos-0.3.10}/src/evermemos/lib/.keep +0 -0
  80. {evermemos-0.3.8 → evermemos-0.3.10}/src/evermemos/py.typed +0 -0
  81. {evermemos-0.3.8 → evermemos-0.3.10}/src/evermemos/resources/__init__.py +0 -0
  82. {evermemos-0.3.8 → evermemos-0.3.10}/src/evermemos/resources/v1/memories/__init__.py +0 -0
  83. {evermemos-0.3.8 → evermemos-0.3.10}/src/evermemos/types/__init__.py +0 -0
  84. {evermemos-0.3.8 → evermemos-0.3.10}/src/evermemos/types/v1/memories/__init__.py +0 -0
  85. {evermemos-0.3.8 → evermemos-0.3.10}/src/evermemos/types/v1/memory_type.py +0 -0
  86. {evermemos-0.3.8 → evermemos-0.3.10}/src/evermemos/types/v1/metadata.py +0 -0
  87. {evermemos-0.3.8/src/evermemos/types/v1/stats → evermemos-0.3.10/src/evermemos/types/v1/status}/__init__.py +0 -0
  88. {evermemos-0.3.8 → evermemos-0.3.10}/tests/__init__.py +0 -0
  89. {evermemos-0.3.8 → evermemos-0.3.10}/tests/api_resources/__init__.py +0 -0
  90. {evermemos-0.3.8 → evermemos-0.3.10}/tests/api_resources/v1/__init__.py +0 -0
  91. {evermemos-0.3.8 → evermemos-0.3.10}/tests/api_resources/v1/memories/__init__.py +0 -0
  92. {evermemos-0.3.8/tests/api_resources/v1/stats → evermemos-0.3.10/tests/api_resources/v1/status}/__init__.py +0 -0
  93. {evermemos-0.3.8 → evermemos-0.3.10}/tests/conftest.py +0 -0
  94. {evermemos-0.3.8 → evermemos-0.3.10}/tests/sample_file.txt +0 -0
  95. {evermemos-0.3.8 → evermemos-0.3.10}/tests/test_deepcopy.py +0 -0
  96. {evermemos-0.3.8 → evermemos-0.3.10}/tests/test_extract_files.py +0 -0
  97. {evermemos-0.3.8 → evermemos-0.3.10}/tests/test_files.py +0 -0
  98. {evermemos-0.3.8 → evermemos-0.3.10}/tests/test_models.py +0 -0
  99. {evermemos-0.3.8 → evermemos-0.3.10}/tests/test_qs.py +0 -0
  100. {evermemos-0.3.8 → evermemos-0.3.10}/tests/test_required_args.py +0 -0
  101. {evermemos-0.3.8 → evermemos-0.3.10}/tests/test_response.py +0 -0
  102. {evermemos-0.3.8 → evermemos-0.3.10}/tests/test_streaming.py +0 -0
  103. {evermemos-0.3.8 → evermemos-0.3.10}/tests/test_transform.py +0 -0
  104. {evermemos-0.3.8 → evermemos-0.3.10}/tests/test_utils/test_datetime_parse.py +0 -0
  105. {evermemos-0.3.8 → evermemos-0.3.10}/tests/test_utils/test_proxy.py +0 -0
  106. {evermemos-0.3.8 → evermemos-0.3.10}/tests/test_utils/test_typing.py +0 -0
  107. {evermemos-0.3.8 → evermemos-0.3.10}/tests/utils.py +0 -0
  108. {evermemos-0.3.8 → evermemos-0.3.10}/uv.lock +0 -0
@@ -0,0 +1,3 @@
1
+ {
2
+ ".": "0.3.10"
3
+ }
@@ -1,5 +1,35 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.3.10 (2026-01-31)
4
+
5
+ Full Changelog: [v0.3.9...v0.3.10](https://github.com/evermemos/evermemos-python/compare/v0.3.9...v0.3.10)
6
+
7
+ ### Features
8
+
9
+ * **api:** api update ([98f0599](https://github.com/evermemos/evermemos-python/commit/98f05990549d226b03aa4a006b994df14ca91967))
10
+ * **client:** add custom JSON encoder for extended type support ([07e2cfe](https://github.com/evermemos/evermemos-python/commit/07e2cfe00b6360c7227fa0149c8aaf8697d3ec3f))
11
+
12
+
13
+ ### Chores
14
+
15
+ * update SDK settings ([135157a](https://github.com/evermemos/evermemos-python/commit/135157adbfe192a90a78aa0c51418a764649d054))
16
+ * update SDK settings ([d6a254c](https://github.com/evermemos/evermemos-python/commit/d6a254c0c35bc5e1a0a74bb5c5f8b7d96f1c92e1))
17
+ * update SDK settings ([dda1b57](https://github.com/evermemos/evermemos-python/commit/dda1b5786d59336c1ace3363876de645fcffccb7))
18
+
19
+ ## 0.3.9 (2026-01-29)
20
+
21
+ Full Changelog: [v0.3.8...v0.3.9](https://github.com/evermemos/evermemos-python/compare/v0.3.8...v0.3.9)
22
+
23
+ ### Features
24
+
25
+ * **api:** api update ([9cef371](https://github.com/evermemos/evermemos-python/commit/9cef37158fce900009a56362b9c9b962084be202))
26
+
27
+
28
+ ### Chores
29
+
30
+ * update SDK settings ([7ea187d](https://github.com/evermemos/evermemos-python/commit/7ea187dd45a43f915258b17cd9d98b2e8624f948))
31
+ * update SDK settings ([f727a84](https://github.com/evermemos/evermemos-python/commit/f727a84dbc4e5cb8a04adfa14ce79f6254f54ead))
32
+
3
33
  ## 0.3.8 (2026-01-28)
4
34
 
5
35
  Full Changelog: [v0.3.7...v0.3.8](https://github.com/evermemos/evermemos-python/compare/v0.3.7...v0.3.8)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: evermemos
3
- Version: 0.3.8
3
+ Version: 0.3.10
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
@@ -67,13 +67,13 @@ client = EverMemOS(
67
67
  api_key=os.environ.get("EVERMEMOS_API_KEY"), # This is the default and can be omitted
68
68
  )
69
69
 
70
- memory = client.v1.memories.create(
70
+ response = client.v1.memories.add(
71
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
74
  sender="user_001",
75
75
  )
76
- print(memory.request_id)
76
+ print(response.request_id)
77
77
  ```
78
78
 
79
79
  While you can provide an `api_key` keyword argument,
@@ -96,13 +96,13 @@ client = AsyncEverMemOS(
96
96
 
97
97
 
98
98
  async def main() -> None:
99
- memory = await client.v1.memories.create(
99
+ response = await client.v1.memories.add(
100
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
103
  sender="user_001",
104
104
  )
105
- print(memory.request_id)
105
+ print(response.request_id)
106
106
 
107
107
 
108
108
  asyncio.run(main())
@@ -135,13 +135,13 @@ async def main() -> None:
135
135
  api_key=os.environ.get("EVERMEMOS_API_KEY"), # This is the default and can be omitted
136
136
  http_client=DefaultAioHttpClient(),
137
137
  ) as client:
138
- memory = await client.v1.memories.create(
138
+ response = await client.v1.memories.add(
139
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
142
  sender="user_001",
143
143
  )
144
- print(memory.request_id)
144
+ print(response.request_id)
145
145
 
146
146
 
147
147
  asyncio.run(main())
@@ -165,23 +165,20 @@ from evermemos import EverMemOS
165
165
 
166
166
  client = EverMemOS()
167
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",
168
+ conversation_meta = client.v1.memories.conversation_meta.create(
169
+ created_at="2025-01-15T10:00:00+00:00",
170
+ llm_custom_setting={
171
+ "boundary": {
172
+ "model": "gpt-4o-mini",
173
+ "provider": "openai",
174
+ },
175
+ "extraction": {
176
+ "model": "gpt-4o",
177
+ "provider": "openai",
181
178
  },
182
179
  },
183
180
  )
184
- print(response.conversation_meta)
181
+ print(conversation_meta.llm_custom_setting)
185
182
  ```
186
183
 
187
184
  ## Handling errors
@@ -200,7 +197,7 @@ from evermemos import EverMemOS
200
197
  client = EverMemOS()
201
198
 
202
199
  try:
203
- client.v1.memories.create(
200
+ client.v1.memories.add(
204
201
  content="Let's discuss the technical solution for the new feature today",
205
202
  create_time="2025-01-15T10:00:00+00:00",
206
203
  message_id="msg_001",
@@ -248,7 +245,7 @@ client = EverMemOS(
248
245
  )
249
246
 
250
247
  # Or, configure per-request:
251
- client.with_options(max_retries=5).v1.memories.create(
248
+ client.with_options(max_retries=5).v1.memories.add(
252
249
  content="Let's discuss the technical solution for the new feature today",
253
250
  create_time="2025-01-15T10:00:00+00:00",
254
251
  message_id="msg_001",
@@ -276,7 +273,7 @@ client = EverMemOS(
276
273
  )
277
274
 
278
275
  # Override per-request:
279
- client.with_options(timeout=5.0).v1.memories.create(
276
+ client.with_options(timeout=5.0).v1.memories.add(
280
277
  content="Let's discuss the technical solution for the new feature today",
281
278
  create_time="2025-01-15T10:00:00+00:00",
282
279
  message_id="msg_001",
@@ -322,7 +319,7 @@ The "raw" Response object can be accessed by prefixing `.with_raw_response.` to
322
319
  from evermemos import EverMemOS
323
320
 
324
321
  client = EverMemOS()
325
- response = client.v1.memories.with_raw_response.create(
322
+ response = client.v1.memories.with_raw_response.add(
326
323
  content="Let's discuss the technical solution for the new feature today",
327
324
  create_time="2025-01-15T10:00:00+00:00",
328
325
  message_id="msg_001",
@@ -330,7 +327,7 @@ response = client.v1.memories.with_raw_response.create(
330
327
  )
331
328
  print(response.headers.get('X-My-Header'))
332
329
 
333
- memory = response.parse() # get the object that `v1.memories.create()` would have returned
330
+ memory = response.parse() # get the object that `v1.memories.add()` would have returned
334
331
  print(memory.request_id)
335
332
  ```
336
333
 
@@ -345,7 +342,7 @@ The above interface eagerly reads the full response body when you make the reque
345
342
  To stream the response body, use `.with_streaming_response` instead, which requires a context manager and only reads the response body once you call `.read()`, `.text()`, `.json()`, `.iter_bytes()`, `.iter_text()`, `.iter_lines()` or `.parse()`. In the async client, these are async methods.
346
343
 
347
344
  ```python
348
- with client.v1.memories.with_streaming_response.create(
345
+ with client.v1.memories.with_streaming_response.add(
349
346
  content="Let's discuss the technical solution for the new feature today",
350
347
  create_time="2025-01-15T10:00:00+00:00",
351
348
  message_id="msg_001",
@@ -32,13 +32,13 @@ client = EverMemOS(
32
32
  api_key=os.environ.get("EVERMEMOS_API_KEY"), # This is the default and can be omitted
33
33
  )
34
34
 
35
- memory = client.v1.memories.create(
35
+ response = client.v1.memories.add(
36
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
39
  sender="user_001",
40
40
  )
41
- print(memory.request_id)
41
+ print(response.request_id)
42
42
  ```
43
43
 
44
44
  While you can provide an `api_key` keyword argument,
@@ -61,13 +61,13 @@ client = AsyncEverMemOS(
61
61
 
62
62
 
63
63
  async def main() -> None:
64
- memory = await client.v1.memories.create(
64
+ response = await client.v1.memories.add(
65
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
68
  sender="user_001",
69
69
  )
70
- print(memory.request_id)
70
+ print(response.request_id)
71
71
 
72
72
 
73
73
  asyncio.run(main())
@@ -100,13 +100,13 @@ async def main() -> None:
100
100
  api_key=os.environ.get("EVERMEMOS_API_KEY"), # This is the default and can be omitted
101
101
  http_client=DefaultAioHttpClient(),
102
102
  ) as client:
103
- memory = await client.v1.memories.create(
103
+ response = await client.v1.memories.add(
104
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
107
  sender="user_001",
108
108
  )
109
- print(memory.request_id)
109
+ print(response.request_id)
110
110
 
111
111
 
112
112
  asyncio.run(main())
@@ -130,23 +130,20 @@ from evermemos import EverMemOS
130
130
 
131
131
  client = EverMemOS()
132
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",
133
+ conversation_meta = client.v1.memories.conversation_meta.create(
134
+ created_at="2025-01-15T10:00:00+00:00",
135
+ llm_custom_setting={
136
+ "boundary": {
137
+ "model": "gpt-4o-mini",
138
+ "provider": "openai",
139
+ },
140
+ "extraction": {
141
+ "model": "gpt-4o",
142
+ "provider": "openai",
146
143
  },
147
144
  },
148
145
  )
149
- print(response.conversation_meta)
146
+ print(conversation_meta.llm_custom_setting)
150
147
  ```
151
148
 
152
149
  ## Handling errors
@@ -165,7 +162,7 @@ from evermemos import EverMemOS
165
162
  client = EverMemOS()
166
163
 
167
164
  try:
168
- client.v1.memories.create(
165
+ client.v1.memories.add(
169
166
  content="Let's discuss the technical solution for the new feature today",
170
167
  create_time="2025-01-15T10:00:00+00:00",
171
168
  message_id="msg_001",
@@ -213,7 +210,7 @@ client = EverMemOS(
213
210
  )
214
211
 
215
212
  # Or, configure per-request:
216
- client.with_options(max_retries=5).v1.memories.create(
213
+ client.with_options(max_retries=5).v1.memories.add(
217
214
  content="Let's discuss the technical solution for the new feature today",
218
215
  create_time="2025-01-15T10:00:00+00:00",
219
216
  message_id="msg_001",
@@ -241,7 +238,7 @@ client = EverMemOS(
241
238
  )
242
239
 
243
240
  # Override per-request:
244
- client.with_options(timeout=5.0).v1.memories.create(
241
+ client.with_options(timeout=5.0).v1.memories.add(
245
242
  content="Let's discuss the technical solution for the new feature today",
246
243
  create_time="2025-01-15T10:00:00+00:00",
247
244
  message_id="msg_001",
@@ -287,7 +284,7 @@ The "raw" Response object can be accessed by prefixing `.with_raw_response.` to
287
284
  from evermemos import EverMemOS
288
285
 
289
286
  client = EverMemOS()
290
- response = client.v1.memories.with_raw_response.create(
287
+ response = client.v1.memories.with_raw_response.add(
291
288
  content="Let's discuss the technical solution for the new feature today",
292
289
  create_time="2025-01-15T10:00:00+00:00",
293
290
  message_id="msg_001",
@@ -295,7 +292,7 @@ response = client.v1.memories.with_raw_response.create(
295
292
  )
296
293
  print(response.headers.get('X-My-Header'))
297
294
 
298
- memory = response.parse() # get the object that `v1.memories.create()` would have returned
295
+ memory = response.parse() # get the object that `v1.memories.add()` would have returned
299
296
  print(memory.request_id)
300
297
  ```
301
298
 
@@ -310,7 +307,7 @@ The above interface eagerly reads the full response body when you make the reque
310
307
  To stream the response body, use `.with_streaming_response` instead, which requires a context manager and only reads the response body once you call `.read()`, `.text()`, `.json()`, `.iter_bytes()`, `.iter_text()`, `.iter_lines()` or `.parse()`. In the async client, these are async methods.
311
308
 
312
309
  ```python
313
- with client.v1.memories.with_streaming_response.create(
310
+ with client.v1.memories.with_streaming_response.add(
314
311
  content="Let's discuss the technical solution for the new feature today",
315
312
  create_time="2025-01-15T10:00:00+00:00",
316
313
  message_id="msg_001",
@@ -8,20 +8,18 @@ Types:
8
8
  from evermemos.types.v1 import (
9
9
  MemoryType,
10
10
  Metadata,
11
- MemoryCreateResponse,
12
11
  MemoryDeleteResponse,
12
+ MemoryAddResponse,
13
13
  MemoryGetResponse,
14
- MemoryLoadResponse,
15
14
  MemorySearchResponse,
16
15
  )
17
16
  ```
18
17
 
19
18
  Methods:
20
19
 
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>
22
20
  - <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>
21
+ - <code title="post /api/v1/memories">client.v1.memories.<a href="./src/evermemos/resources/v1/memories/memories.py">add</a>(\*\*<a href="src/evermemos/types/v1/memory_add_params.py">params</a>) -> <a href="./src/evermemos/types/v1/memory_add_response.py">MemoryAddResponse</a></code>
23
22
  - <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>
25
23
  - <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>
26
24
 
27
25
  ### ConversationMeta
@@ -42,16 +40,16 @@ Methods:
42
40
  - <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>
43
41
  - <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
42
 
45
- ## Stats
43
+ ## Status
46
44
 
47
45
  ### Request
48
46
 
49
47
  Types:
50
48
 
51
49
  ```python
52
- from evermemos.types.v1.stats import RequestGetResponse
50
+ from evermemos.types.v1.status import RequestGetResponse
53
51
  ```
54
52
 
55
53
  Methods:
56
54
 
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>
55
+ - <code title="get /api/v1/status/request">client.v1.status.request.<a href="./src/evermemos/resources/v1/status/request.py">get</a>(\*\*<a href="src/evermemos/types/v1/status/request_get_params.py">params</a>) -> <a href="./src/evermemos/types/v1/status/request_get_response.py">RequestGetResponse</a></code>
@@ -2,10 +2,6 @@
2
2
 
3
3
  errors=()
4
4
 
5
- if [ -z "${PYPI_TOKEN}" ]; then
6
- errors+=("The PYPI_TOKEN secret has not been set. Please set it in either this repository's secrets or your organization secrets.")
7
- fi
8
-
9
5
  lenErrors=${#errors[@]}
10
6
 
11
7
  if [[ lenErrors -gt 0 ]]; then
@@ -0,0 +1,11 @@
1
+ #!/usr/bin/env bash
2
+
3
+ set -eux
4
+ rm -rf dist
5
+ mkdir -p dist
6
+ uv build
7
+ if [ -n "${PYPI_TOKEN:-}" ]; then
8
+ uv publish --token=$PYPI_TOKEN
9
+ else
10
+ uv publish
11
+ fi
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "evermemos"
3
- version = "0.3.8"
3
+ version = "0.3.10"
4
4
  description = "The official Python library for the EverMemOS API"
5
5
  dynamic = ["readme"]
6
6
  license = "Apache-2.0"
@@ -86,6 +86,7 @@ from ._exceptions import (
86
86
  APIConnectionError,
87
87
  APIResponseValidationError,
88
88
  )
89
+ from ._utils._json import openapi_dumps
89
90
 
90
91
  log: logging.Logger = logging.getLogger(__name__)
91
92
 
@@ -554,8 +555,10 @@ class BaseClient(Generic[_HttpxClientT, _DefaultStreamT]):
554
555
  kwargs["content"] = options.content
555
556
  elif isinstance(json_data, bytes):
556
557
  kwargs["content"] = json_data
557
- else:
558
- kwargs["json"] = json_data if is_given(json_data) else None
558
+ elif not files:
559
+ # Don't set content when JSON is sent as multipart/form-data,
560
+ # since httpx's content param overrides other body arguments
561
+ kwargs["content"] = openapi_dumps(json_data) if is_given(json_data) and json_data is not None else None
559
562
  kwargs["files"] = files
560
563
  else:
561
564
  headers.pop("Content-Type", None)
@@ -139,6 +139,7 @@ def model_dump(
139
139
  exclude_defaults: bool = False,
140
140
  warnings: bool = True,
141
141
  mode: Literal["json", "python"] = "python",
142
+ by_alias: bool | None = None,
142
143
  ) -> dict[str, Any]:
143
144
  if (not PYDANTIC_V1) or hasattr(model, "model_dump"):
144
145
  return model.model_dump(
@@ -148,13 +149,12 @@ def model_dump(
148
149
  exclude_defaults=exclude_defaults,
149
150
  # warnings are not supported in Pydantic v1
150
151
  warnings=True if PYDANTIC_V1 else warnings,
152
+ by_alias=by_alias,
151
153
  )
152
154
  return cast(
153
155
  "dict[str, Any]",
154
156
  model.dict( # pyright: ignore[reportDeprecated, reportUnnecessaryCast]
155
- exclude=exclude,
156
- exclude_unset=exclude_unset,
157
- exclude_defaults=exclude_defaults,
157
+ exclude=exclude, exclude_unset=exclude_unset, exclude_defaults=exclude_defaults, by_alias=bool(by_alias)
158
158
  ),
159
159
  )
160
160
 
@@ -0,0 +1,35 @@
1
+ import json
2
+ from typing import Any
3
+ from datetime import datetime
4
+ from typing_extensions import override
5
+
6
+ import pydantic
7
+
8
+ from .._compat import model_dump
9
+
10
+
11
+ def openapi_dumps(obj: Any) -> bytes:
12
+ """
13
+ Serialize an object to UTF-8 encoded JSON bytes.
14
+
15
+ Extends the standard json.dumps with support for additional types
16
+ commonly used in the SDK, such as `datetime`, `pydantic.BaseModel`, etc.
17
+ """
18
+ return json.dumps(
19
+ obj,
20
+ cls=_CustomEncoder,
21
+ # Uses the same defaults as httpx's JSON serialization
22
+ ensure_ascii=False,
23
+ separators=(",", ":"),
24
+ allow_nan=False,
25
+ ).encode()
26
+
27
+
28
+ class _CustomEncoder(json.JSONEncoder):
29
+ @override
30
+ def default(self, o: Any) -> Any:
31
+ if isinstance(o, datetime):
32
+ return o.isoformat()
33
+ if isinstance(o, pydantic.BaseModel):
34
+ return model_dump(o, exclude_unset=True, mode="json", by_alias=True)
35
+ return super().default(o)
@@ -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.8" # x-release-please-version
4
+ __version__ = "0.3.10" # x-release-please-version
@@ -8,13 +8,13 @@ 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,
11
+ from .status import (
12
+ StatusResource,
13
+ AsyncStatusResource,
14
+ StatusResourceWithRawResponse,
15
+ AsyncStatusResourceWithRawResponse,
16
+ StatusResourceWithStreamingResponse,
17
+ AsyncStatusResourceWithStreamingResponse,
18
18
  )
19
19
  from .memories import (
20
20
  MemoriesResource,
@@ -32,12 +32,12 @@ __all__ = [
32
32
  "AsyncMemoriesResourceWithRawResponse",
33
33
  "MemoriesResourceWithStreamingResponse",
34
34
  "AsyncMemoriesResourceWithStreamingResponse",
35
- "StatsResource",
36
- "AsyncStatsResource",
37
- "StatsResourceWithRawResponse",
38
- "AsyncStatsResourceWithRawResponse",
39
- "StatsResourceWithStreamingResponse",
40
- "AsyncStatsResourceWithStreamingResponse",
35
+ "StatusResource",
36
+ "AsyncStatusResource",
37
+ "StatusResourceWithRawResponse",
38
+ "AsyncStatusResourceWithRawResponse",
39
+ "StatusResourceWithStreamingResponse",
40
+ "AsyncStatusResourceWithStreamingResponse",
41
41
  "V1Resource",
42
42
  "AsyncV1Resource",
43
43
  "V1ResourceWithRawResponse",