AXONN Vantis logo
액손밴티스(주)열린 지능망 위 자율 AI 에이전트,완벽한 거버넌스
도입 상담 신청KO
목차← Docs

DOCS · API REFERENCE

외부 시스템 통합 API 명세

Vantisso를 이용한 자체 에이전트 애플리케이션을 개발하거나 기업의 IT 운영 포털/시스템이 Vantisso를 제어하고 관리하는 기능 구현 시 참조용 REST API 명세서이다.

최종 수정 · 2026년 7월 28일

API 호출 기본 구성

항목적용 범위설정값
Base URL모든 호출http://<host>:3000 (컨트롤 플레인)
Authorization모든 호출모든 호출에 Authorization: Bearer <token> 필수
(토큰 없는 로컬 개발 시에만 생략 가능)
Content-Type본문 있는 요청요청·응답 모두 JSON (application/json)

인증 및 인가 방식 이해

1 · 토큰 기반 인증

토큰은 Vantisso 운영자(operator)가 발급하며 발급된 토큰을 Bearer 헤더에 넣어서 전송한다. 로컬 개발 작업 중에는 인증을 끄고 토큰 없이 진행할 수 있는데 이때 operator 모드로 동작하게 된다.

curl -H "Authorization: Bearer $TOKEN" http://host:3000/whoami
{ "name": "acme-portal", "role": "user", "auth_disabled": false }

2 · 역할과 소유권 기반 인가

모든 API 호출은 다음과 같은 두 가지 기준에서 검사가 진행되는데 부여받은 역할이 해당 동작 수행을 허용받았는지와 접근하려는 대상에 대한 접근 권한을 갖고 있는지를 확인한다.

기준결정 대상적용 결과
역할(Role)호출 가능한 동작(Action)operator 또는 user의 2개 역할 구분에 따라 허용된 것만 가능
소유권(Ownership)접근 가능한 대상(Object)자신이 만든 대상만 접근 가능함

operator 역할은 소유권 검사를 건너뛰고 모든 대상에 접근할 수 있도록 설계되어 있다.

3 · 상황 별 토큰 사용 가이드

대상 작업사용할 토큰선정 이유
멀티테넌트 에이전트 애플리케이션고객당 user 토큰고객 별로 에이전트 실행 환경을 자동 격리하기 위해
플랫폼 전체를 운영하는 백엔드 서비스operator 토큰모든 엔드포인트·대상에 완전 접근가능해야 하기 때문
로컬 개발과 테스트토큰 사용하지 않음개발 편의성을 위해 인증 자체를 적용하지 않기 위해

4 · 단일 에이전트 생성시 주의 사항

Vantisso는 단독(Standalone) VM을 누구에게도 귀속되지 않는 공유 인프라로 정의하고 있기 때문에 `user` 토큰을 사용해서 단독으로 VM만을 생성할 수 없게 제한하고 있다. (user 토큰 기반 POST /vms 실행 시 403 에러) 대신 user 토큰 기반으로 에이전트 그룹을 먼저 만들고 (POST /groups) 그 그룹 안에서 단독 VM을 생성하는 것은 얼마든지 가능하다. 따라서 user 토큰 사용 시에는 단일 에이전트가 필요한 경우라 해도 그룹원이 하나인 에이전트 그룹을 만들어야 한다는 점에 유의해야 한다.

5 · 에러 코드 설명

코드의미대응 가이드
401토큰 누락 / 무효 / 만료인증 헤더와 만료 여부 확인
403해당 역할이 권한이 없거나 사용 기간 만료(trial_expired)인프라 작업 호출은 operator 토큰 사용, GET /license로 만료 여부 확인
404대상에 대한 소유권이 없거나 또는 대상 자체가 존재하지 않음대상의 ID가 확실히 존재한다면 유효하지 않은 토큰 사용중이므로 대상 생성시 발급된 토큰으로 교체 가능 여부 확인

