Spaces:
Sleeping
Sleeping
from typing import List | |
from fastapi import FastAPI, HTTPException, Query, Request | |
from fastapi.exceptions import RequestValidationError | |
from fastapi.middleware.cors import CORSMiddleware | |
from fastapi.staticfiles import StaticFiles | |
from fastapi.responses import FileResponse, JSONResponse | |
import numpy as np | |
from pydantic import BaseModel, Field, conlist | |
from app.utils.embedding import get_embedding | |
app = FastAPI() | |
origins = [ | |
"http://localhost:3000", | |
"http://localhost:8000", | |
"localhost:8000", | |
"https://your-space-name.hf.space", | |
] | |
app.add_middleware( | |
CORSMiddleware, | |
allow_origins=origins, | |
allow_credentials=True, | |
allow_methods=["*"], | |
allow_headers=["*"], | |
) | |
# Mount static files | |
app.mount( | |
"/static", StaticFiles(directory="app/build/static", html=True), name="static" | |
) | |
# Serve index.html at the root | |
def read_root(): | |
return FileResponse("app/build/index.html") | |
words_db = [] | |
async def get_words() -> dict: | |
return {"data": words_db} | |
async def add_word(word: dict) -> dict: | |
try: | |
word_embedding = get_embedding(word["item"]) | |
words_db.append(word) | |
word["embedding"] = word_embedding.tolist() | |
return JSONResponse( | |
status_code=200, | |
content={"message": "Item created successfully", "success": True}, | |
) | |
except HTTPException as e: | |
raise e | |
except Exception as e: | |
raise HTTPException(status_code=500, detail=str(e)) | |
async def delete_word(word_id: str) -> dict: | |
word_id = int(word_id) | |
for word in words_db: | |
if int(word["id"]) == word_id: | |
words_db.remove(word) | |
return {"data": {"Succesful"}} | |
return {"data": {"Word not found"}} | |
#### Category Words | |
common_category_words = [] | |
async def get_common_category_words() -> dict: | |
return {"data": common_category_words} | |
async def add_common_category_words(new_word: dict) -> dict: | |
try: | |
for word in common_category_words: | |
if new_word["item"] == word["item"]: | |
raise HTTPException(status_code=400, detail="Word already exists") | |
word_embedding = get_embedding(new_word["item"]) | |
new_word["embedding"] = word_embedding.tolist() | |
common_category_words.append(new_word) | |
return JSONResponse( | |
status_code=200, | |
content={"message": "Item created successfully", "success": True}, | |
) | |
except HTTPException as e: | |
raise e | |
except Exception as e: | |
raise HTTPException(status_code=500, detail=str(e)) | |
async def get_embedding_api() -> dict: | |
if len(common_category_words) > 1: | |
vectors = [word["embedding"] for word in common_category_words] | |
variances = np.var(vectors, axis=0) | |
low_variance_dims = np.argsort(variances)[:3] | |
result = { | |
"variances": variances.tolist(), | |
"top_variance_dims": low_variance_dims.tolist(), | |
} | |
return JSONResponse(status_code=200, content={"data": result, "success": True}) | |
return JSONResponse( | |
status_code=200, | |
content={ | |
"data": {"variances": [0] * 50, "top_variance_dims": [0, 1, 2]}, | |
"message": "Not enough words for analysis", | |
"success": False, | |
}, | |
) | |
async def delete_common_category_words(word_id: str) -> dict: | |
word_id = int(word_id) | |
for word in common_category_words: | |
if int(word["id"]) == word_id: | |
common_category_words.remove(word) | |
return {"data": {"Succesful"}} | |
return {"data": {"Word not found"}} | |
### Difference Semantic | |
from starlette.status import HTTP_422_UNPROCESSABLE_ENTITY | |
class WordPair(BaseModel): | |
word1: str = Field(..., min_length=2) | |
word2: str = Field(..., min_length=2) | |
async def validation_exception_handler(request: Request, exc: RequestValidationError): | |
errors = exc.errors() | |
detailed_messages = [f"Error in {err['loc'][1]}: {err['msg']}" for err in errors] | |
print(detailed_messages) | |
return JSONResponse( | |
status_code=HTTP_422_UNPROCESSABLE_ENTITY, | |
content={"detail": ", ".join(detailed_messages), "body": exc.body}, | |
) | |
semantic_difference_db = {} | |
async def get_semantic_difference() -> dict: | |
return JSONResponse( | |
status_code=200, content={"data": semantic_difference_db, "success": True} | |
) | |
async def add_semantic_difference(new_words: WordPair): | |
try: | |
first_word = new_words.word1 | |
second_word = new_words.word2 | |
combined_word = f"{first_word}-{second_word}" | |
word_one_embedding = get_embedding(first_word) | |
word_two_embedding = get_embedding(second_word) | |
embedding = word_one_embedding - word_two_embedding | |
if ( | |
combined_word in semantic_difference_db | |
or combined_word[::-1] in semantic_difference_db | |
): | |
raise HTTPException( | |
status_code=400, detail="Semantic difference already exists" | |
) | |
semantic_difference_db[combined_word] = { | |
"id": len(semantic_difference_db) + 1, | |
"word-1": first_word, | |
"word-2": second_word, | |
"embedding": embedding.tolist(), | |
} | |
return JSONResponse( | |
status_code=200, | |
content={"message": "Item created successfully", "success": True}, | |
) | |
except HTTPException as e: | |
raise e | |
except Exception as e: | |
raise HTTPException(status_code=500, detail=str(e)) | |
async def get_embedding_difference() -> dict: | |
try: | |
if len(semantic_difference_db) > 1: | |
vectors = [word["embedding"] for word in semantic_difference_db.values()] | |
variances = np.var(vectors, axis=0) | |
low_variance_dims = np.argsort(variances)[:3] | |
result = { | |
"variance": variances.tolist(), | |
"top_variance_dims": low_variance_dims.tolist(), | |
} | |
return JSONResponse( | |
status_code=200, content={"data": result, "success": True} | |
) | |
return JSONResponse( | |
status_code=200, | |
content={ | |
"data": {"variance": [0] * 50, "top_variance_dims": [0, 1, 2]}, | |
"message": "Not enough words for analysis", | |
"success": False, | |
}, | |
) | |
except Exception as e: | |
raise HTTPException(status_code=500, detail=str(e)) | |
async def delete_semantic_difference(word_id: str) -> dict: | |
try: | |
word_id = int(word_id) | |
for word in semantic_difference_db.values(): | |
if int(word["id"]) == word_id: | |
del semantic_difference_db[word["word-1"] + "-" + word["word-2"]] | |
return {"data": {"Succesful"}} | |
return JSONResponse(status_code=404, content={"data": {"Word not found"}}) | |
except Exception as e: | |
raise HTTPException(status_code=500, detail=str(e)) | |
if __name__ == "__main__": | |
import uvicorn | |
uvicorn.run(app, host="0.0.0.0", port=8000) | |