RestateModelWrapper should not wrap `SdkInternalBaseException` as generic Exception; classify non-retryable provider errors as terminal
Evaluación
- Dificultad
- 4/5
- Tiempo estimado
- 3-5 días
- Aptitud para principiantes
- 48/100
Línea de trabajo
Comienza en RestateModelWrapper y sigue el manejo de SdkInternalBaseException a través de los journaled model steps y los provider failures. Compara el comportamiento con las directrices enlazadas sobre el manejo de errores en Python y la integración de AI. Se considera terminado cuando las excepciones internas se vuelven a lanzar sin cambios, los provider 4xx failures no reintentables se convierten en terminales, los estados reintentables siguen RunOptions y la policy o el hook seleccionado queda documentado.
Escrito por el modelo de indexación a partir del texto del issue.
Descripción
When a journaled model step fails, Restate correctly uses SdkInternalException for replay control flow. The wrapper then does:
except SdkInternalBaseException as e:
raise Exception("Internal error during model call") from e
This conflicts with Restate’s Python error-handling guidance (re-raise internal exceptions; don’t catch them as generic Exception). Integrators must walk __cause__ chains to recover semantics.
For LLM provider non-retryable 4xx (e.g. invalid tool schema → HTTP 400), the failure should be TerminalError inside the journaled step, not a retryable transient. Otherwise Restate retries permanently invalid requests—contrary to the AI integration guide (“handle terminal errors”, bound LLM retries).
Proposed behavior:
except SdkInternalBaseException as e:
if isinstance(e, SuspendedException):
raise
# Optional: inspect e.__cause__ for provider HTTP errors
if is_non_retryable_provider_4xx(e.__cause__):
raise TerminalError("Model request rejected by provider", status_code=400) from e.__cause__
raise # re-raise SdkInternalBaseException unchanged — do NOT wrap in Exception(...)
Policy suggestion for upstream defaults:
| Provider status | Treatment |
|---|---|
| 400, 401, 403, 404, 422, … | TerminalError (non-retryable) |
| 408, 429 | Retryable (existing transient path) |
| 5xx | Retryable per RunOptions |
Proposals:
- Stop wrapping SdkInternalBaseException in generic Exception.
- Either adopt a default provider-status policy or expose a hook on RestateAgent / RestateModelWrapper for classifying model failures before journaling.
- Document recommended RunOptions(max_attempts=…) for LLM journal steps.
- Lenguaje dominante
- Python
- Estrellas
- 82
- Forks
- 24
- Merge medio
- 13 min
- PR fusionados (30 d)
- 1
Preparar el entorno
Este proyecto no incluye contenedor de desarrollo, Dockerfile ni guía de contribución, así que la configuración corre por tu cuenta: empieza por su README y consulta nuestra guía para la primera contribución para los pasos generales.
Primeros pasos
- Lee el issue completo y luego la guía de contribución del proyecto.
- Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
- Haz un fork del repositorio y trabaja en una rama.
- Abre un pull request que haga referencia al número del issue.
Más de restatedev/sdk-python
-
pydantic ext: request_stream() never initializes the turnstile — KeyError('call_...') on first tool call of a streamed runPosiblemente ocupada @QuocThuanTruong la tomó hace 70 días. Abierto
Dificultad 2/5 1-3 horas Aptitud para principiantes 76/100
restatedev/sdk-python#223 · 1 comentario ·
-
Dificultad 2/5 1-2 días Aptitud para principiantes 68/100
restatedev/sdk-python#204 · 1 comentario ·
-
pydantic ext: auto_wrap_tools + async event_stream_handler crashes with 'Object of type coroutine is not JSON serializable' on first tool callPosiblemente ocupada Un pull request vinculado a esta issue está abierto o ya se fusionó. Abierto
Dificultad 3/5 1-2 días Aptitud para principiantes 68/100
restatedev/sdk-python#222 · 1 comentario ·
-
Dificultad 3/5 1-2 días Aptitud para principiantes 68/100
restatedev/sdk-python#221 ·
-
Dificultad 4/5 3-5 días Aptitud para principiantes 38/100
restatedev/sdk-python#205 · 1 comentario ·
Todos los issues de restatedev/sdk-python
Issues similares
-
feature:LinkChecker
Dificultad 2/5 1-3 horas Aptitud para principiantes 66/100
digitalfabrik/integreat-cms#4594 ·
Los mantenedores suelen responder en 5 días
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 78/100
Los mantenedores suelen responder en 1 día
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 70/100
EleutherAI/lm-evaluation-harness#4319 ·
Los mantenedores suelen responder en 1 día
-
needs triage
Dificultad 2/5 1-3 horas Aptitud para principiantes 76/100
Los mantenedores suelen responder en 1 día
-
json_params_matcher fails on falsy top-level JSON primitives (0, False, "")Posiblemente ocupada @mayureshsonawane17 la tomó hoy. AbiertoWaiting for: Product Owner
Dificultad 2/5 1-3 horas Aptitud para principiantes 84/100
Los mantenedores suelen responder en 5 días