Keyboard shortcuts

Press ← or → to navigate between chapters

Press ? to show this help

Press Esc to hide this help

온라인 모델 추론 HTTP API

직접 모델 배포와 Modeling Objective 온라인 배포는 HTTP 엔드포인트로 모델을 호출할 수 있습니다. Query 화면, 모델 함수 또는 아래 API를 사용합니다.

엔드포인트와 공통 인증

방식경로와 지원 범위
Multi I/O V2/foundry-ml-live/api/inference/transform/{전체 배포 RID}/v2이며 입력 및 출력 하나 이상을 지원합니다. 직접 배포와 목표 배포에서 사용합니다.
Single I/O V1같은 경로에서 /v2를 뺍니다. 단일 표 입력 및 출력 모델만 처리하며 Modeling Objective 배포에만 남아 있는 종료 예정 경로입니다. 신규 구현에는 V2를 권장합니다.

모두 POST와 Bearer 인증을 사용합니다. Content-Type은 application/json, Authorization은 Bearer 접두사와 실제 토큰입니다. 성공하면 HTTP 200 및 배포한 모델 API에 맞는 JSON을 반환합니다.

예제에서 사용하는 값은 다음과 같습니다.

변수값
FOUNDRY_URL배포 Query 탭에서 복사한 요청 중 /foundry-ml-live/ 앞의 HTTPS 환경 URL입니다.
DEPLOYMENT_RID같은 요청이나 배포 정보에서 확인한 완전한 배포 RID입니다. 모델 리소스 RID 또는 UUID 일부와 구분합니다.
FOUNDRY_TOKEN안전하게 외부에서 제공한 Foundry 인증 토큰입니다. 소스 파일에 값을 넣지 않습니다.

전체 RID에 ri.foundry-ml-live 접두사가 포함되어 있으므로 URL을 만들 때 접두사를 다시 붙이지 않습니다. JavaScript 예제는 Node.js 18 이상에서 .mjs 파일로 실행하는 모듈 코드이며 전역 fetch와 최상위 await를 사용합니다.

V2의 이름 있는 입력과 출력

예시 모델의 inference_data 입력은 text 열을 가진 표이고 output_data 출력에는 prediction 열이 있습니다.

요청은 모델 입력 이름을 키로 사용합니다.

{
  "inference_data": [{"text": "Hello, how are you?"}]
}

응답 구조 예시는 다음과 같습니다. prediction의 문자열은 실제 모델 계산 결과입니다.

{
  "output_data": [{"prediction": "모델이 생성한 텍스트"}]
}

curl

HTTP/2를 지원하는 curl에서 환경 값을 지정한 뒤 사용합니다.

: "${FOUNDRY_URL:?Set the environment URL from the deployment Query tab}"
: "${DEPLOYMENT_RID:?Set the full live deployment RID}"
: "${FOUNDRY_TOKEN:?Provide your Foundry token securely}"

curl --http2 --request POST \
  --header "Content-Type: application/json" \
  --header "Authorization: Bearer ${FOUNDRY_TOKEN}" \
  --data '{"inference_data":[{"text":"Hello, how are you?"}]}' \
  "${FOUNDRY_URL%/}/foundry-ml-live/api/inference/transform/${DEPLOYMENT_RID}/v2"

Python

requests 패키지를 사용합니다. HTTP 오류는 예외로 전달합니다.

import os
import requests

url = (
    os.environ["FOUNDRY_URL"].rstrip("/")
    + "/foundry-ml-live/api/inference/transform/"
    + os.environ["DEPLOYMENT_RID"]
    + "/v2"
)
response = requests.post(
    url,
    json={"inference_data": [{"text": "Hello, how are you?"}]},
    headers={
        "Content-Type": "application/json",
        "Authorization": "Bearer " + os.environ["FOUNDRY_TOKEN"],
    },
)
response.raise_for_status()
print(response.json())

JavaScript

다음 내용을 query-v2.mjs 같은 파일에 둡니다.

const { FOUNDRY_URL, DEPLOYMENT_RID, FOUNDRY_TOKEN } = process.env;
if (!FOUNDRY_URL || !DEPLOYMENT_RID || !FOUNDRY_TOKEN) {
  throw new Error("Set FOUNDRY_URL, DEPLOYMENT_RID and FOUNDRY_TOKEN.");
}
const url = `${FOUNDRY_URL.replace(/\/+$/, "")}/foundry-ml-live/api/inference/transform/${DEPLOYMENT_RID}/v2`;
const response = await fetch(url, {
  method: "POST",
  headers: {
    "Content-Type": "application/json",
    Authorization: `Bearer ${FOUNDRY_TOKEN}`,
  },
  body: JSON.stringify({ inference_data: [{ text: "Hello, how are you?" }] }),
});
if (!response.ok) {
  throw new Error(`${response.status}: ${response.statusText}`);
}
console.log(await response.json());

