File size: 3,736 Bytes
707ec96
289e125
 
 
 
 
 
 
 
 
 
 
707ec96
 
289e125
707ec96
 
 
 
ae68c70
707ec96
 
ae68c70
289e125
 
 
f95f6a4
289e125
c0705f0
 
707ec96
c0705f0
 
 
 
 
 
 
f95f6a4
c0705f0
 
 
 
 
f95f6a4
289e125
f95f6a4
289e125
 
 
 
f95f6a4
ae68c70
94b323b
9142873
707ec96
 
 
 
 
 
289e125
f5dcbeb
707ec96
 
94b323b
 
707ec96
f95f6a4
 
060bc2f
 
289e125
060bc2f
 
289e125
 
 
f95f6a4
707ec96
 
f95f6a4
707ec96
f95f6a4
707ec96
 
f95f6a4
 
 
 
 
 
707ec96
f95f6a4
707ec96
 
 
 
6f06d33
707ec96
 
 
289e125
 
 
 
707ec96
 
 
 
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
# app.py
import os
from fastapi import FastAPI
from dotenv import load_dotenv
from huggingface_hub.inference._mcp.agent import Agent
import gradio as gr
import uvicorn
from fastapi.responses import RedirectResponse
from fastapi.middleware.cors import CORSMiddleware
from typing import Optional, Literal

load_dotenv()
HF_TOKEN = os.getenv("HF_TOKEN")
HF_MODEL = os.getenv("HF_MODEL", "google/gemma-2-2b")

app = FastAPI(title="Model Card Chatbot")
app.add_middleware(
    CORSMiddleware, allow_origins=["*"], allow_methods=["*"], allow_headers=["*"]
)

agent_instance: Optional[Agent] = None
DEFAULT_PROVIDER: Literal['hf-inference'] = "hf-inference"

async def get_agent():
    global agent_instance
    if agent_instance is None and HF_TOKEN:
        print("🔧 Creating Agent...")
        try:
            agent = Agent(
                model=HF_MODEL,
                provider=DEFAULT_PROVIDER,
                api_key=HF_TOKEN,
                servers=[{
                    "type": "stdio",
                    "config": {
                        "command": "python",
                        "args": ["mcp_server.py"],
                        "cwd": ".",
                        "env": {"HF_TOKEN": HF_TOKEN}
                    }
                }]
            )
            await agent.load_tools()
            agent_instance = agent
            print("✅ Agent is ready!")
        except Exception as e:
            print(f"❌ Failed to create agent: {str(e)}")
    return agent_instance

@app.on_event("startup")
async def startup_event():
    await get_agent()

def chat_function(user_message, history, model_id):
    global agent_instance
    prompt = f"""
You're an assistant helping with Hugging Face model cards.
First, run the tool `read_model_card` on repo_id `{model_id}` to get the model card.
Then answer this user question based on the model card:
User question: {user_message}
"""
    try:
        response = ""
        outputs = agent_instance.run(prompt)
        for output in outputs:
            if hasattr(output, "content") and output.content:
                response = output.content
        if not response:
            response = "⚠️ Sorry, no answer generated."
        # Append as new OpenAI-style message
        history = history + [{"role": "user", "content": user_message}]
        history.append({"role": "assistant", "content": response})
    except Exception as e:
        history = history + [{"role": "user", "content": user_message}]
        history.append({"role": "assistant", "content": f"⚠️ Error: {str(e)}"})
    return history, ""

def create_gradio_app():
    with gr.Blocks(theme=gr.themes.Soft(primary_hue="indigo"), title="🤖 Model Card Chatbot") as demo:
        gr.Markdown("""
        # 🤖 **Model Card Chatbot**
        _Ask anything about a Hugging Face model's card_
        """)
        chatbot = gr.Chatbot(label="Chat", type="messages", show_copy_button=True, height=400)
        with gr.Row():
            model_id = gr.Textbox(label="Model ID", value="google/gemma-2-2b", scale=2)
            user_input = gr.Textbox(
                label="Your Question", 
                placeholder="e.g., What dataset was it trained on?", 
                scale=4
            )
            ask_button = gr.Button("🔍 Ask", scale=1)
        
        ask_button.click(
            fn=chat_function,
            inputs=[user_input, chatbot, model_id],
            outputs=[chatbot, user_input]
        )
    return demo

gradio_app = create_gradio_app()
app = gr.mount_gradio_app(app, gradio_app, path="/")

@app.get("/")
async def root():
    return RedirectResponse("/")

if __name__ == "__main__":
    uvicorn.run("app:app", host="0.0.0.0", port=7860, reload=True)