EddyGiusepe's picture
streamlit gradio FastApi WebApp
ede34e0
"""
Data Scientist.: Dr.Eddy Giusepe Chirinos Isidro
Para executar este script --> $ python main.py
"""
# main.py
from fastapi import FastAPI, Request, Body, HTTPException
from fastapi.middleware.cors import CORSMiddleware
from fastapi.staticfiles import StaticFiles
from fastapi.responses import HTMLResponse
from fastapi.templating import Jinja2Templates
import openai
# import aiofiles
from typing import Dict
app = FastAPI()
# Monte arquivos e modelos estáticos porque estamos usando 'Jinja2'. Jinja2 é um mecanismo de modelagem para Python:
app.mount("/static", StaticFiles(directory="static"), name="static")
templates = Jinja2Templates(directory="templates")
# Substitua sua chave de API OpenAI:
import openai
import os
from dotenv import load_dotenv, find_dotenv
_ = load_dotenv(find_dotenv()) # read local .env file
openai.api_key = os.environ['OPENAI_API_KEY']
# O middleware CORS é necessário para permitir solicitações do frontend:
origins = ["*"]
app.add_middleware(
CORSMiddleware,
allow_origins=origins,
allow_credentials=True,
allow_methods=["*"],
allow_headers=["*"],
)
# Adicione uma variável global para armazenar o histórico de conversas:
conversation_history = [
{"role": "system", "content": "Você é um assistente prestativo."}
]
# Adicione uma constante para o máximo de tokens de memória:
MAX_MEMORY_TOKENS = 70
# Função root para renderizar index.html:
@app.get("/", response_class=HTMLResponse)
async def root(request: Request):
return templates.TemplateResponse("index.html", {"request": request})
# Função de chat para lidar com solicitações de chat:
@app.post("/api/chat")
async def chat_endpoint(request: Request, body: Dict[str, str] = Body(...)):
user_message = body.get("user_message")
if not user_message:
raise HTTPException(status_code=400, detail="user_message is required")
conversation_history.append({"role": "user", "content": user_message})
response = openai.ChatCompletion.create(
model="gpt-4", # OR gpt-3.5-turbo
messages=conversation_history,
)
assistant_message = response.choices[0].message["content"]
conversation_history.append({"role": "assistant", "content": assistant_message})
# Remove older messages when total tokens in conversation_history exceed MAX_MEMORY_TOKENS
while response.usage['total_tokens'] > MAX_MEMORY_TOKENS:
# Ensure that there are at least two messages (one "system" and one other message) before removing a message
if len(conversation_history) > 2:
removed_message = conversation_history.pop(1) # Skip the "system" message at index 0
# Create a new API call without the removed_message
response = openai.ChatCompletion.create(
model="gpt-3.5-turbo",
messages=conversation_history,
)
else:
break
return assistant_message
if __name__ == "__main__":
import uvicorn
uvicorn.run(app, host="0.0.0.0", port=8000)