@runlot/api 0.1.0-rc.40 → 0.1.0-rc.42
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.ts +62 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +87 -0
- package/dist/index.js.map +1 -1
- package/dist/schema.d.ts +932 -11
- package/dist/schema.d.ts.map +1 -1
- package/package.json +2 -2
package/dist/schema.d.ts
CHANGED
|
@@ -38,7 +38,7 @@ export interface paths {
|
|
|
38
38
|
/**
|
|
39
39
|
* GitHub OAuth 시작
|
|
40
40
|
* @description `redirect` 는 로그인이 끝난 뒤 토큰을 fragment 로 실어 돌아갈 클라이언트
|
|
41
|
-
* 콜백이다 (`https://dash.runlot.
|
|
41
|
+
* 콜백이다 (`https://dash.runlot.io/login/callback`). 서버의 허용 목록
|
|
42
42
|
* (`RUNLOT_GITHUB_REDIRECTS`, 기본은 `RUNLOT_PUBLIC_URL`) 접두에 맞아야 한다.
|
|
43
43
|
* 302 로 GitHub authorize 페이지로 보낸다. 브라우저가 따라가는 경로라
|
|
44
44
|
* 클라이언트 라이브러리는 부르지 않는다 — `window.location` 으로 연다.
|
|
@@ -128,6 +128,36 @@ export interface paths {
|
|
|
128
128
|
patch?: never;
|
|
129
129
|
trace?: never;
|
|
130
130
|
};
|
|
131
|
+
"/v1/config": {
|
|
132
|
+
parameters: {
|
|
133
|
+
query?: never;
|
|
134
|
+
header?: never;
|
|
135
|
+
path?: never;
|
|
136
|
+
cookie?: never;
|
|
137
|
+
};
|
|
138
|
+
/**
|
|
139
|
+
* 이 배치의 이름들
|
|
140
|
+
* @description 대시보드가 **어느 배치에 붙어 있는지** 알아보는 자리다
|
|
141
|
+
* (`docs/environments.md §3.2`). 대시보드는 정적 빌드 하나라 배치마다
|
|
142
|
+
* 다른 값을 알 길이 없었고, 화면이 그것을 문자열로 박고 있었다 —
|
|
143
|
+
* 환경이 둘이 되면 dev 화면이 프로덕션의 주소를 안내하고 그 안내는
|
|
144
|
+
* 그럴듯해서 아무 시험에도 안 잡힌다.
|
|
145
|
+
*
|
|
146
|
+
* 인증이 없다: 로그인 화면에도 문서 링크가 있다. 여기 실리는 것은
|
|
147
|
+
* 랜딩 페이지에 이미 적힌 이름들뿐이다.
|
|
148
|
+
*
|
|
149
|
+
* 기능의 켜짐/꺼짐은 여기 없다 — 결제·저장소·이메일은 각자의 끝점이
|
|
150
|
+
* 자기 상태를 말한다.
|
|
151
|
+
*/
|
|
152
|
+
get: operations["getSiteConfig"];
|
|
153
|
+
put?: never;
|
|
154
|
+
post?: never;
|
|
155
|
+
delete?: never;
|
|
156
|
+
options?: never;
|
|
157
|
+
head?: never;
|
|
158
|
+
patch?: never;
|
|
159
|
+
trace?: never;
|
|
160
|
+
};
|
|
131
161
|
"/v1/me": {
|
|
132
162
|
parameters: {
|
|
133
163
|
query?: never;
|
|
@@ -166,6 +196,55 @@ export interface paths {
|
|
|
166
196
|
patch?: never;
|
|
167
197
|
trace?: never;
|
|
168
198
|
};
|
|
199
|
+
"/v1/orgs/{orgSlug}": {
|
|
200
|
+
parameters: {
|
|
201
|
+
query?: never;
|
|
202
|
+
header?: never;
|
|
203
|
+
path: {
|
|
204
|
+
orgSlug: components["parameters"]["OrgSlug"];
|
|
205
|
+
};
|
|
206
|
+
cookie?: never;
|
|
207
|
+
};
|
|
208
|
+
get?: never;
|
|
209
|
+
put?: never;
|
|
210
|
+
post?: never;
|
|
211
|
+
/**
|
|
212
|
+
* 조직을 지운다 (`runlot org delete`)
|
|
213
|
+
* @description admin 이상. **되돌릴 수 없다.**
|
|
214
|
+
*
|
|
215
|
+
* `confirm` 에 조직 슬러그를 그대로 실어야 한다 (앞뒤 공백은 다듬는다).
|
|
216
|
+
* 확인이 API 에 있는 이유는 이 표면을 부르는 곳이 화면·CLI·스크립트
|
|
217
|
+
* 셋이기 때문이다 — 셋이 각자 구현하면 하나가 빠진 것을 아무도 못 본다.
|
|
218
|
+
*
|
|
219
|
+
* **비어 있을 때만 지워진다.** 프로젝트·도메인·저장소·DNS 존이 남아
|
|
220
|
+
* 있으면 409 `org_not_empty` 이고, 봉투의 `details.holdings` 에 종류별
|
|
221
|
+
* 개수와 이름 몇 개가 실린다. 근거는 스키마다 (0044·0020·0032 의
|
|
222
|
+
* RESTRICT): 행을 지워도 노드의 데이터는 남고, 가리키는 것이 없어진
|
|
223
|
+
* 데이터는 지울 방법도 청구할 근거도 없다.
|
|
224
|
+
*
|
|
225
|
+
* 그 밖의 거절 둘 — 개인 조직은 `personal_org` (첫 로그인이 만든 조직이고
|
|
226
|
+
* 다시 만들어 주지 않는다), 유료 구독이 살아 있으면 `active_subscription`
|
|
227
|
+
* (조직만 사라지고 카드에서는 계속 빠져나가는 것을 막는다).
|
|
228
|
+
*
|
|
229
|
+
* 감사 `org.delete` 는 **조직보다 오래 산다** — `audit_events.org_id` 는
|
|
230
|
+
* ON DELETE SET NULL 이고 슬러그는 `target` 에 남는다.
|
|
231
|
+
*/
|
|
232
|
+
delete: operations["deleteOrg"];
|
|
233
|
+
options?: never;
|
|
234
|
+
head?: never;
|
|
235
|
+
/**
|
|
236
|
+
* 조직 표시 이름을 바꾼다 (`runlot org rename`)
|
|
237
|
+
* @description admin 이상. 감사 `org.rename`.
|
|
238
|
+
*
|
|
239
|
+
* **슬러그는 이 표면에 없다.** 슬러그는 주소가 되는 이름이라
|
|
240
|
+
* (`<project>.<slug>.runlot.app`, 인증서 SAN, clone 주소, 고객 저장소에
|
|
241
|
+
* 커밋된 `runlot.json` 의 `"org"`) 바꾸려면 옛 이름을 한동안 살려 둬야
|
|
242
|
+
* 하고, 그 별칭이 정확히 0027 이 만들고 0037 이 없앤 것이다
|
|
243
|
+
* (docs/org-settings.md §2).
|
|
244
|
+
*/
|
|
245
|
+
patch: operations["updateOrg"];
|
|
246
|
+
trace?: never;
|
|
247
|
+
};
|
|
169
248
|
"/v1/orgs/{orgSlug}/projects": {
|
|
170
249
|
parameters: {
|
|
171
250
|
query?: never;
|
|
@@ -206,6 +285,43 @@ export interface paths {
|
|
|
206
285
|
get: operations["getProject"];
|
|
207
286
|
put?: never;
|
|
208
287
|
post?: never;
|
|
288
|
+
/**
|
|
289
|
+
* 프로젝트를 종결한다 (`runlot project delete`)
|
|
290
|
+
* @description admin 이상. **되돌릴 수 없고 복구 세대를 남기지 않는다.** 돌아갈
|
|
291
|
+
* 프로젝트가 없으므로 pre-delete 세대는 아무도 못 쓰는 blob 이 된다.
|
|
292
|
+
* 필요한 데이터는 먼저 `runlot pg export` 로 받아 둬야 한다.
|
|
293
|
+
*
|
|
294
|
+
* `confirm` 에 프로젝트 이름을 그대로 실어야 한다. 서버가 확인하는 이유는
|
|
295
|
+
* 조직 삭제와 같다 — 화면·CLI·스크립트 셋이 이 표면을 부른다.
|
|
296
|
+
*
|
|
297
|
+
* 라우팅 → 진행 중 요청·커밋 → 노드 데이터와 객체 저장소 → git 저장소·
|
|
298
|
+
* backup → 메타데이터 순으로 종결한다. 202 는 시작했다는 뜻이고,
|
|
299
|
+
* `GET /v1/orgs/{orgSlug}/operations/{opId}` 로 끝을 본다.
|
|
300
|
+
*/
|
|
301
|
+
delete: operations["deleteProject"];
|
|
302
|
+
options?: never;
|
|
303
|
+
head?: never;
|
|
304
|
+
patch?: never;
|
|
305
|
+
trace?: never;
|
|
306
|
+
};
|
|
307
|
+
"/v1/orgs/{orgSlug}/operations/{opId}": {
|
|
308
|
+
parameters: {
|
|
309
|
+
query?: never;
|
|
310
|
+
header?: never;
|
|
311
|
+
path: {
|
|
312
|
+
orgSlug: components["parameters"]["OrgSlug"];
|
|
313
|
+
opId: string;
|
|
314
|
+
};
|
|
315
|
+
cookie?: never;
|
|
316
|
+
};
|
|
317
|
+
/**
|
|
318
|
+
* 조직 안의 연산 진행을 본다
|
|
319
|
+
* @description viewer 이상. 프로젝트가 사라진 뒤에도 종결 연산의 완료를 볼 수 있는
|
|
320
|
+
* 경로다. project 아래에 두면 성공하는 순간 그 경로 자체가 404 가 된다.
|
|
321
|
+
*/
|
|
322
|
+
get: operations["getOrgOperation"];
|
|
323
|
+
put?: never;
|
|
324
|
+
post?: never;
|
|
209
325
|
delete?: never;
|
|
210
326
|
options?: never;
|
|
211
327
|
head?: never;
|
|
@@ -853,6 +969,218 @@ export interface paths {
|
|
|
853
969
|
patch?: never;
|
|
854
970
|
trace?: never;
|
|
855
971
|
};
|
|
972
|
+
"/v1/ai/models": {
|
|
973
|
+
parameters: {
|
|
974
|
+
query?: never;
|
|
975
|
+
header?: never;
|
|
976
|
+
path?: never;
|
|
977
|
+
cookie?: never;
|
|
978
|
+
};
|
|
979
|
+
/**
|
|
980
|
+
* AI 모델 카탈로그 (`runlot ai models`)
|
|
981
|
+
* @description `env.ai` 가 부를 수 있는 모델의 전부다 (docs/ai.md §2.3). **로그인만 하면
|
|
982
|
+
* 볼 수 있다** — 무엇을 살 수 있는지는 org 의 비밀이 아니고, 이 목록이 곧
|
|
983
|
+
* 가격표다.
|
|
984
|
+
*
|
|
985
|
+
* 차선이 둘이다. `frontier` 는 프로바이더 **정가 그대로** 통과시킨다
|
|
986
|
+
* (`listPrice: true`, 마진 0) — 그래서 모델 id 에 프로바이더 이름이 그대로
|
|
987
|
+
* 있고 `provider` 도 실린다. `value` 는 우리가 도매로 사서 우리 값으로 파는
|
|
988
|
+
* 가성비 모델이라 `provider` 를 **안 싣는다**: 그 값은 우리가 언제든 갈아끼운다.
|
|
989
|
+
*
|
|
990
|
+
* 단가는 100 만 토큰당 **마이크로센트** 정수다 (1 µ¢ = 1e-8 USD). 소수
|
|
991
|
+
* 자리를 서버가 정하지 않는 것이 요점이다 — 작은 호출이 센트로 반올림하면
|
|
992
|
+
* 0 이 되고 (docs/ai.md §3.1), 그 사실이 포맷 문자열 하나에 묶이면 안 된다.
|
|
993
|
+
*
|
|
994
|
+
* 목록에 없는 모델 id 는 호출에서 400 이다. **임의 모델 패스스루는 없다.**
|
|
995
|
+
*/
|
|
996
|
+
get: operations["listAIModels"];
|
|
997
|
+
put?: never;
|
|
998
|
+
post?: never;
|
|
999
|
+
delete?: never;
|
|
1000
|
+
options?: never;
|
|
1001
|
+
head?: never;
|
|
1002
|
+
patch?: never;
|
|
1003
|
+
trace?: never;
|
|
1004
|
+
};
|
|
1005
|
+
"/v1/orgs/{orgSlug}/projects/{projectName}/ai": {
|
|
1006
|
+
parameters: {
|
|
1007
|
+
query?: never;
|
|
1008
|
+
header?: never;
|
|
1009
|
+
path: {
|
|
1010
|
+
orgSlug: components["parameters"]["OrgSlug"];
|
|
1011
|
+
projectName: components["parameters"]["ProjectName"];
|
|
1012
|
+
};
|
|
1013
|
+
cookie?: never;
|
|
1014
|
+
};
|
|
1015
|
+
/**
|
|
1016
|
+
* AI 상태 (`runlot ai usage`)
|
|
1017
|
+
* @description 부여 여부·상한 넷·org 잔액·최근 24 시간 사용량 (docs/ai.md §6). 부여가
|
|
1018
|
+
* 없어도 상한은 채워 온다 — "켜면 이런 상한이 됩니다" 의 재료이고,
|
|
1019
|
+
* `granted` 가 진짜 상태다.
|
|
1020
|
+
*
|
|
1021
|
+
* `maxOutputTokens`·`maxInputTokens` 의 `0` 은 **"모델이 정한다"** 다.
|
|
1022
|
+
*
|
|
1023
|
+
* `spentMicroCents24h` 는 `usage_hourly` 에서 못 만드는 수라 원장에서 따로
|
|
1024
|
+
* 읽는다 — 단가가 시점의 함수이기 때문이고, 그것이 0046 이 표를 둘로 가른
|
|
1025
|
+
* 이유다.
|
|
1026
|
+
*
|
|
1027
|
+
* viewer 이상.
|
|
1028
|
+
*/
|
|
1029
|
+
get: operations["getAI"];
|
|
1030
|
+
put?: never;
|
|
1031
|
+
/**
|
|
1032
|
+
* AI 를 켠다 (배포가 `"ai": true` 를 읽고 부른다)
|
|
1033
|
+
* @description **멱등이다.** 요청 본문이 없다 — 상한도 모델 목록도 사용자가 정하는 값이
|
|
1034
|
+
* 아니다.
|
|
1035
|
+
*
|
|
1036
|
+
* 켜지면 노드가 다음 수렴에서 `env.ai` 를 연결한다. **번들도 `"ai": true`
|
|
1037
|
+
* 여야 실린다** — 부여는 CP 의 것이고 어떤 시스템 워커를 띄울지는 번들의
|
|
1038
|
+
* 것이다.
|
|
1039
|
+
*
|
|
1040
|
+
* 노드 자격 검사가 **없다**: 상류(Bedrock·Vertex)는 노드 site.env 의 값이라
|
|
1041
|
+
* 그 사실이 CP 에 등록돼 있지 않다. 자격 없는 노드에서는 부여가 통과하고
|
|
1042
|
+
* 호출이 503 이다 (docs/ai.md §9 의 열린 것).
|
|
1043
|
+
*
|
|
1044
|
+
* member 이상. 감사 `ai.grant`.
|
|
1045
|
+
*/
|
|
1046
|
+
post: operations["grantAI"];
|
|
1047
|
+
/**
|
|
1048
|
+
* AI 를 끈다 (`runlot ai delete`)
|
|
1049
|
+
* @description 다음 배포부터 `env.ai` 가 없다. 멱등이다.
|
|
1050
|
+
*
|
|
1051
|
+
* **원장은 안 지운다** — 이미 지불한 돈의 기록이다. 크레딧 잔액도 그대로다:
|
|
1052
|
+
* 잔액은 org 의 것이고 이 부여는 프로젝트의 것이다.
|
|
1053
|
+
*
|
|
1054
|
+
* admin. 감사 `ai.revoke`.
|
|
1055
|
+
*/
|
|
1056
|
+
delete: operations["revokeAI"];
|
|
1057
|
+
options?: never;
|
|
1058
|
+
head?: never;
|
|
1059
|
+
patch?: never;
|
|
1060
|
+
trace?: never;
|
|
1061
|
+
};
|
|
1062
|
+
"/v1/orgs/{orgSlug}/ai/credit": {
|
|
1063
|
+
parameters: {
|
|
1064
|
+
query?: never;
|
|
1065
|
+
header?: never;
|
|
1066
|
+
path: {
|
|
1067
|
+
orgSlug: components["parameters"]["OrgSlug"];
|
|
1068
|
+
};
|
|
1069
|
+
cookie?: never;
|
|
1070
|
+
};
|
|
1071
|
+
/**
|
|
1072
|
+
* AI 크레딧 잔액과 자동 충전 설정 (`runlot ai credit`)
|
|
1073
|
+
* @description 잔액은 **마이크로센트**이고 음수일 수 있다 (docs/ai.md §3.3 — 잔액 검사는
|
|
1074
|
+
* 호출 전이고 차감은 뒤라 시작한 호출 하나가 잔액을 넘길 수 있다).
|
|
1075
|
+
*
|
|
1076
|
+
* `hasPaymentMethod` 가 거짓이면 자동 충전을 켤 수 없다 — 저장된 카드가
|
|
1077
|
+
* 없기 때문이고, **첫 충전은 반드시 수동이다** (그것이 카드를 저장한다).
|
|
1078
|
+
*
|
|
1079
|
+
* `autoTopupsToday` 와 `autoTopupPerDay` 를 같이 준다. 그 상한이 곧 하루
|
|
1080
|
+
* 지출 천장이라 화면이 둘을 같이 보여야 "왜 안 충전됐지" 에 답이 된다.
|
|
1081
|
+
*
|
|
1082
|
+
* member 이상.
|
|
1083
|
+
*/
|
|
1084
|
+
get: operations["getAICredit"];
|
|
1085
|
+
put?: never;
|
|
1086
|
+
post?: never;
|
|
1087
|
+
delete?: never;
|
|
1088
|
+
options?: never;
|
|
1089
|
+
head?: never;
|
|
1090
|
+
patch?: never;
|
|
1091
|
+
trace?: never;
|
|
1092
|
+
};
|
|
1093
|
+
"/v1/orgs/{orgSlug}/ai/ledger": {
|
|
1094
|
+
parameters: {
|
|
1095
|
+
query?: never;
|
|
1096
|
+
header?: never;
|
|
1097
|
+
path: {
|
|
1098
|
+
orgSlug: components["parameters"]["OrgSlug"];
|
|
1099
|
+
};
|
|
1100
|
+
cookie?: never;
|
|
1101
|
+
};
|
|
1102
|
+
/**
|
|
1103
|
+
* AI 원장
|
|
1104
|
+
* @description 금액의 정본이다 (0046). `kind` 는 `call`(음수)·`topup`(양수)·`adjust`.
|
|
1105
|
+
* 커서는 `ledger_id` — 시각으로 자르면 같은 밀리초의 행 둘이 페이지 경계에서
|
|
1106
|
+
* 갈린다.
|
|
1107
|
+
*
|
|
1108
|
+
* member 이상.
|
|
1109
|
+
*/
|
|
1110
|
+
get: operations["listAILedger"];
|
|
1111
|
+
put?: never;
|
|
1112
|
+
post?: never;
|
|
1113
|
+
delete?: never;
|
|
1114
|
+
options?: never;
|
|
1115
|
+
head?: never;
|
|
1116
|
+
patch?: never;
|
|
1117
|
+
trace?: never;
|
|
1118
|
+
};
|
|
1119
|
+
"/v1/orgs/{orgSlug}/ai/credit/checkout": {
|
|
1120
|
+
parameters: {
|
|
1121
|
+
query?: never;
|
|
1122
|
+
header?: never;
|
|
1123
|
+
path: {
|
|
1124
|
+
orgSlug: components["parameters"]["OrgSlug"];
|
|
1125
|
+
};
|
|
1126
|
+
cookie?: never;
|
|
1127
|
+
};
|
|
1128
|
+
get?: never;
|
|
1129
|
+
put?: never;
|
|
1130
|
+
/**
|
|
1131
|
+
* 크레딧 충전 체크아웃
|
|
1132
|
+
* @description 임베드 체크아웃 URL 을 준다 (docs/billing.md §3.1 과 같은 모양 — 대시보드가
|
|
1133
|
+
* iframe 으로 띄운다).
|
|
1134
|
+
*
|
|
1135
|
+
* **돌아온 브라우저는 증거가 아니다.** 잔액을 올리는 것은 `order.paid` 웹훅
|
|
1136
|
+
* 하나이고, 화면은 성공 사건 뒤에 잔액을 폴링한다.
|
|
1137
|
+
*
|
|
1138
|
+
* `microCents` 는 열거된 티어 중 하나여야 한다 — 자동 충전이 같은 목록을
|
|
1139
|
+
* 쓰므로 (사람 없는 자리에서 도는 청구라 금액이 열거된 값이어야 한다) 수동만
|
|
1140
|
+
* 자유롭게 두면 표가 둘이 된다.
|
|
1141
|
+
*
|
|
1142
|
+
* admin.
|
|
1143
|
+
*/
|
|
1144
|
+
post: operations["createAICreditCheckout"];
|
|
1145
|
+
delete?: never;
|
|
1146
|
+
options?: never;
|
|
1147
|
+
head?: never;
|
|
1148
|
+
patch?: never;
|
|
1149
|
+
trace?: never;
|
|
1150
|
+
};
|
|
1151
|
+
"/v1/orgs/{orgSlug}/ai/autotopup": {
|
|
1152
|
+
parameters: {
|
|
1153
|
+
query?: never;
|
|
1154
|
+
header?: never;
|
|
1155
|
+
path: {
|
|
1156
|
+
orgSlug: components["parameters"]["OrgSlug"];
|
|
1157
|
+
};
|
|
1158
|
+
cookie?: never;
|
|
1159
|
+
};
|
|
1160
|
+
get?: never;
|
|
1161
|
+
/**
|
|
1162
|
+
* 자동 충전을 켜거나 끈다
|
|
1163
|
+
* @description **켜는 것은 명시 동의다** (docs/ai.md §3.5). 화면이 "잔액이 X 아래로
|
|
1164
|
+
* 내려가면 저장된 카드에 Y 를 자동으로 청구합니다. 하루 최대 N 회" 를 그대로
|
|
1165
|
+
* 보여 주고 체크를 받는다 — off-session 청구는 카드사 규정이 사전 동의를
|
|
1166
|
+
* 요구하고, 그 문장이 곧 동의의 내용이다.
|
|
1167
|
+
*
|
|
1168
|
+
* 서버가 보는 것 셋: 저장된 결제 수단이 있는가 (없으면 409), 금액이 티어
|
|
1169
|
+
* 목록에 있는가, 그리고 기준이 **0 보다 크고 충전 금액보다 작은가**. 기준이
|
|
1170
|
+
* 0 이면 충전이 비동기인 그 창 전부가 402 이고, 기준이 충전액 이상이면 한 번
|
|
1171
|
+
* 충전해도 여전히 기준 아래라 하루 상한까지 계속 충전한다 — 설정이 아니라
|
|
1172
|
+
* 함정이다.
|
|
1173
|
+
*
|
|
1174
|
+
* admin. 감사 `ai.autotopup.on` / `ai.autotopup.off`.
|
|
1175
|
+
*/
|
|
1176
|
+
put: operations["setAIAutoTopup"];
|
|
1177
|
+
post?: never;
|
|
1178
|
+
delete?: never;
|
|
1179
|
+
options?: never;
|
|
1180
|
+
head?: never;
|
|
1181
|
+
patch?: never;
|
|
1182
|
+
trace?: never;
|
|
1183
|
+
};
|
|
856
1184
|
"/v1/orgs/{orgSlug}/projects/{projectName}/email": {
|
|
857
1185
|
parameters: {
|
|
858
1186
|
query?: never;
|
|
@@ -1601,7 +1929,7 @@ export interface paths {
|
|
|
1601
1929
|
/**
|
|
1602
1930
|
* 커스텀 도메인을 연결한다 (`runlot domain add`)
|
|
1603
1931
|
* @description 이름은 소문자·punycode 로 정규화해 저장한다. 와일드카드와 우리
|
|
1604
|
-
* 도메인(`*.runlot.app`·`*.runlot.dev`·앱 도메인) 아래 이름은 받지 않는다.
|
|
1932
|
+
* 도메인(`*.runlot.app`·`*.runlot.dev`·`*.runlot.io`·앱 도메인) 아래 이름은 받지 않는다.
|
|
1605
1933
|
*
|
|
1606
1934
|
* 레코드는 `pending_dns` 상태로 생성되고 **그 순간부터 해당 이름을 예약한다.** 검증
|
|
1607
1935
|
* 중에도 다른 프로젝트가 같은 이름을 사용할 수 없다. 연결되기 전까지는
|
|
@@ -3011,7 +3339,7 @@ export interface components {
|
|
|
3011
3339
|
projectId: string;
|
|
3012
3340
|
opId: string;
|
|
3013
3341
|
/** @enum {string} */
|
|
3014
|
-
kind: "restore_generation" | "delete_database" | "evict" | "restore";
|
|
3342
|
+
kind: "restore_generation" | "delete_database" | "delete_project" | "evict" | "restore";
|
|
3015
3343
|
/** Format: int64 */
|
|
3016
3344
|
epoch: number;
|
|
3017
3345
|
node?: string;
|
|
@@ -3162,6 +3490,14 @@ export interface components {
|
|
|
3162
3490
|
/** Format: date-time */
|
|
3163
3491
|
addedAt: string;
|
|
3164
3492
|
};
|
|
3493
|
+
/** @description 조직이 아직 들고 있는 것 한 종류 (`org_not_empty` 의 details). */
|
|
3494
|
+
OrgHolding: {
|
|
3495
|
+
/** @enum {string} */
|
|
3496
|
+
kind: "projects" | "domains" | "repos" | "zones";
|
|
3497
|
+
count: number;
|
|
3498
|
+
/** @description 앞의 몇 개만. 전부 실으면 오류 메시지가 화면을 넘긴다. */
|
|
3499
|
+
names?: string[];
|
|
3500
|
+
};
|
|
3165
3501
|
/**
|
|
3166
3502
|
* @description `expired` 는 시각 비교의 결과이지 열이 아니다 — 초대는 만료되었다고
|
|
3167
3503
|
* 표시되지 않고, 만료 시각이 지났을 뿐이다.
|
|
@@ -3324,6 +3660,124 @@ export interface components {
|
|
|
3324
3660
|
*/
|
|
3325
3661
|
mailIn: number;
|
|
3326
3662
|
};
|
|
3663
|
+
/** @description 카탈로그 한 줄 (docs/ai.md §2.3). */
|
|
3664
|
+
AIModel: {
|
|
3665
|
+
/** @description `env.ai.run()` 에 적는 문자열. 프론티어는 `<provider>/<model>`, 가성비 모델은 `@runlot/<model>` */
|
|
3666
|
+
id: string;
|
|
3667
|
+
/** @enum {string} */
|
|
3668
|
+
lane: "frontier" | "value";
|
|
3669
|
+
display: string;
|
|
3670
|
+
/** @description 모델을 만든 곳 (Anthropic·Google·Meta…) */
|
|
3671
|
+
vendor: string;
|
|
3672
|
+
/**
|
|
3673
|
+
* @description 우리가 부르는 곳. **프론티어에서만 실린다** — 가성비 모델은 우리가
|
|
3674
|
+
* 갈아끼우는 값이라 계약이 아니다.
|
|
3675
|
+
*/
|
|
3676
|
+
provider?: string;
|
|
3677
|
+
/** @description 모델 자체의 컨텍스트 */
|
|
3678
|
+
contextTokens: number;
|
|
3679
|
+
/**
|
|
3680
|
+
* @description Runlot 이 이 모델에 허용하는 입력 상한. 대부분 contextTokens 와 같고,
|
|
3681
|
+
* GPT-5.6 Terra 는 272,000 — 그 뒤는 요청 전체가 장문 단가로 바뀌므로
|
|
3682
|
+
* 표준 단가 하나만 광고하는 카탈로그가 그 앞에서 자른다.
|
|
3683
|
+
*/
|
|
3684
|
+
maxInputTokens: number;
|
|
3685
|
+
maxOutputTokens: number;
|
|
3686
|
+
/**
|
|
3687
|
+
* Format: int64
|
|
3688
|
+
* @description 100 만 입력 토큰당 마이크로센트
|
|
3689
|
+
*/
|
|
3690
|
+
inPerMTok: number;
|
|
3691
|
+
/** Format: int64 */
|
|
3692
|
+
outPerMTok: number;
|
|
3693
|
+
/**
|
|
3694
|
+
* Format: int64
|
|
3695
|
+
* @description 캐시된 입력의 단가. 없으면 캐시 할인이 없는 모델이고 캐시된 토큰도 정가다
|
|
3696
|
+
*/
|
|
3697
|
+
cachedInPerMTok?: number;
|
|
3698
|
+
/**
|
|
3699
|
+
* @description 참이면 프로바이더 **정가 그대로**다 (마진 0). 화면이 그 사실을 말하는
|
|
3700
|
+
* 것이 이 제품의 문장 하나이고, 말하지 않으면 사용자는 마크업을 가정한다.
|
|
3701
|
+
*/
|
|
3702
|
+
listPrice: boolean;
|
|
3703
|
+
};
|
|
3704
|
+
AIStatus: {
|
|
3705
|
+
granted: boolean;
|
|
3706
|
+
/** @description 프로젝트마다 분당 호출 상한 */
|
|
3707
|
+
perMinute: number;
|
|
3708
|
+
/** @description 프로젝트마다 동시 호출 상한 */
|
|
3709
|
+
concurrent: number;
|
|
3710
|
+
/** @description 0 이면 모델이 정한다 */
|
|
3711
|
+
maxOutputTokens?: number;
|
|
3712
|
+
/** @description 0 이면 모델이 정한다 */
|
|
3713
|
+
maxInputTokens?: number;
|
|
3714
|
+
/**
|
|
3715
|
+
* Format: int64
|
|
3716
|
+
* @description org 잔액 (음수 가능)
|
|
3717
|
+
*/
|
|
3718
|
+
creditMicroCents: number;
|
|
3719
|
+
/**
|
|
3720
|
+
* Format: int64
|
|
3721
|
+
* @description 가성비 모델에만 주는 하루치
|
|
3722
|
+
*/
|
|
3723
|
+
freeDailyMicroCents?: number;
|
|
3724
|
+
/** Format: int64 */
|
|
3725
|
+
calls24h?: number;
|
|
3726
|
+
/** Format: int64 */
|
|
3727
|
+
tokensIn24h?: number;
|
|
3728
|
+
/** Format: int64 */
|
|
3729
|
+
tokensOut24h?: number;
|
|
3730
|
+
/**
|
|
3731
|
+
* Format: int64
|
|
3732
|
+
* @description 최근 24 시간 원장의 합 (양수 = 쓴 금액). usage_hourly 에서는 못 만드는 수다
|
|
3733
|
+
*/
|
|
3734
|
+
spentMicroCents24h?: number;
|
|
3735
|
+
};
|
|
3736
|
+
AIAutoTopup: {
|
|
3737
|
+
/** Format: int64 */
|
|
3738
|
+
belowMicroCents: number;
|
|
3739
|
+
/** Format: int64 */
|
|
3740
|
+
microCents: number;
|
|
3741
|
+
};
|
|
3742
|
+
AICredit: {
|
|
3743
|
+
/** @description 거짓이면 이 배치에 크레딧 상품이 없다 — 충전 끝점은 501 */
|
|
3744
|
+
enabled: boolean;
|
|
3745
|
+
sandbox: boolean;
|
|
3746
|
+
/**
|
|
3747
|
+
* Format: int64
|
|
3748
|
+
* @description 잔액 (음수 가능)
|
|
3749
|
+
*/
|
|
3750
|
+
microCents: number;
|
|
3751
|
+
/** Format: int64 */
|
|
3752
|
+
lowMicroCents?: number;
|
|
3753
|
+
/** Format: int64 */
|
|
3754
|
+
freeDailyMicroCents?: number;
|
|
3755
|
+
/** @description 충전 단위. 자동 충전이 **같은 목록**을 쓴다 */
|
|
3756
|
+
tiers: number[];
|
|
3757
|
+
/** @description 거짓이면 자동 충전을 못 켠다 — 첫 충전이 카드를 저장한다 */
|
|
3758
|
+
hasPaymentMethod: boolean;
|
|
3759
|
+
autoTopup?: components["schemas"]["AIAutoTopup"];
|
|
3760
|
+
autoTopupsToday: number;
|
|
3761
|
+
/** @description 이 수가 곧 하루 지출 천장이다 */
|
|
3762
|
+
autoTopupPerDay: number;
|
|
3763
|
+
};
|
|
3764
|
+
AILedgerRow: {
|
|
3765
|
+
/** @enum {string} */
|
|
3766
|
+
kind: "call" | "topup" | "adjust";
|
|
3767
|
+
model?: string;
|
|
3768
|
+
project?: string;
|
|
3769
|
+
/** Format: int64 */
|
|
3770
|
+
tokensIn?: number;
|
|
3771
|
+
/** Format: int64 */
|
|
3772
|
+
tokensOut?: number;
|
|
3773
|
+
/**
|
|
3774
|
+
* Format: int64
|
|
3775
|
+
* @description `call` 은 음수
|
|
3776
|
+
*/
|
|
3777
|
+
microCents: number;
|
|
3778
|
+
/** Format: date-time */
|
|
3779
|
+
at: string;
|
|
3780
|
+
};
|
|
3327
3781
|
/** @description 프로젝트의 이메일 상태다 (docs/email.md §5). */
|
|
3328
3782
|
EmailStatus: {
|
|
3329
3783
|
/** @description 켜졌는가. `project_email` 행의 존재가 유일한 표현이다 (0038). */
|
|
@@ -4089,7 +4543,7 @@ export interface operations {
|
|
|
4089
4543
|
};
|
|
4090
4544
|
};
|
|
4091
4545
|
};
|
|
4092
|
-
|
|
4546
|
+
getSiteConfig: {
|
|
4093
4547
|
parameters: {
|
|
4094
4548
|
query?: never;
|
|
4095
4549
|
header?: never;
|
|
@@ -4098,22 +4552,30 @@ export interface operations {
|
|
|
4098
4552
|
};
|
|
4099
4553
|
requestBody?: never;
|
|
4100
4554
|
responses: {
|
|
4101
|
-
/** @description
|
|
4555
|
+
/** @description 배치의 이름들 */
|
|
4102
4556
|
200: {
|
|
4103
4557
|
headers: {
|
|
4104
4558
|
[name: string]: unknown;
|
|
4105
4559
|
};
|
|
4106
4560
|
content: {
|
|
4107
4561
|
"application/json": {
|
|
4108
|
-
|
|
4109
|
-
|
|
4562
|
+
/**
|
|
4563
|
+
* @description 앱 호스트네임의 접미사 (`<project>.<org>.<appDomain>`).
|
|
4564
|
+
* @example runlot.app
|
|
4565
|
+
*/
|
|
4566
|
+
appDomain: string;
|
|
4567
|
+
/**
|
|
4568
|
+
* @description 공개 문서의 origin. **빈 값일 수 있다** — 그러면 화면은
|
|
4569
|
+
* 문서 링크를 안 그린다 (없는 곳으로 보내는 링크보다 낫다).
|
|
4570
|
+
* @example https://docs.runlot.io
|
|
4571
|
+
*/
|
|
4572
|
+
docsUrl: string;
|
|
4110
4573
|
};
|
|
4111
4574
|
};
|
|
4112
4575
|
};
|
|
4113
|
-
401: components["responses"]["Unauthorized"];
|
|
4114
4576
|
};
|
|
4115
4577
|
};
|
|
4116
|
-
|
|
4578
|
+
getMe: {
|
|
4117
4579
|
parameters: {
|
|
4118
4580
|
query?: never;
|
|
4119
4581
|
header?: never;
|
|
@@ -4122,13 +4584,14 @@ export interface operations {
|
|
|
4122
4584
|
};
|
|
4123
4585
|
requestBody?: never;
|
|
4124
4586
|
responses: {
|
|
4125
|
-
/** @description
|
|
4587
|
+
/** @description 사용자 */
|
|
4126
4588
|
200: {
|
|
4127
4589
|
headers: {
|
|
4128
4590
|
[name: string]: unknown;
|
|
4129
4591
|
};
|
|
4130
4592
|
content: {
|
|
4131
4593
|
"application/json": {
|
|
4594
|
+
user: components["schemas"]["User"];
|
|
4132
4595
|
orgs: components["schemas"]["OrgMembership"][];
|
|
4133
4596
|
};
|
|
4134
4597
|
};
|
|
@@ -4136,7 +4599,30 @@ export interface operations {
|
|
|
4136
4599
|
401: components["responses"]["Unauthorized"];
|
|
4137
4600
|
};
|
|
4138
4601
|
};
|
|
4139
|
-
|
|
4602
|
+
listOrgs: {
|
|
4603
|
+
parameters: {
|
|
4604
|
+
query?: never;
|
|
4605
|
+
header?: never;
|
|
4606
|
+
path?: never;
|
|
4607
|
+
cookie?: never;
|
|
4608
|
+
};
|
|
4609
|
+
requestBody?: never;
|
|
4610
|
+
responses: {
|
|
4611
|
+
/** @description 소속 조직 */
|
|
4612
|
+
200: {
|
|
4613
|
+
headers: {
|
|
4614
|
+
[name: string]: unknown;
|
|
4615
|
+
};
|
|
4616
|
+
content: {
|
|
4617
|
+
"application/json": {
|
|
4618
|
+
orgs: components["schemas"]["OrgMembership"][];
|
|
4619
|
+
};
|
|
4620
|
+
};
|
|
4621
|
+
};
|
|
4622
|
+
401: components["responses"]["Unauthorized"];
|
|
4623
|
+
};
|
|
4624
|
+
};
|
|
4625
|
+
createOrg: {
|
|
4140
4626
|
parameters: {
|
|
4141
4627
|
query?: never;
|
|
4142
4628
|
header?: never;
|
|
@@ -4165,6 +4651,76 @@ export interface operations {
|
|
|
4165
4651
|
409: components["responses"]["Conflict"];
|
|
4166
4652
|
};
|
|
4167
4653
|
};
|
|
4654
|
+
deleteOrg: {
|
|
4655
|
+
parameters: {
|
|
4656
|
+
query?: never;
|
|
4657
|
+
header?: never;
|
|
4658
|
+
path: {
|
|
4659
|
+
orgSlug: components["parameters"]["OrgSlug"];
|
|
4660
|
+
};
|
|
4661
|
+
cookie?: never;
|
|
4662
|
+
};
|
|
4663
|
+
requestBody: {
|
|
4664
|
+
content: {
|
|
4665
|
+
"application/json": {
|
|
4666
|
+
/** @description 조직 슬러그를 그대로. */
|
|
4667
|
+
confirm: string;
|
|
4668
|
+
};
|
|
4669
|
+
};
|
|
4670
|
+
};
|
|
4671
|
+
responses: {
|
|
4672
|
+
/** @description 지웠다 */
|
|
4673
|
+
204: {
|
|
4674
|
+
headers: {
|
|
4675
|
+
[name: string]: unknown;
|
|
4676
|
+
};
|
|
4677
|
+
content?: never;
|
|
4678
|
+
};
|
|
4679
|
+
400: components["responses"]["BadRequest"];
|
|
4680
|
+
403: components["responses"]["Forbidden"];
|
|
4681
|
+
404: components["responses"]["NotFound"];
|
|
4682
|
+
/** @description 비어 있지 않다 (`org_not_empty`) · 개인 조직 (`personal_org`) · 유료 구독 (`active_subscription`) */
|
|
4683
|
+
409: {
|
|
4684
|
+
headers: {
|
|
4685
|
+
[name: string]: unknown;
|
|
4686
|
+
};
|
|
4687
|
+
content: {
|
|
4688
|
+
"application/json": components["schemas"]["Error"];
|
|
4689
|
+
};
|
|
4690
|
+
};
|
|
4691
|
+
};
|
|
4692
|
+
};
|
|
4693
|
+
updateOrg: {
|
|
4694
|
+
parameters: {
|
|
4695
|
+
query?: never;
|
|
4696
|
+
header?: never;
|
|
4697
|
+
path: {
|
|
4698
|
+
orgSlug: components["parameters"]["OrgSlug"];
|
|
4699
|
+
};
|
|
4700
|
+
cookie?: never;
|
|
4701
|
+
};
|
|
4702
|
+
requestBody: {
|
|
4703
|
+
content: {
|
|
4704
|
+
"application/json": {
|
|
4705
|
+
name: string;
|
|
4706
|
+
};
|
|
4707
|
+
};
|
|
4708
|
+
};
|
|
4709
|
+
responses: {
|
|
4710
|
+
/** @description 바뀐 조직 */
|
|
4711
|
+
200: {
|
|
4712
|
+
headers: {
|
|
4713
|
+
[name: string]: unknown;
|
|
4714
|
+
};
|
|
4715
|
+
content: {
|
|
4716
|
+
"application/json": components["schemas"]["OrgMembership"];
|
|
4717
|
+
};
|
|
4718
|
+
};
|
|
4719
|
+
400: components["responses"]["BadRequest"];
|
|
4720
|
+
403: components["responses"]["Forbidden"];
|
|
4721
|
+
404: components["responses"]["NotFound"];
|
|
4722
|
+
};
|
|
4723
|
+
};
|
|
4168
4724
|
listProjects: {
|
|
4169
4725
|
parameters: {
|
|
4170
4726
|
query?: never;
|
|
@@ -4262,6 +4818,72 @@ export interface operations {
|
|
|
4262
4818
|
404: components["responses"]["NotFound"];
|
|
4263
4819
|
};
|
|
4264
4820
|
};
|
|
4821
|
+
deleteProject: {
|
|
4822
|
+
parameters: {
|
|
4823
|
+
query?: never;
|
|
4824
|
+
header?: never;
|
|
4825
|
+
path: {
|
|
4826
|
+
orgSlug: components["parameters"]["OrgSlug"];
|
|
4827
|
+
projectName: components["parameters"]["ProjectName"];
|
|
4828
|
+
};
|
|
4829
|
+
cookie?: never;
|
|
4830
|
+
};
|
|
4831
|
+
requestBody: {
|
|
4832
|
+
content: {
|
|
4833
|
+
"application/json": {
|
|
4834
|
+
confirm: string;
|
|
4835
|
+
};
|
|
4836
|
+
};
|
|
4837
|
+
};
|
|
4838
|
+
responses: {
|
|
4839
|
+
/** @description 종결 연산을 시작했다 */
|
|
4840
|
+
202: {
|
|
4841
|
+
headers: {
|
|
4842
|
+
[name: string]: unknown;
|
|
4843
|
+
};
|
|
4844
|
+
content: {
|
|
4845
|
+
"application/json": components["schemas"]["OperationStarted"];
|
|
4846
|
+
};
|
|
4847
|
+
};
|
|
4848
|
+
400: components["responses"]["BadRequest"];
|
|
4849
|
+
403: components["responses"]["Forbidden"];
|
|
4850
|
+
404: components["responses"]["NotFound"];
|
|
4851
|
+
/** @description 다른 연산이 진행 중이다 (`op_in_flight`) */
|
|
4852
|
+
409: {
|
|
4853
|
+
headers: {
|
|
4854
|
+
[name: string]: unknown;
|
|
4855
|
+
};
|
|
4856
|
+
content: {
|
|
4857
|
+
"application/json": components["schemas"]["Error"];
|
|
4858
|
+
};
|
|
4859
|
+
};
|
|
4860
|
+
};
|
|
4861
|
+
};
|
|
4862
|
+
getOrgOperation: {
|
|
4863
|
+
parameters: {
|
|
4864
|
+
query?: never;
|
|
4865
|
+
header?: never;
|
|
4866
|
+
path: {
|
|
4867
|
+
orgSlug: components["parameters"]["OrgSlug"];
|
|
4868
|
+
opId: string;
|
|
4869
|
+
};
|
|
4870
|
+
cookie?: never;
|
|
4871
|
+
};
|
|
4872
|
+
requestBody?: never;
|
|
4873
|
+
responses: {
|
|
4874
|
+
/** @description 연산 */
|
|
4875
|
+
200: {
|
|
4876
|
+
headers: {
|
|
4877
|
+
[name: string]: unknown;
|
|
4878
|
+
};
|
|
4879
|
+
content: {
|
|
4880
|
+
"application/json": components["schemas"]["Operation"];
|
|
4881
|
+
};
|
|
4882
|
+
};
|
|
4883
|
+
403: components["responses"]["Forbidden"];
|
|
4884
|
+
404: components["responses"]["NotFound"];
|
|
4885
|
+
};
|
|
4886
|
+
};
|
|
4265
4887
|
getProjectOverview: {
|
|
4266
4888
|
parameters: {
|
|
4267
4889
|
query?: never;
|
|
@@ -5154,6 +5776,305 @@ export interface operations {
|
|
|
5154
5776
|
};
|
|
5155
5777
|
};
|
|
5156
5778
|
};
|
|
5779
|
+
listAIModels: {
|
|
5780
|
+
parameters: {
|
|
5781
|
+
query?: never;
|
|
5782
|
+
header?: never;
|
|
5783
|
+
path?: never;
|
|
5784
|
+
cookie?: never;
|
|
5785
|
+
};
|
|
5786
|
+
requestBody?: never;
|
|
5787
|
+
responses: {
|
|
5788
|
+
/** @description 카탈로그 */
|
|
5789
|
+
200: {
|
|
5790
|
+
headers: {
|
|
5791
|
+
[name: string]: unknown;
|
|
5792
|
+
};
|
|
5793
|
+
content: {
|
|
5794
|
+
"application/json": {
|
|
5795
|
+
models: components["schemas"]["AIModel"][];
|
|
5796
|
+
/**
|
|
5797
|
+
* Format: int64
|
|
5798
|
+
* @description org 마다 하루 무료분 (마이크로센트). **가성비 모델에만** 쓴다
|
|
5799
|
+
*/
|
|
5800
|
+
freeDailyMicroCents: number;
|
|
5801
|
+
/**
|
|
5802
|
+
* Format: int64
|
|
5803
|
+
* @description "잔액이 낮다" 의 선 — 화면이 하드코딩하면 표가 둘이 된다
|
|
5804
|
+
*/
|
|
5805
|
+
lowMicroCents: number;
|
|
5806
|
+
};
|
|
5807
|
+
};
|
|
5808
|
+
};
|
|
5809
|
+
401: components["responses"]["Unauthorized"];
|
|
5810
|
+
};
|
|
5811
|
+
};
|
|
5812
|
+
getAI: {
|
|
5813
|
+
parameters: {
|
|
5814
|
+
query?: never;
|
|
5815
|
+
header?: never;
|
|
5816
|
+
path: {
|
|
5817
|
+
orgSlug: components["parameters"]["OrgSlug"];
|
|
5818
|
+
projectName: components["parameters"]["ProjectName"];
|
|
5819
|
+
};
|
|
5820
|
+
cookie?: never;
|
|
5821
|
+
};
|
|
5822
|
+
requestBody?: never;
|
|
5823
|
+
responses: {
|
|
5824
|
+
/** @description AI 상태 */
|
|
5825
|
+
200: {
|
|
5826
|
+
headers: {
|
|
5827
|
+
[name: string]: unknown;
|
|
5828
|
+
};
|
|
5829
|
+
content: {
|
|
5830
|
+
"application/json": components["schemas"]["AIStatus"];
|
|
5831
|
+
};
|
|
5832
|
+
};
|
|
5833
|
+
403: components["responses"]["Forbidden"];
|
|
5834
|
+
404: components["responses"]["NotFound"];
|
|
5835
|
+
/** @description `no_core` */
|
|
5836
|
+
503: {
|
|
5837
|
+
headers: {
|
|
5838
|
+
[name: string]: unknown;
|
|
5839
|
+
};
|
|
5840
|
+
content: {
|
|
5841
|
+
"application/json": components["schemas"]["Error"];
|
|
5842
|
+
};
|
|
5843
|
+
};
|
|
5844
|
+
};
|
|
5845
|
+
};
|
|
5846
|
+
grantAI: {
|
|
5847
|
+
parameters: {
|
|
5848
|
+
query?: never;
|
|
5849
|
+
header?: never;
|
|
5850
|
+
path: {
|
|
5851
|
+
orgSlug: components["parameters"]["OrgSlug"];
|
|
5852
|
+
projectName: components["parameters"]["ProjectName"];
|
|
5853
|
+
};
|
|
5854
|
+
cookie?: never;
|
|
5855
|
+
};
|
|
5856
|
+
requestBody?: never;
|
|
5857
|
+
responses: {
|
|
5858
|
+
/** @description 부여 상태 (이미 있었으면 기존 값) */
|
|
5859
|
+
200: {
|
|
5860
|
+
headers: {
|
|
5861
|
+
[name: string]: unknown;
|
|
5862
|
+
};
|
|
5863
|
+
content: {
|
|
5864
|
+
"application/json": components["schemas"]["AIStatus"];
|
|
5865
|
+
};
|
|
5866
|
+
};
|
|
5867
|
+
403: components["responses"]["Forbidden"];
|
|
5868
|
+
404: components["responses"]["NotFound"];
|
|
5869
|
+
/** @description `no_core` */
|
|
5870
|
+
503: {
|
|
5871
|
+
headers: {
|
|
5872
|
+
[name: string]: unknown;
|
|
5873
|
+
};
|
|
5874
|
+
content: {
|
|
5875
|
+
"application/json": components["schemas"]["Error"];
|
|
5876
|
+
};
|
|
5877
|
+
};
|
|
5878
|
+
};
|
|
5879
|
+
};
|
|
5880
|
+
revokeAI: {
|
|
5881
|
+
parameters: {
|
|
5882
|
+
query?: never;
|
|
5883
|
+
header?: never;
|
|
5884
|
+
path: {
|
|
5885
|
+
orgSlug: components["parameters"]["OrgSlug"];
|
|
5886
|
+
projectName: components["parameters"]["ProjectName"];
|
|
5887
|
+
};
|
|
5888
|
+
cookie?: never;
|
|
5889
|
+
};
|
|
5890
|
+
requestBody?: never;
|
|
5891
|
+
responses: {
|
|
5892
|
+
/** @description 껐다 */
|
|
5893
|
+
204: {
|
|
5894
|
+
headers: {
|
|
5895
|
+
[name: string]: unknown;
|
|
5896
|
+
};
|
|
5897
|
+
content?: never;
|
|
5898
|
+
};
|
|
5899
|
+
403: components["responses"]["Forbidden"];
|
|
5900
|
+
404: components["responses"]["NotFound"];
|
|
5901
|
+
/** @description `no_core` */
|
|
5902
|
+
503: {
|
|
5903
|
+
headers: {
|
|
5904
|
+
[name: string]: unknown;
|
|
5905
|
+
};
|
|
5906
|
+
content: {
|
|
5907
|
+
"application/json": components["schemas"]["Error"];
|
|
5908
|
+
};
|
|
5909
|
+
};
|
|
5910
|
+
};
|
|
5911
|
+
};
|
|
5912
|
+
getAICredit: {
|
|
5913
|
+
parameters: {
|
|
5914
|
+
query?: never;
|
|
5915
|
+
header?: never;
|
|
5916
|
+
path: {
|
|
5917
|
+
orgSlug: components["parameters"]["OrgSlug"];
|
|
5918
|
+
};
|
|
5919
|
+
cookie?: never;
|
|
5920
|
+
};
|
|
5921
|
+
requestBody?: never;
|
|
5922
|
+
responses: {
|
|
5923
|
+
/** @description 크레딧 상태 */
|
|
5924
|
+
200: {
|
|
5925
|
+
headers: {
|
|
5926
|
+
[name: string]: unknown;
|
|
5927
|
+
};
|
|
5928
|
+
content: {
|
|
5929
|
+
"application/json": components["schemas"]["AICredit"];
|
|
5930
|
+
};
|
|
5931
|
+
};
|
|
5932
|
+
403: components["responses"]["Forbidden"];
|
|
5933
|
+
};
|
|
5934
|
+
};
|
|
5935
|
+
listAILedger: {
|
|
5936
|
+
parameters: {
|
|
5937
|
+
query?: {
|
|
5938
|
+
limit?: number;
|
|
5939
|
+
/** @description 이 ledger_id 보다 앞의 행 */
|
|
5940
|
+
before?: number;
|
|
5941
|
+
};
|
|
5942
|
+
header?: never;
|
|
5943
|
+
path: {
|
|
5944
|
+
orgSlug: components["parameters"]["OrgSlug"];
|
|
5945
|
+
};
|
|
5946
|
+
cookie?: never;
|
|
5947
|
+
};
|
|
5948
|
+
requestBody?: never;
|
|
5949
|
+
responses: {
|
|
5950
|
+
/** @description 원장 */
|
|
5951
|
+
200: {
|
|
5952
|
+
headers: {
|
|
5953
|
+
[name: string]: unknown;
|
|
5954
|
+
};
|
|
5955
|
+
content: {
|
|
5956
|
+
"application/json": {
|
|
5957
|
+
rows: components["schemas"]["AILedgerRow"][];
|
|
5958
|
+
/** Format: int64 */
|
|
5959
|
+
nextBefore?: number;
|
|
5960
|
+
};
|
|
5961
|
+
};
|
|
5962
|
+
};
|
|
5963
|
+
403: components["responses"]["Forbidden"];
|
|
5964
|
+
};
|
|
5965
|
+
};
|
|
5966
|
+
createAICreditCheckout: {
|
|
5967
|
+
parameters: {
|
|
5968
|
+
query?: never;
|
|
5969
|
+
header?: never;
|
|
5970
|
+
path: {
|
|
5971
|
+
orgSlug: components["parameters"]["OrgSlug"];
|
|
5972
|
+
};
|
|
5973
|
+
cookie?: never;
|
|
5974
|
+
};
|
|
5975
|
+
requestBody: {
|
|
5976
|
+
content: {
|
|
5977
|
+
"application/json": {
|
|
5978
|
+
/** Format: int64 */
|
|
5979
|
+
microCents: number;
|
|
5980
|
+
returnTo: string;
|
|
5981
|
+
};
|
|
5982
|
+
};
|
|
5983
|
+
};
|
|
5984
|
+
responses: {
|
|
5985
|
+
/** @description 체크아웃 */
|
|
5986
|
+
200: {
|
|
5987
|
+
headers: {
|
|
5988
|
+
[name: string]: unknown;
|
|
5989
|
+
};
|
|
5990
|
+
content: {
|
|
5991
|
+
"application/json": {
|
|
5992
|
+
url: string;
|
|
5993
|
+
checkoutId?: string;
|
|
5994
|
+
};
|
|
5995
|
+
};
|
|
5996
|
+
};
|
|
5997
|
+
/** @description 충전 단위가 목록에 없다 · returnTo 가 허용된 주소가 아니다 */
|
|
5998
|
+
400: {
|
|
5999
|
+
headers: {
|
|
6000
|
+
[name: string]: unknown;
|
|
6001
|
+
};
|
|
6002
|
+
content: {
|
|
6003
|
+
"application/json": components["schemas"]["Error"];
|
|
6004
|
+
};
|
|
6005
|
+
};
|
|
6006
|
+
403: components["responses"]["Forbidden"];
|
|
6007
|
+
/** @description `billing_off` — 이 배치에 크레딧 상품이 없다 */
|
|
6008
|
+
501: {
|
|
6009
|
+
headers: {
|
|
6010
|
+
[name: string]: unknown;
|
|
6011
|
+
};
|
|
6012
|
+
content: {
|
|
6013
|
+
"application/json": components["schemas"]["Error"];
|
|
6014
|
+
};
|
|
6015
|
+
};
|
|
6016
|
+
};
|
|
6017
|
+
};
|
|
6018
|
+
setAIAutoTopup: {
|
|
6019
|
+
parameters: {
|
|
6020
|
+
query?: never;
|
|
6021
|
+
header?: never;
|
|
6022
|
+
path: {
|
|
6023
|
+
orgSlug: components["parameters"]["OrgSlug"];
|
|
6024
|
+
};
|
|
6025
|
+
cookie?: never;
|
|
6026
|
+
};
|
|
6027
|
+
requestBody: {
|
|
6028
|
+
content: {
|
|
6029
|
+
"application/json": {
|
|
6030
|
+
enabled: boolean;
|
|
6031
|
+
/** Format: int64 */
|
|
6032
|
+
belowMicroCents?: number;
|
|
6033
|
+
/** Format: int64 */
|
|
6034
|
+
microCents?: number;
|
|
6035
|
+
};
|
|
6036
|
+
};
|
|
6037
|
+
};
|
|
6038
|
+
responses: {
|
|
6039
|
+
/** @description 켰다 */
|
|
6040
|
+
200: {
|
|
6041
|
+
headers: {
|
|
6042
|
+
[name: string]: unknown;
|
|
6043
|
+
};
|
|
6044
|
+
content: {
|
|
6045
|
+
"application/json": {
|
|
6046
|
+
autoTopup?: components["schemas"]["AIAutoTopup"];
|
|
6047
|
+
};
|
|
6048
|
+
};
|
|
6049
|
+
};
|
|
6050
|
+
/** @description 껐다 */
|
|
6051
|
+
204: {
|
|
6052
|
+
headers: {
|
|
6053
|
+
[name: string]: unknown;
|
|
6054
|
+
};
|
|
6055
|
+
content?: never;
|
|
6056
|
+
};
|
|
6057
|
+
/** @description 금액이 티어에 없다 · 기준이 0 이하 · 기준이 충전 금액 이상 */
|
|
6058
|
+
400: {
|
|
6059
|
+
headers: {
|
|
6060
|
+
[name: string]: unknown;
|
|
6061
|
+
};
|
|
6062
|
+
content: {
|
|
6063
|
+
"application/json": components["schemas"]["Error"];
|
|
6064
|
+
};
|
|
6065
|
+
};
|
|
6066
|
+
403: components["responses"]["Forbidden"];
|
|
6067
|
+
/** @description `no_payment_method` — 저장된 카드가 없다. 먼저 한 번 수동으로 충전한다 */
|
|
6068
|
+
409: {
|
|
6069
|
+
headers: {
|
|
6070
|
+
[name: string]: unknown;
|
|
6071
|
+
};
|
|
6072
|
+
content: {
|
|
6073
|
+
"application/json": components["schemas"]["Error"];
|
|
6074
|
+
};
|
|
6075
|
+
};
|
|
6076
|
+
};
|
|
6077
|
+
};
|
|
5157
6078
|
getEmail: {
|
|
5158
6079
|
parameters: {
|
|
5159
6080
|
query?: never;
|