6 · 멀티테넌트 격리 레시피

  1. 테넌트당 user 토큰 하나를 발급한다. 여기서 테넌트는 고객사, 포털 로그인 사용자, 프로젝트 워크스페이스 등 다양하게 격리하고 싶은 개별 단위를 의미하며 Vantisso는 각 테넌트를 하나의 토큰에 매핑하고 있다. 참고로 expires 필드를 이용해서 테넌트에 TTL을 걸 수도 있다.
  2. 각 테넌트가 자기 그룹을 만들고 그 안에서 에이전트들을 구동한다. 그 그룹에 속한 모든 에이전트들은 전부 동일한 owner id를 상속하게 된다.
  3. 이렇게 하면 서버의 호스트가 자동으로 목록 조회 시 자기 테넌트에 해당하는 것만 보이게 강제하고 테넌트가 소유하지 않은 에이전트로 행위 요청을 하면 404 에러 발생시켜 막는다.

테넌트 토큰 유실 시 같은 이름의 토큰을 삭제·재생성해도 이전 데이터 접근은 복원되지 않는다. 따라서 테넌트 토큰을 안전하게 보관해야 한다. 그리고 Vantisso의 멀티테넌트 격리는 가시성과 행위 적용에만 적용되고 자원 쿼터를 테넌트 별로 나누고 보장하는 것은 지원하지 않는다는 것에 유의해야 한다.

단일 에이전트 실행

에이전트 그룹을 생성하지 않고 에이전트 하나만 생성해서 작업을 실행하려면 무조건 operator 토큰으로 에이전트를 실행할 VM을 생성해야 한다.

1. VM 생성 : {"profile":"…"} 옵션을 통해 커스터마이징된 sizing/model/system-prompt를 적용할 수 있다. 이 옵션을 생략하면 기본 프로파일이 자동 적용된다.

curl -sX POST http://host:3000/vms \
  -H "Authorization: Bearer $OP_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"profile":"support-agent"}'
201 Created
{
  "vm_id": "vm-1720982400000000000",
  "guest_ip": "10.0.1.5",
  "runtimed_url": "http://10.0.1.5:8080",
  "profile": "support-agent",
  "provider": "google",
  "model": "gemini-2.0-flash",
  "runtimed_token": "…"
}

이 호출은 요청 후 에이전트가 준비될 때까지 블록된다.(통상 1초 이내, 최대 60초까지 대기) runtimed_token한 번만 반환되며 재발급되지 않는다. 다만 컨트롤 플레인 프록시가 이 토큰은 중앙 관리하면서 필요 시 각 VM에 자동 주입하기 때문에 개발자가 직접 쓸 일은 드물다. VM 생성 요청 시 디스크가 부족하면 507 에러가 반환되고, 유효 기간이 만료되면 403 trial_expired 에러가 반환된다.

2. 태스크 실행 : 컨트롤 플레인이 관리하고 있는 토큰을 제공받아 프롬프트가 에이전트로 자동 전달된다. 에이전트는 한번에 하나의 태스크를 처리하는데 처리 중이면 503을 회신한다.

curl -sX POST http://host:3000/vms/$VM_ID/tasks \
  -H "Authorization: Bearer $OP_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"prompt":"Summarize ticket INC-4821 and propose a resolution."}'
{ "output": "…the agent's final answer…", "error": "" }
  • 멀티턴 지원 - "session": 사용자 제공 ID를 넘겨 한 대화 스레드를 여러 호출에 걸쳐 이어갈 수 있게 한다. 세션 정보는 VM 내부 에이전트 런타임 프로세스의 메모리에 저장되며 VM 별로 완전히 독립된 네임스페이스를 갖는다. 이 세션 ID는 토큰과는 달리 컨트롤 플레인이 관리하지 않고 패스스루한다.
  • 스트리밍 지원 - ?stream=1로 설정하면 NDJSON 형식으로 데이터가 송출된다.

3. VM 소멸 : VM·네트워크·디스크가 자동으로 해제된다.

curl -sX DELETE http://host:3000/vms/$VM_ID -H "Authorization: Bearer $OP_TOKEN"

