Spaces:
Sleeping
Sleeping
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() |