Spaces:
No application file
No application file
| """ | |
| 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: | |
| async def root(request: Request): | |
| return templates.TemplateResponse("index.html", {"request": request}) | |
| # Função de chat para lidar com solicitações de 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) | |