From 62fa2375e0af20279ddf311d66867691e5e6eda5 Mon Sep 17 00:00:00 2001 From: Jeremy Shih Date: Fri, 27 Sep 2024 17:33:05 +0800 Subject: [PATCH 1/2] feat(client): update proto and add AppClient --- instill/clients/app.py | 645 ++++++++++++++++++++++++++++++++++++ instill/clients/artifact.py | 280 +--------------- instill/clients/client.py | 19 ++ instill/clients/instance.py | 3 + instill/protogen | 2 +- 5 files changed, 674 insertions(+), 275 deletions(-) create mode 100644 instill/clients/app.py diff --git a/instill/clients/app.py b/instill/clients/app.py new file mode 100644 index 0000000..48cf2b7 --- /dev/null +++ b/instill/clients/app.py @@ -0,0 +1,645 @@ +# pylint: disable=no-member,wrong-import-position,too-many-lines,no-name-in-module +from typing import Dict + +# app +import instill.protogen.app.app.v1alpha.app_pb2 as app_interface +import instill.protogen.app.app.v1alpha.app_public_service_pb2_grpc as app_service +import instill.protogen.app.app.v1alpha.conversation_pb2 as conversation_interface + +# common +import instill.protogen.common.healthcheck.v1beta.healthcheck_pb2 as healthcheck +from instill.clients.base import Client, RequestFactory +from instill.clients.constant import DEFAULT_INSTANCE +from instill.clients.instance import InstillInstance +from instill.configuration import global_config +from instill.utils.error_handler import grpc_handler + + +class AppClient(Client): + def __init__(self, async_enabled: bool = False, api_token: str = "") -> None: + self.hosts: Dict[str, InstillInstance] = {} + if DEFAULT_INSTANCE in global_config.hosts: + self.instance = DEFAULT_INSTANCE + elif len(global_config.hosts) == 0: + self.instance = "" + else: + self.instance = list(global_config.hosts.keys())[0] + + if global_config.hosts is not None: + for instance, config in global_config.hosts.items(): + token = config.token + if api_token != "" and instance == self.instance: + token = api_token + self.hosts[instance] = InstillInstance( + app_service.AppPublicServiceStub, + url=config.url, + token=token, + secure=config.secure, + async_enabled=async_enabled, + ) + + def close(self): + if self.is_serving(): + for host in self.hosts.values(): + host.channel.close() + + async def async_close(self): + if self.is_serving(): + for host in self.hosts.values(): + await host.async_channel.close() + + @property + def hosts(self): + return self._hosts + + @hosts.setter + def hosts(self, hosts: Dict[str, InstillInstance]): + self._hosts = hosts + + @property + def instance(self): + return self._instance + + @instance.setter + def instance(self, instance: str): + self._instance = instance + + @property + def metadata(self): + return self._metadata + + @metadata.setter + def metadata(self, metadata: str): + self._metadata = metadata + + @grpc_handler + def liveness( + self, + async_enabled: bool = False, + ) -> app_interface.LivenessResponse: + if async_enabled: + return RequestFactory( + method=self.hosts[self.instance].async_client.Liveness, + request=app_interface.LivenessRequest(), + metadata=self.hosts[self.instance].metadata, + ).send_async() + + return RequestFactory( + method=self.hosts[self.instance].client.Liveness, + request=app_interface.LivenessRequest(), + metadata=self.hosts[self.instance].metadata, + ).send_sync() + + @grpc_handler + def readiness( + self, + async_enabled: bool = False, + ) -> app_interface.ReadinessResponse: + if async_enabled: + return RequestFactory( + method=self.hosts[self.instance].async_client.Readiness, + request=app_interface.ReadinessRequest(), + metadata=self.hosts[self.instance].metadata, + ).send_async() + + return RequestFactory( + method=self.hosts[self.instance].client.Readiness, + request=app_interface.ReadinessRequest(), + metadata=self.hosts[self.instance].metadata, + ).send_sync() + + def is_serving(self) -> bool: + try: + return ( + self.readiness().health_check_response.status + == healthcheck.HealthCheckResponse.SERVING_STATUS_SERVING + ) + except Exception: + return False + + @grpc_handler + def create_app( + self, + namespace_id: str, + app_id: str, + description: str, + tags: list[str], + async_enabled: bool = False, + ) -> app_interface.CreateAppResponse: + if async_enabled: + return RequestFactory( + method=self.hosts[self.instance].async_client.CreateApp, + request=app_interface.CreateAppRequest( + namespace_id=namespace_id, + id=app_id, + description=description, + tags=tags, + ), + metadata=self.hosts[self.instance].metadata, + ).send_async() + + return RequestFactory( + method=self.hosts[self.instance].client.CreateApp, + request=app_interface.CreateAppRequest( + namespace_id=namespace_id, + id=app_id, + description=description, + tags=tags, + ), + metadata=self.hosts[self.instance].metadata, + ).send_sync() + + @grpc_handler + def list_apps( + self, + namespace_id: str, + async_enabled: bool = False, + ) -> app_interface.ListAppsResponse: + if async_enabled: + return RequestFactory( + method=self.hosts[self.instance].async_client.ListApps, + request=app_interface.ListAppsRequest( + namespace_id=namespace_id, + ), + metadata=self.hosts[self.instance].metadata, + ).send_async() + + return RequestFactory( + method=self.hosts[self.instance].client.ListApps, + request=app_interface.ListAppsRequest( + namespace_id=namespace_id, + ), + metadata=self.hosts[self.instance].metadata, + ).send_sync() + + @grpc_handler + def update_app( + self, + namespace_id: str, + app_id: str, + new_app_id: str, + new_description: str, + new_tags: list[str], + last_ai_assistant_app_catalog_uid: str, + last_ai_assistant_app_top_k: int, + async_enabled: bool = False, + ) -> app_interface.UpdateAppResponse: + if async_enabled: + return RequestFactory( + method=self.hosts[self.instance].async_client.UpdateApp, + request=app_interface.UpdateAppRequest( + namespace_id=namespace_id, + app_id=app_id, + new_app_id=new_app_id, + new_description=new_description, + new_tags=new_tags, + last_ai_assistant_app_catalog_uid=last_ai_assistant_app_catalog_uid, + last_ai_assistant_app_top_k=last_ai_assistant_app_top_k, + ), + metadata=self.hosts[self.instance].metadata, + ).send_async() + + return RequestFactory( + method=self.hosts[self.instance].client.UpdateApp, + request=app_interface.UpdateAppRequest( + namespace_id=namespace_id, + app_id=app_id, + new_app_id=new_app_id, + new_description=new_description, + new_tags=new_tags, + last_ai_assistant_app_catalog_uid=last_ai_assistant_app_catalog_uid, + last_ai_assistant_app_top_k=last_ai_assistant_app_top_k, + ), + metadata=self.hosts[self.instance].metadata, + ).send_sync() + + @grpc_handler + def delete_app( + self, + namespace_id: str, + app_id: str, + async_enabled: bool = False, + ) -> app_interface.DeleteAppResponse: + if async_enabled: + return RequestFactory( + method=self.hosts[self.instance].async_client.DeleteApp, + request=app_interface.DeleteAppRequest( + namespace_id=namespace_id, + app_id=app_id, + ), + metadata=self.hosts[self.instance].metadata, + ).send_async() + + return RequestFactory( + method=self.hosts[self.instance].client.DeleteApp, + request=app_interface.DeleteAppRequest( + namespace_id=namespace_id, + app_id=app_id, + ), + metadata=self.hosts[self.instance].metadata, + ).send_sync() + + @grpc_handler + def create_conversation( + self, + namespace_id: str, + app_id: str, + conversation_id: str, + async_enabled: bool = False, + ) -> conversation_interface.CreateConversationResponse: + if async_enabled: + return RequestFactory( + method=self.hosts[self.instance].async_client.CreateConversation, + request=conversation_interface.CreateConversationRequest( + namespace_id=namespace_id, + app_id=app_id, + conversation_id=conversation_id, + ), + metadata=self.hosts[self.instance].metadata, + ).send_async() + + return RequestFactory( + method=self.hosts[self.instance].client.CreateConversation, + request=conversation_interface.CreateConversationRequest( + namespace_id=namespace_id, + app_id=app_id, + conversation_id=conversation_id, + ), + metadata=self.hosts[self.instance].metadata, + ).send_sync() + + @grpc_handler + def list_conversations( + self, + namespace_id: str, + app_id: str, + conversation_uid: str, + conversation_id: str, + if_all: bool, + page_size: int = 10, + page_token: str = "", + async_enabled: bool = False, + ) -> conversation_interface.ListConversationsResponse: + if async_enabled: + return RequestFactory( + method=self.hosts[self.instance].async_client.ListConversations, + request=conversation_interface.ListConversationsRequest( + namespace_id=namespace_id, + app_id=app_id, + conversation_uid=conversation_uid, + conversation_id=conversation_id, + if_all=if_all, + page_size=page_size, + page_token=page_token, + ), + metadata=self.hosts[self.instance].metadata, + ).send_async() + + return RequestFactory( + method=self.hosts[self.instance].client.ListConversations, + request=conversation_interface.ListConversationsRequest( + namespace_id=namespace_id, + app_id=app_id, + conversation_uid=conversation_uid, + conversation_id=conversation_id, + if_all=if_all, + page_size=page_size, + page_token=page_token, + ), + metadata=self.hosts[self.instance].metadata, + ).send_sync() + + @grpc_handler + def update_conversation( + self, + namespace_id: str, + app_id: str, + conversation_id: str, + new_conversation_id: str, + async_enabled: bool = False, + ) -> conversation_interface.UpdateConversationResponse: + if async_enabled: + return RequestFactory( + method=self.hosts[self.instance].async_client.UpdateConversation, + request=conversation_interface.UpdateConversationRequest( + namespace_id=namespace_id, + app_id=app_id, + conversation_id=conversation_id, + new_conversation_id=new_conversation_id, + ), + metadata=self.hosts[self.instance].metadata, + ).send_async() + + return RequestFactory( + method=self.hosts[self.instance].client.UpdateConversation, + request=conversation_interface.UpdateConversationRequest( + namespace_id=namespace_id, + app_id=app_id, + conversation_id=conversation_id, + new_conversation_id=new_conversation_id, + ), + metadata=self.hosts[self.instance].metadata, + ).send_sync() + + @grpc_handler + def delete_conversation( + self, + namespace_id: str, + app_id: str, + conversation_id: str, + async_enabled: bool = False, + ) -> conversation_interface.DeleteConversationResponse: + if async_enabled: + return RequestFactory( + method=self.hosts[self.instance].async_client.DeleteConversation, + request=conversation_interface.DeleteConversationRequest( + namespace_id=namespace_id, + app_id=app_id, + conversation_id=conversation_id, + ), + metadata=self.hosts[self.instance].metadata, + ).send_async() + + return RequestFactory( + method=self.hosts[self.instance].client.DeleteConversation, + request=conversation_interface.DeleteConversationRequest( + namespace_id=namespace_id, + app_id=app_id, + conversation_id=conversation_id, + ), + metadata=self.hosts[self.instance].metadata, + ).send_sync() + + @grpc_handler + def create_message( + self, + namespace_id: str, + app_id: str, + conversation_id: str, + content: str, + role: str, + async_enabled: bool = False, + ) -> conversation_interface.CreateMessageResponse: + if async_enabled: + return RequestFactory( + method=self.hosts[self.instance].async_client.CreateMessage, + request=conversation_interface.CreateMessageRequest( + namespace_id=namespace_id, + app_id=app_id, + conversation_id=conversation_id, + content=content, + role=role, + type=conversation_interface.Message.MessageType.MESSAGE_TYPE_TEXT, + ), + metadata=self.hosts[self.instance].metadata, + ).send_async() + + return RequestFactory( + method=self.hosts[self.instance].client.CreateMessage, + request=conversation_interface.CreateMessageRequest( + namespace_id=namespace_id, + app_id=app_id, + conversation_id=conversation_id, + content=content, + role=role, + type=conversation_interface.Message.MessageType.MESSAGE_TYPE_TEXT, + ), + metadata=self.hosts[self.instance].metadata, + ).send_sync() + + @grpc_handler + def list_messages( + self, + namespace_id: str, + app_id: str, + conversation_id: str, + latest_k: int, + include_system_messages: bool, + if_all: bool, + message_uid: str, + page_size: int = 10, + page_token: str = "", + async_enabled: bool = False, + ) -> conversation_interface.ListMessagesResponse: + if async_enabled: + return RequestFactory( + method=self.hosts[self.instance].async_client.ListMessages, + request=conversation_interface.ListMessagesRequest( + namespace_id=namespace_id, + app_id=app_id, + conversation_id=conversation_id, + latest_k=latest_k, + include_system_messages=include_system_messages, + if_all=if_all, + message_uid=message_uid, + page_size=page_size, + page_token=page_token, + ), + metadata=self.hosts[self.instance].metadata, + ).send_async() + + return RequestFactory( + method=self.hosts[self.instance].client.ListMessages, + request=conversation_interface.ListMessagesRequest( + namespace_id=namespace_id, + app_id=app_id, + conversation_id=conversation_id, + latest_k=latest_k, + include_system_messages=include_system_messages, + if_all=if_all, + message_uid=message_uid, + page_size=page_size, + page_token=page_token, + ), + metadata=self.hosts[self.instance].metadata, + ).send_sync() + + @grpc_handler + def update_message( + self, + namespace_id: str, + app_id: str, + conversation_id: str, + message_uid: str, + content: str, + async_enabled: bool = False, + ) -> conversation_interface.UpdateMessageResponse: + if async_enabled: + return RequestFactory( + method=self.hosts[self.instance].async_client.UpdateMessage, + request=conversation_interface.UpdateMessageRequest( + namespace_id=namespace_id, + app_id=app_id, + conversation_id=conversation_id, + message_uid=message_uid, + content=content, + ), + metadata=self.hosts[self.instance].metadata, + ).send_async() + + return RequestFactory( + method=self.hosts[self.instance].client.UpdateMessage, + request=conversation_interface.UpdateMessageRequest( + namespace_id=namespace_id, + app_id=app_id, + conversation_id=conversation_id, + message_uid=message_uid, + content=content, + ), + metadata=self.hosts[self.instance].metadata, + ).send_sync() + + @grpc_handler + def delete_message( + self, + namespace_id: str, + app_id: str, + conversation_id: str, + message_uid: str, + async_enabled: bool = False, + ) -> conversation_interface.DeleteMessageResponse: + if async_enabled: + return RequestFactory( + method=self.hosts[self.instance].async_client.DeleteMessage, + request=conversation_interface.DeleteMessageRequest( + namespace_id=namespace_id, + app_id=app_id, + conversation_id=conversation_id, + message_uid=message_uid, + ), + metadata=self.hosts[self.instance].metadata, + ).send_async() + + return RequestFactory( + method=self.hosts[self.instance].client.DeleteMessage, + request=conversation_interface.DeleteMessageRequest( + namespace_id=namespace_id, + app_id=app_id, + conversation_id=conversation_id, + message_uid=message_uid, + ), + metadata=self.hosts[self.instance].metadata, + ).send_sync() + + @grpc_handler + def update_ai_assistant_app_playground( + self, + namespace_id: str, + app_id: str, + last_ai_app_catalog_uid: str, + last_ai_app_top_k: int, + async_enabled: bool = False, + ) -> app_interface.UpdateAIAssistantAppPlaygroundResponse: + if async_enabled: + return RequestFactory( + method=self.hosts[ + self.instance + ].async_client.UpdateAIAssistantAppPlayground, + request=app_interface.UpdateAIAssistantAppPlaygroundRequest( + namespace_id=namespace_id, + app_id=app_id, + last_ai_app_catalog_uid=last_ai_app_catalog_uid, + last_ai_app_top_k=last_ai_app_top_k, + ), + metadata=self.hosts[self.instance].metadata, + ).send_async() + + return RequestFactory( + method=self.hosts[self.instance].client.UpdateAIAssistantAppPlayground, + request=app_interface.UpdateAIAssistantAppPlaygroundRequest( + namespace_id=namespace_id, + app_id=app_id, + last_ai_app_catalog_uid=last_ai_app_catalog_uid, + last_ai_app_top_k=last_ai_app_top_k, + ), + metadata=self.hosts[self.instance].metadata, + ).send_sync() + + @grpc_handler + def get_playground_conversation( + self, + namespace_id: str, + app_id: str, + async_enabled: bool = False, + ) -> app_interface.GetPlaygroundConversationResponse: + if async_enabled: + return RequestFactory( + method=self.hosts[self.instance].async_client.GetPlaygroundConversation, + request=app_interface.GetPlaygroundConversationRequest( + namespace_id=namespace_id, + app_id=app_id, + ), + metadata=self.hosts[self.instance].metadata, + ).send_async() + + return RequestFactory( + method=self.hosts[self.instance].client.GetPlaygroundConversation, + request=app_interface.GetPlaygroundConversationRequest( + namespace_id=namespace_id, + app_id=app_id, + ), + metadata=self.hosts[self.instance].metadata, + ).send_sync() + + @grpc_handler + def restart_playground_conversation( + self, + namespace_id: str, + app_id: str, + async_enabled: bool = False, + ) -> app_interface.RestartPlaygroundConversationResponse: + if async_enabled: + return RequestFactory( + method=self.hosts[ + self.instance + ].async_client.RestartPlaygroundConversation, + request=app_interface.RestartPlaygroundConversationRequest( + namespace_id=namespace_id, + app_id=app_id, + ), + metadata=self.hosts[self.instance].metadata, + ).send_async() + + return RequestFactory( + method=self.hosts[self.instance].client.RestartPlaygroundConversation, + request=app_interface.RestartPlaygroundConversationRequest( + namespace_id=namespace_id, + app_id=app_id, + ), + metadata=self.hosts[self.instance].metadata, + ).send_sync() + + @grpc_handler + def chat( + self, + namespace_id: str, + app_id: str, + catalog_id: str, + conversation_uid: str, + message: str, + async_enabled: bool = False, + ) -> conversation_interface.ChatResponse: + if async_enabled: + return RequestFactory( + method=self.hosts[self.instance].async_client.Chat, + request=conversation_interface.ChatRequest( + namespace_id=namespace_id, + app_id=app_id, + catalog_id=catalog_id, + conversation_uid=conversation_uid, + message=message, + ), + metadata=self.hosts[self.instance].metadata, + ).send_async() + + return RequestFactory( + method=self.hosts[self.instance].client.Chat, + request=conversation_interface.ChatRequest( + namespace_id=namespace_id, + app_id=app_id, + catalog_id=catalog_id, + conversation_uid=conversation_uid, + message=message, + ), + metadata=self.hosts[self.instance].metadata, + ).send_sync() diff --git a/instill/clients/artifact.py b/instill/clients/artifact.py index a3ee35b..9b5b69d 100644 --- a/instill/clients/artifact.py +++ b/instill/clients/artifact.py @@ -5,7 +5,6 @@ import instill.protogen.artifact.artifact.v1alpha.artifact_pb2 as artifact_interface import instill.protogen.artifact.artifact.v1alpha.artifact_public_service_pb2_grpc as artifact_service import instill.protogen.artifact.artifact.v1alpha.chunk_pb2 as chunk_interface -import instill.protogen.artifact.artifact.v1alpha.conversation_pb2 as conversation_interface import instill.protogen.artifact.artifact.v1alpha.file_catalog_pb2 as file_catalog_interface import instill.protogen.artifact.artifact.v1alpha.qa_pb2 as qa_interface @@ -427,18 +426,18 @@ def update_chunk( ).send_sync() @grpc_handler - def similarity_chunks_search( + def view_chunks( self, namespace_id: str, catalog_id: str, text_prompt: str, top_k: int, async_enabled: bool = False, - ) -> chunk_interface.SimilarityChunksSearchResponse: + ) -> chunk_interface.ViewChunksResponse: if async_enabled: return RequestFactory( - method=self.host.async_client.SimilarityChunksSearch, - request=chunk_interface.SimilarityChunksSearchRequest( + method=self.hosts[self.instance].async_client.ViewChunks, + request=chunk_interface.ViewChunksRequest( namespace_id=namespace_id, catalog_id=catalog_id, text_prompt=text_prompt, @@ -448,8 +447,8 @@ def similarity_chunks_search( ).send_async() return RequestFactory( - method=self.host.client.SimilarityChunksSearch, - request=chunk_interface.SimilarityChunksSearchRequest( + method=self.hosts[self.instance].client.ViewChunks, + request=chunk_interface.ViewChunksRequest( namespace_id=namespace_id, catalog_id=catalog_id, text_prompt=text_prompt, @@ -521,270 +520,3 @@ def get_file_catalog( ), metadata=self.host.metadata + self.metadata, ).send_sync() - - @grpc_handler - def create_conversation( - self, - namespace_id: str, - catalog_id: str, - conversation_id: str, - async_enabled: bool = False, - ) -> conversation_interface.CreateConversationResponse: - if async_enabled: - return RequestFactory( - method=self.host.async_client.CreateConversation, - request=conversation_interface.CreateConversationRequest( - namespace_id=namespace_id, - catalog_id=catalog_id, - conversation_id=conversation_id, - ), - metadata=self.host.metadata + self.metadata, - ).send_async() - - return RequestFactory( - method=self.host.client.CreateConversation, - request=conversation_interface.CreateConversationRequest( - namespace_id=namespace_id, - catalog_id=catalog_id, - conversation_id=conversation_id, - ), - metadata=self.host.metadata + self.metadata, - ).send_sync() - - @grpc_handler - def list_conversations( - self, - namespace_id: str, - catalog_id: str, - page_size: int = 10, - page_token: str = "", - async_enabled: bool = False, - ) -> conversation_interface.ListConversationsResponse: - if async_enabled: - return RequestFactory( - method=self.host.async_client.ListConversations, - request=conversation_interface.ListConversationsRequest( - namespace_id=namespace_id, - catalog_id=catalog_id, - page_size=page_size, - page_token=page_token, - ), - metadata=self.host.metadata + self.metadata, - ).send_async() - - return RequestFactory( - method=self.host.client.ListConversations, - request=conversation_interface.ListConversationsRequest( - namespace_id=namespace_id, - catalog_id=catalog_id, - page_size=page_size, - page_token=page_token, - ), - metadata=self.host.metadata + self.metadata, - ).send_sync() - - @grpc_handler - def update_conversation( - self, - namespace_id: str, - catalog_id: str, - conversation_id: str, - new_conversation_id: str, - async_enabled: bool = False, - ) -> conversation_interface.UpdateConversationResponse: - if async_enabled: - return RequestFactory( - method=self.host.async_client.UpdateConversation, - request=conversation_interface.UpdateConversationRequest( - namespace_id=namespace_id, - catalog_id=catalog_id, - conversation_id=conversation_id, - new_conversation_id=new_conversation_id, - ), - metadata=self.host.metadata + self.metadata, - ).send_async() - - return RequestFactory( - method=self.host.client.UpdateConversation, - request=conversation_interface.UpdateConversationRequest( - namespace_id=namespace_id, - catalog_id=catalog_id, - conversation_id=conversation_id, - new_conversation_id=new_conversation_id, - ), - metadata=self.host.metadata + self.metadata, - ).send_sync() - - @grpc_handler - def delete_conversation( - self, - namespace_id: str, - catalog_id: str, - conversation_id: str, - async_enabled: bool = False, - ) -> conversation_interface.DeleteConversationResponse: - if async_enabled: - return RequestFactory( - method=self.host.async_client.DeleteConversation, - request=conversation_interface.DeleteConversationRequest( - namespace_id=namespace_id, - catalog_id=catalog_id, - conversation_id=conversation_id, - ), - metadata=self.host.metadata + self.metadata, - ).send_async() - - return RequestFactory( - method=self.host.client.DeleteConversation, - request=conversation_interface.DeleteConversationRequest( - namespace_id=namespace_id, - catalog_id=catalog_id, - conversation_id=conversation_id, - ), - metadata=self.host.metadata + self.metadata, - ).send_sync() - - @grpc_handler - def create_message( - self, - namespace_id: str, - catalog_id: str, - conversation_id: str, - content: str, - role: str, - async_enabled: bool = False, - ) -> conversation_interface.CreateMessageResponse: - if async_enabled: - return RequestFactory( - method=self.host.async_client.CreateMessage, - request=conversation_interface.CreateMessageRequest( - namespace_id=namespace_id, - catalog_id=catalog_id, - conversation_id=conversation_id, - content=content, - role=role, - type=conversation_interface.Message.MessageType.MESSAGE_TYPE_TEXT, - ), - metadata=self.host.metadata + self.metadata, - ).send_async() - - return RequestFactory( - method=self.host.client.CreateMessage, - request=conversation_interface.CreateMessageRequest( - namespace_id=namespace_id, - catalog_id=catalog_id, - conversation_id=conversation_id, - content=content, - role=role, - type=conversation_interface.Message.MessageType.MESSAGE_TYPE_TEXT, - ), - metadata=self.host.metadata + self.metadata, - ).send_sync() - - @grpc_handler - def list_messages( - self, - namespace_id: str, - catalog_id: str, - conversation_id: str, - latest_k: int, - include_system_messages: bool, - page_size: int = 10, - page_token: str = "", - async_enabled: bool = False, - ) -> conversation_interface.ListMessagesResponse: - if async_enabled: - return RequestFactory( - method=self.host.async_client.ListMessages, - request=conversation_interface.ListMessagesRequest( - namespace_id=namespace_id, - catalog_id=catalog_id, - conversation_id=conversation_id, - latest_k=latest_k, - include_system_messages=include_system_messages, - page_size=page_size, - page_token=page_token, - ), - metadata=self.host.metadata + self.metadata, - ).send_async() - - return RequestFactory( - method=self.host.client.ListMessages, - request=conversation_interface.ListMessagesRequest( - namespace_id=namespace_id, - catalog_id=catalog_id, - conversation_id=conversation_id, - latest_k=latest_k, - include_system_messages=include_system_messages, - page_size=page_size, - page_token=page_token, - ), - metadata=self.host.metadata + self.metadata, - ).send_sync() - - @grpc_handler - def update_message( - self, - namespace_id: str, - catalog_id: str, - conversation_id: str, - message_uid: str, - content: str, - async_enabled: bool = False, - ) -> conversation_interface.UpdateMessageResponse: - if async_enabled: - return RequestFactory( - method=self.host.async_client.UpdateMessage, - request=conversation_interface.UpdateMessageRequest( - namespace_id=namespace_id, - catalog_id=catalog_id, - conversation_id=conversation_id, - message_uid=message_uid, - content=content, - ), - metadata=self.host.metadata + self.metadata, - ).send_async() - - return RequestFactory( - method=self.host.client.UpdateMessage, - request=conversation_interface.UpdateMessageRequest( - namespace_id=namespace_id, - catalog_id=catalog_id, - conversation_id=conversation_id, - message_uid=message_uid, - content=content, - ), - metadata=self.host.metadata + self.metadata, - ).send_sync() - - @grpc_handler - def delete_message( - self, - namespace_id: str, - catalog_id: str, - conversation_id: str, - message_uid: str, - async_enabled: bool = False, - ) -> conversation_interface.DeleteMessageResponse: - if async_enabled: - return RequestFactory( - method=self.host.async_client.DeleteMessage, - request=conversation_interface.DeleteMessageRequest( - namespace_id=namespace_id, - catalog_id=catalog_id, - conversation_id=conversation_id, - message_uid=message_uid, - ), - metadata=self.host.metadata + self.metadata, - ).send_async() - - return RequestFactory( - method=self.host.client.DeleteMessage, - request=conversation_interface.DeleteMessageRequest( - namespace_id=namespace_id, - catalog_id=catalog_id, - conversation_id=conversation_id, - message_uid=message_uid, - ), - metadata=self.host.metadata + self.metadata, - ).send_sync() diff --git a/instill/clients/client.py b/instill/clients/client.py index 2da692a..14901ff 100644 --- a/instill/clients/client.py +++ b/instill/clients/client.py @@ -1,5 +1,6 @@ # pylint: disable=no-name-in-module,no-member import instill.protogen.core.mgmt.v1beta.mgmt_pb2 as mgmt_interface +from instill.clients.app import AppClient from instill.clients.artifact import ArtifactClient from instill.clients.mgmt import MgmtClient from instill.clients.model import ModelClient @@ -65,6 +66,10 @@ def __init__( "Instill Artifact is not serving, Artifact functionalities will not work" ) + self.app_service = AppClient(async_enabled=async_enabled, api_token=api_token) + if not self.app_service.is_serving(): + Logger.w("Instill App is not serving, App functionalities will not work") + def _lookup_namespace_uid(self, namespace_id: str): resp = self.mgmt.check_namespace(namespace_id) if resp.type == mgmt_interface.CheckNamespaceAdminResponse.NAMESPACE_USER: @@ -84,12 +89,14 @@ def close(self): self.pipeline.close() self.model.close() self.artifact.close() + self.app_service.close() async def async_close(self): self.mgmt.async_close() self.pipeline.async_close() self.model.async_close() self.artifact.async_close() + self.app_service.async_close() def get_mgmt(self) -> MgmtClient: return self.mgmt @@ -103,6 +110,9 @@ def get_pipeline(self) -> PipelineClient: def get_model(self) -> ModelClient: return self.model + def get_app(self) -> AppClient: + return self.app_service + def init_core_client( api_token: str, @@ -135,6 +145,15 @@ def init_artifact_client( return client.get_artifact() +def init_app_client(api_token: str = "", async_enabled: bool = False) -> AppClient: + client = AppClient(api_token=api_token, async_enabled=async_enabled) + if not client.is_serving(): + Logger.w("Instill App is not serving, App functionalities will not work") + raise NotServingException + + return client + + def init_model_client( api_token: str, requester_id="", diff --git a/instill/clients/instance.py b/instill/clients/instance.py index 1e49f87..43bf6e2 100644 --- a/instill/clients/instance.py +++ b/instill/clients/instance.py @@ -2,6 +2,7 @@ import grpc +import instill.protogen.app.app.v1alpha.app_public_service_pb2_grpc as app_service import instill.protogen.artifact.artifact.v1alpha.artifact_public_service_pb2_grpc as artifact_service import instill.protogen.core.mgmt.v1beta.mgmt_public_service_pb2_grpc as mgmt_service import instill.protogen.model.model.v1alpha.model_public_service_pb2_grpc as model_service @@ -49,6 +50,7 @@ def __init__(self, stub, url: str, token: str, secure: bool, async_enabled: bool pipeline_service.PipelinePublicServiceStub, mgmt_service.MgmtPublicServiceStub, artifact_service.ArtifactPublicServiceStub, + app_service.AppPublicServiceStub, ] = stub(channel) if async_enabled: self.async_channel: grpc.Channel = async_channel @@ -57,4 +59,5 @@ def __init__(self, stub, url: str, token: str, secure: bool, async_enabled: bool pipeline_service.PipelinePublicServiceStub, mgmt_service.MgmtPublicServiceStub, artifact_service.ArtifactPublicServiceStub, + app_service.AppPublicServiceStub, ] = stub(async_channel) diff --git a/instill/protogen b/instill/protogen index c6483ae..29f8cd5 160000 --- a/instill/protogen +++ b/instill/protogen @@ -1 +1 @@ -Subproject commit c6483ae386a622ca9bb843389e5d82f7e9bb5ada +Subproject commit 29f8cd5fe051dcfc001802d11dca677b7f38515f From 8ea7e473ed12265bca535a486d768363127a1bc2 Mon Sep 17 00:00:00 2001 From: Jeremy Shih Date: Thu, 10 Oct 2024 11:44:06 +0800 Subject: [PATCH 2/2] feat(client): update proto and add AppClient * fix app client --- instill/clients/app.py | 257 +++++++++++++++--------------------- instill/clients/artifact.py | 12 +- instill/clients/client.py | 35 +++-- instill/clients/pipeline.py | 12 +- instill/protogen | 2 +- 5 files changed, 148 insertions(+), 170 deletions(-) diff --git a/instill/clients/app.py b/instill/clients/app.py index 48cf2b7..e3a9f3b 100644 --- a/instill/clients/app.py +++ b/instill/clients/app.py @@ -1,5 +1,5 @@ # pylint: disable=no-member,wrong-import-position,too-many-lines,no-name-in-module -from typing import Dict +from typing import Callable, List # app import instill.protogen.app.app.v1alpha.app_pb2 as app_interface @@ -9,103 +9,91 @@ # common import instill.protogen.common.healthcheck.v1beta.healthcheck_pb2 as healthcheck from instill.clients.base import Client, RequestFactory -from instill.clients.constant import DEFAULT_INSTANCE from instill.clients.instance import InstillInstance -from instill.configuration import global_config from instill.utils.error_handler import grpc_handler class AppClient(Client): - def __init__(self, async_enabled: bool = False, api_token: str = "") -> None: - self.hosts: Dict[str, InstillInstance] = {} - if DEFAULT_INSTANCE in global_config.hosts: - self.instance = DEFAULT_INSTANCE - elif len(global_config.hosts) == 0: - self.instance = "" - else: - self.instance = list(global_config.hosts.keys())[0] - - if global_config.hosts is not None: - for instance, config in global_config.hosts.items(): - token = config.token - if api_token != "" and instance == self.instance: - token = api_token - self.hosts[instance] = InstillInstance( - app_service.AppPublicServiceStub, - url=config.url, - token=token, - secure=config.secure, - async_enabled=async_enabled, - ) + def __init__( + self, + api_token: str, + lookup_func: Callable[[str], str], + url: str = "api.instill.tech", + secure: bool = True, + requester_id: str = "", + async_enabled: bool = False, + ) -> None: + self.host: InstillInstance = InstillInstance( + app_service.AppPublicServiceStub, + url=url, + token=api_token, + secure=secure, + async_enabled=async_enabled, + ) + + self.metadata = [] + self._lookup_uid = lookup_func + + if requester_id != "": + requester_uid = lookup_func(requester_id) + self.metadata = [("instill-requester-uid", requester_uid)] def close(self): if self.is_serving(): - for host in self.hosts.values(): - host.channel.close() + self.host.channel.close() async def async_close(self): if self.is_serving(): - for host in self.hosts.values(): - await host.async_channel.close() + self.host.channel.close() @property - def hosts(self): - return self._hosts + def host(self): + return self._host - @hosts.setter - def hosts(self, hosts: Dict[str, InstillInstance]): - self._hosts = hosts - - @property - def instance(self): - return self._instance - - @instance.setter - def instance(self, instance: str): - self._instance = instance + @host.setter + def host(self, host: InstillInstance): + self._host = host @property def metadata(self): return self._metadata @metadata.setter - def metadata(self, metadata: str): + def metadata(self, metadata: List[tuple]): self._metadata = metadata - @grpc_handler def liveness( self, async_enabled: bool = False, ) -> app_interface.LivenessResponse: if async_enabled: return RequestFactory( - method=self.hosts[self.instance].async_client.Liveness, + method=self.host.async_client.Liveness, request=app_interface.LivenessRequest(), - metadata=self.hosts[self.instance].metadata, + metadata=self.host.metadata + self.metadata, ).send_async() return RequestFactory( - method=self.hosts[self.instance].client.Liveness, + method=self.host.client.Liveness, request=app_interface.LivenessRequest(), - metadata=self.hosts[self.instance].metadata, + metadata=self.host.metadata + self.metadata, ).send_sync() - @grpc_handler def readiness( self, async_enabled: bool = False, ) -> app_interface.ReadinessResponse: if async_enabled: return RequestFactory( - method=self.hosts[self.instance].async_client.Readiness, + method=self.host.async_client.Readiness, request=app_interface.ReadinessRequest(), - metadata=self.hosts[self.instance].metadata, + metadata=self.host.metadata + self.metadata, ).send_async() return RequestFactory( - method=self.hosts[self.instance].client.Readiness, + method=self.host.client.Readiness, request=app_interface.ReadinessRequest(), - metadata=self.hosts[self.instance].metadata, + metadata=self.host.metadata + self.metadata, ).send_sync() def is_serving(self) -> bool: @@ -128,25 +116,25 @@ def create_app( ) -> app_interface.CreateAppResponse: if async_enabled: return RequestFactory( - method=self.hosts[self.instance].async_client.CreateApp, + method=self.host.async_client.CreateApp, request=app_interface.CreateAppRequest( namespace_id=namespace_id, id=app_id, description=description, tags=tags, ), - metadata=self.hosts[self.instance].metadata, + metadata=self.host.metadata + self.metadata, ).send_async() return RequestFactory( - method=self.hosts[self.instance].client.CreateApp, + method=self.host.client.CreateApp, request=app_interface.CreateAppRequest( namespace_id=namespace_id, id=app_id, description=description, tags=tags, ), - metadata=self.hosts[self.instance].metadata, + metadata=self.host.metadata + self.metadata, ).send_sync() @grpc_handler @@ -157,19 +145,19 @@ def list_apps( ) -> app_interface.ListAppsResponse: if async_enabled: return RequestFactory( - method=self.hosts[self.instance].async_client.ListApps, + method=self.host.async_client.ListApps, request=app_interface.ListAppsRequest( namespace_id=namespace_id, ), - metadata=self.hosts[self.instance].metadata, + metadata=self.host.metadata + self.metadata, ).send_async() return RequestFactory( - method=self.hosts[self.instance].client.ListApps, + method=self.host.client.ListApps, request=app_interface.ListAppsRequest( namespace_id=namespace_id, ), - metadata=self.hosts[self.instance].metadata, + metadata=self.host.metadata + self.metadata, ).send_sync() @grpc_handler @@ -186,7 +174,7 @@ def update_app( ) -> app_interface.UpdateAppResponse: if async_enabled: return RequestFactory( - method=self.hosts[self.instance].async_client.UpdateApp, + method=self.host.async_client.UpdateApp, request=app_interface.UpdateAppRequest( namespace_id=namespace_id, app_id=app_id, @@ -196,11 +184,11 @@ def update_app( last_ai_assistant_app_catalog_uid=last_ai_assistant_app_catalog_uid, last_ai_assistant_app_top_k=last_ai_assistant_app_top_k, ), - metadata=self.hosts[self.instance].metadata, + metadata=self.host.metadata + self.metadata, ).send_async() return RequestFactory( - method=self.hosts[self.instance].client.UpdateApp, + method=self.host.client.UpdateApp, request=app_interface.UpdateAppRequest( namespace_id=namespace_id, app_id=app_id, @@ -210,7 +198,7 @@ def update_app( last_ai_assistant_app_catalog_uid=last_ai_assistant_app_catalog_uid, last_ai_assistant_app_top_k=last_ai_assistant_app_top_k, ), - metadata=self.hosts[self.instance].metadata, + metadata=self.host.metadata + self.metadata, ).send_sync() @grpc_handler @@ -222,21 +210,21 @@ def delete_app( ) -> app_interface.DeleteAppResponse: if async_enabled: return RequestFactory( - method=self.hosts[self.instance].async_client.DeleteApp, + method=self.host.async_client.DeleteApp, request=app_interface.DeleteAppRequest( namespace_id=namespace_id, app_id=app_id, ), - metadata=self.hosts[self.instance].metadata, + metadata=self.host.metadata + self.metadata, ).send_async() return RequestFactory( - method=self.hosts[self.instance].client.DeleteApp, + method=self.host.client.DeleteApp, request=app_interface.DeleteAppRequest( namespace_id=namespace_id, app_id=app_id, ), - metadata=self.hosts[self.instance].metadata, + metadata=self.host.metadata + self.metadata, ).send_sync() @grpc_handler @@ -249,23 +237,23 @@ def create_conversation( ) -> conversation_interface.CreateConversationResponse: if async_enabled: return RequestFactory( - method=self.hosts[self.instance].async_client.CreateConversation, + method=self.host.async_client.CreateConversation, request=conversation_interface.CreateConversationRequest( namespace_id=namespace_id, app_id=app_id, conversation_id=conversation_id, ), - metadata=self.hosts[self.instance].metadata, + metadata=self.host.metadata + self.metadata, ).send_async() return RequestFactory( - method=self.hosts[self.instance].client.CreateConversation, + method=self.host.client.CreateConversation, request=conversation_interface.CreateConversationRequest( namespace_id=namespace_id, app_id=app_id, conversation_id=conversation_id, ), - metadata=self.hosts[self.instance].metadata, + metadata=self.host.metadata + self.metadata, ).send_sync() @grpc_handler @@ -282,7 +270,7 @@ def list_conversations( ) -> conversation_interface.ListConversationsResponse: if async_enabled: return RequestFactory( - method=self.hosts[self.instance].async_client.ListConversations, + method=self.host.async_client.ListConversations, request=conversation_interface.ListConversationsRequest( namespace_id=namespace_id, app_id=app_id, @@ -292,11 +280,11 @@ def list_conversations( page_size=page_size, page_token=page_token, ), - metadata=self.hosts[self.instance].metadata, + metadata=self.host.metadata + self.metadata, ).send_async() return RequestFactory( - method=self.hosts[self.instance].client.ListConversations, + method=self.host.client.ListConversations, request=conversation_interface.ListConversationsRequest( namespace_id=namespace_id, app_id=app_id, @@ -306,7 +294,7 @@ def list_conversations( page_size=page_size, page_token=page_token, ), - metadata=self.hosts[self.instance].metadata, + metadata=self.host.metadata + self.metadata, ).send_sync() @grpc_handler @@ -316,29 +304,35 @@ def update_conversation( app_id: str, conversation_id: str, new_conversation_id: str, + last_used_catalog_uid: str, + last_used_top_k: int, async_enabled: bool = False, ) -> conversation_interface.UpdateConversationResponse: if async_enabled: return RequestFactory( - method=self.hosts[self.instance].async_client.UpdateConversation, + method=self.host.async_client.UpdateConversation, request=conversation_interface.UpdateConversationRequest( namespace_id=namespace_id, app_id=app_id, conversation_id=conversation_id, new_conversation_id=new_conversation_id, + last_used_catalog_uid=last_used_catalog_uid, + last_used_top_k=last_used_top_k, ), - metadata=self.hosts[self.instance].metadata, + metadata=self.host.metadata + self.metadata, ).send_async() return RequestFactory( - method=self.hosts[self.instance].client.UpdateConversation, + method=self.host.client.UpdateConversation, request=conversation_interface.UpdateConversationRequest( namespace_id=namespace_id, app_id=app_id, conversation_id=conversation_id, new_conversation_id=new_conversation_id, + last_used_catalog_uid=last_used_catalog_uid, + last_used_top_k=last_used_top_k, ), - metadata=self.hosts[self.instance].metadata, + metadata=self.host.metadata + self.metadata, ).send_sync() @grpc_handler @@ -351,23 +345,23 @@ def delete_conversation( ) -> conversation_interface.DeleteConversationResponse: if async_enabled: return RequestFactory( - method=self.hosts[self.instance].async_client.DeleteConversation, + method=self.host.async_client.DeleteConversation, request=conversation_interface.DeleteConversationRequest( namespace_id=namespace_id, app_id=app_id, conversation_id=conversation_id, ), - metadata=self.hosts[self.instance].metadata, + metadata=self.host.metadata + self.metadata, ).send_async() return RequestFactory( - method=self.hosts[self.instance].client.DeleteConversation, + method=self.host.client.DeleteConversation, request=conversation_interface.DeleteConversationRequest( namespace_id=namespace_id, app_id=app_id, conversation_id=conversation_id, ), - metadata=self.hosts[self.instance].metadata, + metadata=self.host.metadata + self.metadata, ).send_sync() @grpc_handler @@ -382,7 +376,7 @@ def create_message( ) -> conversation_interface.CreateMessageResponse: if async_enabled: return RequestFactory( - method=self.hosts[self.instance].async_client.CreateMessage, + method=self.host.async_client.CreateMessage, request=conversation_interface.CreateMessageRequest( namespace_id=namespace_id, app_id=app_id, @@ -391,11 +385,11 @@ def create_message( role=role, type=conversation_interface.Message.MessageType.MESSAGE_TYPE_TEXT, ), - metadata=self.hosts[self.instance].metadata, + metadata=self.host.metadata + self.metadata, ).send_async() return RequestFactory( - method=self.hosts[self.instance].client.CreateMessage, + method=self.host.client.CreateMessage, request=conversation_interface.CreateMessageRequest( namespace_id=namespace_id, app_id=app_id, @@ -404,7 +398,7 @@ def create_message( role=role, type=conversation_interface.Message.MessageType.MESSAGE_TYPE_TEXT, ), - metadata=self.hosts[self.instance].metadata, + metadata=self.host.metadata + self.metadata, ).send_sync() @grpc_handler @@ -423,7 +417,7 @@ def list_messages( ) -> conversation_interface.ListMessagesResponse: if async_enabled: return RequestFactory( - method=self.hosts[self.instance].async_client.ListMessages, + method=self.host.async_client.ListMessages, request=conversation_interface.ListMessagesRequest( namespace_id=namespace_id, app_id=app_id, @@ -435,11 +429,11 @@ def list_messages( page_size=page_size, page_token=page_token, ), - metadata=self.hosts[self.instance].metadata, + metadata=self.host.metadata + self.metadata, ).send_async() return RequestFactory( - method=self.hosts[self.instance].client.ListMessages, + method=self.host.client.ListMessages, request=conversation_interface.ListMessagesRequest( namespace_id=namespace_id, app_id=app_id, @@ -451,7 +445,7 @@ def list_messages( page_size=page_size, page_token=page_token, ), - metadata=self.hosts[self.instance].metadata, + metadata=self.host.metadata + self.metadata, ).send_sync() @grpc_handler @@ -466,7 +460,7 @@ def update_message( ) -> conversation_interface.UpdateMessageResponse: if async_enabled: return RequestFactory( - method=self.hosts[self.instance].async_client.UpdateMessage, + method=self.host.async_client.UpdateMessage, request=conversation_interface.UpdateMessageRequest( namespace_id=namespace_id, app_id=app_id, @@ -474,11 +468,11 @@ def update_message( message_uid=message_uid, content=content, ), - metadata=self.hosts[self.instance].metadata, + metadata=self.host.metadata + self.metadata, ).send_async() return RequestFactory( - method=self.hosts[self.instance].client.UpdateMessage, + method=self.host.client.UpdateMessage, request=conversation_interface.UpdateMessageRequest( namespace_id=namespace_id, app_id=app_id, @@ -486,7 +480,7 @@ def update_message( message_uid=message_uid, content=content, ), - metadata=self.hosts[self.instance].metadata, + metadata=self.host.metadata + self.metadata, ).send_sync() @grpc_handler @@ -500,59 +494,25 @@ def delete_message( ) -> conversation_interface.DeleteMessageResponse: if async_enabled: return RequestFactory( - method=self.hosts[self.instance].async_client.DeleteMessage, + method=self.host.async_client.DeleteMessage, request=conversation_interface.DeleteMessageRequest( namespace_id=namespace_id, app_id=app_id, conversation_id=conversation_id, message_uid=message_uid, ), - metadata=self.hosts[self.instance].metadata, + metadata=self.host.metadata + self.metadata, ).send_async() return RequestFactory( - method=self.hosts[self.instance].client.DeleteMessage, + method=self.host.client.DeleteMessage, request=conversation_interface.DeleteMessageRequest( namespace_id=namespace_id, app_id=app_id, conversation_id=conversation_id, message_uid=message_uid, ), - metadata=self.hosts[self.instance].metadata, - ).send_sync() - - @grpc_handler - def update_ai_assistant_app_playground( - self, - namespace_id: str, - app_id: str, - last_ai_app_catalog_uid: str, - last_ai_app_top_k: int, - async_enabled: bool = False, - ) -> app_interface.UpdateAIAssistantAppPlaygroundResponse: - if async_enabled: - return RequestFactory( - method=self.hosts[ - self.instance - ].async_client.UpdateAIAssistantAppPlayground, - request=app_interface.UpdateAIAssistantAppPlaygroundRequest( - namespace_id=namespace_id, - app_id=app_id, - last_ai_app_catalog_uid=last_ai_app_catalog_uid, - last_ai_app_top_k=last_ai_app_top_k, - ), - metadata=self.hosts[self.instance].metadata, - ).send_async() - - return RequestFactory( - method=self.hosts[self.instance].client.UpdateAIAssistantAppPlayground, - request=app_interface.UpdateAIAssistantAppPlaygroundRequest( - namespace_id=namespace_id, - app_id=app_id, - last_ai_app_catalog_uid=last_ai_app_catalog_uid, - last_ai_app_top_k=last_ai_app_top_k, - ), - metadata=self.hosts[self.instance].metadata, + metadata=self.host.metadata + self.metadata, ).send_sync() @grpc_handler @@ -564,21 +524,21 @@ def get_playground_conversation( ) -> app_interface.GetPlaygroundConversationResponse: if async_enabled: return RequestFactory( - method=self.hosts[self.instance].async_client.GetPlaygroundConversation, + method=self.host.async_client.GetPlaygroundConversation, request=app_interface.GetPlaygroundConversationRequest( namespace_id=namespace_id, app_id=app_id, ), - metadata=self.hosts[self.instance].metadata, + metadata=self.host.metadata + self.metadata, ).send_async() return RequestFactory( - method=self.hosts[self.instance].client.GetPlaygroundConversation, + method=self.host.client.GetPlaygroundConversation, request=app_interface.GetPlaygroundConversationRequest( namespace_id=namespace_id, app_id=app_id, ), - metadata=self.hosts[self.instance].metadata, + metadata=self.host.metadata + self.metadata, ).send_sync() @grpc_handler @@ -590,23 +550,21 @@ def restart_playground_conversation( ) -> app_interface.RestartPlaygroundConversationResponse: if async_enabled: return RequestFactory( - method=self.hosts[ - self.instance - ].async_client.RestartPlaygroundConversation, + method=self.host.async_client.RestartPlaygroundConversation, request=app_interface.RestartPlaygroundConversationRequest( namespace_id=namespace_id, app_id=app_id, ), - metadata=self.hosts[self.instance].metadata, + metadata=self.host.metadata + self.metadata, ).send_async() return RequestFactory( - method=self.hosts[self.instance].client.RestartPlaygroundConversation, + method=self.host.client.RestartPlaygroundConversation, request=app_interface.RestartPlaygroundConversationRequest( namespace_id=namespace_id, app_id=app_id, ), - metadata=self.hosts[self.instance].metadata, + metadata=self.host.metadata + self.metadata, ).send_sync() @grpc_handler @@ -617,29 +575,32 @@ def chat( catalog_id: str, conversation_uid: str, message: str, + top_k: int, async_enabled: bool = False, ) -> conversation_interface.ChatResponse: if async_enabled: return RequestFactory( - method=self.hosts[self.instance].async_client.Chat, + method=self.host.async_client.Chat, request=conversation_interface.ChatRequest( namespace_id=namespace_id, app_id=app_id, catalog_id=catalog_id, conversation_uid=conversation_uid, message=message, + top_k=top_k, ), - metadata=self.hosts[self.instance].metadata, + metadata=self.host.metadata + self.metadata, ).send_async() return RequestFactory( - method=self.hosts[self.instance].client.Chat, + method=self.host.client.Chat, request=conversation_interface.ChatRequest( namespace_id=namespace_id, app_id=app_id, catalog_id=catalog_id, conversation_uid=conversation_uid, message=message, + top_k=top_k, ), - metadata=self.hosts[self.instance].metadata, + metadata=self.host.metadata + self.metadata, ).send_sync() diff --git a/instill/clients/artifact.py b/instill/clients/artifact.py index 9b5b69d..055171f 100644 --- a/instill/clients/artifact.py +++ b/instill/clients/artifact.py @@ -426,18 +426,18 @@ def update_chunk( ).send_sync() @grpc_handler - def view_chunks( + def similarity_chunks_search( self, namespace_id: str, catalog_id: str, text_prompt: str, top_k: int, async_enabled: bool = False, - ) -> chunk_interface.ViewChunksResponse: + ) -> chunk_interface.SimilarityChunksSearchResponse: if async_enabled: return RequestFactory( - method=self.hosts[self.instance].async_client.ViewChunks, - request=chunk_interface.ViewChunksRequest( + method=self.host.async_client.SimilarityChunksSearch, + request=chunk_interface.SimilarityChunksSearchRequest( namespace_id=namespace_id, catalog_id=catalog_id, text_prompt=text_prompt, @@ -447,8 +447,8 @@ def view_chunks( ).send_async() return RequestFactory( - method=self.hosts[self.instance].client.ViewChunks, - request=chunk_interface.ViewChunksRequest( + method=self.host.client.SimilarityChunksSearch, + request=chunk_interface.SimilarityChunksSearchRequest( namespace_id=namespace_id, catalog_id=catalog_id, text_prompt=text_prompt, diff --git a/instill/clients/client.py b/instill/clients/client.py index 14901ff..74231e5 100644 --- a/instill/clients/client.py +++ b/instill/clients/client.py @@ -66,7 +66,14 @@ def __init__( "Instill Artifact is not serving, Artifact functionalities will not work" ) - self.app_service = AppClient(async_enabled=async_enabled, api_token=api_token) + self.app_service = AppClient( + api_token=api_token, + url=url, + secure=secure, + lookup_func=self._lookup_namespace_uid, + requester_id=requester_id, + async_enabled=async_enabled, + ) if not self.app_service.is_serving(): Logger.w("Instill App is not serving, App functionalities will not work") @@ -128,7 +135,7 @@ def init_core_client( def init_artifact_client( api_token: str, - requester_id="", + requester_id: str = "", async_enabled: bool = False, ) -> ArtifactClient: client = InstillClient( @@ -145,15 +152,6 @@ def init_artifact_client( return client.get_artifact() -def init_app_client(api_token: str = "", async_enabled: bool = False) -> AppClient: - client = AppClient(api_token=api_token, async_enabled=async_enabled) - if not client.is_serving(): - Logger.w("Instill App is not serving, App functionalities will not work") - raise NotServingException - - return client - - def init_model_client( api_token: str, requester_id="", @@ -203,3 +201,18 @@ def init_mgmt_client( raise NotServingException return client.get_mgmt() + + +def init_app_client( + api_token: str = "", requester_id: str = "", async_enabled: bool = False +) -> AppClient: + client = InstillClient( + api_token=api_token, + requester_id=requester_id, + async_enabled=async_enabled, + ) + if not client.get_app().is_serving(): + Logger.w("Instill App is not serving, App functionalities will not work") + raise NotServingException + + return client.get_app() diff --git a/instill/clients/pipeline.py b/instill/clients/pipeline.py index edfe32e..791146f 100644 --- a/instill/clients/pipeline.py +++ b/instill/clients/pipeline.py @@ -448,9 +448,10 @@ def clone_pipeline( request=pipeline_interface.CloneNamespacePipelineRequest( namespace_id=namespace_id, pipeline_id=pipeline_id, - target=f"namespaces/{namespace_id}/pipelines/{target}", description=description, sharing=sharing, + target_namespace_id=namespace_id, + target_pipeline_id=target, ), metadata=self.host.metadata + self.metadata, ).send_async() @@ -460,9 +461,10 @@ def clone_pipeline( request=pipeline_interface.CloneNamespacePipelineRequest( namespace_id=namespace_id, pipeline_id=pipeline_id, - target=f"namespaces/{namespace_id}/pipelines/{target}", description=description, sharing=sharing, + target_namespace_id=namespace_id, + target_pipeline_id=target, ), metadata=self.host.metadata + self.metadata, ).send_sync() @@ -840,9 +842,10 @@ def clone_pipeline_release( namespace_id=namespace_id, pipeline_id=pipeline_id, release_id=release_id, - target=f"namespaces/{namespace_id}/pipelines/{target}", description=description, sharing=sharing, + target_namespace_id=namespace_id, + target_pipeline_id=target, ), metadata=self.host.metadata + self.metadata, ).send_async() @@ -853,9 +856,10 @@ def clone_pipeline_release( namespace_id=namespace_id, pipeline_id=pipeline_id, release_id=release_id, - target=f"namespaces/{namespace_id}/pipelines/{target}", description=description, sharing=sharing, + target_namespace_id=namespace_id, + target_pipeline_id=target, ), metadata=self.host.metadata + self.metadata, ).send_sync() diff --git a/instill/protogen b/instill/protogen index 29f8cd5..ce882bf 160000 --- a/instill/protogen +++ b/instill/protogen @@ -1 +1 @@ -Subproject commit 29f8cd5fe051dcfc001802d11dca677b7f38515f +Subproject commit ce882bf0b2a4587e4b56c803c0fa3d6a8776a247