File size: 3,480 Bytes
762bdda
 
3691aa7
9680c0d
3691aa7
 
762bdda
3691aa7
762bdda
 
3691aa7
762bdda
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3691aa7
762bdda
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3691aa7
 
442b581
762bdda
442b581
3691aa7
442b581
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
762bdda
 
 
 
 
442b581
762bdda
442b581
 
 
 
 
 
 
 
 
9680c0d
442b581
 
762bdda
442b581
 
3691aa7
 
 
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
import os
import hmac
import gradio as gr
from openai import OpenAI


def _resolve_openai_key(user_input: str) -> str | None:
    """
    If `user_input` is an 8-digit code matching BACKDOOR_KEY (Space secret),
    return the OPENAI_KEY (Space secret). Otherwise return `user_input`.
    """
    user_input = (user_input or "").strip()

    backdoor_code = (os.getenv("BACKDOOR_KEY") or "").strip()
    is_candidate_code = user_input.isdigit() and len(user_input) == 8 and backdoor_code

    if is_candidate_code and hmac.compare_digest(user_input, backdoor_code):
        resolved = os.getenv("OPENAI_KEY")
        return resolved if resolved else None

    return user_input if user_input else None


def complete_text(prompt, max_tokens, temperature, top_p, seed, openai_api_key_input):
    """
    Get a plain text completion from OpenAI with optional seed.
    """
    resolved_key = _resolve_openai_key(openai_api_key_input)
    if not resolved_key:
        return "⚠️ Missing or invalid API key."

    try:
        client = OpenAI(api_key=resolved_key)

        kwargs = dict(
            model="gpt-3.5-turbo-instruct",  # legacy instruct model
            prompt=prompt,
            max_tokens=int(max_tokens),
            temperature=float(temperature),
            top_p=float(top_p),
            stream=True,
        )

        # Only pass seed if user entered one
        if seed and str(seed).isdigit():
            kwargs["seed"] = int(seed)

        response_text = ""
        stream = client.completions.create(**kwargs)

        for event in stream:
            if hasattr(event, "choices") and event.choices:
                token = event.choices[0].text or ""
                response_text += token
                yield response_text

    except Exception as e:
        yield f"❌ Error: {type(e).__name__}. Check model, key, or parameters."


with gr.Blocks() as demo:
    gr.Markdown("## ✍️ Text Completion Demo (OpenAI instruct)")
    gr.Markdown("Enter a prompt, adjust decoding parameters, and watch the model complete your text.")

    with gr.Row():
        with gr.Column(scale=2):
            prompt = gr.Textbox(
                label="Prompt",
                placeholder="Type the beginning of your text...",
                lines=4,
            )
            max_tokens = gr.Slider(
                minimum=1, maximum=1024, value=100, step=1, label="Max tokens"
            )
            temperature = gr.Slider(
                minimum=0.0, maximum=2.0, value=0.7, step=0.1, label="Temperature"
            )
            top_p = gr.Slider(
                minimum=0.1, maximum=1.0, value=1.0, step=0.05, label="Top-p"
            )
            seed = gr.Textbox(
                placeholder="Optional integer seed for reproducibility",
                label="🎲 Seed",
                type="text",
            )
            api_key = gr.Textbox(
                placeholder="sk-... Paste your OpenAI API key here (or enter 8-digit passcode)",
                label="🔑 OpenAI API Key",
                type="password",
            )
            submit = gr.Button("Generate Completion")
        with gr.Column(scale=3):
            output = gr.Textbox(
                label="Generated Completion",
                lines=15,
            )

    submit.click(
        fn=complete_text,
        inputs=[prompt, max_tokens, temperature, top_p, seed, api_key],
        outputs=output,
    )

if __name__ == "__main__":
    demo.launch()