Skip to main content
AI Chat v2 API(/aichat2/conversations)는 차세대 대화 인터페이스이며, AI Chat API의 전면 업그레이드 버전입니다. v1의 간결하고 관리형인 멀티턴 대화 기반 위에 다음을 확장했습니다:
  • 멀티모달 사용자 입력: 구조화된 message 필드를 통해 텍스트 + 이미지 + 파일 블록을 직접 전달하며, 먼저 references를 사용해 간접적으로 첨부할 필요가 없습니다.
  • Agent화된 도구 호출: 웹 검색, 웹페이지 크롤링, 파일 읽기 등의 도구 세트가 내장되어 있으며, 사용자가 승인한 MCP 서버(Google Drive, Notion, Slack, GitHub 등)를 연결할 수 있습니다. 모델은 한 번의 요청 안에서 여러 차례 자율적으로 도구를 호출하여 복잡한 작업을 완료할 수 있습니다.
  • 구조화된 스트리밍 이벤트: accept: text/event-stream 또는 application/x-ndjson를 통해 토큰별 text_delta, tool_use, tool_result, thinking, citation, card, artifact 등의 이벤트를 받을 수 있어, 프런트엔드에서 해당 유형에 따라 각각 렌더링하기 편리합니다.
  • 중단 / 재개 가능: 모델이 사용자의 추가 정보가 필요할 때 ask_user_question 이벤트를 발행하고 일시 정지합니다. 다음 호출에서 tool_results를 통해 답변을 다시 채우면 계속 진행할 수 있습니다.
  • 새로운 CRUD 동작: 동일한 endpoint에서 action 필드를 통해 retrieve / retrieve_batch / update / delete를 완료할 수 있으며, 별도의 세션 관리 API가 필요하지 않습니다.
  • 지속적으로 업데이트되는 모델 목록: 기본적으로 GPT-5.4, Claude Opus 4.8, Claude Sonnet 4.6, Gemini 3.1 Pro, GLM 5.1, DeepSeek V4, Kimi K3 등 최신 모델이 연동됩니다.
동시에 요청 본문 수준에서 v1과 완전히 하위 호환됩니다. model + question(+ 선택적 stateful / id / references / preset)만 전달하면 v1과 동등한 {answer, id} JSON 응답을 받을 수 있으므로, /aichat/conversations에서 마이그레이션할 때 클라이언트를 다시 작성할 필요 없이 경로만 /aichat2/conversations로 변경하면 됩니다.
현재 /aichat/conversations를 사용하고 있다면, 기존 인터페이스 서비스는 계속 유지되며 원하는 속도에 맞춰 마이그레이션할 수 있습니다.

신청 절차

AI Chat v2 API를 사용하려면 먼저 Ace Data Cloud 콘솔에서 API Token을 발급받아 예비로 보관하세요. 아직 로그인 또는 등록하지 않았다면 로그인 페이지로 자동 이동하여 등록과 로그인을 안내하며, 완료 후 현재 페이지로 자동 반환됩니다. 하나의 API Token으로 플랫폼의 모든 서비스를 호출할 수 있으며, 서비스별로 별도 신청할 필요가 없습니다. 최초 신청 시 무료 크레딧이 제공되어 무료로 체험할 수 있고, 크레딧이 부족할 경우 콘솔에서 공용 잔액을 충전할 수 있습니다.
📘 전체 문서: AI Chat v2 API →

기본 사용법

