diff --git a/lollms/app.py b/lollms/app.py index 3be2524..83debf8 100644 --- a/lollms/app.py +++ b/lollms/app.py @@ -1399,7 +1399,7 @@ Answer directly with the reformulation of the last prompt. # Extract default values from fc_dict's static_parameters for param in fc_dict['static_parameters']: - static_parameters[param['name']] = param['default'] + static_parameters[param['name']] = param.get('default',"") # Create parent directories if they don't exist config_path.parent.mkdir(parents=True, exist_ok=True) @@ -1431,6 +1431,7 @@ Answer directly with the reformulation of the last prompt. fc_dict["class"] = class_(self, client, static_parameters) function_calls.append(fc_dict) except Exception as ex: + self.error("Couldn't add function call to context") trace_exception(ex) # Calculate the total number of tokens between conditionning, documentation, and knowledge total_tokens = n_cond_tk + n_isearch_tk + n_doc_tk + n_user_description_tk + n_positive_boost + n_negative_boost + n_fun_mode + n_think_first_mode diff --git a/lollms/function_call.py b/lollms/function_call.py index 734efce..1830732 100644 --- a/lollms/function_call.py +++ b/lollms/function_call.py @@ -16,24 +16,19 @@ class FunctionCall: self.client = client self.static_parameters = static_parameters - def execute(self, *args, **kwargs): + def execute(self, context, *args, **kwargs): """ Execute the function based on its type. This method should be overridden by subclasses. """ raise NotImplementedError("Subclasses must implement the execute method.") - def update_context(self, context, contructed_context:str): + def update_context(self, context, constructed_context:List[str]): """ Update the context if needed. This method should be overridden by subclasses. """ - if self.function_type == FunctionType.CONTEXT_UPDATE: - raise NotImplementedError("Subclasses must implement the update_context method for CONTEXT_UPDATE functions.") - elif self.function_type == FunctionType.AI_FIRST_CALL: - raise NotImplementedError("Subclasses must implement the update_context method for AI_FIRST_CALL functions.") - elif self.function_type == FunctionType.POST_GENERATION: - raise NotImplementedError("Subclasses must implement the update_context method for POST_GENERATION functions.") + return constructed_context def process_output(self, context, llm_output:str): if self.function_type == FunctionType.CONTEXT_UPDATE: diff --git a/lollms/prompting.py b/lollms/prompting.py index f3b242a..e261613 100644 --- a/lollms/prompting.py +++ b/lollms/prompting.py @@ -92,6 +92,7 @@ class LollmsContextDetails: self.ctx_size = ctx_size self.max_n_predict = max_n_predict self.model = model + self.ai_output = "" def transform_function_to_text(self, template, func): @@ -111,7 +112,7 @@ class LollmsContextDetails: function_texts.append(function_text.strip()) return "\n\n".join(function_texts) - def build_prompt(self, template: LollmsLLMTemplate, custom_entries: str = "", suppress: List[str] = []) -> str: + def build_prompt(self, template: LollmsLLMTemplate, custom_entries: str = "", suppress: List[str] = [], ignore_function_calls:bool=False) -> str: """ Builds a prompt from the context details using the integrated template system. @@ -147,7 +148,7 @@ class LollmsContextDetails: append_context("conditionning") append_context("documentation", template.system_custom_header("documentation")) append_context("internet_search_results", template.system_custom_header("Internet search results")) - append_context("user_description", template.system_custom_header("user_description")) + append_context("user_description") append_context("positive_boost", template.system_custom_header("positive_boost")) append_context("negative_boost", template.system_custom_header("negative_boost")) append_context("current_language", template.system_custom_header("current_language")) @@ -156,35 +157,36 @@ class LollmsContextDetails: append_context("extra") found_classic_function = False - - for function_call in self.function_calls: - fc:FunctionCall = function_call["class"] - if fc.function_type == FunctionType.CONTEXT_UPDATE: - full_context = fc.update_context(self, full_context) - elif fc.function_type == FunctionType.CLASSIC: - if not found_classic_function: - found_classic_function = True - full_context.append(self.transform_function_to_text(template,function_call)) - - if found_classic_function: - full_context.append( - template.system_custom_header("Function Calls")+"\n" + "\n".join([ - "You have access to functions presented to you in the available functions listed above.", - "If you need to call a function, use this exact syntax:", - "```function", - "{", - ' "function_name": "name_of_the_function_to_call",', - ' "function_parameters": {', - ' "parameter1": value1,', - ' "parameter2": value2', - " }", - "}", - "```", - "Important Notes:", - "- **Always** enclose the function call in a `function` markdown code block.", - "- Make sure the content of the function markdown code block is a valid json.", - ]) - ) + if not ignore_function_calls: + for function_call in self.function_calls: + fc:FunctionCall = function_call["class"] + if fc.function_type == FunctionType.CONTEXT_UPDATE: + full_context = fc.update_context(self, full_context) + elif fc.function_type == FunctionType.CLASSIC: + if not found_classic_function: + found_classic_function = True + full_context.append(self.transform_function_to_text(template,function_call)) + full_context = fc.update_context(self, full_context) + + if found_classic_function: + full_context.append( + template.system_custom_header("Function Calls")+"\n" + "\n".join([ + "You have access to functions presented to you in the available functions listed above.", + "If you need to call a function, use this exact syntax:", + "```function", + "{", + ' "function_name": "name_of_the_function_to_call",', + ' "function_parameters": {', + ' "parameter1": value1,', + ' "parameter2": value2', + " }", + "}", + "```", + "Important Notes:", + "- **Always** enclose the function call in a `function` markdown code block.", + "- Make sure the content of the function markdown code block is a valid json.", + ]) + ) append_context("discussion_messages", template.system_custom_header("Discussion")+"\n") # Add custom entries if provided