evermemos 0.3.9__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 (110) hide show
  1. evermemos-0.3.10/.release-please-manifest.json +3 -0
  2. {evermemos-0.3.9 → evermemos-0.3.10}/CHANGELOG.md +16 -0
  3. {evermemos-0.3.9 → evermemos-0.3.10}/PKG-INFO +24 -26
  4. {evermemos-0.3.9 → evermemos-0.3.10}/README.md +23 -25
  5. {evermemos-0.3.9 → evermemos-0.3.10}/api.md +16 -4
  6. {evermemos-0.3.9 → evermemos-0.3.10}/bin/check-release-environment +0 -4
  7. evermemos-0.3.10/bin/publish-pypi +11 -0
  8. {evermemos-0.3.9 → evermemos-0.3.10}/pyproject.toml +1 -1
  9. {evermemos-0.3.9 → evermemos-0.3.10}/src/evermemos/_base_client.py +5 -2
  10. {evermemos-0.3.9 → 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.9 → evermemos-0.3.10}/src/evermemos/_version.py +1 -1
  13. {evermemos-0.3.9 → evermemos-0.3.10}/src/evermemos/resources/v1/__init__.py +14 -0
  14. {evermemos-0.3.9 → evermemos-0.3.10}/src/evermemos/resources/v1/memories/conversation_meta.py +138 -10
  15. {evermemos-0.3.9 → evermemos-0.3.10}/src/evermemos/resources/v1/memories/memories.py +165 -182
  16. evermemos-0.3.10/src/evermemos/resources/v1/status/__init__.py +33 -0
  17. evermemos-0.3.10/src/evermemos/resources/v1/status/request.py +175 -0
  18. evermemos-0.3.10/src/evermemos/resources/v1/status/status.py +102 -0
  19. {evermemos-0.3.9 → evermemos-0.3.10}/src/evermemos/resources/v1/v1.py +32 -0
  20. {evermemos-0.3.9 → 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.9 → evermemos-0.3.10}/src/evermemos/types/v1/memories/conversation_meta_update_response.py +11 -0
  26. evermemos-0.3.10/src/evermemos/types/v1/memory_add_params.py +60 -0
  27. evermemos-0.3.9/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.9 → evermemos-0.3.10}/src/evermemos/types/v1/memory_delete_params.py +9 -0
  29. {evermemos-0.3.9 → evermemos-0.3.10}/src/evermemos/types/v1/memory_delete_response.py +7 -0
  30. {evermemos-0.3.9 → evermemos-0.3.10}/src/evermemos/types/v1/memory_get_response.py +12 -5
  31. {evermemos-0.3.9 → evermemos-0.3.10}/src/evermemos/types/v1/memory_search_response.py +5 -0
  32. evermemos-0.3.10/src/evermemos/types/v1/status/__init__.py +6 -0
  33. evermemos-0.3.10/src/evermemos/types/v1/status/request_get_params.py +13 -0
  34. evermemos-0.3.10/src/evermemos/types/v1/status/request_get_response.py +21 -0
  35. {evermemos-0.3.9 → evermemos-0.3.10}/tests/api_resources/v1/memories/test_conversation_meta.py +96 -28
  36. evermemos-0.3.10/tests/api_resources/v1/status/__init__.py +1 -0
  37. evermemos-0.3.10/tests/api_resources/v1/status/test_request.py +92 -0
  38. {evermemos-0.3.9 → evermemos-0.3.10}/tests/api_resources/v1/test_memories.py +103 -236
  39. {evermemos-0.3.9 → evermemos-0.3.10}/tests/test_client.py +10 -10
  40. evermemos-0.3.10/tests/test_utils/test_json.py +126 -0
  41. evermemos-0.3.9/.release-please-manifest.json +0 -3
  42. evermemos-0.3.9/bin/publish-pypi +0 -7
  43. evermemos-0.3.9/src/evermemos/types/v1/global_user_profile/__init__.py +0 -3
  44. evermemos-0.3.9/src/evermemos/types/v1/memories/conversation_meta_create_params.py +0 -38
  45. evermemos-0.3.9/src/evermemos/types/v1/memories/conversation_meta_create_response.py +0 -41
  46. evermemos-0.3.9/src/evermemos/types/v1/memories/conversation_meta_get_response.py +0 -41
  47. evermemos-0.3.9/src/evermemos/types/v1/memories/conversation_meta_update_params.py +0 -34
  48. evermemos-0.3.9/src/evermemos/types/v1/memory_create_params.py +0 -32
  49. evermemos-0.3.9/src/evermemos/types/v1/memory_load_params.py +0 -56
  50. evermemos-0.3.9/src/evermemos/types/v1/memory_load_response.py +0 -19
  51. evermemos-0.3.9/src/evermemos/types/v1/stats/__init__.py +0 -3
  52. {evermemos-0.3.9 → evermemos-0.3.10}/.gitignore +0 -0
  53. {evermemos-0.3.9 → evermemos-0.3.10}/CONTRIBUTING.md +0 -0
  54. {evermemos-0.3.9 → evermemos-0.3.10}/LICENSE +0 -0
  55. {evermemos-0.3.9 → evermemos-0.3.10}/SECURITY.md +0 -0
  56. {evermemos-0.3.9 → evermemos-0.3.10}/examples/.keep +0 -0
  57. {evermemos-0.3.9 → evermemos-0.3.10}/release-please-config.json +0 -0
  58. {evermemos-0.3.9 → evermemos-0.3.10}/requirements-dev.lock +0 -0
  59. {evermemos-0.3.9 → evermemos-0.3.10}/src/EverMemOS/lib/.keep +0 -0
  60. {evermemos-0.3.9 → evermemos-0.3.10}/src/evermemos/__init__.py +0 -0
  61. {evermemos-0.3.9 → evermemos-0.3.10}/src/evermemos/_client.py +0 -0
  62. {evermemos-0.3.9 → evermemos-0.3.10}/src/evermemos/_constants.py +0 -0
  63. {evermemos-0.3.9 → evermemos-0.3.10}/src/evermemos/_exceptions.py +0 -0
  64. {evermemos-0.3.9 → evermemos-0.3.10}/src/evermemos/_files.py +0 -0
  65. {evermemos-0.3.9 → evermemos-0.3.10}/src/evermemos/_models.py +0 -0
  66. {evermemos-0.3.9 → evermemos-0.3.10}/src/evermemos/_qs.py +0 -0
  67. {evermemos-0.3.9 → evermemos-0.3.10}/src/evermemos/_resource.py +0 -0
  68. {evermemos-0.3.9 → evermemos-0.3.10}/src/evermemos/_response.py +0 -0
  69. {evermemos-0.3.9 → evermemos-0.3.10}/src/evermemos/_streaming.py +0 -0
  70. {evermemos-0.3.9 → evermemos-0.3.10}/src/evermemos/_types.py +0 -0
  71. {evermemos-0.3.9 → evermemos-0.3.10}/src/evermemos/_utils/__init__.py +0 -0
  72. {evermemos-0.3.9 → evermemos-0.3.10}/src/evermemos/_utils/_compat.py +0 -0
  73. {evermemos-0.3.9 → evermemos-0.3.10}/src/evermemos/_utils/_datetime_parse.py +0 -0
  74. {evermemos-0.3.9 → evermemos-0.3.10}/src/evermemos/_utils/_logs.py +0 -0
  75. {evermemos-0.3.9 → evermemos-0.3.10}/src/evermemos/_utils/_proxy.py +0 -0
  76. {evermemos-0.3.9 → evermemos-0.3.10}/src/evermemos/_utils/_reflection.py +0 -0
  77. {evermemos-0.3.9 → evermemos-0.3.10}/src/evermemos/_utils/_resources_proxy.py +0 -0
  78. {evermemos-0.3.9 → evermemos-0.3.10}/src/evermemos/_utils/_streams.py +0 -0
  79. {evermemos-0.3.9 → evermemos-0.3.10}/src/evermemos/_utils/_sync.py +0 -0
  80. {evermemos-0.3.9 → evermemos-0.3.10}/src/evermemos/_utils/_transform.py +0 -0
  81. {evermemos-0.3.9 → evermemos-0.3.10}/src/evermemos/_utils/_typing.py +0 -0
  82. {evermemos-0.3.9 → evermemos-0.3.10}/src/evermemos/_utils/_utils.py +0 -0
  83. {evermemos-0.3.9 → evermemos-0.3.10}/src/evermemos/lib/.keep +0 -0
  84. {evermemos-0.3.9 → evermemos-0.3.10}/src/evermemos/py.typed +0 -0
  85. {evermemos-0.3.9 → evermemos-0.3.10}/src/evermemos/resources/__init__.py +0 -0
  86. {evermemos-0.3.9 → evermemos-0.3.10}/src/evermemos/resources/v1/memories/__init__.py +0 -0
  87. {evermemos-0.3.9 → evermemos-0.3.10}/src/evermemos/types/__init__.py +0 -0
  88. {evermemos-0.3.9 → evermemos-0.3.10}/src/evermemos/types/v1/memories/__init__.py +0 -0
  89. {evermemos-0.3.9 → evermemos-0.3.10}/src/evermemos/types/v1/memory_type.py +0 -0
  90. {evermemos-0.3.9 → evermemos-0.3.10}/src/evermemos/types/v1/metadata.py +0 -0
  91. {evermemos-0.3.9 → evermemos-0.3.10}/tests/__init__.py +0 -0
  92. {evermemos-0.3.9 → evermemos-0.3.10}/tests/api_resources/__init__.py +0 -0
  93. {evermemos-0.3.9 → evermemos-0.3.10}/tests/api_resources/v1/__init__.py +0 -0
  94. {evermemos-0.3.9 → evermemos-0.3.10}/tests/api_resources/v1/memories/__init__.py +0 -0
  95. {evermemos-0.3.9 → evermemos-0.3.10}/tests/conftest.py +0 -0
  96. {evermemos-0.3.9 → evermemos-0.3.10}/tests/sample_file.txt +0 -0
  97. {evermemos-0.3.9 → evermemos-0.3.10}/tests/test_deepcopy.py +0 -0
  98. {evermemos-0.3.9 → evermemos-0.3.10}/tests/test_extract_files.py +0 -0
  99. {evermemos-0.3.9 → evermemos-0.3.10}/tests/test_files.py +0 -0
  100. {evermemos-0.3.9 → evermemos-0.3.10}/tests/test_models.py +0 -0
  101. {evermemos-0.3.9 → evermemos-0.3.10}/tests/test_qs.py +0 -0
  102. {evermemos-0.3.9 → evermemos-0.3.10}/tests/test_required_args.py +0 -0
  103. {evermemos-0.3.9 → evermemos-0.3.10}/tests/test_response.py +0 -0
  104. {evermemos-0.3.9 → evermemos-0.3.10}/tests/test_streaming.py +0 -0
  105. {evermemos-0.3.9 → evermemos-0.3.10}/tests/test_transform.py +0 -0
  106. {evermemos-0.3.9 → evermemos-0.3.10}/tests/test_utils/test_datetime_parse.py +0 -0
  107. {evermemos-0.3.9 → evermemos-0.3.10}/tests/test_utils/test_proxy.py +0 -0
  108. {evermemos-0.3.9 → evermemos-0.3.10}/tests/test_utils/test_typing.py +0 -0
  109. {evermemos-0.3.9 → evermemos-0.3.10}/tests/utils.py +0 -0
  110. {evermemos-0.3.9 → evermemos-0.3.10}/uv.lock +0 -0
