m-ric's picture
m-ric HF staff
Update app.py
76b8fa2 verified
raw
history blame
4.05 kB
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()