Skip to content

Commit ed6d019

Browse files
authored
feat: use StrEnum for pipeline log level filtering (#65)
* feat: add LogLevel StrEnum for pipeline log filtering * feat: import LogLevel enum * feat: update get_logs method to use LogLevel enum * feat: import LogLevel enum in pipeline tools * feat: update get_pipeline_logs to use LogLevel enum * feat: import LogLevel enum in main module * feat: update MCP tool to convert string level to LogLevel enum * feat: import LogLevel enum in pipeline tests * feat: update fake resource method signature to use LogLevel enum * feat: update test to use LogLevel enum * feat: import LogLevel enum in pipeline resource tests * feat: update unit test to use LogLevel enum * feat: update unit test for warning level to use LogLevel enum * feat: import LogLevel enum in integration tests * fix: format and lint and types
1 parent 6623eff commit ed6d019

7 files changed

Lines changed: 34 additions & 10 deletions

File tree

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
from enum import StrEnum
2+
3+
4+
class LogLevel(StrEnum):
5+
"""Log level filter options for pipeline logs."""
6+
7+
INFO = "info"
8+
WARNING = "warning"
9+
ERROR = "error"

src/deepset_mcp/api/pipeline/resource.py

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

33
from deepset_mcp.api.exceptions import UnexpectedAPIError
4+
from deepset_mcp.api.pipeline.log_level import LogLevel
45
from deepset_mcp.api.pipeline.models import (
56
DeepsetPipeline,
67
NoContentResponse,
@@ -173,13 +174,13 @@ async def get_logs(
173174
self,
174175
pipeline_name: str,
175176
limit: int = 30,
176-
level: str | None = None,
177+
level: LogLevel | None = None,
177178
) -> PipelineLogList:
178179
"""Fetch logs for a specific pipeline.
179180
180181
:param pipeline_name: Name of the pipeline to fetch logs for.
181182
:param limit: Maximum number of log entries to return.
182-
:param level: Filter logs by level (info, warning, error). If None, returns all levels.
183+
:param level: Filter logs by level. If None, returns all levels.
183184
184185
:returns: A PipelineLogList containing the log entries.
185186
"""

src/deepset_mcp/api/protocols.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
from typing import Any, Protocol, Self, TypeVar, overload
33

44
from deepset_mcp.api.indexes.models import Index, IndexList
5+
from deepset_mcp.api.pipeline.log_level import LogLevel
56
from deepset_mcp.api.pipeline.models import (
67
DeepsetPipeline,
78
NoContentResponse,
@@ -182,7 +183,7 @@ async def get_logs(
182183
self,
183184
pipeline_name: str,
184185
limit: int = 30,
185-
level: str | None = None,
186+
level: LogLevel | None = None,
186187
) -> PipelineLogList:
187188
"""Fetch logs for a specific pipeline."""
188189
...

src/deepset_mcp/main.py

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
from model2vec import StaticModel
77

88
from deepset_mcp.api.client import AsyncDeepsetClient
9+
from deepset_mcp.api.pipeline.log_level import LogLevel
910
from deepset_mcp.tools.haystack_service import (
1011
get_component_definition as get_component_definition_tool,
1112
list_component_families as list_component_families_tool,
@@ -309,13 +310,22 @@ async def get_pipeline_logs(pipeline_name: str, limit: int = 30, level: str | No
309310
:param level: Filter logs by level. Valid values: 'info', 'warning', 'error'. If not specified, returns all levels.
310311
"""
311312
workspace = get_workspace()
313+
314+
# Convert string level to LogLevel enum if provided
315+
log_level: LogLevel | None = None
316+
if level is not None:
317+
try:
318+
log_level = LogLevel(level)
319+
except ValueError:
320+
return f"Invalid log level '{level}'. Valid values are: 'info', 'warning', 'error'."
321+
312322
async with AsyncDeepsetClient() as client:
313323
response = await get_pipeline_logs_tool(
314324
client=client,
315325
workspace=workspace,
316326
pipeline_name=pipeline_name,
317327
limit=limit,
318-
level=level,
328+
level=log_level,
319329
)
320330
return response
321331

src/deepset_mcp/tools/pipeline.py

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

33
from deepset_mcp.api.exceptions import BadRequestError, ResourceNotFoundError, UnexpectedAPIError
4+
from deepset_mcp.api.pipeline.log_level import LogLevel
45
from deepset_mcp.api.protocols import AsyncClientProtocol
56
from deepset_mcp.tools.formatting_utils import pipeline_to_llm_readable_string, validation_result_to_llm_readable_string
67

@@ -116,7 +117,7 @@ async def get_pipeline_logs(
116117
workspace: str,
117118
pipeline_name: str,
118119
limit: int = 30,
119-
level: str | None = None,
120+
level: LogLevel | None = None,
120121
) -> str:
121122
"""Fetches logs for a specific pipeline.
122123
@@ -127,7 +128,7 @@ async def get_pipeline_logs(
127128
:param workspace: The workspace name.
128129
:param pipeline_name: Name of the pipeline to fetch logs for.
129130
:param limit: Maximum number of log entries to return (default: 30).
130-
:param level: Filter logs by level (info, warning, error). If None, returns all levels.
131+
:param level: Filter logs by level. If None, returns all levels.
131132
132133
:returns: A formatted string containing the pipeline logs.
133134
"""

test/unit/api/pipeline/test_pipeline_resource.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import pytest
44

55
from deepset_mcp.api.exceptions import UnexpectedAPIError
6+
from deepset_mcp.api.pipeline.log_level import LogLevel
67
from deepset_mcp.api.pipeline.models import (
78
DeepsetPipeline,
89
PipelineLog,
@@ -717,7 +718,7 @@ async def test_get_logs_with_level_filter(self) -> None:
717718

718719
# Create resource and call get_logs method with level filter
719720
resource = PipelineResource(client=client, workspace="test-workspace")
720-
result = await resource.get_logs(pipeline_name="test-pipeline", level="error")
721+
result = await resource.get_logs(pipeline_name="test-pipeline", level=LogLevel.ERROR)
721722

722723
# Verify results
723724
assert len(result.data) == 2
@@ -747,7 +748,7 @@ async def test_get_logs_with_warning_level(self) -> None:
747748

748749
# Create resource and call get_logs method with warning level
749750
resource = PipelineResource(client=client, workspace="test-workspace")
750-
result = await resource.get_logs(pipeline_name="test-pipeline", level="warning")
751+
result = await resource.get_logs(pipeline_name="test-pipeline", level=LogLevel.WARNING)
751752

752753
# Verify results
753754
assert len(result.data) == 1

test/unit/tools/test_pipeline.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
ResourceNotFoundError,
88
UnexpectedAPIError,
99
)
10+
from deepset_mcp.api.pipeline.log_level import LogLevel
1011
from deepset_mcp.api.pipeline.models import (
1112
DeepsetPipeline,
1213
NoContentResponse,
@@ -96,7 +97,7 @@ async def get_logs(
9697
self,
9798
pipeline_name: str,
9899
limit: int = 30,
99-
level: str | None = None,
100+
level: LogLevel | None = None,
100101
) -> PipelineLogList:
101102
if self._logs_exception:
102103
raise self._logs_exception
@@ -471,7 +472,7 @@ async def test_get_pipeline_logs_with_level_filter() -> None:
471472
resource = FakePipelineResource(logs_response=logs)
472473
client = FakeClient(resource)
473474

474-
result = await get_pipeline_logs(client, workspace="ws", pipeline_name="test-pipeline", level="error")
475+
result = await get_pipeline_logs(client, workspace="ws", pipeline_name="test-pipeline", level=LogLevel.ERROR)
475476

476477
assert "No logs found for pipeline 'test-pipeline' (filtered by level: error)" in result
477478

0 commit comments

Comments
 (0)