File size: 3,564 Bytes
b85c1d6
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
"""

Data Scientist.: Dr.Eddy Giusepe Chirinos Isidro



Run Script

==========

Você tem que estar dentro da pasta e logo executar o seguinte comando:



$ uvicorn main:app --reload



Você ver na interface do swagger, fazendo no Browser: localhost:8000/docs 

"""
# 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 aiofiles
from typing import Dict

app = FastAPI(title='🤗 ChatBot com a OpenAI 🤗',
              version='1.0.0',
              description="""Data Scientist.: Dr. Eddy Giusepe Chirinos Isidro""")

# 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-3.5-turbo",
                                            messages=conversation_history,
                                           )

    assistant_message = response.choices[0].message["content"]
    conversation_history.append({"role": "assistant", "content": assistant_message})

    # Remova mensagens mais antigas quando o total de tokens em conversa_history exceder 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)