Compare commits

...

3 Commits

Author SHA1 Message Date
kar
c6e6432f19 img_base64 2025-04-21 19:39:02 +05:30
kar
2f7aab5891 img_base64 2025-04-21 19:24:08 +05:30
kar
a2b6730b88 request_id 2025-04-21 17:34:08 +05:30
4 changed files with 93 additions and 28 deletions

57
app (2).py Normal file
View File

@@ -0,0 +1,57 @@
import os
import io
from dotenv import load_dotenv
from fastapi import FastAPI, File, UploadFile, Form, Query
from fastapi.responses import JSONResponse, StreamingResponse
from PIL import Image
import moondream as md
# Load environment variables
load_dotenv()
api_key = os.getenv("MOON_DREAM_KEY")
# Initialize Moondream model
model = md.vl(api_key=api_key)
# FastAPI app
app = FastAPI()
@app.post("/caption")
async def generate_caption(
image: UploadFile = File(...),
length: str = Form("short")
):
try:
image_bytes = await image.read()
img = Image.open(io.BytesIO(image_bytes))
response = model.caption(img, length=length)
return JSONResponse(content={"caption": response["caption"]})
except Exception as e:
return JSONResponse(status_code=500, content={"error": str(e)})
@app.post("/query")
async def query_image(
image: UploadFile = File(...),
question: str = Form(...),
stream: bool = Form(False)
):
try:
image_bytes = await image.read()
img = Image.open(io.BytesIO(image_bytes))
if stream:
def generate():
result = model.query(img, question, stream=True)
for chunk in result["chunk"]:
yield chunk
return StreamingResponse(generate(), media_type="text/plain")
else:
result = model.query(img, question)
return JSONResponse(content={
"answer": result["answer"],
"request_id": result["request_id"]
})
except Exception as e:
return JSONResponse(status_code=500, content={"error": str(e)})

61
app.py
View File

@@ -1,8 +1,10 @@
import os import os
import io import io
import base64
from dotenv import load_dotenv from dotenv import load_dotenv
from fastapi import FastAPI, File, UploadFile, Form, Query from fastapi import FastAPI, HTTPException
from fastapi.responses import JSONResponse, StreamingResponse from fastapi.responses import JSONResponse, StreamingResponse
from pydantic import BaseModel
from PIL import Image from PIL import Image
import moondream as md import moondream as md
@@ -16,42 +18,47 @@ model = md.vl(api_key=api_key)
# FastAPI app # FastAPI app
app = FastAPI() app = FastAPI()
@app.post("/caption") # Utility to decode base64
async def generate_caption( def decode_base64_image(base64_str: str) -> Image.Image:
image: UploadFile = File(...),
length: str = Form("short")
):
try: try:
image_bytes = await image.read() image_data = base64.b64decode(base64_str.split(",")[-1])
img = Image.open(io.BytesIO(image_bytes)) return Image.open(io.BytesIO(image_data))
response = model.caption(img, length=length)
return JSONResponse(content={"caption": response["caption"]})
except Exception as e: except Exception as e:
return JSONResponse(status_code=500, content={"error": str(e)}) raise ValueError("Invalid base64 image") from e
# Request schemas
class CaptionRequest(BaseModel):
base64_image: str
length: str = "short"
class QueryRequest(BaseModel):
base64_image: str
question: str
stream: bool = False
@app.post("/caption")
async def generate_caption(payload: CaptionRequest):
try:
img = decode_base64_image(payload.base64_image)
response = model.caption(img, length=payload.length)
return {"caption": response["caption"]}
except Exception as e:
raise HTTPException(status_code=500, detail=str(e))
@app.post("/query") @app.post("/query")
async def query_image( async def query_image(payload: QueryRequest):
image: UploadFile = File(...),
question: str = Form(...),
stream: bool = Form(False)
):
try: try:
image_bytes = await image.read() img = decode_base64_image(payload.base64_image)
img = Image.open(io.BytesIO(image_bytes))
if stream: if payload.stream:
def generate(): def generate():
result = model.query(img, question, stream=True) result = model.query(img, payload.question, stream=True)
for chunk in result["chunk"]: for chunk in result["chunk"]:
yield chunk yield chunk
return StreamingResponse(generate(), media_type="text/plain") return StreamingResponse(generate(), media_type="text/plain")
else: else:
result = model.query(img, question) result = model.query(img, payload.question)
return JSONResponse(content={ return {"answer": result["answer"]}
"answer": result["answer"],
"request_id": result["request_id"]
})
except Exception as e: except Exception as e:
return JSONResponse(status_code=500, content={"error": str(e)}) raise HTTPException(status_code=500, detail=str(e))

BIN
draaw.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 124 KiB

View File

@@ -3,4 +3,5 @@ Pillow
python-dotenv python-dotenv
fastapi fastapi
uvicorn uvicorn
python-multipart python-multipart
pydantic