File size: 2,783 Bytes
21dcf96
0d93ed3
 
9c87a30
 
0d93ed3
 
 
9c87a30
 
0d93ed3
 
 
9c87a30
0d93ed3
 
 
 
9c87a30
0d93ed3
 
 
 
 
 
9c87a30
0d93ed3
 
 
9c87a30
 
0d93ed3
 
 
 
 
9c87a30
0d93ed3
 
 
 
 
9c87a30
0d93ed3
9c87a30
0d93ed3
 
9c87a30
0d93ed3
 
 
 
 
 
 
 
21dcf96
0d93ed3
21dcf96
0d93ed3
21dcf96
0d93ed3
 
 
 
21dcf96
0d93ed3
 
21dcf96
 
 
 
0d93ed3
 
 
 
 
 
 
 
 
 
21dcf96
9c87a30
0d93ed3
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
import gradio as gr
import requests
import json


def _normalize_endpoint(endpoint: str) -> str:
    endpoint = (endpoint or "").strip()
    return endpoint[:-1] if endpoint.endswith("/") else endpoint


def _azure_chat_completions(endpoint, api_key, model, messages, temperature=0.7, max_tokens=600, timeout=60):
    endpoint = _normalize_endpoint(endpoint)
    url = f"{endpoint}/openai/v1/chat/completions"

    headers = {
        "Content-Type": "application/json",
        "api-key": api_key.strip(),
    }

    payload = {
        "model": model.strip(),
        "messages": messages,
        "temperature": float(temperature),
        "max_tokens": int(max_tokens),
    }

    r = requests.post(url, headers=headers, json=payload, timeout=timeout)
    r.raise_for_status()
    return r.json()


def handle_message(message, history, endpoint, api_key, model, system_prompt, temperature, max_tokens):
    # history is list of [user, assistant] pairs
    messages = []
    if system_prompt and system_prompt.strip():
        messages.append({"role": "system", "content": system_prompt.strip()})

    for u, a in history:
        if u:
            messages.append({"role": "user", "content": u})
        if a:
            messages.append({"role": "assistant", "content": a})

    messages.append({"role": "user", "content": message})

    if not endpoint or not api_key or not model:
        return "Please provide Endpoint, API Key, and Model."

    try:
        data = _azure_chat_completions(
            endpoint=endpoint,
            api_key=api_key,
            model=model,
            messages=messages,
            temperature=temperature,
            max_tokens=max_tokens,
        )
        return data["choices"][0]["message"]["content"]

    except requests.HTTPError as e:
        try:
            err_json = e.response.json()
            return f"HTTP {e.response.status_code}: {json.dumps(err_json, indent=2)}"
        except Exception:
            return f"HTTP error: {str(e)}"

    except Exception as e:
        return f"Error: {str(e)}"


demo = gr.ChatInterface(
    fn=handle_message,
    additional_inputs=[
        gr.Textbox(label="Azure OpenAI Endpoint", placeholder="https://ai-hubXXXX.openai.azure.com"),
        gr.Textbox(label="API Key", placeholder="paste your key here", type="password"),
        gr.Textbox(label="Model (or deployment name)", placeholder="e.g., gpt-4o-mini"),
        gr.Textbox(label="System prompt (optional)", value="You are a helpful assistant."),
        gr.Slider(0.0, 1.5, value=0.7, step=0.1, label="Temperature"),
        gr.Slider(50, 2000, value=600, step=50, label="Max tokens"),
    ],
    title="Azure OpenAI Chat Completion",
    description="Enter your Azure OpenAI endpoint + key, then chat.",
)

demo.launch()