From d2fef3d9f777ba3584e8bc995caf8b205fc8c4c3 Mon Sep 17 00:00:00 2001 From: admin Date: Tue, 4 Mar 2025 14:58:01 +0800 Subject: [PATCH] =?UTF-8?q?=E5=88=9B=E5=BB=BAAsyncJWTAuth=E7=B1=BB?= =?UTF-8?q?=E6=94=AF=E6=8C=81=E5=BC=82=E6=AD=A5=E6=9B=B4=E6=96=B0=E9=89=B4?= =?UTF-8?q?=E6=9D=83=E7=A0=81=20=E4=BF=AE=E5=A4=8D=E7=9B=B8=E5=85=B3?= =?UTF-8?q?=E7=9A=84=E9=89=B4=E6=9D=83=E8=B0=83=E7=94=A8=EF=BC=8C=E5=8C=85?= =?UTF-8?q?=E6=8B=ACRequester=E5=92=8C=E4=B8=8A=E5=B1=82=E5=BC=82=E6=AD=A5?= =?UTF-8?q?=E8=B0=83=E7=94=A8=20=E4=BF=AE=E6=94=B9AsyncCoze=E5=AF=B9?= =?UTF-8?q?=E8=B1=A1=E7=9A=84auth=E5=B1=9E=E6=80=A7=E4=B8=BAAsyncAuth?= =?UTF-8?q?=E7=B1=BB=E5=9E=8B=20Auth=E5=92=8CAsyncAuth=E5=8F=AA=E4=B8=8ERe?= =?UTF-8?q?quester=E6=9C=89=E5=85=B3=EF=BC=8C=E5=88=A0=E9=99=A4=E9=9D=9E?= =?UTF-8?q?=E5=BF=85=E8=A6=81=E7=B1=BB=E7=9A=84=E5=BC=95=E7=94=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- cozepy/__init__.py | 6 + cozepy/audio/__init__.py | 23 ++- cozepy/audio/rooms/__init__.py | 7 +- cozepy/audio/speech/__init__.py | 7 +- cozepy/audio/transcriptions/__init__.py | 7 +- cozepy/audio/voices/__init__.py | 7 +- cozepy/auth/__init__.py | 16 +- cozepy/bots/__init__.py | 7 +- cozepy/chat/__init__.py | 11 +- cozepy/chat/message/__init__.py | 7 +- cozepy/conversations/__init__.py | 11 +- cozepy/conversations/message/__init__.py | 7 +- cozepy/coze.py | 59 ++++--- cozepy/datasets/__init__.py | 15 +- cozepy/datasets/documents/__init__.py | 7 +- cozepy/datasets/images/__init__.py | 7 +- cozepy/files/__init__.py | 7 +- cozepy/knowledge/__init__.py | 11 +- cozepy/knowledge/documents/__init__.py | 17 +- cozepy/request.py | 16 +- cozepy/templates/__init__.py | 7 +- cozepy/users/__init__.py | 7 +- cozepy/websockets/__init__.py | 12 +- cozepy/websockets/audio/__init__.py | 11 +- cozepy/websockets/audio/speech/__init__.py | 13 +- .../audio/transcriptions/__init__.py | 13 +- cozepy/websockets/chat/__init__.py | 13 +- cozepy/websockets/ws.py | 16 +- cozepy/workflows/__init__.py | 15 +- cozepy/workflows/chat/__init__.py | 7 +- cozepy/workflows/runs/__init__.py | 11 +- .../workflows/runs/run_histories/__init__.py | 7 +- cozepy/workspaces/__init__.py | 7 +- tests/test_audio_rooms.py | 3 +- tests/test_audio_speech.py | 3 +- tests/test_audio_translations.py | 3 +- tests/test_audio_voices.py | 5 +- tests/test_auth.py | 160 ++++++++---------- tests/test_bots.py | 11 +- tests/test_chat.py | 21 ++- tests/test_chat_messages.py | 3 +- tests/test_conversations.py | 9 +- tests/test_conversations_messages.py | 11 +- tests/test_datasets.py | 11 +- tests/test_datasets_documents.py | 11 +- tests/test_datasets_images.py | 5 +- tests/test_file.py | 5 +- tests/test_knowledge_documents.py | 15 +- tests/test_template.py | 3 +- tests/test_users.py | 3 +- tests/test_workflows.py | 13 +- tests/test_workflows_chat.py | 9 +- tests/test_workspaces.py | 3 +- 53 files changed, 297 insertions(+), 404 deletions(-) diff --git a/cozepy/__init__.py b/cozepy/__init__.py index c8e3908..fd5e6bf 100644 --- a/cozepy/__init__.py +++ b/cozepy/__init__.py @@ -8,15 +8,18 @@ AsyncPKCEOAuthApp, AsyncWebOAuthApp, Auth, + AsyncAuth, DeviceAuthCode, DeviceOAuthApp, JWTAuth, + AsyncJWTAuth, JWTOAuthApp, OAuthApp, OAuthToken, PKCEOAuthApp, Scope, TokenAuth, + AsyncTokenAuth, WebOAuthApp, load_oauth_app_from_config, ) @@ -169,6 +172,9 @@ "AsyncPKCEOAuthApp", "AsyncWebOAuthApp", "Auth", + "AsyncAuth", + "AsyncJWTAuth", + "AsyncTokenAuth", "DeviceAuthCode", "DeviceOAuthApp", "JWTAuth", diff --git a/cozepy/audio/__init__.py b/cozepy/audio/__init__.py index 58cab7c..bfcadc5 100644 --- a/cozepy/audio/__init__.py +++ b/cozepy/audio/__init__.py @@ -1,6 +1,5 @@ from typing import TYPE_CHECKING, Optional -from cozepy.auth import Auth from cozepy.request import Requester from cozepy.util import remove_url_trailing_slash @@ -12,9 +11,8 @@ class AudioClient(object): - def __init__(self, base_url: str, auth: Auth, requester: Requester): + def __init__(self, base_url: str, requester: Requester): self._base_url = remove_url_trailing_slash(base_url) - self._auth = auth self._requester = requester self._rooms: Optional[RoomsClient] = None @@ -27,7 +25,7 @@ def rooms(self) -> "RoomsClient": if self._rooms is None: from .rooms import RoomsClient - self._rooms = RoomsClient(base_url=self._base_url, auth=self._auth, requester=self._requester) + self._rooms = RoomsClient(base_url=self._base_url, requester=self._requester) return self._rooms @property @@ -35,7 +33,7 @@ def speech(self) -> "SpeechClient": if self._speech is None: from .speech import SpeechClient - self._speech = SpeechClient(base_url=self._base_url, auth=self._auth, requester=self._requester) + self._speech = SpeechClient(base_url=self._base_url, requester=self._requester) return self._speech @property @@ -44,7 +42,7 @@ def transcriptions(self) -> "TranscriptionsClient": from .transcriptions import TranscriptionsClient self._transcriptions = TranscriptionsClient( - base_url=self._base_url, auth=self._auth, requester=self._requester + base_url=self._base_url, requester=self._requester ) return self._transcriptions @@ -53,14 +51,13 @@ def voices(self) -> "VoicesClient": if self._voices is None: from .voices import VoicesClient - self._voices = VoicesClient(base_url=self._base_url, auth=self._auth, requester=self._requester) + self._voices = VoicesClient(base_url=self._base_url, requester=self._requester) return self._voices class AsyncAudioClient(object): - def __init__(self, base_url: str, auth: Auth, requester: Requester): + def __init__(self, base_url: str, requester: Requester): self._base_url = remove_url_trailing_slash(base_url) - self._auth = auth self._requester = requester self._rooms: Optional[AsyncRoomsClient] = None @@ -73,7 +70,7 @@ def rooms(self) -> "AsyncRoomsClient": if self._rooms is None: from .rooms import AsyncRoomsClient - self._rooms = AsyncRoomsClient(base_url=self._base_url, auth=self._auth, requester=self._requester) + self._rooms = AsyncRoomsClient(base_url=self._base_url, requester=self._requester) return self._rooms @property @@ -81,7 +78,7 @@ def speech(self) -> "AsyncSpeechClient": if self._speech is None: from .speech import AsyncSpeechClient - self._speech = AsyncSpeechClient(base_url=self._base_url, auth=self._auth, requester=self._requester) + self._speech = AsyncSpeechClient(base_url=self._base_url, requester=self._requester) return self._speech @property @@ -89,7 +86,7 @@ def voices(self) -> "AsyncVoicesClient": if self._voices is None: from .voices import AsyncVoicesClient - self._voices = AsyncVoicesClient(base_url=self._base_url, auth=self._auth, requester=self._requester) + self._voices = AsyncVoicesClient(base_url=self._base_url, requester=self._requester) return self._voices @property @@ -98,6 +95,6 @@ def transcriptions(self) -> "AsyncTranscriptionsClient": from .transcriptions import AsyncTranscriptionsClient self._transcriptions = AsyncTranscriptionsClient( - base_url=self._base_url, auth=self._auth, requester=self._requester + base_url=self._base_url, requester=self._requester ) return self._transcriptions diff --git a/cozepy/audio/rooms/__init__.py b/cozepy/audio/rooms/__init__.py index b7cf35b..0f7a7c6 100644 --- a/cozepy/audio/rooms/__init__.py +++ b/cozepy/audio/rooms/__init__.py @@ -1,6 +1,5 @@ from typing import Optional -from cozepy.auth import Auth from cozepy.model import CozeModel from cozepy.request import Requester from cozepy.util import remove_url_trailing_slash @@ -22,9 +21,8 @@ class RoomsClient(object): Room service client. """ - def __init__(self, base_url: str, auth: Auth, requester: Requester): + def __init__(self, base_url: str, requester: Requester): self._base_url = remove_url_trailing_slash(base_url) - self._auth = auth self._requester = requester def create( @@ -59,9 +57,8 @@ class AsyncRoomsClient(object): Room service async client. """ - def __init__(self, base_url: str, auth: Auth, requester: Requester): + def __init__(self, base_url: str, requester: Requester): self._base_url = remove_url_trailing_slash(base_url) - self._auth = auth self._requester = requester async def create( diff --git a/cozepy/audio/speech/__init__.py b/cozepy/audio/speech/__init__.py index 1559dfa..f04214a 100644 --- a/cozepy/audio/speech/__init__.py +++ b/cozepy/audio/speech/__init__.py @@ -1,7 +1,6 @@ from enum import Enum from typing import Optional -from cozepy.auth import Auth from cozepy.model import FileHTTPResponse from cozepy.request import Requester from cozepy.util import remove_url_trailing_slash @@ -28,9 +27,8 @@ class SpeechClient(object): speech service client. """ - def __init__(self, base_url: str, auth: Auth, requester: Requester): + def __init__(self, base_url: str, requester: Requester): self._base_url = remove_url_trailing_slash(base_url) - self._auth = auth self._requester = requester def create( @@ -70,9 +68,8 @@ class AsyncSpeechClient(object): speech service client. """ - def __init__(self, base_url: str, auth: Auth, requester: Requester): + def __init__(self, base_url: str, requester: Requester): self._base_url = remove_url_trailing_slash(base_url) - self._auth = auth self._requester = requester async def create( diff --git a/cozepy/audio/transcriptions/__init__.py b/cozepy/audio/transcriptions/__init__.py index bac1f82..b0bf251 100644 --- a/cozepy/audio/transcriptions/__init__.py +++ b/cozepy/audio/transcriptions/__init__.py @@ -1,6 +1,5 @@ from typing import Optional -from cozepy.auth import Auth from cozepy.files import FileTypes, _try_fix_file from cozepy.model import CozeModel from cozepy.request import Requester @@ -13,9 +12,8 @@ class CreateTranscriptionsResp(CozeModel): class TranscriptionsClient(object): - def __init__(self, base_url: str, auth: Auth, requester: Requester): + def __init__(self, base_url: str, requester: Requester): self._base_url = remove_url_trailing_slash(base_url) - self._auth = auth self._requester = requester def create( @@ -43,9 +41,8 @@ class AsyncTranscriptionsClient(object): Room service async client. """ - def __init__(self, base_url: str, auth: Auth, requester: Requester): + def __init__(self, base_url: str, requester: Requester): self._base_url = remove_url_trailing_slash(base_url) - self._auth = auth self._requester = requester async def create( diff --git a/cozepy/audio/voices/__init__.py b/cozepy/audio/voices/__init__.py index 9f25d24..0d61251 100644 --- a/cozepy/audio/voices/__init__.py +++ b/cozepy/audio/voices/__init__.py @@ -1,7 +1,6 @@ from typing import List, Optional from cozepy import AudioFormat -from cozepy.auth import Auth from cozepy.files import FileTypes, _try_fix_file from cozepy.model import AsyncNumberPaged, CozeModel, HTTPRequest, NumberPaged, NumberPagedResponse from cozepy.request import Requester @@ -55,9 +54,8 @@ def get_items(self) -> List[Voice]: class VoicesClient(object): - def __init__(self, base_url: str, auth: Auth, requester: Requester): + def __init__(self, base_url: str, requester: Requester): self._base_url = remove_url_trailing_slash(base_url) - self._auth = auth self._requester = requester def clone( @@ -152,9 +150,8 @@ def request_maker(i_page_num: int, i_page_size: int) -> HTTPRequest: class AsyncVoicesClient(object): - def __init__(self, base_url: str, auth: Auth, requester: Requester): + def __init__(self, base_url: str, requester: Requester): self._base_url = remove_url_trailing_slash(base_url) - self._auth = auth self._requester = requester async def clone( diff --git a/cozepy/auth/__init__.py b/cozepy/auth/__init__.py index 48060fb..2d314f7 100644 --- a/cozepy/auth/__init__.py +++ b/cozepy/auth/__init__.py @@ -680,6 +680,7 @@ class Auth(abc.ABC): It provides the abstract methods for getting the token type and token. """ + @property @abc.abstractmethod def token_type(self) -> str: """ @@ -690,6 +691,7 @@ def token_type(self) -> str: :return: token type """ + @property @abc.abstractmethod def token(self) -> str: """ @@ -705,7 +707,7 @@ def authentication(self, headers: dict) -> None: :param headers: http headers :return: None """ - headers["Authorization"] = f"{self.token_type()} {self.token()}" + headers["Authorization"] = f"{self.token_type} {self.token}" class TokenAuth(Auth): @@ -718,9 +720,11 @@ def __init__(self, token: str): assert len(token) > 0 self._token = token + @property def token_type(self) -> str: return "Bearer" + @property def token(self) -> str: return self._token @@ -755,9 +759,11 @@ def __init__( client_id, private_key, public_key_id, base_url=remove_url_trailing_slash(base_url) ) + @property def token_type(self) -> str: return "Bearer" + @property def token(self) -> str: token = self._generate_token() return token.access_token @@ -776,6 +782,7 @@ class AsyncAuth(abc.ABC): It provides the abstract methods for getting the token type and token. """ + @property @abc.abstractmethod async def token_type(self) -> str: """ @@ -786,6 +793,7 @@ async def token_type(self) -> str: :return: token type """ + @property @abc.abstractmethod async def token(self) -> str: """ @@ -801,7 +809,7 @@ async def authentication(self, headers: dict) -> None: :param headers: http headers :return: None """ - headers["Authorization"] = f"{await self.token_type()} {await self.token()}" + headers["Authorization"] = f"{await self.token_type} {await self.token}" class AsyncTokenAuth(AsyncAuth): @@ -814,9 +822,11 @@ def __init__(self, token: str): assert len(token) > 0 self._token = token + @property async def token_type(self) -> str: return "Bearer" + @property async def token(self) -> str: return self._token @@ -851,9 +861,11 @@ def __init__( client_id, private_key, public_key_id, base_url=remove_url_trailing_slash(base_url) ) + @property async def token_type(self) -> str: return "Bearer" + @property async def token(self) -> str: token = await self._generate_token() return token.access_token diff --git a/cozepy/bots/__init__.py b/cozepy/bots/__init__.py index 0db348c..98aa27c 100644 --- a/cozepy/bots/__init__.py +++ b/cozepy/bots/__init__.py @@ -1,7 +1,6 @@ from enum import IntEnum from typing import List, Optional -from cozepy.auth import Auth, AsyncAuth from cozepy.model import AsyncNumberPaged, CozeModel, NumberPaged, NumberPagedResponse from cozepy.request import HTTPRequest, Requester from cozepy.util import remove_url_trailing_slash @@ -130,9 +129,8 @@ class BotsClient(object): Bot class. """ - def __init__(self, base_url: str, auth: Auth, requester: Requester): + def __init__(self, base_url: str, requester: Requester): self._base_url = remove_url_trailing_slash(base_url) - self._auth = auth self._requester = requester def create( @@ -284,9 +282,8 @@ class AsyncBotsClient(object): Bot class. """ - def __init__(self, base_url: str, auth: AsyncAuth, requester: Requester): + def __init__(self, base_url: str, requester: Requester): self._base_url = remove_url_trailing_slash(base_url) - self._auth = auth self._requester = requester async def create( diff --git a/cozepy/chat/__init__.py b/cozepy/chat/__init__.py index c358c19..e5126b2 100644 --- a/cozepy/chat/__init__.py +++ b/cozepy/chat/__init__.py @@ -7,7 +7,6 @@ import httpx from typing_extensions import Literal -from cozepy.auth import Auth, AsyncAuth from cozepy.model import AsyncIteratorHTTPResponse, AsyncStream, CozeModel, IteratorHTTPResponse, ListResponse, Stream from cozepy.request import Requester from cozepy.util import remove_url_trailing_slash @@ -427,9 +426,8 @@ class ToolOutput(CozeModel): class ChatClient(object): - def __init__(self, base_url: str, auth: Auth, requester: Requester): + def __init__(self, base_url: str, requester: Requester): self._base_url = remove_url_trailing_slash(base_url) - self._auth = auth self._requester = requester self._messages: Optional[ChatMessagesClient] = None @@ -758,14 +756,13 @@ def messages( if self._messages is None: from .message import ChatMessagesClient - self._messages = ChatMessagesClient(self._base_url, self._auth, self._requester) + self._messages = ChatMessagesClient(self._base_url, self._requester) return self._messages class AsyncChatClient(object): - def __init__(self, base_url: str, auth: AsyncAuth, requester: Requester): + def __init__(self, base_url: str, requester: Requester): self._base_url = remove_url_trailing_slash(base_url) - self._auth = auth self._requester = requester self._messages: Optional[AsyncChatMessagesClient] = None @@ -1065,5 +1062,5 @@ def messages( if self._messages is None: from .message import AsyncChatMessagesClient - self._messages = AsyncChatMessagesClient(self._base_url, self._auth, self._requester) + self._messages = AsyncChatMessagesClient(self._base_url, self._requester) return self._messages diff --git a/cozepy/chat/message/__init__.py b/cozepy/chat/message/__init__.py index b08b5ae..789342c 100644 --- a/cozepy/chat/message/__init__.py +++ b/cozepy/chat/message/__init__.py @@ -1,4 +1,3 @@ -from cozepy.auth import Auth, AsyncAuth from cozepy.chat import Message from cozepy.model import ListResponse from cozepy.request import Requester @@ -6,9 +5,8 @@ class ChatMessagesClient(object): - def __init__(self, base_url: str, auth: Auth, requester: Requester): + def __init__(self, base_url: str, requester: Requester): self._base_url = remove_url_trailing_slash(base_url) - self._auth = auth self._requester = requester def list( @@ -37,9 +35,8 @@ def list( class AsyncChatMessagesClient(object): - def __init__(self, base_url: str, auth: AsyncAuth, requester: Requester): + def __init__(self, base_url: str, requester: Requester): self._base_url = remove_url_trailing_slash(base_url) - self._auth = auth self._requester = requester async def list( diff --git a/cozepy/conversations/__init__.py b/cozepy/conversations/__init__.py index 219f1c4..140e354 100644 --- a/cozepy/conversations/__init__.py +++ b/cozepy/conversations/__init__.py @@ -1,6 +1,5 @@ from typing import Any, Dict, List, Optional -from cozepy.auth import Auth, AsyncAuth from cozepy.chat import Message from cozepy.model import AsyncNumberPaged, CozeModel, HTTPRequest, NumberPaged from cozepy.request import Requester @@ -35,9 +34,8 @@ def get_items(self) -> List[Conversation]: class ConversationsClient(object): - def __init__(self, base_url: str, auth: Auth, requester: Requester): + def __init__(self, base_url: str, requester: Requester): self._base_url = remove_url_trailing_slash(base_url) - self._auth = auth self._requester = requester self._messages = None @@ -124,14 +122,13 @@ def messages(self): if not self._messages: from .message import MessagesClient - self._messages = MessagesClient(self._base_url, self._auth, self._requester) + self._messages = MessagesClient(self._base_url, self._requester) return self._messages class AsyncConversationsClient(object): - def __init__(self, base_url: str, auth: AsyncAuth, requester: Requester): + def __init__(self, base_url: str, requester: Requester): self._base_url = remove_url_trailing_slash(base_url) - self._auth = auth self._requester = requester self._messages = None @@ -218,5 +215,5 @@ def messages(self): if not self._messages: from .message import AsyncMessagesClient - self._messages = AsyncMessagesClient(self._base_url, self._auth, self._requester) + self._messages = AsyncMessagesClient(self._base_url, self._requester) return self._messages diff --git a/cozepy/conversations/message/__init__.py b/cozepy/conversations/message/__init__.py index 30bbd24..e6d046c 100644 --- a/cozepy/conversations/message/__init__.py +++ b/cozepy/conversations/message/__init__.py @@ -1,6 +1,5 @@ from typing import Dict, List, Optional -from cozepy.auth import Auth, AsyncAuth from cozepy.chat import Message, MessageContentType, MessageRole from cozepy.model import AsyncLastIDPaged, CozeModel, HTTPRequest, LastIDPaged, LastIDPagedResponse from cozepy.request import Requester @@ -31,9 +30,8 @@ class MessagesClient(object): Message class. """ - def __init__(self, base_url: str, auth: Auth, requester: Requester): + def __init__(self, base_url: str, requester: Requester): self._base_url = remove_url_trailing_slash(base_url) - self._auth = auth self._requester = requester def create( @@ -215,9 +213,8 @@ class AsyncMessagesClient(object): Message class. """ - def __init__(self, base_url: str, auth: AsyncAuth, requester: Requester): + def __init__(self, base_url: str, requester: Requester): self._base_url = remove_url_trailing_slash(base_url) - self._auth = auth self._requester = requester async def create( diff --git a/cozepy/coze.py b/cozepy/coze.py index 86c418d..bf0e7e4 100644 --- a/cozepy/coze.py +++ b/cozepy/coze.py @@ -50,7 +50,7 @@ def bots(self) -> "BotsClient": if not self._bots: from cozepy.bots import BotsClient - self._bots = BotsClient(self._base_url, self._auth, self._requester) + self._bots = BotsClient(self._base_url, self._requester) return self._bots @property @@ -58,7 +58,7 @@ def workspaces(self) -> "WorkspacesClient": if not self._workspaces: from .workspaces import WorkspacesClient - self._workspaces = WorkspacesClient(self._base_url, self._auth, self._requester) + self._workspaces = WorkspacesClient(self._base_url, self._requester) return self._workspaces @property @@ -66,7 +66,7 @@ def conversations(self) -> "ConversationsClient": if not self._conversations: from .conversations import ConversationsClient - self._conversations = ConversationsClient(self._base_url, self._auth, self._requester) + self._conversations = ConversationsClient(self._base_url, self._requester) return self._conversations @property @@ -74,7 +74,7 @@ def chat(self) -> "ChatClient": if not self._chat: from cozepy.chat import ChatClient - self._chat = ChatClient(self._base_url, self._auth, self._requester) + self._chat = ChatClient(self._base_url, self._requester) return self._chat @property @@ -82,7 +82,7 @@ def files(self) -> "FilesClient": if not self._files: from .files import FilesClient - self._files = FilesClient(self._base_url, self._auth, self._requester) + self._files = FilesClient(self._base_url, self._requester) return self._files @property @@ -90,7 +90,7 @@ def workflows(self) -> "WorkflowsClient": if not self._workflows: from .workflows import WorkflowsClient - self._workflows = WorkflowsClient(self._base_url, self._auth, self._requester) + self._workflows = WorkflowsClient(self._base_url, self._requester) return self._workflows @property @@ -104,7 +104,7 @@ def knowledge(self) -> "KnowledgeClient": if not self._knowledge: from .knowledge import KnowledgeClient - self._knowledge = KnowledgeClient(self._base_url, self._auth, self._requester) + self._knowledge = KnowledgeClient(self._base_url, self._requester) return self._knowledge @property @@ -112,7 +112,7 @@ def datasets(self) -> "DatasetsClient": if not self._datasets: from .datasets import DatasetsClient - self._datasets = DatasetsClient(self._base_url, self._auth, self._requester) + self._datasets = DatasetsClient(self._base_url, self._requester) return self._datasets @property @@ -120,7 +120,7 @@ def audio(self) -> "AudioClient": if not self._audio: from .audio import AudioClient - self._audio = AudioClient(self._base_url, self._auth, self._requester) + self._audio = AudioClient(self._base_url, self._requester) return self._audio @property @@ -128,7 +128,7 @@ def templates(self) -> "TemplatesClient": if not self._templates: from .templates import TemplatesClient - self._templates = TemplatesClient(self._base_url, self._auth, self._requester) + self._templates = TemplatesClient(self._base_url, self._requester) return self._templates @property @@ -136,20 +136,29 @@ def users(self) -> "UsersClient": if not self._users: from .users import UsersClient - self._users = UsersClient(self._base_url, self._auth, self._requester) + self._users = UsersClient(self._base_url, self._requester) return self._users class AsyncCoze(object): def __init__( self, - auth: AsyncAuth, + auth: Auth | AsyncAuth, base_url: str = COZE_COM_BASE_URL, http_client: Optional[AsyncHTTPClient] = None, ): self._auth = auth self._base_url = remove_url_trailing_slash(base_url) - self._requester = Requester(async_auth=auth, async_client=http_client) + if isinstance(auth, Auth): + warnings.warn( + "The 'coze.Auth' use for AsyncCoze is deprecated and will be removed in a future version. " + "Please use 'coze.AsyncAuth' instead.", + DeprecationWarning, + stacklevel=2, + ) + self._requester = Requester(auth=auth, sync_client=http_client) + else: + self._requester = Requester(async_auth=auth, async_client=http_client) # service client self._bots: Optional[AsyncBotsClient] = None @@ -170,7 +179,7 @@ def bots(self) -> "AsyncBotsClient": if not self._bots: from cozepy.bots import AsyncBotsClient - self._bots = AsyncBotsClient(self._base_url, self._auth, self._requester) + self._bots = AsyncBotsClient(self._base_url, self._requester) return self._bots @property @@ -178,7 +187,7 @@ def chat(self) -> "AsyncChatClient": if not self._chat: from cozepy.chat import AsyncChatClient - self._chat = AsyncChatClient(self._base_url, self._auth, self._requester) + self._chat = AsyncChatClient(self._base_url, self._requester) return self._chat @property @@ -186,7 +195,7 @@ def conversations(self) -> "AsyncConversationsClient": if not self._conversations: from .conversations import AsyncConversationsClient - self._conversations = AsyncConversationsClient(self._base_url, self._auth, self._requester) + self._conversations = AsyncConversationsClient(self._base_url, self._requester) return self._conversations @property @@ -194,7 +203,7 @@ def files(self) -> "AsyncFilesClient": if not self._files: from .files import AsyncFilesClient - self._files = AsyncFilesClient(self._base_url, self._auth, self._requester) + self._files = AsyncFilesClient(self._base_url, self._requester) return self._files @property @@ -208,7 +217,7 @@ def knowledge(self) -> "AsyncKnowledgeClient": if not self._knowledge: from .knowledge import AsyncKnowledgeClient - self._knowledge = AsyncKnowledgeClient(self._base_url, self._auth, self._requester) + self._knowledge = AsyncKnowledgeClient(self._base_url, self._requester) return self._knowledge @property @@ -216,7 +225,7 @@ def datasets(self) -> "AsyncDatasetsClient": if not self._datasets: from .datasets import AsyncDatasetsClient - self._datasets = AsyncDatasetsClient(self._base_url, self._auth, self._requester) + self._datasets = AsyncDatasetsClient(self._base_url, self._requester) return self._datasets @property @@ -224,7 +233,7 @@ def workflows(self) -> "AsyncWorkflowsClient": if not self._workflows: from .workflows import AsyncWorkflowsClient - self._workflows = AsyncWorkflowsClient(self._base_url, self._auth, self._requester) + self._workflows = AsyncWorkflowsClient(self._base_url, self._requester) return self._workflows @property @@ -232,7 +241,7 @@ def workspaces(self) -> "AsyncWorkspacesClient": if not self._workspaces: from .workspaces import AsyncWorkspacesClient - self._workspaces = AsyncWorkspacesClient(self._base_url, self._auth, self._requester) + self._workspaces = AsyncWorkspacesClient(self._base_url, self._requester) return self._workspaces @property @@ -240,7 +249,7 @@ def audio(self) -> "AsyncAudioClient": if not self._audio: from .audio import AsyncAudioClient - self._audio = AsyncAudioClient(self._base_url, self._auth, self._requester) + self._audio = AsyncAudioClient(self._base_url, self._requester) return self._audio @property @@ -248,7 +257,7 @@ def templates(self) -> "AsyncTemplatesClient": if not self._templates: from .templates import AsyncTemplatesClient - self._templates = AsyncTemplatesClient(self._base_url, self._auth, self._requester) + self._templates = AsyncTemplatesClient(self._base_url, self._requester) return self._templates @property @@ -256,7 +265,7 @@ def users(self) -> "AsyncUsersClient": if not self._users: from .users import AsyncUsersClient - self._users = AsyncUsersClient(self._base_url, self._auth, self._requester) + self._users = AsyncUsersClient(self._base_url, self._requester) return self._users @property @@ -264,5 +273,5 @@ def websockets(self) -> "AsyncWebsocketsClient": if not self._websockets: from .websockets import AsyncWebsocketsClient - self._websockets = AsyncWebsocketsClient(self._base_url, self._auth, self._requester) + self._websockets = AsyncWebsocketsClient(self._base_url, self._requester) return self._websockets diff --git a/cozepy/datasets/__init__.py b/cozepy/datasets/__init__.py index 20a8cd1..29d7b6c 100644 --- a/cozepy/datasets/__init__.py +++ b/cozepy/datasets/__init__.py @@ -1,7 +1,6 @@ from enum import IntEnum from typing import TYPE_CHECKING, List, Optional -from cozepy.auth import Auth from cozepy.datasets.documents import DocumentChunkStrategy, DocumentFormatType, DocumentStatus, DocumentUpdateType from cozepy.model import AsyncNumberPaged, CozeModel, HTTPRequest, ListResponse, NumberPaged, NumberPagedResponse from cozepy.request import Requester @@ -86,9 +85,8 @@ class DeleteDatasetRes(CozeModel): class DatasetsClient(object): - def __init__(self, base_url: str, auth: Auth, requester: Requester): + def __init__(self, base_url: str, requester: Requester): self._base_url = remove_url_trailing_slash(base_url) - self._auth = auth self._requester = requester self._documents: Optional[DatasetsDocumentsClient] = None self._images: Optional[DatasetsImagesClient] = None @@ -99,7 +97,7 @@ def documents(self) -> "DatasetsDocumentsClient": from .documents import DatasetsDocumentsClient self._documents = DatasetsDocumentsClient( - base_url=self._base_url, auth=self._auth, requester=self._requester + base_url=self._base_url, requester=self._requester ) return self._documents @@ -108,7 +106,7 @@ def images(self) -> "DatasetsImagesClient": if self._images is None: from .images import DatasetsImagesClient - self._images = DatasetsImagesClient(base_url=self._base_url, auth=self._auth, requester=self._requester) + self._images = DatasetsImagesClient(base_url=self._base_url, requester=self._requester) return self._images def create( @@ -287,9 +285,8 @@ def process( class AsyncDatasetsClient(object): - def __init__(self, base_url: str, auth: Auth, requester: Requester): + def __init__(self, base_url: str, requester: Requester): self._base_url = remove_url_trailing_slash(base_url) - self._auth = auth self._requester = requester self._documents: Optional[AsyncDatasetsDocumentsClient] = None self._images: Optional[AsyncDatasetsImagesClient] = None @@ -300,7 +297,7 @@ def documents(self) -> "AsyncDatasetsDocumentsClient": from .documents import AsyncDatasetsDocumentsClient self._documents = AsyncDatasetsDocumentsClient( - base_url=self._base_url, auth=self._auth, requester=self._requester + base_url=self._base_url, requester=self._requester ) return self._documents @@ -310,7 +307,7 @@ def images(self) -> "AsyncDatasetsImagesClient": from .images import AsyncDatasetsImagesClient self._images = AsyncDatasetsImagesClient( - base_url=self._base_url, auth=self._auth, requester=self._requester + base_url=self._base_url, requester=self._requester ) return self._images diff --git a/cozepy/datasets/documents/__init__.py b/cozepy/datasets/documents/__init__.py index 703c369..09f41ba 100644 --- a/cozepy/datasets/documents/__init__.py +++ b/cozepy/datasets/documents/__init__.py @@ -1,7 +1,6 @@ from enum import IntEnum from typing import List, Optional -from cozepy.auth import Auth from cozepy.model import AsyncNumberPaged, CozeModel, HTTPRequest, ListResponse, NumberPaged, NumberPagedResponse from cozepy.request import Requester from cozepy.util import base64_encode_string, remove_url_trailing_slash @@ -284,9 +283,8 @@ def get_items(self) -> List[Document]: class DatasetsDocumentsClient(object): - def __init__(self, base_url: str, auth: Auth, requester: Requester): + def __init__(self, base_url: str, requester: Requester): self._base_url = remove_url_trailing_slash(base_url) - self._auth = auth self._requester = requester def create( @@ -434,9 +432,8 @@ def request_maker(i_page_num: int, i_page_size: int) -> HTTPRequest: class AsyncDatasetsDocumentsClient(object): - def __init__(self, base_url: str, auth: Auth, requester: Requester): + def __init__(self, base_url: str, requester: Requester): self._base_url = remove_url_trailing_slash(base_url) - self._auth = auth self._requester = requester async def create( diff --git a/cozepy/datasets/images/__init__.py b/cozepy/datasets/images/__init__.py index 94f9cbe..bd965e3 100644 --- a/cozepy/datasets/images/__init__.py +++ b/cozepy/datasets/images/__init__.py @@ -1,7 +1,6 @@ from enum import IntEnum from typing import List, Optional -from cozepy.auth import Auth from cozepy.datasets.documents import DocumentSourceType from cozepy.model import AsyncNumberPaged, CozeModel, HTTPRequest, NumberPaged, NumberPagedResponse from cozepy.request import Requester @@ -47,9 +46,8 @@ def get_items(self) -> List[Photo]: class DatasetsImagesClient(object): - def __init__(self, base_url: str, auth: Auth, requester: Requester): + def __init__(self, base_url: str, requester: Requester): self._base_url = remove_url_trailing_slash(base_url) - self._auth = auth self._requester = requester def update( @@ -129,9 +127,8 @@ def request_maker(i_page_num: int, i_page_size: int) -> HTTPRequest: class AsyncDatasetsImagesClient(object): - def __init__(self, base_url: str, auth: Auth, requester: Requester): + def __init__(self, base_url: str, requester: Requester): self._base_url = remove_url_trailing_slash(base_url) - self._auth = auth self._requester = requester async def update( diff --git a/cozepy/files/__init__.py b/cozepy/files/__init__.py index 7e1a947..5858fe2 100644 --- a/cozepy/files/__init__.py +++ b/cozepy/files/__init__.py @@ -2,7 +2,6 @@ from pathlib import Path from typing import IO, Optional, Tuple, Union -from cozepy.auth import Auth, AsyncAuth from cozepy.model import CozeModel from cozepy.request import Requester from cozepy.util import remove_url_trailing_slash @@ -49,9 +48,8 @@ def _try_fix_file(file: FileTypes) -> FileTypes: class FilesClient(object): - def __init__(self, base_url: str, auth: Auth, requester: Requester): + def __init__(self, base_url: str, requester: Requester): self._base_url = remove_url_trailing_slash(base_url) - self._auth = auth self._requester = requester def upload(self, *, file: FileTypes) -> File: @@ -93,9 +91,8 @@ def retrieve(self, *, file_id: str): class AsyncFilesClient(object): - def __init__(self, base_url: str, auth: AsyncAuth, requester: Requester): + def __init__(self, base_url: str, requester: Requester): self._base_url = remove_url_trailing_slash(base_url) - self._auth = auth self._requester = requester async def upload(self, *, file: FileTypes) -> File: diff --git a/cozepy/knowledge/__init__.py b/cozepy/knowledge/__init__.py index 088871f..fe9e3d6 100644 --- a/cozepy/knowledge/__init__.py +++ b/cozepy/knowledge/__init__.py @@ -1,7 +1,6 @@ import warnings from typing import TYPE_CHECKING, Optional -from cozepy.auth import Auth, AsyncAuth from cozepy.request import Requester from cozepy.util import remove_url_trailing_slash @@ -10,7 +9,7 @@ class KnowledgeClient(object): - def __init__(self, base_url: str, auth: Auth, requester: Requester): + def __init__(self, base_url: str, requester: Requester): warnings.warn( "The 'coze.knowledge' module is deprecated and will be removed in a future version. " "Please use 'coze.datasets' instead.", @@ -18,7 +17,6 @@ def __init__(self, base_url: str, auth: Auth, requester: Requester): stacklevel=2, ) self._base_url = remove_url_trailing_slash(base_url) - self._auth = auth self._requester = requester self._documents: Optional[DocumentsClient] = None @@ -33,12 +31,12 @@ def documents(self) -> "DocumentsClient": if self._documents is None: from .documents import DocumentsClient - self._documents = DocumentsClient(base_url=self._base_url, auth=self._auth, requester=self._requester) + self._documents = DocumentsClient(base_url=self._base_url, requester=self._requester) return self._documents class AsyncKnowledgeClient(object): - def __init__(self, base_url: str, auth: AsyncAuth, requester: Requester): + def __init__(self, base_url: str, requester: Requester): warnings.warn( "The 'coze.knowledge' module is deprecated and will be removed in a future version. " "Please use 'coze.datasets' instead.", @@ -46,7 +44,6 @@ def __init__(self, base_url: str, auth: AsyncAuth, requester: Requester): stacklevel=2, ) self._base_url = remove_url_trailing_slash(base_url) - self._auth = auth self._requester = requester self._documents: Optional[AsyncDocumentsClient] = None @@ -61,5 +58,5 @@ def documents(self) -> "AsyncDocumentsClient": if self._documents is None: from .documents import AsyncDocumentsClient - self._documents = AsyncDocumentsClient(base_url=self._base_url, auth=self._auth, requester=self._requester) + self._documents = AsyncDocumentsClient(base_url=self._base_url, requester=self._requester) return self._documents diff --git a/cozepy/knowledge/documents/__init__.py b/cozepy/knowledge/documents/__init__.py index 57f9938..81146bd 100644 --- a/cozepy/knowledge/documents/__init__.py +++ b/cozepy/knowledge/documents/__init__.py @@ -1,17 +1,16 @@ import warnings from typing import List, Optional -from cozepy.auth import Auth, AsyncAuth from cozepy.datasets.documents import ( Document, # noqa DocumentBase, # noqa DocumentChunkStrategy, # noqa - DocumentFormatType, # noqa - DocumentSourceInfo, # noqa - DocumentSourceType, # noqa - DocumentStatus, # noqa + # noqa + # noqa + # noqa + # noqa DocumentUpdateRule, # noqa - DocumentUpdateType, # noqa + # noqa ) from cozepy.model import AsyncNumberPaged, CozeModel, HTTPRequest, NumberPaged, NumberPagedResponse from cozepy.request import Requester @@ -33,7 +32,7 @@ def get_items(self) -> List[Document]: class DocumentsClient(object): - def __init__(self, base_url: str, auth: Auth, requester: Requester): + def __init__(self, base_url: str, requester: Requester): warnings.warn( "The 'coze.knowledge.documents' module is deprecated and will be removed in a future version. " "Please use 'coze.datasets' instead.", @@ -41,7 +40,6 @@ def __init__(self, base_url: str, auth: Auth, requester: Requester): stacklevel=2, ) self._base_url = remove_url_trailing_slash(base_url) - self._auth = auth self._requester = requester def create( @@ -212,7 +210,7 @@ def request_maker(i_page_num: int, i_page_size: int) -> HTTPRequest: class AsyncDocumentsClient(object): - def __init__(self, base_url: str, auth: AsyncAuth, requester: Requester): + def __init__(self, base_url: str, requester: Requester): warnings.warn( "The 'coze.knowledge.documents' module is deprecated and will be removed in a future version. " "Please use 'coze.datasets.documents' instead.", @@ -220,7 +218,6 @@ def __init__(self, base_url: str, auth: AsyncAuth, requester: Requester): stacklevel=2, ) self._base_url = remove_url_trailing_slash(base_url) - self._auth = auth self._requester = requester async def create( diff --git a/cozepy/request.py b/cozepy/request.py index 114f605..ebc834d 100644 --- a/cozepy/request.py +++ b/cozepy/request.py @@ -66,6 +66,16 @@ def __init__( self._sync_client = sync_client self._async_client = async_client + def auth_header(self, headers: dict): + self._auth.authentication(headers) + + async def async_auth_header(self, headers: dict): + if self._auth: + # Compatible with old versions, the next version will be removed + self._auth.authentication(headers) + elif self._async_auth: + await self._async_auth.authentication(headers) + def make_request( self, method: str, @@ -124,7 +134,11 @@ async def amake_request( headers = {} headers["User-Agent"] = user_agent() headers["X-Coze-Client-User-Agent"] = coze_client_user_agent() - if self._async_auth: + + if self._auth: + # Compatible with old versions, the next version will be removed + self._auth.authentication(headers) + elif self._async_auth: await self._async_auth.authentication(headers) log_debug( diff --git a/cozepy/templates/__init__.py b/cozepy/templates/__init__.py index 509b375..66a9b15 100644 --- a/cozepy/templates/__init__.py +++ b/cozepy/templates/__init__.py @@ -1,7 +1,6 @@ from enum import Enum from typing import Optional -from cozepy.auth import Auth from cozepy.model import CozeModel from cozepy.request import Requester from cozepy.util import remove_url_trailing_slash @@ -17,9 +16,8 @@ class TemplateDuplicateResp(CozeModel): class TemplatesClient(object): - def __init__(self, base_url: str, auth: Auth, requester: Requester): + def __init__(self, base_url: str, requester: Requester): self._base_url = remove_url_trailing_slash(base_url) - self._auth = auth self._requester = requester def duplicate( @@ -35,9 +33,8 @@ def duplicate( class AsyncTemplatesClient(object): - def __init__(self, base_url: str, auth: Auth, requester: Requester): + def __init__(self, base_url: str, requester: Requester): self._base_url = remove_url_trailing_slash(base_url) - self._auth = auth self._requester = requester async def duplicate( diff --git a/cozepy/users/__init__.py b/cozepy/users/__init__.py index 22928a8..49b45bb 100644 --- a/cozepy/users/__init__.py +++ b/cozepy/users/__init__.py @@ -1,6 +1,5 @@ from typing import Optional -from cozepy.auth import Auth from cozepy.model import CozeModel from cozepy.request import Requester from cozepy.util import remove_url_trailing_slash @@ -14,9 +13,8 @@ class User(CozeModel): class UsersClient(object): - def __init__(self, base_url: str, auth: Auth, requester: Requester): + def __init__(self, base_url: str, requester: Requester): self._base_url = remove_url_trailing_slash(base_url) - self._auth = auth self._requester = requester def me(self, **kwargs) -> User: @@ -26,9 +24,8 @@ def me(self, **kwargs) -> User: class AsyncUsersClient(object): - def __init__(self, base_url: str, auth: Auth, requester: Requester): + def __init__(self, base_url: str, requester: Requester): self._base_url = remove_url_trailing_slash(base_url) - self._auth = auth self._requester = requester async def me(self, **kwargs) -> User: diff --git a/cozepy/websockets/__init__.py b/cozepy/websockets/__init__.py index 918fe9c..46c52e7 100644 --- a/cozepy/websockets/__init__.py +++ b/cozepy/websockets/__init__.py @@ -1,23 +1,19 @@ -from cozepy import Auth from cozepy.request import Requester from cozepy.util import http_base_url_to_ws, remove_url_trailing_slash from .audio import AsyncWebsocketsAudioClient, WebsocketsAudioClient from .chat import AsyncWebsocketsChatBuildClient, WebsocketsChatBuildClient -from ..auth import AsyncAuth class WebsocketsClient(object): - def __init__(self, base_url: str, auth: Auth, requester: Requester): + def __init__(self, base_url: str, requester: Requester): self._base_url = http_base_url_to_ws(remove_url_trailing_slash(base_url)) - self._auth = auth self._requester = requester @property def audio(self) -> WebsocketsAudioClient: return WebsocketsAudioClient( base_url=self._base_url, - auth=self._auth, requester=self._requester, ) @@ -25,22 +21,19 @@ def audio(self) -> WebsocketsAudioClient: def chat(self) -> WebsocketsChatBuildClient: return WebsocketsChatBuildClient( base_url=self._base_url, - auth=self._auth, requester=self._requester, ) class AsyncWebsocketsClient(object): - def __init__(self, base_url: str, auth: AsyncAuth, requester: Requester): + def __init__(self, base_url: str, requester: Requester): self._base_url = http_base_url_to_ws(remove_url_trailing_slash(base_url)) - self._auth = auth self._requester = requester @property def audio(self) -> AsyncWebsocketsAudioClient: return AsyncWebsocketsAudioClient( base_url=self._base_url, - auth=self._auth, requester=self._requester, ) @@ -48,6 +41,5 @@ def audio(self) -> AsyncWebsocketsAudioClient: def chat(self) -> AsyncWebsocketsChatBuildClient: return AsyncWebsocketsChatBuildClient( base_url=self._base_url, - auth=self._auth, requester=self._requester, ) diff --git a/cozepy/websockets/audio/__init__.py b/cozepy/websockets/audio/__init__.py index 4aeb48f..8c8ccce 100644 --- a/cozepy/websockets/audio/__init__.py +++ b/cozepy/websockets/audio/__init__.py @@ -1,4 +1,3 @@ -from cozepy.auth import Auth, AsyncAuth from cozepy.request import Requester from .speech import AsyncWebsocketsAudioSpeechBuildClient, WebsocketsAudioSpeechBuildClient @@ -6,16 +5,14 @@ class WebsocketsAudioClient(object): - def __init__(self, base_url: str, auth: Auth, requester: Requester): + def __init__(self, base_url: str, requester: Requester): self._base_url = base_url - self._auth = auth self._requester = requester @property def transcriptions(self) -> "WebsocketsAudioTranscriptionsBuildClient": return WebsocketsAudioTranscriptionsBuildClient( base_url=self._base_url, - auth=self._auth, requester=self._requester, ) @@ -23,22 +20,19 @@ def transcriptions(self) -> "WebsocketsAudioTranscriptionsBuildClient": def speech(self) -> "WebsocketsAudioSpeechBuildClient": return WebsocketsAudioSpeechBuildClient( base_url=self._base_url, - auth=self._auth, requester=self._requester, ) class AsyncWebsocketsAudioClient(object): - def __init__(self, base_url: str, auth: AsyncAuth, requester: Requester): + def __init__(self, base_url: str, requester: Requester): self._base_url = base_url - self._auth = auth self._requester = requester @property def transcriptions(self) -> "AsyncWebsocketsAudioTranscriptionsBuildClient": return AsyncWebsocketsAudioTranscriptionsBuildClient( base_url=self._base_url, - auth=self._auth, requester=self._requester, ) @@ -46,6 +40,5 @@ def transcriptions(self) -> "AsyncWebsocketsAudioTranscriptionsBuildClient": def speech(self) -> "AsyncWebsocketsAudioSpeechBuildClient": return AsyncWebsocketsAudioSpeechBuildClient( base_url=self._base_url, - auth=self._auth, requester=self._requester, ) diff --git a/cozepy/websockets/audio/speech/__init__.py b/cozepy/websockets/audio/speech/__init__.py index 7d976ec..dc20101 100644 --- a/cozepy/websockets/audio/speech/__init__.py +++ b/cozepy/websockets/audio/speech/__init__.py @@ -3,7 +3,6 @@ from pydantic import BaseModel, field_serializer -from cozepy.auth import Auth, AsyncAuth from cozepy.log import log_warning from cozepy.request import Requester from cozepy.util import remove_url_trailing_slash @@ -87,7 +86,6 @@ class WebsocketsAudioSpeechClient(WebsocketsBaseClient): def __init__( self, base_url: str, - auth: Auth, requester: Requester, on_event: Union[WebsocketsAudioSpeechEventHandler, Dict[WebsocketsEventType, Callable]], **kwargs, @@ -103,7 +101,6 @@ def __init__( ) super().__init__( base_url=base_url, - auth=auth, requester=requester, path="v1/audio/speech", on_event=on_event, # type: ignore @@ -162,9 +159,8 @@ def _load_event(self, message: Dict) -> Optional[WebsocketsEvent]: class WebsocketsAudioSpeechBuildClient(object): - def __init__(self, base_url: str, auth: Auth, requester: Requester): + def __init__(self, base_url: str, requester: Requester): self._base_url = remove_url_trailing_slash(base_url) - self._auth = auth self._requester = requester def create( @@ -172,7 +168,6 @@ def create( ) -> WebsocketsAudioSpeechClient: return WebsocketsAudioSpeechClient( base_url=self._base_url, - auth=self._auth, requester=self._requester, on_event=on_event, # type: ignore **kwargs, @@ -201,7 +196,6 @@ class AsyncWebsocketsAudioSpeechClient(AsyncWebsocketsBaseClient): def __init__( self, base_url: str, - auth: AsyncAuth, requester: Requester, on_event: Union[AsyncWebsocketsAudioSpeechEventHandler, Dict[WebsocketsEventType, Callable]], **kwargs, @@ -217,7 +211,6 @@ def __init__( ) super().__init__( base_url=base_url, - auth=auth, requester=requester, path="v1/audio/speech", on_event=on_event, # type: ignore @@ -271,9 +264,8 @@ def _load_event(self, message: Dict) -> Optional[WebsocketsEvent]: class AsyncWebsocketsAudioSpeechBuildClient(object): - def __init__(self, base_url: str, auth: AsyncAuth, requester: Requester): + def __init__(self, base_url: str, requester: Requester): self._base_url = remove_url_trailing_slash(base_url) - self._auth = auth self._requester = requester def create( @@ -284,7 +276,6 @@ def create( ) -> AsyncWebsocketsAudioSpeechClient: return AsyncWebsocketsAudioSpeechClient( base_url=self._base_url, - auth=self._auth, requester=self._requester, on_event=on_event, # type: ignore **kwargs, diff --git a/cozepy/websockets/audio/transcriptions/__init__.py b/cozepy/websockets/audio/transcriptions/__init__.py index 6b3ab5b..5323fc8 100644 --- a/cozepy/websockets/audio/transcriptions/__init__.py +++ b/cozepy/websockets/audio/transcriptions/__init__.py @@ -3,7 +3,6 @@ from pydantic import BaseModel, field_serializer -from cozepy.auth import Auth, AsyncAuth from cozepy.log import log_warning from cozepy.request import Requester from cozepy.util import remove_url_trailing_slash @@ -103,7 +102,6 @@ class WebsocketsAudioTranscriptionsClient(WebsocketsBaseClient): def __init__( self, base_url: str, - auth: Auth, requester: Requester, on_event: Union[WebsocketsAudioTranscriptionsEventHandler, Dict[WebsocketsEventType, Callable]], **kwargs, @@ -119,7 +117,6 @@ def __init__( ) super().__init__( base_url=base_url, - auth=auth, requester=requester, path="v1/audio/transcriptions", on_event=on_event, # type: ignore @@ -180,9 +177,8 @@ def _load_event(self, message: Dict) -> Optional[WebsocketsEvent]: class WebsocketsAudioTranscriptionsBuildClient(object): - def __init__(self, base_url: str, auth: Auth, requester: Requester): + def __init__(self, base_url: str, requester: Requester): self._base_url = remove_url_trailing_slash(base_url) - self._auth = auth self._requester = requester def create( @@ -193,7 +189,6 @@ def create( ) -> WebsocketsAudioTranscriptionsClient: return WebsocketsAudioTranscriptionsClient( base_url=self._base_url, - auth=self._auth, requester=self._requester, on_event=on_event, # type: ignore **kwargs, @@ -226,7 +221,6 @@ class AsyncWebsocketsAudioTranscriptionsClient(AsyncWebsocketsBaseClient): def __init__( self, base_url: str, - auth: AsyncAuth, requester: Requester, on_event: Union[AsyncWebsocketsAudioTranscriptionsEventHandler, Dict[WebsocketsEventType, Callable]], **kwargs, @@ -242,7 +236,6 @@ def __init__( ) super().__init__( base_url=base_url, - auth=auth, requester=requester, path="v1/audio/transcriptions", on_event=on_event, # type: ignore @@ -303,9 +296,8 @@ def _load_event(self, message: Dict) -> Optional[WebsocketsEvent]: class AsyncWebsocketsAudioTranscriptionsBuildClient(object): - def __init__(self, base_url: str, auth: AsyncAuth, requester: Requester): + def __init__(self, base_url: str, requester: Requester): self._base_url = remove_url_trailing_slash(base_url) - self._auth = auth self._requester = requester def create( @@ -316,7 +308,6 @@ def create( ) -> AsyncWebsocketsAudioTranscriptionsClient: return AsyncWebsocketsAudioTranscriptionsClient( base_url=self._base_url, - auth=self._auth, requester=self._requester, on_event=on_event, # type: ignore **kwargs, diff --git a/cozepy/websockets/chat/__init__.py b/cozepy/websockets/chat/__init__.py index f205c2c..8fa0068 100644 --- a/cozepy/websockets/chat/__init__.py +++ b/cozepy/websockets/chat/__init__.py @@ -3,7 +3,6 @@ from pydantic import BaseModel from cozepy import Chat, Message, ToolOutput -from cozepy.auth import Auth, AsyncAuth from cozepy.log import log_warning from cozepy.request import Requester from cozepy.util import remove_none_values, remove_url_trailing_slash @@ -165,7 +164,6 @@ class WebsocketsChatClient(WebsocketsBaseClient): def __init__( self, base_url: str, - auth: Auth, requester: Requester, bot_id: str, workflow_id: str, @@ -191,7 +189,6 @@ def __init__( ) super().__init__( base_url=base_url, - auth=auth, requester=requester, path="v1/chat", query=remove_none_values( @@ -319,9 +316,8 @@ def _load_event(self, message: Dict) -> Optional[WebsocketsEvent]: class WebsocketsChatBuildClient(object): - def __init__(self, base_url: str, auth: Auth, requester: Requester): + def __init__(self, base_url: str, requester: Requester): self._base_url = remove_url_trailing_slash(base_url) - self._auth = auth self._requester = requester def create( @@ -334,7 +330,6 @@ def create( ) -> WebsocketsChatClient: return WebsocketsChatClient( base_url=self._base_url, - auth=self._auth, requester=self._requester, bot_id=bot_id, workflow_id=workflow_id, @@ -401,7 +396,6 @@ class AsyncWebsocketsChatClient(AsyncWebsocketsBaseClient): def __init__( self, base_url: str, - auth: AsyncAuth, requester: Requester, bot_id: str, workflow_id: str, @@ -427,7 +421,6 @@ def __init__( ) super().__init__( base_url=base_url, - auth=auth, requester=requester, path="v1/chat", query=remove_none_values( @@ -555,9 +548,8 @@ def _load_event(self, message: Dict) -> Optional[WebsocketsEvent]: class AsyncWebsocketsChatBuildClient(object): - def __init__(self, base_url: str, auth: AsyncAuth, requester: Requester): + def __init__(self, base_url: str, requester: Requester): self._base_url = remove_url_trailing_slash(base_url) - self._auth = auth self._requester = requester def create( @@ -570,7 +562,6 @@ def create( ) -> AsyncWebsocketsChatClient: return AsyncWebsocketsChatClient( base_url=self._base_url, - auth=self._auth, requester=self._requester, bot_id=bot_id, workflow_id=workflow_id, diff --git a/cozepy/websockets/ws.py b/cozepy/websockets/ws.py index 0fb839d..3621b09 100644 --- a/cozepy/websockets/ws.py +++ b/cozepy/websockets/ws.py @@ -10,8 +10,6 @@ from enum import Enum from typing import Callable, Dict, List, Optional, Set -from cozepy.auth import AsyncAuth - if sys.version_info >= (3, 8): # note: >=3.7,<3.8 not support asyncio from websockets import InvalidStatus @@ -46,7 +44,7 @@ class InvalidStatus(object): import websockets.sync.client from pydantic import BaseModel -from cozepy import Auth, CozeAPIError +from cozepy import CozeAPIError from cozepy.log import log_debug, log_error, log_info from cozepy.model import CozeModel from cozepy.request import Requester @@ -165,7 +163,6 @@ class State(str, Enum): def __init__( self, base_url: str, - auth: Auth, requester: Requester, path: str, query: Optional[Dict[str, str]] = None, @@ -175,7 +172,6 @@ def __init__( ): self._state = self.State.INITIALIZED self._base_url = remove_url_trailing_slash(base_url) - self._auth = auth self._requester = requester self._path = path self._ws_url = self._base_url + "/" + path @@ -205,10 +201,12 @@ def connect(self): raise ValueError(f"Cannot connect in {self._state.value} state") self._state = self.State.CONNECTING headers = { - "Authorization": f"Bearer {self._auth.token()}", "X-Coze-Client-User-Agent": coze_client_user_agent(), **(self._headers or {}), } + + self._requester.auth_header(headers) + try: self._ws = websockets.sync.client.connect( self._ws_url, @@ -373,7 +371,6 @@ class State(str, Enum): def __init__( self, base_url: str, - auth: AsyncAuth, requester: Requester, path: str, query: Optional[Dict[str, str]] = None, @@ -383,7 +380,6 @@ def __init__( ): self._state = self.State.INITIALIZED self._base_url = remove_url_trailing_slash(base_url) - self._auth = auth self._requester = requester self._path = path self._ws_url = self._base_url + "/" + path @@ -411,10 +407,12 @@ async def connect(self): raise ValueError(f"Cannot connect in {self._state.value} state") self._state = self.State.CONNECTING headers = { - "Authorization": f"Bearer {await self._auth.token()}", "X-Coze-Client-User-Agent": coze_client_user_agent(), **(self._headers or {}), } + + await self._requester.async_auth_header(headers) + try: self._ws = await asyncio_connect( self._ws_url, diff --git a/cozepy/workflows/__init__.py b/cozepy/workflows/__init__.py index 0b241df..caeeac6 100644 --- a/cozepy/workflows/__init__.py +++ b/cozepy/workflows/__init__.py @@ -1,6 +1,5 @@ from typing import TYPE_CHECKING, Optional -from cozepy.auth import Auth from cozepy.request import Requester from cozepy.util import remove_url_trailing_slash @@ -10,9 +9,8 @@ class WorkflowsClient(object): - def __init__(self, base_url: str, auth: Auth, requester: Requester): + def __init__(self, base_url: str, requester: Requester): self._base_url = remove_url_trailing_slash(base_url) - self._auth = auth self._requester = requester self._runs: Optional[WorkflowsRunsClient] = None self._chat: Optional[WorkflowsChatClient] = None @@ -22,7 +20,7 @@ def runs(self) -> "WorkflowsRunsClient": if not self._runs: from .runs import WorkflowsRunsClient - self._runs = WorkflowsRunsClient(self._base_url, self._auth, self._requester) + self._runs = WorkflowsRunsClient(self._base_url, self._requester) return self._runs @property @@ -30,14 +28,13 @@ def chat(self) -> "WorkflowsChatClient": if not self._chat: from .chat import WorkflowsChatClient - self._chat = WorkflowsChatClient(self._base_url, self._auth, self._requester) + self._chat = WorkflowsChatClient(self._base_url, self._requester) return self._chat class AsyncWorkflowsClient(object): - def __init__(self, base_url: str, auth: Auth, requester: Requester): + def __init__(self, base_url: str, requester: Requester): self._base_url = remove_url_trailing_slash(base_url) - self._auth = auth self._requester = requester self._runs: Optional[AsyncWorkflowsRunsClient] = None self._chat: Optional[AsyncWorkflowsChatClient] = None @@ -47,7 +44,7 @@ def runs(self) -> "AsyncWorkflowsRunsClient": if not self._runs: from .runs import AsyncWorkflowsRunsClient - self._runs = AsyncWorkflowsRunsClient(self._base_url, self._auth, self._requester) + self._runs = AsyncWorkflowsRunsClient(self._base_url, self._requester) return self._runs @property @@ -55,5 +52,5 @@ def chat(self) -> "AsyncWorkflowsChatClient": if not self._chat: from .chat import AsyncWorkflowsChatClient - self._chat = AsyncWorkflowsChatClient(self._base_url, self._auth, self._requester) + self._chat = AsyncWorkflowsChatClient(self._base_url, self._requester) return self._chat diff --git a/cozepy/workflows/chat/__init__.py b/cozepy/workflows/chat/__init__.py index b58701b..80d9f09 100644 --- a/cozepy/workflows/chat/__init__.py +++ b/cozepy/workflows/chat/__init__.py @@ -1,6 +1,5 @@ from typing import Any, AsyncIterator, Dict, List, Optional -from cozepy.auth import Auth from cozepy.chat import ( ChatEvent, Message, @@ -13,9 +12,8 @@ class WorkflowsChatClient(object): - def __init__(self, base_url: str, auth: Auth, requester: Requester): + def __init__(self, base_url: str, requester: Requester): self._base_url = remove_url_trailing_slash(base_url) - self._auth = auth self._requester = requester def stream( @@ -99,9 +97,8 @@ def _create( class AsyncWorkflowsChatClient(object): - def __init__(self, base_url: str, auth: Auth, requester: Requester): + def __init__(self, base_url: str, requester: Requester): self._base_url = remove_url_trailing_slash(base_url) - self._auth = auth self._requester = requester async def stream( diff --git a/cozepy/workflows/runs/__init__.py b/cozepy/workflows/runs/__init__.py index 89a1c12..2f82a37 100644 --- a/cozepy/workflows/runs/__init__.py +++ b/cozepy/workflows/runs/__init__.py @@ -3,7 +3,6 @@ import httpx -from cozepy.auth import Auth from cozepy.model import AsyncIteratorHTTPResponse, AsyncStream, CozeModel, IteratorHTTPResponse, Stream from cozepy.request import Requester from cozepy.util import remove_none_values, remove_url_trailing_slash @@ -150,9 +149,8 @@ def _async_workflow_stream_handler(data: Dict[str, str], raw_response: httpx.Res class WorkflowsRunsClient(object): - def __init__(self, base_url: str, auth: Auth, requester: Requester): + def __init__(self, base_url: str, requester: Requester): self._base_url = remove_url_trailing_slash(base_url) - self._auth = auth self._requester = requester self._run_histories: Optional[WorkflowsRunsRunHistoriesClient] = None @@ -279,14 +277,13 @@ def run_histories(self) -> "WorkflowsRunsRunHistoriesClient": if not self._run_histories: from .run_histories import WorkflowsRunsRunHistoriesClient - self._run_histories = WorkflowsRunsRunHistoriesClient(self._base_url, self._auth, self._requester) + self._run_histories = WorkflowsRunsRunHistoriesClient(self._base_url, self._requester) return self._run_histories class AsyncWorkflowsRunsClient(object): - def __init__(self, base_url: str, auth: Auth, requester: Requester): + def __init__(self, base_url: str, requester: Requester): self._base_url = remove_url_trailing_slash(base_url) - self._auth = auth self._requester = requester self._run_histories: Optional[AsyncWorkflowsRunsRunHistoriesClient] = None @@ -421,5 +418,5 @@ def run_histories(self) -> "AsyncWorkflowsRunsRunHistoriesClient": if not self._run_histories: from .run_histories import AsyncWorkflowsRunsRunHistoriesClient - self._run_histories = AsyncWorkflowsRunsRunHistoriesClient(self._base_url, self._auth, self._requester) + self._run_histories = AsyncWorkflowsRunsRunHistoriesClient(self._base_url, self._requester) return self._run_histories diff --git a/cozepy/workflows/runs/run_histories/__init__.py b/cozepy/workflows/runs/run_histories/__init__.py index 5c50c9f..82dae3a 100644 --- a/cozepy/workflows/runs/run_histories/__init__.py +++ b/cozepy/workflows/runs/run_histories/__init__.py @@ -1,7 +1,6 @@ from enum import Enum, IntEnum from typing import Optional -from cozepy.auth import Auth from cozepy.model import CozeModel, ListResponse from cozepy.request import Requester from cozepy.util import remove_url_trailing_slash @@ -76,9 +75,8 @@ class WorkflowRunHistory(CozeModel): class WorkflowsRunsRunHistoriesClient(object): - def __init__(self, base_url: str, auth: Auth, requester: Requester): + def __init__(self, base_url: str, requester: Requester): self._base_url = remove_url_trailing_slash(base_url) - self._auth = auth self._requester = requester def retrieve(self, *, workflow_id: str, execute_id: str) -> WorkflowRunHistory: @@ -99,9 +97,8 @@ def retrieve(self, *, workflow_id: str, execute_id: str) -> WorkflowRunHistory: class AsyncWorkflowsRunsRunHistoriesClient(object): - def __init__(self, base_url: str, auth: Auth, requester: Requester): + def __init__(self, base_url: str, requester: Requester): self._base_url = remove_url_trailing_slash(base_url) - self._auth = auth self._requester = requester async def retrieve(self, *, workflow_id: str, execute_id: str) -> WorkflowRunHistory: diff --git a/cozepy/workspaces/__init__.py b/cozepy/workspaces/__init__.py index a45168b..c6d6ef9 100644 --- a/cozepy/workspaces/__init__.py +++ b/cozepy/workspaces/__init__.py @@ -1,7 +1,6 @@ from enum import Enum from typing import List, Optional -from cozepy.auth import Auth from cozepy.model import AsyncNumberPaged, CozeModel, HTTPRequest, NumberPaged, NumberPagedResponse from cozepy.request import Requester from cozepy.util import remove_url_trailing_slash @@ -50,9 +49,8 @@ class WorkspacesClient(object): Bot class. """ - def __init__(self, base_url: str, auth: Auth, requester: Requester): + def __init__(self, base_url: str, requester: Requester): self._base_url = remove_url_trailing_slash(base_url) - self._auth = auth self._requester = requester def list(self, *, page_num: int = 1, page_size: int = 20, headers=None) -> NumberPaged[Workspace]: @@ -84,9 +82,8 @@ class AsyncWorkspacesClient(object): Bot class. """ - def __init__(self, base_url: str, auth: Auth, requester: Requester): + def __init__(self, base_url: str, requester: Requester): self._base_url = remove_url_trailing_slash(base_url) - self._auth = auth self._requester = requester async def list(self, *, page_num: int = 1, page_size: int = 20, headers=None) -> AsyncNumberPaged[Workspace]: diff --git a/tests/test_audio_rooms.py b/tests/test_audio_rooms.py index d8302a8..9198d2c 100644 --- a/tests/test_audio_rooms.py +++ b/tests/test_audio_rooms.py @@ -2,7 +2,6 @@ import pytest from cozepy import AsyncCoze, Coze, CreateRoomResp, TokenAuth -from cozepy.auth import AsyncTokenAuth from cozepy.util import random_hex from tests.test_util import logid_key @@ -46,7 +45,7 @@ def test_sync_rooms_create(self, respx_mock): @pytest.mark.asyncio class TestAsyncAudioRooms: async def test_async_rooms_create(self, respx_mock): - coze = AsyncCoze(auth=AsyncTokenAuth(token="token")) + coze = AsyncCoze(auth=TokenAuth(token="token")) bot_id = random_hex(10) voice_id = random_hex(10) diff --git a/tests/test_audio_speech.py b/tests/test_audio_speech.py index 6bc5bbc..1aef630 100644 --- a/tests/test_audio_speech.py +++ b/tests/test_audio_speech.py @@ -2,7 +2,6 @@ import pytest from cozepy import AsyncCoze, Coze, TokenAuth -from cozepy.auth import AsyncTokenAuth from cozepy.util import random_hex from tests.test_util import logid_key @@ -40,7 +39,7 @@ def test_sync_speech_create(self, respx_mock): @pytest.mark.asyncio class TestAsyncAudioSpeech: async def test_async_speech_create(self, respx_mock): - coze = AsyncCoze(auth=AsyncTokenAuth(token="token")) + coze = AsyncCoze(auth=TokenAuth(token="token")) mock_logid = mock_create_speech(respx_mock) diff --git a/tests/test_audio_translations.py b/tests/test_audio_translations.py index 1704b3b..b494cb5 100644 --- a/tests/test_audio_translations.py +++ b/tests/test_audio_translations.py @@ -2,7 +2,6 @@ import pytest from cozepy import AsyncCoze, Coze, TokenAuth -from cozepy.auth import AsyncTokenAuth from cozepy.util import random_hex from tests.test_util import logid_key @@ -42,7 +41,7 @@ def test_sync_transcriptions_create(self, respx_mock): @pytest.mark.asyncio class TestAsyncAudioTranscriptions: async def test_async_transcriptions_create(self, respx_mock): - coze = AsyncCoze(auth=AsyncTokenAuth(token="token")) + coze = AsyncCoze(auth=TokenAuth(token="token")) mock_logid = mock_create_transcriptions(respx_mock) diff --git a/tests/test_audio_voices.py b/tests/test_audio_voices.py index c82d7f3..3746b71 100644 --- a/tests/test_audio_voices.py +++ b/tests/test_audio_voices.py @@ -4,7 +4,6 @@ import pytest from cozepy import AsyncCoze, AudioFormat, Coze, TokenAuth, Voice -from cozepy.auth import AsyncTokenAuth from cozepy.util import random_hex from tests.test_util import logid_key @@ -89,7 +88,7 @@ def test_clone_voice(self, respx_mock): @pytest.mark.asyncio class TestAsyncAudioVoices: async def test_async_voices_list(self, respx_mock): - coze = AsyncCoze(auth=AsyncTokenAuth(token="token")) + coze = AsyncCoze(auth=TokenAuth(token="token")) mock_logid = mock_list_voices(respx_mock) @@ -101,7 +100,7 @@ async def test_async_voices_list(self, respx_mock): assert len(voices) == 1 async def test_async_clone_voice(self, respx_mock): - coze = AsyncCoze(auth=AsyncTokenAuth(token="token")) + coze = AsyncCoze(auth=TokenAuth(token="token")) mock_voice = mock_clone_voice(respx_mock) diff --git a/tests/test_auth.py b/tests/test_auth.py index f87fb53..6961c2d 100644 --- a/tests/test_auth.py +++ b/tests/test_auth.py @@ -19,8 +19,8 @@ Scope, WebOAuthApp, ) -from cozepy.auth import AsyncJWTAuth from cozepy.util import random_hex + from .test_util import read_file @@ -31,45 +31,45 @@ def test_get_oauth_url(self, respx_mock): url = app.get_oauth_url("https://example.com", "state") assert ( - "https://www.coze.com/api/permission/oauth2/authorize" - "?response_type=code&" - "client_id=client+id&" - "redirect_uri=https%3A%2F%2Fexample.com&" - "state=state" - ) == url + "https://www.coze.com/api/permission/oauth2/authorize" + "?response_type=code&" + "client_id=client+id&" + "redirect_uri=https%3A%2F%2Fexample.com&" + "state=state" + ) == url url = app.get_oauth_url("https://example.com", "state", workspace_id="this_is_id") assert ( - "https://www.coze.com/api/permission/oauth2/workspace_id/this_is_id/authorize" - "?response_type=code&" - "client_id=client+id&" - "redirect_uri=https%3A%2F%2Fexample.com&" - "state=state" - ) == url + "https://www.coze.com/api/permission/oauth2/workspace_id/this_is_id/authorize" + "?response_type=code&" + "client_id=client+id&" + "redirect_uri=https%3A%2F%2Fexample.com&" + "state=state" + ) == url def test_get_oauth_url_config_www_url(self, respx_mock): app = WebOAuthApp("client id", "client secret", www_base_url="https://example.com") url = app.get_oauth_url("https://example.com", "state") assert ( - "https://example.com/api/permission/oauth2/authorize" - "?response_type=code&" - "client_id=client+id&" - "redirect_uri=https%3A%2F%2Fexample.com&" - "state=state" - ) == url + "https://example.com/api/permission/oauth2/authorize" + "?response_type=code&" + "client_id=client+id&" + "redirect_uri=https%3A%2F%2Fexample.com&" + "state=state" + ) == url def test_get_oauth_url_config_custom_api_base_url(self, respx_mock): app = WebOAuthApp("client id", "client secret", base_url="https://api.example.com") url = app.get_oauth_url("https://example.com", "state") assert ( - "https://api.example.com/api/permission/oauth2/authorize" - "?response_type=code&" - "client_id=client+id&" - "redirect_uri=https%3A%2F%2Fexample.com&" - "state=state" - ) == url + "https://api.example.com/api/permission/oauth2/authorize" + "?response_type=code&" + "client_id=client+id&" + "redirect_uri=https%3A%2F%2Fexample.com&" + "state=state" + ) == url def test_get_access_token(self, respx_mock): app = WebOAuthApp("client id", "client secret") @@ -106,45 +106,45 @@ async def test_get_oauth_url(self, respx_mock): url = app.get_oauth_url("https://example.com", "state") assert ( - "https://www.coze.com/api/permission/oauth2/authorize" - "?response_type=code&" - "client_id=client+id&" - "redirect_uri=https%3A%2F%2Fexample.com&" - "state=state" - ) == url + "https://www.coze.com/api/permission/oauth2/authorize" + "?response_type=code&" + "client_id=client+id&" + "redirect_uri=https%3A%2F%2Fexample.com&" + "state=state" + ) == url url = app.get_oauth_url("https://example.com", "state", workspace_id="this_is_id") assert ( - "https://www.coze.com/api/permission/oauth2/workspace_id/this_is_id/authorize" - "?response_type=code&" - "client_id=client+id&" - "redirect_uri=https%3A%2F%2Fexample.com&" - "state=state" - ) == url + "https://www.coze.com/api/permission/oauth2/workspace_id/this_is_id/authorize" + "?response_type=code&" + "client_id=client+id&" + "redirect_uri=https%3A%2F%2Fexample.com&" + "state=state" + ) == url async def test_get_oauth_url_config_www_url(self, respx_mock): app = AsyncWebOAuthApp("client id", "client secret", www_base_url="https://example.com") url = app.get_oauth_url("https://example.com", "state") assert ( - "https://example.com/api/permission/oauth2/authorize" - "?response_type=code&" - "client_id=client+id&" - "redirect_uri=https%3A%2F%2Fexample.com&" - "state=state" - ) == url + "https://example.com/api/permission/oauth2/authorize" + "?response_type=code&" + "client_id=client+id&" + "redirect_uri=https%3A%2F%2Fexample.com&" + "state=state" + ) == url async def test_get_oauth_url_config_custom_api_base_url(self, respx_mock): app = AsyncWebOAuthApp("client id", "client secret", base_url="https://api.example.com") url = app.get_oauth_url("https://example.com", "state") assert ( - "https://api.example.com/api/permission/oauth2/authorize" - "?response_type=code&" - "client_id=client+id&" - "redirect_uri=https%3A%2F%2Fexample.com&" - "state=state" - ) == url + "https://api.example.com/api/permission/oauth2/authorize" + "?response_type=code&" + "client_id=client+id&" + "redirect_uri=https%3A%2F%2Fexample.com&" + "state=state" + ) == url async def test_get_access_token(self, respx_mock): app = AsyncWebOAuthApp("client id", "client secret") @@ -186,9 +186,9 @@ def test_jwt_auth(self, respx_mock): auth = JWTAuth("client id", private_key, "public key id") - assert "Bearer" == auth.token_type() - assert mock_token == auth.token() - assert mock_token == auth.token() # get from cache + assert "Bearer" == auth.token_type + assert mock_token == auth.token + assert mock_token == auth.token # get from cache def test_get_access_token(self, respx_mock): private_key = read_file("testdata/private_key.pem") @@ -207,22 +207,6 @@ def test_get_access_token(self, respx_mock): @pytest.mark.respx(base_url="https://api.coze.com") @pytest.mark.asyncio class TestAsyncJWTOAuthApp: - - async def test_jwt_auth(self, respx_mock): - private_key = read_file("testdata/private_key.pem") - mock_token = random_hex(20) - respx_mock.post("/api/permission/oauth2/token").mock( - httpx.Response( - 200, content=OAuthToken(access_token=mock_token, expires_in=int(time.time()) + 100).model_dump_json() - ) - ) - - auth = AsyncJWTAuth("client id", private_key, "public key id") - - assert "Bearer" == await auth.token_type() - assert mock_token == await auth.token() - assert mock_token == await auth.token() # get from cache - async def test_get_access_token(self, respx_mock): private_key = read_file("testdata/private_key.pem") app = AsyncJWTOAuthApp("client id", private_key, "public key id") @@ -244,21 +228,21 @@ def test_get_oauth_url(self, respx_mock): url = app.get_oauth_url("https://example.com", "code_verifier", "S256", state="state") assert ( - "https://www.coze.com/api/permission/oauth2/authorize?" - "response_type=code&client_id=client+id&" - "redirect_uri=https%3A%2F%2Fexample.com&state=state&" - "code_challenge=73oehA2tBul5grZPhXUGQwNAjxh69zNES8bu2bVD0EM&code_challenge_method=S256" - ) == url + "https://www.coze.com/api/permission/oauth2/authorize?" + "response_type=code&client_id=client+id&" + "redirect_uri=https%3A%2F%2Fexample.com&state=state&" + "code_challenge=73oehA2tBul5grZPhXUGQwNAjxh69zNES8bu2bVD0EM&code_challenge_method=S256" + ) == url url = app.get_oauth_url( "https://example.com", "code_verifier", "S256", state="state", workspace_id="this_is_id" ) assert ( - "https://www.coze.com/api/permission/oauth2/workspace_id/this_is_id/authorize?" - "response_type=code&client_id=client+id&" - "redirect_uri=https%3A%2F%2Fexample.com&state=state&" - "code_challenge=73oehA2tBul5grZPhXUGQwNAjxh69zNES8bu2bVD0EM&code_challenge_method=S256" - ) == url + "https://www.coze.com/api/permission/oauth2/workspace_id/this_is_id/authorize?" + "response_type=code&client_id=client+id&" + "redirect_uri=https%3A%2F%2Fexample.com&state=state&" + "code_challenge=73oehA2tBul5grZPhXUGQwNAjxh69zNES8bu2bVD0EM&code_challenge_method=S256" + ) == url def test_get_access_token(self, respx_mock): app = PKCEOAuthApp("client id") @@ -295,21 +279,21 @@ async def test_get_oauth_url(self, respx_mock): url = app.get_oauth_url("https://example.com", "code_verifier", "S256", state="state") assert ( - "https://www.coze.com/api/permission/oauth2/authorize?" - "response_type=code&client_id=client+id&" - "redirect_uri=https%3A%2F%2Fexample.com&state=state&" - "code_challenge=73oehA2tBul5grZPhXUGQwNAjxh69zNES8bu2bVD0EM&code_challenge_method=S256" - ) == url + "https://www.coze.com/api/permission/oauth2/authorize?" + "response_type=code&client_id=client+id&" + "redirect_uri=https%3A%2F%2Fexample.com&state=state&" + "code_challenge=73oehA2tBul5grZPhXUGQwNAjxh69zNES8bu2bVD0EM&code_challenge_method=S256" + ) == url url = app.get_oauth_url( "https://example.com", "code_verifier", "S256", workspace_id="this_is_id", state="state" ) assert ( - "https://www.coze.com/api/permission/oauth2/workspace_id/this_is_id/authorize?" - "response_type=code&client_id=client+id&" - "redirect_uri=https%3A%2F%2Fexample.com&state=state&" - "code_challenge=73oehA2tBul5grZPhXUGQwNAjxh69zNES8bu2bVD0EM&code_challenge_method=S256" - ) == url + "https://www.coze.com/api/permission/oauth2/workspace_id/this_is_id/authorize?" + "response_type=code&client_id=client+id&" + "redirect_uri=https%3A%2F%2Fexample.com&state=state&" + "code_challenge=73oehA2tBul5grZPhXUGQwNAjxh69zNES8bu2bVD0EM&code_challenge_method=S256" + ) == url async def test_get_access_token(self, respx_mock): app = AsyncPKCEOAuthApp("client id") diff --git a/tests/test_bots.py b/tests/test_bots.py index 48e77e6..222f475 100644 --- a/tests/test_bots.py +++ b/tests/test_bots.py @@ -2,7 +2,6 @@ import pytest from cozepy import AsyncCoze, Bot, Coze, SimpleBot, TokenAuth -from cozepy.auth import AsyncTokenAuth from cozepy.util import random_hex from tests.test_util import logid_key @@ -190,7 +189,7 @@ def test_sync_bots_list(self, respx_mock): @pytest.mark.asyncio class TestAsyncBots: async def test_async_bots_create(self, respx_mock): - coze = AsyncCoze(auth=AsyncTokenAuth(token="token")) + coze = AsyncCoze(auth=TokenAuth(token="token")) mock_bot = mock_create_bot(respx_mock) @@ -201,7 +200,7 @@ async def test_async_bots_create(self, respx_mock): assert bot.bot_id == mock_bot.bot_id async def test_async_bots_update(self, respx_mock): - coze = AsyncCoze(auth=AsyncTokenAuth(token="token")) + coze = AsyncCoze(auth=TokenAuth(token="token")) mock_logid = mock_update_bot(respx_mock) @@ -211,7 +210,7 @@ async def test_async_bots_update(self, respx_mock): assert res.response.logid == mock_logid async def test_async_bots_publish(self, respx_mock): - coze = AsyncCoze(auth=AsyncTokenAuth(token="token")) + coze = AsyncCoze(auth=TokenAuth(token="token")) mock_bot = mock_publish_bot(respx_mock) @@ -222,7 +221,7 @@ async def test_async_bots_publish(self, respx_mock): assert bot.bot_id == mock_bot.bot_id async def test_async_bots_retrieve(self, respx_mock): - coze = AsyncCoze(auth=AsyncTokenAuth(token="token")) + coze = AsyncCoze(auth=TokenAuth(token="token")) mock_bot = mock_retrieve_bot(respx_mock) @@ -233,7 +232,7 @@ async def test_async_bots_retrieve(self, respx_mock): assert bot.bot_id == mock_bot.bot_id async def test_async_bots_list(self, respx_mock): - coze = AsyncCoze(auth=AsyncTokenAuth(token="token")) + coze = AsyncCoze(auth=TokenAuth(token="token")) space_id = random_hex(10) total = 10 diff --git a/tests/test_chat.py b/tests/test_chat.py index 40728da..14a4137 100644 --- a/tests/test_chat.py +++ b/tests/test_chat.py @@ -18,7 +18,6 @@ MessageObjectString, TokenAuth, ) -from cozepy.auth import AsyncTokenAuth from cozepy.util import random_hex, write_pcm_to_wav_file from tests.test_util import logid_key, read_file @@ -358,7 +357,7 @@ def test_sync_chat_poll(self, respx_mock): @pytest.mark.asyncio class TestAsyncChatConversationMessage: async def test_async_chat_create(self, respx_mock): - coze = AsyncCoze(auth=AsyncTokenAuth(token="token")) + coze = AsyncCoze(auth=TokenAuth(token="token")) conversation_id = "conversation_id" mock_logid = mock_chat_create(respx_mock, conversation_id, ChatStatus.FAILED) @@ -370,7 +369,7 @@ async def test_async_chat_create(self, respx_mock): assert res.conversation_id == conversation_id async def test_async_chat_stream(self, respx_mock): - coze = AsyncCoze(auth=AsyncTokenAuth(token="token")) + coze = AsyncCoze(auth=TokenAuth(token="token")) mock_chat_stream(respx_mock, read_file("testdata/chat_text_stream_resp.txt")) stream = coze.chat.stream(bot_id="bot", user_id="user") @@ -400,7 +399,7 @@ async def test_async_chat_stream(self, respx_mock): assert events[len(events) - 1].event == ChatEventType.CONVERSATION_CHAT_COMPLETED async def test_async_chat_audio_stream(self, respx_mock): - coze = AsyncCoze(auth=AsyncTokenAuth(token="token")) + coze = AsyncCoze(auth=TokenAuth(token="token")) mock_logid = mock_chat_stream(respx_mock, read_file("testdata/chat_audio_stream_resp.txt")) # noqa: F841 stream = coze.chat.stream( @@ -425,7 +424,7 @@ async def test_async_chat_audio_stream(self, respx_mock): assert os.path.exists(temp_filename) async def test_async_chat_stream_error(self, respx_mock): - coze = AsyncCoze(auth=AsyncTokenAuth(token="token")) + coze = AsyncCoze(auth=TokenAuth(token="token")) mock_logid = mock_chat_stream(respx_mock, read_file("testdata/chat_error_resp.txt")) # noqa: F841 stream = coze.chat.stream(bot_id="bot", user_id="user") @@ -434,7 +433,7 @@ async def test_async_chat_stream_error(self, respx_mock): [event async for event in stream] async def test_async_chat_stream_failed(self, respx_mock): - coze = AsyncCoze(auth=AsyncTokenAuth(token="token")) + coze = AsyncCoze(auth=TokenAuth(token="token")) mock_logid = mock_chat_stream(respx_mock, read_file("testdata/chat_failed_resp.txt")) # noqa: F841 stream = coze.chat.stream(bot_id="bot", user_id="user") @@ -445,7 +444,7 @@ async def test_async_chat_stream_failed(self, respx_mock): assert events[0].chat.last_error.code == 5000 async def test_async_chat_stream_invalid_event(self, respx_mock): - coze = AsyncCoze(auth=AsyncTokenAuth(token="token")) + coze = AsyncCoze(auth=TokenAuth(token="token")) mock_logid = mock_chat_stream(respx_mock, read_file("testdata/chat_invalid_resp.txt")) # noqa: F841 @@ -455,7 +454,7 @@ async def test_async_chat_stream_invalid_event(self, respx_mock): [event async for event in stream] async def test_async_chat_retrieve(self, respx_mock): - coze = AsyncCoze(auth=AsyncTokenAuth(token="token")) + coze = AsyncCoze(auth=TokenAuth(token="token")) conversation_id = "conversation_id" mock_logid = mock_chat_retrieve(respx_mock, conversation_id, ChatStatus.FAILED) @@ -467,7 +466,7 @@ async def test_async_chat_retrieve(self, respx_mock): assert res.conversation_id == conversation_id async def test_async_submit_tool_outputs_not_stream(self, respx_mock): - coze = AsyncCoze(auth=AsyncTokenAuth(token="token")) + coze = AsyncCoze(auth=TokenAuth(token="token")) conversation_id = "conversation_id" mock_logid = mock_chat_submit_tool_outputs(respx_mock, conversation_id, ChatStatus.FAILED) @@ -479,7 +478,7 @@ async def test_async_submit_tool_outputs_not_stream(self, respx_mock): assert res.conversation_id == conversation_id async def test_async_submit_tool_outputs_stream(self, respx_mock): - coze = AsyncCoze(auth=AsyncTokenAuth(token="token")) + coze = AsyncCoze(auth=TokenAuth(token="token")) mock_chat_submit_tool_outputs_stream(respx_mock, read_file("testdata/chat_text_stream_resp.txt")) stream = coze.chat.submit_tool_outputs_stream(conversation_id="conversation", chat_id="chat", tool_outputs=[]) @@ -509,7 +508,7 @@ async def test_async_submit_tool_outputs_stream(self, respx_mock): assert events[len(events) - 1].event == ChatEventType.CONVERSATION_CHAT_COMPLETED async def test_async_chat_cancel(self, respx_mock): - coze = AsyncCoze(auth=AsyncTokenAuth(token="token")) + coze = AsyncCoze(auth=TokenAuth(token="token")) conversation_id = "conversation_id" mock_logid = mock_chat_cancel(respx_mock, conversation_id, ChatStatus.FAILED) diff --git a/tests/test_chat_messages.py b/tests/test_chat_messages.py index 4079eb1..3bc7dea 100644 --- a/tests/test_chat_messages.py +++ b/tests/test_chat_messages.py @@ -2,7 +2,6 @@ import pytest from cozepy import AsyncCoze, Coze, Message, TokenAuth -from cozepy.auth import AsyncTokenAuth from cozepy.util import random_hex from tests.test_util import logid_key @@ -40,7 +39,7 @@ def test_sync_chat_messages_list(self, respx_mock): @pytest.mark.asyncio class TestAsyncChatMessages: async def test_async_chat_messages_list(self, respx_mock): - coze = AsyncCoze(auth=AsyncTokenAuth(token="token")) + coze = AsyncCoze(auth=TokenAuth(token="token")) msg, msg2, logid = mock_chat_messages_list(respx_mock) diff --git a/tests/test_conversations.py b/tests/test_conversations.py index 2c285c7..53437b7 100644 --- a/tests/test_conversations.py +++ b/tests/test_conversations.py @@ -4,7 +4,6 @@ import pytest from cozepy import AsyncCoze, Conversation, Coze, Section, TokenAuth -from cozepy.auth import AsyncTokenAuth from cozepy.util import random_hex from tests.test_util import logid_key @@ -153,7 +152,7 @@ def test_sync_conversations_clear(self, respx_mock): @pytest.mark.asyncio class TestAsyncConversation: async def test_async_conversations_create(self, respx_mock): - coze = AsyncCoze(auth=AsyncTokenAuth(token="token")) + coze = AsyncCoze(auth=TokenAuth(token="token")) bot_id = random_hex(10) mock_conversation = mock_create_conversations(respx_mock) @@ -165,7 +164,7 @@ async def test_async_conversations_create(self, respx_mock): assert res.last_section_id == mock_conversation.last_section_id async def test_async_conversations_list(self, respx_mock): - coze = AsyncCoze(auth=AsyncTokenAuth(token="token")) + coze = AsyncCoze(auth=TokenAuth(token="token")) total = 10 size = 1 @@ -197,7 +196,7 @@ async def test_async_conversations_list(self, respx_mock): assert total_result == total async def test_async_conversations_retrieve(self, respx_mock): - coze = AsyncCoze(auth=AsyncTokenAuth(token="token")) + coze = AsyncCoze(auth=TokenAuth(token="token")) mock_conversation = mock_retrieve_conversation(respx_mock) @@ -208,7 +207,7 @@ async def test_async_conversations_retrieve(self, respx_mock): assert res.last_section_id == mock_conversation.last_section_id async def test_async_conversations_clear(self, respx_mock): - coze = AsyncCoze(auth=AsyncTokenAuth(token="token")) + coze = AsyncCoze(auth=TokenAuth(token="token")) mock_section = mock_clear_conversation(respx_mock) diff --git a/tests/test_conversations_messages.py b/tests/test_conversations_messages.py index 40bad5a..2922255 100644 --- a/tests/test_conversations_messages.py +++ b/tests/test_conversations_messages.py @@ -2,7 +2,6 @@ import pytest from cozepy import AsyncCoze, Coze, Message, TokenAuth -from cozepy.auth import AsyncTokenAuth from cozepy.util import random_hex from tests.test_util import logid_key @@ -160,7 +159,7 @@ def test_sync_conversations_messages_delete(self, respx_mock): @pytest.mark.asyncio class TestAsyncConversationMessage: async def test_async_conversations_messages_create(self, respx_mock): - coze = AsyncCoze(auth=AsyncTokenAuth(token="token")) + coze = AsyncCoze(auth=TokenAuth(token="token")) mock_msg = mock_create_conversations_messages(respx_mock, Message.build_assistant_answer("hi")) @@ -175,7 +174,7 @@ async def test_async_conversations_messages_create(self, respx_mock): assert message.content == mock_msg.content async def test_async_conversations_messages_list(self, respx_mock): - coze = AsyncCoze(auth=AsyncTokenAuth(token="token")) + coze = AsyncCoze(auth=TokenAuth(token="token")) total = 10 size = 1 @@ -207,7 +206,7 @@ async def test_async_conversations_messages_list(self, respx_mock): assert total_result == total async def test_async_conversations_messages_retrieve(self, respx_mock): - coze = AsyncCoze(auth=AsyncTokenAuth(token="token")) + coze = AsyncCoze(auth=TokenAuth(token="token")) mock_msg = mock_retrieve_conversations_messages(respx_mock, Message.build_user_question_text("hi")) @@ -217,7 +216,7 @@ async def test_async_conversations_messages_retrieve(self, respx_mock): assert message.content == mock_msg.content async def test_async_conversations_messages_update(self, respx_mock): - coze = AsyncCoze(auth=AsyncTokenAuth(token="token")) + coze = AsyncCoze(auth=TokenAuth(token="token")) mock_msg = mock_update_conversations_messages(respx_mock, Message.build_user_question_text("hi")) message = await coze.conversations.messages.update(conversation_id="conversation id", message_id="message id") @@ -226,7 +225,7 @@ async def test_async_conversations_messages_update(self, respx_mock): assert message.content == mock_msg.content async def test_async_conversations_messages_delete(self, respx_mock): - coze = AsyncCoze(auth=AsyncTokenAuth(token="token")) + coze = AsyncCoze(auth=TokenAuth(token="token")) mock_msg = mock_delete_conversations_messages(respx_mock, Message.build_user_question_text("hi")) diff --git a/tests/test_datasets.py b/tests/test_datasets.py index d16a210..09be4c5 100644 --- a/tests/test_datasets.py +++ b/tests/test_datasets.py @@ -2,7 +2,6 @@ import pytest from cozepy import AsyncCoze, Coze, TokenAuth -from cozepy.auth import AsyncTokenAuth from cozepy.datasets import Dataset, DatasetStatus, DocumentFormatType, DocumentProgress from cozepy.datasets.documents import DocumentStatus, DocumentUpdateType from cozepy.util import random_hex @@ -183,7 +182,7 @@ def test_sync_datasets_process(self, respx_mock): @pytest.mark.asyncio class TestAsyncDataset: async def test_async_datasets_create(self, respx_mock): - coze = AsyncCoze(auth=AsyncTokenAuth(token="token")) + coze = AsyncCoze(auth=TokenAuth(token="token")) dataset_id, mock_logid = mock_create_datasets(respx_mock) @@ -193,7 +192,7 @@ async def test_async_datasets_create(self, respx_mock): assert dataset.dataset_id == dataset_id async def test_async_datasets_list(self, respx_mock): - coze = AsyncCoze(auth=AsyncTokenAuth(token="token")) + coze = AsyncCoze(auth=TokenAuth(token="token")) space_id = random_hex(10) total = 10 @@ -226,7 +225,7 @@ async def test_async_datasets_list(self, respx_mock): assert total_result == total async def test_async_datasets_update(self, respx_mock): - coze = AsyncCoze(auth=AsyncTokenAuth(token="token")) + coze = AsyncCoze(auth=TokenAuth(token="token")) dataset_id, mock_logid = mock_update_datasets(respx_mock) @@ -235,7 +234,7 @@ async def test_async_datasets_update(self, respx_mock): assert res.response.logid == mock_logid async def test_async_datasets_delete(self, respx_mock): - coze = AsyncCoze(auth=AsyncTokenAuth(token="token")) + coze = AsyncCoze(auth=TokenAuth(token="token")) dataset_id, mock_logid = mock_delete_datasets(respx_mock) @@ -244,7 +243,7 @@ async def test_async_datasets_delete(self, respx_mock): assert res.response.logid == mock_logid async def test_async_datasets_process(self, respx_mock): - coze = AsyncCoze(auth=AsyncTokenAuth(token="token")) + coze = AsyncCoze(auth=TokenAuth(token="token")) dataset_id, document_id, mock_logid = mock_process_datasets(respx_mock) diff --git a/tests/test_datasets_documents.py b/tests/test_datasets_documents.py index 8f81ae6..33ed206 100644 --- a/tests/test_datasets_documents.py +++ b/tests/test_datasets_documents.py @@ -17,7 +17,6 @@ DocumentUpdateType, TokenAuth, ) -from cozepy.auth import AsyncTokenAuth from cozepy.util import random_hex from tests.test_util import logid_key @@ -201,7 +200,7 @@ def test_sync_datasets_documents_list(self, respx_mock): @pytest.mark.asyncio class TestAsyncDatasetsDocuments: async def test_async_datasets_documents_create_web_auto_update(self, respx_mock): - coze = AsyncCoze(auth=AsyncTokenAuth(token="token")) + coze = AsyncCoze(auth=TokenAuth(token="token")) mock_document = mock_create_datasets_documents(respx_mock) @@ -221,7 +220,7 @@ async def test_async_datasets_documents_create_web_auto_update(self, respx_mock) assert len(documents) == 1 async def test_async_datasets_documents_create_local_custom(self, respx_mock): - coze = AsyncCoze(auth=AsyncTokenAuth(token="token")) + coze = AsyncCoze(auth=TokenAuth(token="token")) mock_document = mock_create_datasets_documents(respx_mock) @@ -241,7 +240,7 @@ async def test_async_datasets_documents_create_local_custom(self, respx_mock): assert len(documents) == 1 async def test_async_datasets_documents_update(self, respx_mock): - coze = AsyncCoze(auth=AsyncTokenAuth(token="token")) + coze = AsyncCoze(auth=TokenAuth(token="token")) mock_document = mock_update_datasets_documents(respx_mock) @@ -250,7 +249,7 @@ async def test_async_datasets_documents_update(self, respx_mock): assert res.response.logid == mock_document.response.logid async def test_async_datasets_documents_delete(self, respx_mock): - coze = AsyncCoze(auth=AsyncTokenAuth(token="token")) + coze = AsyncCoze(auth=TokenAuth(token="token")) mock_document = mock_delete_datasets_documents(respx_mock) @@ -259,7 +258,7 @@ async def test_async_datasets_documents_delete(self, respx_mock): assert res.response.logid == mock_document.response.logid async def test_async_datasets_documents_list(self, respx_mock): - coze = AsyncCoze(auth=AsyncTokenAuth(token="token")) + coze = AsyncCoze(auth=TokenAuth(token="token")) total = 10 size = 1 diff --git a/tests/test_datasets_images.py b/tests/test_datasets_images.py index 0656b77..58708a0 100644 --- a/tests/test_datasets_images.py +++ b/tests/test_datasets_images.py @@ -6,7 +6,6 @@ Coze, TokenAuth, ) -from cozepy.auth import AsyncTokenAuth from cozepy.datasets.documents import DocumentSourceType from cozepy.datasets.images import Photo, PhotoStatus from cozepy.util import random_hex @@ -102,7 +101,7 @@ def test_sync_datasets_images_list(self, respx_mock): @pytest.mark.asyncio class TestAsyncDatasetsDocuments: async def test_sync_datasets_images_update(self, respx_mock): - coze = AsyncCoze(auth=AsyncTokenAuth(token="token")) + coze = AsyncCoze(auth=TokenAuth(token="token")) dataset_id, document_id, mock_logid = mock_update_datasets_images(respx_mock) @@ -111,7 +110,7 @@ async def test_sync_datasets_images_update(self, respx_mock): assert res.response.logid == mock_logid async def test_sync_datasets_images_list(self, respx_mock): - coze = AsyncCoze(auth=AsyncTokenAuth(token="token")) + coze = AsyncCoze(auth=TokenAuth(token="token")) dataset_id = random_hex(10) total = 10 diff --git a/tests/test_file.py b/tests/test_file.py index d5b18a2..5889f42 100644 --- a/tests/test_file.py +++ b/tests/test_file.py @@ -5,7 +5,6 @@ import pytest from cozepy import AsyncCoze, Coze, File, TokenAuth -from cozepy.auth import AsyncTokenAuth from cozepy.files import _try_fix_file from cozepy.util import random_hex from tests.test_util import logid_key @@ -71,7 +70,7 @@ def test_sync_files_retrieve(self, respx_mock): @pytest.mark.asyncio class TestAsyncFiles: async def test_async_files_upload(self, respx_mock): - coze = AsyncCoze(auth=AsyncTokenAuth(token="token")) + coze = AsyncCoze(auth=TokenAuth(token="token")) mock_file = mock_upload_files(respx_mock) @@ -82,7 +81,7 @@ async def test_async_files_upload(self, respx_mock): assert file.file_name == "name" async def test_async_files_retrieve(self, respx_mock): - coze = AsyncCoze(auth=AsyncTokenAuth(token="token")) + coze = AsyncCoze(auth=TokenAuth(token="token")) mock_file = mock_retrieve_files(respx_mock) diff --git a/tests/test_knowledge_documents.py b/tests/test_knowledge_documents.py index 808ca2c..253a97a 100644 --- a/tests/test_knowledge_documents.py +++ b/tests/test_knowledge_documents.py @@ -17,7 +17,6 @@ DocumentUpdateType, TokenAuth, ) -from cozepy.auth import AsyncTokenAuth @pytest.fixture(autouse=True) @@ -224,7 +223,7 @@ def test_sync_knowledge_documents_page_iterator(self, respx_mock): @pytest.mark.asyncio class TestAsyncKnowledgeDocuments: async def test_sync_knowledge_documents_create_web_auto_update(self, respx_mock): - coze = AsyncCoze(auth=AsyncTokenAuth(token="token")) + coze = AsyncCoze(auth=TokenAuth(token="token")) respx_mock.post("/open_api/knowledge/document/create").mock( httpx.Response( @@ -248,7 +247,7 @@ async def test_sync_knowledge_documents_create_web_auto_update(self, respx_mock) assert len(documents) == 1 async def test_sync_knowledge_documents_create_local_custom(self, respx_mock): - coze = AsyncCoze(auth=AsyncTokenAuth(token="token")) + coze = AsyncCoze(auth=TokenAuth(token="token")) respx_mock.post("/open_api/knowledge/document/create").mock( httpx.Response( @@ -272,21 +271,21 @@ async def test_sync_knowledge_documents_create_local_custom(self, respx_mock): assert len(documents) == 1 async def test_sync_knowledge_documents_update(self, respx_mock): - coze = AsyncCoze(auth=AsyncTokenAuth(token="token")) + coze = AsyncCoze(auth=TokenAuth(token="token")) respx_mock.post("/open_api/knowledge/document/update").mock(httpx.Response(200, json={"data": None})) await coze.knowledge.documents.update(document_id="id", document_name="name") async def test_sync_knowledge_documents_delete(self, respx_mock): - coze = AsyncCoze(auth=AsyncTokenAuth(token="token")) + coze = AsyncCoze(auth=TokenAuth(token="token")) respx_mock.post("/open_api/knowledge/document/delete").mock(httpx.Response(200, json={"data": None})) await coze.knowledge.documents.delete(document_ids=["id"]) async def test_sync_knowledge_documents_list(self, respx_mock): - coze = AsyncCoze(auth=AsyncTokenAuth(token="token")) + coze = AsyncCoze(auth=TokenAuth(token="token")) total = 10 mock_documents_list(respx_mock, total, 1) @@ -296,7 +295,7 @@ async def test_sync_knowledge_documents_list(self, respx_mock): assert resp.total == total async def test_async_knowledge_documents_iterator(self, respx_mock): - coze = AsyncCoze(auth=AsyncTokenAuth(token="token")) + coze = AsyncCoze(auth=TokenAuth(token="token")) total = 10 for idx in range(total): @@ -312,7 +311,7 @@ async def test_async_knowledge_documents_iterator(self, respx_mock): assert total_result == total async def test_async_knowledge_documents_page_iterator(self, respx_mock): - coze = AsyncCoze(auth=AsyncTokenAuth(token="token")) + coze = AsyncCoze(auth=TokenAuth(token="token")) total = 10 for idx in range(total): diff --git a/tests/test_template.py b/tests/test_template.py index 6b9e35d..635d5f8 100644 --- a/tests/test_template.py +++ b/tests/test_template.py @@ -2,7 +2,6 @@ import pytest from cozepy import AsyncCoze, Coze, TemplateDuplicateResp, TokenAuth -from cozepy.auth import AsyncTokenAuth from cozepy.util import random_hex @@ -40,7 +39,7 @@ def test_sync_template_duplicate(self, respx_mock): @pytest.mark.asyncio class TestAsyncTemplate: async def test_async_template_duplicate(self, respx_mock): - coze = AsyncCoze(auth=AsyncTokenAuth(token="token")) + coze = AsyncCoze(auth=TokenAuth(token="token")) entity_id = random_hex(10) entity_type = "agent" diff --git a/tests/test_users.py b/tests/test_users.py index 1cf21c8..288fcf5 100644 --- a/tests/test_users.py +++ b/tests/test_users.py @@ -2,7 +2,6 @@ import pytest from cozepy import AsyncCoze, Coze, TokenAuth, User -from cozepy.auth import AsyncTokenAuth from cozepy.util import random_hex from tests.test_util import logid_key @@ -42,7 +41,7 @@ def test_sync_users_retrieve_me(self, respx_mock): @pytest.mark.asyncio class TestAsyncUsers: async def test_async_users_retrieve_me(self, respx_mock): - coze = AsyncCoze(auth=AsyncTokenAuth(token="token")) + coze = AsyncCoze(auth=TokenAuth(token="token")) mock_user = mock_retrieve_users_me(respx_mock) diff --git a/tests/test_workflows.py b/tests/test_workflows.py index 64f6b19..ef26b9a 100644 --- a/tests/test_workflows.py +++ b/tests/test_workflows.py @@ -10,7 +10,6 @@ WorkflowRunMode, WorkflowRunResult, ) -from cozepy.auth import AsyncTokenAuth from cozepy.util import random_hex from tests.test_util import logid_key, read_file @@ -167,7 +166,7 @@ def test_sync_workflows_runs_run_histories_retrieve(self, respx_mock): @pytest.mark.asyncio class TestAsyncWorkflowsRuns: async def test_async_workflows_runs_create_no_async(self, respx_mock): - coze = AsyncCoze(auth=AsyncTokenAuth(token="token")) + coze = AsyncCoze(auth=TokenAuth(token="token")) mock_res = mock_create_workflows_runs(respx_mock, False) @@ -177,7 +176,7 @@ async def test_async_workflows_runs_create_no_async(self, respx_mock): assert res.data == "data" async def test_async_workflows_runs_create_async(self, respx_mock): - coze = AsyncCoze(auth=AsyncTokenAuth(token="token")) + coze = AsyncCoze(auth=TokenAuth(token="token")) mock_res = mock_create_workflows_runs(respx_mock, True) @@ -188,7 +187,7 @@ async def test_async_workflows_runs_create_async(self, respx_mock): assert res.execute_id == mock_res.execute_id async def test_async_workflows_runs_stream(self, respx_mock): - coze = AsyncCoze(auth=AsyncTokenAuth(token="token")) + coze = AsyncCoze(auth=TokenAuth(token="token")) mock_create_workflows_runs_stream(respx_mock, read_file("testdata/workflow_run_stream_resp.txt")) stream = coze.workflows.runs.stream(workflow_id="id") @@ -197,7 +196,7 @@ async def test_async_workflows_runs_stream(self, respx_mock): assert len(events) == 9 async def test_async_workflows_runs_resume(self, respx_mock): - coze = AsyncCoze(auth=AsyncTokenAuth(token="token")) + coze = AsyncCoze(auth=TokenAuth(token="token")) mock_create_workflows_runs_resume(respx_mock, read_file("testdata/workflow_run_stream_resp.txt")) stream = coze.workflows.runs.resume( @@ -211,7 +210,7 @@ async def test_async_workflows_runs_resume(self, respx_mock): assert len(events) == 9 async def test_async_workflows_runs_invalid_stream_event(self, respx_mock): - coze = AsyncCoze(auth=AsyncTokenAuth(token="token")) + coze = AsyncCoze(auth=TokenAuth(token="token")) mock_create_workflows_runs_resume(respx_mock, read_file("testdata/workflow_run_invalid_stream_resp.txt")) stream = coze.workflows.runs.resume( @@ -224,7 +223,7 @@ async def test_async_workflows_runs_invalid_stream_event(self, respx_mock): [event async for event in stream] async def test_async_workflows_runs_run_histories_retrieve(self, respx_mock): - coze = AsyncCoze(auth=AsyncTokenAuth(token="token")) + coze = AsyncCoze(auth=TokenAuth(token="token")) workflow_id, execute_id, current_logid, execute_logid = mock_create_workflows_runs_run_histories_retrieve( respx_mock diff --git a/tests/test_workflows_chat.py b/tests/test_workflows_chat.py index 82c087d..5a87579 100644 --- a/tests/test_workflows_chat.py +++ b/tests/test_workflows_chat.py @@ -12,7 +12,6 @@ Coze, TokenAuth, ) -from cozepy.auth import AsyncTokenAuth from cozepy.util import random_hex from tests.test_util import logid_key, read_file @@ -119,7 +118,7 @@ def test_sync_chat_stream_invalid_event(self, respx_mock): @pytest.mark.asyncio class TestAsyncWorkflowsChat: async def test_async_workflows_chat_stream(self, respx_mock): - coze = AsyncCoze(auth=AsyncTokenAuth(token="token")) + coze = AsyncCoze(auth=TokenAuth(token="token")) mock_workflows_chat_stream(respx_mock, read_file("testdata/workflows_chat_stream_resp.txt")) stream = coze.workflows.chat.stream(workflow_id="workflow", bot_id="bot") @@ -148,7 +147,7 @@ async def test_async_workflows_chat_stream(self, respx_mock): assert events[len(events) - 1].event == ChatEventType.CONVERSATION_CHAT_COMPLETED async def test_async_chat_stream_error(self, respx_mock): - coze = AsyncCoze(auth=AsyncTokenAuth(token="token")) + coze = AsyncCoze(auth=TokenAuth(token="token")) mock_workflows_chat_stream(respx_mock, read_file("testdata/chat_error_resp.txt")) stream = coze.workflows.chat.stream(workflow_id="workflow", bot_id="bot") @@ -158,7 +157,7 @@ async def test_async_chat_stream_error(self, respx_mock): _ = [event async for event in stream] async def test_async_chat_stream_failed(self, respx_mock): - coze = AsyncCoze(auth=AsyncTokenAuth(token="token")) + coze = AsyncCoze(auth=TokenAuth(token="token")) mock_workflows_chat_stream(respx_mock, read_file("testdata/chat_failed_resp.txt")) stream = coze.workflows.chat.stream(workflow_id="workflow", bot_id="bot") @@ -170,7 +169,7 @@ async def test_async_chat_stream_failed(self, respx_mock): assert events[0].chat.last_error.code == 5000 async def test_async_chat_stream_invalid_event(self, respx_mock): - coze = AsyncCoze(auth=AsyncTokenAuth(token="token")) + coze = AsyncCoze(auth=TokenAuth(token="token")) mock_workflows_chat_stream(respx_mock, read_file("testdata/chat_invalid_resp.txt")) diff --git a/tests/test_workspaces.py b/tests/test_workspaces.py index 9cb859a..d0f25a9 100644 --- a/tests/test_workspaces.py +++ b/tests/test_workspaces.py @@ -2,7 +2,6 @@ import pytest from cozepy import AsyncCoze, Coze, TokenAuth, Workspace, WorkspaceRoleType, WorkspaceType -from cozepy.auth import AsyncTokenAuth def mock_list_workspaces(respx_mock, total_count, page): @@ -71,7 +70,7 @@ def test_sync_workspaces_list(self, respx_mock): @pytest.mark.asyncio class TestAsyncWorkspaces: async def test_async_workspaces_list(self, respx_mock): - coze = AsyncCoze(auth=AsyncTokenAuth(token="token")) + coze = AsyncCoze(auth=TokenAuth(token="token")) total = 10 size = 1