Paper2Lab / modal_refine.py
unknown
Route Nemotron through Modal
f871d2e
Raw
History Blame Contribute Delete
1.66 kB
from __future__ import annotations
import os
import requests
import modal
from fastapi import Request
app = modal.App("paper2lab-nemotron")
image = (
modal.Image.debian_slim(python_version="3.11")
.pip_install("requests", "fastapi")
)
secret = modal.Secret.from_name("nvidia-api-key")
NVIDIA_CHAT_URL = "https://integrate.api.nvidia.com/v1/chat/completions"
DEFAULT_MODEL = "nvidia/nemotron-3-nano-30b-a3b"
@app.function(image=image, secrets=[secret], timeout=300)
@modal.fastapi_endpoint(method="POST")
async def refine_remote(request: Request):
body = await request.json()
prompt = body.get("prompt")
model = body.get("model", DEFAULT_MODEL)
if not prompt:
return {"status": "error", "error": "Missing prompt"}
api_key = os.environ["NVIDIA_API_KEY"]
response = requests.post(
NVIDIA_CHAT_URL,
headers={
"Authorization": f"Bearer {api_key}",
"Content-Type": "application/json",
},
json={
"model": model,
"messages": [
{
"role": "system",
"content": "You are a precise scientific JSON refiner. Return only valid JSON. No markdown.",
},
{"role": "user", "content": prompt},
],
"temperature": 0.1,
"top_p": 0.7,
"max_tokens": 8192,
},
timeout=180,
)
if not response.ok:
return {"status": "error", "error": response.text[:1000]}
data = response.json()
return {
"status": "ok",
"content": data["choices"][0]["message"]["content"],
}