Spaces:
Runtime error
Runtime error
| import os | |
| import gradio as gr | |
| from transformers import ReactCodeAgent, HfEngine, Tool | |
| from gradio import ChatMessage | |
| from gradio.utils import stream_from_transformers_agent | |
| from dotenv import load_dotenv | |
| from huggingface_hub import login | |
| from transformers.agents.default_tools import ( | |
| BASE_PYTHON_TOOLS, | |
| LIST_SAFE_MODULES, | |
| evaluate_python_code, | |
| ) | |
| # to load SerpAPI key | |
| load_dotenv() | |
| login(os.getenv("HUGGINGFACEHUB_API_KEY")) | |
| llm_engine = HfEngine(model="meta-llama/Meta-Llama-3-70B-Instruct") | |
| authorized_imports = ["numpy"] | |
| agent = ReactCodeAgent( | |
| llm_engine=llm_engine, | |
| tools=[], | |
| additional_authorized_imports=authorized_imports, | |
| max_iterations=10, | |
| ) | |
| class FinalAnswerToolWithVerification(Tool): | |
| name = "final_answer" | |
| description = "Provides a final answer to the given problem" | |
| inputs = { | |
| "answer": {"type": "text", "description": "The final answer to the problem"} | |
| } | |
| output_type = "any" | |
| def forward(self, answer): | |
| if "def test" not in answer: | |
| raise Exception( | |
| "I can only accept from you a code snippet answer that defines test functions in python, anything else will not work. PLEASE PROVIDE ME A FULL CODE SNIPPET CONTAINING THE DEFINITION OF THE TESTS." | |
| ) | |
| return answer | |
| final_answer_tool = FinalAnswerToolWithVerification() | |
| agent._toolbox.update_tool(final_answer_tool) | |
| function = """import numpy as np | |
| def moving_average(x, w): | |
| return np.convolve(x, np.ones(w), 'valid') / w""" | |
| task = """I will give you a basic function that I've created. | |
| Now I want you to generate a set of unit tests for these functions, check that they run, and give them to me. | |
| Please follow these steps in order: | |
| 1. Define and run the function given o you, so that it gets defined in your interpreter. | |
| 2. Generate one test function as a python blob, with assert statements | |
| 3. Run the test function in a code snippet and make sure the tests pass | |
| 4. Return to me the complete TEST function (not the original function) as a string code snippet. | |
| --- | |
| Example: | |
| Here is your function: | |
| ```py | |
| def get_even_numbers(numbers): | |
| even_numbers = [] | |
| for number in numbers: | |
| if number % 2 == 0: | |
| even_numbers.append(number) | |
| return even_numbers | |
| ``` | |
| Now generate test functions for me! | |
| Thought: Let's re-define the given function and generate a test. | |
| Code: | |
| ```py | |
| def get_even_numbers(numbers): | |
| even_numbers = [] | |
| for number in numbers: | |
| if number % 2 == 0: | |
| even_numbers.append(number) | |
| return even_numbers | |
| def test_get_even_numbers(): | |
| assert get_even_numbers([1, 2, 3, 4, 5]) == [2, 4] | |
| print("No error found!") | |
| test_get_even_numbers() | |
| ``` | |
| Observation: "No error found!" | |
| Thought: the interpreter ran tests with no error. So we can return the function IN A TEXT SNIPPET. | |
| Code: | |
| ```py | |
| fianl_answer_snippet = \"\"\" | |
| def test_get_even_numbers(): | |
| assert get_even_numbers([1, 2, 3, 4, 5]) == [2, 4] | |
| print("No error found!") | |
| \"\"\" | |
| final_answer(final_answer_snippet) | |
| ``` | |
| --- | |
| Now proceed! | |
| Here is your function: | |
| ```py | |
| <<function>> | |
| ``` | |
| Now generate test functions for me! | |
| """ | |
| def interact_with_agent(prompt): | |
| full_prompt = task.replace("<<function>>", prompt) | |
| messages = [] | |
| messages.append(ChatMessage(role="user", content=full_prompt)) | |
| yield messages | |
| for msg in stream_from_transformers_agent(agent, full_prompt): | |
| messages.append(msg) | |
| yield messages | |
| yield messages | |
| with gr.Blocks(theme="soft") as demo: | |
| gr.Markdown("""### Python test generator | |
| Write your function in the left textbox, and the agent on the right will generate tests for you!""") | |
| with gr.Row(): | |
| with gr.Column(): | |
| text_input = gr.Textbox( | |
| lines=1, label="Your function to test", value=function | |
| ) | |
| submit = gr.Button("Generate tests!") | |
| with gr.Column(): | |
| chatbot = gr.Chatbot(label="Agent") | |
| submit.click(interact_with_agent, [text_input], [chatbot]) | |
| if __name__ == "__main__": | |
| demo.launch() |