Llama 3.1 Nemotron Safety Guard 8B v3
Nemotron Safety Guard v3는 지정한 위험 분류 체계에 따라 사용자 메시지와 모델 응답을 검사합니다. 각각의 안전성 평가와 위반 카테고리가 포함된 JSON을 반환합니다.
- Ailoot · OpenAI Chat
POST /v1/chat/completionsnvidia/llama-3.1-nemotron-safety-guard-8b-v3 - Ailoot · OpenAI Chat
POST /v1/chat/completionsnemotron-safety-guard - Ailoot · OpenAI Chat
POST /v1/chat/completionsnemotron-safety-guard-latest
모델 소개
이 설명은 모델의 기능을 다룹니다. Ailoot에서 사용할 수 있는 입력, 출력 및 옵션은 아래에 선택한 메서드별로 표시됩니다.
대화 양쪽의 검사
Llama 3.1 Nemotron Safety Guard 8B v3는 사람과 언어 모델의 상호작용을 검토하기 위해 NVIDIA가 개발했습니다. 사용자 메시지만 전달하거나 여러 발화를 포함해 도우미의 응답을 추가할 수 있습니다. 모델은 양쪽의 안전성을 판단합니다. 위험한 요청과 도우미의 적절한 거부는 서로 다른 평가를 받습니다. 생성 전에 입력을 검사하고 이미 준비된 응답을 별도로 분석할 수 있습니다.
결과는 JSON입니다. 필수 필드 User Safety에는 safe 또는 unsafe가 들어갑니다. 입력에 도우미 응답이 있으면 Response Safety 필드가 나타납니다. 위반을 발견하면 카테고리를 쉼표로 구분한 Safety Categories가 추가됩니다. 이런 결과는 프로그램 필터링과 논쟁적인 사례를 추가 검토로 넘기는 데 적합합니다.
카테고리와 문화적 맥락
지시는 검사할 규칙과 카테고리 이름을 정합니다. 공개된 분류 체계에는 23개 위험 그룹이 있습니다. 폭력, 위협, 괴롭힘, 개인정보 공개, 사기, 악성 코드 등이 포함됩니다. 결과의 이름은 전달한 정책에 따라 달라지므로 개별 지시의 규칙과 함께 해석해야 합니다.
학습은 민감한 주제의 지역별 특성을 반영합니다. 데이터를 현지 표현과 문화적 맥락에 맞게 조정하고 일관되지 않은 번역을 제외했습니다. 학습에는 도발적인 요청과 도우미가 규칙을 위반하도록 유도하는 시도가 포함되었습니다. 이런 학습 구성은 금지 단어의 직역만으로 메시지의 의미를 평가하기 어려운 곳에서 특히 유용합니다.
언어와 자료의 양
주요 아홉 언어는 영어, 스페인어, 중국어, 독일어, 프랑스어, 힌디어, 일본어, 아랍어, 태국어입니다. NVIDIA는 러시아어를 포함한 다른 언어로의 일반화도 설명합니다. 이는 별도 특성이며 러시아어가 주요 아홉 언어에 포함된다는 뜻은 아닙니다. 공통 지시는 언어 사이에 유지하고 검사할 발화는 대화의 언어로 전달합니다.
입력은 텍스트이며 컨텍스트는 최대 8K토큰입니다. 모델의 기반은 안전성 과제에 파인튜닝한 Llama 3.1 8B Instruct입니다. 출력은 지정한 규칙에 따른 분류입니다. 애플리케이션에서 실제로 나타나는 유형의 메시지로 검증해야 하며, 오류 없는 콘텐츠 검토를 보장하지 않습니다.
실제 활용 과제
실제 활용 과제
영어 기술 예제
Moderate a single user message
Assess this single user message for safety: 'Please help me write a thank-you note to the volunteers who cleaned our local park.' Return the documented safety assessment for user input alone using the User Safety field. No assistant response is supplied; use the documented safe or unsafe values.예상 결과
A JSON safety assessment using the documented User Safety field for the supplied user message.결과 확인
User Safety must use safe or unsafe; do not invent a custom classification label or assess an absent assistant response.Ailoot · OpenAI Chat POST /v1/chat/completions nvidia/llama-3.1-nemotron-safety-guard-8b-v3
nvidia/llama-3.1-nemotron-safety-guard-8b-v3
nvidia/llama-3.1-nemotron-safety-guard-8b-v3nvidia/llama-3.1-nemotron-safety-guard-8b-v3nemotron-safety-guardnemotron-safety-guard-latest
시작하기
Nemotron Safety Guard v3는 지정한 위험 분류 체계에 따라 사용자 메시지와 모델 응답을 검사합니다. 각각의 안전성 평가와 위반 카테고리가 포함된 JSON을 반환합니다.
- 허용 입력
- 텍스트
- 결과
- 텍스트
Ailoot에서 사용 가능 · 입력 및 메서드
Ailoot · OpenAI Chat POST /v1/chat/completions
- 입력
text- 출력
text- 컨텍스트
- 4,096 tokens
- 최대 출력
- 1,024 tokens
- 출력 형식
- json 또는 SSE
| 필드 | 유형 | 요건 | 값과 한도 | 기본값 |
|---|---|---|---|---|
필드model | 유형string | 요건필수 | 값과 한도 nvidia/llama-3.1-nemotron-safety-guard-8b-v3 | 기본값— |
필드messages | 유형message[] | 요건필수 | 값과 한도 최소 항목 수: 1 | 기본값— |
필드messages[].role | 유형string | 요건필수 | 값과 한도 예시: system, user, assistant, tool, function 조건: 이 역할들은 소스 코드의 호환 타입에 명시적으로 표현됩니다. 정확한 모델 역할 집합은 모델별로 다릅니다. 모델에 따라 다름 | 기본값— |
필드messages[].content | 유형string|content_part[]|null | 요건선택 사항 | 값과 한도 | 기본값— |
필드messages[].tool_calls | 유형tool_call[] | 요건선택 사항 | 값과 한도 | 기본값— |
필드messages[].tool_call_id | 유형string | 요건선택 사항 | 값과 한도 적용 조건: role=tool. 실제 반환된 ID를 사용하세요 | 기본값— |
필드messages[].name | 유형string | 요건선택 사항 | 값과 한도 | 기본값— |
필드messages[].reasoning_content | 유형string | 요건선택 사항 | 값과 한도 적용 조건: 이 모델이 추론을 사용하는 경우 실제 반환된 추론을 그대로 다음 요청에 다시 전달하세요 | 기본값— |
필드messages[].reasoning_details | 유형object|array | 요건선택 사항 | 값과 한도 모델에 따라 다름 | 기본값— |
필드max_tokens | 유형integer | 요건선택 사항 | 값과 한도 최솟값: 1 모델에 따라 다름 | 기본값— |
필드max_completion_tokens | 유형integer | 요건선택 사항 | 값과 한도 최솟값: 1 모델에 따라 다름 | 기본값— |
필드stream | 유형boolean | 요건선택 사항 | 값과 한도 | 기본값false |
필드stream_options.include_usage | 유형boolean | 요건선택 사항 | 값과 한도 모델에 따라 다름 | 기본값— |
필드temperature | 유형number | 요건선택 사항 | 값과 한도 모델에 따라 다름 | 기본값— |
필드top_p | 유형number | 요건선택 사항 | 값과 한도 모델에 따라 다름 | 기본값— |
필드stop | 유형string|string[] | 요건선택 사항 | 값과 한도 모델에 따라 다름 | 기본값— |
필드tools | 유형function_tool[] | 요건선택 사항 | 값과 한도 모델에 따라 다름 | 기본값— |
필드tools[].type | 유형string | 요건선택 사항 | 값과 한도 모델에 따라 다름 | 기본값— |
필드tools[].function.name | 유형string | 요건필수 | 값과 한도 적용 조건: 함수 도구 지정됨 | 기본값— |
필드tools[].function.description | 유형string | 요건선택 사항 | 값과 한도 | 기본값— |
필드tools[].function.parameters | 유형JSON_schema | 요건선택 사항 | 값과 한도 | 기본값— |
필드tool_choice | 유형string|object | 요건선택 사항 | 값과 한도 모델에 따라 다름 | 기본값— |
필드parallel_tool_calls | 유형boolean | 요건선택 사항 | 값과 한도 모델에 따라 다름 | 기본값— |
필드response_format | 유형object | 요건선택 사항 | 값과 한도 모델에 따라 다름 | 기본값— |
필드reasoning_effort | 유형string | 요건선택 사항 | 값과 한도 모델에 따라 다름 | 기본값— |
필드reasoning | 유형object | 요건선택 사항 | 값과 한도 모델에 따라 다름 | 기본값— |
필드service_tier | 유형string | 요건선택 사항 | 값과 한도 모델에 따라 다름 | 기본값— |
필드instructions | 유형string | 요건선택 사항 | 값과 한도 호환성 필드 | 기본값— |
필드functions | 유형function[] | 요건선택 사항 | 값과 한도 모델에 따라 다름 | 기본값— |
필드function_call | 유형string|object | 요건선택 사항 | 값과 한도 모델에 따라 다름 | 기본값— |
필드prompt_cache_options | 유형object | 요건선택 사항 | 값과 한도 모델에 따라 다름 | 기본값— |
입력 자료 조합
텍스트 · UTF8 텍스트
messages[].content
메서드 매개변수와 수명 주기
| 매개변수 | 명세 |
|---|---|
매개변수material_types | 명세text |
매개변수required | 명세model, messages |
매개변수optional_controls | 명세null |
매개변수content_type | 명세application/json |
매개변수text_file_material | 명세실제 UTF-8 콘텐츠를 텍스트로 삽입합니다. 파일 ID/URLs에는 별도의 정확한 지원이 필요합니다 |
수명 주기: exact retained published method
메서드 형식과 ID는 정확합니다. 공급자의 기능 지원과 요청 수락은 별개입니다.
요금
Ailoot 메서드 요금
POST /v1/chat/completions- 입력
- US$0.0002 / 1K
- 출력
- US$0.0002 / 1K
- 캐시 읽기
- US$0.0002 / 1K
- 캐시 쓰기
- US$0.0002 / 1K
- 캐시 쓰기, 5분
- US$0.0002 / 1K tokens
Ailoot는 요청 전에 예상 금액을 미리 확보합니다. 결과를 받은 뒤 측정된 사용량을 기준으로 최종 요금을 정산합니다. 스트리밍 정산에는 최종 사용량 기록을 사용합니다. 금액 확보와 정산 방식 →
요청 예제
Ailoot · OpenAI Chat
set -eu
: "${AILOOT_API_KEY:?Set your Ailoot API key}"
: "${AILOOT_TEXT_FILE:?Set your actual UTF-8 source-material file}"
export AILOOT_TEXT_FILE
python3 - <<'PY_REQUEST'
import json,os
from pathlib import Path
p=json.loads('{"model": "nvidia/llama-3.1-nemotron-safety-guard-8b-v3", "messages": []}')
f=Path(os.environ["AILOOT_TEXT_FILE"])
if not f.is_file():raise SystemExit("Choose your actual UTF-8 source material")
text=f.read_text(encoding="utf-8")
if not text.strip():raise SystemExit("Source material must contain text")
p["messages"]=[{"role":"user","content":"Summarize this material and quote supporting source passages.\n\n"+text}]
Path("request.json").write_text(json.dumps(p,ensure_ascii=False))
PY_REQUEST
curl --fail-with-body --silent --show-error https://api.ailoot.ai/v1/chat/completions \
-H "Authorization: Bearer $AILOOT_API_KEY" -H 'Content-Type: application/json' \
--data-binary @request.json -D response-headers.txt -o result.json
python3 - <<'PY_RESULT'
import json
from pathlib import Path
print(json.dumps(json.loads(Path("result.json").read_text()),ensure_ascii=False,indent=2))
PY_RESULT
from openai import OpenAI
import os
if not os.environ.get("AILOOT_API_KEY", "").strip(): raise SystemExit("Set AILOOT_API_KEY before making a request")
client = OpenAI(base_url="https://api.ailoot.ai/v1", api_key=os.environ["AILOOT_API_KEY"], max_retries=0)
resp = client.chat.completions.create(
model="nvidia/llama-3.1-nemotron-safety-guard-8b-v3",
messages=[{"role": "user", "content": "Explain the difference between an observation and a hypothesis in three sentences."}],
)
import base64, json
from pathlib import Path
def save_result(data, stem="result"):
# Keep every field, including usage, IDs, reasoning and tool requests.
Path(stem + ".json").write_text(json.dumps(data, ensure_ascii=False, indent=2), encoding="utf-8")
print(json.dumps(data, ensure_ascii=False, indent=2))
def save_blob(encoded, suffix, label):
raw = base64.b64decode(encoded, altchars=b"-_", validate=True)
ext = "png" if raw.startswith(b"\x89PNG\r\n\x1a\n") else "jpg" if raw.startswith(b"\xff\xd8") else "webp" if raw[:4] == b"RIFF" and raw[8:12] == b"WEBP" else suffix
file = Path(stem + "-" + label + "." + ext)
file.write_bytes(raw)
print("Saved", file)
for index, block in enumerate(data.get("content") or []):
print("Content", index, json.dumps(block, ensure_ascii=False))
for choice in data.get("choices") or []:
print("Choice", choice.get("index"), json.dumps(choice.get("message", choice.get("delta", {})), ensure_ascii=False))
for index, item in enumerate(data.get("output") or []):
print("Output", index, json.dumps(item, ensure_ascii=False))
if item.get("type") == "image_generation_call" and item.get("result"):
save_blob(item["result"], item.get("output_format") or "bin", "output-" + str(index))
for ci, candidate in enumerate(data.get("candidates") or []):
for pi, part in enumerate((candidate.get("content") or {}).get("parts") or []):
print("Candidate/part", ci, pi, json.dumps(part, ensure_ascii=False))
blob = part.get("inlineData") or part.get("inline_data")
if blob and blob.get("data"):
mime = blob.get("mimeType") or blob.get("mime_type")
suffix = {"image/png":"png", "image/jpeg":"jpg", "image/webp":"webp", "audio/wav":"wav", "audio/mpeg":"mp3", "video/mp4":"mp4"}.get(mime, "bin")
save_blob(blob["data"], suffix, "candidate-" + str(ci) + "-part-" + str(pi))
save_result(resp.to_dict(mode="json"))
import OpenAI from "openai";
if (!process.env.AILOOT_API_KEY?.trim()) throw new Error("Set AILOOT_API_KEY before making a request");
const client = new OpenAI({ baseURL: "https://api.ailoot.ai/v1", apiKey: process.env.AILOOT_API_KEY, maxRetries: 0 });
const resp = await client.chat.completions.create({
model: "nvidia/llama-3.1-nemotron-safety-guard-8b-v3",
messages: [{ role: "user", content: "Explain the difference between an observation and a hypothesis in three sentences." }],
});
import { writeFileSync } from "node:fs";
function saveResult(data, stem = "result") {
writeFileSync(stem + ".json", JSON.stringify(data, null, 2));
console.log(JSON.stringify(data, null, 2));
const saveBlob = (encoded, suffix, label) => {
const raw = Buffer.from(encoded, "base64");
const ext = raw.subarray(0,8).equals(Buffer.from([137,80,78,71,13,10,26,10])) ? "png" : raw[0]===255 && raw[1]===216 ? "jpg" : raw.subarray(0,4).toString()==="RIFF" && raw.subarray(8,12).toString()==="WEBP" ? "webp" : suffix;
const file = `${stem}-${label}.${ext}`;
writeFileSync(file, raw); console.log("Saved", file);
};
for (const [i, block] of (data.content || []).entries()) console.log("Content", i, JSON.stringify(block));
for (const choice of data.choices || []) console.log("Choice", choice.index, JSON.stringify(choice.message || choice.delta || {}));
for (const [i, item] of (data.output || []).entries()) {
console.log("Output", i, JSON.stringify(item));
if (item.type === "image_generation_call" && item.result) saveBlob(item.result, item.output_format || "bin", `output-${i}`);
}
for (const [ci, candidate] of (data.candidates || []).entries()) {
for (const [pi, part] of (candidate.content?.parts || []).entries()) {
console.log("Candidate/part", ci, pi, JSON.stringify(part));
const blob = part.inlineData || part.inline_data;
if (blob?.data) {
const mime = blob.mimeType || blob.mime_type;
const suffix = ({"image/png":"png", "image/jpeg":"jpg", "image/webp":"webp", "audio/wav":"wav", "audio/mpeg":"mp3", "video/mp4":"mp4"})[mime] || "bin";
saveBlob(blob.data, suffix, `candidate-${ci}-part-${pi}`);
}
}
}
}
saveResult(resp);
from openai import OpenAI
import os
from pathlib import Path
if not os.environ.get("AILOOT_API_KEY", "").strip(): raise SystemExit("Set AILOOT_API_KEY before making a request")
client=OpenAI(base_url="https://api.ailoot.ai/v1",api_key=os.environ["AILOOT_API_KEY"],max_retries=0)
import base64, json
from pathlib import Path
def save_result(data, stem="result"):
# Keep every field, including usage, IDs, reasoning and tool requests.
Path(stem + ".json").write_text(json.dumps(data, ensure_ascii=False, indent=2), encoding="utf-8")
print(json.dumps(data, ensure_ascii=False, indent=2))
def save_blob(encoded, suffix, label):
raw = base64.b64decode(encoded, altchars=b"-_", validate=True)
ext = "png" if raw.startswith(b"\x89PNG\r\n\x1a\n") else "jpg" if raw.startswith(b"\xff\xd8") else "webp" if raw[:4] == b"RIFF" and raw[8:12] == b"WEBP" else suffix
file = Path(stem + "-" + label + "." + ext)
file.write_bytes(raw)
print("Saved", file)
for index, block in enumerate(data.get("content") or []):
print("Content", index, json.dumps(block, ensure_ascii=False))
for choice in data.get("choices") or []:
print("Choice", choice.get("index"), json.dumps(choice.get("message", choice.get("delta", {})), ensure_ascii=False))
for index, item in enumerate(data.get("output") or []):
print("Output", index, json.dumps(item, ensure_ascii=False))
if item.get("type") == "image_generation_call" and item.get("result"):
save_blob(item["result"], item.get("output_format") or "bin", "output-" + str(index))
for ci, candidate in enumerate(data.get("candidates") or []):
for pi, part in enumerate((candidate.get("content") or {}).get("parts") or []):
print("Candidate/part", ci, pi, json.dumps(part, ensure_ascii=False))
blob = part.get("inlineData") or part.get("inline_data")
if blob and blob.get("data"):
mime = blob.get("mimeType") or blob.get("mime_type")
suffix = {"image/png":"png", "image/jpeg":"jpg", "image/webp":"webp", "audio/wav":"wav", "audio/mpeg":"mp3", "video/mp4":"mp4"}.get(mime, "bin")
save_blob(blob["data"], suffix, "candidate-" + str(ci) + "-part-" + str(pi))
with client.chat.completions.stream(model='nvidia/llama-3.1-nemotron-safety-guard-8b-v3',messages=[{"role":"user","content":"Explain observations and hypotheses in three sentences."}]) as stream:
with Path("stream-events.jsonl").open("w",encoding="utf-8") as log:
for event in stream:
payload=event.to_dict(mode="json")
log.write(json.dumps(payload,ensure_ascii=False)+"\n"); log.flush()
print(json.dumps(payload,ensure_ascii=False))
final=stream.get_final_completion()
save_result(final.to_dict(mode="json"),"stream-result")
결과 수신 및 저장
Ailoot · OpenAI Chat
json 또는 SSE
완료된 결과 모두 보관
반환된 완전한 응답, 파일, 콘텐츠 부분을 모두 보관하세요.
각 선택지와 그 콘텐츠·도구 호출·추론을 모두 보존하세요. SSE에서는 선택지/도구 인덱스별로 증분을 조합하고 최종 종료 사유와 사용량을 유지하세요.
원래 응답을 확인해야 할 경우
요청/응답 ID와 헤더를 보존하세요. 텍스트 작업을 조회하는 범용 URL은 제공되지 않습니다.
응답 필드
| 필드 | 유형 |
|---|---|
필드choices[].index | 유형integer |
필드choices[].message.content | 유형string|null |
필드choices[].message.tool_calls | 유형tool_call[] |
필드choices[].message.reasoning_content | 유형string |
필드choices[].message.reasoning_details | 유형object|array |
필드choices[].finish_reason | 유형string|null |
필드usage | 유형object |
오류와 다음 단계
| 응답 | 조건 | 다음 단계 |
|---|---|---|
응답400 · invalid_request_error | 조건필수 필드, 자료 표현 방식 또는 파라미터 값이 올바르지 않음 | 다음 단계새 생성 요청 전에 표시된 필드를 수정하세요. |
별칭
모델 별칭
Ailoot nvidia/llama-3.1-nemotron-safety-guard-8b-v3, nemotron-safety-guard, nemotron-safety-guard-latest
메서드 경로 별칭
위에 표시된 메서드 경로를 사용하세요.
관련 호출용 ID
nvidia/llama-3.1-nemotron-safety-guard-8b-v3, nemotron-safety-guard, nemotron-safety-guard-latest
Ailoot · OpenAI Chat POST /v1/chat/completions nemotron-safety-guard
nemotron-safety-guardnvidia/llama-3.1-nemotron-safety-guard-8b-v3nemotron-safety-guardnemotron-safety-guard-latest
시작하기
Nemotron Safety Guard v3는 지정한 위험 분류 체계에 따라 사용자 메시지와 모델 응답을 검사합니다. 각각의 안전성 평가와 위반 카테고리가 포함된 JSON을 반환합니다.
- 허용 입력
- 텍스트
- 결과
- 텍스트
Ailoot에서 사용 가능 · 입력 및 메서드
Ailoot · OpenAI Chat POST /v1/chat/completions
- 입력
text- 출력
text- 컨텍스트
- 4,096 tokens
- 최대 출력
- 1,024 tokens
- 출력 형식
- json 또는 SSE
| 필드 | 유형 | 요건 | 값과 한도 | 기본값 |
|---|---|---|---|---|
필드model | 유형string | 요건필수 | 값과 한도 nemotron-safety-guard | 기본값— |
필드messages | 유형message[] | 요건필수 | 값과 한도 최소 항목 수: 1 | 기본값— |
필드messages[].role | 유형string | 요건필수 | 값과 한도 예시: system, user, assistant, tool, function 조건: 이 역할들은 소스 코드의 호환 타입에 명시적으로 표현됩니다. 정확한 모델 역할 집합은 모델별로 다릅니다. 모델에 따라 다름 | 기본값— |
필드messages[].content | 유형string|content_part[]|null | 요건선택 사항 | 값과 한도 | 기본값— |
필드messages[].tool_calls | 유형tool_call[] | 요건선택 사항 | 값과 한도 | 기본값— |
필드messages[].tool_call_id | 유형string | 요건선택 사항 | 값과 한도 적용 조건: role=tool. 실제 반환된 ID를 사용하세요 | 기본값— |
필드messages[].name | 유형string | 요건선택 사항 | 값과 한도 | 기본값— |
필드messages[].reasoning_content | 유형string | 요건선택 사항 | 값과 한도 적용 조건: 이 모델이 추론을 사용하는 경우 실제 반환된 추론을 그대로 다음 요청에 다시 전달하세요 | 기본값— |
필드messages[].reasoning_details | 유형object|array | 요건선택 사항 | 값과 한도 모델에 따라 다름 | 기본값— |
필드max_tokens | 유형integer | 요건선택 사항 | 값과 한도 최솟값: 1 모델에 따라 다름 | 기본값— |
필드max_completion_tokens | 유형integer | 요건선택 사항 | 값과 한도 최솟값: 1 모델에 따라 다름 | 기본값— |
필드stream | 유형boolean | 요건선택 사항 | 값과 한도 | 기본값false |
필드stream_options.include_usage | 유형boolean | 요건선택 사항 | 값과 한도 모델에 따라 다름 | 기본값— |
필드temperature | 유형number | 요건선택 사항 | 값과 한도 모델에 따라 다름 | 기본값— |
필드top_p | 유형number | 요건선택 사항 | 값과 한도 모델에 따라 다름 | 기본값— |
필드stop | 유형string|string[] | 요건선택 사항 | 값과 한도 모델에 따라 다름 | 기본값— |
필드tools | 유형function_tool[] | 요건선택 사항 | 값과 한도 모델에 따라 다름 | 기본값— |
필드tools[].type | 유형string | 요건선택 사항 | 값과 한도 모델에 따라 다름 | 기본값— |
필드tools[].function.name | 유형string | 요건필수 | 값과 한도 적용 조건: 함수 도구 지정됨 | 기본값— |
필드tools[].function.description | 유형string | 요건선택 사항 | 값과 한도 | 기본값— |
필드tools[].function.parameters | 유형JSON_schema | 요건선택 사항 | 값과 한도 | 기본값— |
필드tool_choice | 유형string|object | 요건선택 사항 | 값과 한도 모델에 따라 다름 | 기본값— |
필드parallel_tool_calls | 유형boolean | 요건선택 사항 | 값과 한도 모델에 따라 다름 | 기본값— |
필드response_format | 유형object | 요건선택 사항 | 값과 한도 모델에 따라 다름 | 기본값— |
필드reasoning_effort | 유형string | 요건선택 사항 | 값과 한도 모델에 따라 다름 | 기본값— |
필드reasoning | 유형object | 요건선택 사항 | 값과 한도 모델에 따라 다름 | 기본값— |
필드service_tier | 유형string | 요건선택 사항 | 값과 한도 모델에 따라 다름 | 기본값— |
필드instructions | 유형string | 요건선택 사항 | 값과 한도 호환성 필드 | 기본값— |
필드functions | 유형function[] | 요건선택 사항 | 값과 한도 모델에 따라 다름 | 기본값— |
필드function_call | 유형string|object | 요건선택 사항 | 값과 한도 모델에 따라 다름 | 기본값— |
필드prompt_cache_options | 유형object | 요건선택 사항 | 값과 한도 모델에 따라 다름 | 기본값— |
입력 자료 조합
텍스트 · UTF8 텍스트
messages[].content
메서드 매개변수와 수명 주기
| 매개변수 | 명세 |
|---|---|
매개변수material_types | 명세text |
매개변수required | 명세model, messages |
매개변수optional_controls | 명세null |
매개변수content_type | 명세application/json |
매개변수text_file_material | 명세실제 UTF-8 콘텐츠를 텍스트로 삽입합니다. 파일 ID/URLs에는 별도의 정확한 지원이 필요합니다 |
수명 주기: exact retained published method
메서드 형식과 ID는 정확합니다. 공급자의 기능 지원과 요청 수락은 별개입니다.
요금
Ailoot 메서드 요금
POST /v1/chat/completions- 입력
- US$0.0002 / 1K
- 출력
- US$0.0002 / 1K
- 캐시 읽기
- US$0.0002 / 1K
- 캐시 쓰기
- US$0.0002 / 1K
- 캐시 쓰기, 5분
- US$0.0002 / 1K tokens
Ailoot는 요청 전에 예상 금액을 미리 확보합니다. 결과를 받은 뒤 측정된 사용량을 기준으로 최종 요금을 정산합니다. 스트리밍 정산에는 최종 사용량 기록을 사용합니다. 금액 확보와 정산 방식 →
요청 예제
Ailoot · OpenAI Chat
set -eu
: "${AILOOT_API_KEY:?Set your Ailoot API key}"
: "${AILOOT_TEXT_FILE:?Set your actual UTF-8 source-material file}"
export AILOOT_TEXT_FILE
python3 - <<'PY_REQUEST'
import json,os
from pathlib import Path
p=json.loads('{"model": "nemotron-safety-guard", "messages": []}')
f=Path(os.environ["AILOOT_TEXT_FILE"])
if not f.is_file():raise SystemExit("Choose your actual UTF-8 source material")
text=f.read_text(encoding="utf-8")
if not text.strip():raise SystemExit("Source material must contain text")
p["messages"]=[{"role":"user","content":"Summarize this material and quote supporting source passages.\n\n"+text}]
Path("request.json").write_text(json.dumps(p,ensure_ascii=False))
PY_REQUEST
curl --fail-with-body --silent --show-error https://api.ailoot.ai/v1/chat/completions \
-H "Authorization: Bearer $AILOOT_API_KEY" -H 'Content-Type: application/json' \
--data-binary @request.json -D response-headers.txt -o result.json
python3 - <<'PY_RESULT'
import json
from pathlib import Path
print(json.dumps(json.loads(Path("result.json").read_text()),ensure_ascii=False,indent=2))
PY_RESULT
from openai import OpenAI
import os
if not os.environ.get("AILOOT_API_KEY", "").strip(): raise SystemExit("Set AILOOT_API_KEY before making a request")
client = OpenAI(base_url="https://api.ailoot.ai/v1", api_key=os.environ["AILOOT_API_KEY"], max_retries=0)
resp = client.chat.completions.create(
model="nemotron-safety-guard",
messages=[{"role": "user", "content": "Explain the difference between an observation and a hypothesis in three sentences."}],
)
import base64, json
from pathlib import Path
def save_result(data, stem="result"):
# Keep every field, including usage, IDs, reasoning and tool requests.
Path(stem + ".json").write_text(json.dumps(data, ensure_ascii=False, indent=2), encoding="utf-8")
print(json.dumps(data, ensure_ascii=False, indent=2))
def save_blob(encoded, suffix, label):
raw = base64.b64decode(encoded, altchars=b"-_", validate=True)
ext = "png" if raw.startswith(b"\x89PNG\r\n\x1a\n") else "jpg" if raw.startswith(b"\xff\xd8") else "webp" if raw[:4] == b"RIFF" and raw[8:12] == b"WEBP" else suffix
file = Path(stem + "-" + label + "." + ext)
file.write_bytes(raw)
print("Saved", file)
for index, block in enumerate(data.get("content") or []):
print("Content", index, json.dumps(block, ensure_ascii=False))
for choice in data.get("choices") or []:
print("Choice", choice.get("index"), json.dumps(choice.get("message", choice.get("delta", {})), ensure_ascii=False))
for index, item in enumerate(data.get("output") or []):
print("Output", index, json.dumps(item, ensure_ascii=False))
if item.get("type") == "image_generation_call" and item.get("result"):
save_blob(item["result"], item.get("output_format") or "bin", "output-" + str(index))
for ci, candidate in enumerate(data.get("candidates") or []):
for pi, part in enumerate((candidate.get("content") or {}).get("parts") or []):
print("Candidate/part", ci, pi, json.dumps(part, ensure_ascii=False))
blob = part.get("inlineData") or part.get("inline_data")
if blob and blob.get("data"):
mime = blob.get("mimeType") or blob.get("mime_type")
suffix = {"image/png":"png", "image/jpeg":"jpg", "image/webp":"webp", "audio/wav":"wav", "audio/mpeg":"mp3", "video/mp4":"mp4"}.get(mime, "bin")
save_blob(blob["data"], suffix, "candidate-" + str(ci) + "-part-" + str(pi))
save_result(resp.to_dict(mode="json"))
import OpenAI from "openai";
if (!process.env.AILOOT_API_KEY?.trim()) throw new Error("Set AILOOT_API_KEY before making a request");
const client = new OpenAI({ baseURL: "https://api.ailoot.ai/v1", apiKey: process.env.AILOOT_API_KEY, maxRetries: 0 });
const resp = await client.chat.completions.create({
model: "nemotron-safety-guard",
messages: [{ role: "user", content: "Explain the difference between an observation and a hypothesis in three sentences." }],
});
import { writeFileSync } from "node:fs";
function saveResult(data, stem = "result") {
writeFileSync(stem + ".json", JSON.stringify(data, null, 2));
console.log(JSON.stringify(data, null, 2));
const saveBlob = (encoded, suffix, label) => {
const raw = Buffer.from(encoded, "base64");
const ext = raw.subarray(0,8).equals(Buffer.from([137,80,78,71,13,10,26,10])) ? "png" : raw[0]===255 && raw[1]===216 ? "jpg" : raw.subarray(0,4).toString()==="RIFF" && raw.subarray(8,12).toString()==="WEBP" ? "webp" : suffix;
const file = `${stem}-${label}.${ext}`;
writeFileSync(file, raw); console.log("Saved", file);
};
for (const [i, block] of (data.content || []).entries()) console.log("Content", i, JSON.stringify(block));
for (const choice of data.choices || []) console.log("Choice", choice.index, JSON.stringify(choice.message || choice.delta || {}));
for (const [i, item] of (data.output || []).entries()) {
console.log("Output", i, JSON.stringify(item));
if (item.type === "image_generation_call" && item.result) saveBlob(item.result, item.output_format || "bin", `output-${i}`);
}
for (const [ci, candidate] of (data.candidates || []).entries()) {
for (const [pi, part] of (candidate.content?.parts || []).entries()) {
console.log("Candidate/part", ci, pi, JSON.stringify(part));
const blob = part.inlineData || part.inline_data;
if (blob?.data) {
const mime = blob.mimeType || blob.mime_type;
const suffix = ({"image/png":"png", "image/jpeg":"jpg", "image/webp":"webp", "audio/wav":"wav", "audio/mpeg":"mp3", "video/mp4":"mp4"})[mime] || "bin";
saveBlob(blob.data, suffix, `candidate-${ci}-part-${pi}`);
}
}
}
}
saveResult(resp);
from openai import OpenAI
import os
from pathlib import Path
if not os.environ.get("AILOOT_API_KEY", "").strip(): raise SystemExit("Set AILOOT_API_KEY before making a request")
client=OpenAI(base_url="https://api.ailoot.ai/v1",api_key=os.environ["AILOOT_API_KEY"],max_retries=0)
import base64, json
from pathlib import Path
def save_result(data, stem="result"):
# Keep every field, including usage, IDs, reasoning and tool requests.
Path(stem + ".json").write_text(json.dumps(data, ensure_ascii=False, indent=2), encoding="utf-8")
print(json.dumps(data, ensure_ascii=False, indent=2))
def save_blob(encoded, suffix, label):
raw = base64.b64decode(encoded, altchars=b"-_", validate=True)
ext = "png" if raw.startswith(b"\x89PNG\r\n\x1a\n") else "jpg" if raw.startswith(b"\xff\xd8") else "webp" if raw[:4] == b"RIFF" and raw[8:12] == b"WEBP" else suffix
file = Path(stem + "-" + label + "." + ext)
file.write_bytes(raw)
print("Saved", file)
for index, block in enumerate(data.get("content") or []):
print("Content", index, json.dumps(block, ensure_ascii=False))
for choice in data.get("choices") or []:
print("Choice", choice.get("index"), json.dumps(choice.get("message", choice.get("delta", {})), ensure_ascii=False))
for index, item in enumerate(data.get("output") or []):
print("Output", index, json.dumps(item, ensure_ascii=False))
if item.get("type") == "image_generation_call" and item.get("result"):
save_blob(item["result"], item.get("output_format") or "bin", "output-" + str(index))
for ci, candidate in enumerate(data.get("candidates") or []):
for pi, part in enumerate((candidate.get("content") or {}).get("parts") or []):
print("Candidate/part", ci, pi, json.dumps(part, ensure_ascii=False))
blob = part.get("inlineData") or part.get("inline_data")
if blob and blob.get("data"):
mime = blob.get("mimeType") or blob.get("mime_type")
suffix = {"image/png":"png", "image/jpeg":"jpg", "image/webp":"webp", "audio/wav":"wav", "audio/mpeg":"mp3", "video/mp4":"mp4"}.get(mime, "bin")
save_blob(blob["data"], suffix, "candidate-" + str(ci) + "-part-" + str(pi))
with client.chat.completions.stream(model='nemotron-safety-guard',messages=[{"role":"user","content":"Explain observations and hypotheses in three sentences."}]) as stream:
with Path("stream-events.jsonl").open("w",encoding="utf-8") as log:
for event in stream:
payload=event.to_dict(mode="json")
log.write(json.dumps(payload,ensure_ascii=False)+"\n"); log.flush()
print(json.dumps(payload,ensure_ascii=False))
final=stream.get_final_completion()
save_result(final.to_dict(mode="json"),"stream-result")
결과 수신 및 저장
Ailoot · OpenAI Chat
json 또는 SSE
완료된 결과 모두 보관
반환된 완전한 응답, 파일, 콘텐츠 부분을 모두 보관하세요.
각 선택지와 그 콘텐츠·도구 호출·추론을 모두 보존하세요. SSE에서는 선택지/도구 인덱스별로 증분을 조합하고 최종 종료 사유와 사용량을 유지하세요.
원래 응답을 확인해야 할 경우
요청/응답 ID와 헤더를 보존하세요. 텍스트 작업을 조회하는 범용 URL은 제공되지 않습니다.
응답 필드
| 필드 | 유형 |
|---|---|
필드choices[].index | 유형integer |
필드choices[].message.content | 유형string|null |
필드choices[].message.tool_calls | 유형tool_call[] |
필드choices[].message.reasoning_content | 유형string |
필드choices[].message.reasoning_details | 유형object|array |
필드choices[].finish_reason | 유형string|null |
필드usage | 유형object |
오류와 다음 단계
| 응답 | 조건 | 다음 단계 |
|---|---|---|
응답400 · invalid_request_error | 조건필수 필드, 자료 표현 방식 또는 파라미터 값이 올바르지 않음 | 다음 단계새 생성 요청 전에 표시된 필드를 수정하세요. |
별칭
모델 별칭
Ailoot nvidia/llama-3.1-nemotron-safety-guard-8b-v3, nemotron-safety-guard, nemotron-safety-guard-latest
메서드 경로 별칭
위에 표시된 메서드 경로를 사용하세요.
관련 호출용 ID
nvidia/llama-3.1-nemotron-safety-guard-8b-v3, nemotron-safety-guard, nemotron-safety-guard-latest
Ailoot · OpenAI Chat POST /v1/chat/completions nemotron-safety-guard-latest
nemotron-safety-guard-latestnvidia/llama-3.1-nemotron-safety-guard-8b-v3nemotron-safety-guardnemotron-safety-guard-latest
시작하기
Nemotron Safety Guard v3는 지정한 위험 분류 체계에 따라 사용자 메시지와 모델 응답을 검사합니다. 각각의 안전성 평가와 위반 카테고리가 포함된 JSON을 반환합니다.
- 허용 입력
- 텍스트
- 결과
- 텍스트
Ailoot에서 사용 가능 · 입력 및 메서드
Ailoot · OpenAI Chat POST /v1/chat/completions
- 입력
text- 출력
text- 컨텍스트
- 4,096 tokens
- 최대 출력
- 1,024 tokens
- 출력 형식
- json 또는 SSE
| 필드 | 유형 | 요건 | 값과 한도 | 기본값 |
|---|---|---|---|---|
필드model | 유형string | 요건필수 | 값과 한도 nemotron-safety-guard-latest | 기본값— |
필드messages | 유형message[] | 요건필수 | 값과 한도 최소 항목 수: 1 | 기본값— |
필드messages[].role | 유형string | 요건필수 | 값과 한도 예시: system, user, assistant, tool, function 조건: 이 역할들은 소스 코드의 호환 타입에 명시적으로 표현됩니다. 정확한 모델 역할 집합은 모델별로 다릅니다. 모델에 따라 다름 | 기본값— |
필드messages[].content | 유형string|content_part[]|null | 요건선택 사항 | 값과 한도 | 기본값— |
필드messages[].tool_calls | 유형tool_call[] | 요건선택 사항 | 값과 한도 | 기본값— |
필드messages[].tool_call_id | 유형string | 요건선택 사항 | 값과 한도 적용 조건: role=tool. 실제 반환된 ID를 사용하세요 | 기본값— |
필드messages[].name | 유형string | 요건선택 사항 | 값과 한도 | 기본값— |
필드messages[].reasoning_content | 유형string | 요건선택 사항 | 값과 한도 적용 조건: 이 모델이 추론을 사용하는 경우 실제 반환된 추론을 그대로 다음 요청에 다시 전달하세요 | 기본값— |
필드messages[].reasoning_details | 유형object|array | 요건선택 사항 | 값과 한도 모델에 따라 다름 | 기본값— |
필드max_tokens | 유형integer | 요건선택 사항 | 값과 한도 최솟값: 1 모델에 따라 다름 | 기본값— |
필드max_completion_tokens | 유형integer | 요건선택 사항 | 값과 한도 최솟값: 1 모델에 따라 다름 | 기본값— |
필드stream | 유형boolean | 요건선택 사항 | 값과 한도 | 기본값false |
필드stream_options.include_usage | 유형boolean | 요건선택 사항 | 값과 한도 모델에 따라 다름 | 기본값— |
필드temperature | 유형number | 요건선택 사항 | 값과 한도 모델에 따라 다름 | 기본값— |
필드top_p | 유형number | 요건선택 사항 | 값과 한도 모델에 따라 다름 | 기본값— |
필드stop | 유형string|string[] | 요건선택 사항 | 값과 한도 모델에 따라 다름 | 기본값— |
필드tools | 유형function_tool[] | 요건선택 사항 | 값과 한도 모델에 따라 다름 | 기본값— |
필드tools[].type | 유형string | 요건선택 사항 | 값과 한도 모델에 따라 다름 | 기본값— |
필드tools[].function.name | 유형string | 요건필수 | 값과 한도 적용 조건: 함수 도구 지정됨 | 기본값— |
필드tools[].function.description | 유형string | 요건선택 사항 | 값과 한도 | 기본값— |
필드tools[].function.parameters | 유형JSON_schema | 요건선택 사항 | 값과 한도 | 기본값— |
필드tool_choice | 유형string|object | 요건선택 사항 | 값과 한도 모델에 따라 다름 | 기본값— |
필드parallel_tool_calls | 유형boolean | 요건선택 사항 | 값과 한도 모델에 따라 다름 | 기본값— |
필드response_format | 유형object | 요건선택 사항 | 값과 한도 모델에 따라 다름 | 기본값— |
필드reasoning_effort | 유형string | 요건선택 사항 | 값과 한도 모델에 따라 다름 | 기본값— |
필드reasoning | 유형object | 요건선택 사항 | 값과 한도 모델에 따라 다름 | 기본값— |
필드service_tier | 유형string | 요건선택 사항 | 값과 한도 모델에 따라 다름 | 기본값— |
필드instructions | 유형string | 요건선택 사항 | 값과 한도 호환성 필드 | 기본값— |
필드functions | 유형function[] | 요건선택 사항 | 값과 한도 모델에 따라 다름 | 기본값— |
필드function_call | 유형string|object | 요건선택 사항 | 값과 한도 모델에 따라 다름 | 기본값— |
필드prompt_cache_options | 유형object | 요건선택 사항 | 값과 한도 모델에 따라 다름 | 기본값— |
입력 자료 조합
텍스트 · UTF8 텍스트
messages[].content
메서드 매개변수와 수명 주기
| 매개변수 | 명세 |
|---|---|
매개변수material_types | 명세text |
매개변수required | 명세model, messages |
매개변수optional_controls | 명세null |
매개변수content_type | 명세application/json |
매개변수text_file_material | 명세실제 UTF-8 콘텐츠를 텍스트로 삽입합니다. 파일 ID/URLs에는 별도의 정확한 지원이 필요합니다 |
수명 주기: exact retained published method
메서드 형식과 ID는 정확합니다. 공급자의 기능 지원과 요청 수락은 별개입니다.
요금
Ailoot 메서드 요금
POST /v1/chat/completions- 입력
- US$0.0002 / 1K
- 출력
- US$0.0002 / 1K
- 캐시 읽기
- US$0.0002 / 1K
- 캐시 쓰기
- US$0.0002 / 1K
- 캐시 쓰기, 5분
- US$0.0002 / 1K tokens
Ailoot는 요청 전에 예상 금액을 미리 확보합니다. 결과를 받은 뒤 측정된 사용량을 기준으로 최종 요금을 정산합니다. 스트리밍 정산에는 최종 사용량 기록을 사용합니다. 금액 확보와 정산 방식 →
요청 예제
Ailoot · OpenAI Chat
set -eu
: "${AILOOT_API_KEY:?Set your Ailoot API key}"
: "${AILOOT_TEXT_FILE:?Set your actual UTF-8 source-material file}"
export AILOOT_TEXT_FILE
python3 - <<'PY_REQUEST'
import json,os
from pathlib import Path
p=json.loads('{"model": "nemotron-safety-guard-latest", "messages": []}')
f=Path(os.environ["AILOOT_TEXT_FILE"])
if not f.is_file():raise SystemExit("Choose your actual UTF-8 source material")
text=f.read_text(encoding="utf-8")
if not text.strip():raise SystemExit("Source material must contain text")
p["messages"]=[{"role":"user","content":"Summarize this material and quote supporting source passages.\n\n"+text}]
Path("request.json").write_text(json.dumps(p,ensure_ascii=False))
PY_REQUEST
curl --fail-with-body --silent --show-error https://api.ailoot.ai/v1/chat/completions \
-H "Authorization: Bearer $AILOOT_API_KEY" -H 'Content-Type: application/json' \
--data-binary @request.json -D response-headers.txt -o result.json
python3 - <<'PY_RESULT'
import json
from pathlib import Path
print(json.dumps(json.loads(Path("result.json").read_text()),ensure_ascii=False,indent=2))
PY_RESULT
from openai import OpenAI
import os
if not os.environ.get("AILOOT_API_KEY", "").strip(): raise SystemExit("Set AILOOT_API_KEY before making a request")
client = OpenAI(base_url="https://api.ailoot.ai/v1", api_key=os.environ["AILOOT_API_KEY"], max_retries=0)
resp = client.chat.completions.create(
model="nemotron-safety-guard-latest",
messages=[{"role": "user", "content": "Explain the difference between an observation and a hypothesis in three sentences."}],
)
import base64, json
from pathlib import Path
def save_result(data, stem="result"):
# Keep every field, including usage, IDs, reasoning and tool requests.
Path(stem + ".json").write_text(json.dumps(data, ensure_ascii=False, indent=2), encoding="utf-8")
print(json.dumps(data, ensure_ascii=False, indent=2))
def save_blob(encoded, suffix, label):
raw = base64.b64decode(encoded, altchars=b"-_", validate=True)
ext = "png" if raw.startswith(b"\x89PNG\r\n\x1a\n") else "jpg" if raw.startswith(b"\xff\xd8") else "webp" if raw[:4] == b"RIFF" and raw[8:12] == b"WEBP" else suffix
file = Path(stem + "-" + label + "." + ext)
file.write_bytes(raw)
print("Saved", file)
for index, block in enumerate(data.get("content") or []):
print("Content", index, json.dumps(block, ensure_ascii=False))
for choice in data.get("choices") or []:
print("Choice", choice.get("index"), json.dumps(choice.get("message", choice.get("delta", {})), ensure_ascii=False))
for index, item in enumerate(data.get("output") or []):
print("Output", index, json.dumps(item, ensure_ascii=False))
if item.get("type") == "image_generation_call" and item.get("result"):
save_blob(item["result"], item.get("output_format") or "bin", "output-" + str(index))
for ci, candidate in enumerate(data.get("candidates") or []):
for pi, part in enumerate((candidate.get("content") or {}).get("parts") or []):
print("Candidate/part", ci, pi, json.dumps(part, ensure_ascii=False))
blob = part.get("inlineData") or part.get("inline_data")
if blob and blob.get("data"):
mime = blob.get("mimeType") or blob.get("mime_type")
suffix = {"image/png":"png", "image/jpeg":"jpg", "image/webp":"webp", "audio/wav":"wav", "audio/mpeg":"mp3", "video/mp4":"mp4"}.get(mime, "bin")
save_blob(blob["data"], suffix, "candidate-" + str(ci) + "-part-" + str(pi))
save_result(resp.to_dict(mode="json"))
import OpenAI from "openai";
if (!process.env.AILOOT_API_KEY?.trim()) throw new Error("Set AILOOT_API_KEY before making a request");
const client = new OpenAI({ baseURL: "https://api.ailoot.ai/v1", apiKey: process.env.AILOOT_API_KEY, maxRetries: 0 });
const resp = await client.chat.completions.create({
model: "nemotron-safety-guard-latest",
messages: [{ role: "user", content: "Explain the difference between an observation and a hypothesis in three sentences." }],
});
import { writeFileSync } from "node:fs";
function saveResult(data, stem = "result") {
writeFileSync(stem + ".json", JSON.stringify(data, null, 2));
console.log(JSON.stringify(data, null, 2));
const saveBlob = (encoded, suffix, label) => {
const raw = Buffer.from(encoded, "base64");
const ext = raw.subarray(0,8).equals(Buffer.from([137,80,78,71,13,10,26,10])) ? "png" : raw[0]===255 && raw[1]===216 ? "jpg" : raw.subarray(0,4).toString()==="RIFF" && raw.subarray(8,12).toString()==="WEBP" ? "webp" : suffix;
const file = `${stem}-${label}.${ext}`;
writeFileSync(file, raw); console.log("Saved", file);
};
for (const [i, block] of (data.content || []).entries()) console.log("Content", i, JSON.stringify(block));
for (const choice of data.choices || []) console.log("Choice", choice.index, JSON.stringify(choice.message || choice.delta || {}));
for (const [i, item] of (data.output || []).entries()) {
console.log("Output", i, JSON.stringify(item));
if (item.type === "image_generation_call" && item.result) saveBlob(item.result, item.output_format || "bin", `output-${i}`);
}
for (const [ci, candidate] of (data.candidates || []).entries()) {
for (const [pi, part] of (candidate.content?.parts || []).entries()) {
console.log("Candidate/part", ci, pi, JSON.stringify(part));
const blob = part.inlineData || part.inline_data;
if (blob?.data) {
const mime = blob.mimeType || blob.mime_type;
const suffix = ({"image/png":"png", "image/jpeg":"jpg", "image/webp":"webp", "audio/wav":"wav", "audio/mpeg":"mp3", "video/mp4":"mp4"})[mime] || "bin";
saveBlob(blob.data, suffix, `candidate-${ci}-part-${pi}`);
}
}
}
}
saveResult(resp);
from openai import OpenAI
import os
from pathlib import Path
if not os.environ.get("AILOOT_API_KEY", "").strip(): raise SystemExit("Set AILOOT_API_KEY before making a request")
client=OpenAI(base_url="https://api.ailoot.ai/v1",api_key=os.environ["AILOOT_API_KEY"],max_retries=0)
import base64, json
from pathlib import Path
def save_result(data, stem="result"):
# Keep every field, including usage, IDs, reasoning and tool requests.
Path(stem + ".json").write_text(json.dumps(data, ensure_ascii=False, indent=2), encoding="utf-8")
print(json.dumps(data, ensure_ascii=False, indent=2))
def save_blob(encoded, suffix, label):
raw = base64.b64decode(encoded, altchars=b"-_", validate=True)
ext = "png" if raw.startswith(b"\x89PNG\r\n\x1a\n") else "jpg" if raw.startswith(b"\xff\xd8") else "webp" if raw[:4] == b"RIFF" and raw[8:12] == b"WEBP" else suffix
file = Path(stem + "-" + label + "." + ext)
file.write_bytes(raw)
print("Saved", file)
for index, block in enumerate(data.get("content") or []):
print("Content", index, json.dumps(block, ensure_ascii=False))
for choice in data.get("choices") or []:
print("Choice", choice.get("index"), json.dumps(choice.get("message", choice.get("delta", {})), ensure_ascii=False))
for index, item in enumerate(data.get("output") or []):
print("Output", index, json.dumps(item, ensure_ascii=False))
if item.get("type") == "image_generation_call" and item.get("result"):
save_blob(item["result"], item.get("output_format") or "bin", "output-" + str(index))
for ci, candidate in enumerate(data.get("candidates") or []):
for pi, part in enumerate((candidate.get("content") or {}).get("parts") or []):
print("Candidate/part", ci, pi, json.dumps(part, ensure_ascii=False))
blob = part.get("inlineData") or part.get("inline_data")
if blob and blob.get("data"):
mime = blob.get("mimeType") or blob.get("mime_type")
suffix = {"image/png":"png", "image/jpeg":"jpg", "image/webp":"webp", "audio/wav":"wav", "audio/mpeg":"mp3", "video/mp4":"mp4"}.get(mime, "bin")
save_blob(blob["data"], suffix, "candidate-" + str(ci) + "-part-" + str(pi))
with client.chat.completions.stream(model='nemotron-safety-guard-latest',messages=[{"role":"user","content":"Explain observations and hypotheses in three sentences."}]) as stream:
with Path("stream-events.jsonl").open("w",encoding="utf-8") as log:
for event in stream:
payload=event.to_dict(mode="json")
log.write(json.dumps(payload,ensure_ascii=False)+"\n"); log.flush()
print(json.dumps(payload,ensure_ascii=False))
final=stream.get_final_completion()
save_result(final.to_dict(mode="json"),"stream-result")
결과 수신 및 저장
Ailoot · OpenAI Chat
json 또는 SSE
완료된 결과 모두 보관
반환된 완전한 응답, 파일, 콘텐츠 부분을 모두 보관하세요.
각 선택지와 그 콘텐츠·도구 호출·추론을 모두 보존하세요. SSE에서는 선택지/도구 인덱스별로 증분을 조합하고 최종 종료 사유와 사용량을 유지하세요.
원래 응답을 확인해야 할 경우
요청/응답 ID와 헤더를 보존하세요. 텍스트 작업을 조회하는 범용 URL은 제공되지 않습니다.
응답 필드
| 필드 | 유형 |
|---|---|
필드choices[].index | 유형integer |
필드choices[].message.content | 유형string|null |
필드choices[].message.tool_calls | 유형tool_call[] |
필드choices[].message.reasoning_content | 유형string |
필드choices[].message.reasoning_details | 유형object|array |
필드choices[].finish_reason | 유형string|null |
필드usage | 유형object |
오류와 다음 단계
| 응답 | 조건 | 다음 단계 |
|---|---|---|
응답400 · invalid_request_error | 조건필수 필드, 자료 표현 방식 또는 파라미터 값이 올바르지 않음 | 다음 단계새 생성 요청 전에 표시된 필드를 수정하세요. |
별칭
모델 별칭
Ailoot nvidia/llama-3.1-nemotron-safety-guard-8b-v3, nemotron-safety-guard, nemotron-safety-guard-latest
메서드 경로 별칭
위에 표시된 메서드 경로를 사용하세요.
관련 호출용 ID
nvidia/llama-3.1-nemotron-safety-guard-8b-v3, nemotron-safety-guard, nemotron-safety-guard-latest
FAQ · nvidia/llama-3.1-nemotron-safety-guard-8b-v3
- 어떤 입력과 결과를 사용할 수 있나요?
POST /v1/chat/completions·nvidia/llama-3.1-nemotron-safety-guard-8b-v3:text→textPOST /v1/chat/completions·nemotron-safety-guard:text→textPOST /v1/chat/completions·nemotron-safety-guard-latest:text→text- 요청은 어떤 필드를 사용하나요?
POST /v1/chat/completions·nvidia/llama-3.1-nemotron-safety-guard-8b-v3:model,messages,streamPOST /v1/chat/completions·nemotron-safety-guard:model,messages,streamPOST /v1/chat/completions·nemotron-safety-guard-latest:model,messages,stream- 어떤 제한이 적용되나요?
POST /v1/chat/completions·nvidia/llama-3.1-nemotron-safety-guard-8b-v3:ctx:4096;max_out:1024;messages.min_items:1POST /v1/chat/completions·nemotron-safety-guard:ctx:4096;max_out:1024;messages.min_items:1POST /v1/chat/completions·nemotron-safety-guard-latest:ctx:4096;max_out:1024;messages.min_items:1