def step(self):
        """
        Perform a single optimization step.
        This method updates the parameters of the optimizer by generating new text using the engine and updating the parameter values accordingly.
        It also logs the optimizer response and the updated text.
        Returns:
            None
        """
        for parameter in self.parameters:
            prompt_update_parameter = self._update_prompt(parameter)
            # Change the below with the guidance function
            @guidance
            def structured_tgd_response(lm, 
                                        tgd_prompt: str=prompt_update_parameter, 
                                        system_prompt: str=self.optimizer_system_prompt,
                                        new_variable_tags: List[str]=self.new_variable_tags, 
                                        max_reasoning_tokens: int=1024, 
                                        max_variable_tokens: int=4096):
                with guidance.system():
                    lm += system_prompt
                with guidance.user():
                    lm += tgd_prompt
                with guidance.assistant():
                    lm += "Reasoning: " + gen(name="reasoning", stop="\n", max_tokens=max_reasoning_tokens) + "\n"
                    lm += new_variable_tags[0] + gen(name="improved_variable", stop=new_variable_tags[1], max_tokens=max_variable_tokens) + new_variable_tags[1]
                return lm
            structured_response = self.engine.generate_structured(structured_tgd_response, tgd_prompt=prompt_update_parameter)
            new_value = structured_response["improved_variable"]
            logger.info(f"GuidedTextualGradientDescent output variables", extra={"optimizer.response": structured_response})
            logger.info(f"GuidedTextualGradientDescent optimizer response", extra={"optimizer.response": new_value})
            parameter.set_value(new_value)
            logger.info(f"GuidedTextualGradientDescent updated text", extra={"parameter.value": parameter.value})
            if self.verbose:
                print("-----------------------GuidedTextualGradientDescent------------------------")
                print(parameter.value)
            
            if self.do_gradient_memory:
                self.update_gradient_memory(parameter)

        Perform a single optimization step.
        This method updates the parameters of the optimizer by generating new text using the engine and updating the parameter values accordingly.
        It also logs the optimizer response and the updated text.
        Returns:
            None
        
textgrad/optimizer/guidance_optimizer.py