runtimed_url의 Private IP는 호스트 전용이라 애플리케이션 네트워크에서는 도달할 방법이 없다. 따라서 항상 컨트롤 플레인(/vms/{id}/…)을 통해서만 에이전트에 접근 할 수 있다는 점에 유의해야 한다.

단일 에이전트 실행용 엔드포인트 정리

메서드 · 경로기능 설명
POST/vmsVM 생성용이며 operator 전용, Body에 {"profile":"…"} 선택적 적용 가능
GET/vms실행 중 VM 목록 조회용, operator는 전체 VM 조회 가능하나 user는 소유한 VM만 가능
DELETE/vms/{id}정상적인 VM 소멸용
POST/vms/{id}/tasks에이전트 태스크 실행용, Query Parameter로 ?stream=1 설정시 스트리밍 활성화 가능, Body에는 prompt 이용해서 프롬프트 입력하고 session 이용해서 멀티턴 대화 활성화 가능
GET/vms/{id}/health에이전트의 Health Check용, 응답은 애이전트 유휴상태 정보로 회신
GET/vms/{id}/statsCPU 사용율, 할당된 메모리 전체 용량 및 실제 사용량, 네트워크 송수신, 가동시간, 에이전트 유휴상태 정보 조회용
GET/vms/{id}/sessions해당 VM의 멀티턴 대화 세션 목록 조회용
GET/vms/{id}/sessions/{name}/transcript특정 세션의 전체 턴 내용 조회용, 재개 시 대화 재구성에 활용

에이전트 팀 단위 운영

Vantisso는 에이전트를 팀 단위로 운영할 수 있도록 기능을 제공한다. 에이전트 그룹을 생성하고 해당 그룹 아래에 생성되는 에이전트들은 팀 단위로 협업하게 만들 수 있다.

1. 에이전트 그룹 생성 : 에이전트 그룹을 생성할 때 테넌트 토큰은 user 계열과 operator 계열 모두 사용 가능하다. 다만 user 계열 토큰 사용 시에는 Owner ID가 부여되고 해당 정보가 그룹에 속한 모든 에이전트들에게 전파되어 그룹의 소유권을 명확히 하게 된다. 반면에 operator 계열 토큰으로 생성한 그룹은 특정 테넌트에 귀속되지 않는 공유 자원으로 취급된다. Body에 정의하는 roles에 정의된 역할 별로 에이전트 VM 인스턴스가 생성된다. 이때 각 에이전트 VM이 할당받는 vCPU 수와 메모리 용량은 각 역할 별로 미리 정의된 자원 프로파일 정보를 참조하여 결정된다.

curl -sX POST http://host:3000/groups \
  -H "Authorization: Bearer $TENANT_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
        "task": "Draft the release notes for v1.4",
        "roles": ["orchestrator","writer","reviewer"],
        "max_agents": 5
      }'
201 Created
{
  "group_id": "group-1720982500000000000",
  "task": "Draft the release notes for v1.4",
  "agents": [
    { "agent_id": "orchestrator-1", "role": "orchestrator", "profile": "orchestrator",
      "vm_id": "vm-…", "runtimed_url": "http://10.0.1.6:8080", "status": "ready" },
    { "agent_id": "writer-1", "role": "writer", "profile": "writer",
      "vm_id": "vm-…", "runtimed_url": "http://10.0.1.7:8080", "status": "ready" },
    { "agent_id": "reviewer-1", "role": "reviewer", "profile": "reviewer",
      "vm_id": "vm-…", "runtimed_url": "http://10.0.1.8:8080", "status": "ready" }
  ],
  "runtimed_tokens": { "orchestrator-1": "…", "writer-1": "…", "reviewer-1": "…" },
  "feed_url": "/groups/group-…/feed",
  "post_url": "/groups/group-…/post"
}

에이전트 별로 지정되는 ID는 위의 예시 응답에서 보는 것처럼 역할 이름과 인덱스 번호로 구성된다.(writer-1, writer-2, …) runtimed_tokens는 실제 에이전트와 통신하는데 사용되는 인증 토큰으로서 에이전트 생성 시 한 번만 응답 메시지에 실려 반환된다.

