File size: 3,797 Bytes
adbef5d
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
import gradio as gr
from dataclasses import asdict
from transformers import Tool, ReactCodeAgent  # type: ignore
from transformers.agents import stream_to_gradio, HfApiEngine  # type: ignore
from gradio_tools import GradioTool  # assuming you have gradio_tool installed

class GenerateQuestionsTool(GradioTool):
    """
    A tool to generate general questions for deployment/integration gaps.
    The tool calls the execute_prompt method using the "generate_general_questions" prompt.
    Input: (optional) project detail as a string.
    Output: Generated questions as a string.
    """
    def __init__(
        self,
        name="GenerateQuestions",
        description=(
            "A tool that generates general deployment/integration questions "
            "by executing a prompt with project details. "
            "Input: a string with project detail (optional). Output: a string with generated questions."
        )    ):
        super().__init__(name, description)
        # Optionally, you could initialize any state or dependencies here

    def create_job(self, query: str):
        """
        This method interprets the input query.
        In our case, if a query is provided, we use it as project_detail;
        otherwise, we rely on the internal method get_project_detail().
        """
        # Assuming your tool's class (or the project instance) has these methods.
        project_detail = query if query.strip() else self.get_project_detail()
        try:
            # Execute the prompt with provided project detail.
            result = self.execute_prompt("generate_general_questions", {"project_detail": project_detail})
        except Exception as e:
            result = f"Error during prompt execution: {str(e)}"
        return result

    def postprocess(self, output) -> str:
        """
        Process the output from the job to a string that can be returned to the LLM.
        """
        return str(output)

    def _block_input(self, gr):
        """
        Define the Gradio input component.
        Here, we use a textbox where the user can optionally provide project details.
        """
        return gr.Textbox(label="Project Detail (optional)", placeholder="Enter project detail or leave empty to use default")

    def _block_output(self, gr):
        """
        Define the Gradio output component.
        We return the generated questions in a textbox.
        """
        return gr.Textbox(label="Generated Questions")

# Import tool from Hub
image_generation_tool = Tool.from_space(  # type: ignore
    space_id="black-forest-labs/FLUX.1-schnell",
    name="image_generator",
    description="Generates an image following your prompt. Returns a PIL Image.",
    api_name="/infer",
)

# testing_tool = GenerateQuestionsTool()

# question_generator = Tool.from_gradio(testing_tool)

llm_engine = HfApiEngine("Qwen/Qwen2.5-Coder-32B-Instruct")
# Initialize the agent with both tools and engine
agent = ReactCodeAgent(tools=[image_generation_tool], llm_engine=llm_engine)


def interact_with_agent(prompt, history):
    messages = []
    yield messages
    for msg in stream_to_gradio(agent, prompt):
        messages.append(asdict(msg))  # type: ignore
        yield messages
    yield messages


demo = gr.ChatInterface(
    interact_with_agent,
    chatbot= gr.Chatbot(
        height= 650,
        label="Agent",
        type="messages",
        avatar_images=(
            None,
            "https://em-content.zobj.net/source/twitter/53/robot-face_1f916.png",
        ),
    ),
    examples=[
        ["Generate an image of an astronaut riding an alligator"],
        ["I am writing a children's book for my daughter. Can you help me with some illustrations?"],
    ],
    type="messages",
)

if __name__ == "__main__":
    demo.launch()