가장 간단한 사용법은 v1과 완전히 동일합니다: model + question을 전달하고 {answer, id}를 받습니다. CURL 예시:
반환 결과:
Python 예시:
사용 가능한 model 값은 오른쪽 Try 패널의 드롭다운에서 직접 확인할 수 있으며, 일반적인 카테고리는 다음과 같습니다:
  • OpenAI: gpt-5.4-mini, gpt-5.4-nano, gpt-5.2-pro, gpt-5.1-all, gpt-5-all, gpt-4.1, gpt-4o, gpt-4o-image, o3, o4-mini
  • Anthropic: claude-opus-4-8, claude-opus-4-7, claude-opus-4-6, claude-opus-4-5-20251101, claude-sonnet-4-6, claude-sonnet-4-5-20250929, claude-haiku-4-5-20251001
  • Google: gemini-3.1-pro-preview, gemini-3.1-pro-preview, gemini-3.1-flash-image, gemini-3.1-pro-preview, gemini-2.5-flash-lite
  • xAI: grok-4
  • DeepSeek: deepseek-v4-pro, deepseek-v4.1-flash, deepseek-v4-flash, deepseek-v3.2-exp, deepseek-r1-0528
  • Moonshot: kimi-k3, kimi-k2.6, kimi-k2.5
  • Zhipu: glm-5.3, glm-5.2, glm-5.1, glm-5, glm-5-turbo, glm-4.7, glm-4.5v
구체적인 과금 규칙은 서비스 페이지의 Pricing 카드에서 확인하세요.

멀티턴 대화

v1과 마찬가지로 stateful: true를 전달하여 세션 저장을 활성화하면 API가 id를 반환합니다. 후속 요청에서 id를 다시 전달하면 직접 messages 히스토리를 관리하지 않아도 대화를 계속할 수 있습니다. 첫 번째 요청:
반환:
두 번째 요청에서는 동일한 id를 함께 전달합니다:
stateful의 기본값은 true이며, 생략하는 것은 명시적으로 true를 전달하는 것과 동일합니다. 서버가 이번 대화를 저장하지 않기를 원한다면, 명시적으로 stateful: false를 설정할 수 있습니다.

스트리밍 응답

v2는 두 가지 스트리밍 형식을 지원하며, accept 헤더에 따라 선택합니다:

NDJSON 예시

NDJSON의 각 줄은 모두 구조화된 이벤트이며, 가장 일반적인 것은 text_delta입니다:

SSE 예시

브라우저 측에서 EventSource를 사용할 경우 사용자 지정 요청 본문을 지원하지 않으므로, fetch + 수동으로 \n\n 기준 슬라이싱 파싱을 사용하는 것을 권장합니다:

스트리밍 이벤트 유형

최종 답변에만 관심이 있는 클라이언트의 경우, 모든 text_deltacontent를 이어 붙이면 application/json 모드의 answer와 동일합니다.

멀티모달 입력

사용자 입력에 이미지 또는 파일이 포함된 경우, question 대신 message(배열)를 전달합니다. 각 배열 요소는 하나의 콘텐츠 블록입니다:
지원되는 블록 유형:
  • text — 일반 텍스트이며, text 필드가 필수입니다.
  • image_url — 이미지이며, image_url.url이 필수입니다.
  • file_url — 파일(PDF, CSV, TXT 등)이며, file_url.url이 필수입니다.

v1 references와의 관계

이전 클라이언트와의 호환성을 위해 v2는 여전히 references: ["https://...", ...] 필드를 인식합니다:
  • URL 접미사가 jpg / jpeg / png / gif / bmp / webp / svg / heic / heif이면 자동으로 image_url 블록으로 변환됩니다;
  • 기타 확장자는 file_url 블록으로 변환됩니다;
  • 동시에 question도 제공된 경우, 이를 하나의 text 블록으로 앞에 추가합니다.
따라서 v1에서 마이그레이션만 하고 요청 본문을 수정하고 싶지 않다면, 경로를 /aichat2/conversations로 바꾸기만 하면 되며, 기존 references 사용법은 그대로 작동합니다. 더 세밀한 제어가 필요하다면(예: 여러 이미지를 텍스트 사이에 배치하거나 순서가 중요한 경우) 직접 message 배열을 사용하세요.

도구 호출 및 MCP

