import types from typing import List, Dict import textwrap from pqai_agent.toolkit.function_tool import FunctionTool from pqai_agent.chat_service import Coze, TokenAuth, Message, CozeChat class FunctionToolFactory: @staticmethod def create_tool(bot_id: str, coze_client: CozeChat, func_name: str, func_desc: str) -> FunctionTool: """ Create a FunctionTool for a specific Coze Bot. Args: bot_id (str): The ID of the Coze Bot. coze_client (CozeChat): The Coze client instance to interact with the bot. func_name (str): The name of the function to be used in the FunctionTool. func_desc (str): A description of the function to be used in the FunctionTool. Returns: FunctionTool: A FunctionTool wrapping the Coze Bot interaction. """ func_doc = f""" {func_desc} Args: messages (List[Dict]): A list of messages to send to the bot. custom_variables (Dict): Custom variables for the bot. Returns: str: The final response from the bot. """ func_doc = textwrap.dedent(func_doc).strip() def coze_func(messages: List[Dict], custom_variables: Dict = None) -> str: # ATTENTION: # custom_variables (Dict): Custom variables for the bot. THIS IS A TRICK. # THIS PARAMETER SHOULD NOT BE VISIBLE TO THE AGENT AND FILLED BY THE SYSTEM. # FIXME: Coze bot can return multimodal content. response = coze_client.create( bot_id=bot_id, user_id='agent_tool_call', messages=[Message.build_user_question_text(msg["text"]) for msg in messages], custom_variables=custom_variables ) if not response: return 'Error in calling the function.' return response dynamic_function = types.FunctionType( coze_func.__code__, globals(), name=func_name, argdefs=coze_func.__defaults__, closure=coze_func.__closure__ ) dynamic_function.__doc__ = func_doc # Wrap the function in a FunctionTool return FunctionTool(dynamic_function)