diff --git a/cozepy/__init__.py b/cozepy/__init__.py index 096a197..9c0d28e 100644 --- a/cozepy/__init__.py +++ b/cozepy/__init__.py @@ -3,9 +3,12 @@ from .audio.transcriptions import CreateTranscriptionsResp from .audio.voices import Voice from .auth import ( + AsyncAuth, AsyncDeviceOAuthApp, + AsyncJWTAuth, AsyncJWTOAuthApp, AsyncPKCEOAuthApp, + AsyncTokenAuth, AsyncWebOAuthApp, Auth, DeviceAuthCode, @@ -16,6 +19,7 @@ OAuthToken, PKCEOAuthApp, Scope, + SyncAuth, TokenAuth, WebOAuthApp, load_oauth_app_from_config, @@ -171,6 +175,10 @@ "AsyncPKCEOAuthApp", "AsyncWebOAuthApp", "Auth", + "AsyncAuth", + "SyncAuth", + "AsyncJWTAuth", + "AsyncTokenAuth", "DeviceAuthCode", "DeviceOAuthApp", "JWTAuth", diff --git a/cozepy/audio/__init__.py b/cozepy/audio/__init__.py index 58cab7c..df311c1 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 @@ -43,9 +41,7 @@ def transcriptions(self) -> "TranscriptionsClient": if self._transcriptions is None: from .transcriptions import TranscriptionsClient - self._transcriptions = TranscriptionsClient( - base_url=self._base_url, auth=self._auth, requester=self._requester - ) + self._transcriptions = TranscriptionsClient(base_url=self._base_url, requester=self._requester) return self._transcriptions @property @@ -53,14 +49,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 +68,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 +76,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 +84,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 @@ -97,7 +92,5 @@ def transcriptions(self) -> "AsyncTranscriptionsClient": if self._transcriptions is None: from .transcriptions import AsyncTranscriptionsClient - self._transcriptions = AsyncTranscriptionsClient( - base_url=self._base_url, auth=self._auth, requester=self._requester - ) + self._transcriptions = AsyncTranscriptionsClient(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 dcfb65b..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( @@ -140,7 +138,6 @@ def request_maker(i_page_num: int, i_page_size: int) -> HTTPRequest: "page_size": i_page_size, }, cast=_PrivateListVoiceData, - is_async=False, stream=False, ) @@ -153,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( @@ -225,8 +221,8 @@ async def list( url = f"{self._base_url}/v1/audio/voices" headers: Optional[dict] = kwargs.get("headers") - def request_maker(i_page_num: int, i_page_size: int) -> HTTPRequest: - return self._requester.make_request( + async def request_maker(i_page_num: int, i_page_size: int) -> HTTPRequest: + return await self._requester.amake_request( "GET", url, params={ @@ -236,7 +232,6 @@ def request_maker(i_page_num: int, i_page_size: int) -> HTTPRequest: }, headers=headers, cast=_PrivateListVoiceData, - is_async=False, stream=False, ) diff --git a/cozepy/auth/__init__.py b/cozepy/auth/__init__.py index f93617d..57c4fce 100644 --- a/cozepy/auth/__init__.py +++ b/cozepy/auth/__init__.py @@ -700,6 +700,15 @@ def token(self) -> str: :return: token """ + @property + @abc.abstractmethod + async def atoken(self) -> str: + """ + The token used in the http request header. + + :return: token + """ + def authentication(self, headers: dict) -> None: """ Construct the authorization header in the http headers. @@ -709,8 +718,52 @@ def authentication(self, headers: dict) -> None: """ headers["Authorization"] = f"{self.token_type} {self.token}" + async def aauthentication(self, headers: dict) -> None: + """ + Construct the authorization header in the http headers. + + :param headers: http headers + :return: None + """ + headers["Authorization"] = f"{self.token_type} {await self.atoken}" + -class TokenAuth(Auth): +class SyncAuth(Auth, abc.ABC): + """ + This class is the base class for all SyncAuth authorization types. + + It provides the abstract methods for getting the token type and sync token. + """ + + @property + async def atoken(self) -> str: + """ + SyncAuth not need implementation. + + :return: sync token for compatible + """ + return self.token + + +class AsyncAuth(Auth, abc.ABC): + """ + This class is the base class for all authorization types. + + It provides the abstract methods for getting the token type and async token. + """ + + @property + def token(self) -> str: + """ + AsyncAuth not need implementation. + Any compatible needed. + + :return: empty + """ + return "" + + +class TokenAuth(SyncAuth): """ The fixed access token auth flow. """ @@ -729,7 +782,7 @@ def token(self) -> str: return self._token -class JWTAuth(Auth): +class JWTAuth(SyncAuth): """ The JWT auth flow. """ @@ -773,3 +826,68 @@ def _generate_token(self): return self._token self._token = self._oauth_cli.get_access_token(self._ttl) return self._token + + +class AsyncTokenAuth(AsyncAuth): + """ + The fixed access token auth flow. + """ + + def __init__(self, token: str): + assert isinstance(token, str) + assert len(token) > 0 + self._token = token + + @property + def token_type(self) -> str: + return "Bearer" + + @property + async def atoken(self) -> str: + return self._token + + +class AsyncJWTAuth(AsyncAuth): + """ + The JWT auth flow. + """ + + def __init__( + self, + client_id: Optional[str] = None, + private_key: Optional[str] = None, + public_key_id: Optional[str] = None, + ttl: int = 7200, + base_url: str = COZE_COM_BASE_URL, + oauth_app: Optional[AsyncJWTOAuthApp] = None, + ): + assert ttl > 0 + self._ttl = ttl + self._token = None + + if oauth_app: + self._oauth_cli = oauth_app + else: + assert isinstance(client_id, str) + assert isinstance(private_key, str) + assert isinstance(public_key_id, str) + assert isinstance(ttl, int) + assert isinstance(base_url, str) + self._oauth_cli = AsyncJWTOAuthApp( + client_id, private_key, public_key_id, base_url=remove_url_trailing_slash(base_url) + ) + + @property + def token_type(self) -> str: + return "Bearer" + + @property + async def atoken(self) -> str: + token = await self._generate_token() + return token.access_token + + async def _generate_token(self): + if self._token is not None and int(time.time()) < self._token.expires_in: + return self._token + self._token = await self._oauth_cli.get_access_token(self._ttl) + return self._token diff --git a/cozepy/bots/__init__.py b/cozepy/bots/__init__.py index aa1ef34..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 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( @@ -268,7 +266,6 @@ def request_maker(i_page_num: int, i_page_size: int) -> HTTPRequest: "page_index": i_page_num, }, cast=_PrivateListBotsData, - is_async=False, stream=False, ) @@ -285,9 +282,8 @@ class AsyncBotsClient(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 create( @@ -413,8 +409,8 @@ async def list(self, *, space_id: str, page_num: int = 1, page_size: int = 20) - """ url = f"{self._base_url}/v1/space/published_bots_list" - def request_maker(i_page_num: int, i_page_size: int) -> HTTPRequest: - return self._requester.make_request( + async def request_maker(i_page_num: int, i_page_size: int) -> HTTPRequest: + return await self._requester.amake_request( "GET", url, params={ @@ -423,7 +419,6 @@ def request_maker(i_page_num: int, i_page_size: int) -> HTTPRequest: "page_index": i_page_num, }, cast=_PrivateListBotsData, - is_async=False, stream=False, ) diff --git a/cozepy/chat/__init__.py b/cozepy/chat/__init__.py index 984d7eb..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 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: 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[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 01c0577..789342c 100644 --- a/cozepy/chat/message/__init__.py +++ b/cozepy/chat/message/__init__.py @@ -1,4 +1,3 @@ -from cozepy.auth import Auth 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: 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( diff --git a/cozepy/conversations/__init__.py b/cozepy/conversations/__init__.py index 7f2376b..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 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 @@ -89,7 +87,6 @@ def request_maker(i_page_num: int, i_page_size: int) -> HTTPRequest: "page_size": i_page_size, }, cast=_PrivateListConversationResp, - is_async=False, stream=False, ) @@ -125,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: 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 @@ -174,8 +170,8 @@ async def list( ): url = f"{self._base_url}/v1/conversations" - def request_maker(i_page_num: int, i_page_size: int) -> HTTPRequest: - return self._requester.make_request( + async def request_maker(i_page_num: int, i_page_size: int) -> HTTPRequest: + return await self._requester.amake_request( "GET", url, params={ @@ -184,7 +180,6 @@ def request_maker(i_page_num: int, i_page_size: int) -> HTTPRequest: "page_size": i_page_size, }, cast=_PrivateListConversationResp, - is_async=False, stream=False, ) @@ -220,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 e45cb0b..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 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( @@ -115,7 +113,6 @@ def request_maker(i_before_id: str, i_after_id: str) -> HTTPRequest: }, params=params, cast=_PrivateListMessageResp, - is_async=False, stream=False, ) @@ -216,9 +213,8 @@ class AsyncMessagesClient(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 async def create( @@ -287,8 +283,8 @@ async def list( "conversation_id": conversation_id, } - def request_maker(i_before_id: str, i_after_id: str) -> HTTPRequest: - return self._requester.make_request( + async def request_maker(i_before_id: str, i_after_id: str) -> HTTPRequest: + return await self._requester.amake_request( "POST", url, json={ @@ -300,7 +296,6 @@ def request_maker(i_before_id: str, i_after_id: str) -> HTTPRequest: }, params=params, cast=_PrivateListMessageResp, - is_async=False, stream=False, ) diff --git a/cozepy/coze.py b/cozepy/coze.py index 28f1a24..30831ab 100644 --- a/cozepy/coze.py +++ b/cozepy/coze.py @@ -1,7 +1,7 @@ import warnings from typing import TYPE_CHECKING, Optional -from cozepy.auth import Auth +from cozepy.auth import Auth, SyncAuth from cozepy.config import COZE_COM_BASE_URL from cozepy.request import AsyncHTTPClient, Requester, SyncHTTPClient from cozepy.util import remove_url_trailing_slash @@ -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,7 +136,7 @@ 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 @@ -149,6 +149,14 @@ def __init__( ): self._auth = auth self._base_url = remove_url_trailing_slash(base_url) + if isinstance(auth, SyncAuth): + warnings.warn( + "The 'coze.SyncAuth' 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, async_client=http_client) # service client @@ -170,7 +178,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 +186,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 +194,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 +202,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 +216,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 +224,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 +232,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 +240,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 +248,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 +256,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 +264,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 +272,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 59bd09b..075a2da 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 @@ -98,9 +96,7 @@ def documents(self) -> "DatasetsDocumentsClient": if self._documents is None: from .documents import DatasetsDocumentsClient - self._documents = DatasetsDocumentsClient( - base_url=self._base_url, auth=self._auth, requester=self._requester - ) + self._documents = DatasetsDocumentsClient(base_url=self._base_url, requester=self._requester) return self._documents @property @@ -108,7 +104,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( @@ -187,7 +183,6 @@ def request_maker(i_page_num: int, i_page_size: int) -> HTTPRequest: "page_num": i_page_num, }, cast=_PrivateListDatasetsData, - is_async=False, stream=False, ) @@ -288,9 +283,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,9 +294,7 @@ def documents(self) -> "AsyncDatasetsDocumentsClient": if self._documents is None: from .documents import AsyncDatasetsDocumentsClient - self._documents = AsyncDatasetsDocumentsClient( - base_url=self._base_url, auth=self._auth, requester=self._requester - ) + self._documents = AsyncDatasetsDocumentsClient(base_url=self._base_url, requester=self._requester) return self._documents @property @@ -310,9 +302,7 @@ def images(self) -> "AsyncDatasetsImagesClient": if self._images is None: from .images import AsyncDatasetsImagesClient - self._images = AsyncDatasetsImagesClient( - base_url=self._base_url, auth=self._auth, requester=self._requester - ) + self._images = AsyncDatasetsImagesClient(base_url=self._base_url, requester=self._requester) return self._images async def create( @@ -375,8 +365,8 @@ async def list( url = f"{self._base_url}/v1/datasets" headers: Optional[dict] = kwargs.get("headers") - def request_maker(i_page_num: int, i_page_size: int) -> HTTPRequest: - return self._requester.make_request( + async def request_maker(i_page_num: int, i_page_size: int) -> HTTPRequest: + return await self._requester.amake_request( "GET", url, headers=headers, @@ -388,7 +378,6 @@ def request_maker(i_page_num: int, i_page_size: int) -> HTTPRequest: "page_num": i_page_num, }, cast=_PrivateListDatasetsData, - is_async=False, stream=False, ) diff --git a/cozepy/datasets/documents/__init__.py b/cozepy/datasets/documents/__init__.py index b489f26..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( @@ -422,7 +420,6 @@ def request_maker(i_page_num: int, i_page_size: int) -> HTTPRequest: "size": i_page_size, }, cast=_PrivateListDocumentsData, - is_async=False, stream=False, ) @@ -435,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( @@ -560,8 +556,8 @@ async def list( url = f"{self._base_url}/open_api/knowledge/document/list" headers = {"Agw-Js-Conv": "str"} - def request_maker(i_page_num: int, i_page_size: int) -> HTTPRequest: - return self._requester.make_request( + async def request_maker(i_page_num: int, i_page_size: int) -> HTTPRequest: + return await self._requester.amake_request( "POST", url, headers=headers, @@ -571,7 +567,6 @@ def request_maker(i_page_num: int, i_page_size: int) -> HTTPRequest: "size": i_page_size, }, cast=_PrivateListDocumentsData, - is_async=False, stream=False, ) diff --git a/cozepy/datasets/images/__init__.py b/cozepy/datasets/images/__init__.py index 2b256c8..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( @@ -117,7 +115,6 @@ def request_maker(i_page_num: int, i_page_size: int) -> HTTPRequest: "has_caption": has_caption, }, cast=_PrivateListPhotosData, - is_async=False, stream=False, ) @@ -130,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( @@ -188,8 +184,8 @@ async def list( url = f"{self._base_url}/v1/datasets/{dataset_id}/images" headers: Optional[dict] = kwargs.get("headers") - def request_maker(i_page_num: int, i_page_size: int) -> HTTPRequest: - return self._requester.make_request( + async def request_maker(i_page_num: int, i_page_size: int) -> HTTPRequest: + return await self._requester.amake_request( "get", url, headers=headers, @@ -200,7 +196,6 @@ def request_maker(i_page_num: int, i_page_size: int) -> HTTPRequest: "has_caption": has_caption, }, cast=_PrivateListPhotosData, - is_async=False, stream=False, ) diff --git a/cozepy/files/__init__.py b/cozepy/files/__init__.py index 0414214..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 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: 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 upload(self, *, file: FileTypes) -> File: diff --git a/cozepy/knowledge/__init__.py b/cozepy/knowledge/__init__.py index 507584e..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 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: 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.", @@ -46,7 +44,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[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 816fab3..0df5eac 100644 --- a/cozepy/knowledge/documents/__init__.py +++ b/cozepy/knowledge/documents/__init__.py @@ -1,17 +1,11 @@ import warnings from typing import List, Optional -from cozepy.auth import Auth from cozepy.datasets.documents import ( - Document, # noqa - DocumentBase, # noqa - DocumentChunkStrategy, # noqa - DocumentFormatType, # noqa - DocumentSourceInfo, # noqa - DocumentSourceType, # noqa - DocumentStatus, # noqa - DocumentUpdateRule, # noqa - DocumentUpdateType, # noqa + Document, + DocumentBase, + DocumentChunkStrategy, + DocumentUpdateRule, ) from cozepy.model import AsyncNumberPaged, CozeModel, HTTPRequest, NumberPaged, NumberPagedResponse from cozepy.request import Requester @@ -33,7 +27,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 +35,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( @@ -200,7 +193,6 @@ def request_maker(i_page_num: int, i_page_size: int) -> HTTPRequest: "size": i_page_size, }, cast=_PrivateListDocumentsData, - is_async=False, stream=False, ) @@ -213,7 +205,7 @@ def request_maker(i_page_num: int, i_page_size: int) -> HTTPRequest: class AsyncDocumentsClient(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.documents' instead.", @@ -221,7 +213,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 async def create( @@ -369,8 +360,8 @@ async def list( url = f"{self._base_url}/open_api/knowledge/document/list" headers = {"Agw-Js-Conv": "str"} - def request_maker(i_page_num: int, i_page_size: int) -> HTTPRequest: - return self._requester.make_request( + async def request_maker(i_page_num: int, i_page_size: int) -> HTTPRequest: + return await self._requester.amake_request( "POST", url, headers=headers, @@ -380,7 +371,6 @@ def request_maker(i_page_num: int, i_page_size: int) -> HTTPRequest: "size": i_page_size, }, cast=_PrivateListDocumentsData, - is_async=False, stream=False, ) diff --git a/cozepy/model.py b/cozepy/model.py index 82b03f5..41b96ec 100644 --- a/cozepy/model.py +++ b/cozepy/model.py @@ -4,6 +4,7 @@ Any, AsyncIterator, Callable, + Coroutine, Dict, Generic, Iterable, @@ -310,7 +311,7 @@ def __init__( page_num: int, page_size: int, requestor: "Requester", - request_maker: Callable[[int, int], HTTPRequest], + request_maker: Callable[[int, int], Coroutine[None, None, HTTPRequest]], ): self.page_num = page_num self.page_size = page_size @@ -367,7 +368,7 @@ async def _fetch_page(self): """ if self._total is not None: return - request = self._request_maker(self.page_num, self.page_size) + request = await self._request_maker(self.page_num, self.page_size) res: NumberPagedResponse[T] = await self._requestor.asend(request) self._total = res.get_total() self._has_more = res.get_has_more() @@ -389,7 +390,7 @@ async def build( page_num: int, page_size: int, requestor: "Requester", - request_maker: Callable[[int, int], HTTPRequest], + request_maker: Callable[[int, int], Coroutine[None, None, HTTPRequest]], ) -> "AsyncNumberPaged[T]": page: AsyncNumberPaged[T] = AsyncNumberPaged( page_num=page_num, @@ -498,7 +499,7 @@ def __init__( before_id: str, after_id: str, requestor: "Requester", - request_maker: Callable[[str, str], HTTPRequest], + request_maker: Callable[[str, str], Coroutine[None, None, HTTPRequest]], ): self.before_id = before_id self.after_id = after_id @@ -551,7 +552,7 @@ async def build( before_id: str, after_id: str, requestor: "Requester", - request_maker: Callable[[str, str], HTTPRequest], + request_maker: Callable[[str, str], Coroutine[None, None, HTTPRequest]], ) -> "AsyncLastIDPaged[T]": page: AsyncLastIDPaged = AsyncLastIDPaged( before_id=before_id, @@ -566,7 +567,7 @@ async def _fetch_page(self): if self.last_id is not None or self._has_more is not None: return - request = self._request_maker(self.before_id, self.after_id) + request = await self._request_maker(self.before_id, self.after_id) res: LastIDPagedResponse[T] = await self._requestor.asend(request) self.first_id = res.get_first_id() diff --git a/cozepy/request.py b/cozepy/request.py index 0165582..185a603 100644 --- a/cozepy/request.py +++ b/cozepy/request.py @@ -64,6 +64,14 @@ def __init__( self._sync_client = sync_client self._async_client = async_client + def auth_header(self, headers: dict): + if self._auth: + self._auth.authentication(headers) + + async def async_auth_header(self, headers: dict): + if self._auth: + await self._auth.aauthentication(headers) + def make_request( self, method: str, @@ -74,7 +82,6 @@ def make_request( files: Optional[dict] = None, cast: Union[Type[T], List[Type[T]], Type[ListResponse[T]], Type[FileHTTPResponse], None] = None, data_field: str = "data", - is_async: Optional[bool] = None, stream: bool = False, ) -> HTTPRequest: if headers is None: @@ -91,7 +98,50 @@ def make_request( params, json, stream, - is_async, + False, + ) + + return HTTPRequest( + method=method, + url=url, + params=params, + headers=headers, + json_body=json, + files=files, + is_async=False, + stream=stream, + data_field=data_field, + cast=cast, + ) + + async def amake_request( + self, + method: str, + url: str, + params: Optional[dict] = None, + headers: Optional[dict] = None, + json: Optional[dict] = None, + files: Optional[dict] = None, + cast: Union[Type[T], List[Type[T]], Type[ListResponse[T]], Type[FileHTTPResponse], None] = None, + data_field: str = "data", + stream: bool = False, + ) -> HTTPRequest: + if headers is None: + headers = {} + headers["User-Agent"] = user_agent() + headers["X-Coze-Client-User-Agent"] = coze_client_user_agent() + + if self._auth: + await self._auth.aauthentication(headers) + + log_debug( + "request %s#%s sending, params=%s, json=%s, stream=%s, async=%s", + method, + url, + params, + json, + stream, + True, ) return HTTPRequest( @@ -101,7 +151,7 @@ def make_request( headers=headers, json_body=json, files=files, - is_async=is_async, + is_async=True, stream=stream, data_field=data_field, cast=cast, @@ -218,7 +268,6 @@ def request( cast=cast, data_field=data_field, stream=stream, - is_async=False, ) return self.send(request) @@ -340,8 +389,8 @@ async def arequest( Send a request to the server. """ method = method.upper() - request = self.make_request( - method, url, params=params, headers=headers, json=body, files=files, stream=stream, is_async=True + request = await self.amake_request( + method, url, params=params, headers=headers, json=body, files=files, stream=stream ) response = await self.async_client.send(request.as_httpx, stream=stream) 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 6353636..46c52e7 100644 --- a/cozepy/websockets/__init__.py +++ b/cozepy/websockets/__init__.py @@ -1,4 +1,3 @@ -from cozepy import Auth from cozepy.request import Requester from cozepy.util import http_base_url_to_ws, remove_url_trailing_slash @@ -7,16 +6,14 @@ 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, ) @@ -24,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: 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) -> AsyncWebsocketsAudioClient: return AsyncWebsocketsAudioClient( base_url=self._base_url, - auth=self._auth, requester=self._requester, ) @@ -47,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 a02f3ea..8c8ccce 100644 --- a/cozepy/websockets/audio/__init__.py +++ b/cozepy/websockets/audio/__init__.py @@ -1,4 +1,3 @@ -from cozepy.auth import Auth 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: 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) -> "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 7a533f7..05c3a89 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 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: Auth, 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: 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,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 4f03b14..3d27150 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 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: Auth, 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: 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( @@ -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 6507de8..303a05d 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 from cozepy.log import log_warning from cozepy.request import Requester from cozepy.util import remove_none_values, remove_url_trailing_slash @@ -178,7 +177,6 @@ class WebsocketsChatClient(WebsocketsBaseClient): def __init__( self, base_url: str, - auth: Auth, requester: Requester, bot_id: str, on_event: Union[WebsocketsChatEventHandler, Dict[WebsocketsEventType, Callable]], @@ -205,7 +203,6 @@ def __init__( ) super().__init__( base_url=base_url, - auth=auth, requester=requester, path="v1/chat", query=remove_none_values( @@ -343,9 +340,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( @@ -358,7 +354,6 @@ def create( ) -> WebsocketsChatClient: return WebsocketsChatClient( base_url=self._base_url, - auth=self._auth, requester=self._requester, bot_id=bot_id, on_event=on_event, # type: ignore @@ -430,7 +425,6 @@ class AsyncWebsocketsChatClient(AsyncWebsocketsBaseClient): def __init__( self, base_url: str, - auth: Auth, requester: Requester, bot_id: str, on_event: Union[AsyncWebsocketsChatEventHandler, Dict[WebsocketsEventType, Callable]], @@ -457,7 +451,6 @@ def __init__( ) super().__init__( base_url=base_url, - auth=auth, requester=requester, path="v1/chat", query=remove_none_values( @@ -595,9 +588,8 @@ def _load_event(self, message: Dict) -> Optional[WebsocketsEvent]: class AsyncWebsocketsChatBuildClient(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( @@ -610,7 +602,6 @@ def create( ) -> AsyncWebsocketsChatClient: return AsyncWebsocketsChatClient( base_url=self._base_url, - auth=self._auth, requester=self._requester, bot_id=bot_id, on_event=on_event, # type: ignore diff --git a/cozepy/websockets/ws.py b/cozepy/websockets/ws.py index 51e9c1f..492450c 100644 --- a/cozepy/websockets/ws.py +++ b/cozepy/websockets/ws.py @@ -42,7 +42,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 @@ -163,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, @@ -173,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 @@ -203,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, @@ -370,7 +370,6 @@ class State(str, Enum): def __init__( self, base_url: str, - auth: Auth, requester: Requester, path: str, query: Optional[Dict[str, str]] = None, @@ -380,7 +379,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 @@ -408,10 +406,12 @@ async 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 {}), } + + 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 4121052..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]: @@ -68,7 +66,6 @@ def request_maker(i_page_num: int, i_page_size: int) -> HTTPRequest: "page_num": i_page_num, }, cast=_PrivateListWorkspacesData, - is_async=False, stream=False, ) @@ -85,16 +82,15 @@ 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]: url = f"{self._base_url}/v1/workspaces" - def request_maker(i_page_num: int, i_page_size: int) -> HTTPRequest: - return self._requester.make_request( + async def request_maker(i_page_num: int, i_page_size: int) -> HTTPRequest: + return await self._requester.amake_request( "GET", url, headers=headers, @@ -103,7 +99,6 @@ def request_maker(i_page_num: int, i_page_size: int) -> HTTPRequest: "page_num": i_page_num, }, cast=_PrivateListWorkspacesData, - is_async=False, stream=False, ) diff --git a/tests/test_audio_rooms.py b/tests/test_audio_rooms.py index 9198d2c..e8619be 100644 --- a/tests/test_audio_rooms.py +++ b/tests/test_audio_rooms.py @@ -1,7 +1,7 @@ import httpx import pytest -from cozepy import AsyncCoze, Coze, CreateRoomResp, TokenAuth +from cozepy import AsyncCoze, AsyncTokenAuth, Coze, CreateRoomResp, TokenAuth from cozepy.util import random_hex from tests.test_util import logid_key @@ -45,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=TokenAuth(token="token")) + coze = AsyncCoze(auth=AsyncTokenAuth(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 1aef630..cf248e7 100644 --- a/tests/test_audio_speech.py +++ b/tests/test_audio_speech.py @@ -1,7 +1,7 @@ import httpx import pytest -from cozepy import AsyncCoze, Coze, TokenAuth +from cozepy import AsyncCoze, AsyncTokenAuth, Coze, TokenAuth from cozepy.util import random_hex from tests.test_util import logid_key @@ -39,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=TokenAuth(token="token")) + coze = AsyncCoze(auth=AsyncTokenAuth(token="token")) mock_logid = mock_create_speech(respx_mock) diff --git a/tests/test_audio_translations.py b/tests/test_audio_translations.py index b494cb5..afd386e 100644 --- a/tests/test_audio_translations.py +++ b/tests/test_audio_translations.py @@ -1,7 +1,7 @@ import httpx import pytest -from cozepy import AsyncCoze, Coze, TokenAuth +from cozepy import AsyncCoze, AsyncTokenAuth, Coze, TokenAuth from cozepy.util import random_hex from tests.test_util import logid_key @@ -41,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=TokenAuth(token="token")) + coze = AsyncCoze(auth=AsyncTokenAuth(token="token")) mock_logid = mock_create_transcriptions(respx_mock) diff --git a/tests/test_audio_voices.py b/tests/test_audio_voices.py index 3746b71..26234fb 100644 --- a/tests/test_audio_voices.py +++ b/tests/test_audio_voices.py @@ -3,7 +3,7 @@ import httpx import pytest -from cozepy import AsyncCoze, AudioFormat, Coze, TokenAuth, Voice +from cozepy import AsyncCoze, AsyncTokenAuth, AudioFormat, Coze, TokenAuth, Voice from cozepy.util import random_hex from tests.test_util import logid_key @@ -88,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=TokenAuth(token="token")) + coze = AsyncCoze(auth=AsyncTokenAuth(token="token")) mock_logid = mock_list_voices(respx_mock) @@ -100,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=TokenAuth(token="token")) + coze = AsyncCoze(auth=AsyncTokenAuth(token="token")) mock_voice = mock_clone_voice(respx_mock) diff --git a/tests/test_bots.py b/tests/test_bots.py index 222f475..abbfce9 100644 --- a/tests/test_bots.py +++ b/tests/test_bots.py @@ -1,7 +1,7 @@ import httpx import pytest -from cozepy import AsyncCoze, Bot, Coze, SimpleBot, TokenAuth +from cozepy import AsyncCoze, AsyncTokenAuth, Bot, Coze, SimpleBot, TokenAuth from cozepy.util import random_hex from tests.test_util import logid_key @@ -189,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=TokenAuth(token="token")) + coze = AsyncCoze(auth=AsyncTokenAuth(token="token")) mock_bot = mock_create_bot(respx_mock) @@ -200,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=TokenAuth(token="token")) + coze = AsyncCoze(auth=AsyncTokenAuth(token="token")) mock_logid = mock_update_bot(respx_mock) @@ -210,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=TokenAuth(token="token")) + coze = AsyncCoze(auth=AsyncTokenAuth(token="token")) mock_bot = mock_publish_bot(respx_mock) @@ -221,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=TokenAuth(token="token")) + coze = AsyncCoze(auth=AsyncTokenAuth(token="token")) mock_bot = mock_retrieve_bot(respx_mock) @@ -232,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=TokenAuth(token="token")) + coze = AsyncCoze(auth=AsyncTokenAuth(token="token")) space_id = random_hex(10) total = 10 diff --git a/tests/test_chat.py b/tests/test_chat.py index 14a4137..b621366 100644 --- a/tests/test_chat.py +++ b/tests/test_chat.py @@ -7,6 +7,7 @@ from cozepy import ( AsyncCoze, + AsyncTokenAuth, Chat, ChatError, ChatEvent, @@ -357,7 +358,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=TokenAuth(token="token")) + coze = AsyncCoze(auth=AsyncTokenAuth(token="token")) conversation_id = "conversation_id" mock_logid = mock_chat_create(respx_mock, conversation_id, ChatStatus.FAILED) @@ -369,7 +370,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=TokenAuth(token="token")) + coze = AsyncCoze(auth=AsyncTokenAuth(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") @@ -399,7 +400,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=TokenAuth(token="token")) + coze = AsyncCoze(auth=AsyncTokenAuth(token="token")) mock_logid = mock_chat_stream(respx_mock, read_file("testdata/chat_audio_stream_resp.txt")) # noqa: F841 stream = coze.chat.stream( @@ -424,7 +425,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=TokenAuth(token="token")) + coze = AsyncCoze(auth=AsyncTokenAuth(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") @@ -433,7 +434,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=TokenAuth(token="token")) + coze = AsyncCoze(auth=AsyncTokenAuth(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") @@ -444,7 +445,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=TokenAuth(token="token")) + coze = AsyncCoze(auth=AsyncTokenAuth(token="token")) mock_logid = mock_chat_stream(respx_mock, read_file("testdata/chat_invalid_resp.txt")) # noqa: F841 @@ -454,7 +455,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=TokenAuth(token="token")) + coze = AsyncCoze(auth=AsyncTokenAuth(token="token")) conversation_id = "conversation_id" mock_logid = mock_chat_retrieve(respx_mock, conversation_id, ChatStatus.FAILED) @@ -466,7 +467,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=TokenAuth(token="token")) + coze = AsyncCoze(auth=AsyncTokenAuth(token="token")) conversation_id = "conversation_id" mock_logid = mock_chat_submit_tool_outputs(respx_mock, conversation_id, ChatStatus.FAILED) @@ -478,7 +479,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=TokenAuth(token="token")) + coze = AsyncCoze(auth=AsyncTokenAuth(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=[]) @@ -508,7 +509,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=TokenAuth(token="token")) + coze = AsyncCoze(auth=AsyncTokenAuth(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 3bc7dea..a57fd06 100644 --- a/tests/test_chat_messages.py +++ b/tests/test_chat_messages.py @@ -1,7 +1,7 @@ import httpx import pytest -from cozepy import AsyncCoze, Coze, Message, TokenAuth +from cozepy import AsyncCoze, AsyncTokenAuth, Coze, Message, TokenAuth from cozepy.util import random_hex from tests.test_util import logid_key @@ -39,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=TokenAuth(token="token")) + coze = AsyncCoze(auth=AsyncTokenAuth(token="token")) msg, msg2, logid = mock_chat_messages_list(respx_mock) diff --git a/tests/test_conversations.py b/tests/test_conversations.py index 53437b7..0a73d4d 100644 --- a/tests/test_conversations.py +++ b/tests/test_conversations.py @@ -3,7 +3,7 @@ import httpx import pytest -from cozepy import AsyncCoze, Conversation, Coze, Section, TokenAuth +from cozepy import AsyncCoze, AsyncTokenAuth, Conversation, Coze, Section, TokenAuth from cozepy.util import random_hex from tests.test_util import logid_key @@ -152,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=TokenAuth(token="token")) + coze = AsyncCoze(auth=AsyncTokenAuth(token="token")) bot_id = random_hex(10) mock_conversation = mock_create_conversations(respx_mock) @@ -164,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=TokenAuth(token="token")) + coze = AsyncCoze(auth=AsyncTokenAuth(token="token")) total = 10 size = 1 @@ -196,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=TokenAuth(token="token")) + coze = AsyncCoze(auth=AsyncTokenAuth(token="token")) mock_conversation = mock_retrieve_conversation(respx_mock) @@ -207,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=TokenAuth(token="token")) + coze = AsyncCoze(auth=AsyncTokenAuth(token="token")) mock_section = mock_clear_conversation(respx_mock) diff --git a/tests/test_conversations_messages.py b/tests/test_conversations_messages.py index 2922255..5fe4e60 100644 --- a/tests/test_conversations_messages.py +++ b/tests/test_conversations_messages.py @@ -1,7 +1,7 @@ import httpx import pytest -from cozepy import AsyncCoze, Coze, Message, TokenAuth +from cozepy import AsyncCoze, AsyncTokenAuth, Coze, Message, TokenAuth from cozepy.util import random_hex from tests.test_util import logid_key @@ -159,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=TokenAuth(token="token")) + coze = AsyncCoze(auth=AsyncTokenAuth(token="token")) mock_msg = mock_create_conversations_messages(respx_mock, Message.build_assistant_answer("hi")) @@ -174,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=TokenAuth(token="token")) + coze = AsyncCoze(auth=AsyncTokenAuth(token="token")) total = 10 size = 1 @@ -206,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=TokenAuth(token="token")) + coze = AsyncCoze(auth=AsyncTokenAuth(token="token")) mock_msg = mock_retrieve_conversations_messages(respx_mock, Message.build_user_question_text("hi")) @@ -216,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=TokenAuth(token="token")) + coze = AsyncCoze(auth=AsyncTokenAuth(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") @@ -225,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=TokenAuth(token="token")) + coze = AsyncCoze(auth=AsyncTokenAuth(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 09be4c5..bff8f94 100644 --- a/tests/test_datasets.py +++ b/tests/test_datasets.py @@ -1,7 +1,7 @@ import httpx import pytest -from cozepy import AsyncCoze, Coze, TokenAuth +from cozepy import AsyncCoze, AsyncTokenAuth, Coze, TokenAuth from cozepy.datasets import Dataset, DatasetStatus, DocumentFormatType, DocumentProgress from cozepy.datasets.documents import DocumentStatus, DocumentUpdateType from cozepy.util import random_hex @@ -182,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=TokenAuth(token="token")) + coze = AsyncCoze(auth=AsyncTokenAuth(token="token")) dataset_id, mock_logid = mock_create_datasets(respx_mock) @@ -192,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=TokenAuth(token="token")) + coze = AsyncCoze(auth=AsyncTokenAuth(token="token")) space_id = random_hex(10) total = 10 @@ -225,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=TokenAuth(token="token")) + coze = AsyncCoze(auth=AsyncTokenAuth(token="token")) dataset_id, mock_logid = mock_update_datasets(respx_mock) @@ -234,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=TokenAuth(token="token")) + coze = AsyncCoze(auth=AsyncTokenAuth(token="token")) dataset_id, mock_logid = mock_delete_datasets(respx_mock) @@ -243,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=TokenAuth(token="token")) + coze = AsyncCoze(auth=AsyncTokenAuth(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 33ed206..859f23e 100644 --- a/tests/test_datasets_documents.py +++ b/tests/test_datasets_documents.py @@ -5,6 +5,7 @@ from cozepy import ( AsyncCoze, + AsyncTokenAuth, Coze, Document, DocumentBase, @@ -200,7 +201,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=TokenAuth(token="token")) + coze = AsyncCoze(auth=AsyncTokenAuth(token="token")) mock_document = mock_create_datasets_documents(respx_mock) @@ -220,7 +221,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=TokenAuth(token="token")) + coze = AsyncCoze(auth=AsyncTokenAuth(token="token")) mock_document = mock_create_datasets_documents(respx_mock) @@ -240,7 +241,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=TokenAuth(token="token")) + coze = AsyncCoze(auth=AsyncTokenAuth(token="token")) mock_document = mock_update_datasets_documents(respx_mock) @@ -249,7 +250,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=TokenAuth(token="token")) + coze = AsyncCoze(auth=AsyncTokenAuth(token="token")) mock_document = mock_delete_datasets_documents(respx_mock) @@ -258,7 +259,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=TokenAuth(token="token")) + coze = AsyncCoze(auth=AsyncTokenAuth(token="token")) total = 10 size = 1 diff --git a/tests/test_datasets_images.py b/tests/test_datasets_images.py index 58708a0..514406a 100644 --- a/tests/test_datasets_images.py +++ b/tests/test_datasets_images.py @@ -3,6 +3,7 @@ from cozepy import ( AsyncCoze, + AsyncTokenAuth, Coze, TokenAuth, ) @@ -101,7 +102,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=TokenAuth(token="token")) + coze = AsyncCoze(auth=AsyncTokenAuth(token="token")) dataset_id, document_id, mock_logid = mock_update_datasets_images(respx_mock) @@ -110,7 +111,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=TokenAuth(token="token")) + coze = AsyncCoze(auth=AsyncTokenAuth(token="token")) dataset_id = random_hex(10) total = 10 diff --git a/tests/test_file.py b/tests/test_file.py index 5889f42..7eaa000 100644 --- a/tests/test_file.py +++ b/tests/test_file.py @@ -4,7 +4,7 @@ import httpx import pytest -from cozepy import AsyncCoze, Coze, File, TokenAuth +from cozepy import AsyncCoze, AsyncTokenAuth, Coze, File, TokenAuth from cozepy.files import _try_fix_file from cozepy.util import random_hex from tests.test_util import logid_key @@ -70,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=TokenAuth(token="token")) + coze = AsyncCoze(auth=AsyncTokenAuth(token="token")) mock_file = mock_upload_files(respx_mock) @@ -81,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=TokenAuth(token="token")) + coze = AsyncCoze(auth=AsyncTokenAuth(token="token")) mock_file = mock_retrieve_files(respx_mock) diff --git a/tests/test_knowledge_documents.py b/tests/test_knowledge_documents.py index 253a97a..32b7785 100644 --- a/tests/test_knowledge_documents.py +++ b/tests/test_knowledge_documents.py @@ -5,6 +5,7 @@ from cozepy import ( AsyncCoze, + AsyncTokenAuth, Coze, Document, DocumentBase, @@ -223,7 +224,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=TokenAuth(token="token")) + coze = AsyncCoze(auth=AsyncTokenAuth(token="token")) respx_mock.post("/open_api/knowledge/document/create").mock( httpx.Response( @@ -247,7 +248,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=TokenAuth(token="token")) + coze = AsyncCoze(auth=AsyncTokenAuth(token="token")) respx_mock.post("/open_api/knowledge/document/create").mock( httpx.Response( @@ -271,21 +272,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=TokenAuth(token="token")) + coze = AsyncCoze(auth=AsyncTokenAuth(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=TokenAuth(token="token")) + coze = AsyncCoze(auth=AsyncTokenAuth(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=TokenAuth(token="token")) + coze = AsyncCoze(auth=AsyncTokenAuth(token="token")) total = 10 mock_documents_list(respx_mock, total, 1) @@ -295,7 +296,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=TokenAuth(token="token")) + coze = AsyncCoze(auth=AsyncTokenAuth(token="token")) total = 10 for idx in range(total): @@ -311,7 +312,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=TokenAuth(token="token")) + coze = AsyncCoze(auth=AsyncTokenAuth(token="token")) total = 10 for idx in range(total): diff --git a/tests/test_template.py b/tests/test_template.py index 635d5f8..aae0f26 100644 --- a/tests/test_template.py +++ b/tests/test_template.py @@ -1,7 +1,7 @@ import httpx import pytest -from cozepy import AsyncCoze, Coze, TemplateDuplicateResp, TokenAuth +from cozepy import AsyncCoze, AsyncTokenAuth, Coze, TemplateDuplicateResp, TokenAuth from cozepy.util import random_hex @@ -39,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=TokenAuth(token="token")) + coze = AsyncCoze(auth=AsyncTokenAuth(token="token")) entity_id = random_hex(10) entity_type = "agent" diff --git a/tests/test_users.py b/tests/test_users.py index 288fcf5..a383e17 100644 --- a/tests/test_users.py +++ b/tests/test_users.py @@ -1,7 +1,7 @@ import httpx import pytest -from cozepy import AsyncCoze, Coze, TokenAuth, User +from cozepy import AsyncCoze, AsyncTokenAuth, Coze, TokenAuth, User from cozepy.util import random_hex from tests.test_util import logid_key @@ -41,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=TokenAuth(token="token")) + coze = AsyncCoze(auth=AsyncTokenAuth(token="token")) mock_user = mock_retrieve_users_me(respx_mock) diff --git a/tests/test_workflows.py b/tests/test_workflows.py index ef26b9a..854d62a 100644 --- a/tests/test_workflows.py +++ b/tests/test_workflows.py @@ -3,6 +3,7 @@ from cozepy import ( AsyncCoze, + AsyncTokenAuth, Coze, TokenAuth, WorkflowExecuteStatus, @@ -166,7 +167,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=TokenAuth(token="token")) + coze = AsyncCoze(auth=AsyncTokenAuth(token="token")) mock_res = mock_create_workflows_runs(respx_mock, False) @@ -176,7 +177,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=TokenAuth(token="token")) + coze = AsyncCoze(auth=AsyncTokenAuth(token="token")) mock_res = mock_create_workflows_runs(respx_mock, True) @@ -187,7 +188,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=TokenAuth(token="token")) + coze = AsyncCoze(auth=AsyncTokenAuth(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") @@ -196,7 +197,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=TokenAuth(token="token")) + coze = AsyncCoze(auth=AsyncTokenAuth(token="token")) mock_create_workflows_runs_resume(respx_mock, read_file("testdata/workflow_run_stream_resp.txt")) stream = coze.workflows.runs.resume( @@ -210,7 +211,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=TokenAuth(token="token")) + coze = AsyncCoze(auth=AsyncTokenAuth(token="token")) mock_create_workflows_runs_resume(respx_mock, read_file("testdata/workflow_run_invalid_stream_resp.txt")) stream = coze.workflows.runs.resume( @@ -223,7 +224,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=TokenAuth(token="token")) + coze = AsyncCoze(auth=AsyncTokenAuth(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 5a87579..7729d73 100644 --- a/tests/test_workflows_chat.py +++ b/tests/test_workflows_chat.py @@ -3,6 +3,7 @@ from cozepy import ( AsyncCoze, + AsyncTokenAuth, Chat, ChatError, ChatEvent, @@ -118,7 +119,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=TokenAuth(token="token")) + coze = AsyncCoze(auth=AsyncTokenAuth(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") @@ -147,7 +148,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=TokenAuth(token="token")) + coze = AsyncCoze(auth=AsyncTokenAuth(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") @@ -157,7 +158,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=TokenAuth(token="token")) + coze = AsyncCoze(auth=AsyncTokenAuth(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") @@ -169,7 +170,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=TokenAuth(token="token")) + coze = AsyncCoze(auth=AsyncTokenAuth(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 d0f25a9..57c78a5 100644 --- a/tests/test_workspaces.py +++ b/tests/test_workspaces.py @@ -1,7 +1,7 @@ import httpx import pytest -from cozepy import AsyncCoze, Coze, TokenAuth, Workspace, WorkspaceRoleType, WorkspaceType +from cozepy import AsyncCoze, AsyncTokenAuth, Coze, TokenAuth, Workspace, WorkspaceRoleType, WorkspaceType def mock_list_workspaces(respx_mock, total_count, page): @@ -70,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=TokenAuth(token="token")) + coze = AsyncCoze(auth=AsyncTokenAuth(token="token")) total = 10 size = 1