v2의 핵심 강화점은 모델이 도구를 자율적으로 호출하여 여러 단계의 작업을 완료할 수 있다는 것이며, 이는 기본적으로 활성화되어 있으므로 클라이언트가 요청에서 추가 설정을 할 필요가 없습니다. 일반적인 시나리오:
  • 사용자가 「최근 상하이에 어떤 새 전시가 있는지 찾아줘」라고 질문 → 모델이 내장 web search 호출 → 결과를 정리하여 답변.
  • 사용자가 「이 PDF를 읽고 요약을 작성해줘」라고 질문 → 모델이 file_read 호출 → 요약 작성.
  • 사용자가 이미 Connections에서 Google Drive / GitHub / Notion 등을 승인함 → 모델이 해당 MCP 도구를 호출하여 데이터를 읽고 쓸 수 있음.
NDJSON / SSE 스트림에서 도구 호출은 tool_usetool_result 두 유형의 이벤트로 표시됩니다. 예:
프런트엔드에서 도구 호출 세부 정보를 표시하고 싶지 않다면, tool_use / tool_result / card / citation 유형의 이벤트를 무시하면 됩니다. 모델의 최종 출력은 여전히 text_delta를 통해 스트리밍됩니다. max_turns는 이번 요청에서 모델이 도구를 자체 호출할 수 있는 최대 횟수를 제한할 수 있으며, 기본 상한은 플랫폼에서 결정합니다. 이를 작게 설정하면(예: max_turns: 1) 단일 답변만 강제하고 어떠한 도구 호출도 허용하지 않을 수 있습니다.

비동기 실행 및 무인 승인

호출이 알림 Webhook, CI/CD, 모니터링 시스템 또는 기타 백그라운드 작업에서 온 경우, async: true를 설정하여 인터페이스가 즉시 작업 ID를 반환하고 백그라운드에서 계속 실행되도록 할 수 있습니다:
반환 예시:
이후 action: retrieve + id로 대화 결과를 조회할 수 있습니다; 또는 callback_url을 제공할 수도 있으며, 작업 완료 후 플랫폼이 { status, answer, usage, error }를 콜백 주소로 POST합니다. callback_url은 반드시 http / https를 사용해야 하며, localhost 또는 사설 IP 리터럴 주소를 직접 입력할 수 없습니다. 백그라운드 작업에서는 일반적으로 누군가 확인을 클릭할 수 없습니다. 특정 Skill 또는 MCP Server가 무인 모드에서 전송, 게시, 쓰기 등의 작업을 수행하도록 하려면 요청 본문에 사전 승인 목록을 명시적으로 전달하세요:
allowed_skills의 값은 연결된 Skill의 slug입니다; allowed_mcp_servers의 값은 연결된 MCP Server의 slug입니다. 사전 승인 목록에 포함되지 않은 Skill / MCP Server는 무인 모드에서 여전히 미리보기, dry-run 또는 쓰기 작업 실행 거부만 할 수 있습니다. 더 세부적인 제어가 필요하다면 동등한 unattended_policy 객체를 사용할 수도 있습니다:
사전 승인은 이 두 목록 자체입니다: 목록이 비어 있으면 어떠한 기능도 승인하지 않는 것이며, 별도의 스위치 필드는 필요하지 않습니다. 주의: 사전 승인은 「이번 요청에서 이러한 기능이 무인 모드로 인간의 확인을 건너뛰도록 허용한다」는 의미일 뿐입니다. 구체적인 Skill은 여전히 --unattended-confirm 또는 해당 보안 메커니즘을 지원해야 합니다; 그렇지 않으면 계속 dry-run 상태로 유지되며, 쓰기 작업을 직접 실행하지 않습니다.

일시 중지된 대화 재개

일부 도구는 모델이 「사용자에게 되묻게」 하며, 이때 모델은 ask_user_question 이벤트를 발행하고 대화는 awaiting_user_input 상태로 동결됩니다:
프런트엔드에서 이 이벤트를 카드로 렌더링하여 사용자가 답변을 선택하게 한 다음, 동일한 id로 다음 요청을 시작하고 답변을 tool_results를 통해 다시 채웁니다:
요청 본문의 tool_use_id는 일시 중지 시의 tool_id반드시 완전히 일치해야 합니다; 일치하지 않으면 400이 반환됩니다. 요청에 tool_results가 동시에 존재할 경우, question / message / references는 모두 무시됩니다. 사용자가 이 질문을 포기하기로 한 경우, 새로운 question / message를 직접 전달하면 됩니다. 플랫폼은 자동으로 일시 중지된 도구 호출을 「사용자가 건너뜀」으로 표시합니다.