2. 태스크 실행 : 그룹에 속하는 단일 에이전트를 대상으로 프롬프트를 보낼 때는 vm_id를 이용해서 POST /vms/{id}/tasks) 방식으로 전달하며, 프롬프트를 그룹 내 전체 에이전트들에게 팬아웃하는 것도 가능한데 아래 예시와 같이 브로드캐스트 API 엔드포인트를 이용한다.

curl -sX POST http://host:3000/groups/$GID/broadcast \
  -H "Authorization: Bearer $TENANT_TOKEN" \
  -H "Content-Type: application/json" -d '{"body":"Status check: where are we?"}'

3. 에이전트 그룹 소멸 : 에이전트 그룹을 소멸시키면 해당 그룹에 속한 모든 에이전트 VM들도 함께 소멸된다.

curl -sX DELETE http://host:3000/groups/$GID -H "Authorization: Bearer $TENANT_TOKEN"

에이전트 팀 단위 운영용 엔드포인트 정리

메서드 · 경로기능 설명
POST/groups그룹 생성(그룹이 만들어 질 때 roles에 정의된 역할마다 VM 하나씩 생성하고 역할 이름과 인덱스 번호를 조합한 에이전트 ID를 부여한 후 에이전트 실행, 에이전트 생성 중 하나라도 실패하면 전체 롤백)
GET/groups그룹 목록 조회(소유권 기반 필터링 적용)
GET/groups/{id}ID로 지정한 그룹의 상세 정보 조회(소속 에이전트의 역할·프로파일·상태 정보, 그룹 일시정지 여부, 그룹 생성시간 정보)
DELETE/groups/{id}그룹 소멸(그룹에 속한 모든 VM까지 함께 소멸, 그룹 메타데이터 삭제, Handoff 문서 저장소 제거)
POST/groups/{id}/broadcast그룹 소속 전체 에이전트 대상 프롬프트 팬아웃 실행(에이전트 별로 ok/busy/error 응답 수신하는데 태스크 수행 중으로 busy 회신한 에이전트는 전달 제외, 팬아웃 완료될 때까지 블록됨)
POST/groups/{id}/pause · /resume그룹 소속 전체 에이전트 대상 일시정지(pause), 다시 실행 시작(resume) (pause 진행 중 부분 실패 시 이미 일시정지된 에이전트들은 다시 실행하는 롤백 지원)
POST/groups/{id}/post그룹 공유 피드에 에이전트 자신을 작성자로 메시지 게시
GET/groups/{id}/feed그룹 공유 피드의 업데이트 실시간 수신을 위한 SSE 방식의 라이브 스트림 연결
GET/groups/{id}/feed/history피드에 저장된 과거 내용 조회(필터 검색 기능 지원)
GET/groups/{id}/handoffHandoff 문서 식별자인 키 목록 조회
PUTGETDELETE/groups/{id}/handoff/{key}키로 지정된 Handoff 문서 저장·읽기·삭제
POST/groups/{id}/agents그룹에 에이전트 추가(해당 에이전트의 role 지정과 profile 설정 가능, 그룹에 설정된 최대 허용 에이전트 수를 초과해서 생성 시도 시에는 400 에러 발생)
DELETE/groups/{id}/agents/{agent_id}에이전트 삭제
PATCH/groups/{id}/agents/{agent_id}생성된 에이전트의 역할 동적 변경
POST/groups/{id}/agents/{agent_id}/restart기존 에이전트 ID는 유지하지만 새로운 VM 생성하고 에이전트 재시작

Handoff 기능 사용시 주의 사항

