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"], }