QuotationChatbot_v5 / archive /agent_chat_example.py
jess
add: dynamic thoughts
adbef5d
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()