ai
Covers 8 API operations in the ai category.
| Method | Path | Description |
|---|---|---|
| GET | /v1/ai/models | AI 모델 카탈로그 (runlot ai models) |
| GET | /v1/orgs/{orgSlug}/projects/{projectName}/ai | AI 상태 (runlot ai usage) |
| POST | /v1/orgs/{orgSlug}/projects/{projectName}/ai | AI 를 켠다 (배포가 "ai": true 를 읽고 부른다) |
| DELETE | /v1/orgs/{orgSlug}/projects/{projectName}/ai | AI 를 끈다 (runlot ai delete) |
| GET | /v1/orgs/{orgSlug}/ai/credit | AI 크레딧 잔액과 자동 충전 설정 (runlot ai credit) |
| GET | /v1/orgs/{orgSlug}/ai/ledger | AI 원장 |
| POST | /v1/orgs/{orgSlug}/ai/credit/checkout | 크레딧 충전 체크아웃 |
| PUT | /v1/orgs/{orgSlug}/ai/autotopup | 자동 충전을 켜거나 끈다 |
GET /v1/ai/models
env.ai 가 부를 수 있는 모델의 전부다 (docs/ai.md §2.3). 로그인만 하면
볼 수 있다 — 무엇을 살 수 있는지는 org 의 비밀이 아니고, 이 목록이 곧
가격표다.
차선이 둘이다. frontier 는 프로바이더 정가 그대로 통과시킨다
(listPrice: true, 마진 0) — 그래서 모델 id 에 프로바이더 이름이 그대로
있고 provider 도 실린다. value 는 우리가 도매로 사서 우리 값으로 파는
가성비 모델이라 provider 를 안 싣는다: 그 값은 우리가 언제든 갈아끼운다.
단가는 100 만 토큰당 마이크로센트 정수다 (1 µ¢ = 1e-8 USD). 소수 자리를 서버가 정하지 않는 것이 요점이다 — 작은 호출이 센트로 반올림하면 0 이 되고 (docs/ai.md §3.1), 그 사실이 포맷 문자열 하나에 묶이면 안 된다.
목록에 없는 모델 id 는 호출에서 400 이다. 임의 모델 패스스루는 없다.
operationId listAIModels
| Status code | Description | Response body |
|---|---|---|
| 200 | 카탈로그 | object |
| 401 | — | — |
GET /v1/orgs/{orgSlug}/projects/{projectName}/ai
부여 여부·상한 넷·org 잔액·최근 24 시간 사용량 (docs/ai.md §6). 부여가
없어도 상한은 채워 온다 — "켜면 이런 상한이 됩니다" 의 재료이고,
granted 가 진짜 상태다.
maxOutputTokens·maxInputTokens 의 0 은 "모델이 정한다" 다.
spentMicroCents24h 는 usage_hourly 에서 못 만드는 수라 원장에서 따로
읽는다 — 단가가 시점의 함수이기 때문이고, 그것이 0046 이 표를 둘로 가른
이유다.
viewer 이상.
operationId getAI
| Status code | Description | Response body |
|---|---|---|
| 200 | AI 상태 | AIStatus |
| 403 | — | — |
| 404 | — | — |
| 503 | no_core | Error |
POST /v1/orgs/{orgSlug}/projects/{projectName}/ai
멱등이다. 요청 본문이 없다 — 상한도 모델 목록도 사용자가 정하는 값이 아니다.
켜지면 노드가 다음 수렴에서 env.ai 를 연결한다. 번들도 "ai": true
여야 실린다 — 부여는 CP 의 것이고 어떤 시스템 워커를 띄울지는 번들의
것이다.
노드 자격 검사가 없다: 상류(Bedrock·Vertex)는 노드 site.env 의 값이라 그 사실이 CP 에 등록돼 있지 않다. 자격 없는 노드에서는 부여가 통과하고 호출이 503 이다 (docs/ai.md §9 의 열린 것).
member 이상. 감사 ai.grant.
operationId grantAI
| Status code | Description | Response body |
|---|---|---|
| 200 | 부여 상태 (이미 있었으면 기존 값) | AIStatus |
| 403 | — | — |
| 404 | — | — |
| 503 | no_core | Error |
DELETE /v1/orgs/{orgSlug}/projects/{projectName}/ai
다음 배포부터 env.ai 가 없다. 멱등이다.
원장은 안 지운다 — 이미 지불한 돈의 기록이다. 크레딧 잔액도 그대로다: 잔액은 org 의 것이고 이 부여는 프로젝트의 것이다.
admin. 감사 ai.revoke.
operationId revokeAI
| Status code | Description | Response body |
|---|---|---|
| 204 | 껐다 | — |
| 403 | — | — |
| 404 | — | — |
| 503 | no_core | Error |
GET /v1/orgs/{orgSlug}/ai/credit
잔액은 마이크로센트이고 음수일 수 있다 (docs/ai.md §3.3 — 잔액 검사는 호출 전이고 차감은 뒤라 시작한 호출 하나가 잔액을 넘길 수 있다).
hasPaymentMethod 가 거짓이면 자동 충전을 켤 수 없다 — 저장된 카드가
없기 때문이고, 첫 충전은 반드시 수동이다 (그것이 카드를 저장한다).
autoTopupsToday 와 autoTopupPerDay 를 같이 준다. 그 상한이 곧 하루
지출 천장이라 화면이 둘을 같이 보여야 "왜 안 충전됐지" 에 답이 된다.
member 이상.
operationId getAICredit
| Status code | Description | Response body |
|---|---|---|
| 200 | 크레딧 상태 | AICredit |
| 403 | — | — |
GET /v1/orgs/{orgSlug}/ai/ledger
금액의 정본이다 (0046). kind 는 call(음수)·topup(양수)·adjust.
커서는 ledger_id — 시각으로 자르면 같은 밀리초의 행 둘이 페이지 경계에서
갈린다.
member 이상.
operationId listAILedger
| Parameter | Location | Required | Type | Description |
|---|---|---|---|---|
limit | query | No | integer | — |
before | query | No | integer | 이 ledger_id 보다 앞의 행 |
| Status code | Description | Response body |
|---|---|---|
| 200 | 원장 | object |
| 403 | — | — |
POST /v1/orgs/{orgSlug}/ai/credit/checkout
임베드 체크아웃 URL 을 준다 (docs/billing.md §3.1 과 같은 모양 — 대시보드가 iframe 으로 띄운다).
돌아온 브라우저는 증거가 아니다. 잔액을 올리는 것은 order.paid 웹훅
하나이고, 화면은 성공 사건 뒤에 잔액을 폴링한다.
microCents 는 열거된 티어 중 하나여야 한다 — 자동 충전이 같은 목록을
쓰므로 (사람 없는 자리에서 도는 청구라 금액이 열거된 값이어야 한다) 수동만
자유롭게 두면 표가 둘이 된다.
admin.
operationId createAICreditCheckout
Request body: application/json · object
| Status code | Description | Response body |
|---|---|---|
| 200 | 체크아웃 | object |
| 400 | 충전 단위가 목록에 없다 · returnTo 가 허용된 주소가 아니다 | Error |
| 403 | — | — |
| 501 | billing_off — 이 배치에 크레딧 상품이 없다 | Error |
PUT /v1/orgs/{orgSlug}/ai/autotopup
켜는 것은 명시 동의다 (docs/ai.md §3.5). 화면이 "잔액이 X 아래로 내려가면 저장된 카드에 Y 를 자동으로 청구합니다. 하루 최대 N 회" 를 그대로 보여 주고 체크를 받는다 — off-session 청구는 카드사 규정이 사전 동의를 요구하고, 그 문장이 곧 동의의 내용이다.
서버가 보는 것 셋: 저장된 결제 수단이 있는가 (없으면 409), 금액이 티어 목록에 있는가, 그리고 기준이 0 보다 크고 충전 금액보다 작은가. 기준이 0 이면 충전이 비동기인 그 창 전부가 402 이고, 기준이 충전액 이상이면 한 번 충전해도 여전히 기준 아래라 하루 상한까지 계속 충전한다 — 설정이 아니라 함정이다.
admin. 감사 ai.autotopup.on / ai.autotopup.off.
operationId setAIAutoTopup
Request body: application/json · object
| Status code | Description | Response body |
|---|---|---|
| 200 | 켰다 | object |
| 204 | 껐다 | — |
| 400 | 금액이 티어에 없다 · 기준이 0 이하 · 기준이 충전 금액 이상 | Error |
| 403 | — | — |
| 409 | no_payment_method — 저장된 카드가 없다. 먼저 한 번 수동으로 충전한다 | Error |