Spaces:
Sleeping
Sleeping
Update app.py
Browse files
app.py
CHANGED
|
@@ -1,10 +1,10 @@
|
|
| 1 |
from fastapi import FastAPI, Request
|
| 2 |
-
from pydantic import BaseModel
|
| 3 |
import torch
|
| 4 |
from transformers import AutoModelForCausalLM, AutoTokenizer
|
| 5 |
import time
|
| 6 |
import uuid
|
| 7 |
-
from typing import Optional, List
|
| 8 |
|
| 9 |
# --- Configuration ---
|
| 10 |
MODEL_ID = "deepseek-ai/deepseek-coder-1.3b-instruct"
|
|
@@ -29,11 +29,16 @@ class ChatMessage(BaseModel):
|
|
| 29 |
content: str
|
| 30 |
|
| 31 |
class ChatCompletionRequest(BaseModel):
|
| 32 |
-
#
|
| 33 |
model: Optional[str] = None
|
| 34 |
-
messages: List[ChatMessage]
|
|
|
|
| 35 |
max_tokens: Optional[int] = 250
|
| 36 |
|
|
|
|
|
|
|
|
|
|
|
|
|
| 37 |
class ChatCompletionResponseChoice(BaseModel):
|
| 38 |
index: int = 0
|
| 39 |
message: ChatMessage
|
|
@@ -58,7 +63,6 @@ class ModelList(BaseModel):
|
|
| 58 |
|
| 59 |
# --- Définition des API ---
|
| 60 |
|
| 61 |
-
# CHANGEMENT 2: Ajouter un endpoint /models pour satisfaire l'extension
|
| 62 |
@app.get("/models", response_model=ModelList)
|
| 63 |
async def list_models():
|
| 64 |
"""Endpoint pour lister les modèles disponibles."""
|
|
@@ -68,11 +72,14 @@ async def list_models():
|
|
| 68 |
async def create_chat_completion(request: ChatCompletionRequest):
|
| 69 |
"""Endpoint principal pour la génération de texte."""
|
| 70 |
user_prompt = ""
|
| 71 |
-
|
|
|
|
|
|
|
|
|
|
| 72 |
user_prompt = request.messages[-1].content
|
| 73 |
|
| 74 |
if not user_prompt:
|
| 75 |
-
return {"error": "
|
| 76 |
|
| 77 |
messages_for_model = [{'role': 'user', 'content': user_prompt}]
|
| 78 |
inputs = tokenizer.apply_chat_template(messages_for_model, add_generation_prompt=True, return_tensors="pt").to(DEVICE)
|
|
|
|
| 1 |
from fastapi import FastAPI, Request
|
| 2 |
+
from pydantic import BaseModel, Extra
|
| 3 |
import torch
|
| 4 |
from transformers import AutoModelForCausalLM, AutoTokenizer
|
| 5 |
import time
|
| 6 |
import uuid
|
| 7 |
+
from typing import Optional, List, Any
|
| 8 |
|
| 9 |
# --- Configuration ---
|
| 10 |
MODEL_ID = "deepseek-ai/deepseek-coder-1.3b-instruct"
|
|
|
|
| 29 |
content: str
|
| 30 |
|
| 31 |
class ChatCompletionRequest(BaseModel):
|
| 32 |
+
# On rend presque tout optionnel pour maximiser la compatibilité
|
| 33 |
model: Optional[str] = None
|
| 34 |
+
messages: Optional[List[ChatMessage]] = None
|
| 35 |
+
prompt: Optional[str] = None # Certaines extensions envoient "prompt" au lieu de "messages"
|
| 36 |
max_tokens: Optional[int] = 250
|
| 37 |
|
| 38 |
+
# LA MODIFICATION LA PLUS IMPORTANTE : Ignorer les champs inconnus
|
| 39 |
+
class Config:
|
| 40 |
+
extra = Extra.ignore
|
| 41 |
+
|
| 42 |
class ChatCompletionResponseChoice(BaseModel):
|
| 43 |
index: int = 0
|
| 44 |
message: ChatMessage
|
|
|
|
| 63 |
|
| 64 |
# --- Définition des API ---
|
| 65 |
|
|
|
|
| 66 |
@app.get("/models", response_model=ModelList)
|
| 67 |
async def list_models():
|
| 68 |
"""Endpoint pour lister les modèles disponibles."""
|
|
|
|
| 72 |
async def create_chat_completion(request: ChatCompletionRequest):
|
| 73 |
"""Endpoint principal pour la génération de texte."""
|
| 74 |
user_prompt = ""
|
| 75 |
+
# On cherche le prompt de l'utilisateur de plusieurs manières possibles
|
| 76 |
+
if request.prompt:
|
| 77 |
+
user_prompt = request.prompt
|
| 78 |
+
elif request.messages and request.messages[-1].role == "user":
|
| 79 |
user_prompt = request.messages[-1].content
|
| 80 |
|
| 81 |
if not user_prompt:
|
| 82 |
+
return {"error": "Could not find a valid prompt in the request."}
|
| 83 |
|
| 84 |
messages_for_model = [{'role': 'user', 'content': user_prompt}]
|
| 85 |
inputs = tokenizer.apply_chat_template(messages_for_model, add_generation_prompt=True, return_tensors="pt").to(DEVICE)
|