SmartAutoDoc / app.py
Oktay
initial commit
f3ebe58 verified
import gradio as gr
import os
from dotenv import load_dotenv
from textwrap import dedent
from agno.agent import Agent
from agno.team.team import Team
from agno.media import Image
from agno.models.anthropic import Claude
from agno.tools.googlesearch import GoogleSearchTools
# Load API key
load_dotenv()
ANTHROPIC_API_KEY = os.getenv("ANTHROPIC_API_KEY")
if not ANTHROPIC_API_KEY:
raise ValueError("ANTHROPIC_API_KEY not found in .env file.")
# Define Agents
image_agent = Agent(
name="Image Analyzer",
role="Analyze uploaded car issue images to extract any visible mechanical problems or symptoms.",
model=Claude(id="claude-3-5-sonnet-20240620", api_key=ANTHROPIC_API_KEY)
)
info_agent = Agent(
name="Info Gatherer",
role="Use online search to collect information about known issues for the given car brand, model, and year.",
model=Claude(id="claude-3-haiku-20240307", api_key=ANTHROPIC_API_KEY),
tools=[GoogleSearchTools()],
show_tool_calls=False
)
agent_team = Team(
name="Smart Repair Team",
mode="coordinate",
model=Claude(id="claude-3-haiku-20240307", api_key=ANTHROPIC_API_KEY),
members=[image_agent, info_agent],
description="You are a task router that routes tasks to a team of agents to help users diagnose and fix car issues.",
instructions=dedent("""\
- First, use the uploaded image to detect possible issues visually.
- Then, use search tools to gather brand/model-specific info if available from the image extracted information.
- Give the user a helpful, step-by-step repair guide.
- Explain steps clearly for non-experts.
- Mention safety precautions and signs when to visit a professional.
"""),
expected_output=dedent("""\
Final response should be structured with these sections:
- Diagnosis Summary
- Step-by-Step Repair Instructions
"""),
success_criteria="The user receives a clear, accurate step-by-step guide for handling the car issue.",
add_datetime_to_instructions=True,
show_tool_calls=False,
enable_agentic_context=True,
show_members_responses=False,
markdown=True
)
# Main chat function
def diagnose_chat(image_pil, brand, model, year):
if image_pil is None:
return "Please upload an image of the car issue to proceed."
os.makedirs("temp_images", exist_ok=True)
temp_path = os.path.join("temp_images", "temp_car_issue.jpg")
image_pil.save(temp_path)
image_media = Image(filepath=temp_path)
# Construct message
extra_info = []
if brand:
extra_info.append(f"Brand: {brand}")
if model:
extra_info.append(f"Model: {model}")
if year:
extra_info.append(f"Year: {year}")
info_text = "\n".join(extra_info)
message = "Diagnose the car issue based on the uploaded image."
if info_text:
message += f"\n\nAdditional details:\n{info_text}"
response = agent_team.run(message=message, images=[image_media])
return response.content
# Gradio UI setup
with gr.Blocks() as demo:
gr.Markdown("# 🔧 SmartCarDoc\nUpload a car issue image to quickly get a repair plan.")
with gr.Row():
with gr.Column():
image_input = gr.Image(type="pil", label="Upload Image of Car Issue")
brand_input = gr.Textbox(label="Car Brand (optional)")
model_input = gr.Textbox(label="Car Model (optional)")
year_input = gr.Textbox(label="Year (optional)")
submit_button = gr.Button("Diagnose")
with gr.Column():
response_text = gr.Textbox(label="Repair Plan", lines=30, interactive=False)
submit_button.click(
fn=diagnose_chat,
inputs=[image_input, brand_input, model_input, year_input],
outputs=response_text
)
if __name__ == "__main__":
demo.launch()