@@ -0,0 +1,3 @@
1
+ {
2
+ ".": "0.3.10"
3
+ }
@@ -1,5 +1,21 @@
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
+
3
19
  ## 0.3.9 (2026-01-29)
4
20
 
5
21
  Full Changelog: [v0.3.8...v0.3.9](https://github.com/evermemos/evermemos-python/compare/v0.3.8...v0.3.9)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: evermemos
3
- Version: 0.3.9
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,22 +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
- "name": "User Support Chat",
174
- "scene": "assistant",
175
- "scene_desc": {},
176
- "tags": ["support"],
177
- "user_details": {
178
- "user_001": "bar",
179
- "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",
180
178
  },
181
179
  },
182
180
  )
183
- print(response.conversation_meta)
181
+ print(conversation_meta.llm_custom_setting)
184
182
  ```
185
183
 
186
184
  ## Handling errors
@@ -199,7 +197,7 @@ from evermemos import EverMemOS
199
197
  client = EverMemOS()
200
198
 
201
199
  try:
202
- client.v1.memories.create(
200
+ client.v1.memories.add(
203
201
  content="Let's discuss the technical solution for the new feature today",
204
202
  create_time="2025-01-15T10:00:00+00:00",
205
203
  message_id="msg_001",
@@ -247,7 +245,7 @@ client = EverMemOS(
247
245
  )
248
246
 
249
247
  # Or, configure per-request:
250
- client.with_options(max_retries=5).v1.memories.create(
248
+ client.with_options(max_retries=5).v1.memories.add(
251
249
  content="Let's discuss the technical solution for the new feature today",
252
250
  create_time="2025-01-15T10:00:00+00:00",
253
251
  message_id="msg_001",
@@ -275,7 +273,7 @@ client = EverMemOS(
275
273
  )
276
274
 
277
275
  # Override per-request:
278
- client.with_options(timeout=5.0).v1.memories.create(
276
+ client.with_options(timeout=5.0).v1.memories.add(
279
277
  content="Let's discuss the technical solution for the new feature today",
280
278
  create_time="2025-01-15T10:00:00+00:00",
281
279
  message_id="msg_001",
@@ -321,7 +319,7 @@ The "raw" Response object can be accessed by prefixing `.with_raw_response.` to
321
319
  from evermemos import EverMemOS
322
320
 
323
321
  client = EverMemOS()
324
- response = client.v1.memories.with_raw_response.create(
322
+ response = client.v1.memories.with_raw_response.add(
325
323
  content="Let's discuss the technical solution for the new feature today",
326
324
  create_time="2025-01-15T10:00:00+00:00",
327
325
  message_id="msg_001",
@@ -329,7 +327,7 @@ response = client.v1.memories.with_raw_response.create(
329
327
  )
330
328
  print(response.headers.get('X-My-Header'))
331
329
 
332
- 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
333
331
  print(memory.request_id)
334
332
  ```