Handoff 문서의 쓰기는 자체적으로 원자적(Atomic) 동작을 하도록 구현되어 있고 동일한 문서에 여러 에이전트에 쓰기 작업을 하는 것도 직렬화를 통해 한번에 한 에이전트만 쓰기 작업을 하도록 설계되어 있다. 다만 동일한 Handoff 문서를 여러 에이전트가 읽기 작업을 할 때는 전체 읽기 성능을 높이도록 병렬화를 지원하도록 구현되어 있다. 그렇기 때문에 만일 두 개 이상의 독립된 API 호출에서 각각 Handoff 문서를 읽고 그 내용을 바탕으로 문서를 갱신하는 작업을 수행하면 병렬화된 읽기 때문에 문서에 최종적으로 반영되는 내용이 의도한 대로 이루어지지 않을 수 있다. 따라서 이러한 문제를 원천적으로 방지하려면 하나의 Handoff 문서에 쓰기 권한을 가진 에이전트를 단일화해서 운영하는 것을 권장한다.

대화 세션 보존

실행 중의 대화 세션은 각 VM에 할당된 RAM에만 저장되기 때문에 VM이 종료되는 상황이 발생하면 세션도 함께 사라지게 된다. Vantisso는 에이전트의 대화 세션을 VM 종료 시 스냅샷 형태로 호스트에 persistent하게 저장하는 기능을 통해 VM 재기동 등의 상황에서도 에이전트의 대화 세션을 유지할 수 있게 구현되어 있다. 이것을 Vantisso에서는 Transcript 기능이라고 정의한다.

메서드 · 경로기능 설명
GET/transcripts저장된 Transcript 목록 조회(VM ID, 그룹 ID 각각 또는 조합 기준 검색 기능 지원, 저장 최신 순으로 정렬하여 응답, 실제 턴 내용은 제외한 메타데이터만 회신)
GET/transcripts/{session}지정된 세션 ID에 해당하는 단일 대화 세션의 메타데이터와 실제 턴 내용 조회
DELETE/transcripts/{session}지정된 세션 ID에 해당하는 단일 대화 세션의 Transcript 삭제(소유권을 가진 경우에만 삭제 가능)

Transcript 레코드 예시:

{
  "schema_version": 1,
  "session": "INC-4821",
  "vm_id": "vm-…",
  "group_id": "group-…",
  "agent_id": "writer-1",
  "owner": "acme-portal",
  "profile": "support-agent",
  "title": "Summarize ticket INC-4821",
  "turns": [
    { "role": "user", "text": "Summarize ticket INC-4821…" },
    { "role": "assistant", "text": "…" }
  ],
  "saved_at": "2026-07-15T09:12:00Z"
}

에이전트 팀 구성 메타데이터

Vantisso 기반 커스텀 에이전트 팀 구성 및 관리 UI를 개발할 때 필요한 핵심 정보를 제공하는 API 엔드포인트는 다음과 같다.

메서드 · 경로기능 설명
GET/config/profiles · /config/profiles/{name}그룹의 프로파일을 정의한 템플릿 목록 조회와 각 프로파일 템플릿의 상세 정보 조회(사이징 정보, 모델 정보, 시스템 프롬프트, 빌트인 툴 정보, MCP 바인딩 정보)
GETPUT/config/profiles/{name}/stream프로파일의 라이브 토큰 스트리밍 on/off 토글. 프로파일은 전역 템플릿이라 소유권 개념이 없어 operator·user 토큰 모두 호출할 수 있다.
GET/config/providers · /presets · /builtins각각 LLM 프로바이더, VM 사이징 티어, 빌트인 툴에 대한 카탈로그 조회

프롬프트 응답 스트리밍

POST /vms/{id}/tasks?stream=1 호출은 프롬프트 처리에 대한 응답을 단일 버퍼 객체에 모두 담아서 한번에 리턴하는 대신 줄 구분 JSON(NDJSON) 방식을 이용해 한 줄당 한 프레임으로 반환하게 한다. 반환되는 프레임 형식은 다음 예시에서 보는 것과 같이 세 가지 타입을 갖는다.

