File size: 3,945 Bytes
66ed5f7
 
 
c7db250
 
66ed5f7
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
c7db250
66ed5f7
 
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

import os
import requests
import gradio as gr

# --- Tool implementations (stubs or real) ---

def identify_error_coin(image_path: str) -> dict:
    """Run your error-coin detection model on the uploaded image."""
    # TODO: load your trained model and run inference here
    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."""
    # TODO: integrate your search wrapper here
    return ["Top search result placeholder"]


def membership_info(user_id: str) -> dict:
    """Check membership status via your WordPress/S2Member site."""
    # Example: call WP REST API to get user meta
    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")}
    # TODO: replace with real WP API call
    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")}


# --- Agent setup ---
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
)

# --- Chat function ---
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:
            # run identify via tool
            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

# --- Gradio UI ---
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()