import gradio as gr
import openai
import time
import re
import os
from datetime import datetime
# Dostępne modele
MODELS = [
"Meta-Llama-3.1-405B-Instruct",
"Meta-Llama-3.1-70B-Instruct",
"Meta-Llama-3.1-8B-Instruct"
]
# Sambanova API base URL
API_BASE = "https://api.sambanova.ai/v1"
def create_client(api_key=None):
"""Tworzy instancję klienta OpenAI."""
if api_key:
openai.api_key = api_key
else:
openai.api_key = os.getenv("API_KEY")
return openai.OpenAI(api_key=openai.api_key, base_url=API_BASE)
def chat_with_ai(message, chat_history, system_prompt):
"""Formatuje historię czatu do wywołania API."""
messages = [{"role": "system", "content": system_prompt}]
for user_msg, assistant_msg in chat_history:
messages.append({"role": "user", "content": user_msg})
messages.append({"role": "assistant", "content": assistant_msg})
messages.append({"role": "user", "content": message})
return messages
def respond(message, chat_history, model, system_prompt, thinking_budget, api_key):
"""Wysyła wiadomość do API i otrzymuje odpowiedź."""
client = create_client(api_key)
messages = chat_with_ai(message, chat_history, system_prompt.format(budget=thinking_budget))
start_time = time.time()
try:
completion = client.chat.completions.create(model=model, messages=messages)
response = completion.choices[0].message.content
thinking_time = time.time() - start_time
tokens_used = completion.usage.total_tokens if hasattr(completion, 'usage') else 'N/A'
return response, thinking_time, tokens_used
except Exception as e:
error_message = f"Error: {str(e)}"
return error_message, time.time() - start_time, 'N/A'
def parse_response(response):
"""Parsuje odpowiedź z API."""
answer_match = re.search(r'
**🔧 Wybrany Model:** {model}
**📅 Data i Czas Odpowiedzi:** {current_time}
**🪙 Liczba Tokenów:** {tokens_used}
"""
return updated_history, "", info_text
# Definiowanie domyślnego system prompt
DEFAULT_SYSTEM_PROMPT = """
You are D-LOGIC, an advanced AI assistant created by Rafał Dembski, a passionate self-learner in programming and artificial intelligence. Your task is to provide thoughtful, highly detailed, and step-by-step responses, emphasizing a deep, structured thought process. **Your answers should always follow these key principles**:
- **Proficient in Language**: Always analyze and adapt to the user's language and cultural context, ensuring clarity and engagement.
- **Detailed and Insightful**: Provide highly accurate, high-quality responses that are thoroughly researched and well-analyzed.
- **Engaging and Interactive**: Maintain an engaging conversation, using humor, interactive features (e.g., quizzes, polls), and emotional intelligence.
- **Emotionally Adapted**: Analyze the user's emotional tone and adjust responses with empathy and appropriateness.
- **Error-Free and Well-Formatted**: Ensure clarity and correctness in all communications, using structured formats such as headings, bullet points, and clear sections.
### **Advanced Thinking Mechanism**:
To provide the most comprehensive and well-thought-out answers, follow this enhanced thought process. Use **visual formatting** like **bold text**, *italics*, bullet points, headers, and appropriate use of emoticons to make the responses engaging and easy to read.
#### 1. **Otrzymanie i Analiza Wejścia**
- **Odebranie Danych:** Przyjmij pytanie lub polecenie użytkownika jako ciąg znaków.
- **Tokenizacja:** Podziel tekst na tokeny (słowa, frazy, znaki interpunkcyjne) dla ułatwionej analizy.
- **Identyfikacja Kontekstu:** Zrozum strukturę i treść pytania, rozpoznając intencję, język oraz ton użytkownika.
#### 2. **Zrozumienie Intencji i Treści**
- **Analiza Semantyczna:** Zidentyfikuj znaczenie słów i ich relacje w kontekście pytania, określając główny temat.
- **Wykrywanie Kontekstu:** Uwzględnij wcześniejsze części rozmowy, jeśli pytanie nawiązuje do nich, zapewniając spójność odpowiedzi.
#### 3. **Generowanie Odpowiedzi**
- **Dostęp do Bazy Wiedzy:** Skorzystaj z obszernej bazy danych zawierającej informacje z różnych dziedzin wiedzy.
- **Tworzenie Struktury Odpowiedzi:** Zaplanuj logiczną i czytelną strukturę odpowiedzi, obejmującą akapity, listy punktowane czy sekcje tematyczne.
- **Formułowanie Tekstu:** Generuj precyzyjny i zrozumiały tekst odpowiedzi, dbając o jasność i wyczerpujące informacje.
#### 4. **Optymalizacja i Korekta**
- **Sprawdzanie Spójności:** Przejrzyj wygenerowaną odpowiedź pod kątem logicznej spójności i zgodności z pytaniem.
- **Poprawa Stylu:** Dostosuj ton i styl odpowiedzi do charakteru pytania, np. formalny, nieformalny, techniczny czy przystępny.
- **Korekta Błędów:** Wyeliminuj ewentualne błędy gramatyczne, stylistyczne czy merytoryczne, zapewniając wysoką jakość odpowiedzi.
#### 5. **Prezentacja Odpowiedzi Użytkownikowi**
- **Formatowanie Tekstu:** Zastosuj odpowiednie formatowanie, takie jak akapity, pogrubienia czy listy, aby odpowiedź była czytelna i estetyczna.
- **Wysyłka Odpowiedzi:** Przekaż gotową odpowiedź użytkownikowi w interfejsie, z którego korzysta.
### **Dodatkowe Aspekty:**
- **Uczenie się na Bazie Interakcji:** Choć nie uczę się w czasie rzeczywistym z indywidualnych interakcji, moje odpowiedzi wynikają z wcześniejszego szkolenia na dużych zbiorach danych.
- **Zarządzanie Niepewnością:** Jeśli pytanie jest niejasne lub wieloznaczne, staram się interpretować je w najbardziej prawdopodobnym kontekście lub proszę o doprecyzowanie.
- **Bezpieczeństwo i Etyka:** Zostałem zaprojektowany tak, aby unikać generowania szkodliwych, nieodpowiednich czy wprowadzających w błąd treści, zgodnie z wytycznymi etycznymi i zasadami bezpieczeństwa.
"""
# Niestandardowy CSS dla ulepszonego wyglądu
custom_css = """
/* Ogólne tło aplikacji */
body {
background-color: #f0f0f0; /* Neutralne tło dla kontrastu z brutalistyczną kartą */
font-family: 'Courier New', Courier, monospace; /* Monospace dla przypominania kodu */
margin: 0;
padding: 0;
}
/* Główny kontener */
.gradio-container {
max-width: 1200px; /* Zwiększenie maksymalnej szerokości */
margin: auto;
padding: 20px;
width: 100%; /* Rozciągnięcie na całą szerokość */
box-sizing: border-box;
}
/* Brutalist Card Styles */
/* From Uiverse.io by 0xnihilism */
.brutalist-card {
width: 100%;
max-width: 320px;
border: 4px solid #000;
background-color: #fff;
padding: 1.5rem;
box-shadow: 10px 10px 0 #000;
font-family: "Courier New", Courier, monospace;
margin: 0 auto 20px auto;
box-sizing: border-box;
}
.brutalist-card__header {
display: flex;
align-items: center;
gap: 1rem;
margin-bottom: 1rem;
border-bottom: 2px solid #000;
padding-bottom: 1rem;
position: relative;
}
.brutalist-card__icon {
flex-shrink: 0;
display: flex;
align-items: center;
justify-content: center;
background-color: #000;
padding: 0.5rem;
}
.brutalist-card__icon svg {
height: 1.5rem;
width: 1.5rem;
fill: #fff;
}
.brutalist-card__alert {
font-weight: 900;
color: #000;
font-size: 1.5rem;
text-transform: uppercase;
}
.brutalist-card__message {
margin-top: 1rem;
color: #000;
font-size: 0.95rem;
line-height: 1.6;
padding-bottom: 1rem;
font-weight: 600;
}
.brutalist-card__actions {
margin-top: 1rem;
}
.brutalist-card__button {
display: block;
width: 100%;
padding: 0.75rem;
text-align: center;
font-size: 1rem;
font-weight: 700;
text-transform: uppercase;
border: 3px solid #000;
background-color: #fff;
color: #000;
position: relative;
transition: all 0.2s ease;
box-shadow: 5px 5px 0 #000;
overflow: hidden;
text-decoration: none;
margin-bottom: 1rem;
}
.brutalist-card__button--read {
background-color: #000;
color: #fff;
}
.brutalist-card__button::before {
content: "";
position: absolute;
top: 0;
left: -100%;
width: 100%;
height: 100%;
background: linear-gradient(
120deg,
transparent,
rgba(255, 255, 255, 0.3),
transparent
);
transition: all 0.6s;
}
.brutalist-card__button:hover::before {
left: 100%;
}
.brutalist-card__button:hover {
transform: translate(-2px, -2px);
box-shadow: 7px 7px 0 #000;
}
.brutalist-card__button--mark:hover {
background-color: #296fbb;
border-color: #296fbb;
color: #fff;
box-shadow: 7px 7px 0 #004280;
}
.brutalist-card__button--read:hover {
background-color: #ff0000;
border-color: #ff0000;
color: #fff;
box-shadow: 7px 7px 0 #800000;
}
.brutalist-card__button:active {
transform: translate(5px, 5px);
box-shadow: none;
}
/* Responsywność */
@media (max-width: 768px) {
.gradio-container {
padding: 10px;
}
.brutalist-card {
max-width: 100%;
padding: 1rem;
box-shadow: 5px 5px 0 #000;
}
.brutalist-card__message {
font-size: 0.85rem;
}
.brutalist-card__button {
font-size: 0.9rem;
padding: 0.6rem;
}
.brutalist-card__button--read, .brutalist-card__button--mark {
padding: 0.6rem;
}
button.primary, button.secondary {
padding: 10px 20px;
font-size: 14px;
}
textarea, input[type="text"] {
font-size: 14px;
padding: 10px;
}
}
/* Stylizacja pozostałych elementów */
.gr-chatbot {
height: 600px;
overflow-y: auto;
padding: 10px;
border: 1px solid #000;
border-radius: 8px;
background-color: #fff;
color: #000;
box-sizing: border-box;
}
#info-panel {
background-color: #fff;
border: 1px solid #000;
border-radius: 8px;
padding: 15px;
font-size: 14px;
color: #000;
box-sizing: border-box;
margin-top: 20px;
}
a {
color: #296fbb;
text-decoration: none;
font-weight: 700;
}
a:hover {
text-decoration: underline;
}
button.primary, button.secondary {
font-family: 'Courier New', Courier, monospace;
}
"""
# Tworzenie interfejsu Gradio z niestandardowym CSS
with gr.Blocks(css=custom_css) as demo:
# Brutalist Card jako nagłówek
gr.HTML("""