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 io
import base64
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 pydantic import BaseModel
from PIL import Image
import moondream as md
@@ -16,42 +18,47 @@ 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")
):
# Utility to decode base64
def decode_base64_image(base64_str: str) -> Image.Image:
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"]})
image_data = base64.b64decode(base64_str.split(",")[-1])
return Image.open(io.BytesIO(image_data))
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")
async def query_image(
image: UploadFile = File(...),
question: str = Form(...),
stream: bool = Form(False)
):
async def query_image(payload: QueryRequest):
try:
image_bytes = await image.read()
img = Image.open(io.BytesIO(image_bytes))
img = decode_base64_image(payload.base64_image)
if stream:
if payload.stream:
def generate():
result = model.query(img, question, stream=True)
result = model.query(img, payload.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"]
})
result = model.query(img, payload.question)
return {"answer": result["answer"]}
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
fastapi
uvicorn
python-multipart
python-multipart
pydantic