335
333
 
@@ -344,7 +342,7 @@ The above interface eagerly reads the full response body when you make the reque
344
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.
345
343
 
346
344
  ```python
347
- with client.v1.memories.with_streaming_response.create(
345
+ with client.v1.memories.with_streaming_response.add(
348
346
  content="Let's discuss the technical solution for the new feature today",
349
347
  create_time="2025-01-15T10:00:00+00:00",
350
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,22 +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
- "name": "User Support Chat",
139
- "scene": "assistant",
140
- "scene_desc": {},
141
- "tags": ["support"],
142
- "user_details": {
143
- "user_001": "bar",
144
- "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",
145
143
  },
146
144
  },
147
145
  )
148
- print(response.conversation_meta)
146
+ print(conversation_meta.llm_custom_setting)
149
147
  ```
150
148
 
151
149
  ## Handling errors
@@ -164,7 +162,7 @@ from evermemos import EverMemOS
164
162
  client = EverMemOS()
165
163
 
166
164
  try:
167
- client.v1.memories.create(
165
+ client.v1.memories.add(
168
166
  content="Let's discuss the technical solution for the new feature today",
169
167
  create_time="2025-01-15T10:00:00+00:00",
170
168
  message_id="msg_001",
@@ -212,7 +210,7 @@ client = EverMemOS(
212
210
  )
213
211
 
214
212
  # Or, configure per-request:
215
- client.with_options(max_retries=5).v1.memories.create(
213
+ client.with_options(max_retries=5).v1.memories.add(
216
214
  content="Let's discuss the technical solution for the new feature today",
217
215
  create_time="2025-01-15T10:00:00+00:00",
218
216
  message_id="msg_001",
@@ -240,7 +238,7 @@ client = EverMemOS(
240
238
  )
241
239
 
242
240
  # Override per-request:
243
- client.with_options(timeout=5.0).v1.memories.create(
241
+ client.with_options(timeout=5.0).v1.memories.add(
244
242
  content="Let's discuss the technical solution for the new feature today",
245
243
  create_time="2025-01-15T10:00:00+00:00",
246
244
  message_id="msg_001",
@@ -286,7 +284,7 @@ The "raw" Response object can be accessed by prefixing `.with_raw_response.` to
286
284
  from evermemos import EverMemOS
287
285
 
288
286
  client = EverMemOS()
289
- response = client.v1.memories.with_raw_response.create(
287
+ response = client.v1.memories.with_raw_response.add(
290
288
  content="Let's discuss the technical solution for the new feature today",
291
289
  create_time="2025-01-15T10:00:00+00:00",
292
290
  message_id="msg_001",
@@ -294,7 +292,7 @@ response = client.v1.memories.with_raw_response.create(
294
292
  )
295
293
  print(response.headers.get('X-My-Header'))
296
294
 
297
- 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
298
296
  print(memory.request_id)
299
297
  ```
300
298
 
@@ -309,7 +307,7 @@ The above interface eagerly reads the full response body when you make the reque
309
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.
310
308
 
311
309
  ```python
312
- with client.v1.memories.with_streaming_response.create(
310
+ with client.v1.memories.with_streaming_response.add(
313
311
  content="Let's discuss the technical solution for the new feature today",
314
312
  create_time="2025-01-15T10:00:00+00:00",
315
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
@@ -41,3 +39,17 @@ Methods:
41
39
  - <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>
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>
42
+
43
+ ## Status
44
+
45
+ ### Request
46
+
47
+ Types:
48
+
49
+ ```python
50
+ from evermemos.types.v1.status import RequestGetResponse
51
+ ```
52
+
53
+ Methods:
54
+
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.9"
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.9" # x-release-please-version
4
+ __version__ = "0.3.10" # x-release-please-version
@@ -8,6 +8,14 @@ from .v1 import (
8
8
  V1ResourceWithStreamingResponse,
9
9
  AsyncV1ResourceWithStreamingResponse,
10
10
  )
11
+ from .status import (
12
+ StatusResource,
13
+ AsyncStatusResource,
14
+ StatusResourceWithRawResponse,
15
+ AsyncStatusResourceWithRawResponse,
16
+ StatusResourceWithStreamingResponse,
17
+ AsyncStatusResourceWithStreamingResponse,
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
+ "StatusResource",
36
+ "AsyncStatusResource",
37
+ "StatusResourceWithRawResponse",
38
+ "AsyncStatusResourceWithRawResponse",
39
+ "StatusResourceWithStreamingResponse",
40
+ "AsyncStatusResourceWithStreamingResponse",
27
41
  "V1Resource",
28
42
  "AsyncV1Resource",
29
43
  "V1ResourceWithRawResponse",