{ "type": "progress", "text": "running shell: grep -n …" }
{ "type": "token",    "text": "The " }
{ "type": "token",    "text": "root cause " }
{ "type": "result",   "output": "…final answer…", "error": "" }
  • type: "progress" — 에이전트 루프 수행, 툴 호출 시 정해진 스텝마다 전송되며 text 필드가 비어 있는 프레임이 보내지기도 하는데 이는 하트비트 역할을 수행하는 프레임이다. LLM의 접속 속도 제안에 따른 백오프와 같은 재시도 안내 정보도 이 프레임을 이용하여 전달된다.
  • type: "token" — 앞에서 설명한 프로파일의 라이브 토큰 스트리밍이 켜진 경우에만 출력 텍스트의 증분이 프레임으로 전달되며 이것들을 순서대로 이어 붙이면 LLM 응답 출력의 전체가 재구성된다.
  • type: "result" — 스트림당 정확히 마지막에 한번 전달되며 이 마지막 프레임만 읽어도 버퍼링된 객체를 그대로 복원할 수 있다. error 필드가 비어 있으면 성공, 특정 내용으로 채워져 있으면 실패이다.

HTTP 응답은 상태줄과 헤더가 본문보다 먼저 전송되기 때문에 NDJSON 스트림을 전송하려면 첫 프레임을 보내기도 전에 상태를 200 OK로 확정해야 한다. 일단 스트리밍을 시작하면 그 200 OK를 되돌릴 수 있는 방법이 없어서 만일 태스크 실행이 도중에 실패한다면 이미 나간 200 OK500으로 변경하지 못한다. 이런 배경에서 태스크 성공 실패 여부는 result 타입 프레임의 error 필드를 이용해 전달할 수 밖에 없다. 이 경우 HTTP의 상태 코드만으로 태스크 실행 에러를 판단할 수 없고 응답 전체를 수신한 후 판단해야 한다. 따라서 커스텀 에이전트 UI를 구현할 때 수 분도 걸릴 수 있는 장시간 수행 태스크를 고려해서 수신 타임아웃을 넉넉하게 잡을 것을 권장한다.

에러 코드 요약

  • 에러 전송 형식 : {"error":"…"} 형식의 JSON 객체로 통일되어 있다.
코드의미
400필수 필드가 누락되었거나 빈 값과 같은 입력 에러, 유효하지 않은 JSON, 검증 실패, 범위 초과
401Bearer 토큰 부재 또는 불일치
403user 토큰이 operator 전용에 접근하는 것과 같은 인가 위반, 라이선스 만료
404접근하는 자원 자체가 부재, 소유권이 없는 자원에 접근하는 위반(존재 은닉 위장 용도)
405API 호출 경로에 맞지 않는 메서드 사용
409상태 충돌 또는 전제 조건 위반(사용중인 프로파일 삭제 시도, 마지막 하나 남은 operator 삭제 시도, 실행중인 VM에 대한 원본 스냅샷 삭제 시도 등)
413Handoff 문서 1MiB, system.md 파일 64KiB의 페이로드 상한을 초과해서 저장 시도
500예기치 못한 서버 오류
502VM 내부 에이전트 런타임(in-VM runtimed) 접근 실패
503에이전트가 이미 태스크 실행중이라 신규 태스크 수신 거절(Agent busy)
507VM 생성용 호스트 스토리지 부족
508중첩 태스크의 깊이가 한계 초과(태스크 홉 폭주를 방지하기 위함)

체험판 라이선스 관련 부연 설명

체험 기간이 지나 라이선스가 만료되면 에이전트 VM이나 에이전트 그룹 생성(POST /vms, POST /groups) 실행 시 403 {"error":"trial_expired"}라는 에러 리턴을 받게 된다. 신규 생성만 영향을 받으며 기존 에이전트나 그룹에 대한 조회·태스크 실행·VM 소멸 등의 엔드포인트 호출은 라이선스 만료 후에도 정상 실행 가능하다. 아래 예시와 같이 GET /license API 호출을 이용해 라이선스 만료 전 잔여 기간도 확인할 수 있다.

GET /license
→ {
  "type":       "evaluation",           // or "commercial"
  "status":     "active",               // "active" | "grace" | "expired"
  "started_at": "2026-07-01T00:00:00Z",
  "expires_at": "2026-07-31T00:00:00Z",
  "days_left":  21,
  "enforced":   true
}
© 2026 AXONN Vantis Inc. All rights reserved.