diff --git a/crowdin_api/api_resources/ai/resource.py b/crowdin_api/api_resources/ai/resource.py index 8c6c672..3b06b8c 100644 --- a/crowdin_api/api_resources/ai/resource.py +++ b/crowdin_api/api_resources/ai/resource.py @@ -1,4 +1,4 @@ -from typing import Iterable, Optional, Union +from typing import Dict, Iterable, Optional, Union from crowdin_api.api_resources.abstract.resources import BaseResource from crowdin_api.api_resources.ai.enums import ( @@ -804,6 +804,96 @@ def translate_ai_strings( request_data=request_data, ) + def get_ai_provider_gateway_path( + self, user_id: int, ai_provider_id: int, path: str + ) -> str: + return f"users/{user_id}/ai/providers/{ai_provider_id}/gateway/{path}" + + def get_ai_provider_gateway( + self, user_id: int, ai_provider_id: int, path: str + ): + """ + AI Provider Gateway GET Request + + Link to documentation: + https://support.crowdin.com/developer/api/v2/#tag/AI-Gateway/operation/api.ai.providers.gateway.crowdin.get + """ + return self.requester.request( + method="get", + path=self.get_ai_provider_gateway_path(user_id, ai_provider_id, path), + ) + + def create_ai_provider_gateway( + self, + user_id: int, + ai_provider_id: int, + path: str, + request_data: Optional[Dict] = None, + ): + """ + AI Provider Gateway POST Request + + Link to documentation: + https://support.crowdin.com/developer/api/v2/#tag/AI-Gateway/operation/api.ai.providers.gateway.crowdin.post + """ + return self.requester.request( + method="post", + path=self.get_ai_provider_gateway_path(user_id, ai_provider_id, path), + request_data=request_data, + ) + + def replace_ai_provider_gateway( + self, + user_id: int, + ai_provider_id: int, + path: str, + request_data: Optional[Dict] = None, + ): + """ + AI Provider Gateway PUT Request + + Link to documentation: + https://support.crowdin.com/developer/api/v2/#tag/AI-Gateway/operation/api.ai.providers.gateway.crowdin.put + """ + return self.requester.request( + method="put", + path=self.get_ai_provider_gateway_path(user_id, ai_provider_id, path), + request_data=request_data, + ) + + def edit_ai_provider_gateway( + self, + user_id: int, + ai_provider_id: int, + path: str, + request_data: Optional[Dict] = None, + ): + """ + AI Provider Gateway PATCH Request + + Link to documentation: + https://support.crowdin.com/developer/api/v2/#tag/AI-Gateway/operation/api.ai.providers.gateway.crowdin.patch + """ + return self.requester.request( + method="patch", + path=self.get_ai_provider_gateway_path(user_id, ai_provider_id, path), + request_data=request_data, + ) + + def delete_ai_provider_gateway( + self, user_id: int, ai_provider_id: int, path: str + ): + """ + AI Provider Gateway DELETE Request + + Link to documentation: + https://support.crowdin.com/developer/api/v2/#tag/AI-Gateway/operation/api.ai.providers.gateway.crowdin.delete + """ + return self.requester.request( + method="delete", + path=self.get_ai_provider_gateway_path(user_id, ai_provider_id, path), + ) + class EnterpriseAIResource(BaseResource): """ @@ -1540,3 +1630,84 @@ def translate_ai_strings( path="ai/translate", request_data=request_data, ) + + def get_ai_provider_gateway_path(self, ai_provider_id: int, path: str) -> str: + return f"ai/providers/{ai_provider_id}/gateway/{path}" + + def get_ai_provider_gateway(self, ai_provider_id: int, path: str): + """ + AI Provider Gateway GET Request + + Link to documentation: + https://support.crowdin.com/developer/enterprise/api/v2/#tag/AI-Gateway/operation/api.ai.providers.gateway.enterprise.get + """ + return self.requester.request( + method="get", + path=self.get_ai_provider_gateway_path(ai_provider_id, path), + ) + + def create_ai_provider_gateway( + self, + ai_provider_id: int, + path: str, + request_data: Optional[Dict] = None, + ): + """ + AI Provider Gateway POST Request + + Link to documentation: + https://support.crowdin.com/developer/enterprise/api/v2/#tag/AI-Gateway/operation/api.ai.providers.gateway.enterprise.post + """ + return self.requester.request( + method="post", + path=self.get_ai_provider_gateway_path(ai_provider_id, path), + request_data=request_data, + ) + + def replace_ai_provider_gateway( + self, + ai_provider_id: int, + path: str, + request_data: Optional[Dict] = None, + ): + """ + AI Provider Gateway PUT Request + + Link to documentation: + https://support.crowdin.com/developer/enterprise/api/v2/#tag/AI-Gateway/operation/api.ai.providers.gateway.enterprise.put + """ + return self.requester.request( + method="put", + path=self.get_ai_provider_gateway_path(ai_provider_id, path), + request_data=request_data, + ) + + def edit_ai_provider_gateway( + self, + ai_provider_id: int, + path: str, + request_data: Optional[Dict] = None, + ): + """ + AI Provider Gateway PATCH Request + + Link to documentation: + https://support.crowdin.com/developer/enterprise/api/v2/#tag/AI-Gateway/operation/api.ai.providers.gateway.enterprise.patch + """ + return self.requester.request( + method="patch", + path=self.get_ai_provider_gateway_path(ai_provider_id, path), + request_data=request_data, + ) + + def delete_ai_provider_gateway(self, ai_provider_id: int, path: str): + """ + AI Provider Gateway DELETE Request + + Link to documentation: + https://support.crowdin.com/developer/enterprise/api/v2/#tag/AI-Gateway/operation/api.ai.providers.gateway.enterprise.delete + """ + return self.requester.request( + method="delete", + path=self.get_ai_provider_gateway_path(ai_provider_id, path), + ) diff --git a/crowdin_api/api_resources/ai/tests/test_ai_resources.py b/crowdin_api/api_resources/ai/tests/test_ai_resources.py index 3662c91..83da9a2 100644 --- a/crowdin_api/api_resources/ai/tests/test_ai_resources.py +++ b/crowdin_api/api_resources/ai/tests/test_ai_resources.py @@ -1264,6 +1264,165 @@ def test_translate_ai_strings(self, m_request, incoming_data, request_data, base request_data=request_data, ) + @pytest.mark.parametrize( + "in_params, path", + ( + ( + {"user_id": 1, "ai_provider_id": 2, "path": "v1/chat/completions"}, + "users/1/ai/providers/2/gateway/v1/chat/completions", + ), + ), + ) + def test_get_ai_provider_gateway_path(self, in_params, path, base_absolut_url): + resource = self.get_resource(base_absolut_url) + assert resource.get_ai_provider_gateway_path(**in_params) == path + + @mock.patch("crowdin_api.requester.APIRequester.request") + def test_get_ai_provider_gateway(self, m_request, base_absolut_url): + m_request.return_value = "response" + + user_id = 1 + ai_provider_id = 2 + path = "v1/chat/completions" + resource = self.get_resource(base_absolut_url) + assert resource.get_ai_provider_gateway( + user_id=user_id, ai_provider_id=ai_provider_id, path=path + ) == "response" + m_request.assert_called_once_with( + method="get", + path=resource.get_ai_provider_gateway_path(user_id, ai_provider_id, path), + ) + + @mock.patch("crowdin_api.requester.APIRequester.request") + def test_create_ai_provider_gateway(self, m_request, base_absolut_url): + m_request.return_value = "response" + + user_id = 1 + ai_provider_id = 2 + path = "v1/chat/completions" + request_data = {"model": "gpt-4o", "messages": [{"role": "user", "content": "Hello"}]} + resource = self.get_resource(base_absolut_url) + assert resource.create_ai_provider_gateway( + user_id=user_id, + ai_provider_id=ai_provider_id, + path=path, + request_data=request_data, + ) == "response" + m_request.assert_called_once_with( + method="post", + path=resource.get_ai_provider_gateway_path(user_id, ai_provider_id, path), + request_data=request_data, + ) + + @mock.patch("crowdin_api.requester.APIRequester.request") + def test_replace_ai_provider_gateway(self, m_request, base_absolut_url): + m_request.return_value = "response" + + user_id = 1 + ai_provider_id = 2 + path = "v1/chat/completions" + request_data = {"model": "gpt-4o", "messages": [{"role": "user", "content": "Hello"}]} + resource = self.get_resource(base_absolut_url) + assert resource.replace_ai_provider_gateway( + user_id=user_id, + ai_provider_id=ai_provider_id, + path=path, + request_data=request_data, + ) == "response" + m_request.assert_called_once_with( + method="put", + path=resource.get_ai_provider_gateway_path(user_id, ai_provider_id, path), + request_data=request_data, + ) + + @mock.patch("crowdin_api.requester.APIRequester.request") + def test_edit_ai_provider_gateway(self, m_request, base_absolut_url): + m_request.return_value = "response" + + user_id = 1 + ai_provider_id = 2 + path = "v1/chat/completions" + request_data = {"model": "gpt-4o", "messages": [{"role": "user", "content": "Hello"}]} + resource = self.get_resource(base_absolut_url) + assert resource.edit_ai_provider_gateway( + user_id=user_id, + ai_provider_id=ai_provider_id, + path=path, + request_data=request_data, + ) == "response" + m_request.assert_called_once_with( + method="patch", + path=resource.get_ai_provider_gateway_path(user_id, ai_provider_id, path), + request_data=request_data, + ) + + @mock.patch("crowdin_api.requester.APIRequester.request") + def test_delete_ai_provider_gateway(self, m_request, base_absolut_url): + m_request.return_value = "response" + + user_id = 1 + ai_provider_id = 2 + path = "v1/chat/completions" + resource = self.get_resource(base_absolut_url) + assert resource.delete_ai_provider_gateway( + user_id=user_id, ai_provider_id=ai_provider_id, path=path + ) == "response" + m_request.assert_called_once_with( + method="delete", + path=resource.get_ai_provider_gateway_path(user_id, ai_provider_id, path), + ) + + @mock.patch("crowdin_api.requester.APIRequester.request") + def test_create_ai_provider_gateway_no_body(self, m_request, base_absolut_url): + m_request.return_value = "response" + + user_id = 1 + ai_provider_id = 2 + path = "v1/chat/completions" + resource = self.get_resource(base_absolut_url) + assert resource.create_ai_provider_gateway( + user_id=user_id, ai_provider_id=ai_provider_id, path=path + ) == "response" + m_request.assert_called_once_with( + method="post", + path=resource.get_ai_provider_gateway_path(user_id, ai_provider_id, path), + request_data=None, + ) + + @mock.patch("crowdin_api.requester.APIRequester.request") + def test_replace_ai_provider_gateway_no_body(self, m_request, base_absolut_url): + m_request.return_value = "response" + + user_id = 1 + ai_provider_id = 2 + path = "v1/chat/completions" + resource = self.get_resource(base_absolut_url) + assert resource.replace_ai_provider_gateway( + user_id=user_id, ai_provider_id=ai_provider_id, path=path + ) == "response" + m_request.assert_called_once_with( + method="put", + path=resource.get_ai_provider_gateway_path(user_id, ai_provider_id, path), + request_data=None, + ) + + @mock.patch("crowdin_api.requester.APIRequester.request") + def test_edit_ai_provider_gateway_no_body(self, m_request, base_absolut_url): + m_request.return_value = "response" + + user_id = 1 + ai_provider_id = 2 + path = "v1/chat/completions" + resource = self.get_resource(base_absolut_url) + assert resource.edit_ai_provider_gateway( + user_id=user_id, ai_provider_id=ai_provider_id, path=path + ) == "response" + m_request.assert_called_once_with( + method="patch", + path=resource.get_ai_provider_gateway_path(user_id, ai_provider_id, path), + request_data=None, + ) + class TestEnterpriseAIResources: resource_class = EnterpriseAIResource @@ -2416,3 +2575,151 @@ def test_translate_ai_strings(self, m_request, incoming_data, request_data, base path="ai/translate", request_data=request_data, ) + + @pytest.mark.parametrize( + "in_params, path", + ( + ( + {"ai_provider_id": 2, "path": "v1/chat/completions"}, + "ai/providers/2/gateway/v1/chat/completions", + ), + ), + ) + def test_get_ai_provider_gateway_path(self, in_params, path, base_absolut_url): + resource = self.get_resource(base_absolut_url) + assert resource.get_ai_provider_gateway_path(**in_params) == path + + @mock.patch("crowdin_api.requester.APIRequester.request") + def test_get_ai_provider_gateway(self, m_request, base_absolut_url): + m_request.return_value = "response" + + ai_provider_id = 2 + path = "v1/chat/completions" + resource = self.get_resource(base_absolut_url) + assert resource.get_ai_provider_gateway( + ai_provider_id=ai_provider_id, path=path + ) == "response" + m_request.assert_called_once_with( + method="get", + path=resource.get_ai_provider_gateway_path(ai_provider_id, path), + ) + + @mock.patch("crowdin_api.requester.APIRequester.request") + def test_create_ai_provider_gateway(self, m_request, base_absolut_url): + m_request.return_value = "response" + + ai_provider_id = 2 + path = "v1/chat/completions" + request_data = {"model": "gpt-4o", "messages": [{"role": "user", "content": "Hello"}]} + resource = self.get_resource(base_absolut_url) + assert resource.create_ai_provider_gateway( + ai_provider_id=ai_provider_id, + path=path, + request_data=request_data, + ) == "response" + m_request.assert_called_once_with( + method="post", + path=resource.get_ai_provider_gateway_path(ai_provider_id, path), + request_data=request_data, + ) + + @mock.patch("crowdin_api.requester.APIRequester.request") + def test_replace_ai_provider_gateway(self, m_request, base_absolut_url): + m_request.return_value = "response" + + ai_provider_id = 2 + path = "v1/chat/completions" + request_data = {"model": "gpt-4o", "messages": [{"role": "user", "content": "Hello"}]} + resource = self.get_resource(base_absolut_url) + assert resource.replace_ai_provider_gateway( + ai_provider_id=ai_provider_id, + path=path, + request_data=request_data, + ) == "response" + m_request.assert_called_once_with( + method="put", + path=resource.get_ai_provider_gateway_path(ai_provider_id, path), + request_data=request_data, + ) + + @mock.patch("crowdin_api.requester.APIRequester.request") + def test_edit_ai_provider_gateway(self, m_request, base_absolut_url): + m_request.return_value = "response" + + ai_provider_id = 2 + path = "v1/chat/completions" + request_data = {"model": "gpt-4o", "messages": [{"role": "user", "content": "Hello"}]} + resource = self.get_resource(base_absolut_url) + assert resource.edit_ai_provider_gateway( + ai_provider_id=ai_provider_id, + path=path, + request_data=request_data, + ) == "response" + m_request.assert_called_once_with( + method="patch", + path=resource.get_ai_provider_gateway_path(ai_provider_id, path), + request_data=request_data, + ) + + @mock.patch("crowdin_api.requester.APIRequester.request") + def test_delete_ai_provider_gateway(self, m_request, base_absolut_url): + m_request.return_value = "response" + + ai_provider_id = 2 + path = "v1/chat/completions" + resource = self.get_resource(base_absolut_url) + assert resource.delete_ai_provider_gateway( + ai_provider_id=ai_provider_id, path=path + ) == "response" + m_request.assert_called_once_with( + method="delete", + path=resource.get_ai_provider_gateway_path(ai_provider_id, path), + ) + + @mock.patch("crowdin_api.requester.APIRequester.request") + def test_create_ai_provider_gateway_no_body(self, m_request, base_absolut_url): + m_request.return_value = "response" + + ai_provider_id = 2 + path = "v1/chat/completions" + resource = self.get_resource(base_absolut_url) + assert resource.create_ai_provider_gateway( + ai_provider_id=ai_provider_id, path=path + ) == "response" + m_request.assert_called_once_with( + method="post", + path=resource.get_ai_provider_gateway_path(ai_provider_id, path), + request_data=None, + ) + + @mock.patch("crowdin_api.requester.APIRequester.request") + def test_replace_ai_provider_gateway_no_body(self, m_request, base_absolut_url): + m_request.return_value = "response" + + ai_provider_id = 2 + path = "v1/chat/completions" + resource = self.get_resource(base_absolut_url) + assert resource.replace_ai_provider_gateway( + ai_provider_id=ai_provider_id, path=path + ) == "response" + m_request.assert_called_once_with( + method="put", + path=resource.get_ai_provider_gateway_path(ai_provider_id, path), + request_data=None, + ) + + @mock.patch("crowdin_api.requester.APIRequester.request") + def test_edit_ai_provider_gateway_no_body(self, m_request, base_absolut_url): + m_request.return_value = "response" + + ai_provider_id = 2 + path = "v1/chat/completions" + resource = self.get_resource(base_absolut_url) + assert resource.edit_ai_provider_gateway( + ai_provider_id=ai_provider_id, path=path + ) == "response" + m_request.assert_called_once_with( + method="patch", + path=resource.get_ai_provider_gateway_path(ai_provider_id, path), + request_data=None, + )