Skip to content

Commit abc20e3

Browse files
committed
fix(api): preserve workflow failure chaining
1 parent feb4153 commit abc20e3

2 files changed

Lines changed: 29 additions & 5 deletions

File tree

src/cas_reference_product/app.py

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,10 @@
1313
_tracer = trace.get_tracer(__name__)
1414

1515

16+
def _raise_workflow_backend_failure(error: WorkflowAgentServiceError) -> None:
17+
raise HTTPException(status_code=502, detail="Workflow backend request failed") from error
18+
19+
1620
def create_app(settings: Settings | None = None) -> FastAPI:
1721
app_settings = settings or get_settings()
1822

@@ -55,7 +59,7 @@ def execute(envelope: PromptEnvelope, request: Request) -> WorkflowResult:
5559
orchestrator = WorkflowOrchestrator(service, app_settings.repository)
5660
try:
5761
result = orchestrator.execute(envelope)
58-
except WorkflowAgentServiceError:
62+
except WorkflowAgentServiceError as error:
5963
span.add_event(
6064
"workflow.failed",
6165
attributes={
@@ -64,9 +68,7 @@ def execute(envelope: PromptEnvelope, request: Request) -> WorkflowResult:
6468
"error": True,
6569
},
6670
)
67-
raise HTTPException(
68-
status_code=502, detail="Workflow backend request failed"
69-
) from None
71+
_raise_workflow_backend_failure(error)
7072
span.add_event(
7173
"workflow.completed",
7274
attributes={

tests/test_api.py

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
11
from typing import Any
22
from unittest.mock import patch
33

4+
import pytest
5+
from fastapi import HTTPException
46
from fastapi.testclient import TestClient
57

6-
from cas_reference_product.app import create_app
8+
from cas_reference_product.app import _raise_workflow_backend_failure, create_app
79
from cas_reference_product.config import Settings
810
from cas_reference_product.workflow import WorkflowAgentServiceError
911

@@ -69,3 +71,23 @@ def test_workflow_api_sanitizes_external_service_failures(envelope: "Any") -> No
6971
assert response.status_code == 502
7072
assert response.json() == {"detail": "Workflow backend request failed"}
7173
assert "sensitive" not in response.text
74+
75+
76+
def test_workflow_backend_failure_preserves_exception_chain() -> None:
77+
with pytest.raises(HTTPException) as caught:
78+
try:
79+
raise RuntimeError("sensitive provider detail")
80+
except RuntimeError as provider_error:
81+
try:
82+
raise WorkflowAgentServiceError("Foundry workflow invocation failed") from (
83+
provider_error
84+
)
85+
except WorkflowAgentServiceError as workflow_error:
86+
_raise_workflow_backend_failure(workflow_error)
87+
88+
assert caught.value.status_code == 502
89+
assert caught.value.detail == "Workflow backend request failed"
90+
assert isinstance(caught.value.__cause__, WorkflowAgentServiceError)
91+
assert str(caught.value.__cause__) == "Foundry workflow invocation failed"
92+
assert isinstance(caught.value.__cause__.__cause__, RuntimeError)
93+
assert str(caught.value.__cause__.__cause__) == "sensitive provider detail"

0 commit comments

Comments
 (0)