| |
|
| | 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() |
| |
|