Hacktoberfest 2026: los issues que los mantenedores marcaron para octubre, abiertos y aptos para principiantes. Explorar issues de Hacktoberfest

RestateModelWrapper should not wrap `SdkInternalBaseException` as generic Exception; classify non-retryable provider errors as terminal

Abierto
#225 0 comentarios 0 reacciones 0 asignados Ver en GitHub

@1fanwang ya está trabajando en esto.

Desde el 25/9/2026.

  • #233 de @1fanwang — abierto

Evaluación

Dificultad
4/5
Tiempo estimado
3-5 días
Aptitud para principiantes
48/100
Tipo de issue
Error
Claridad
Bastante claro
Estado de actividad
Tranquilo
Stack tecnológico
python
Área
ai, backend

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

  1. Lee el issue completo y luego la guía de contribución del proyecto.
  2. Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
  3. Haz un fork del repositorio y trabaja en una rama.
  4. Abre un pull request que haga referencia al número del issue.

Más de restatedev/sdk-python

Todos los issues de restatedev/sdk-python

Issues similares

Más issues de Python

Recibe los nuevos issues en tu correo

Un resumen breve de issues de GitHub para principiantes.