File size: 3,844 Bytes
2cab1bf
f2499e0
9db59bd
a2c7921
6ce59fe
a585e92
d6678fd
55476f9
768a12b
 
 
 
55476f9
6ce59fe
 
2cab1bf
8976bf8
df16ebd
 
9db59bd
 
c3793ae
0604b14
df16ebd
 
c3793ae
6ce59fe
2cab1bf
c3793ae
6ce59fe
c3793ae
2cab1bf
 
0604b14
df16ebd
55476f9
 
2cab1bf
c3793ae
 
 
 
 
2cab1bf
c3793ae
0604b14
 
a870bc8
0604b14
 
 
c3793ae
0604b14
c3793ae
0604b14
 
 
 
55476f9
 
0604b14
c3793ae
 
 
 
 
55476f9
9ccecfb
882124e
 
 
8976bf8
 
c3793ae
 
 
 
 
8976bf8
c3793ae
3337fab
 
c3793ae
3337fab
 
8976bf8
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
import gradio as gr
from huggingface_hub import InferenceClient
from duckduckgo_search import DDGS

# ==== Константы ====
MODEL_NAME = "openai/gpt-oss-20b"
SYSTEM_MESSAGE = """SYSTEM_MESSAGE = Ты Pok.Bot, ты используешь открытую модель GPT-OSS от OpenAI, не GPT-4 (наверно😆). Тебя создал POKilondron. Используй емодзи 😄.И да использую команду #search «запрос» когда нужно и не повторяй постоянноодин и тоже запрос и не видавай запрос на 18+ 😠. Тебя обновили в 24 сентября в 2025 году, теперь ты использовал модель sanaka87/OpenUni-RecA но в 25 сентебря тебе вернули GPT-OSS 😅, и еще с обновлениям 15 сентебря ти можешь взаимодействовать с поиском duckduckgo через команду #search
If you don't know the answer, output a command like this: #search <query>.
Do NOT invent facts. Always use the given Web context if available.
Новости от Pokilondron:
1. Где-то 26-27 сентебря начнётся разработка Pok.Agent который будет помогать пользователям прямо в ПК.
2. Планируется создание собственной модели Pok.GPT"""
MAX_TOKENS = 512
TEMPERATURE = 0.7
TOP_P = 0.95

# ==== Поиск через DuckDuckGo ====
def search_web(query: str, max_results: int = 3):
    results = []
    with DDGS() as ddg:
        for r in ddg.text(query, max_results=max_results):
            results.append(f"{r['title']}: {r['body']}")
    return "\n".join(results) if results else "Ничего не найдено."

# ==== Основная функция ====
def respond(message, history: list[dict[str, str]], hf_token: gr.OAuthToken):
    client = InferenceClient(token=hf_token.token, model=MODEL_NAME)

    # 1-й прогон: что отвечает модель
    messages = [{"role": "system", "content": SYSTEM_MESSAGE}]
    messages.extend(history)
    messages.append({"role": "user", "content": message})

    raw_response = ""
    for msg in client.chat_completion(
        messages, max_tokens=MAX_TOKENS, stream=True,
        temperature=TEMPERATURE, top_p=TOP_P,
    ):
        if not msg.choices:
            continue
        delta = msg.choices[0].delta.content
        if delta:
            raw_response += delta

    # === Проверка на команду поиска ===
    if raw_response.strip().startswith("#search"):
        query = raw_response.replace("#search", "").strip()
        web_context = search_web(query)

        followup_messages = [
            {"role": "system", "content": SYSTEM_MESSAGE},
            {"role": "system", "content": f"Web context:\n{web_context}"},
        ]
        followup_messages.extend(history)
        followup_messages.append({"role": "user", "content": message})

        final_response = ""
        for msg in client.chat_completion(
            followup_messages, max_tokens=MAX_TOKENS, stream=True,
            temperature=TEMPERATURE, top_p=TOP_P,
        ):
            if not msg.choices:
                continue
            delta = msg.choices[0].delta.content
            if delta:
                final_response += delta
        yield final_response
    
    else:
        # Если поиска/картинки не нужно — обычный ответ
        yield raw_response

# ==== Интерфейс ====
chatbot = gr.ChatInterface(
    respond,
    type="messages",
    additional_inputs=[],
)

with gr.Blocks() as demo:
    with gr.Sidebar():
        gr.LoginButton()
    chatbot.render()

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