File size: 3,583 Bytes
eb450e3 582395b eb450e3 968b137 eb450e3 3cfecb5 582395b 3cfecb5 582395b fa8b0f1 e86214a 3cfecb5 582395b 3cfecb5 fa8b0f1 e3c453c 3cfecb5 e3c453c 3cfecb5 582395b fa8b0f1 582395b 6e60b60 582395b eb450e3 582395b 09742af 582395b 3cfecb5 582395b 3cfecb5 582395b eb450e3 582395b |
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 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 |
import gradio as gr
from huggingface_hub import InferenceClient
import time
client = InferenceClient("lambdaindie/lambdai")
css = """
body {
background-color: #000000;
color: #e0e0e0;
font-family: 'JetBrains Mono', monospace;
}
.gr-button {
background: linear-gradient(to right, #2a2a2a, #1f1f1f);
color: white;
border-radius: 10px;
padding: 8px 16px;
font-weight: bold;
font-family: 'JetBrains Mono', monospace;
}
.gr-button:hover {
background: #333;
}
.gr-textbox textarea {
background-color: #181818 !important;
color: #fff !important;
font-family: 'JetBrains Mono', monospace;
border-radius: 8px;
}
.gr-chat-message {
font-family: 'JetBrains Mono', monospace;
}
.markdown-think {
background-color: #000000;
border-left: 4px solid #555;
padding: 10px;
margin-bottom: 8px;
font-style: italic;
white-space: pre-wrap;
font-family: 'JetBrains Mono', monospace;
display: flex;
align-items: center;
gap: 10px;
animation: pulse 1.5s infinite ease-in-out;
}
.loader {
width: 14px;
height: 14px;
border: 2px solid #888;
border-top: 2px solid #e0e0e0;
border-radius: 50%;
animation: spin 1s linear infinite;
}
@keyframes spin {
to { transform: rotate(360deg); }
}
@keyframes pulse {
0% { opacity: 0.6; }
50% { opacity: 1.0; }
100% { opacity: 0.6; }
}
"""
def respond(message, history, system_message, max_tokens, temperature, top_p):
messages = [{"role": "system", "content": system_message}] if system_message else []
for user, assistant in history:
if user:
messages.append({"role": "user", "content": user})
if assistant:
messages.append({"role": "assistant", "content": assistant})
thinking_prompt = messages + [
{
"role": "user",
"content": f"{message}\n\nThink step-by-step before answering."
}
]
reasoning = ""
yield '<div class="markdown-think"><div class="loader"></div>Thinking...</div>'
for chunk in client.chat_completion(
thinking_prompt,
max_tokens=max_tokens,
stream=True,
temperature=temperature,
top_p=top_p,
):
token = chunk.choices[0].delta.content or ""
reasoning += token
styled_thought = f'<div class="markdown-think"><div class="loader"></div>{reasoning.strip()}</div>'
yield styled_thought
time.sleep(0.5)
final_prompt = messages + [
{"role": "user", "content": message},
{"role": "assistant", "content": reasoning.strip()},
{"role": "user", "content": "Now answer based on your reasoning above."}
]
final_answer = ""
for chunk in client.chat_completion(
final_prompt,
max_tokens=max_tokens,
stream=True,
temperature=temperature,
top_p=top_p,
):
token = chunk.choices[0].delta.content or ""
final_answer += token
yield final_answer.strip()
demo = gr.ChatInterface(
fn=respond,
title="λambdAI",
theme=gr.themes.Base(primary_hue="gray"),
css=css,
additional_inputs=[
gr.Textbox(
value="You are a concise, logical AI that explains its reasoning clearly before answering.",
label="System Message"
),
gr.Slider(64, 2048, value=512, step=1, label="Max Tokens"),
gr.Slider(0.1, 2.0, value=0.7, step=0.1, label="Temperature"),
gr.Slider(0.1, 1.0, value=0.95, step=0.05, label="Top-p")
]
)
if __name__ == "__main__":
demo.launch() |