Skip to content

Commit 8e05b65

Browse files
authored
fix: pipeline logs containing exceptions (#74)
1 parent b085791 commit 8e05b65

5 files changed

Lines changed: 35 additions & 6 deletions

File tree

src/deepset_mcp/api/pipeline/models.py

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,22 @@ class NoContentResponse(BaseModel):
6262
message: str = "No content"
6363

6464

65+
class TraceFrame(BaseModel):
66+
"""Model representing a single frame in a stack trace."""
67+
68+
filename: str
69+
line_number: int
70+
name: str
71+
72+
73+
class ExceptionInfo(BaseModel):
74+
"""Model representing exception information."""
75+
76+
type: str
77+
value: str
78+
trace: list[TraceFrame]
79+
80+
6581
class PipelineLog(BaseModel):
6682
"""Model representing a single log entry from a pipeline."""
6783

@@ -70,7 +86,7 @@ class PipelineLog(BaseModel):
7086
logged_at: datetime
7187
level: str
7288
origin: str
73-
exceptions: str | None = None
89+
exceptions: list[ExceptionInfo] | None = None
7490
extra_fields: dict[str, Any] = Field(default_factory=dict)
7591

7692

src/deepset_mcp/api/pipeline/resource.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import logging
12
from typing import TYPE_CHECKING, Any
23

34
from deepset_mcp.api.exceptions import UnexpectedAPIError
@@ -11,6 +12,8 @@
1112
)
1213
from deepset_mcp.api.transport import raise_for_status
1314

15+
logger = logging.getLogger(__name__)
16+
1417
if TYPE_CHECKING:
1518
from deepset_mcp.api.protocols import AsyncClientProtocol
1619

@@ -199,6 +202,8 @@ async def get_logs(
199202
params=params,
200203
)
201204

205+
logger.warning(resp.json)
206+
202207
raise_for_status(resp)
203208

204209
if resp.json is not None:

src/deepset_mcp/tools/formatting_utils.py

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -124,7 +124,13 @@ def pipeline_logs_to_llm_readable_string(logs: PipelineLogList, pipeline_name: s
124124
]
125125

126126
if log.exceptions:
127-
log_entry.append(f"- **Exceptions:** {log.exceptions}")
127+
log_entry.append("- **Exceptions:**")
128+
for exception in log.exceptions:
129+
log_entry.append(f"- Type: {exception.type}")
130+
log_entry.append(f"- Value: {exception.value}")
131+
log_entry.append("- Traceback")
132+
for frame in exception.trace:
133+
log_entry.append(f"- {frame.name} in line {frame.line_number} in file {frame.filename}")
128134

129135
if log.extra_fields:
130136
log_entry.append("- **Extra Fields:")

test/unit/tools/test_formatting_utils.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
from datetime import datetime
22

33
from deepset_mcp.api.pipeline.models import (
4+
ExceptionInfo,
45
PipelineLog,
56
PipelineLogList,
67
PipelineValidationResult,
@@ -29,7 +30,7 @@ def test_pipeline_logs_to_llm_readable_string_with_logs() -> None:
2930
logged_at=datetime(2023, 1, 1, 12, 1, 30),
3031
level="error",
3132
origin="querypipeline",
32-
exceptions="ValueError: Invalid document format",
33+
exceptions=[ExceptionInfo(type="bla", value="bla", trace=[])],
3334
extra_fields={"component": "document_reader", "file_name": "test.pdf"},
3435
)
3536

@@ -55,7 +56,7 @@ def test_pipeline_logs_to_llm_readable_string_with_logs() -> None:
5556
assert "**Timestamp:** January 01, 2023 12:01:30 PM" in result
5657
assert "**Level:** error" in result
5758
assert "**Message:** Error processing document" in result
58-
assert "**Exceptions:** ValueError: Invalid document format" in result
59+
assert "**Exceptions:**" in result
5960
assert "component: document_reader" in result
6061
assert "file_name: test.pdf" in result
6162

test/unit/tools/test_pipeline.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
from deepset_mcp.api.pipeline.log_level import LogLevel
1111
from deepset_mcp.api.pipeline.models import (
1212
DeepsetPipeline,
13+
ExceptionInfo,
1314
NoContentResponse,
1415
PipelineLog,
1516
PipelineLogList,
@@ -446,7 +447,7 @@ async def test_get_pipeline_logs_success() -> None:
446447
logged_at=datetime(2023, 1, 1, 12, 1, 0),
447448
level="error",
448449
origin="querypipeline",
449-
exceptions="ValueError: test error",
450+
exceptions=[ExceptionInfo(type="bla", value="bla", trace=[])],
450451
extra_fields={"component": "reader"},
451452
)
452453
logs = PipelineLogList(data=[log1, log2], has_more=False, total=2)
@@ -461,7 +462,7 @@ async def test_get_pipeline_logs_success() -> None:
461462
assert "Error occurred" in result
462463
assert "**Level:** info" in result
463464
assert "**Level:** error" in result
464-
assert "**Exceptions:** ValueError: test error" in result
465+
assert "**Exceptions:**" in result
465466
assert "component: reader" in result
466467

467468

0 commit comments

Comments
 (0)