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