응답 완료를 기다리며 대화 추가(Blocking Continue Session) (V2)
생성한 세션에 첫 대화를 추가하거나 기존 대화를 이어갑니다. 사용자 입력으로 새 대화 교환을 추가하고 Agent 응답이 완전히 생성될 때까지 기다린 뒤 결과를 반환합니다. 토큰 사용과 구성한 도구 실행이 발생할 수 있으므로 실제 입력과 세션을 확인하여 호출합니다.
같은 세션에 대화를 이어가는 요청을 동시에 보낼 수 없습니다. 응답을 받은 뒤 다음 메시지를 보냅니다. 생성 중인 텍스트를 받으려면 Streaming Continue Session을 사용합니다.
이 엔드포인트는 미리보기 기능이며 언제든 변경되거나 제거될 수 있습니다. 사용하려면 preview=true를 지정합니다.
HTTP 요청
POST /api/v2/aipAgents/agents/{agentRid}/sessions/{sessionRid}/blockingContinue
작업 식별자는 v2.blockingContinueSession입니다. OAuth2로 호출하는 타사 애플리케이션에는 api:aip-agents-write 권한 범위가 필요합니다. 각 요청에 Authorization: Bearer <접근 토큰>을 전달합니다.
경로 매개변수
| 이름 | 자료형 | 필수 여부 | 의미와 조건 | 예시 값 |
|---|---|---|---|---|
agentRid | string | 필수 | AIP Chatbot Studio에서 만든 챗봇의 Agent RID입니다. | ri.aip-agents..agent.732cd5b4-7ca7-4219-aabb-6e976faf63b1 |
sessionRid | string | 필수 | 대화 세션의 RID입니다. | ri.aip-agents..session.292db3b2-b653-4de6-971c-7e97a7b881d6 |
쿼리 매개변수
| 이름 | 자료형 | 필수 여부 | 의미와 조건 | 예시 값 |
|---|---|---|---|---|
preview | boolean | 선택 | 미리보기 기능 사용을 활성화합니다. | true |
요청 본문
BlockingContinueSessionRequest 본문은 필수입니다. parameterInputs의 변수 ID와 유형은 세션에 연결된 Agent 버전의 정의와 맞아야 합니다. contextsOverride를 지정하면 자동 검색을 생략합니다. 빈 배열을 전달하는 것과 이 필드를 생략하는 것을 구분합니다.
| 이름 | 자료형 | 필수 여부 | 의미와 조건 | 예시 값 |
|---|---|---|---|---|
userInput | object | 필수 | Agent가 응답할 사용자 메시지입니다. | 본문 예시 참조 |
parameterInputs | map<ParameterId, ParameterValue> | 선택 | 이번 대화에서 Agent에 전달할 애플리케이션 변수 값입니다. | 본문 예시 참조 |
contextsOverride | list<InputContext> | 선택 | 지정하면 자동 컨텍스트 검색을 건너뛰고 전달한 목록을 Agent에 제공합니다. 생략하면 이 세션의 Agent에 구성한 데이터 소스에서 사용자 메시지와 관련된 컨텍스트를 자동 검색하여 프롬프트에 포함합니다. | |
sessionTraceId | string | 선택 | 이번 대화의 추적 ID입니다. 클라이언트가 생성하여 전달하면 응답을 생성하는 동안 별도 요청으로 추적을 조회할 수 있습니다. 생략하면 자동 생성하며 SessionExchangeResult.sessionTraceId에서 확인합니다. | 12345678-1234-5678-1234-123456789abc |
userInput의 구조
| 이름 | 자료형 | 필수 여부 | 의미와 조건 | 예시 값 |
|---|---|---|---|---|
text | string | 필수 | 사용자 메시지의 텍스트입니다. | What is the status of my order? |
parameterInputs의 구조
맵의 키는 ParameterId(string), 값은 ParameterValue(union<string, objectSet>)입니다.
키: AIP Chatbot Studio에서 구성한 애플리케이션 상태 변수의 고유 식별자입니다.
Agent의 애플리케이션 상태에 구성한 변수에 전달하는 값입니다.
분기 string
StringParameter 애플리케이션 변수의 문자열 값입니다.
| 이름 | 자료형 | 필수 여부 | 의미와 조건 | 예시 값 |
|---|---|---|---|---|
type | enum | 필수 | 분기를 구분하는 type 값입니다. 허용값: string. | string |
value | string | 필수 | Titan Technologies |
분기 objectSet
ObjectSetParameter 애플리케이션 변수에 전달하는 값입니다.
| 이름 | 자료형 | 필수 여부 | 의미와 조건 | 예시 값 |
|---|---|---|---|---|
type | enum | 필수 | 분기를 구분하는 type 값입니다. 허용값: objectSet. | objectSet |
objectSet | ObjectSet | 필수 | 온톨로지의 객체 집합 정의입니다. | |
ontology | string | 필수 | 입력 ObjectSet이 속한 온톨로지의 API 이름입니다. List ontologies API나 Ontology Manager에서 확인합니다. |
objectSet의 구조
ObjectSet의 15가지 구성 방식과 중첩 필드는 객체 집합 정의를 따릅니다. 조건식은 검색 조건, 속성 선택은 속성 식별자와 로드 수준, 계산 필드는 파생 속성, 공간 조건은 공간 필터를 사용합니다. 실험적 분기와 각 연산의 한도 및 입력 조건도 함께 적용합니다.
contextsOverride의 구조
배열 항목은 InputContext이며 자료형은 union<functionRetrievedContext, objectContext>입니다.
세션을 이어갈 때 Agent에 제공하는 사용자 지정 검색 컨텍스트입니다.
분기 functionRetrievedContext
Agent 프롬프트에 추가하기 위해 함수를 실행하여 얻은 컨텍스트입니다.
| 이름 | 자료형 | 필수 여부 | 의미와 조건 | 예시 값 |
|---|---|---|---|---|
type | enum | 필수 | 분기를 구분하는 type 값입니다. 허용값: functionRetrievedContext. | functionRetrievedContext |
functionRid | string | 필수 | 함수의 고유 리소스 식별자이며 다른 Foundry API와 연계할 때 사용합니다. | ri.function-registry.main.function.8cb2d957-f0e6-4e0c-81de-e701bd54b18c |
functionVersion | string | 필수 | 함수 버전은 <major>.<minor>.<patch>-<tag> 형식이며 -<tag>는 생략할 수 있습니다. 예: 1.2.3, 1.2.3-rc1. | 1.2.3 |
retrievedPrompt | string | 필수 | 컨텍스트 검색 함수가 반환한 문자열입니다. |
분기 objectContext
사용자 메시지에 대한 추가 컨텍스트로 프롬프트에 포함할 객체 인스턴스 정보입니다.
| 이름 | 자료형 | 필수 여부 | 의미와 조건 | 예시 값 |
|---|---|---|---|---|
type | enum | 필수 | 분기를 구분하는 type 값입니다. 허용값: objectContext. | objectContext |
objectRids | list<ObjectRid> | 선택 | 프롬프트에 포함할 관련 객체 인스턴스의 RID 목록입니다. | |
propertyTypeRids | list<PropertyTypeRid> | 선택 | 해당 객체에서 프롬프트에 포함할 속성 유형의 RID 목록입니다. |
objectRids의 구조
배열 항목은 ObjectRid이며 자료형은 string입니다.
객체의 고유 리소스 식별자이며 다른 Foundry API와 연계할 때 사용합니다.
propertyTypeRids의 구조
배열 항목은 PropertyTypeRid이며 자료형은 string입니다.
속성의 고유 리소스 식별자입니다.
다음 본문의 식별자와 값은 가상 예시입니다.
{
"sessionTraceId": "12345678-1234-5678-1234-123456789abc",
"userInput": {
"text": "What is the status of my order?"
},
"parameterInputs": {
"currentCustomerOrders": {
"type": "objectSet",
"ontology": "example-ontology",
"objectSet": {
"type": "filter",
"objectSet": {
"type": "base",
"objectType": "customerOrder"
},
"where": {
"type": "eq",
"field": "customerId",
"value": "123abc"
}
}
}
}
}
응답
응답은 SessionExchangeResult입니다. parameterUpdates는 READ_WRITE 변수의 변경값만 담으며 객체 집합 변경값은 RID로 반환합니다. 입력의 객체 집합 정의와 반환 RID를 구분합니다. 모델이 사용량 정보를 지원하지 않으면 totalTokensUsed가 없을 수 있습니다.
sessionTraceId를 미리 정해 요청에 넣으면 응답을 기다리는 동안 추적 조회로 진행 상태를 확인할 수 있습니다. 모델 요청 한도와 재시도 소진 오류는 이 엔드포인트에서 CUSTOM_CLIENT/HTTP 400입니다. 재시도 전에 대화 내용과 도구의 실행 결과를 확인하여 같은 변경을 중복 실행하지 않도록 합니다.
| 이름 | 자료형 | 필수 여부 | 의미와 조건 | 예시 값 |
|---|---|---|---|---|
agentMarkdownResponse | string | 필수 | Agent가 생성한 최종 Markdown 응답입니다. 취소한 대화에서는 interruptedOutput에 따라 클라이언트가 제공한 응답일 수 있습니다. | The status of your order is **In Transit**. |
parameterUpdates | map<ParameterId, ParameterValueUpdate> | 선택 | 이번 대화에서 Agent가 생성한 애플리케이션 변수 변경값입니다. AIP Chatbot Studio에서 접근 모드를 READ_WRITE로 설정한 변수에만 변경값을 생성할 수 있습니다. | |
totalTokensUsed | integer | 선택 | 결과 계산에 사용한 전체 토큰 수입니다. 세션의 모델이 토큰 사용량 정보를 지원하지 않으면 이 필드를 생략합니다. | 6448 |
interruptedOutput | boolean | 필수 | 대화를 취소했다면 true입니다. 이때 응답이 있으면 Agent가 생성한 값이 아니라 클라이언트가 취소 요청에 제공한 값입니다. | false |
sessionTraceId | string | 필수 | 세션 추적의 고유 식별자입니다. 추적에는 컨텍스트 검색, 도구 호출 등 Agent가 응답을 만들기 위해 거친 단계가 기록됩니다. | 12345678-1234-5678-1234-123456789abc |
parameterUpdates의 구조
맵의 키는 ParameterId(string), 값은 ParameterValueUpdate(union<string, objectSet>)입니다.
키: AIP Chatbot Studio에서 구성한 애플리케이션 상태 변수의 고유 식별자입니다.
Agent가 생성한 애플리케이션 변수 변경값입니다. StringParameter는 변경한 문자열, ObjectSetParameter는 변경한 객체 집합의 RID를 반환합니다.
분기 string
StringParameter 애플리케이션 변수의 문자열 값입니다.
| 이름 | 자료형 | 필수 여부 | 의미와 조건 | 예시 값 |
|---|---|---|---|---|
type | enum | 필수 | 분기를 구분하는 type 값입니다. 허용값: string. | string |
value | string | 필수 | Titan Technologies |
분기 objectSet
| 이름 | 자료형 | 필수 여부 | 의미와 조건 | 예시 값 |
|---|---|---|---|---|
type | enum | 필수 | 분기를 구분하는 type 값입니다. 허용값: objectSet. | objectSet |
value | string | 필수 |
가상 주문 문의 대화 결과의 응답 예시입니다.
{
"totalTokensUsed": 6448,
"agentMarkdownResponse": "The status of your order is **In Transit**.",
"sessionTraceId": "12345678-1234-5678-1234-123456789abc",
"interruptedOutput": false
}
개별 오류
| 오류 이름 | 오류 코드 | HTTP | 의미와 조건 | 추가 매개변수 |
|---|---|---|---|---|
ContextSizeExceededLimit | INVALID_ARGUMENT | 400 | LLM의 컨텍스트 크기를 초과하여 응답 생성에 실패했습니다. 메시지를 줄여 다시 보내거나 새 세션을 만든 뒤 메시지를 보냅니다. | agentRid, sessionRid, details |
AgentIterationsExceededLimit | INVALID_ARGUMENT | 400 | 설정한 최대 반복 횟수 안에 응답을 만들지 못했습니다. Agent가 혼동하거나 반복에 빠진 경우, 또는 질문이 지나치게 복잡한 경우에 발생할 수 있습니다. 질문을 바꾸거나 AIP Chatbot Studio의 Agent 구성을 점검합니다. | agentRid, sessionRid, details |
SessionExecutionFailed | INTERNAL | 500 | 예상하지 못한 오류로 세션 응답 생성에 실패했습니다. | agentRid, sessionRid, message, details |
RateLimitExceeded | CUSTOM_CLIENT | 400 | 모델 요청 빈도 한도를 초과하여 응답 생성에 실패했습니다. 기다린 뒤 다시 시도합니다. | agentRid, sessionRid, details |
RetryAttemptsExceeded | CUSTOM_CLIENT | 400 | 설정한 재시도 횟수까지 시도했으나 응답 생성에 실패했습니다. 기다린 뒤 다시 시도합니다. | agentRid, sessionRid, details |
RetryDeadlineExceeded | CUSTOM_CLIENT | 400 | 설정한 재시도 마감 시각까지 시도했으나 응답 생성에 실패했습니다. 기다린 뒤 다시 시도합니다. | agentRid, sessionRid, details |
InvalidParameter | INVALID_ARGUMENT | 400 | 이 세션의 Agent에 유효하지 않은 애플리케이션 변수를 전달했습니다. getSession으로 세션의 Agent 버전을 확인한 뒤, 해당 버전의 getAgent.parameters 또는 AIP Chatbot Studio에서 변수 정의를 확인합니다. | agentRid, sessionRid, parameter |
InvalidParameterType | INVALID_ARGUMENT | 400 | 입력값이 이 세션의 Agent에 구성한 변수 유형과 맞지 않습니다. getSession으로 Agent 버전을 확인한 뒤, 해당 버전의 getAgent.parameters 또는 AIP Chatbot Studio에서 변수 정의를 확인합니다. | agentRid, sessionRid, parameter, expectedType, receivedType |
ObjectTypeIdsNotFound | NOT_FOUND | 404 | Agent에 구성한 객체 유형 중 일부를 찾을 수 없습니다. 객체 유형이 없거나 호출 토큰으로 접근할 수 없는 경우입니다. API에서 접근 가능한 객체 유형을 나열하거나 Ontology Manager에서 검색하여 확인합니다. | agentRid, sessionRid, objectTypeIds |
ObjectTypeRidsNotFound | NOT_FOUND | 404 | Agent에 구성한 객체 유형 중 일부를 찾을 수 없습니다. 객체 유형이 없거나 호출 토큰으로 접근할 수 없는 경우입니다. API에서 접근 가능한 객체 유형을 나열하거나 Ontology Manager에서 검색하여 확인합니다. | agentRid, sessionRid, objectTypeRids |
FunctionLocatorNotFound | NOT_FOUND | 404 | Agent에 구성한 함수 식별 정보를 찾을 수 없습니다. 해당 함수 유형이나 버전이 없거나 호출 토큰으로 접근할 수 없는 경우입니다. | agentRid, sessionRid, functionRid, functionVersion |
SessionTraceIdAlreadyExists | INVALID_ARGUMENT | 400 | 해당 세션에서 이미 사용한 추적 ID입니다. 같은 ID를 다시 사용할 수 없습니다. | agentRid, sessionRid, sessionTraceId |
OntologyEntitiesNotFound | NOT_FOUND | 404 | Agent에 구성한 온톨로지 유형 중 일부를 찾을 수 없습니다. 유형이 없거나 호출 토큰으로 접근할 수 없는 경우입니다. API의 객체 유형 및 링크 유형 목록이나 Ontology Manager에서 확인합니다. | agentRid, sessionRid, objectTypeRids, linkTypeRids |
UnsupportedLanguageModelRid | INVALID_ARGUMENT | 400 | Agent에 구성한 언어 모델을 지원하지 않거나 확인할 수 없습니다. 모델이 사용 중단되었거나 호출 토큰으로 접근할 수 없으면 실행 중에도 발생할 수 있습니다. AIP Chatbot Studio에서 Agent의 언어 모델을 갱신합니다. | agentRid, sessionRid, languageModelRid, modelPurpose |
ActionTypeNotFound | INVALID_ARGUMENT | 400 | Agent의 액션 도구가 참조한 액션 유형을 찾을 수 없습니다. 액션 유형이 삭제되었거나 호출 토큰으로 접근할 수 없으면 실행 중에도 발생할 수 있습니다. 유형의 존재 여부와 접근 권한을 확인한 뒤 AIP Chatbot Studio의 도구 구성을 점검합니다. | agentRid, sessionRid, actionRid |
BlockingContinueSessionPermissionDenied | PERMISSION_DENIED | 403 | 응답 완료를 기다리는 방식으로 세션에 대화를 추가할 권한이 없습니다. | agentRid, sessionRid |
SessionNotFound | NOT_FOUND | 404 | 지정한 세션을 찾을 수 없습니다. | agentRid, sessionRid |
AgentNotFound | NOT_FOUND | 404 | 지정한 Agent를 찾을 수 없습니다. | agentRid |
요청 예제
FOUNDRY_HOST에는 https://를 제외한 Foundry 호스트를, FOUNDRY_TOKEN에는 유효한 토큰을 환경 변수로 제공합니다. 예시 식별자와 매개변수 값은 실제 작업 대상에 맞게 바꿉니다.
예시는 Agent에 객체 집합 변수 currentCustomerOrders를 구성한 경우입니다. example-ontology, customerOrder, customerId와 고객 값은 실제 온톨로지 API 이름, 객체 유형 및 속성 API 이름, 조회 값으로 바꿉니다. 세션에 연결된 버전의 변수 정의를 먼저 확인합니다. sessionTraceId는 매 대화마다 새 값으로 바꾸며 같은 세션에서 재사용하지 않습니다.
cURL
curl -X POST \
-H "Content-type: application/json" \
-H "Authorization: Bearer ${FOUNDRY_TOKEN}" \
"https://${FOUNDRY_HOST}/api/v2/aipAgents/agents/ri.aip-agents..agent.732cd5b4-7ca7-4219-aabb-6e976faf63b1/sessions/ri.aip-agents..session.292db3b2-b653-4de6-971c-7e97a7b881d6/blockingContinue?preview=true" \
-d '{"sessionTraceId":"12345678-1234-5678-1234-123456789abc","userInput":{"text":"What is the status of my order?"},"parameterInputs":{"currentCustomerOrders":{"type":"objectSet","ontology":"example-ontology","objectSet":{"type":"filter","objectSet":{"type":"base","objectType":"customerOrder"},"where":{"type":"eq","field":"customerId","value":"123abc"}}}}}'
Python
Requests 라이브러리가 설치된 Python 환경에서 사용합니다.
import os
import requests
HOSTNAME = os.environ["FOUNDRY_HOST"]
TOKEN = os.environ["FOUNDRY_TOKEN"]
headers = {
"content-type": "application/json",
"authorization": "Bearer {}".format(TOKEN)
}
request_body = {
"sessionTraceId": "12345678-1234-5678-1234-123456789abc",
"userInput": {
"text": "What is the status of my order?"
},
"parameterInputs": {
"currentCustomerOrders": {
"type": "objectSet",
"ontology": "example-ontology",
"objectSet": {
"type": "filter",
"objectSet": {
"type": "base",
"objectType": "customerOrder"
},
"where": {
"type": "eq",
"field": "customerId",
"value": "123abc"
}
}
}
}
}
response = requests.post('https://{}/api/v2/aipAgents/agents/ri.aip-agents..agent.732cd5b4-7ca7-4219-aabb-6e976faf63b1/sessions/ri.aip-agents..session.292db3b2-b653-4de6-971c-7e97a7b881d6/blockingContinue?preview=true'.format(HOSTNAME), headers=headers, json=request_body)
print(response)
Java
Apache HttpClient 4.5 API와 try-with-resources를 사용합니다. 클래스 이름에 맞는 BlockingContinueSessionExample.java 파일에서 사용합니다.
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClientBuilder;
import org.apache.http.entity.ContentType;
import org.apache.http.entity.StringEntity;
public class BlockingContinueSessionExample {
public static void main(String[] args) throws Exception {
String HOSTNAME = System.getenv("FOUNDRY_HOST");
String TOKEN = System.getenv("FOUNDRY_TOKEN");
try (CloseableHttpClient httpClient = HttpClientBuilder.create().build()) {
HttpPost request = new HttpPost("https://" + HOSTNAME + "/api/v2/aipAgents/agents/ri.aip-agents..agent.732cd5b4-7ca7-4219-aabb-6e976faf63b1/sessions/ri.aip-agents..session.292db3b2-b653-4de6-971c-7e97a7b881d6/blockingContinue?preview=true");
request.addHeader("content-type", "application/json");
request.addHeader("authorization", String.format("Bearer %s", TOKEN));
request.setEntity(new StringEntity("{\"sessionTraceId\":\"12345678-1234-5678-1234-123456789abc\",\"userInput\":{\"text\":\"What is the status of my order?\"},\"parameterInputs\":{\"currentCustomerOrders\":{\"type\":\"objectSet\",\"ontology\":\"example-ontology\",\"objectSet\":{\"type\":\"filter\",\"objectSet\":{\"type\":\"base\",\"objectType\":\"customerOrder\"},\"where\":{\"type\":\"eq\",\"field\":\"customerId\",\"value\":\"123abc\"}}}}}", ContentType.APPLICATION_JSON));
try (CloseableHttpResponse response = httpClient.execute(request)) {
System.out.println(response);
}
}
}
}
JavaScript
fetch를 제공하는 Node.js 환경에서 사용합니다. 서비스 사용자 토큰을 브라우저로 전달하지 않습니다.
const HOSTNAME = process.env.FOUNDRY_HOST;
const TOKEN = process.env.FOUNDRY_TOKEN;
fetch(`https://${HOSTNAME}/api/v2/aipAgents/agents/ri.aip-agents..agent.732cd5b4-7ca7-4219-aabb-6e976faf63b1/sessions/ri.aip-agents..session.292db3b2-b653-4de6-971c-7e97a7b881d6/blockingContinue?preview=true`, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Authorization': `Bearer ${TOKEN}`,
},
body: '{"sessionTraceId":"12345678-1234-5678-1234-123456789abc","userInput":{"text":"What is the status of my order?"},"parameterInputs":{"currentCustomerOrders":{"type":"objectSet","ontology":"example-ontology","objectSet":{"type":"filter","objectSet":{"type":"base","objectType":"customerOrder"},"where":{"type":"eq","field":"customerId","value":"123abc"}}}}}'
}).then((response) => {
console.log(response)
});
PowerShell
$TOKEN = $env:FOUNDRY_TOKEN
$HOSTNAME = $env:FOUNDRY_HOST
$headers = @{
"authorization" = "Bearer $TOKEN"
}
$response = Invoke-WebRequest -Uri "https://$HOSTNAME/api/v2/aipAgents/agents/ri.aip-agents..agent.732cd5b4-7ca7-4219-aabb-6e976faf63b1/sessions/ri.aip-agents..session.292db3b2-b653-4de6-971c-7e97a7b881d6/blockingContinue?preview=true" `
-Method Post `
-Headers $headers `
-ContentType application/json `
-Body "{`"sessionTraceId`":`"12345678-1234-5678-1234-123456789abc`",`"userInput`":{`"text`":`"What is the status of my order?`"},`"parameterInputs`":{`"currentCustomerOrders`":{`"type`":`"objectSet`",`"ontology`":`"example-ontology`",`"objectSet`":{`"type`":`"filter`",`"objectSet`":{`"type`":`"base`",`"objectType`":`"customerOrder`"},`"where`":{`"type`":`"eq`",`"field`":`"customerId`",`"value`":`"123abc`"}}}}}"
$response.content