|
|
|
import os |
|
import requests |
|
import gradio as gr |
|
|
|
|
|
|
|
def identify_error_coin(image_path: str) -> dict: |
|
"""Run your error-coin detection model on the uploaded image.""" |
|
|
|
return {"type": "unknown", "date": "unknown", "error": "model not implemented"} |
|
|
|
|
|
def web_search(query: str) -> list: |
|
"""Perform a web search (e.g. via SerpAPI or Bing) and return top results.""" |
|
|
|
return ["Top search result placeholder"] |
|
|
|
|
|
def membership_info(user_id: str) -> dict: |
|
"""Check membership status via your WordPress/S2Member site.""" |
|
|
|
api_url = os.getenv("WP_API_URL") |
|
api_key = os.getenv("WP_API_KEY") |
|
if not user_id or not api_url: |
|
return {"status": "guest", "benefits": [], "upgrade_url": os.getenv("UPGRADE_URL")} |
|
|
|
return {"status": "guest", "benefits": [], "upgrade_url": os.getenv("UPGRADE_URL")} |
|
|
|
|
|
def initiate_membership_signup(user_id: str) -> dict: |
|
"""Return a signup link for new VIP users.""" |
|
return {"success": True, "redirect": os.getenv("UPGRADE_URL")} |
|
|
|
|
|
|
|
from agents import Agent, Tool |
|
|
|
tools = [ |
|
Tool(name="identify_error_coin", func=identify_error_coin, |
|
description="Given a coin image path, returns type, date, error details."), |
|
Tool(name="web_search", func=web_search, |
|
description="Search the web for coin history, values, and news."), |
|
Tool(name="membership_info", func=membership_info, |
|
description="Check user VIP status and benefits."), |
|
Tool(name="initiate_membership_signup", func=initiate_membership_signup, |
|
description="Start the VIP signup process.") |
|
] |
|
|
|
marcus = Agent( |
|
name="Marcus Mint", |
|
instructions=""" |
|
You are Marcus Mint, the coin expert for VIPs on RichOffErrorCoins. |
|
Guests get teaser answers with signup prompts; VIPs get full diagnostics. |
|
Always keep the tone friendly and exciting! |
|
""", |
|
tools=tools |
|
) |
|
|
|
|
|
def chat_fn(user_input, uploaded_file, history, user_id): |
|
info = membership_info(user_id) |
|
is_member = info.get("status") == "member" |
|
|
|
if uploaded_file is not None: |
|
if not is_member: |
|
signup_url = initiate_membership_signup(user_id)["redirect"] |
|
bot_reply = ( |
|
"🔒 Image uploads are VIP-only! " |
|
f"Upgrade here: {signup_url}" |
|
) |
|
else: |
|
|
|
result = marcus.run({"tool": "identify_error_coin", "args": {"image_path": uploaded_file.name}}) |
|
bot_reply = result |
|
else: |
|
bot_reply = marcus.run({"content": user_input}) |
|
if not is_member and "upload" in user_input.lower(): |
|
bot_reply += ( |
|
"\n\n🔒 Want image analysis? That's a VIP perk—ask me how to join!" |
|
) |
|
|
|
history.append((user_input, bot_reply)) |
|
return history, history |
|
|
|
|
|
css = ".gradio-container { max-width: 700px; margin: auto }" |
|
|
|
def main(): |
|
with gr.Blocks(css=css) as demo: |
|
gr.Markdown("## Chat with Marcus Mint (VIP Only)") |
|
user_id = gr.Text(value="", label="Your User ID", placeholder="Use your RichOffErrorCoins ID") |
|
chat = gr.Chatbot() |
|
inp = gr.Textbox(placeholder="Ask Marcus anything…", show_label=False) |
|
uploader = gr.File(label="🖼️ (VIP only) Upload your coin image", file_types=[".jpg", ".png", ".jpeg"]) |
|
send = gr.Button("Send") |
|
|
|
send.click( |
|
chat_fn, |
|
inputs=[inp, uploader, chat, user_id], |
|
outputs=[chat, chat], |
|
queue=True |
|
) |
|
send.click(lambda: "", [], inp) |
|
|
|
demo.launch(server_name="0.0.0.0", server_port=int(os.getenv("PORT", 7860))) |
|
|
|
if __name__ == "__main__": |
|
main() |
|
|