File size: 2,462 Bytes
5bc38ee
 
 
141c253
5bc38ee
141c253
5bc38ee
 
 
 
 
ece0cef
5bc38ee
ece0cef
 
5bc38ee
 
 
 
 
 
141c253
ece0cef
 
5bc38ee
 
 
 
 
 
 
 
 
 
 
141c253
5bc38ee
 
ece0cef
5bc38ee
 
141c253
5bc38ee
 
 
 
 
6fa5d5e
5bc38ee
 
 
 
 
 
141c253
5bc38ee
 
141c253
 
6fa5d5e
 
141c253
5bc38ee
 
141c253
ece0cef
141c253
ece0cef
141c253
 
5bc38ee
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
import os
import sqlite3
import torch
import uvicorn
from transformers import AutoModelForCausalLM, AutoTokenizer
from fastapi_poe import PoeBot, make_app
from fastapi_poe.types import QueryRequest
from sse_starlette.sse import ServerSentEvent

# --- CONFIGURATION DU MODÈLE ---
MODEL_ID = "Finisha-F-scratch/Charlotte-amity"
print("--> Chargement du tokenizer...")
tokenizer = AutoTokenizer.from_pretrained(MODEL_ID)

print("--> Chargement du modèle (cette étape peut prendre du temps)...")
model = AutoModelForCausalLM.from_pretrained(
    MODEL_ID, 
    torch_dtype=torch.float16 if torch.cuda.is_available() else torch.float32,
    device_map="auto"
)

# --- BASE DE DONNÉES ---
DB_NAME = os.path.join(os.path.expanduser("~"), "charlotte_api.db")

def init_db():
    conn = sqlite3.connect(DB_NAME)
    c = conn.cursor()
    c.execute('''CREATE TABLE IF NOT EXISTS api_keys (key TEXT PRIMARY KEY, requests_count INTEGER)''')
    conn.commit()
    conn.close()
init_db()

# --- CLASSE DU BOT POE ---
class CharlottePoeBot(PoeBot):
    async def get_response(self, request: QueryRequest):
        # Récupérer le dernier message envoyé par l'utilisateur
        last_message = request.query[-1].content
        
        # Préparation des tokens
        inputs = tokenizer(last_message, return_tensors="pt", truncation=True, max_length=128).to(model.device)
        
        # Génération du texte
        with torch.no_grad():
            outputs = model.generate(
                **inputs, 
                max_new_tokens=100, 
                do_sample=True, 
                temperature=0.8, 
                pad_token_id=tokenizer.eos_token_id
            )
        
        full_text = tokenizer.decode(outputs[0], skip_special_tokens=True)
        response_text = full_text[len(last_message):].strip()
        
        # Envoi de la réponse sous forme de flux (streaming)
        yield ServerSentEvent(event="text", data=response_text)

# --- CREATION DE L'APPLICATION ---
bot = CharlottePoeBot()
# Correction ici : on enlève l'argument obsolète
app = make_app(bot)

# --- LANCEMENT DU SERVEUR ---
if __name__ == "__main__":
    # Hugging Face impose le port 7860
    port_to_use = int(os.environ.get("PORT", 7860))
    print(f"--> Démarrage d'Uvicorn sur le port {port_to_use}...")
    
    # On lance le serveur web sur l'adresse 0.0.0.0 pour qu'il soit accessible de l'extérieur
    uvicorn.run(app, host="0.0.0.0", port=port_to_use)