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.
Files changed (53) hide show
  1. {edison_client-0.10.1.dev351/src/edison_client.egg-info → edison_client-0.10.1.dev352}/PKG-INFO +1 -1
  2. {edison_client-0.10.1.dev351 → edison_client-0.10.1.dev352}/src/edison_client/clients/chat_methods.py +42 -9
  3. {edison_client-0.10.1.dev351 → edison_client-0.10.1.dev352}/src/edison_client/models/chat.py +3 -5
  4. {edison_client-0.10.1.dev351 → edison_client-0.10.1.dev352}/src/edison_client/version.py +3 -3
  5. {edison_client-0.10.1.dev351 → edison_client-0.10.1.dev352/src/edison_client.egg-info}/PKG-INFO +1 -1
  6. {edison_client-0.10.1.dev351 → edison_client-0.10.1.dev352}/tests/test_chat_methods.py +3 -3
  7. {edison_client-0.10.1.dev351 → edison_client-0.10.1.dev352}/.gitignore +0 -0
  8. {edison_client-0.10.1.dev351 → edison_client-0.10.1.dev352}/AGENTS.md +0 -0
  9. {edison_client-0.10.1.dev351 → edison_client-0.10.1.dev352}/LICENSE +0 -0
  10. {edison_client-0.10.1.dev351 → edison_client-0.10.1.dev352}/README.md +0 -0
  11. {edison_client-0.10.1.dev351 → edison_client-0.10.1.dev352}/data_storage.md +0 -0
  12. {edison_client-0.10.1.dev351 → edison_client-0.10.1.dev352}/docs/__init__.py +0 -0
  13. {edison_client-0.10.1.dev351 → edison_client-0.10.1.dev352}/docs/client_notebook.ipynb +0 -0
  14. {edison_client-0.10.1.dev351 → edison_client-0.10.1.dev352}/docs/data_storage_service.puml +0 -0
  15. {edison_client-0.10.1.dev351 → edison_client-0.10.1.dev352}/docs/dss_x_finch.png +0 -0
  16. {edison_client-0.10.1.dev351 → edison_client-0.10.1.dev352}/pyproject.toml +0 -0
  17. {edison_client-0.10.1.dev351 → edison_client-0.10.1.dev352}/setup.cfg +0 -0
  18. {edison_client-0.10.1.dev351 → edison_client-0.10.1.dev352}/src/edison_client/__init__.py +0 -0
  19. {edison_client-0.10.1.dev351 → edison_client-0.10.1.dev352}/src/edison_client/clients/__init__.py +0 -0
  20. {edison_client-0.10.1.dev351 → edison_client-0.10.1.dev352}/src/edison_client/clients/data_storage_methods.py +0 -0
  21. {edison_client-0.10.1.dev351 → edison_client-0.10.1.dev352}/src/edison_client/clients/job_client.py +0 -0
  22. {edison_client-0.10.1.dev351 → edison_client-0.10.1.dev352}/src/edison_client/clients/rest_client.py +0 -0
  23. {edison_client-0.10.1.dev351 → edison_client-0.10.1.dev352}/src/edison_client/models/__init__.py +0 -0
  24. {edison_client-0.10.1.dev351 → edison_client-0.10.1.dev352}/src/edison_client/models/app.py +0 -0
  25. {edison_client-0.10.1.dev351 → edison_client-0.10.1.dev352}/src/edison_client/models/client.py +0 -0
  26. {edison_client-0.10.1.dev351 → edison_client-0.10.1.dev352}/src/edison_client/models/data_storage_methods.py +0 -0
  27. {edison_client-0.10.1.dev351 → edison_client-0.10.1.dev352}/src/edison_client/models/job_event.py +0 -0
  28. {edison_client-0.10.1.dev351 → edison_client-0.10.1.dev352}/src/edison_client/models/rest.py +0 -0
  29. {edison_client-0.10.1.dev351 → edison_client-0.10.1.dev352}/src/edison_client/py.typed +0 -0
  30. {edison_client-0.10.1.dev351 → edison_client-0.10.1.dev352}/src/edison_client/utils/__init__.py +0 -0
  31. {edison_client-0.10.1.dev351 → edison_client-0.10.1.dev352}/src/edison_client/utils/auth.py +0 -0
  32. {edison_client-0.10.1.dev351 → edison_client-0.10.1.dev352}/src/edison_client/utils/general.py +0 -0
  33. {edison_client-0.10.1.dev351 → edison_client-0.10.1.dev352}/src/edison_client/utils/module_utils.py +0 -0
  34. {edison_client-0.10.1.dev351 → edison_client-0.10.1.dev352}/src/edison_client/utils/monitoring.py +0 -0
  35. {edison_client-0.10.1.dev351 → edison_client-0.10.1.dev352}/src/edison_client/utils/world_model_tools.py +0 -0
  36. {edison_client-0.10.1.dev351 → edison_client-0.10.1.dev352}/src/edison_client.egg-info/SOURCES.txt +0 -0
  37. {edison_client-0.10.1.dev351 → edison_client-0.10.1.dev352}/src/edison_client.egg-info/dependency_links.txt +0 -0
  38. {edison_client-0.10.1.dev351 → edison_client-0.10.1.dev352}/src/edison_client.egg-info/requires.txt +0 -0
  39. {edison_client-0.10.1.dev351 → edison_client-0.10.1.dev352}/src/edison_client.egg-info/top_level.txt +0 -0
  40. {edison_client-0.10.1.dev351 → edison_client-0.10.1.dev352}/tests/client_e2e_uploaded_file_trajectory_test.py +0 -0
  41. {edison_client-0.10.1.dev351 → edison_client-0.10.1.dev352}/tests/conftest.py +0 -0
  42. {edison_client-0.10.1.dev351 → edison_client-0.10.1.dev352}/tests/test_client.py +0 -0
  43. {edison_client-0.10.1.dev351 → edison_client-0.10.1.dev352}/tests/test_client_close.py +0 -0
  44. {edison_client-0.10.1.dev351 → edison_client-0.10.1.dev352}/tests/test_data/test_file.txt +0 -0
  45. {edison_client-0.10.1.dev351 → edison_client-0.10.1.dev352}/tests/test_data/test_information.txt +0 -0
  46. {edison_client-0.10.1.dev351 → edison_client-0.10.1.dev352}/tests/test_data/test_manifest.yaml +0 -0
  47. {edison_client-0.10.1.dev351 → edison_client-0.10.1.dev352}/tests/test_data_storage_e2e.py +0 -0
  48. {edison_client-0.10.1.dev351 → edison_client-0.10.1.dev352}/tests/test_data_storage_methods.py +0 -0
  49. {edison_client-0.10.1.dev351 → edison_client-0.10.1.dev352}/tests/test_dss_restclient_api_e2e.py +0 -0
  50. {edison_client-0.10.1.dev351 → edison_client-0.10.1.dev352}/tests/test_min_replicas_validation.py +0 -0
  51. {edison_client-0.10.1.dev351 → edison_client-0.10.1.dev352}/tests/test_rest.py +0 -0
  52. {edison_client-0.10.1.dev351 → edison_client-0.10.1.dev352}/tests/test_similarity_search_e2e.py +0 -0
  53. {edison_client-0.10.1.dev351 → edison_client-0.10.1.dev352}/tests/test_world_model_e2e.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: edison-client
3
- Version: 0.10.1.dev351
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 retry_if_connection_error
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(self, e: HTTPStatusError, operation: str) -> NoReturn: # noqa: PLR6301
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 ChatError(f"Error {operation}: not authorized") from e
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 ChatError(f"Invalid request payload: {e.response.text}") from e
58
- raise ChatError(
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
@@ -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: str = Field(
93
- description="ISO timestamp when the conversation was created"
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.dev351'
32
- __version_tuple__ = version_tuple = (0, 10, 1, 'dev351')
31
+ __version__ = version = '0.10.1.dev352'
32
+ __version_tuple__ = version_tuple = (0, 10, 1, 'dev352')
33
33
 
34
- __commit_id__ = commit_id = 'g1a73d2e50'
34
+ __commit_id__ = commit_id = 'gbbd65e731'
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: edison-client
3
- Version: 0.10.1.dev351
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(ChatError, match="404") as exc_info:
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(ChatError, match="404") as exc_info:
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