66import logging
77from collections .abc import AsyncIterator
88from typing import TYPE_CHECKING , Any
9+ from urllib .parse import quote
910
1011from deepset_mcp .api .exceptions import UnexpectedAPIError
11- from deepset_mcp .api .pipeline .log_level import LogLevel
1212from deepset_mcp .api .pipeline .models import (
1313 DeepsetPipeline ,
1414 DeepsetSearchResponse ,
1515 DeepsetStreamEvent ,
16+ LogLevel ,
1617 PipelineList ,
1718 PipelineLogList ,
1819 PipelineValidationResult ,
2930
3031
3132class PipelineResource (PipelineResourceProtocol ):
32- """Manages interactions with the deepset pipeline API ."""
33+ """Interact with pipelines on the deepset AI platform ."""
3334
3435 def __init__ (
3536 self ,
@@ -54,7 +55,7 @@ async def validate(self, yaml_config: str) -> PipelineValidationResult:
5455 data = {"query_yaml" : yaml_config }
5556
5657 resp = await self ._client .request (
57- endpoint = f"v1/workspaces/{ self ._workspace } /pipeline_validations" ,
58+ endpoint = f"v1/workspaces/{ quote ( self ._workspace , safe = '' ) } /pipeline_validations" ,
5859 method = "POST" ,
5960 data = data ,
6061 )
@@ -92,7 +93,7 @@ async def list(
9293 }
9394
9495 resp = await self ._client .request (
95- endpoint = f"v1/workspaces/{ self ._workspace } /pipelines" ,
96+ endpoint = f"v1/workspaces/{ quote ( self ._workspace , safe = '' ) } /pipelines" ,
9697 method = "GET" ,
9798 params = params ,
9899 )
@@ -118,14 +119,18 @@ async def get(self, pipeline_name: str, include_yaml: bool = True) -> DeepsetPip
118119 :param include_yaml: Whether to include YAML configuration in the response.
119120 :returns: DeepsetPipeline instance.
120121 """
121- resp = await self ._client .request (endpoint = f"v1/workspaces/{ self ._workspace } /pipelines/{ pipeline_name } " )
122+ resp = await self ._client .request (
123+ endpoint = f"v1/workspaces/{ quote (self ._workspace , safe = '' )} /pipelines/{ quote (pipeline_name , safe = '' )} "
124+ )
122125 raise_for_status (resp )
123126
124127 pipeline = DeepsetPipeline .model_validate (resp .json )
125128
126129 if include_yaml :
127130 yaml_response = await self ._client .request (
128- endpoint = f"v1/workspaces/{ self ._workspace } /pipelines/{ pipeline_name } /yaml"
131+ endpoint = (
132+ f"v1/workspaces/{ quote (self ._workspace , safe = '' )} /pipelines/{ quote (pipeline_name , safe = '' )} /yaml"
133+ )
129134 )
130135
131136 raise_for_status (yaml_response )
@@ -135,16 +140,16 @@ async def get(self, pipeline_name: str, include_yaml: bool = True) -> DeepsetPip
135140
136141 return pipeline
137142
138- async def create (self , name : str , yaml_config : str ) -> NoContentResponse :
143+ async def create (self , pipeline_name : str , yaml_config : str ) -> NoContentResponse :
139144 """Create a new pipeline with a name and YAML config.
140145
141- :param name : Name of the new pipeline.
146+ :param pipeline_name : Name of the new pipeline.
142147 :param yaml_config: YAML configuration for the pipeline.
143148 :returns: NoContentResponse indicating successful creation.
144149 """
145- data = {"name" : name , "query_yaml" : yaml_config }
150+ data = {"name" : pipeline_name , "query_yaml" : yaml_config }
146151 resp = await self ._client .request (
147- endpoint = f"v1/workspaces/{ self ._workspace } /pipelines" ,
152+ endpoint = f"v1/workspaces/{ quote ( self ._workspace , safe = '' ) } /pipelines" ,
148153 method = "POST" ,
149154 data = data ,
150155 )
@@ -170,7 +175,7 @@ async def update(
170175 # Handle name update first if any
171176 if updated_pipeline_name is not None :
172177 name_resp = await self ._client .request (
173- endpoint = f"v1/workspaces/{ self ._workspace } /pipelines/{ pipeline_name } " ,
178+ endpoint = f"v1/workspaces/{ quote ( self ._workspace , safe = '' ) } /pipelines/{ quote ( pipeline_name , safe = '' ) } " ,
174179 method = "PATCH" ,
175180 data = {"name" : updated_pipeline_name },
176181 )
@@ -184,7 +189,9 @@ async def update(
184189
185190 if yaml_config is not None :
186191 yaml_resp = await self ._client .request (
187- endpoint = f"v1/workspaces/{ self ._workspace } /pipelines/{ pipeline_name } /yaml" ,
192+ endpoint = (
193+ f"v1/workspaces/{ quote (self ._workspace , safe = '' )} /pipelines/{ quote (pipeline_name , safe = '' )} /yaml"
194+ ),
188195 method = "PUT" ,
189196 data = {"query_yaml" : yaml_config },
190197 )
@@ -223,7 +230,7 @@ async def get_logs(
223230 params ["filter" ] = f"level eq '{ level } ' and origin eq 'querypipeline'"
224231
225232 resp = await self ._client .request (
226- endpoint = f"v1/workspaces/{ self ._workspace } /pipelines/{ pipeline_name } /logs" ,
233+ endpoint = f"v1/workspaces/{ quote ( self ._workspace , safe = '' ) } /pipelines/{ quote ( pipeline_name , safe = '' ) } /logs" ,
227234 method = "GET" ,
228235 params = params ,
229236 )
@@ -244,7 +251,9 @@ async def deploy(self, pipeline_name: str) -> PipelineValidationResult:
244251 :raises UnexpectedAPIError: If the API returns an unexpected status code.
245252 """
246253 resp = await self ._client .request (
247- endpoint = f"v1/workspaces/{ self ._workspace } /pipelines/{ pipeline_name } /deploy" ,
254+ endpoint = (
255+ f"v1/workspaces/{ quote (self ._workspace , safe = '' )} /pipelines/{ quote (pipeline_name , safe = '' )} /deploy"
256+ ),
248257 method = "POST" ,
249258 )
250259
@@ -274,7 +283,7 @@ async def delete(self, pipeline_name: str) -> NoContentResponse:
274283 :raises UnexpectedAPIError: If the API returns an unexpected status code.
275284 """
276285 resp = await self ._client .request (
277- endpoint = f"v1/workspaces/{ self ._workspace } /pipelines/{ pipeline_name } " ,
286+ endpoint = f"v1/workspaces/{ quote ( self ._workspace , safe = '' ) } /pipelines/{ quote ( pipeline_name , safe = '' ) } " ,
278287 method = "DELETE" ,
279288 )
280289
@@ -315,7 +324,9 @@ async def search(
315324 data ["filters" ] = filters
316325
317326 resp = await self ._client .request (
318- endpoint = f"v1/workspaces/{ self ._workspace } /pipelines/{ pipeline_name } /search" ,
327+ endpoint = (
328+ f"v1/workspaces/{ quote (self ._workspace , safe = '' )} /pipelines/{ quote (pipeline_name , safe = '' )} /search"
329+ ),
319330 method = "POST" ,
320331 data = data ,
321332 response_type = dict [str , Any ],
@@ -365,7 +376,10 @@ async def search_stream(
365376 data ["filters" ] = filters
366377
367378 async with self ._client .stream_request (
368- endpoint = f"v1/workspaces/{ self ._workspace } /pipelines/{ pipeline_name } /search-stream" ,
379+ endpoint = (
380+ f"v1/workspaces/{ quote (self ._workspace , safe = '' )} /pipelines/"
381+ f"{ quote (pipeline_name , safe = '' )} /search-stream"
382+ ),
369383 method = "POST" ,
370384 data = data ,
371385 ) as resp :
0 commit comments