대화 관리(CRUD)

v2는 동일한 endpoint에서 action 필드를 통해 경량 대화 관리를 제공하므로 별도의 API를 열 필요가 없습니다.

action: retrieve —— 하나의 대화 가져오기

완전한 대화 문서(messages 기록, model, title, tools_used 등을 포함)를 반환합니다.

action: retrieve_batch —— 대화 요약 나열

{ items: [...], total }을 반환합니다. 요약에는 messages가 포함되지 않으므로, 사이드바 목록에 적합합니다. 사용자가 특정 대화를 열면 action: retrieve를 사용하여 해당 대화의 전체 메시지를 별도로 가져옵니다. 선택적 필터 매개변수: user_id, application_id, model_group, model.

action: update —— 제목 변경 또는 기록 다시 작성

messages도 전달할 수 있지만, 서버에서 엄격한 schema 검증을 수행합니다(반드시 접힌 ToolUseContent 형태여야 함). 조건에 맞지 않으면 400을 반환합니다. 일반적으로는 title 변경에만 사용하는 것이 좋습니다.

action: delete —— 대화 하나 삭제

{ id, success: true }를 반환합니다. 삭제 후에는 복구할 수 없으므로, 확인한 후 호출하십시오.

v1에서 원활하게 마이그레이션하기

이미 /aichat/conversations를 사용하고 있다면, v2로 마이그레이션하는 데는 거의 코드 변경이 필요하지 않습니다.
  1. URL을 https://api.acedata.cloud/aichat/conversations에서 https://api.acedata.cloud/aichat2/conversations로 변경합니다.
  2. 이전에 v1 모델 이름(예: gpt-3.5, gpt-4-browsing 등)을 전달했다면, v2로 전환할 때 최신 모델(예: gpt-5.4, claude-opus-4-8, gemini-3.1-pro-preview 등)로 업그레이드하는 것을 권장합니다.
  3. NDJSON 스트림의 필드는 하위 호환성을 유지합니다. 각 text_delta 이벤트는 여전히 delta_answerid를 포함하므로, 기존에 줄 단위로 delta_answer를 파싱하던 클라이언트는 변경할 필요가 없습니다.
마이그레이션 후에는 필요에 따라 v2의 새로운 기능(멀티모달 message, SSE, 도구 호출, action CRUD)을 활성화할 수 있으며, 일정에 맞춰 진행하면 됩니다.

오류 처리

오류 응답은 다음 형식으로 통일됩니다.
일반적인 오류:
  • 400 bad_request: 필수 필드 누락, tool_use_id 불일치, messages schema 오류 등.
  • 401 invalid_token: authorization 헤더가 올바르지 않음.
  • 404 not_found: action: retrieve / update / deleteid에 해당하는 대화가 존재하지 않음.
  • 429 too_many_requests: 속도 제한이 발생함.
  • 500 chat_error: 업스트림 LLM 오류 또는 이번 라운드에서 completion_tokens=0(미사용으로 처리되며 비용이 차감되지 않음).
스트리밍 응답에서는 오류가 {"type":"error","message":"..."} 이벤트로 전송되며, 이어서 스트림이 종료됩니다.

결론

AI Chat v2 API는 v1과의 하위 호환성을 유지하면서 대화를 「단일 턴 / 다중 턴 질의응답」에서 「Agent화된 관측 가능한 대화」로 업그레이드합니다. 멀티모달 입력, 도구 호출, 일시 중지 / 재개, 스트리밍 구조화 이벤트, 내장 CRUD를 제공합니다. 새로 연동하는 경우 v2를 바로 사용하는 것을 권장합니다. 기존 v1 통합은 단계적으로 원활하게 마이그레이션할 수 있습니다. 문의 사항이 있으면 언제든지 기술 지원 팀에 연락해 주십시오.