File size: 1,657 Bytes
71276a4
 
f871d2e
 
71276a4
d754586
71276a4
 
 
 
 
d754586
71276a4
 
 
 
f871d2e
 
71276a4
f871d2e
 
d754586
 
 
 
f871d2e
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
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"],
    }