Spaces:
Sleeping
Sleeping
| # app.py | |
| import gradio as gr | |
| import requests | |
| import threading | |
| import time | |
| import uvicorn | |
| from fastapi import FastAPI, Request | |
| # === Встроенный MCP-сервер === | |
| mcp_app = FastAPI() | |
| async def generate(request: Request): | |
| try: | |
| body = await request.json() | |
| prompt = body.get("prompt", "").lower() | |
| except Exception: | |
| return {"text": "Ошибка обработки запроса."} | |
| if "question:" in prompt: | |
| question = prompt.split("question:")[-1].strip() | |
| else: | |
| question = prompt | |
| # Правила ответов | |
| if any(kw in question for kw in ["оплат", "тариф", "plan", "pricing"]): | |
| return {"text": "Доступны планы: Free, Pro, Enterprise. Pro включает аналитику и расширенные права. Enterprise — SLA 99.9%, SSO."} | |
| elif any(kw in question for kw in ["api", "интеграц", "rest", "integration"]): | |
| return {"text": "API доступен по /v1/, аутентификация через Bearer-токен. Лимит — 1000 запросов в час. Документация по /docs/v1/."} | |
| elif any(kw in question for kw in ["вход", "аутентиф", "login", "auth"]): | |
| return {"text": "Вход через почту и пароль. Поддерживается 2FA (TOTP), OAuth2, SAML 2.0 для SSO."} | |
| elif any(kw in question for kw in ["бэкап", "backup", "восстановлени", "restore"]): | |
| return {"text": "Резервное копирование — ежедневное. Восстановление до точки во времени (PITR) через WAL-архивацию."} | |
| elif any(kw in question for kw in ["задач", "task", "проект", "project"]): | |
| return {"text": "Задачи группируются в проекты, проекты — в workspace. Поддержка меток, этапов, приоритетов: low, medium, high, urgent."} | |
| else: | |
| return {"text": "Функция поддерживается. Для деталей обратитесь к администратору."} | |
| # Запуск MCP-сервера в отдельном потоке | |
| def run_server(): | |
| uvicorn.run(mcp_app, host="0.0.0.0", port=8000, log_level="info") | |
| threading.Thread(target=run_server, daemon=True).start() | |
| time.sleep(2) # Даем серверу время на запуск | |
| # === Клиентская часть (Gradio) === | |
| def respond(message, history): | |
| context = "Данные из базы знаний" # Можно интегрировать retriever | |
| prompt = f"context: {context}\n\nquestion: {message}\n\nanswer:" | |
| try: | |
| response = requests.post("http://localhost:8000/generate", json={"prompt": prompt}, timeout=10) | |
| return response.json().get("text", "Нет данных.") | |
| except Exception as e: | |
| return f"[Ошибка] {str(e)}" | |
| # Интерфейс | |
| gr.ChatInterface( | |
| fn=respond, | |
| title="TaskFlow AI Agent", | |
| description="Задайте вопрос о продукте" | |
| ).launch(server_name="0.0.0.0", server_port=7860) |