-- full integration with mol-edit backend
-- added readme
-- added vqe local_computational
This commit is contained in:
2026-05-25 19:17:04 +03:00
parent 76fe1c4294
commit c5ece3ff37
16 changed files with 1134 additions and 163 deletions

View File

@@ -1,7 +1,7 @@
from collections.abc import AsyncIterator
from contextlib import asynccontextmanager
from fastapi import FastAPI
from fastapi import FastAPI, Request
from fastapi.exceptions import HTTPException
from fastapi.middleware.cors import CORSMiddleware
@@ -14,7 +14,13 @@ from logging_config import logger
from openbabel import pybel
from pyscf import gto # pyright: ignore
from redis import asyncio as aioredis
from request_response_models import BasicError, ConvertRequest, MolFileModel
from request_response_models import (
BasicError,
ConvertRequest,
MolFileModel,
SmilesRequest,
)
from starlette.middleware.base import BaseHTTPMiddleware
@asynccontextmanager
@@ -28,25 +34,47 @@ async def lifespan(_: FastAPI) -> AsyncIterator[None]:
app = FastAPI(lifespan=lifespan)
origins = [
"http://localhost",
"http://localhost:8001",
]
class ForceCORSHeadersMiddleware(BaseHTTPMiddleware):
async def dispatch(self, request: Request, call_next):
# Handle OPTIONS preflight requests
if request.method == "OPTIONS":
response = JSONResponse(status_code=200, content={})
else:
response = await call_next(request)
app.add_middleware(
CORSMiddleware,
allow_origins=origins,
allow_credentials=True,
allow_methods=["*"],
allow_headers=["*"],
)
# Always add CORS headers
response.headers["Access-Control-Allow-Origin"] = "*"
response.headers["Access-Control-Allow-Methods"] = (
"GET, POST, PUT, DELETE, OPTIONS"
)
response.headers["Access-Control-Allow-Headers"] = "*"
response.headers["Access-Control-Allow-Credentials"] = "true"
return response
# Add this middleware FIRST
app.add_middleware(ForceCORSHeadersMiddleware)
@app.options("/{path:path}")
async def options_handler(request: Request):
return JSONResponse(
content={},
status_code=200,
headers={
"Access-Control-Allow-Origin": "*", # or specific origins
"Access-Control-Allow-Methods": "GET, POST, PUT, DELETE, OPTIONS",
"Access-Control-Allow-Headers": "*",
},
)
@app.post(
"/convert",
responses={
200: {"description": "Coversion Successful", "model": MolFileModel},
400: {"description": "Item created", "model": BasicError},
400: {"description": "Error Converting", "model": BasicError},
},
)
def convert_molecule(req: ConvertRequest):
@@ -84,6 +112,22 @@ def convert_molecule(req: ConvertRequest):
raise HTTPException(status_code=400, detail={"error": str(e)})
@app.post(
"/smiles",
)
def smiles_mol(req: SmilesRequest):
try:
# Rad the string and format from request
mol = pybel.readstring("xyz", req.text)
mol.addh()
mol.OBMol.SetTitle("")
mol2string = mol.write("smi", opt={"h": True, "U": True})
return JSONResponse({"molfile": mol2string}, 200)
except Exception as e:
raise HTTPException(status_code=400, detail={"error": str(e)})
@app.get("/informats")
@cache()
async def get_informats():

View File

@@ -9,6 +9,10 @@ class ConvertRequest(BaseModel):
optimize_geometry: bool = False
class SmilesRequest(BaseModel):
text: str
class MolFileModel(BaseModel):
molfile: str