여러 입력과 출력

입력마다 모델 API에 선언한 이름을 JSON 필드로 사용합니다.

{
  "table_1": [{"text": "Text for table one"}],
  "table_2": [{"text": "Text for table two"}]
}

출력도 각각의 이름을 가진 객체로 반환합니다. 다음 문자열은 형식을 설명하는 예시입니다.

{
  "table_1_out": [{"text": "Result for table one"}],
  "table_2_out": [{"text": "Result for table two"}]
}

V1의 단일 표 입력과 출력

이 경로는 Modeling Objective의 기존 single I/O 모델에만 사용합니다. 요청의 requestData는 입력 행 배열이며 예제에서는 requestParams에 빈 객체를 전달합니다.

{
  "requestData": [{"text": "Hello, how are you?"}],
  "requestParams": {}
}

응답은 모델을 식별하는 modelUuid 문자열과 결과 행 배열 responseData를 담습니다. 아래 식별자와 텍스트는 응답 구조를 설명하는 예시 값입니다.

{
  "modelUuid": "000-000-000",
  "responseData": [{"prediction": "모델이 생성한 텍스트"}]
}

curl

: "${FOUNDRY_URL:?Set the environment URL from the deployment Query tab}"
: "${DEPLOYMENT_RID:?Set the full live deployment RID}"
: "${FOUNDRY_TOKEN:?Provide your Foundry token securely}"

curl --http2 --request POST \
  --header "Content-Type: application/json" \
  --header "Authorization: Bearer ${FOUNDRY_TOKEN}" \
  --data '{"requestData":[{"text":"Hello, how are you?"}],"requestParams":{}}' \
  "${FOUNDRY_URL%/}/foundry-ml-live/api/inference/transform/${DEPLOYMENT_RID}"

Python

import os
import requests

url = (
    os.environ["FOUNDRY_URL"].rstrip("/")
    + "/foundry-ml-live/api/inference/transform/"
    + os.environ["DEPLOYMENT_RID"]
)
response = requests.post(
    url,
    json={
        "requestData": [{"text": "Hello, how are you?"}],
        "requestParams": {},
    },
    headers={
        "Content-Type": "application/json",
        "Authorization": "Bearer " + os.environ["FOUNDRY_TOKEN"],
    },
)
response.raise_for_status()
print(response.json()["responseData"])

JavaScript

다음은 query-v1.mjs처럼 별도 모듈로 실행하는 V1 호출입니다.

const { FOUNDRY_URL, DEPLOYMENT_RID, FOUNDRY_TOKEN } = process.env;
if (!FOUNDRY_URL || !DEPLOYMENT_RID || !FOUNDRY_TOKEN) {
  throw new Error("Set FOUNDRY_URL, DEPLOYMENT_RID and FOUNDRY_TOKEN.");
}
const url = `${FOUNDRY_URL.replace(/\/+$/, "")}/foundry-ml-live/api/inference/transform/${DEPLOYMENT_RID}`;
const response = await fetch(url, {
  method: "POST",
  headers: {
    "Content-Type": "application/json",
    Authorization: `Bearer ${FOUNDRY_TOKEN}`,
  },
  body: JSON.stringify({
    requestData: [{ text: "Hello, how are you?" }],
    requestParams: {},
  }),
});
if (!response.ok) {
  throw new Error(`${response.status}: ${response.statusText}`);
}
const result = await response.json();
console.log(result.responseData);

오류

HTTP 상태원인과 처리
400잘못된 요청, 모델 API와 맞지 않는 입력 또는 추론 실패입니다. 모델 예외의 스택 추적이 응답 본문에 포함될 수 있습니다.
422요청 형식 오류입니다. JSON 문법과 모델이 기대하는 형식을 확인합니다.
429요청이 너무 많습니다. 환경별 한도를 확인하고 동시성을 낮추거나 backoff를 두고 재시도합니다.
500내부 서버 또는 배포 오류입니다. 운영자의 조치가 필요할 수 있습니다.
503서비스 또는 배포를 사용할 수 없습니다. 자원 부족, 메모리 부족, 동시 요청 처리 한도나 자동 재시작 중일 수 있습니다. backoff 재시도 또는 운영자 조치가 필요할 수 있습니다.

배포 로그 또는 직접 배포의 로그와 프로파일링에서 실행 상태를 함께 확인합니다. 위 예제는 별도의 자동 재시도 루프를 추가하지 않습니다.