hello / app.py
MatveyDM028's picture
Update app.py
a5b5be0 verified
from fastapi import FastAPI, HTTPException
from pydantic import BaseModel
from huggingface_hub import InferenceClient
from typing import List, Tuple, Optional
# Инициализация FastAPI
app = FastAPI()
# Глобальные переменные для хранения состояния
client = None
system_message = "You are a friendly Chatbot."
max_tokens = 1024
temperature = 0.7
top_p = 0.95
history = []
total_tokens = 0
# Модель данных для запроса
class ChatRequest(BaseModel):
message: str
reset_history: bool = False # Флаг для очистки истории
# Модель данных для инициализации
class InitializeRequest(BaseModel):
model_name: str = "Qwen/Qwen2.5-Coder-32B-Instruct"
system_message: str = "You are a friendly Chatbot."
max_tokens: int = 1024
temperature: float = 0.7
top_p: float = 0.95
# Инициализация модели
def initialize_model(
model_name: str,
sys_message: str,
tokens: int,
temp: float,
top_p_value: float,
):
global client, system_message, max_tokens, temperature, top_p
client = InferenceClient(model_name)
system_message = sys_message
max_tokens = tokens
temperature = temp
top_p = top_p_value
# Маршрут для инициализации модели
@app.post("/initialize")
async def initialize(request: InitializeRequest):
try:
initialize_model(
model_name=request.model_name,
sys_message=request.system_message,
tokens=request.max_tokens,
temp=request.temperature,
top_p_value=request.top_p,
)
return {"status": "Model initialized successfully."}
except Exception as e:
raise HTTPException(status_code=500, detail=str(e))
# Маршрут для обработки запросов
@app.post("/chat")
async def chat(request: ChatRequest):
global history, total_tokens
try:
# Очистка истории, если запрошено
if request.reset_history:
history = []
total_tokens = 0
return {"response": "History cleared.", "total_tokens": total_tokens}
# Формируем сообщения для модели
messages = [{"role": "system", "content": system_message}]
# Добавляем историю диалога
for user_msg, assistant_msg in history:
if user_msg:
messages.append({"role": "user", "content": user_msg})
if assistant_msg:
messages.append({"role": "assistant", "content": assistant_msg})
# Добавляем текущее сообщение пользователя
messages.append({"role": "user", "content": request.message})
# Получаем ответ от модели
response = ""
for message in client.chat_completion(
messages,
max_tokens=max_tokens,
stream=True,
temperature=temperature,
top_p=top_p,
):
token = message.choices[0].delta.content
response += token
# Обновляем историю и счетчик токенов
history.append((request.message, response))
total_tokens += len(response.split()) # Примерный подсчет токенов
# Возвращаем ответ и количество токенов
return {"response": response, "total_tokens": total_tokens}
except Exception as e:
raise HTTPException(status_code=500, detail=str(e))
# Маршрут для получения текущего состояния (история и токены)
@app.get("/status")
async def get_status():
return {
"history": history,
"total_tokens": total_tokens,
}
# Инициализация модели при запуске
initialize_model(
model_name="Qwen/Qwen2.5-Coder-32B-Instruct",
sys_message="You are a friendly Chatbot.",
tokens=1024,
temp=0.7,
top_p_value=0.95,
)
# Запуск приложения (для локального тестирования)
if __name__ == "__main__":
import uvicorn
uvicorn.run(app, host="0.0.0.0", port=7860)