From 7293239252d3f942b3f4470bc15d9616e9313b94 Mon Sep 17 00:00:00 2001 From: csgulati09 Date: Wed, 9 Jul 2025 18:02:24 +0530 Subject: [PATCH 1/4] fix: POST proxy signature --- portkey_ai/__init__.py | 4 ++ portkey_ai/api_resources/__init__.py | 4 ++ portkey_ai/api_resources/apis/__init__.py | 4 +- portkey_ai/api_resources/apis/post.py | 52 ++++++++++++++++++++++- portkey_ai/api_resources/base_client.py | 3 ++ portkey_ai/api_resources/client.py | 32 ++++++++++++-- 6 files changed, 93 insertions(+), 6 deletions(-) diff --git a/portkey_ai/__init__.py b/portkey_ai/__init__.py index b165056f..ac4a9122 100644 --- a/portkey_ai/__init__.py +++ b/portkey_ai/__init__.py @@ -123,6 +123,8 @@ AsyncContainersFiles, Content, AsyncContent, + PostMethod, + AsyncPostMethod, ) from portkey_ai.version import VERSION @@ -265,4 +267,6 @@ "AsyncContainersFiles", "Content", "AsyncContent", + "PostMethod", + "AsyncPostMethod", ] diff --git a/portkey_ai/api_resources/__init__.py b/portkey_ai/api_resources/__init__.py index cb2716da..1b73a2aa 100644 --- a/portkey_ai/api_resources/__init__.py +++ b/portkey_ai/api_resources/__init__.py @@ -111,6 +111,8 @@ AsyncContainersFiles, Content, AsyncContent, + PostMethod, + AsyncPostMethod, ) from .utils import ( Modes, @@ -257,4 +259,6 @@ "AsyncContainersFiles", "Content", "AsyncContent", + "PostMethod", + "AsyncPostMethod", ] diff --git a/portkey_ai/api_resources/apis/__init__.py b/portkey_ai/api_resources/apis/__init__.py index 92b9ff4a..cd016564 100644 --- a/portkey_ai/api_resources/apis/__init__.py +++ b/portkey_ai/api_resources/apis/__init__.py @@ -15,7 +15,7 @@ from .generation import Generations, AsyncGenerations, Prompts, AsyncPrompts from .feedback import Feedback, AsyncFeedback from .create_headers import createHeaders -from .post import Post, AsyncPost +from .post import Post, AsyncPost, PostMethod, AsyncPostMethod from .getMethod import GetMethod, AsyncGetMethod from .deleteMethod import DeleteMethod, AsyncDeleteMethod from .putMethod import PutMethod, AsyncPutMethod @@ -157,6 +157,8 @@ "createHeaders", "Post", "AsyncPost", + "PostMethod", + "AsyncPostMethod", "GetMethod", "AsyncGetMethod", "DeleteMethod", diff --git a/portkey_ai/api_resources/apis/post.py b/portkey_ai/api_resources/apis/post.py index c2033f88..2fff858c 100644 --- a/portkey_ai/api_resources/apis/post.py +++ b/portkey_ai/api_resources/apis/post.py @@ -1,4 +1,4 @@ -from typing import Union, overload, Literal +from typing import Any, Dict, Optional, Union, overload, Literal from portkey_ai.api_resources.base_client import APIClient, AsyncAPIClient @@ -115,3 +115,53 @@ async def create( stream=stream, headers=headers, ) + + +class PostMethod(APIResource): + def __init__(self, client: APIClient) -> None: + super().__init__(client) + + def create( + self, + path: Optional[str] = None, + body: Optional[Dict[str, Any]] = {}, + headers: Optional[Dict[str, str]] = {}, + cast_to: Optional[Any] = None, + **kwargs, + ): + files = kwargs.pop("files", None) + headers = headers or kwargs.pop("headers", {}) + body = body or kwargs + + return self._post( + path=path, + body=body, + files=files, + params={}, + headers=headers, + cast_to=cast_to, + stream=False, + stream_cls=None, + ) + + +class AsyncPostMethod(AsyncAPIResource): + def __init__(self, client: AsyncAPIClient) -> None: + super().__init__(client) + + async def create( + self, + path: Optional[str] = None, + body: Optional[Dict[str, Any]] = {}, + headers: Optional[Dict[str, str]] = {}, + cast_to: Optional[Any] = None, + ): + return await self._post( + path=path, + body=body, + params={}, + headers=headers, + cast_to=cast_to, + stream=False, + stream_cls=None, + ) diff --git a/portkey_ai/api_resources/base_client.py b/portkey_ai/api_resources/base_client.py index 19d370e8..985501c4 100644 --- a/portkey_ai/api_resources/base_client.py +++ b/portkey_ai/api_resources/base_client.py @@ -589,8 +589,10 @@ def __exit__( def _build_request(self, options: Options) -> httpx.Request: headers = self._build_headers(options) + print("headers", headers) params = options.params json_body = options.json_body + print("json_body", json_body) request = self._client.build_request( method=options.method, url=options.url, @@ -665,6 +667,7 @@ def _request( stream_cls: Type[StreamT], ) -> Union[ResponseT, StreamT]: request = self._build_request(options) + print(request) try: res = self._client.send(request, auth=self.custom_auth, stream=stream) res.raise_for_status() diff --git a/portkey_ai/api_resources/client.py b/portkey_ai/api_resources/client.py index 570401d9..02dad85a 100644 --- a/portkey_ai/api_resources/client.py +++ b/portkey_ai/api_resources/client.py @@ -288,8 +288,20 @@ def copy( **kwargs, ) - def post(self, url: str, **kwargs): - return apis.Post(self).create(url=url, **kwargs) + def post( + self, + *, + path: Optional[str] = None, + url: Optional[str] = None, + body: Optional[Dict[str, Any]] = {}, + headers: Optional[Dict[str, str]] = {}, + cast_to: Optional[Any] = None, + **kwargs, + ): + path = path or url + return apis.PostMethod(self).create( + path=path, body=body, headers=headers, cast_to=cast_to, **kwargs + ) def get( self, @@ -605,8 +617,20 @@ def copy( **kwargs, ) - async def post(self, url: str, **kwargs): - return await apis.AsyncPost(self).create(url=url, **kwargs) + async def post( + self, + *, + path: Optional[str] = None, + url: Optional[str] = None, + body: Optional[Dict[str, Any]] = {}, + headers: Optional[Dict[str, str]] = {}, + cast_to: Optional[Any] = None, + **kwargs, + ): + path = path or url + return await apis.AsyncPostMethod(self).create( + path=path, body=body, headers=headers, cast_to=cast_to, **kwargs + ) async def get( self, From 164ddef50a63e6bf68263636968c2ab6025a070a Mon Sep 17 00:00:00 2001 From: csgulati09 Date: Wed, 9 Jul 2025 18:27:16 +0530 Subject: [PATCH 2/4] fix: remove print statements --- portkey_ai/api_resources/base_client.py | 3 --- 1 file changed, 3 deletions(-) diff --git a/portkey_ai/api_resources/base_client.py b/portkey_ai/api_resources/base_client.py index 985501c4..19d370e8 100644 --- a/portkey_ai/api_resources/base_client.py +++ b/portkey_ai/api_resources/base_client.py @@ -589,10 +589,8 @@ def __exit__( def _build_request(self, options: Options) -> httpx.Request: headers = self._build_headers(options) - print("headers", headers) params = options.params json_body = options.json_body - print("json_body", json_body) request = self._client.build_request( method=options.method, url=options.url, @@ -667,7 +665,6 @@ def _request( stream_cls: Type[StreamT], ) -> Union[ResponseT, StreamT]: request = self._build_request(options) - print(request) try: res = self._client.send(request, auth=self.custom_auth, stream=stream) res.raise_for_status() From e3cad492dc34199db8ec986bbef80e0b78216fa4 Mon Sep 17 00:00:00 2001 From: csgulati09 Date: Wed, 20 Aug 2025 14:49:04 +0530 Subject: [PATCH 3/4] fix: added correct signature for postMethod --- portkey_ai/api_resources/apis/post.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/portkey_ai/api_resources/apis/post.py b/portkey_ai/api_resources/apis/post.py index 2fff858c..2920073a 100644 --- a/portkey_ai/api_resources/apis/post.py +++ b/portkey_ai/api_resources/apis/post.py @@ -155,10 +155,16 @@ async def create( body: Optional[Dict[str, Any]] = {}, headers: Optional[Dict[str, str]] = {}, cast_to: Optional[Any] = None, + **kwargs, ): + files = kwargs.pop("files", None) + headers = headers or kwargs.pop("headers", {}) + body = body or kwargs + return await self._post( path=path, body=body, + files=files, params={}, headers=headers, cast_to=cast_to, From 9c982a59cf1c49278964bfa4f224f12c48ba19b4 Mon Sep 17 00:00:00 2001 From: csgulati09 Date: Wed, 20 Aug 2025 16:08:45 +0530 Subject: [PATCH 4/4] feat: keeping both the post implementation --- portkey_ai/api_resources/apis/post.py | 86 +++++++++++++++++++++++++-- portkey_ai/api_resources/client.py | 26 ++++++-- 2 files changed, 102 insertions(+), 10 deletions(-) diff --git a/portkey_ai/api_resources/apis/post.py b/portkey_ai/api_resources/apis/post.py index 2920073a..0e73300f 100644 --- a/portkey_ai/api_resources/apis/post.py +++ b/portkey_ai/api_resources/apis/post.py @@ -121,14 +121,51 @@ class PostMethod(APIResource): def __init__(self, client: APIClient) -> None: super().__init__(client) + @overload + def create( + self, + path: Optional[str] = None, + body: Optional[Dict[str, Any]] = {}, + headers: Optional[Dict[str, str]] = {}, + cast_to: Optional[Any] = None, + stream: Literal[True] = True, + **kwargs, + ) -> Stream[GenericResponse]: + ... + + @overload def create( self, path: Optional[str] = None, body: Optional[Dict[str, Any]] = {}, headers: Optional[Dict[str, str]] = {}, cast_to: Optional[Any] = None, + stream: Literal[False] = False, **kwargs, - ): + ) -> GenericResponse: + ... + + @overload + def create( + self, + path: Optional[str] = None, + body: Optional[Dict[str, Any]] = {}, + headers: Optional[Dict[str, str]] = {}, + cast_to: Optional[Any] = None, + stream: bool = False, + **kwargs, + ) -> Union[GenericResponse, Stream[GenericResponse]]: + ... + + def create( + self, + path: Optional[str] = None, + body: Optional[Dict[str, Any]] = {}, + headers: Optional[Dict[str, str]] = {}, + cast_to: Optional[Any] = None, + stream: bool = False, + **kwargs, + ) -> Union[GenericResponse, Stream[GenericResponse]]: files = kwargs.pop("files", None) headers = headers or kwargs.pop("headers", {}) body = body or kwargs @@ -140,8 +177,8 @@ def create( params={}, headers=headers, cast_to=cast_to, - stream=False, - stream_cls=None, + stream=stream, + stream_cls=Stream[GenericResponse], ) @@ -149,14 +186,51 @@ class AsyncPostMethod(AsyncAPIResource): def __init__(self, client: AsyncAPIClient) -> None: super().__init__(client) + @overload + async def create( + self, + path: Optional[str] = None, + body: Optional[Dict[str, Any]] = {}, + headers: Optional[Dict[str, str]] = {}, + cast_to: Optional[Any] = None, + stream: Literal[True] = True, + **kwargs, + ) -> Stream[GenericResponse]: + ... + + @overload async def create( self, path: Optional[str] = None, body: Optional[Dict[str, Any]] = {}, headers: Optional[Dict[str, str]] = {}, cast_to: Optional[Any] = None, + stream: Literal[False] = False, **kwargs, - ): + ) -> GenericResponse: + ... + + @overload + async def create( + self, + path: Optional[str] = None, + body: Optional[Dict[str, Any]] = {}, + headers: Optional[Dict[str, str]] = {}, + cast_to: Optional[Any] = None, + stream: bool = False, + **kwargs, + ) -> Union[GenericResponse, Stream[GenericResponse]]: + ... + + async def create( + self, + path: Optional[str] = None, + body: Optional[Dict[str, Any]] = {}, + headers: Optional[Dict[str, str]] = {}, + cast_to: Optional[Any] = None, + stream: bool = False, + **kwargs, + ) -> Union[GenericResponse, Stream[GenericResponse]]: files = kwargs.pop("files", None) headers = headers or kwargs.pop("headers", {}) body = body or kwargs @@ -168,6 +242,6 @@ async def create( params={}, headers=headers, cast_to=cast_to, - stream=False, - stream_cls=None, + stream=stream, + stream_cls=Stream[GenericResponse], ) diff --git a/portkey_ai/api_resources/client.py b/portkey_ai/api_resources/client.py index 02dad85a..08daeeba 100644 --- a/portkey_ai/api_resources/client.py +++ b/portkey_ai/api_resources/client.py @@ -288,7 +288,10 @@ def copy( **kwargs, ) - def post( + def post(self, url: str, **kwargs): + return apis.Post(self).create(url=url, **kwargs) + + def postMethod( self, *, path: Optional[str] = None, @@ -296,11 +299,17 @@ def post( body: Optional[Dict[str, Any]] = {}, headers: Optional[Dict[str, str]] = {}, cast_to: Optional[Any] = None, + stream: bool = False, **kwargs, ): path = path or url return apis.PostMethod(self).create( - path=path, body=body, headers=headers, cast_to=cast_to, **kwargs + path=path, + body=body, + headers=headers, + cast_to=cast_to, + stream=stream, + **kwargs, ) def get( @@ -617,7 +626,10 @@ def copy( **kwargs, ) - async def post( + async def post(self, url: str, **kwargs): + return await apis.AsyncPost(self).create(url=url, **kwargs) + + async def postMethod( self, *, path: Optional[str] = None, @@ -625,11 +637,17 @@ async def post( body: Optional[Dict[str, Any]] = {}, headers: Optional[Dict[str, str]] = {}, cast_to: Optional[Any] = None, + stream: bool = False, **kwargs, ): path = path or url return await apis.AsyncPostMethod(self).create( - path=path, body=body, headers=headers, cast_to=cast_to, **kwargs + path=path, + body=body, + headers=headers, + cast_to=cast_to, + stream=stream, + **kwargs, ) async def get(