진행 중인 챗봇 스트리밍 취소(Cancel Session) (V2)
streamingContinue로 시작하여 아직 진행 중인 대화 한 차례를 취소합니다. 요청의 messageId는 스트리밍을 시작할 때 사용한 값과 같아야 합니다.
response를 지정하면 클라이언트가 제공한 문구를 결과로 기록하여 대화를 세션에 추가합니다. 생략하면 해당 대화를 세션에 추가하지 않습니다. 취소 API는 스트리밍 연결을 닫지 않으므로, 취소 요청을 시작할 때 클라이언트가 자신이 읽던 스트림도 닫아야 합니다. 이미 실행한 도구의 변경을 되돌리는 절차로 사용하지 않습니다.
취소 직전에 대화가 완료되거나 시작 직후 아직 실행되지 않았다면 CancelSessionFailedMessageNotInProgress가 발생할 수 있습니다. 이 오류를 취소 성공으로 처리하지 말고 대화 내용을 다시 조회하여 현재 상태를 확인합니다.
이 엔드포인트는 미리보기 기능이며 언제든 변경되거나 제거될 수 있습니다. 사용하려면 preview=true를 지정합니다.
HTTP 요청
POST /api/v2/aipAgents/agents/{agentRid}/sessions/{sessionRid}/cancel
작업 식별자는 v2.cancelSession입니다. 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 |
요청 본문
본문 형식은 CancelSessionRequest이며 필수입니다.
| 이름 | 자료형 | 필수 여부 | 의미와 조건 | 예시 값 |
|---|---|---|---|---|
messageId | string | 필수 | 취소할 진행 중 대화의 식별자입니다. streamingContinue에 전달한 messageId와 같아야 합니다. | 00f8412a-c29d-4063-a417-8052825285a5 |
response | string | 선택 | 지정하면 클라이언트가 제공한 응답을 결과로 사용하여 대화를 세션에 추가합니다. 생략하면 해당 대화를 세션에 추가하지 않습니다. | Response canceled by the user. |
다음 본문의 식별자와 값은 가상 예시입니다.
{
"response": "Response canceled by the user.",
"messageId": "00f8412a-c29d-4063-a417-8052825285a5"
}
응답
응답은 CancelSessionResponse입니다. 요청에 response를 제공한 경우 result에 기록한 대화 결과가 있고 interruptedOutput은 true입니다. response를 생략하면 세션에 추가한 대화가 없으므로 result가 비어 있습니다.
| 이름 | 자료형 | 필수 여부 | 의미와 조건 | 예시 값 |
|---|---|---|---|---|
result | object | 선택 | 요청에 response를 지정했다면 클라이언트가 제공한 응답으로 세션에 추가한 결과를 반환합니다. response를 생략했다면 대화를 추가하지 않으므로 결과가 비어 있습니다. | 응답 예시 참조 |
result의 구조
| 이름 | 자료형 | 필수 여부 | 의미와 조건 | 예시 값 |
|---|---|---|---|---|
agentMarkdownResponse | string | 필수 | Agent가 생성한 최종 Markdown 응답입니다. 취소한 대화에서는 interruptedOutput에 따라 클라이언트가 제공한 응답일 수 있습니다. | Response canceled by the user. |
parameterUpdates | map<ParameterId, ParameterValueUpdate> | 선택 | 이번 대화에서 Agent가 생성한 애플리케이션 변수 변경값입니다. AIP Chatbot Studio에서 접근 모드를 READ_WRITE로 설정한 변수에만 변경값을 생성할 수 있습니다. | |
totalTokensUsed | integer | 선택 | 결과 계산에 사용한 전체 토큰 수입니다. 세션의 모델이 토큰 사용량 정보를 지원하지 않으면 이 필드를 생략합니다. | 6448 |
interruptedOutput | boolean | 필수 | 대화를 취소했다면 true입니다. 이때 응답이 있으면 Agent가 생성한 값이 아니라 클라이언트가 취소 요청에 제공한 값입니다. | true |
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 | 필수 |
가상 클라이언트 안내 문구로 취소한 대화의 응답 예시입니다.
{
"result": {
"totalTokensUsed": 6448,
"agentMarkdownResponse": "Response canceled by the user.",
"sessionTraceId": "12345678-1234-5678-1234-123456789abc",
"interruptedOutput": true
}
}
개별 오류
| 오류 이름 | 오류 코드 | HTTP | 의미와 조건 | 추가 매개변수 |
|---|---|---|---|---|
CancelSessionFailedMessageNotInProgress | INVALID_ARGUMENT | 400 | 해당 메시지 ID로 진행 중인 대화를 찾지 못했습니다. 이 ID로 스트리밍 요청을 하지 않았거나, 이미 완료 또는 취소했거나, 스트리밍 요청 직후여서 대화가 아직 시작되지 않은 경우에 발생합니다. 오류를 처리한 뒤 대화 내용을 다시 조회하여 최신 상태를 확인합니다. | messageId, agentRid, sessionRid |
CancelSessionPermissionDenied | PERMISSION_DENIED | 403 | 진행 중인 대화를 취소할 수 없습니다. | agentRid, sessionRid |
SessionNotFound | NOT_FOUND | 404 | 지정한 세션을 찾을 수 없습니다. | agentRid, sessionRid |
AgentNotFound | NOT_FOUND | 404 | 지정한 Agent를 찾을 수 없습니다. | agentRid |
요청 예제
FOUNDRY_HOST에는 https://를 제외한 Foundry 호스트를, FOUNDRY_TOKEN에는 유효한 토큰을 환경 변수로 제공합니다. 예시 식별자와 매개변수 값은 실제 작업 대상에 맞게 바꿉니다.
예시는 클라이언트의 취소 안내 문구를 대화 이력에 남기는 경우입니다. 실제로 진행 중인 요청의 messageId를 사용합니다.
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/cancel?preview=true" \
-d '{"response":"Response canceled by the user.","messageId":"00f8412a-c29d-4063-a417-8052825285a5"}'
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 = {
"response": "Response canceled by the user.",
"messageId": "00f8412a-c29d-4063-a417-8052825285a5"
}
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/cancel?preview=true'.format(HOSTNAME), headers=headers, json=request_body)
print(response)
Java
Apache HttpClient 4.5 API와 try-with-resources를 사용합니다. 클래스 이름에 맞는 CancelSessionExample.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 CancelSessionExample {
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/cancel?preview=true");
request.addHeader("content-type", "application/json");
request.addHeader("authorization", String.format("Bearer %s", TOKEN));
request.setEntity(new StringEntity("{\"response\":\"Response canceled by the user.\",\"messageId\":\"00f8412a-c29d-4063-a417-8052825285a5\"}", 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/cancel?preview=true`, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Authorization': `Bearer ${TOKEN}`,
},
body: '{"response":"Response canceled by the user.","messageId":"00f8412a-c29d-4063-a417-8052825285a5"}'
}).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/cancel?preview=true" `
-Method Post `
-Headers $headers `
-ContentType application/json `
-Body "{`"response`":`"Response canceled by the user.`",`"messageId`":`"00f8412a-c29d-4063-a417-8052825285a5`"}"
$response.content