import os import base64 import requests from typing import Dict import gradio as gr from huggingface_hub import InferenceClient # ----------------------------- # GitHub Prompt Configuration # ----------------------------- GITHUB_OWNER = "Tony14100" GITHUB_REPO = "Prompt-Tonic" GITHUB_REF = "main" GITHUB_PATH = "OzonConsultant" GITHUB_API_URL = f"https://api.github.com/repos/{GITHUB_OWNER}/{GITHUB_REPO}/contents/{GITHUB_PATH}?ref={GITHUB_REF}" LOCAL_PROMPT_FILE = "prompt_cache.txt" LOCAL_SHA_FILE = "prompt_cache_sha.txt" # ----------------------------- # Load system prompt from GitHub # ----------------------------- def load_system_prompt(): github_token = os.getenv("GITHUB_TOKEN") if not github_token: return "Вы — полезный консультант по Ozon. Отвечайте четко и профессионально." try: headers = {'Authorization': f'token {github_token}', 'User-Agent': 'Gradio-App'} response = requests.get(GITHUB_API_URL, headers=headers, timeout=10) response.raise_for_status() data = response.json() current_sha = data['sha'] cached_sha = None if os.path.exists(LOCAL_SHA_FILE): with open(LOCAL_SHA_FILE, 'r') as f: cached_sha = f.read().strip() if cached_sha == current_sha and os.path.exists(LOCAL_PROMPT_FILE): with open(LOCAL_PROMPT_FILE, 'r', encoding='utf-8') as f: return f.read().strip() content_b64 = data['content'] prompt = base64.b64decode(content_b64).decode('utf-8').strip() with open(LOCAL_PROMPT_FILE, 'w', encoding='utf-8') as f: f.write(prompt) with open(LOCAL_SHA_FILE, 'w') as f: f.write(current_sha) return prompt except: return "Вы — полезный консультант по Ozon. Отвечайте четко и профессионально." SYSTEM_PROMPT = load_system_prompt() # ----------------------------- # HF Client # ----------------------------- MODEL_ID = "zai-org/GLM-4.5" MAX_TOKENS = 1024 def get_client() -> InferenceClient: token = os.getenv("HF_TOKEN") or os.getenv("HF_API_KEY") if not token: raise RuntimeError("HF_TOKEN не найден!") return InferenceClient(token=token) # ----------------------------- # State management # ----------------------------- def reset_state(): return {"messages": [], "system_used": False} def mock_predict(user_message: str): return f"[Mock reply] Ты написал: {user_message}" def on_user_message(user_message: str, state: Dict): if not user_message.strip(): return [], state, gr.update(value="") messages = state["messages"] if not state["system_used"]: messages.insert(0, {"role": "system", "content": SYSTEM_PROMPT}) state["system_used"] = True messages.append({"role": "user", "content": user_message}) try: client = get_client() response = client.chat_completion( model=MODEL_ID, messages=messages, max_tokens=MAX_TOKENS, temperature=0.5, stream=False, ) assistant_reply = response.choices[0].message["content"].strip() except: assistant_reply = mock_predict(user_message) messages.append({"role": "assistant", "content": assistant_reply}) state["messages"] = messages chat_history = [] for msg in messages: if msg["role"] != "system" and msg["content"].strip(): html = ( f'