edison-client 0.10.1.dev351__tar.gz → 0.10.1.dev352__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.
- {edison_client-0.10.1.dev351/src/edison_client.egg-info → edison_client-0.10.1.dev352}/PKG-INFO +1 -1
- {edison_client-0.10.1.dev351 → edison_client-0.10.1.dev352}/src/edison_client/clients/chat_methods.py +42 -9
- {edison_client-0.10.1.dev351 → edison_client-0.10.1.dev352}/src/edison_client/models/chat.py +3 -5
- {edison_client-0.10.1.dev351 → edison_client-0.10.1.dev352}/src/edison_client/version.py +3 -3
- {edison_client-0.10.1.dev351 → edison_client-0.10.1.dev352/src/edison_client.egg-info}/PKG-INFO +1 -1
- {edison_client-0.10.1.dev351 → edison_client-0.10.1.dev352}/tests/test_chat_methods.py +3 -3
- {edison_client-0.10.1.dev351 → edison_client-0.10.1.dev352}/.gitignore +0 -0
- {edison_client-0.10.1.dev351 → edison_client-0.10.1.dev352}/AGENTS.md +0 -0
- {edison_client-0.10.1.dev351 → edison_client-0.10.1.dev352}/LICENSE +0 -0
- {edison_client-0.10.1.dev351 → edison_client-0.10.1.dev352}/README.md +0 -0
- {edison_client-0.10.1.dev351 → edison_client-0.10.1.dev352}/data_storage.md +0 -0
- {edison_client-0.10.1.dev351 → edison_client-0.10.1.dev352}/docs/__init__.py +0 -0
- {edison_client-0.10.1.dev351 → edison_client-0.10.1.dev352}/docs/client_notebook.ipynb +0 -0
- {edison_client-0.10.1.dev351 → edison_client-0.10.1.dev352}/docs/data_storage_service.puml +0 -0
- {edison_client-0.10.1.dev351 → edison_client-0.10.1.dev352}/docs/dss_x_finch.png +0 -0
- {edison_client-0.10.1.dev351 → edison_client-0.10.1.dev352}/pyproject.toml +0 -0
- {edison_client-0.10.1.dev351 → edison_client-0.10.1.dev352}/setup.cfg +0 -0
- {edison_client-0.10.1.dev351 → edison_client-0.10.1.dev352}/src/edison_client/__init__.py +0 -0
- {edison_client-0.10.1.dev351 → edison_client-0.10.1.dev352}/src/edison_client/clients/__init__.py +0 -0
- {edison_client-0.10.1.dev351 → edison_client-0.10.1.dev352}/src/edison_client/clients/data_storage_methods.py +0 -0
- {edison_client-0.10.1.dev351 → edison_client-0.10.1.dev352}/src/edison_client/clients/job_client.py +0 -0
- {edison_client-0.10.1.dev351 → edison_client-0.10.1.dev352}/src/edison_client/clients/rest_client.py +0 -0
- {edison_client-0.10.1.dev351 → edison_client-0.10.1.dev352}/src/edison_client/models/__init__.py +0 -0
- {edison_client-0.10.1.dev351 → edison_client-0.10.1.dev352}/src/edison_client/models/app.py +0 -0
- {edison_client-0.10.1.dev351 → edison_client-0.10.1.dev352}/src/edison_client/models/client.py +0 -0
- {edison_client-0.10.1.dev351 → edison_client-0.10.1.dev352}/src/edison_client/models/data_storage_methods.py +0 -0
- {edison_client-0.10.1.dev351 → edison_client-0.10.1.dev352}/src/edison_client/models/job_event.py +0 -0
- {edison_client-0.10.1.dev351 → edison_client-0.10.1.dev352}/src/edison_client/models/rest.py +0 -0
- {edison_client-0.10.1.dev351 → edison_client-0.10.1.dev352}/src/edison_client/py.typed +0 -0
- {edison_client-0.10.1.dev351 → edison_client-0.10.1.dev352}/src/edison_client/utils/__init__.py +0 -0
- {edison_client-0.10.1.dev351 → edison_client-0.10.1.dev352}/src/edison_client/utils/auth.py +0 -0
- {edison_client-0.10.1.dev351 → edison_client-0.10.1.dev352}/src/edison_client/utils/general.py +0 -0
- {edison_client-0.10.1.dev351 → edison_client-0.10.1.dev352}/src/edison_client/utils/module_utils.py +0 -0
- {edison_client-0.10.1.dev351 → edison_client-0.10.1.dev352}/src/edison_client/utils/monitoring.py +0 -0
- {edison_client-0.10.1.dev351 → edison_client-0.10.1.dev352}/src/edison_client/utils/world_model_tools.py +0 -0
- {edison_client-0.10.1.dev351 → edison_client-0.10.1.dev352}/src/edison_client.egg-info/SOURCES.txt +0 -0
- {edison_client-0.10.1.dev351 → edison_client-0.10.1.dev352}/src/edison_client.egg-info/dependency_links.txt +0 -0
- {edison_client-0.10.1.dev351 → edison_client-0.10.1.dev352}/src/edison_client.egg-info/requires.txt +0 -0
- {edison_client-0.10.1.dev351 → edison_client-0.10.1.dev352}/src/edison_client.egg-info/top_level.txt +0 -0
- {edison_client-0.10.1.dev351 → edison_client-0.10.1.dev352}/tests/client_e2e_uploaded_file_trajectory_test.py +0 -0
- {edison_client-0.10.1.dev351 → edison_client-0.10.1.dev352}/tests/conftest.py +0 -0
- {edison_client-0.10.1.dev351 → edison_client-0.10.1.dev352}/tests/test_client.py +0 -0
- {edison_client-0.10.1.dev351 → edison_client-0.10.1.dev352}/tests/test_client_close.py +0 -0
- {edison_client-0.10.1.dev351 → edison_client-0.10.1.dev352}/tests/test_data/test_file.txt +0 -0
- {edison_client-0.10.1.dev351 → edison_client-0.10.1.dev352}/tests/test_data/test_information.txt +0 -0
- {edison_client-0.10.1.dev351 → edison_client-0.10.1.dev352}/tests/test_data/test_manifest.yaml +0 -0
- {edison_client-0.10.1.dev351 → edison_client-0.10.1.dev352}/tests/test_data_storage_e2e.py +0 -0
- {edison_client-0.10.1.dev351 → edison_client-0.10.1.dev352}/tests/test_data_storage_methods.py +0 -0
- {edison_client-0.10.1.dev351 → edison_client-0.10.1.dev352}/tests/test_dss_restclient_api_e2e.py +0 -0
- {edison_client-0.10.1.dev351 → edison_client-0.10.1.dev352}/tests/test_min_replicas_validation.py +0 -0
- {edison_client-0.10.1.dev351 → edison_client-0.10.1.dev352}/tests/test_rest.py +0 -0
- {edison_client-0.10.1.dev351 → edison_client-0.10.1.dev352}/tests/test_similarity_search_e2e.py +0 -0
- {edison_client-0.10.1.dev351 → edison_client-0.10.1.dev352}/tests/test_world_model_e2e.py +0 -0
{edison_client-0.10.1.dev351/src/edison_client.egg-info → edison_client-0.10.1.dev352}/PKG-INFO
RENAMED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: edison-client
|
|
3
|
-
Version: 0.10.1.
|
|
3
|
+
Version: 0.10.1.dev352
|
|
4
4
|
Summary: A client for interacting with endpoints of the Edison Scientific service.
|
|
5
5
|
Author-email: Edison Scientific technical staff <hello@futurehouse.org>
|
|
6
6
|
License: Apache License
|
|
@@ -19,7 +19,11 @@ from edison_client.models.chat import (
|
|
|
19
19
|
ConversationDetail,
|
|
20
20
|
StoreMessagePayload,
|
|
21
21
|
)
|
|
22
|
-
from edison_client.utils.general import
|
|
22
|
+
from edison_client.utils.general import (
|
|
23
|
+
_BASE_CONNECTION_ERRORS,
|
|
24
|
+
RETRYABLE_HTTP_STATUS_CODES,
|
|
25
|
+
retry_if_connection_error,
|
|
26
|
+
)
|
|
23
27
|
|
|
24
28
|
logger = logging.getLogger(__name__)
|
|
25
29
|
|
|
@@ -49,13 +53,22 @@ class ChatMethods:
|
|
|
49
53
|
"async_client property must be implemented by subclass"
|
|
50
54
|
)
|
|
51
55
|
|
|
52
|
-
def _handle_chat_http_errors(
|
|
56
|
+
def _handle_chat_http_errors( # noqa: PLR6301
|
|
57
|
+
self,
|
|
58
|
+
e: HTTPStatusError,
|
|
59
|
+
operation: str,
|
|
60
|
+
exc_class: type[ChatError] = ChatError,
|
|
61
|
+
) -> NoReturn:
|
|
53
62
|
"""Handle common HTTP errors for chat operations."""
|
|
63
|
+
if e.response.status_code in RETRYABLE_HTTP_STATUS_CODES:
|
|
64
|
+
raise e
|
|
54
65
|
if e.response.status_code == codes.FORBIDDEN:
|
|
55
|
-
raise
|
|
66
|
+
raise exc_class(
|
|
67
|
+
f"Error {operation}: {e.response.status_code} - {e.response.text}"
|
|
68
|
+
) from e
|
|
56
69
|
if e.response.status_code == codes.UNPROCESSABLE_ENTITY:
|
|
57
|
-
raise
|
|
58
|
-
raise
|
|
70
|
+
raise exc_class(f"Invalid request payload: {e.response.text}") from e
|
|
71
|
+
raise exc_class(
|
|
59
72
|
f"Error {operation}: {e.response.status_code} - {e.response.text}"
|
|
60
73
|
) from e
|
|
61
74
|
|
|
@@ -108,6 +121,8 @@ class ChatMethods:
|
|
|
108
121
|
except ChatError:
|
|
109
122
|
raise
|
|
110
123
|
except Exception as e:
|
|
124
|
+
if isinstance(e, _BASE_CONNECTION_ERRORS):
|
|
125
|
+
raise
|
|
111
126
|
raise ChatError(f"An unexpected error occurred: {e!r}") from e
|
|
112
127
|
|
|
113
128
|
@retry(
|
|
@@ -159,6 +174,8 @@ class ChatMethods:
|
|
|
159
174
|
except ChatError:
|
|
160
175
|
raise
|
|
161
176
|
except Exception as e:
|
|
177
|
+
if isinstance(e, _BASE_CONNECTION_ERRORS):
|
|
178
|
+
raise
|
|
162
179
|
raise ChatError(f"An unexpected error occurred: {e!r}") from e
|
|
163
180
|
|
|
164
181
|
@retry(
|
|
@@ -203,6 +220,8 @@ class ChatMethods:
|
|
|
203
220
|
except ChatError:
|
|
204
221
|
raise
|
|
205
222
|
except Exception as e:
|
|
223
|
+
if isinstance(e, _BASE_CONNECTION_ERRORS):
|
|
224
|
+
raise
|
|
206
225
|
raise ChatError(f"An unexpected error occurred: {e!r}") from e
|
|
207
226
|
|
|
208
227
|
@retry(
|
|
@@ -247,6 +266,8 @@ class ChatMethods:
|
|
|
247
266
|
except ChatError:
|
|
248
267
|
raise
|
|
249
268
|
except Exception as e:
|
|
269
|
+
if isinstance(e, _BASE_CONNECTION_ERRORS):
|
|
270
|
+
raise
|
|
250
271
|
raise ChatError(f"An unexpected error occurred: {e!r}") from e
|
|
251
272
|
|
|
252
273
|
@retry(
|
|
@@ -283,10 +304,12 @@ class ChatMethods:
|
|
|
283
304
|
response.raise_for_status()
|
|
284
305
|
return ChatConversationList.model_validate(response.json())
|
|
285
306
|
except HTTPStatusError as e:
|
|
286
|
-
self._handle_chat_http_errors(e, "fetching conversations")
|
|
307
|
+
self._handle_chat_http_errors(e, "fetching conversations", ChatFetchError)
|
|
287
308
|
except ChatError:
|
|
288
309
|
raise
|
|
289
310
|
except Exception as e:
|
|
311
|
+
if isinstance(e, _BASE_CONNECTION_ERRORS):
|
|
312
|
+
raise
|
|
290
313
|
raise ChatFetchError(f"An unexpected error occurred: {e!r}") from e
|
|
291
314
|
|
|
292
315
|
@retry(
|
|
@@ -323,10 +346,12 @@ class ChatMethods:
|
|
|
323
346
|
response.raise_for_status()
|
|
324
347
|
return ChatConversationList.model_validate(response.json())
|
|
325
348
|
except HTTPStatusError as e:
|
|
326
|
-
self._handle_chat_http_errors(e, "fetching conversations")
|
|
349
|
+
self._handle_chat_http_errors(e, "fetching conversations", ChatFetchError)
|
|
327
350
|
except ChatError:
|
|
328
351
|
raise
|
|
329
352
|
except Exception as e:
|
|
353
|
+
if isinstance(e, _BASE_CONNECTION_ERRORS):
|
|
354
|
+
raise
|
|
330
355
|
raise ChatFetchError(f"An unexpected error occurred: {e!r}") from e
|
|
331
356
|
|
|
332
357
|
@retry(
|
|
@@ -352,10 +377,12 @@ class ChatMethods:
|
|
|
352
377
|
response.raise_for_status()
|
|
353
378
|
return ConversationDetail.model_validate(response.json())
|
|
354
379
|
except HTTPStatusError as e:
|
|
355
|
-
self._handle_chat_http_errors(e, "fetching conversation")
|
|
380
|
+
self._handle_chat_http_errors(e, "fetching conversation", ChatFetchError)
|
|
356
381
|
except ChatError:
|
|
357
382
|
raise
|
|
358
383
|
except Exception as e:
|
|
384
|
+
if isinstance(e, _BASE_CONNECTION_ERRORS):
|
|
385
|
+
raise
|
|
359
386
|
raise ChatFetchError(f"An unexpected error occurred: {e!r}") from e
|
|
360
387
|
|
|
361
388
|
@retry(
|
|
@@ -381,10 +408,12 @@ class ChatMethods:
|
|
|
381
408
|
response.raise_for_status()
|
|
382
409
|
return ConversationDetail.model_validate(response.json())
|
|
383
410
|
except HTTPStatusError as e:
|
|
384
|
-
self._handle_chat_http_errors(e, "fetching conversation")
|
|
411
|
+
self._handle_chat_http_errors(e, "fetching conversation", ChatFetchError)
|
|
385
412
|
except ChatError:
|
|
386
413
|
raise
|
|
387
414
|
except Exception as e:
|
|
415
|
+
if isinstance(e, _BASE_CONNECTION_ERRORS):
|
|
416
|
+
raise
|
|
388
417
|
raise ChatFetchError(f"An unexpected error occurred: {e!r}") from e
|
|
389
418
|
|
|
390
419
|
# ── store_conversation_message ─────────────────────────────────────
|
|
@@ -427,6 +456,8 @@ class ChatMethods:
|
|
|
427
456
|
except ChatError:
|
|
428
457
|
raise
|
|
429
458
|
except Exception as e:
|
|
459
|
+
if isinstance(e, _BASE_CONNECTION_ERRORS):
|
|
460
|
+
raise
|
|
430
461
|
raise ChatError(f"An unexpected error occurred: {e!r}") from e
|
|
431
462
|
|
|
432
463
|
@retry(
|
|
@@ -467,4 +498,6 @@ class ChatMethods:
|
|
|
467
498
|
except ChatError:
|
|
468
499
|
raise
|
|
469
500
|
except Exception as e:
|
|
501
|
+
if isinstance(e, _BASE_CONNECTION_ERRORS):
|
|
502
|
+
raise
|
|
470
503
|
raise ChatError(f"An unexpected error occurred: {e!r}") from e
|
{edison_client-0.10.1.dev351 → edison_client-0.10.1.dev352}/src/edison_client/models/chat.py
RENAMED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
from datetime import datetime
|
|
1
2
|
from enum import StrEnum, auto
|
|
2
3
|
from typing import Any
|
|
3
4
|
from uuid import UUID
|
|
@@ -89,8 +90,8 @@ class ChatConversation(BaseModel):
|
|
|
89
90
|
"""A conversation grouped by session."""
|
|
90
91
|
|
|
91
92
|
session_id: UUID = Field(description="The session ID for this conversation")
|
|
92
|
-
created_at:
|
|
93
|
-
description="
|
|
93
|
+
created_at: datetime = Field(
|
|
94
|
+
description="Timestamp when the conversation was created"
|
|
94
95
|
)
|
|
95
96
|
messages: list[Any] = Field(description="The messages in this conversation")
|
|
96
97
|
|
|
@@ -118,9 +119,6 @@ class StoreMessagePayload(BaseModel):
|
|
|
118
119
|
"""Payload for storing a conversation message."""
|
|
119
120
|
|
|
120
121
|
message: dict = Field(description="Message JSON (aviary Message format)")
|
|
121
|
-
session_id: str | None = Field(
|
|
122
|
-
default=None, description="Session ID for the conversation"
|
|
123
|
-
)
|
|
124
122
|
metadata: dict | None = Field(
|
|
125
123
|
default=None, description="Optional metadata to attach to the message"
|
|
126
124
|
)
|
|
@@ -28,7 +28,7 @@ version_tuple: VERSION_TUPLE
|
|
|
28
28
|
commit_id: COMMIT_ID
|
|
29
29
|
__commit_id__: COMMIT_ID
|
|
30
30
|
|
|
31
|
-
__version__ = version = '0.10.1.
|
|
32
|
-
__version_tuple__ = version_tuple = (0, 10, 1, '
|
|
31
|
+
__version__ = version = '0.10.1.dev352'
|
|
32
|
+
__version_tuple__ = version_tuple = (0, 10, 1, 'dev352')
|
|
33
33
|
|
|
34
|
-
__commit_id__ = commit_id = '
|
|
34
|
+
__commit_id__ = commit_id = 'gbbd65e731'
|
{edison_client-0.10.1.dev351 → edison_client-0.10.1.dev352/src/edison_client.egg-info}/PKG-INFO
RENAMED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: edison-client
|
|
3
|
-
Version: 0.10.1.
|
|
3
|
+
Version: 0.10.1.dev352
|
|
4
4
|
Summary: A client for interacting with endpoints of the Edison Scientific service.
|
|
5
5
|
Author-email: Edison Scientific technical staff <hello@futurehouse.org>
|
|
6
6
|
License: Apache License
|
|
@@ -4,7 +4,7 @@ from uuid import UUID, uuid4
|
|
|
4
4
|
|
|
5
5
|
import pytest
|
|
6
6
|
|
|
7
|
-
from edison_client.clients.chat_methods import ChatError
|
|
7
|
+
from edison_client.clients.chat_methods import ChatError, ChatFetchError
|
|
8
8
|
from edison_client.clients.rest_client import RestClient
|
|
9
9
|
from edison_client.models.chat import (
|
|
10
10
|
ChatConversationList,
|
|
@@ -120,7 +120,7 @@ class TestSyncChatLifecycle:
|
|
|
120
120
|
|
|
121
121
|
def test_get_conversation_not_found(self, admin_client: RestClient):
|
|
122
122
|
"""Fetching a non-existent session returns 404."""
|
|
123
|
-
with pytest.raises(
|
|
123
|
+
with pytest.raises(ChatFetchError, match="404") as exc_info:
|
|
124
124
|
admin_client.get_conversation(uuid4())
|
|
125
125
|
assert "not found" in str(exc_info.value).lower()
|
|
126
126
|
|
|
@@ -233,7 +233,7 @@ class TestAsyncChatLifecycle:
|
|
|
233
233
|
@pytest.mark.asyncio
|
|
234
234
|
async def test_aget_conversation_not_found(self, admin_client: RestClient):
|
|
235
235
|
"""Fetching a non-existent session returns 404 (async)."""
|
|
236
|
-
with pytest.raises(
|
|
236
|
+
with pytest.raises(ChatFetchError, match="404") as exc_info:
|
|
237
237
|
await admin_client.aget_conversation(uuid4())
|
|
238
238
|
assert "not found" in str(exc_info.value).lower()
|
|
239
239
|
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{edison_client-0.10.1.dev351 → edison_client-0.10.1.dev352}/src/edison_client/clients/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
{edison_client-0.10.1.dev351 → edison_client-0.10.1.dev352}/src/edison_client/clients/job_client.py
RENAMED
|
File without changes
|
{edison_client-0.10.1.dev351 → edison_client-0.10.1.dev352}/src/edison_client/clients/rest_client.py
RENAMED
|
File without changes
|
{edison_client-0.10.1.dev351 → edison_client-0.10.1.dev352}/src/edison_client/models/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
{edison_client-0.10.1.dev351 → edison_client-0.10.1.dev352}/src/edison_client/models/client.py
RENAMED
|
File without changes
|
|
File without changes
|
{edison_client-0.10.1.dev351 → edison_client-0.10.1.dev352}/src/edison_client/models/job_event.py
RENAMED
|
File without changes
|
{edison_client-0.10.1.dev351 → edison_client-0.10.1.dev352}/src/edison_client/models/rest.py
RENAMED
|
File without changes
|
|
File without changes
|
{edison_client-0.10.1.dev351 → edison_client-0.10.1.dev352}/src/edison_client/utils/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
{edison_client-0.10.1.dev351 → edison_client-0.10.1.dev352}/src/edison_client/utils/general.py
RENAMED
|
File without changes
|
{edison_client-0.10.1.dev351 → edison_client-0.10.1.dev352}/src/edison_client/utils/module_utils.py
RENAMED
|
File without changes
|
{edison_client-0.10.1.dev351 → edison_client-0.10.1.dev352}/src/edison_client/utils/monitoring.py
RENAMED
|
File without changes
|
|
File without changes
|
{edison_client-0.10.1.dev351 → edison_client-0.10.1.dev352}/src/edison_client.egg-info/SOURCES.txt
RENAMED
|
File without changes
|
|
File without changes
|
{edison_client-0.10.1.dev351 → edison_client-0.10.1.dev352}/src/edison_client.egg-info/requires.txt
RENAMED
|
File without changes
|
{edison_client-0.10.1.dev351 → edison_client-0.10.1.dev352}/src/edison_client.egg-info/top_level.txt
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{edison_client-0.10.1.dev351 → edison_client-0.10.1.dev352}/tests/test_data/test_information.txt
RENAMED
|
File without changes
|
{edison_client-0.10.1.dev351 → edison_client-0.10.1.dev352}/tests/test_data/test_manifest.yaml
RENAMED
|
File without changes
|
|
File without changes
|
{edison_client-0.10.1.dev351 → edison_client-0.10.1.dev352}/tests/test_data_storage_methods.py
RENAMED
|
File without changes
|
{edison_client-0.10.1.dev351 → edison_client-0.10.1.dev352}/tests/test_dss_restclient_api_e2e.py
RENAMED
|
File without changes
|
{edison_client-0.10.1.dev351 → edison_client-0.10.1.dev352}/tests/test_min_replicas_validation.py
RENAMED
|
File without changes
|
|
File without changes
|
{edison_client-0.10.1.dev351 → edison_client-0.10.1.dev352}/tests/test_similarity_search_e2e.py
RENAMED
|
File without changes
|
|
File without changes
|