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.
- evermemos-0.3.10/.release-please-manifest.json +3 -0
- {evermemos-0.3.8 → evermemos-0.3.10}/CHANGELOG.md +30 -0
- {evermemos-0.3.8 → evermemos-0.3.10}/PKG-INFO +24 -27
- {evermemos-0.3.8 → evermemos-0.3.10}/README.md +23 -26
- {evermemos-0.3.8 → evermemos-0.3.10}/api.md +5 -7
- {evermemos-0.3.8 → evermemos-0.3.10}/bin/check-release-environment +0 -4
- evermemos-0.3.10/bin/publish-pypi +11 -0
- {evermemos-0.3.8 → evermemos-0.3.10}/pyproject.toml +1 -1
- {evermemos-0.3.8 → evermemos-0.3.10}/src/evermemos/_base_client.py +5 -2
- {evermemos-0.3.8 → evermemos-0.3.10}/src/evermemos/_compat.py +3 -3
- evermemos-0.3.10/src/evermemos/_utils/_json.py +35 -0
- {evermemos-0.3.8 → evermemos-0.3.10}/src/evermemos/_version.py +1 -1
- {evermemos-0.3.8 → evermemos-0.3.10}/src/evermemos/resources/v1/__init__.py +13 -13
- {evermemos-0.3.8 → evermemos-0.3.10}/src/evermemos/resources/v1/memories/conversation_meta.py +82 -40
- {evermemos-0.3.8 → evermemos-0.3.10}/src/evermemos/resources/v1/memories/memories.py +133 -228
- {evermemos-0.3.8/src/evermemos/resources/v1/stats → evermemos-0.3.10/src/evermemos/resources/v1/status}/__init__.py +13 -13
- {evermemos-0.3.8/src/evermemos/resources/v1/stats → evermemos-0.3.10/src/evermemos/resources/v1/status}/request.py +6 -6
- evermemos-0.3.8/src/evermemos/resources/v1/stats/stats.py → evermemos-0.3.10/src/evermemos/resources/v1/status/status.py +27 -27
- {evermemos-0.3.8 → evermemos-0.3.10}/src/evermemos/resources/v1/v1.py +19 -19
- {evermemos-0.3.8 → evermemos-0.3.10}/src/evermemos/types/v1/__init__.py +2 -4
- evermemos-0.3.10/src/evermemos/types/v1/memories/conversation_meta_create_params.py +144 -0
- evermemos-0.3.10/src/evermemos/types/v1/memories/conversation_meta_create_response.py +109 -0
- evermemos-0.3.10/src/evermemos/types/v1/memories/conversation_meta_get_response.py +109 -0
- evermemos-0.3.10/src/evermemos/types/v1/memories/conversation_meta_update_params.py +117 -0
- {evermemos-0.3.8 → evermemos-0.3.10}/src/evermemos/types/v1/memories/conversation_meta_update_response.py +0 -5
- 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
- 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
- {evermemos-0.3.8 → evermemos-0.3.10}/src/evermemos/types/v1/memory_delete_params.py +6 -0
- {evermemos-0.3.8 → evermemos-0.3.10}/src/evermemos/types/v1/memory_delete_response.py +0 -5
- {evermemos-0.3.8 → evermemos-0.3.10}/src/evermemos/types/v1/memory_get_response.py +7 -10
- {evermemos-0.3.8 → evermemos-0.3.10}/src/evermemos/types/v1/memory_search_response.py +5 -18
- {evermemos-0.3.8/src/evermemos/types/v1/stats → evermemos-0.3.10/src/evermemos/types/v1/status}/request_get_params.py +1 -1
- {evermemos-0.3.8/src/evermemos/types/v1/stats → evermemos-0.3.10/src/evermemos/types/v1/status}/request_get_response.py +0 -5
- {evermemos-0.3.8 → evermemos-0.3.10}/tests/api_resources/v1/memories/test_conversation_meta.py +84 -44
- {evermemos-0.3.8/tests/api_resources/v1/stats → evermemos-0.3.10/tests/api_resources/v1/status}/test_request.py +7 -7
- {evermemos-0.3.8 → evermemos-0.3.10}/tests/api_resources/v1/test_memories.py +103 -238
- {evermemos-0.3.8 → evermemos-0.3.10}/tests/test_client.py +10 -10
- evermemos-0.3.10/tests/test_utils/test_json.py +126 -0
- evermemos-0.3.8/.release-please-manifest.json +0 -3
- evermemos-0.3.8/bin/publish-pypi +0 -7
- evermemos-0.3.8/src/evermemos/types/v1/global_user_profile/__init__.py +0 -3
- evermemos-0.3.8/src/evermemos/types/v1/memories/conversation_meta_create_params.py +0 -73
- evermemos-0.3.8/src/evermemos/types/v1/memories/conversation_meta_create_response.py +0 -66
- evermemos-0.3.8/src/evermemos/types/v1/memories/conversation_meta_get_response.py +0 -66
- evermemos-0.3.8/src/evermemos/types/v1/memories/conversation_meta_update_params.py +0 -58
- evermemos-0.3.8/src/evermemos/types/v1/memory_load_params.py +0 -83
- evermemos-0.3.8/src/evermemos/types/v1/memory_load_response.py +0 -26
- {evermemos-0.3.8 → evermemos-0.3.10}/.gitignore +0 -0
- {evermemos-0.3.8 → evermemos-0.3.10}/CONTRIBUTING.md +0 -0
- {evermemos-0.3.8 → evermemos-0.3.10}/LICENSE +0 -0
- {evermemos-0.3.8 → evermemos-0.3.10}/SECURITY.md +0 -0
- {evermemos-0.3.8 → evermemos-0.3.10}/examples/.keep +0 -0
- {evermemos-0.3.8 → evermemos-0.3.10}/release-please-config.json +0 -0
- {evermemos-0.3.8 → evermemos-0.3.10}/requirements-dev.lock +0 -0
- {evermemos-0.3.8 → evermemos-0.3.10}/src/EverMemOS/lib/.keep +0 -0
- {evermemos-0.3.8 → evermemos-0.3.10}/src/evermemos/__init__.py +0 -0
- {evermemos-0.3.8 → evermemos-0.3.10}/src/evermemos/_client.py +0 -0
- {evermemos-0.3.8 → evermemos-0.3.10}/src/evermemos/_constants.py +0 -0
- {evermemos-0.3.8 → evermemos-0.3.10}/src/evermemos/_exceptions.py +0 -0
- {evermemos-0.3.8 → evermemos-0.3.10}/src/evermemos/_files.py +0 -0
- {evermemos-0.3.8 → evermemos-0.3.10}/src/evermemos/_models.py +0 -0
- {evermemos-0.3.8 → evermemos-0.3.10}/src/evermemos/_qs.py +0 -0
- {evermemos-0.3.8 → evermemos-0.3.10}/src/evermemos/_resource.py +0 -0
- {evermemos-0.3.8 → evermemos-0.3.10}/src/evermemos/_response.py +0 -0
- {evermemos-0.3.8 → evermemos-0.3.10}/src/evermemos/_streaming.py +0 -0
- {evermemos-0.3.8 → evermemos-0.3.10}/src/evermemos/_types.py +0 -0
- {evermemos-0.3.8 → evermemos-0.3.10}/src/evermemos/_utils/__init__.py +0 -0
- {evermemos-0.3.8 → evermemos-0.3.10}/src/evermemos/_utils/_compat.py +0 -0
- {evermemos-0.3.8 → evermemos-0.3.10}/src/evermemos/_utils/_datetime_parse.py +0 -0
- {evermemos-0.3.8 → evermemos-0.3.10}/src/evermemos/_utils/_logs.py +0 -0
- {evermemos-0.3.8 → evermemos-0.3.10}/src/evermemos/_utils/_proxy.py +0 -0
- {evermemos-0.3.8 → evermemos-0.3.10}/src/evermemos/_utils/_reflection.py +0 -0
- {evermemos-0.3.8 → evermemos-0.3.10}/src/evermemos/_utils/_resources_proxy.py +0 -0
- {evermemos-0.3.8 → evermemos-0.3.10}/src/evermemos/_utils/_streams.py +0 -0
- {evermemos-0.3.8 → evermemos-0.3.10}/src/evermemos/_utils/_sync.py +0 -0
- {evermemos-0.3.8 → evermemos-0.3.10}/src/evermemos/_utils/_transform.py +0 -0
- {evermemos-0.3.8 → evermemos-0.3.10}/src/evermemos/_utils/_typing.py +0 -0
- {evermemos-0.3.8 → evermemos-0.3.10}/src/evermemos/_utils/_utils.py +0 -0
- {evermemos-0.3.8 → evermemos-0.3.10}/src/evermemos/lib/.keep +0 -0
- {evermemos-0.3.8 → evermemos-0.3.10}/src/evermemos/py.typed +0 -0
- {evermemos-0.3.8 → evermemos-0.3.10}/src/evermemos/resources/__init__.py +0 -0
- {evermemos-0.3.8 → evermemos-0.3.10}/src/evermemos/resources/v1/memories/__init__.py +0 -0
- {evermemos-0.3.8 → evermemos-0.3.10}/src/evermemos/types/__init__.py +0 -0
- {evermemos-0.3.8 → evermemos-0.3.10}/src/evermemos/types/v1/memories/__init__.py +0 -0
- {evermemos-0.3.8 → evermemos-0.3.10}/src/evermemos/types/v1/memory_type.py +0 -0
- {evermemos-0.3.8 → evermemos-0.3.10}/src/evermemos/types/v1/metadata.py +0 -0
- {evermemos-0.3.8/src/evermemos/types/v1/stats → evermemos-0.3.10/src/evermemos/types/v1/status}/__init__.py +0 -0
- {evermemos-0.3.8 → evermemos-0.3.10}/tests/__init__.py +0 -0
- {evermemos-0.3.8 → evermemos-0.3.10}/tests/api_resources/__init__.py +0 -0
- {evermemos-0.3.8 → evermemos-0.3.10}/tests/api_resources/v1/__init__.py +0 -0
- {evermemos-0.3.8 → evermemos-0.3.10}/tests/api_resources/v1/memories/__init__.py +0 -0
- {evermemos-0.3.8/tests/api_resources/v1/stats → evermemos-0.3.10/tests/api_resources/v1/status}/__init__.py +0 -0
- {evermemos-0.3.8 → evermemos-0.3.10}/tests/conftest.py +0 -0
- {evermemos-0.3.8 → evermemos-0.3.10}/tests/sample_file.txt +0 -0
- {evermemos-0.3.8 → evermemos-0.3.10}/tests/test_deepcopy.py +0 -0
- {evermemos-0.3.8 → evermemos-0.3.10}/tests/test_extract_files.py +0 -0
- {evermemos-0.3.8 → evermemos-0.3.10}/tests/test_files.py +0 -0
- {evermemos-0.3.8 → evermemos-0.3.10}/tests/test_models.py +0 -0
- {evermemos-0.3.8 → evermemos-0.3.10}/tests/test_qs.py +0 -0
- {evermemos-0.3.8 → evermemos-0.3.10}/tests/test_required_args.py +0 -0
- {evermemos-0.3.8 → evermemos-0.3.10}/tests/test_response.py +0 -0
- {evermemos-0.3.8 → evermemos-0.3.10}/tests/test_streaming.py +0 -0
- {evermemos-0.3.8 → evermemos-0.3.10}/tests/test_transform.py +0 -0
- {evermemos-0.3.8 → evermemos-0.3.10}/tests/test_utils/test_datetime_parse.py +0 -0
- {evermemos-0.3.8 → evermemos-0.3.10}/tests/test_utils/test_proxy.py +0 -0
- {evermemos-0.3.8 → evermemos-0.3.10}/tests/test_utils/test_typing.py +0 -0
- {evermemos-0.3.8 → evermemos-0.3.10}/tests/utils.py +0 -0
- {evermemos-0.3.8 → evermemos-0.3.10}/uv.lock +0 -0
|
@@ -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.
|
|
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
|
-
|
|
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(
|
|
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
|
-
|
|
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(
|
|
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
|
-
|
|
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(
|
|
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
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
"
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
"
|
|
176
|
-
|
|
177
|
-
|
|
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(
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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
|
-
|
|
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(
|
|
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
|
-
|
|
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(
|
|
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
|
-
|
|
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(
|
|
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
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
"
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
"
|
|
141
|
-
|
|
142
|
-
|
|
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(
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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
|
-
##
|
|
43
|
+
## Status
|
|
46
44
|
|
|
47
45
|
### Request
|
|
48
46
|
|
|
49
47
|
Types:
|
|
50
48
|
|
|
51
49
|
```python
|
|
52
|
-
from evermemos.types.v1.
|
|
50
|
+
from evermemos.types.v1.status import RequestGetResponse
|
|
53
51
|
```
|
|
54
52
|
|
|
55
53
|
Methods:
|
|
56
54
|
|
|
57
|
-
- <code title="get /api/v1/
|
|
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>
|
|
@@ -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
|
-
|
|
558
|
-
|
|
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)
|
|
@@ -8,13 +8,13 @@ from .v1 import (
|
|
|
8
8
|
V1ResourceWithStreamingResponse,
|
|
9
9
|
AsyncV1ResourceWithStreamingResponse,
|
|
10
10
|
)
|
|
11
|
-
from .
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
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
|
-
"
|
|
36
|
-
"
|
|
37
|
-
"
|
|
38
|
-
"
|
|
39
|
-
"
|
|
40
|
-
"
|
|
35
|
+
"StatusResource",
|
|
36
|
+
"AsyncStatusResource",
|
|
37
|
+
"StatusResourceWithRawResponse",
|
|
38
|
+
"AsyncStatusResourceWithRawResponse",
|
|
39
|
+
"StatusResourceWithStreamingResponse",
|
|
40
|
+
"AsyncStatusResourceWithStreamingResponse",
|
|
41
41
|
"V1Resource",
|
|
42
42
|
"AsyncV1Resource",
|
|
43
43
|
"V1ResourceWithRawResponse",
|