Spaces:
Running
Running
File size: 4,076 Bytes
5ea2a69 76b8fa2 fecada4 5ea2a69 e73d501 5ea2a69 fecada4 5ea2a69 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 |
import os
import gradio as gr
from transformers import ReactCodeAgent, HfEngine, Tool
from gradio_agentchatbot import (
AgentChatbot,
stream_from_transformers_agent,
ChatMessage,
)
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_TOKEN"))
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 = AgentChatbot(label="Agent")
submit.click(interact_with_agent, [text_input], [chatbot])
if __name__ == "__main__":
demo.launch() |