apick-api 4.0.0 → 4.0.1
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/CHANGELOG.md +166 -159
- package/LICENSE +21 -21
- package/README.md +3 -4
- package/SECURITY.md +11 -11
- package/docs/guide.en.md +2 -3
- package/docs/guide.ko.md +2 -2
- package/docs/subagent.md +39 -39
- package/docs/tts.md +34 -34
- package/package.json +1 -1
- package/src/index.cjs +59 -56
- package/src/index.d.ts +62 -58
package/CHANGELOG.md
CHANGED
|
@@ -1,3 +1,10 @@
|
|
|
1
|
+
# 4.0.1 — 2026-10-06
|
|
2
|
+
|
|
3
|
+
- 이미지 생성·편집에 `quality` 옵션을 추가했습니다: `basic`(기본) 40P · `advanced` 350P · `premium` 1,400P(장당 고정가, 크기 무관).
|
|
4
|
+
- 같은 요청도 매번 새로 생성·과금하므로 이미지 `idempotencyKey` 는 더 이상 보내지 않습니다(호환을 위해 받기만 하며 폐기 예정입니다).
|
|
5
|
+
- Add the image `quality` option: `basic` (default) 40 points, `advanced` 350 points, `premium` 1,400 points per image regardless of size.
|
|
6
|
+
- Image `idempotencyKey` is deprecated and no longer sent; every image request is generated and charged as a new request.
|
|
7
|
+
|
|
1
8
|
# 4.0.0
|
|
2
9
|
|
|
3
10
|
- Breaking migration: `createTtsJob` now defaults to Gemini `Kore`; retired APICK voices and fallback options are rejected. Use engine-specific voice catalogs instead of legacy `TTS_VOICE_IDS`.
|
|
@@ -20,162 +27,162 @@
|
|
|
20
27
|
|
|
21
28
|
Adds the Subagent integration and usage-based installed-agent contract. Existing API contracts remain supported.
|
|
22
29
|
|
|
23
|
-
# Changelog
|
|
24
|
-
|
|
25
|
-
## 3.9.0 — 2026-10-04
|
|
26
|
-
|
|
27
|
-
- `getSkillPerformance()`와 공개 성능표 타입을 추가했습니다. 시험 방식·표본 수·평가일·성공률 구간·미검증 상태를 확인할 수 있습니다.
|
|
28
|
-
- Add `getSkillPerformance()` and report types for methods, sample sizes, evaluation dates, success-rate intervals and untested states.
|
|
29
|
-
|
|
30
|
-
## 3.8.1 — 2026-10-03
|
|
31
|
-
|
|
32
|
-
- 상품별 조회 안내와 공통 인증 가이드 링크를 보강했습니다. API 계약 변경은 없습니다.
|
|
33
|
-
- Document product-specific data guides and shared authentication; API contracts are unchanged.
|
|
34
|
-
|
|
35
|
-
## 3.8.0 — 2026-10-03
|
|
36
|
-
|
|
37
|
-
- 스킬 결과 파일 인증 다운로드와 예상 가격·시간·도구 호출 수 타입 추가.
|
|
38
|
-
- Add authenticated Skill artifact downloads and execution estimate types.
|
|
39
|
-
|
|
40
|
-
## 3.7.0 — 2026-10-02
|
|
41
|
-
|
|
42
|
-
- `searchSkills()` 에 `sort` 를 추가했습니다: `recommended`(추천)·`popular`(인기)·`used`(많이 사용)·`likes`(좋아요순)·`rating`(평점순)·`new`(최신)·`mine`(내 계정이 많이 실행한 Skill)·`liked`(내 계정이 좋아요한 Skill). 생략하면 예전처럼 등록 순서입니다. 지원하지 않는 값은 요청 전에 `RangeError` 가 발생합니다. `SKILL_SORTS` 상수와 `SkillSort` 타입을 공개했습니다.
|
|
43
|
-
- Add `sort` to `searchSkills()`: `recommended`, `popular`, `used`, `likes`, `rating`, `new`, `mine` and `liked` (the last two are scoped to the API key's account). Omitting it keeps registration order. Unsupported values throw a `RangeError` before the request is sent. Export `SKILL_SORTS` and the `SkillSort` type.
|
|
44
|
-
- 검색·상세 응답 타입(`SkillSummary`·`SkillDetail`)에 `usage_label`(사용 건수 구간: `1,000회 미만`, `1,000+`, `1만+` …)·`like_count`·`review_count`·`rating_average` 를 추가했습니다. 검색어는 Skill 의 이름·요약·설명과 판매자 이름에서 찾습니다.
|
|
45
|
-
- Add `usage_label` (a usage tier, not an exact count), `like_count`, `review_count` and `rating_average` to the search and detail response types (`SkillSummary`, `SkillDetail`). The search query now matches a Skill's name, summary, description and seller name.
|
|
46
|
-
- 기존 메서드와 요청·응답 형식은 그대로입니다. / Existing methods and request/response formats are unchanged.
|
|
47
|
-
|
|
48
|
-
## 3.6.2 — 2026-10-02
|
|
49
|
-
|
|
50
|
-
- `TTS_VOICE_IDS`를 현재 지원하는 14개로 갱신했습니다. 제공이 종료된 `v2_ann_f_30s_01`, `v2_f_teen_01`을 상수·타입·문서에서 제거했으며, 이 값을 `voiceId`로 넘기면 요청 전에 `RangeError`가 발생합니다.
|
|
51
|
-
- Update `TTS_VOICE_IDS` to the 14 currently supported voices. The retired `v2_ann_f_30s_01` and `v2_f_teen_01` are removed from the constant, types and docs; passing them as `voiceId` now throws a `RangeError` before the request is sent.
|
|
52
|
-
- TTS 요금이 100자당 10포인트에서 "100자까지 30포인트, 이후 100자당 10포인트"로 바뀌었습니다(100자 30P, 101자 40P, 800자 100P). 한국어 읽기 자동 변환이 이 요금에 포함되며, 과금 기준은 계속 보낸 원문의 글자 수입니다.
|
|
53
|
-
- TTS pricing changed from 10 points per 100 characters to 30 points for up to 100 characters plus 10 points for each additional 100 characters (100 chars 30P, 101 chars 40P, 800 chars 100P). Automatic Korean reading conversion is included, and billing is still based on the character count of the text you send.
|
|
54
|
-
- 모든 TTS 요청에 한국어 읽기 전처리가 자동 적용되어 추가 옵션이나 별도 Skill 호출이 필요하지 않음을 README와 한국어·영어 가이드에 명시했습니다. 원문 기준 요금과 ASS 자막 표기는 유지되며, 정규화에 실패하면 원문으로 합성합니다. 공개 메서드와 요청·응답 형식은 변경하지 않았습니다.
|
|
55
|
-
- Clarify in the README and Korean/English guides that every TTS request automatically applies Korean reading normalization, with no extra option or separate Skill call. Billing and ASS subtitle spelling remain based on the original text; failed normalization falls back to synthesis from that text. No public method or request/response format changes.
|
|
56
|
-
|
|
57
|
-
## 3.6.1 — 2026-10-02
|
|
58
|
-
|
|
59
|
-
- `createTtsJob()`으로 접수한 문장의 숫자·단위·기호·영문 약어를 문맥에 맞는 한글 읽기로 자동 변환해 합성한다는 안내를 README와 한국어·영어 가이드에 추가했습니다. 과금 글자 수와 요금은 보낸 원문 기준이고 요청·응답 형식은 그대로이며, ASS 자막은 보낸 원문 표기로 제공됩니다. 문서만 바뀌었습니다.
|
|
60
|
-
- Document in the README and Korean/English guides that text passed to `createTtsJob()` has its numbers, units, symbols and English abbreviations automatically converted into context-appropriate Korean readings before synthesis. Billing is based on the text you send, request and response formats are unchanged, and ASS subtitles keep the text as you sent it. Documentation only.
|
|
61
|
-
|
|
62
|
-
## 3.6.0 — 2026-10-02
|
|
63
|
-
|
|
64
|
-
- Skills 메서드 8종을 추가했습니다: `searchSkills()`, `getSkill()`, `quoteSkill()`, `runSkill()`, `getSkillRun()`, `getSkillRunResult()`, `cancelSkillRun()`, `skillUsage()`. 요청·응답이 JSON 이며 응답은 봉투 없이 `data` 에 담깁니다.
|
|
65
|
-
- Add eight Skills methods to search, inspect, quote, run, read, fetch the result of, cancel and list Skill runs. Requests and responses are JSON; responses are returned as-is in `data`.
|
|
66
|
-
- `runSkill()` 은 `idempotencyKey` 가 필수이며 `Idempotency-Key` 헤더로 보냅니다. 결과가 약속한 형식으로 반환된 실행만 차감됩니다.
|
|
67
|
-
- 생성형 AI 를 쓰는 Skill 은 실행마다 실제 사용량만큼 금액이 달라집니다. `quoteSkill()` 이 예상 금액(`estimated_points`)과 최대 금액(`max_points`)을 돌려주며, `maxCostPoints` 에는 `max_points` 를 넘기세요.
|
|
68
|
-
- For Skills that use generative AI the charge varies per run with actual usage. `quoteSkill()` returns `estimated_points` and `max_points`; pass `max_points` as `maxCostPoints`.
|
|
69
|
-
- `runSkill()` requires `idempotencyKey`, sent as the `Idempotency-Key` header. Only runs that return a result in the promised format are charged.
|
|
70
|
-
- `ApickApiError` 에 선택적 `details` 를 추가했습니다. Skills 오류 코드는 `serviceCode` 로 전달됩니다. `SKILL_CATEGORIES` 상수와 Skills 타입(`SkillSummary`, `SkillDetail`, `SkillQuote`, `SkillRun` 등)을 공개했습니다.
|
|
71
|
-
- Add optional `details` to `ApickApiError`; Skills error codes are surfaced through `serviceCode`. Export `SKILL_CATEGORIES` and the Skills types.
|
|
72
|
-
|
|
73
|
-
## 3.5.0 — 2026-09-30
|
|
74
|
-
|
|
75
|
-
- 간편인증 조회 상품 2종을 추가했습니다. `requestCashReceiptDeduction()`/`getCashReceiptDeduction()`은 현금영수증 소득공제 내역을 `incomeYears`(1~3)로, `requestTaxReturnHistory()`/`getTaxReturnHistory()`는 국세 신고내역을 `years`(1~10)로 조회합니다.
|
|
76
|
-
- Add two simple-auth data products: cash receipt income deductions (`incomeYears` 1-3) and national tax return history (`years` 1-10), each with a `request*()`/`get*()` pair and result payload types.
|
|
77
|
-
- 유튜브 공개 영상 API 4종을 추가했습니다: `youtubeMetadata()`, `youtubeThumbnail()`(JPG), `youtubeSubtitleList()`, `youtubeSubtitle()`(VTT·SRT·TXT).
|
|
78
|
-
- Add four public YouTube video methods: metadata, thumbnail (JPG), subtitle language list, and subtitle download (VTT/SRT/TXT).
|
|
79
|
-
|
|
80
|
-
## 3.4.1 — 2026-09-28
|
|
81
|
-
|
|
82
|
-
- README와 한국어·영어 가이드의 간편인증 5종 예제에 모든 진행 상태와 `resultAvailable` 종료 기준을 적용했습니다. 전체·부분 성공, 인증 거부·만료·실패와 `RESULT_EXPIRED`를 구분합니다.
|
|
83
|
-
- Align all five simple-auth polling examples in the README and Korean/English guides with every progress state and the `resultAvailable` completion criterion. Distinguish full/partial success, rejected/expired authentication, failure, and `RESULT_EXPIRED`.
|
|
84
|
-
- 순차 폴링 간격을 5→10→20→30초로 늘린 뒤 30초를 유지하며, 인증·전체 대기시간 제한과 자동 재접수 방지를 안내합니다. 문서 코드를 직접 실행하는 회귀 테스트를 추가했습니다.
|
|
85
|
-
- Document sequential polling at 5→10→20→30 seconds, capped at 30 seconds, with authentication/overall waiting limits and no automatic resubmission. Add regression tests that execute the documentation examples.
|
|
86
|
-
|
|
87
|
-
## 3.4.0 — 2026-09-27
|
|
88
|
-
|
|
89
|
-
- 간편인증 기반 조회 상품 5종(재직·보험료 확인, 금융소득 조회, 국민연금 가입내역, 운전면허 조회, 국가 건강검진 결과)을 추가했습니다. 각 상품은 `request*()`로 본인 간편인증을 접수하고 `get*()`로 상태·결과를 폴링합니다.
|
|
90
|
-
- Add five simple-auth-based data lookup products (employment/insurance premium check, financial income, National Pension join history, driver's license, national health checkup). Each product accepts a `request*()` call for identity verification and polls status/result with `get*()`.
|
|
91
|
-
- `AUTH_PROVIDERS`(13종 간편인증 수단)와 `AuthProvider`, `DataRequestAcceptedData`, `DataRequestResult<T>` 타입, 상품별 결과 타입(`EmploymentResultPayload` 등)을 공개했습니다.
|
|
92
|
-
- Export `AUTH_PROVIDERS` (13 supported simple-auth providers), the `AuthProvider` type, `DataRequestAcceptedData`/`DataRequestResult<T>` envelopes, and per-product result payload types (e.g. `EmploymentResultPayload`).
|
|
93
|
-
- 재조회 만료(`RESULT_EXPIRED`)·인증 만료·거절·수집 실패는 `data.errorCode`로 구분됩니다.
|
|
94
|
-
- `RESULT_EXPIRED`, `AUTH_EXPIRED`, `AUTH_REJECTED`, and `COLLECT_FAILED` are surfaced through `data.errorCode`.
|
|
95
|
-
|
|
96
|
-
## 3.3.0 — 2026-09-21
|
|
97
|
-
|
|
98
|
-
- 모든 REST 요청의 인증 헤더를 `CL_AUTH_KEY` 에서 표준 `Authorization: Bearer <API 키>` 로 전환했습니다. 서버가 전환 기간 동안 두 헤더를 모두 받으므로 기존 호출도 계속 동작합니다.
|
|
99
|
-
- Send REST requests with the standard `Authorization: Bearer <API key>` header instead of `CL_AUTH_KEY`. Both headers are accepted during the migration window.
|
|
100
|
-
- Mask bearer tokens in error output alongside the legacy header.
|
|
101
|
-
- Synchronize all 16 current TTS voice IDs and masking type 4 with the public REST contract.
|
|
102
|
-
|
|
103
|
-
- Send all REST request bodies as multipart/form-data, including flattened nested arrays and objects. Keep existing method signatures and JSON/file responses.
|
|
104
|
-
- REST 요청을 multipart/form-data로 통일하고 중첩 입력·파일·불리언의 호환 테스트를 추가했습니다. 기존 메서드와 응답 타입은 유지합니다.
|
|
105
|
-
- Document OpenAPI/Postman downloads and compatibility with older JSON callers.
|
|
106
|
-
|
|
107
|
-
## 3.2.0 — 2026-09-14
|
|
108
|
-
|
|
109
|
-
- Seedance 참조 영상 작업에 `referenceAudios`(MP3·WAV) 입력을 추가했습니다.
|
|
110
|
-
- Add video generation version selection documentation and compatibility tests.
|
|
111
|
-
- 영상 생성 버전 선택, 버전별 옵션·요금 안내와 호환 검증을 추가했습니다.
|
|
112
|
-
- Add createVideoJob, getVideoJob, downloadVideoResult and public TypeScript types.
|
|
113
|
-
- Document and verify Seedance 2.0 Fast and Mini tier pass-through.
|
|
114
|
-
|
|
115
|
-
## 3.1.0 - 2026-09-08
|
|
116
|
-
|
|
117
|
-
- TTS 발화별 검수 이력, 후보 WAV 조회, 멱등 키를 사용하는 같은 작업 재개 메서드를 추가했습니다.
|
|
118
|
-
- Added TTS quality history, candidate WAV downloads, and idempotent job recovery methods.
|
|
119
|
-
|
|
120
|
-
## 3.0.0 - 2026-09-05
|
|
121
|
-
|
|
122
|
-
- 이미지 프롬프트 허용 길이를 최대 28,000자로 확대했습니다.
|
|
123
|
-
- 작업 접수 시 전체 포인트를 먼저 차감하고 실패한 이미지의 포인트를 즉시 환급하는 계약을 반영했습니다.
|
|
124
|
-
- 접수된 이미지 작업은 취소할 수 없도록 `cancelImageJob` 메서드와 `cancelled` 상태를 제거했습니다.
|
|
125
|
-
|
|
126
|
-
## 2.4.0 - 2026-09-05
|
|
127
|
-
|
|
128
|
-
- 이미지 장수 옵션을 의미가 분명한 `imageCount`로 바꾸고 압축 조정 옵션을 제거했습니다.
|
|
129
|
-
- 이미지 크기를 5개 표준 크기 중에서만 선택하도록 타입과 런타임 검증을 강화했습니다.
|
|
130
|
-
- 생성 요청에 선택적 `referenceImage`를 더해 참고 이미지와 텍스트를 함께 사용할 수 있습니다.
|
|
131
|
-
|
|
132
|
-
## 2.3.1 - 2026-09-05
|
|
133
|
-
|
|
134
|
-
- 이미지 편집 입력에서 마스크 파일을 제거하고 원본 이미지와 프롬프트만 받도록 계약을 단순화했습니다.
|
|
135
|
-
|
|
136
|
-
## 2.3.0 - 2026-09-05
|
|
137
|
-
|
|
138
|
-
- 이미지 생성·편집과 최대 50장 비동기 작업 메서드 8종을 추가했습니다.
|
|
139
|
-
- 이미지당 25포인트, 성공분 과금, 멱등 키, 24시간 결과 보관 계약을 문서화했습니다.
|
|
140
|
-
|
|
141
|
-
## 2.2.0 - 2026-09-03
|
|
142
|
-
|
|
143
|
-
- `maskResidenceCard()`의 개인정보 마스킹 대상을 외국인등록증·영주증·외국국적동포 국내거소신고증으로 확대했습니다.
|
|
144
|
-
- 요청·응답 형식과 `document_type: residence_card` 계약은 유지합니다.
|
|
145
|
-
- 진위확인 API의 지원 범위는 기존 외국인등록증으로 유지됩니다.
|
|
146
|
-
|
|
147
|
-
## 2.1.0 - 2026-09-01
|
|
148
|
-
|
|
149
|
-
- `downloadTtsSubtitles(jobId)`로 발화 타이밍 ASS 자막을 별도 1회 다운로드할 수 있습니다.
|
|
150
|
-
- TTS 상태 타입에 `subtitles_available`을 추가했습니다.
|
|
151
|
-
- 허용 IP 공란, 단일 IPv4·CIDR 등록, 즉시 반영 규칙을 한영 문서에 추가했습니다.
|
|
152
|
-
|
|
153
|
-
## 2.0.1 - 2026-08-31
|
|
154
|
-
|
|
155
|
-
- TTS 작업 취소 범위를 `waiting`과 `processing` 상태로 확장했습니다.
|
|
156
|
-
- 실행 중 취소도 접수 시 과금된 금액을 환불하지 않는 계약을 한영 문서에 반영했습니다.
|
|
157
|
-
- 17개 TTS `voice_id`의 사용자 표시 이름을 공개 문서에 추가했습니다.
|
|
158
|
-
|
|
159
|
-
## 2.0.0 - 2026-08-30
|
|
160
|
-
|
|
161
|
-
- 종료된 동기 `textToSpeech()` 계약을 제거했습니다.
|
|
162
|
-
- `createTtsJob()`, `getTtsJob()`, `cancelTtsJob()`, `downloadTtsResult()`로 비동기 한국어 TTS Jobs 계약을 제공합니다.
|
|
163
|
-
- 지원 목소리, 최대 800자, 상태 조회, 대기 중 취소, 결과 MP3(`audio/mpeg`) 1회 다운로드를 문서화했습니다.
|
|
164
|
-
- 정식 게시 전 지원 목소리를 17개 중립 내레이션 음성으로 확장하고 `TTS_VOICE_IDS`를 추가했습니다.
|
|
165
|
-
|
|
166
|
-
## 1.1.1 - 2026-08-30
|
|
167
|
-
|
|
168
|
-
- 공개된 25개 API 계약에 종료 대상 이미지 생성 기능이 포함되지 않았음을 재검증했습니다.
|
|
169
|
-
- 기능 및 메서드 호환성 변경 없이 릴리스 메타데이터를 갱신했습니다.
|
|
170
|
-
|
|
171
|
-
## 1.1.0 - 2026-08-29
|
|
172
|
-
|
|
173
|
-
- 주민등록번호, 외국인등록증, 여권, 주민등록증, 운전면허증 마스킹 메서드 5종을 추가했습니다.
|
|
174
|
-
- 신분증 처리 오류 코드를 `ApickApiError.serviceCode`로 제공합니다.
|
|
175
|
-
|
|
176
|
-
## 1.0.0
|
|
177
|
-
|
|
178
|
-
- Initial public release.
|
|
179
|
-
- Added 20 focused APICK service methods.
|
|
180
|
-
- Added JSON, multipart image upload, and binary file response support.
|
|
181
|
-
- Added ESM, CommonJS, and TypeScript declarations.
|
|
30
|
+
# Changelog
|
|
31
|
+
|
|
32
|
+
## 3.9.0 — 2026-10-04
|
|
33
|
+
|
|
34
|
+
- `getSkillPerformance()`와 공개 성능표 타입을 추가했습니다. 시험 방식·표본 수·평가일·성공률 구간·미검증 상태를 확인할 수 있습니다.
|
|
35
|
+
- Add `getSkillPerformance()` and report types for methods, sample sizes, evaluation dates, success-rate intervals and untested states.
|
|
36
|
+
|
|
37
|
+
## 3.8.1 — 2026-10-03
|
|
38
|
+
|
|
39
|
+
- 상품별 조회 안내와 공통 인증 가이드 링크를 보강했습니다. API 계약 변경은 없습니다.
|
|
40
|
+
- Document product-specific data guides and shared authentication; API contracts are unchanged.
|
|
41
|
+
|
|
42
|
+
## 3.8.0 — 2026-10-03
|
|
43
|
+
|
|
44
|
+
- 스킬 결과 파일 인증 다운로드와 예상 가격·시간·도구 호출 수 타입 추가.
|
|
45
|
+
- Add authenticated Skill artifact downloads and execution estimate types.
|
|
46
|
+
|
|
47
|
+
## 3.7.0 — 2026-10-02
|
|
48
|
+
|
|
49
|
+
- `searchSkills()` 에 `sort` 를 추가했습니다: `recommended`(추천)·`popular`(인기)·`used`(많이 사용)·`likes`(좋아요순)·`rating`(평점순)·`new`(최신)·`mine`(내 계정이 많이 실행한 Skill)·`liked`(내 계정이 좋아요한 Skill). 생략하면 예전처럼 등록 순서입니다. 지원하지 않는 값은 요청 전에 `RangeError` 가 발생합니다. `SKILL_SORTS` 상수와 `SkillSort` 타입을 공개했습니다.
|
|
50
|
+
- Add `sort` to `searchSkills()`: `recommended`, `popular`, `used`, `likes`, `rating`, `new`, `mine` and `liked` (the last two are scoped to the API key's account). Omitting it keeps registration order. Unsupported values throw a `RangeError` before the request is sent. Export `SKILL_SORTS` and the `SkillSort` type.
|
|
51
|
+
- 검색·상세 응답 타입(`SkillSummary`·`SkillDetail`)에 `usage_label`(사용 건수 구간: `1,000회 미만`, `1,000+`, `1만+` …)·`like_count`·`review_count`·`rating_average` 를 추가했습니다. 검색어는 Skill 의 이름·요약·설명과 판매자 이름에서 찾습니다.
|
|
52
|
+
- Add `usage_label` (a usage tier, not an exact count), `like_count`, `review_count` and `rating_average` to the search and detail response types (`SkillSummary`, `SkillDetail`). The search query now matches a Skill's name, summary, description and seller name.
|
|
53
|
+
- 기존 메서드와 요청·응답 형식은 그대로입니다. / Existing methods and request/response formats are unchanged.
|
|
54
|
+
|
|
55
|
+
## 3.6.2 — 2026-10-02
|
|
56
|
+
|
|
57
|
+
- `TTS_VOICE_IDS`를 현재 지원하는 14개로 갱신했습니다. 제공이 종료된 `v2_ann_f_30s_01`, `v2_f_teen_01`을 상수·타입·문서에서 제거했으며, 이 값을 `voiceId`로 넘기면 요청 전에 `RangeError`가 발생합니다.
|
|
58
|
+
- Update `TTS_VOICE_IDS` to the 14 currently supported voices. The retired `v2_ann_f_30s_01` and `v2_f_teen_01` are removed from the constant, types and docs; passing them as `voiceId` now throws a `RangeError` before the request is sent.
|
|
59
|
+
- TTS 요금이 100자당 10포인트에서 "100자까지 30포인트, 이후 100자당 10포인트"로 바뀌었습니다(100자 30P, 101자 40P, 800자 100P). 한국어 읽기 자동 변환이 이 요금에 포함되며, 과금 기준은 계속 보낸 원문의 글자 수입니다.
|
|
60
|
+
- TTS pricing changed from 10 points per 100 characters to 30 points for up to 100 characters plus 10 points for each additional 100 characters (100 chars 30P, 101 chars 40P, 800 chars 100P). Automatic Korean reading conversion is included, and billing is still based on the character count of the text you send.
|
|
61
|
+
- 모든 TTS 요청에 한국어 읽기 전처리가 자동 적용되어 추가 옵션이나 별도 Skill 호출이 필요하지 않음을 README와 한국어·영어 가이드에 명시했습니다. 원문 기준 요금과 ASS 자막 표기는 유지되며, 정규화에 실패하면 원문으로 합성합니다. 공개 메서드와 요청·응답 형식은 변경하지 않았습니다.
|
|
62
|
+
- Clarify in the README and Korean/English guides that every TTS request automatically applies Korean reading normalization, with no extra option or separate Skill call. Billing and ASS subtitle spelling remain based on the original text; failed normalization falls back to synthesis from that text. No public method or request/response format changes.
|
|
63
|
+
|
|
64
|
+
## 3.6.1 — 2026-10-02
|
|
65
|
+
|
|
66
|
+
- `createTtsJob()`으로 접수한 문장의 숫자·단위·기호·영문 약어를 문맥에 맞는 한글 읽기로 자동 변환해 합성한다는 안내를 README와 한국어·영어 가이드에 추가했습니다. 과금 글자 수와 요금은 보낸 원문 기준이고 요청·응답 형식은 그대로이며, ASS 자막은 보낸 원문 표기로 제공됩니다. 문서만 바뀌었습니다.
|
|
67
|
+
- Document in the README and Korean/English guides that text passed to `createTtsJob()` has its numbers, units, symbols and English abbreviations automatically converted into context-appropriate Korean readings before synthesis. Billing is based on the text you send, request and response formats are unchanged, and ASS subtitles keep the text as you sent it. Documentation only.
|
|
68
|
+
|
|
69
|
+
## 3.6.0 — 2026-10-02
|
|
70
|
+
|
|
71
|
+
- Skills 메서드 8종을 추가했습니다: `searchSkills()`, `getSkill()`, `quoteSkill()`, `runSkill()`, `getSkillRun()`, `getSkillRunResult()`, `cancelSkillRun()`, `skillUsage()`. 요청·응답이 JSON 이며 응답은 봉투 없이 `data` 에 담깁니다.
|
|
72
|
+
- Add eight Skills methods to search, inspect, quote, run, read, fetch the result of, cancel and list Skill runs. Requests and responses are JSON; responses are returned as-is in `data`.
|
|
73
|
+
- `runSkill()` 은 `idempotencyKey` 가 필수이며 `Idempotency-Key` 헤더로 보냅니다. 결과가 약속한 형식으로 반환된 실행만 차감됩니다.
|
|
74
|
+
- 생성형 AI 를 쓰는 Skill 은 실행마다 실제 사용량만큼 금액이 달라집니다. `quoteSkill()` 이 예상 금액(`estimated_points`)과 최대 금액(`max_points`)을 돌려주며, `maxCostPoints` 에는 `max_points` 를 넘기세요.
|
|
75
|
+
- For Skills that use generative AI the charge varies per run with actual usage. `quoteSkill()` returns `estimated_points` and `max_points`; pass `max_points` as `maxCostPoints`.
|
|
76
|
+
- `runSkill()` requires `idempotencyKey`, sent as the `Idempotency-Key` header. Only runs that return a result in the promised format are charged.
|
|
77
|
+
- `ApickApiError` 에 선택적 `details` 를 추가했습니다. Skills 오류 코드는 `serviceCode` 로 전달됩니다. `SKILL_CATEGORIES` 상수와 Skills 타입(`SkillSummary`, `SkillDetail`, `SkillQuote`, `SkillRun` 등)을 공개했습니다.
|
|
78
|
+
- Add optional `details` to `ApickApiError`; Skills error codes are surfaced through `serviceCode`. Export `SKILL_CATEGORIES` and the Skills types.
|
|
79
|
+
|
|
80
|
+
## 3.5.0 — 2026-09-30
|
|
81
|
+
|
|
82
|
+
- 간편인증 조회 상품 2종을 추가했습니다. `requestCashReceiptDeduction()`/`getCashReceiptDeduction()`은 현금영수증 소득공제 내역을 `incomeYears`(1~3)로, `requestTaxReturnHistory()`/`getTaxReturnHistory()`는 국세 신고내역을 `years`(1~10)로 조회합니다.
|
|
83
|
+
- Add two simple-auth data products: cash receipt income deductions (`incomeYears` 1-3) and national tax return history (`years` 1-10), each with a `request*()`/`get*()` pair and result payload types.
|
|
84
|
+
- 유튜브 공개 영상 API 4종을 추가했습니다: `youtubeMetadata()`, `youtubeThumbnail()`(JPG), `youtubeSubtitleList()`, `youtubeSubtitle()`(VTT·SRT·TXT).
|
|
85
|
+
- Add four public YouTube video methods: metadata, thumbnail (JPG), subtitle language list, and subtitle download (VTT/SRT/TXT).
|
|
86
|
+
|
|
87
|
+
## 3.4.1 — 2026-09-28
|
|
88
|
+
|
|
89
|
+
- README와 한국어·영어 가이드의 간편인증 5종 예제에 모든 진행 상태와 `resultAvailable` 종료 기준을 적용했습니다. 전체·부분 성공, 인증 거부·만료·실패와 `RESULT_EXPIRED`를 구분합니다.
|
|
90
|
+
- Align all five simple-auth polling examples in the README and Korean/English guides with every progress state and the `resultAvailable` completion criterion. Distinguish full/partial success, rejected/expired authentication, failure, and `RESULT_EXPIRED`.
|
|
91
|
+
- 순차 폴링 간격을 5→10→20→30초로 늘린 뒤 30초를 유지하며, 인증·전체 대기시간 제한과 자동 재접수 방지를 안내합니다. 문서 코드를 직접 실행하는 회귀 테스트를 추가했습니다.
|
|
92
|
+
- Document sequential polling at 5→10→20→30 seconds, capped at 30 seconds, with authentication/overall waiting limits and no automatic resubmission. Add regression tests that execute the documentation examples.
|
|
93
|
+
|
|
94
|
+
## 3.4.0 — 2026-09-27
|
|
95
|
+
|
|
96
|
+
- 간편인증 기반 조회 상품 5종(재직·보험료 확인, 금융소득 조회, 국민연금 가입내역, 운전면허 조회, 국가 건강검진 결과)을 추가했습니다. 각 상품은 `request*()`로 본인 간편인증을 접수하고 `get*()`로 상태·결과를 폴링합니다.
|
|
97
|
+
- Add five simple-auth-based data lookup products (employment/insurance premium check, financial income, National Pension join history, driver's license, national health checkup). Each product accepts a `request*()` call for identity verification and polls status/result with `get*()`.
|
|
98
|
+
- `AUTH_PROVIDERS`(13종 간편인증 수단)와 `AuthProvider`, `DataRequestAcceptedData`, `DataRequestResult<T>` 타입, 상품별 결과 타입(`EmploymentResultPayload` 등)을 공개했습니다.
|
|
99
|
+
- Export `AUTH_PROVIDERS` (13 supported simple-auth providers), the `AuthProvider` type, `DataRequestAcceptedData`/`DataRequestResult<T>` envelopes, and per-product result payload types (e.g. `EmploymentResultPayload`).
|
|
100
|
+
- 재조회 만료(`RESULT_EXPIRED`)·인증 만료·거절·수집 실패는 `data.errorCode`로 구분됩니다.
|
|
101
|
+
- `RESULT_EXPIRED`, `AUTH_EXPIRED`, `AUTH_REJECTED`, and `COLLECT_FAILED` are surfaced through `data.errorCode`.
|
|
102
|
+
|
|
103
|
+
## 3.3.0 — 2026-09-21
|
|
104
|
+
|
|
105
|
+
- 모든 REST 요청의 인증 헤더를 `CL_AUTH_KEY` 에서 표준 `Authorization: Bearer <API 키>` 로 전환했습니다. 서버가 전환 기간 동안 두 헤더를 모두 받으므로 기존 호출도 계속 동작합니다.
|
|
106
|
+
- Send REST requests with the standard `Authorization: Bearer <API key>` header instead of `CL_AUTH_KEY`. Both headers are accepted during the migration window.
|
|
107
|
+
- Mask bearer tokens in error output alongside the legacy header.
|
|
108
|
+
- Synchronize all 16 current TTS voice IDs and masking type 4 with the public REST contract.
|
|
109
|
+
|
|
110
|
+
- Send all REST request bodies as multipart/form-data, including flattened nested arrays and objects. Keep existing method signatures and JSON/file responses.
|
|
111
|
+
- REST 요청을 multipart/form-data로 통일하고 중첩 입력·파일·불리언의 호환 테스트를 추가했습니다. 기존 메서드와 응답 타입은 유지합니다.
|
|
112
|
+
- Document OpenAPI/Postman downloads and compatibility with older JSON callers.
|
|
113
|
+
|
|
114
|
+
## 3.2.0 — 2026-09-14
|
|
115
|
+
|
|
116
|
+
- Seedance 참조 영상 작업에 `referenceAudios`(MP3·WAV) 입력을 추가했습니다.
|
|
117
|
+
- Add video generation version selection documentation and compatibility tests.
|
|
118
|
+
- 영상 생성 버전 선택, 버전별 옵션·요금 안내와 호환 검증을 추가했습니다.
|
|
119
|
+
- Add createVideoJob, getVideoJob, downloadVideoResult and public TypeScript types.
|
|
120
|
+
- Document and verify Seedance 2.0 Fast and Mini tier pass-through.
|
|
121
|
+
|
|
122
|
+
## 3.1.0 - 2026-09-08
|
|
123
|
+
|
|
124
|
+
- TTS 발화별 검수 이력, 후보 WAV 조회, 멱등 키를 사용하는 같은 작업 재개 메서드를 추가했습니다.
|
|
125
|
+
- Added TTS quality history, candidate WAV downloads, and idempotent job recovery methods.
|
|
126
|
+
|
|
127
|
+
## 3.0.0 - 2026-09-05
|
|
128
|
+
|
|
129
|
+
- 이미지 프롬프트 허용 길이를 최대 28,000자로 확대했습니다.
|
|
130
|
+
- 작업 접수 시 전체 포인트를 먼저 차감하고 실패한 이미지의 포인트를 즉시 환급하는 계약을 반영했습니다.
|
|
131
|
+
- 접수된 이미지 작업은 취소할 수 없도록 `cancelImageJob` 메서드와 `cancelled` 상태를 제거했습니다.
|
|
132
|
+
|
|
133
|
+
## 2.4.0 - 2026-09-05
|
|
134
|
+
|
|
135
|
+
- 이미지 장수 옵션을 의미가 분명한 `imageCount`로 바꾸고 압축 조정 옵션을 제거했습니다.
|
|
136
|
+
- 이미지 크기를 5개 표준 크기 중에서만 선택하도록 타입과 런타임 검증을 강화했습니다.
|
|
137
|
+
- 생성 요청에 선택적 `referenceImage`를 더해 참고 이미지와 텍스트를 함께 사용할 수 있습니다.
|
|
138
|
+
|
|
139
|
+
## 2.3.1 - 2026-09-05
|
|
140
|
+
|
|
141
|
+
- 이미지 편집 입력에서 마스크 파일을 제거하고 원본 이미지와 프롬프트만 받도록 계약을 단순화했습니다.
|
|
142
|
+
|
|
143
|
+
## 2.3.0 - 2026-09-05
|
|
144
|
+
|
|
145
|
+
- 이미지 생성·편집과 최대 50장 비동기 작업 메서드 8종을 추가했습니다.
|
|
146
|
+
- 이미지당 25포인트, 성공분 과금, 멱등 키, 24시간 결과 보관 계약을 문서화했습니다.
|
|
147
|
+
|
|
148
|
+
## 2.2.0 - 2026-09-03
|
|
149
|
+
|
|
150
|
+
- `maskResidenceCard()`의 개인정보 마스킹 대상을 외국인등록증·영주증·외국국적동포 국내거소신고증으로 확대했습니다.
|
|
151
|
+
- 요청·응답 형식과 `document_type: residence_card` 계약은 유지합니다.
|
|
152
|
+
- 진위확인 API의 지원 범위는 기존 외국인등록증으로 유지됩니다.
|
|
153
|
+
|
|
154
|
+
## 2.1.0 - 2026-09-01
|
|
155
|
+
|
|
156
|
+
- `downloadTtsSubtitles(jobId)`로 발화 타이밍 ASS 자막을 별도 1회 다운로드할 수 있습니다.
|
|
157
|
+
- TTS 상태 타입에 `subtitles_available`을 추가했습니다.
|
|
158
|
+
- 허용 IP 공란, 단일 IPv4·CIDR 등록, 즉시 반영 규칙을 한영 문서에 추가했습니다.
|
|
159
|
+
|
|
160
|
+
## 2.0.1 - 2026-08-31
|
|
161
|
+
|
|
162
|
+
- TTS 작업 취소 범위를 `waiting`과 `processing` 상태로 확장했습니다.
|
|
163
|
+
- 실행 중 취소도 접수 시 과금된 금액을 환불하지 않는 계약을 한영 문서에 반영했습니다.
|
|
164
|
+
- 17개 TTS `voice_id`의 사용자 표시 이름을 공개 문서에 추가했습니다.
|
|
165
|
+
|
|
166
|
+
## 2.0.0 - 2026-08-30
|
|
167
|
+
|
|
168
|
+
- 종료된 동기 `textToSpeech()` 계약을 제거했습니다.
|
|
169
|
+
- `createTtsJob()`, `getTtsJob()`, `cancelTtsJob()`, `downloadTtsResult()`로 비동기 한국어 TTS Jobs 계약을 제공합니다.
|
|
170
|
+
- 지원 목소리, 최대 800자, 상태 조회, 대기 중 취소, 결과 MP3(`audio/mpeg`) 1회 다운로드를 문서화했습니다.
|
|
171
|
+
- 정식 게시 전 지원 목소리를 17개 중립 내레이션 음성으로 확장하고 `TTS_VOICE_IDS`를 추가했습니다.
|
|
172
|
+
|
|
173
|
+
## 1.1.1 - 2026-08-30
|
|
174
|
+
|
|
175
|
+
- 공개된 25개 API 계약에 종료 대상 이미지 생성 기능이 포함되지 않았음을 재검증했습니다.
|
|
176
|
+
- 기능 및 메서드 호환성 변경 없이 릴리스 메타데이터를 갱신했습니다.
|
|
177
|
+
|
|
178
|
+
## 1.1.0 - 2026-08-29
|
|
179
|
+
|
|
180
|
+
- 주민등록번호, 외국인등록증, 여권, 주민등록증, 운전면허증 마스킹 메서드 5종을 추가했습니다.
|
|
181
|
+
- 신분증 처리 오류 코드를 `ApickApiError.serviceCode`로 제공합니다.
|
|
182
|
+
|
|
183
|
+
## 1.0.0
|
|
184
|
+
|
|
185
|
+
- Initial public release.
|
|
186
|
+
- Added 20 focused APICK service methods.
|
|
187
|
+
- Added JSON, multipart image upload, and binary file response support.
|
|
188
|
+
- Added ESM, CommonJS, and TypeScript declarations.
|
package/LICENSE
CHANGED
|
@@ -1,21 +1,21 @@
|
|
|
1
|
-
MIT License
|
|
2
|
-
|
|
3
|
-
Copyright (c) 2026 APICK
|
|
4
|
-
|
|
5
|
-
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
-
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
-
in the Software without restriction, including without limitation the rights
|
|
8
|
-
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
-
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
-
furnished to do so, subject to the following conditions:
|
|
11
|
-
|
|
12
|
-
The above copyright notice and this permission notice shall be included in all
|
|
13
|
-
copies or substantial portions of the Software.
|
|
14
|
-
|
|
15
|
-
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
-
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
-
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
-
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
-
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
-
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
-
SOFTWARE.
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 APICK
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
CHANGED
|
@@ -164,14 +164,13 @@ console.log(result.meta);
|
|
|
164
164
|
|
|
165
165
|
## 이미지 생성·편집 / Image generation and editing
|
|
166
166
|
|
|
167
|
-
|
|
167
|
+
품질(`quality`)별 장당 고정가입니다. `basic`(기본) 40P, `advanced`(고급) 350P, `premium`(최고급) 1,400P이며 크기와 관계없이 같습니다. 같은 요청을 다시 보내도 결과를 재사용하지 않고 매번 새로 생성·과금합니다. 동기는 1~4장, 작업형 API는 최대 50장까지 지원합니다. 요청이 접수되면 전체 금액을 먼저 차감하고, 생성에 실패한 이미지가 있으면 해당 장수만큼 즉시 환급합니다. 접수된 작업은 취소할 수 없으며 결과는 완료 후 24시간 동안 반복 다운로드할 수 있습니다.
|
|
168
168
|
|
|
169
|
-
Images
|
|
169
|
+
Images use a fixed per-image price by `quality`: `basic` (default) 40 points, `advanced` 350 points and `premium` 1,400 points, regardless of size. Repeated requests are never reused; each request is generated and charged again. Synchronous calls support 1–4 images and job calls support up to 50. The full amount is deducted when a request is accepted, and failed images are refunded immediately. Accepted jobs cannot be cancelled. Completed results remain downloadable for 24 hours.
|
|
170
170
|
|
|
171
171
|
```js
|
|
172
172
|
const made = await apick.generateImages("따뜻한 조명의 미니멀 제품 사진", {
|
|
173
|
-
imageCount: 2, size: "1024x1024", outputFormat: "webp",
|
|
174
|
-
idempotencyKey: "catalog-cover-20260905"
|
|
173
|
+
imageCount: 2, size: "1024x1024", outputFormat: "webp", quality: "advanced"
|
|
175
174
|
});
|
|
176
175
|
|
|
177
176
|
const referenced = await apick.generateImages("구도와 제품 형태는 유지하고 여름 해변 분위기로", {
|
package/SECURITY.md
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
# Security
|
|
2
|
-
|
|
3
|
-
## API keys
|
|
4
|
-
|
|
5
|
-
Keep APICK API keys in server-side environment variables. Do not commit keys, include them in client-side browser bundles, place them in URLs, or print them in logs.
|
|
6
|
-
|
|
7
|
-
If a key may have been exposed, regenerate it from your APICK account immediately.
|
|
8
|
-
|
|
9
|
-
## Reporting a vulnerability
|
|
10
|
-
|
|
11
|
-
Please report security issues privately through the contact channel listed at <https://apick.app>. Do not open a public issue containing credentials, personal data, or exploit details.
|
|
1
|
+
# Security
|
|
2
|
+
|
|
3
|
+
## API keys
|
|
4
|
+
|
|
5
|
+
Keep APICK API keys in server-side environment variables. Do not commit keys, include them in client-side browser bundles, place them in URLs, or print them in logs.
|
|
6
|
+
|
|
7
|
+
If a key may have been exposed, regenerate it from your APICK account immediately.
|
|
8
|
+
|
|
9
|
+
## Reporting a vulnerability
|
|
10
|
+
|
|
11
|
+
Please report security issues privately through the contact channel listed at <https://apick.app>. Do not open a public issue containing credentials, personal data, or exploit details.
|
package/docs/guide.en.md
CHANGED
|
@@ -145,12 +145,11 @@ Text input is limited to 100,000 characters.
|
|
|
145
145
|
|
|
146
146
|
## Image AI
|
|
147
147
|
|
|
148
|
-
|
|
148
|
+
Images use a fixed per-image price by `quality`: `basic` (default) 40 points, `advanced` 350 points and `premium` 1,400 points, regardless of size. Repeated requests are never reused; each request is generated and charged again. The total is deducted when a request is accepted and failed images are refunded. If a job accepted under the previous pricing returns a settlement-pending response (HTTP 202, `billing_status: "pending"`), poll `getImageJob(job_id)`.
|
|
149
149
|
|
|
150
150
|
```js
|
|
151
151
|
const result = await client.generateImages('A clean product photo on white', {
|
|
152
|
-
imageCount: 4, size: '1024x1024', outputFormat: 'webp',
|
|
153
|
-
idempotencyKey: 'product-draft-001'
|
|
152
|
+
imageCount: 4, size: '1024x1024', outputFormat: 'webp', quality: 'advanced'
|
|
154
153
|
});
|
|
155
154
|
|
|
156
155
|
const referenceResult = await client.generateImages('Keep the product shape and composition, and change the background to a sunny kitchen', {
|
package/docs/guide.ko.md
CHANGED
|
@@ -145,14 +145,14 @@ const polished = await client.polish(draftText);
|
|
|
145
145
|
|
|
146
146
|
## 이미지 AI
|
|
147
147
|
|
|
148
|
-
|
|
148
|
+
품질(`quality`)별 장당 고정가입니다. `basic`(기본) 40P, `advanced`(고급) 350P, `premium`(최고급) 1,400P이며 크기와 관계없이 같습니다. 같은 요청을 다시 보내도 결과를 재사용하지 않고 매번 새로 생성·과금합니다. 접수 시 장수만큼 먼저 차감하고 실패한 장은 환급합니다. 이전 요금 정책으로 접수된 작업이 정산 보류(HTTP 202, `billing_status: "pending"`)로 응답하면 `getImageJob(job_id)`로 조회합니다.
|
|
149
149
|
|
|
150
150
|
```js
|
|
151
151
|
const result = await client.generateImages('흰 배경의 제품 사진', {
|
|
152
152
|
imageCount: 4,
|
|
153
153
|
size: '1024x1024',
|
|
154
154
|
outputFormat: 'webp',
|
|
155
|
-
|
|
155
|
+
quality: 'advanced'
|
|
156
156
|
});
|
|
157
157
|
|
|
158
158
|
const referenceResult = await client.generateImages('제품 모양과 구도는 유지하고 배경을 햇살 좋은 주방으로 변경', {
|
package/docs/subagent.md
CHANGED
|
@@ -1,39 +1,39 @@
|
|
|
1
|
-
# 서브에이전트 / Subagent
|
|
2
|
-
|
|
3
|
-
`apick-agent`는 설치형 상품이며 `quoteSkill`·`runSkill` 대신 전용 API를 사용합니다. 성공 작업의 확인된 원가에 40%를 가산하며 승인된 동일 결과 캐시는 무료입니다. 충전 잔액 외 상품 사용량 한도는 없습니다.
|
|
4
|
-
|
|
5
|
-
`apick-agent` is an installed-agent product. Use the dedicated API rather than `quoteSkill` or `runSkill`. Successful work is billed at confirmed model cost plus 40%; approved identical-result cache reuse is free. There are no product usage quotas beyond prepaid balance.
|
|
6
|
-
|
|
7
|
-
```js
|
|
8
|
-
import { ApickClient } from 'apick-api';
|
|
9
|
-
import { createHash } from 'node:crypto';
|
|
10
|
-
const api = new ApickClient({ apiKey: process.env.APICK_API_KEY });
|
|
11
|
-
const bytes = Buffer.from('검토할 공개 문서입니다.');
|
|
12
|
-
const file = await api.createSubagentFile({
|
|
13
|
-
path: 'docs/sample.txt', bytes: bytes.length,
|
|
14
|
-
sha256: createHash('sha256').update(bytes).digest('hex'), retention: 'seven_days'
|
|
15
|
-
});
|
|
16
|
-
if (file.data.state !== 'ready') {
|
|
17
|
-
for (let offset = 0; offset < bytes.length; offset += file.data.part_bytes) {
|
|
18
|
-
await api.uploadSubagentPart(file.data.file_id, offset / file.data.part_bytes,
|
|
19
|
-
bytes.subarray(offset, offset + file.data.part_bytes).toString('base64'));
|
|
20
|
-
}
|
|
21
|
-
await api.completeSubagentFile(file.data.file_id);
|
|
22
|
-
}
|
|
23
|
-
const job = await api.dispatchSubagent({kind:'summarize', goal:'핵심 내용과 근거를 정리하세요',
|
|
24
|
-
file_ids:[file.data.file_id]}, {idempotencyKey:'sample-summary-20261004-001'});
|
|
25
|
-
const result = await api.collectSubagent(job.data.job_id);
|
|
26
|
-
// 완료 후 evidence_ids를 조회하여 인용·해시를 직접 검토하세요.
|
|
27
|
-
// Once complete, fetch evidence_ids and independently review quotes and hashes.
|
|
28
|
-
console.log(result.data.state);
|
|
29
|
-
```
|
|
30
|
-
|
|
31
|
-
접수 응답은 작업 ID를 신속히 반환합니다. 같은 멱등 키와 같은 내용은 기존 작업을 반환하며 내용이 다르면 409입니다. 연결 종료는 취소가 아닙니다. `cancelSubagent`로 명시적으로 취소하세요. `retention:'none'`은 검수 완료 후 삭제하고 임시 보관은 최대 1시간입니다.
|
|
32
|
-
|
|
33
|
-
Submission returns a job ID promptly. Replay the same idempotency key and payload after response loss; a changed payload conflicts with HTTP 409. Disconnecting does not cancel work; use `cancelSubagent`. `retention:'none'` deletes after review, with temporary retention capped at one hour.
|
|
34
|
-
|
|
35
|
-
`subagentUsage`는 호출·토큰·예약·청구·해제·캐시·전송 지표를 반환합니다. 캐시 예상 회피 비용은 동일 작업의 최초 계산 비용 기준이며 주 모델의 실제 청구 절감액이 아닙니다.
|
|
36
|
-
|
|
37
|
-
`subagentUsage` returns calls, tokens, reservations, charges, releases, cache and transfer metrics. Estimated avoided cache cost uses the original job's calculated cost and is not a measured reduction in the main model's bill.
|
|
38
|
-
|
|
39
|
-
[전체 REST·MCP 가이드 / Full guide](https://apick.app/dev_guide/subagent)
|
|
1
|
+
# 서브에이전트 / Subagent
|
|
2
|
+
|
|
3
|
+
`apick-agent`는 설치형 상품이며 `quoteSkill`·`runSkill` 대신 전용 API를 사용합니다. 성공 작업의 확인된 원가에 40%를 가산하며 승인된 동일 결과 캐시는 무료입니다. 충전 잔액 외 상품 사용량 한도는 없습니다.
|
|
4
|
+
|
|
5
|
+
`apick-agent` is an installed-agent product. Use the dedicated API rather than `quoteSkill` or `runSkill`. Successful work is billed at confirmed model cost plus 40%; approved identical-result cache reuse is free. There are no product usage quotas beyond prepaid balance.
|
|
6
|
+
|
|
7
|
+
```js
|
|
8
|
+
import { ApickClient } from 'apick-api';
|
|
9
|
+
import { createHash } from 'node:crypto';
|
|
10
|
+
const api = new ApickClient({ apiKey: process.env.APICK_API_KEY });
|
|
11
|
+
const bytes = Buffer.from('검토할 공개 문서입니다.');
|
|
12
|
+
const file = await api.createSubagentFile({
|
|
13
|
+
path: 'docs/sample.txt', bytes: bytes.length,
|
|
14
|
+
sha256: createHash('sha256').update(bytes).digest('hex'), retention: 'seven_days'
|
|
15
|
+
});
|
|
16
|
+
if (file.data.state !== 'ready') {
|
|
17
|
+
for (let offset = 0; offset < bytes.length; offset += file.data.part_bytes) {
|
|
18
|
+
await api.uploadSubagentPart(file.data.file_id, offset / file.data.part_bytes,
|
|
19
|
+
bytes.subarray(offset, offset + file.data.part_bytes).toString('base64'));
|
|
20
|
+
}
|
|
21
|
+
await api.completeSubagentFile(file.data.file_id);
|
|
22
|
+
}
|
|
23
|
+
const job = await api.dispatchSubagent({kind:'summarize', goal:'핵심 내용과 근거를 정리하세요',
|
|
24
|
+
file_ids:[file.data.file_id]}, {idempotencyKey:'sample-summary-20261004-001'});
|
|
25
|
+
const result = await api.collectSubagent(job.data.job_id);
|
|
26
|
+
// 완료 후 evidence_ids를 조회하여 인용·해시를 직접 검토하세요.
|
|
27
|
+
// Once complete, fetch evidence_ids and independently review quotes and hashes.
|
|
28
|
+
console.log(result.data.state);
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
접수 응답은 작업 ID를 신속히 반환합니다. 같은 멱등 키와 같은 내용은 기존 작업을 반환하며 내용이 다르면 409입니다. 연결 종료는 취소가 아닙니다. `cancelSubagent`로 명시적으로 취소하세요. `retention:'none'`은 검수 완료 후 삭제하고 임시 보관은 최대 1시간입니다.
|
|
32
|
+
|
|
33
|
+
Submission returns a job ID promptly. Replay the same idempotency key and payload after response loss; a changed payload conflicts with HTTP 409. Disconnecting does not cancel work; use `cancelSubagent`. `retention:'none'` deletes after review, with temporary retention capped at one hour.
|
|
34
|
+
|
|
35
|
+
`subagentUsage`는 호출·토큰·예약·청구·해제·캐시·전송 지표를 반환합니다. 캐시 예상 회피 비용은 동일 작업의 최초 계산 비용 기준이며 주 모델의 실제 청구 절감액이 아닙니다.
|
|
36
|
+
|
|
37
|
+
`subagentUsage` returns calls, tokens, reservations, charges, releases, cache and transfer metrics. Estimated avoided cache cost uses the original job's calculated cost and is not a measured reduction in the main model's bill.
|
|
38
|
+
|
|
39
|
+
[전체 REST·MCP 가이드 / Full guide](https://apick.app/dev_guide/subagent)
|
package/docs/tts.md
CHANGED
|
@@ -1,34 +1,34 @@
|
|
|
1
|
-
# Gemini·ChatGPT TTS
|
|
2
|
-
|
|
3
|
-
기존 APICK 목소리와 자동 전환은 종료되었습니다. `createTtsJob`은 Gemini 기본 목소리 `Kore`를 사용합니다. `getTtsQuality`, `retryTtsJob`, `downloadTtsCandidate`의 기존 경로는 HTTP 409를 반환합니다.
|
|
4
|
-
|
|
5
|
-
Legacy APICK voices and automatic fallback have retired. `createTtsJob` now defaults to Gemini voice `Kore`. The legacy quality, retry and candidate endpoints return HTTP 409.
|
|
6
|
-
|
|
7
|
-
```js
|
|
8
|
-
const job = await client.createTtsJob('기온은 오 도입니다.', { voiceId: 'Kore', normalizeText: false, idempotencyKey: 'tts-001' });
|
|
9
|
-
const dialogue = await client.createOpenAiTtsJob({
|
|
10
|
-
utterances: [{ speaker: '진행', text: '반갑습니다.' }, { speaker: '손님', text: '안녕하세요.' }],
|
|
11
|
-
speakers: { 진행: { voice_id: 'alloy' }, 손님: { voice_id: 'nova', emotion: 'calm' } },
|
|
12
|
-
multi_speaker: true, normalize_text: false
|
|
13
|
-
}, { idempotencyKey: 'tts-002' });
|
|
14
|
-
const voices = await client.listGeminiTtsVoices();
|
|
15
|
-
const otherVoices = await client.listOpenAiTtsVoices();
|
|
16
|
-
const options = await client.getTtsOptions();
|
|
17
|
-
const quote = await client.quoteTts({ engine: 'gemini', text: '본문', voice_id: 'Kore' });
|
|
18
|
-
```
|
|
19
|
-
|
|
20
|
-
`style`, `emotion`, `tone`, `accent`, `pace`(0.5–2), `pitch`(-12–12), `volume_gain_db`(-12–12)는 최상위·화자·발화에 지정할 수 있습니다. `speakers`는 화자 이름별 설정이고 `multi_speaker: true`는 Gemini 최대 2명, ChatGPT 최대 8명입니다. 엔진에 따라 표현 효과가 달라지며 정확한 속도 배율·반음·dB 적용을 보장하지 않습니다. 특히 ChatGPT는 수치의 방향을 낭독 지시로 전달합니다.
|
|
21
|
-
|
|
22
|
-
Style, emotion, tone, accent, pace, pitch and volume options can be set per request, speaker or utterance. Gemini supports up to two native speakers; ChatGPT supports up to eight speakers across utterances. Numeric acoustic adjustments are not guaranteed: ChatGPT receives directional instructions rather than precise rate, semitone or decibel controls.
|
|
23
|
-
|
|
24
|
-
정규화는 기본 켜짐이며 추가 스킬 요금이 합산됩니다. `normalize_text: false`(SDK 문자열 호출은 `normalizeText: false`)로 끌 수 있습니다. 정규화 입력은 발화 사이 줄바꿈을 포함해 최대 2,000자, 정규화 없이 최대 8,000자입니다. 견적은 `quoteTts`, 현재 목소리는 엔진별 목록, 옵션은 `getTtsOptions`로 조회합니다.
|
|
25
|
-
|
|
26
|
-
Normalization is enabled by default and costs extra. Disable it with `normalize_text: false` (`normalizeText: false` for the string SDK helper). Input limits are 2,000 characters including utterance separators with normalization, or 8,000 without it. Query a quote, engine-specific voices and supported options before submitting.
|
|
27
|
-
|
|
28
|
-
실제 AI 원가 × 고정된 환율 × 1.4에 정규화 요금을 더해 정산합니다. Gemini 프로모션 입력/출력 단가는 2026-12-31까지 백만 토큰당 $0.50/$6.00이며 2027-01-01 00:00 UTC부터 $1.00/$12.00입니다. 약 $0.54/시간은 참고값이며 시간 단위 청구가 아닙니다. 엔진별 요금이 다릅니다.
|
|
29
|
-
|
|
30
|
-
AI usage is charged at verified cost × the pinned exchange rate × 1.4, plus normalization. Gemini promotional input/output rates are $0.50/$6.00 per million tokens through 2026-12-31, then $1.00/$12.00 from 2027-01-01 00:00 UTC. The approximate hourly figure is informational; billing uses actual usage and differs by engine.
|
|
31
|
-
|
|
32
|
-
두 엔진은 같은 작업 조회·취소·MP3·원문 ASS 계약을 사용합니다. `billing`의 예약·해제·확정·환불을 확인하세요. MP3는 24kHz 모노 48kbps, 결과는 완료 후 24시간 보관합니다. MP3와 ASS는 각각 완료된 다운로드 1회만 허용하며 전송 중단은 재시도할 수 있습니다. 접수 응답 유실 시 같은 입력과 멱등 키를 재사용하세요. 서버·공급자 최종 실패는 정규화까지 환불하며, 연결 종료는 작업 취소가 아닙니다. 취소 시 이미 수행된 작업분을 정산합니다.
|
|
33
|
-
|
|
34
|
-
Both engines share job status, cancellation, MP3 and original-text ASS downloads. Check reserved, released, captured and refunded amounts in `billing`. MP3 is 24 kHz mono at 48 kbps. Files are kept for 24 hours; each permits one completed download, and interrupted transfers can be retried. Reuse the same input and idempotency key after a lost response. Final server/provider failures refund synthesis and normalization; disconnecting does not cancel work. Explicit cancellation settles work already performed.
|
|
1
|
+
# Gemini·ChatGPT TTS
|
|
2
|
+
|
|
3
|
+
기존 APICK 목소리와 자동 전환은 종료되었습니다. `createTtsJob`은 Gemini 기본 목소리 `Kore`를 사용합니다. `getTtsQuality`, `retryTtsJob`, `downloadTtsCandidate`의 기존 경로는 HTTP 409를 반환합니다.
|
|
4
|
+
|
|
5
|
+
Legacy APICK voices and automatic fallback have retired. `createTtsJob` now defaults to Gemini voice `Kore`. The legacy quality, retry and candidate endpoints return HTTP 409.
|
|
6
|
+
|
|
7
|
+
```js
|
|
8
|
+
const job = await client.createTtsJob('기온은 오 도입니다.', { voiceId: 'Kore', normalizeText: false, idempotencyKey: 'tts-001' });
|
|
9
|
+
const dialogue = await client.createOpenAiTtsJob({
|
|
10
|
+
utterances: [{ speaker: '진행', text: '반갑습니다.' }, { speaker: '손님', text: '안녕하세요.' }],
|
|
11
|
+
speakers: { 진행: { voice_id: 'alloy' }, 손님: { voice_id: 'nova', emotion: 'calm' } },
|
|
12
|
+
multi_speaker: true, normalize_text: false
|
|
13
|
+
}, { idempotencyKey: 'tts-002' });
|
|
14
|
+
const voices = await client.listGeminiTtsVoices();
|
|
15
|
+
const otherVoices = await client.listOpenAiTtsVoices();
|
|
16
|
+
const options = await client.getTtsOptions();
|
|
17
|
+
const quote = await client.quoteTts({ engine: 'gemini', text: '본문', voice_id: 'Kore' });
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
`style`, `emotion`, `tone`, `accent`, `pace`(0.5–2), `pitch`(-12–12), `volume_gain_db`(-12–12)는 최상위·화자·발화에 지정할 수 있습니다. `speakers`는 화자 이름별 설정이고 `multi_speaker: true`는 Gemini 최대 2명, ChatGPT 최대 8명입니다. 엔진에 따라 표현 효과가 달라지며 정확한 속도 배율·반음·dB 적용을 보장하지 않습니다. 특히 ChatGPT는 수치의 방향을 낭독 지시로 전달합니다.
|
|
21
|
+
|
|
22
|
+
Style, emotion, tone, accent, pace, pitch and volume options can be set per request, speaker or utterance. Gemini supports up to two native speakers; ChatGPT supports up to eight speakers across utterances. Numeric acoustic adjustments are not guaranteed: ChatGPT receives directional instructions rather than precise rate, semitone or decibel controls.
|
|
23
|
+
|
|
24
|
+
정규화는 기본 켜짐이며 추가 스킬 요금이 합산됩니다. `normalize_text: false`(SDK 문자열 호출은 `normalizeText: false`)로 끌 수 있습니다. 정규화 입력은 발화 사이 줄바꿈을 포함해 최대 2,000자, 정규화 없이 최대 8,000자입니다. 견적은 `quoteTts`, 현재 목소리는 엔진별 목록, 옵션은 `getTtsOptions`로 조회합니다.
|
|
25
|
+
|
|
26
|
+
Normalization is enabled by default and costs extra. Disable it with `normalize_text: false` (`normalizeText: false` for the string SDK helper). Input limits are 2,000 characters including utterance separators with normalization, or 8,000 without it. Query a quote, engine-specific voices and supported options before submitting.
|
|
27
|
+
|
|
28
|
+
실제 AI 원가 × 고정된 환율 × 1.4에 정규화 요금을 더해 정산합니다. Gemini 프로모션 입력/출력 단가는 2026-12-31까지 백만 토큰당 $0.50/$6.00이며 2027-01-01 00:00 UTC부터 $1.00/$12.00입니다. 약 $0.54/시간은 참고값이며 시간 단위 청구가 아닙니다. 엔진별 요금이 다릅니다.
|
|
29
|
+
|
|
30
|
+
AI usage is charged at verified cost × the pinned exchange rate × 1.4, plus normalization. Gemini promotional input/output rates are $0.50/$6.00 per million tokens through 2026-12-31, then $1.00/$12.00 from 2027-01-01 00:00 UTC. The approximate hourly figure is informational; billing uses actual usage and differs by engine.
|
|
31
|
+
|
|
32
|
+
두 엔진은 같은 작업 조회·취소·MP3·원문 ASS 계약을 사용합니다. `billing`의 예약·해제·확정·환불을 확인하세요. MP3는 24kHz 모노 48kbps, 결과는 완료 후 24시간 보관합니다. MP3와 ASS는 각각 완료된 다운로드 1회만 허용하며 전송 중단은 재시도할 수 있습니다. 접수 응답 유실 시 같은 입력과 멱등 키를 재사용하세요. 서버·공급자 최종 실패는 정규화까지 환불하며, 연결 종료는 작업 취소가 아닙니다. 취소 시 이미 수행된 작업분을 정산합니다.
|
|
33
|
+
|
|
34
|
+
Both engines share job status, cancellation, MP3 and original-text ASS downloads. Check reserved, released, captured and refunded amounts in `billing`. MP3 is 24 kHz mono at 48 kbps. Files are kept for 24 hours; each permits one completed download, and interrupted transfers can be retried. Reuse the same input and idempotency key after a lost response. Final server/provider failures refund synthesis and normalization; disconnecting does not cancel work. Explicit cancellation settles work already performed.
|
package/package.json
CHANGED
package/src/index.cjs
CHANGED
|
@@ -6,6 +6,8 @@ const MAX_OCR_BYTES = 50 * 1024 * 1024;
|
|
|
6
6
|
const MAX_IMAGE_AI_BYTES = 50 * 1024 * 1024;
|
|
7
7
|
const IMAGE_AI_SIZES = Object.freeze(['1024x1024', '1536x1024', '1024x1536', '1152x864', '864x1152']);
|
|
8
8
|
const IMAGE_AI_SIZE_SET = new Set(IMAGE_AI_SIZES);
|
|
9
|
+
// 품질별 장당 고정가: basic 40P(기본) · advanced 350P · premium 1,400P
|
|
10
|
+
const IMAGE_AI_QUALITIES = Object.freeze(['basic', 'advanced', 'premium']);
|
|
9
11
|
const TTS_VOICE_IDS = Object.freeze([
|
|
10
12
|
'v2_ann_m_30s_01', 'v2_ann_m_30s_02', 'v2_ann_m_30s_04', 'v2_ann_m_30s_05', 'v2_ann_f_30s_02', 'v2_ann_f_30s_03', 'v2_ann_f_30s_04', 'v2_ann_f_30s_05', 'v2_m_teen_01', 'v2_m_young_01', 'v2_m_mid_01', 'v2_m_senior_01', 'v2_f_young_01', 'v2_f_senior_01'
|
|
11
13
|
]);
|
|
@@ -63,8 +65,8 @@ const SERVICES = Object.freeze(Object.fromEntries(
|
|
|
63
65
|
])
|
|
64
66
|
));
|
|
65
67
|
|
|
66
|
-
function normalizeSubagentId(value,prefix){if(typeof value!=='string'||!new RegExp('^'+prefix+'_[a-f0-9]{32}$').test(value))throw new TypeError('Invalid subagent identifier.');return value;}
|
|
67
|
-
function redact(value, apiKey) {
|
|
68
|
+
function normalizeSubagentId(value,prefix){if(typeof value!=='string'||!new RegExp('^'+prefix+'_[a-f0-9]{32}$').test(value))throw new TypeError('Invalid subagent identifier.');return value;}
|
|
69
|
+
function redact(value, apiKey) {
|
|
68
70
|
let text = String(value || '');
|
|
69
71
|
if (apiKey) text = text.split(apiKey).join('***');
|
|
70
72
|
return text.replace(/(Authorization\s*:\s*Bearer\s*)\S+/gi, '$1***').replace(/(CL_AUTH_KEY\s*[:=]\s*)\S+/gi, '$1***');
|
|
@@ -118,9 +120,9 @@ function normalizeTtsJobId(value) {
|
|
|
118
120
|
return jobId;
|
|
119
121
|
}
|
|
120
122
|
|
|
121
|
-
function normalizeTtsVoice(value) {
|
|
122
|
-
const voiceId = requiredString('voiceId', value, 160);
|
|
123
|
-
if (TTS_VOICE_ID_SET.has(voiceId)) throw new RangeError('This voiceId has retired. Select a current Gemini voice with listGeminiTtsVoices().');
|
|
123
|
+
function normalizeTtsVoice(value) {
|
|
124
|
+
const voiceId = requiredString('voiceId', value, 160);
|
|
125
|
+
if (TTS_VOICE_ID_SET.has(voiceId)) throw new RangeError('This voiceId has retired. Select a current Gemini voice with listGeminiTtsVoices().');
|
|
124
126
|
return voiceId;
|
|
125
127
|
}
|
|
126
128
|
|
|
@@ -379,17 +381,17 @@ class ApickClient {
|
|
|
379
381
|
Accept: definition.output === 'binary' ? '*/*' : 'application/json',
|
|
380
382
|
Authorization: `Bearer ${this.#apiKey}`
|
|
381
383
|
};
|
|
382
|
-
const method = definition.method || 'POST';
|
|
383
|
-
if (definition.idempotencyKey) headers['X-Idempotency-Key'] = requiredString('idempotencyKey', definition.idempotencyKey, 128);
|
|
384
|
+
const method = definition.method || 'POST';
|
|
385
|
+
if (definition.idempotencyKey) headers['X-Idempotency-Key'] = requiredString('idempotencyKey', definition.idempotencyKey, 128);
|
|
384
386
|
const request = {
|
|
385
387
|
method,
|
|
386
388
|
headers,
|
|
387
389
|
signal: controller.signal,
|
|
388
390
|
redirect: 'error'
|
|
389
391
|
};
|
|
390
|
-
if (method !== 'GET') {
|
|
391
|
-
if (definition.json) { headers['Content-Type']='application/json'; request.body=JSON.stringify(payload||{}); }
|
|
392
|
-
else request.body = formData || require('./form.cjs').createForm(payload || {}, definition.endpoint);
|
|
392
|
+
if (method !== 'GET') {
|
|
393
|
+
if (definition.json) { headers['Content-Type']='application/json'; request.body=JSON.stringify(payload||{}); }
|
|
394
|
+
else request.body = formData || require('./form.cjs').createForm(payload || {}, definition.endpoint);
|
|
393
395
|
}
|
|
394
396
|
|
|
395
397
|
let response;
|
|
@@ -630,31 +632,31 @@ class ApickClient {
|
|
|
630
632
|
return this._call('createVideoJob', null, null, { endpoint:'/rest/'+model+'/jobs/'+jobId+'/result', method:'GET', output:'binary', filename:jobId+'.mp4', timeoutMs:60_000 });
|
|
631
633
|
}
|
|
632
634
|
|
|
633
|
-
createTtsJob(text, options) {
|
|
634
|
-
const config = options || {};
|
|
635
|
-
const payload = typeof text==='object' && text!==null ? {...text} : {
|
|
636
|
-
voice_id: normalizeTtsVoice(config.voiceId || 'Kore'),
|
|
637
|
-
text: requiredString('text', text, config.normalizeText === false ? 8000 : 2000)
|
|
638
|
-
};
|
|
639
|
-
if(config.normalizeText!==undefined)payload.normalize_text=config.normalizeText;
|
|
640
|
-
if(config.fallbackPolicy!==undefined||config.fallbackOptions!==undefined||payload.fallback_policy!==undefined||payload.fallback_options!==undefined)throw new TypeError('TTS fallback has retired. Use createGeminiTtsJob or createOpenAiTtsJob.');
|
|
641
|
-
if(payload.normalize_text!==undefined&&typeof payload.normalize_text!=='boolean')throw new TypeError('normalizeText must be boolean.');
|
|
642
|
-
if(payload.voice_id!==undefined)normalizeTtsVoice(payload.voice_id);
|
|
643
|
-
return this._call('createTtsJob',payload,null,{json:true,idempotencyKey:config.idempotencyKey});
|
|
644
|
-
}
|
|
645
|
-
|
|
646
|
-
createGeminiTtsJob(input, options) {
|
|
647
|
-
if(!input||typeof input!=='object'||Array.isArray(input))throw new TypeError('Gemini TTS input is required.');
|
|
648
|
-
return this._call('createTtsJob', input, null, {endpoint:'/rest/tts/gemini/jobs',json:true,idempotencyKey:options?.idempotencyKey});
|
|
649
|
-
}
|
|
650
|
-
listGeminiTtsVoices() { return this._call('createTtsJob',null,null,{endpoint:'/rest/tts/gemini/voices',method:'GET'}); }
|
|
651
|
-
createOpenAiTtsJob(input, options) {
|
|
652
|
-
if(!input||typeof input!=='object'||Array.isArray(input))throw new TypeError('OpenAI TTS input is required.');
|
|
653
|
-
return this._call('createTtsJob',input,null,{endpoint:'/rest/tts/openai/jobs',json:true,idempotencyKey:options?.idempotencyKey});
|
|
654
|
-
}
|
|
655
|
-
listOpenAiTtsVoices() { return this._call('createTtsJob',null,null,{endpoint:'/rest/tts/openai/voices',method:'GET'}); }
|
|
656
|
-
getTtsOptions() { return this._call('createTtsJob',null,null,{endpoint:'/rest/tts/options',method:'GET'}); }
|
|
657
|
-
quoteTts(input) { return this._call('createTtsJob',input,null,{endpoint:'/rest/tts/quote',json:true}); }
|
|
635
|
+
createTtsJob(text, options) {
|
|
636
|
+
const config = options || {};
|
|
637
|
+
const payload = typeof text==='object' && text!==null ? {...text} : {
|
|
638
|
+
voice_id: normalizeTtsVoice(config.voiceId || 'Kore'),
|
|
639
|
+
text: requiredString('text', text, config.normalizeText === false ? 8000 : 2000)
|
|
640
|
+
};
|
|
641
|
+
if(config.normalizeText!==undefined)payload.normalize_text=config.normalizeText;
|
|
642
|
+
if(config.fallbackPolicy!==undefined||config.fallbackOptions!==undefined||payload.fallback_policy!==undefined||payload.fallback_options!==undefined)throw new TypeError('TTS fallback has retired. Use createGeminiTtsJob or createOpenAiTtsJob.');
|
|
643
|
+
if(payload.normalize_text!==undefined&&typeof payload.normalize_text!=='boolean')throw new TypeError('normalizeText must be boolean.');
|
|
644
|
+
if(payload.voice_id!==undefined)normalizeTtsVoice(payload.voice_id);
|
|
645
|
+
return this._call('createTtsJob',payload,null,{json:true,idempotencyKey:config.idempotencyKey});
|
|
646
|
+
}
|
|
647
|
+
|
|
648
|
+
createGeminiTtsJob(input, options) {
|
|
649
|
+
if(!input||typeof input!=='object'||Array.isArray(input))throw new TypeError('Gemini TTS input is required.');
|
|
650
|
+
return this._call('createTtsJob', input, null, {endpoint:'/rest/tts/gemini/jobs',json:true,idempotencyKey:options?.idempotencyKey});
|
|
651
|
+
}
|
|
652
|
+
listGeminiTtsVoices() { return this._call('createTtsJob',null,null,{endpoint:'/rest/tts/gemini/voices',method:'GET'}); }
|
|
653
|
+
createOpenAiTtsJob(input, options) {
|
|
654
|
+
if(!input||typeof input!=='object'||Array.isArray(input))throw new TypeError('OpenAI TTS input is required.');
|
|
655
|
+
return this._call('createTtsJob',input,null,{endpoint:'/rest/tts/openai/jobs',json:true,idempotencyKey:options?.idempotencyKey});
|
|
656
|
+
}
|
|
657
|
+
listOpenAiTtsVoices() { return this._call('createTtsJob',null,null,{endpoint:'/rest/tts/openai/voices',method:'GET'}); }
|
|
658
|
+
getTtsOptions() { return this._call('createTtsJob',null,null,{endpoint:'/rest/tts/options',method:'GET'}); }
|
|
659
|
+
quoteTts(input) { return this._call('createTtsJob',input,null,{endpoint:'/rest/tts/quote',json:true}); }
|
|
658
660
|
|
|
659
661
|
getTtsJob(jobId) {
|
|
660
662
|
const id = normalizeTtsJobId(jobId);
|
|
@@ -736,7 +738,7 @@ class ApickClient {
|
|
|
736
738
|
|
|
737
739
|
_imageOptions(prompt, options, maxCount) {
|
|
738
740
|
const config = options || {};
|
|
739
|
-
for (const key of ['model', '
|
|
741
|
+
for (const key of ['model', 'count', 'n', 'outputCompression', 'input_fidelity', 'moderation', 'mask', 'maskFilename', 'maskContentType']) {
|
|
740
742
|
if (Object.prototype.hasOwnProperty.call(config, key)) throw new TypeError(`${key} is not a supported image option.`);
|
|
741
743
|
}
|
|
742
744
|
const imageCount = positiveInteger('imageCount', config.imageCount, 1);
|
|
@@ -748,10 +750,11 @@ class ApickClient {
|
|
|
748
750
|
size, output_format: config.outputFormat || 'png',
|
|
749
751
|
background: config.background || 'auto'
|
|
750
752
|
};
|
|
751
|
-
if (config.
|
|
752
|
-
|
|
753
|
-
|
|
753
|
+
if (config.quality !== undefined) {
|
|
754
|
+
if (!IMAGE_AI_QUALITIES.includes(config.quality)) throw new TypeError(`quality must be one of: ${IMAGE_AI_QUALITIES.join(', ')}.`);
|
|
755
|
+
payload.quality = config.quality;
|
|
754
756
|
}
|
|
757
|
+
// 서버가 같은 요청도 매번 새로 생성·과금하므로 idempotencyKey 는 보내지 않는다(예전 코드 호환을 위해 받기만 한다).
|
|
755
758
|
return payload;
|
|
756
759
|
}
|
|
757
760
|
|
|
@@ -969,24 +972,24 @@ class ApickClient {
|
|
|
969
972
|
return this._skills('GET', '/rest/skills', { query });
|
|
970
973
|
}
|
|
971
974
|
|
|
972
|
-
getSkillPerformance() {
|
|
975
|
+
getSkillPerformance() {
|
|
973
976
|
return this._skills('GET', '/skills/performance/data.json');
|
|
974
|
-
}
|
|
975
|
-
|
|
976
|
-
_subagent(method, route, options) { return this._skills(method, '/rest/subagent/v1' + route, options); }
|
|
977
|
-
subagentStatus() { return this._subagent('GET', '/status'); }
|
|
978
|
-
subagentUsage() { return this._subagent('GET', '/usage'); }
|
|
979
|
-
createSubagentFile(input) { return this._subagent('POST', '/files', {body: input}); }
|
|
980
|
-
getSubagentFile(fileId) { return this._subagent('GET', '/files/' + normalizeSubagentId(fileId,'saf')); }
|
|
981
|
-
uploadSubagentPart(fileId, partNo, data) { if(!Number.isSafeInteger(partNo)||partNo<0||typeof data!=='string')throw new TypeError('Invalid upload part.');return this._subagent('POST','/files/'+normalizeSubagentId(fileId,'saf')+'/parts',{body:{part_no:partNo,data}}); }
|
|
982
|
-
completeSubagentFile(fileId) { return this._subagent('POST','/files/'+normalizeSubagentId(fileId,'saf')+'/complete',{body:{}}); }
|
|
983
|
-
deleteSubagentFile(fileId) { return this._subagent('DELETE','/files/'+normalizeSubagentId(fileId,'saf')); }
|
|
984
|
-
dispatchSubagent(input, options) { const key=requiredString('idempotencyKey',options?.idempotencyKey,200);if(key.length<8)throw new TypeError('idempotencyKey must contain at least 8 characters.');return this._subagent('POST','/jobs',{body:input,idempotencyKey:key}); }
|
|
985
|
-
collectSubagent(jobId, options) { return this._subagent('GET','/jobs/'+normalizeSubagentId(jobId,'saj'),{query:options?.cursor?{cursor:String(options.cursor)}:{}}); }
|
|
986
|
-
subagentEvidence(jobId,evidenceIds) { return this._subagent('POST','/jobs/'+normalizeSubagentId(jobId,'saj')+'/evidence',{body:{evidence_ids:evidenceIds}}); }
|
|
987
|
-
reviewSubagent(jobId,resultHash,decision) { if(!['accepted','rejected'].includes(decision)||!/^[a-f0-9]{64}$/.test(resultHash))throw new TypeError('Invalid review.');return this._subagent('POST','/jobs/'+normalizeSubagentId(jobId,'saj')+'/review',{body:{result_hash:resultHash,decision}}); }
|
|
988
|
-
cancelSubagent(jobId) { return this._subagent('POST','/jobs/'+normalizeSubagentId(jobId,'saj')+'/cancel',{body:{}}); }
|
|
989
|
-
deleteSubagentJob(jobId) { return this._subagent('DELETE','/jobs/'+normalizeSubagentId(jobId,'saj')); }
|
|
977
|
+
}
|
|
978
|
+
|
|
979
|
+
_subagent(method, route, options) { return this._skills(method, '/rest/subagent/v1' + route, options); }
|
|
980
|
+
subagentStatus() { return this._subagent('GET', '/status'); }
|
|
981
|
+
subagentUsage() { return this._subagent('GET', '/usage'); }
|
|
982
|
+
createSubagentFile(input) { return this._subagent('POST', '/files', {body: input}); }
|
|
983
|
+
getSubagentFile(fileId) { return this._subagent('GET', '/files/' + normalizeSubagentId(fileId,'saf')); }
|
|
984
|
+
uploadSubagentPart(fileId, partNo, data) { if(!Number.isSafeInteger(partNo)||partNo<0||typeof data!=='string')throw new TypeError('Invalid upload part.');return this._subagent('POST','/files/'+normalizeSubagentId(fileId,'saf')+'/parts',{body:{part_no:partNo,data}}); }
|
|
985
|
+
completeSubagentFile(fileId) { return this._subagent('POST','/files/'+normalizeSubagentId(fileId,'saf')+'/complete',{body:{}}); }
|
|
986
|
+
deleteSubagentFile(fileId) { return this._subagent('DELETE','/files/'+normalizeSubagentId(fileId,'saf')); }
|
|
987
|
+
dispatchSubagent(input, options) { const key=requiredString('idempotencyKey',options?.idempotencyKey,200);if(key.length<8)throw new TypeError('idempotencyKey must contain at least 8 characters.');return this._subagent('POST','/jobs',{body:input,idempotencyKey:key}); }
|
|
988
|
+
collectSubagent(jobId, options) { return this._subagent('GET','/jobs/'+normalizeSubagentId(jobId,'saj'),{query:options?.cursor?{cursor:String(options.cursor)}:{}}); }
|
|
989
|
+
subagentEvidence(jobId,evidenceIds) { return this._subagent('POST','/jobs/'+normalizeSubagentId(jobId,'saj')+'/evidence',{body:{evidence_ids:evidenceIds}}); }
|
|
990
|
+
reviewSubagent(jobId,resultHash,decision) { if(!['accepted','rejected'].includes(decision)||!/^[a-f0-9]{64}$/.test(resultHash))throw new TypeError('Invalid review.');return this._subagent('POST','/jobs/'+normalizeSubagentId(jobId,'saj')+'/review',{body:{result_hash:resultHash,decision}}); }
|
|
991
|
+
cancelSubagent(jobId) { return this._subagent('POST','/jobs/'+normalizeSubagentId(jobId,'saj')+'/cancel',{body:{}}); }
|
|
992
|
+
deleteSubagentJob(jobId) { return this._subagent('DELETE','/jobs/'+normalizeSubagentId(jobId,'saj')); }
|
|
990
993
|
|
|
991
994
|
getSkill(skillId) {
|
|
992
995
|
return this._skills('GET', '/rest/skills/' + normalizeSkillId(skillId));
|
package/src/index.d.ts
CHANGED
|
@@ -31,14 +31,18 @@ export interface OcrOptions {
|
|
|
31
31
|
export type ImageAiFormat = 'png' | 'jpeg' | 'webp';
|
|
32
32
|
export type ImageAiBackground = 'auto' | 'opaque' | 'transparent';
|
|
33
33
|
export type ImageAiSize = '1024x1024' | '1536x1024' | '1024x1536' | '1152x864' | '864x1152';
|
|
34
|
+
/** basic 40P(default) · advanced 350P · premium 1,400P per image */
|
|
35
|
+
export type ImageAiQuality = 'basic' | 'advanced' | 'premium';
|
|
34
36
|
export type ImageAiStatus = 'waiting' | 'processing' | 'completed' | 'completed_partial' | 'failed';
|
|
35
37
|
export type ApickImageErrorCode = `APICK_IMAGE_${string}`;
|
|
36
|
-
export interface ImageAiOptions { imageCount?: number; size?: ImageAiSize; outputFormat?: ImageAiFormat; background?: ImageAiBackground;
|
|
38
|
+
export interface ImageAiOptions { imageCount?: number; size?: ImageAiSize; outputFormat?: ImageAiFormat; background?: ImageAiBackground; quality?: ImageAiQuality;
|
|
39
|
+
/** @deprecated Ignored. Every image request is generated and charged as a new request. */
|
|
40
|
+
idempotencyKey?: string; }
|
|
37
41
|
export interface ImageAiGenerateOptions extends ImageAiOptions { referenceImage?: string|BinaryInput|ArrayBuffer|ArrayBufferView; referenceFilename?: string; referenceContentType?: 'image/png'|'image/jpeg'|'image/webp'; }
|
|
38
42
|
export interface ImageAiEditOptions extends ImageAiOptions { filename?: string; contentType?: 'image/png'|'image/jpeg'|'image/webp'; }
|
|
39
43
|
export interface ImageAiResultImage { index:number; b64_json:string; mime_type:'image/png'|'image/jpeg'|'image/webp'; width:number; height:number; }
|
|
40
|
-
export interface ImageAiResultData { request_id:string; image_count:number; images:ImageAiResultImage[]; idempotent_replay?:boolean; }
|
|
41
|
-
export interface ImageAiPendingData {request_id:string;job_id:string;status:'processing';billing_status:'pending';reserved_point:number;}
|
|
44
|
+
export interface ImageAiResultData { request_id:string; image_count:number; images:ImageAiResultImage[]; idempotent_replay?:boolean; }
|
|
45
|
+
export interface ImageAiPendingData {request_id:string;job_id:string;status:'processing';billing_status:'pending';reserved_point:number;}
|
|
42
46
|
export interface ImageAiJobData { job_id:string; status:ImageAiStatus; requested_count:number; completed_count?:number; failed_count?:number; prepaid_point?:number; charged_point?:number; refunded_point?:number; result_available?:boolean; expires_at?:string|null; error_code?:ApickImageErrorCode|null; }
|
|
43
47
|
|
|
44
48
|
export interface MaskResidentNumberOptions extends OcrOptions {
|
|
@@ -200,33 +204,33 @@ export interface YoutubeSubtitleList {
|
|
|
200
204
|
}
|
|
201
205
|
export interface YoutubeSubtitleOptions { format?: 'vtt' | 'srt' | 'txt'; type?: 'any' | 'manual' | 'auto'; }
|
|
202
206
|
|
|
203
|
-
/** @deprecated Retired APICK voice IDs. Query listGeminiTtsVoices or listOpenAiTtsVoices. */
|
|
204
|
-
export const TTS_VOICE_IDS: readonly [
|
|
207
|
+
/** @deprecated Retired APICK voice IDs. Query listGeminiTtsVoices or listOpenAiTtsVoices. */
|
|
208
|
+
export const TTS_VOICE_IDS: readonly [
|
|
205
209
|
'v2_ann_m_30s_01', 'v2_ann_m_30s_02', 'v2_ann_m_30s_04', 'v2_ann_m_30s_05', 'v2_ann_f_30s_02', 'v2_ann_f_30s_03', 'v2_ann_f_30s_04', 'v2_ann_f_30s_05', 'v2_m_teen_01', 'v2_m_young_01', 'v2_m_mid_01', 'v2_m_senior_01', 'v2_f_young_01', 'v2_f_senior_01'
|
|
206
210
|
];
|
|
207
|
-
export type TtsVoiceId = string;
|
|
208
|
-
/** @deprecated Automatic fallback is no longer supported. */
|
|
209
|
-
export type TtsFallbackPolicy = 'never' | 'queue_full' | 'busy';
|
|
210
|
-
export interface TtsFallbackOptions { voice_id?: string; style?: string; }
|
|
211
|
-
/** @deprecated Retired APICK request shape. Use GeminiTtsInput or OpenAiTtsInput. */
|
|
212
|
-
export interface ApickTtsInput { voice_id: TtsVoiceId; text?: string; utterances?: Array<{text:string;emotion?:string;speed?:number;pause_after_ms?:number}>; normalize_text?:boolean; fallback_policy?:TtsFallbackPolicy; fallback_options?:TtsFallbackOptions; }
|
|
213
|
-
export interface TtsStyleOptions { style?:string; emotion?:'neutral'|'calm'|'cheerful'|'excited'|'sad'|'serious'|'friendly'|'empathetic'|'confident'|'gentle'|'whisper'|'narration'; tone?:'narration'|'news'|'audiobook'|'documentary'|'ad'|'conversation'|'announcement'|'tutorial'|'storytelling'; accent?:'standard'|'seoul'|'gyeongsang'|'jeolla'|'chungcheong'; pace?:number; pitch?:number; volume_gain_db?:number; }
|
|
214
|
-
export interface TtsSpeakerOptions extends TtsStyleOptions { voice_id?:string; }
|
|
215
|
-
export interface TtsUtterance extends TtsSpeakerOptions { text:string; speaker?:string; }
|
|
216
|
-
export interface GeminiTtsInput extends TtsStyleOptions { voice_id?:string; text?:string; utterances?:TtsUtterance[]; speakers?:Record<string,TtsSpeakerOptions>; multi_speaker?:boolean; normalize_text?:boolean; language_code?:'ko'|'ko-KR'; }
|
|
217
|
-
export interface OpenAiTtsInput extends GeminiTtsInput {}
|
|
218
|
-
export interface TtsOptions { voiceId?:TtsVoiceId; normalizeText?:boolean; idempotencyKey?:string; }
|
|
219
|
-
export interface GeminiTtsVoice { voice_id:string; name:string; gender:string|null; tone:string; age_band:string|null; age_years?:number|null; age_verified?:boolean; age_basis?:'catalog_description'|'reviewed'; age_source?:string; description?:string; language_code?:string|null; reviewed_at?:string; library:string; }
|
|
220
|
-
export interface TtsQuote { synthesis:number; normalization:number; estimated_total:number; maximum:number; synthesis_maximum:number; normalization_maximum:number; estimated_only:true; currency:'POINT'; fallback_price_may_change:boolean; }
|
|
211
|
+
export type TtsVoiceId = string;
|
|
212
|
+
/** @deprecated Automatic fallback is no longer supported. */
|
|
213
|
+
export type TtsFallbackPolicy = 'never' | 'queue_full' | 'busy';
|
|
214
|
+
export interface TtsFallbackOptions { voice_id?: string; style?: string; }
|
|
215
|
+
/** @deprecated Retired APICK request shape. Use GeminiTtsInput or OpenAiTtsInput. */
|
|
216
|
+
export interface ApickTtsInput { voice_id: TtsVoiceId; text?: string; utterances?: Array<{text:string;emotion?:string;speed?:number;pause_after_ms?:number}>; normalize_text?:boolean; fallback_policy?:TtsFallbackPolicy; fallback_options?:TtsFallbackOptions; }
|
|
217
|
+
export interface TtsStyleOptions { style?:string; emotion?:'neutral'|'calm'|'cheerful'|'excited'|'sad'|'serious'|'friendly'|'empathetic'|'confident'|'gentle'|'whisper'|'narration'; tone?:'narration'|'news'|'audiobook'|'documentary'|'ad'|'conversation'|'announcement'|'tutorial'|'storytelling'; accent?:'standard'|'seoul'|'gyeongsang'|'jeolla'|'chungcheong'; pace?:number; pitch?:number; volume_gain_db?:number; }
|
|
218
|
+
export interface TtsSpeakerOptions extends TtsStyleOptions { voice_id?:string; }
|
|
219
|
+
export interface TtsUtterance extends TtsSpeakerOptions { text:string; speaker?:string; }
|
|
220
|
+
export interface GeminiTtsInput extends TtsStyleOptions { voice_id?:string; text?:string; utterances?:TtsUtterance[]; speakers?:Record<string,TtsSpeakerOptions>; multi_speaker?:boolean; normalize_text?:boolean; language_code?:'ko'|'ko-KR'; }
|
|
221
|
+
export interface OpenAiTtsInput extends GeminiTtsInput {}
|
|
222
|
+
export interface TtsOptions { voiceId?:TtsVoiceId; normalizeText?:boolean; idempotencyKey?:string; }
|
|
223
|
+
export interface GeminiTtsVoice { voice_id:string; name:string; gender:string|null; tone:string; age_band:string|null; age_years?:number|null; age_verified?:boolean; age_basis?:'catalog_description'|'reviewed'; age_source?:string; description?:string; language_code?:string|null; reviewed_at?:string; library:string; }
|
|
224
|
+
export interface TtsQuote { synthesis:number; normalization:number; estimated_total:number; maximum:number; synthesis_maximum:number; normalization_maximum:number; estimated_only:true; currency:'POINT'; fallback_price_may_change:boolean; }
|
|
221
225
|
|
|
222
226
|
export interface TtsJobData {
|
|
223
227
|
job_id: string;
|
|
224
228
|
status: 'waiting' | 'processing' | 'completed' | 'cancelled' | 'failed';
|
|
225
|
-
voice_id?: string;
|
|
226
|
-
synthesis?: {engine:'apick'|'gemini'|'openai';model:string;voice_id:string;fallback_reason:string|null;age_verified:boolean;notice:string|null};
|
|
227
|
-
normalization?: {enabled:boolean;run_id:string|null;status:string;skill_id:string|null};
|
|
228
|
-
billing?: {status:string;synthesis:number;skill:number;total:number;reserved:number;refunded:number;released:number;currency:'POINT'};
|
|
229
|
-
expires_at?:string|null;
|
|
229
|
+
voice_id?: string;
|
|
230
|
+
synthesis?: {engine:'apick'|'gemini'|'openai';model:string;voice_id:string;fallback_reason:string|null;age_verified:boolean;notice:string|null};
|
|
231
|
+
normalization?: {enabled:boolean;run_id:string|null;status:string;skill_id:string|null};
|
|
232
|
+
billing?: {status:string;synthesis:number;skill:number;total:number;reserved:number;refunded:number;released:number;currency:'POINT'};
|
|
233
|
+
expires_at?:string|null;
|
|
230
234
|
character_count?: number;
|
|
231
235
|
result_available?: boolean;
|
|
232
236
|
subtitles_available?: boolean;
|
|
@@ -309,29 +313,29 @@ export class ApickClient {
|
|
|
309
313
|
youtubeThumbnail(url: string): Promise<ApickBinaryResult>;
|
|
310
314
|
youtubeSubtitleList(url: string): Promise<ApickResult<YoutubeSubtitleList>>;
|
|
311
315
|
youtubeSubtitle(url: string, lang: string, options?: YoutubeSubtitleOptions): Promise<ApickBinaryResult>;
|
|
312
|
-
createTtsJob(text: string | GeminiTtsInput, options?: TtsOptions): Promise<ApickResult<TtsJobData>>;
|
|
313
|
-
createGeminiTtsJob(input:GeminiTtsInput, options?:{idempotencyKey?:string}):Promise<ApickResult<TtsJobData>>;
|
|
314
|
-
listGeminiTtsVoices():Promise<ApickResult<{voices:GeminiTtsVoice[];complete:boolean;checked_at:string|null}>>;
|
|
315
|
-
createOpenAiTtsJob(input:OpenAiTtsInput, options?:{idempotencyKey?:string}):Promise<ApickResult<TtsJobData>>;
|
|
316
|
-
listOpenAiTtsVoices():Promise<ApickResult<{voices:GeminiTtsVoice[];complete:boolean;checked_at:string|null}>>;
|
|
317
|
-
getTtsOptions():Promise<ApickResult<{engines:Record<'gemini'|'openai',Record<string,unknown>>}>>;
|
|
318
|
-
quoteTts(input:GeminiTtsInput&{engine?:'gemini'|'openai'}):Promise<ApickResult<TtsQuote>>;
|
|
316
|
+
createTtsJob(text: string | GeminiTtsInput, options?: TtsOptions): Promise<ApickResult<TtsJobData>>;
|
|
317
|
+
createGeminiTtsJob(input:GeminiTtsInput, options?:{idempotencyKey?:string}):Promise<ApickResult<TtsJobData>>;
|
|
318
|
+
listGeminiTtsVoices():Promise<ApickResult<{voices:GeminiTtsVoice[];complete:boolean;checked_at:string|null}>>;
|
|
319
|
+
createOpenAiTtsJob(input:OpenAiTtsInput, options?:{idempotencyKey?:string}):Promise<ApickResult<TtsJobData>>;
|
|
320
|
+
listOpenAiTtsVoices():Promise<ApickResult<{voices:GeminiTtsVoice[];complete:boolean;checked_at:string|null}>>;
|
|
321
|
+
getTtsOptions():Promise<ApickResult<{engines:Record<'gemini'|'openai',Record<string,unknown>>}>>;
|
|
322
|
+
quoteTts(input:GeminiTtsInput&{engine?:'gemini'|'openai'}):Promise<ApickResult<TtsQuote>>;
|
|
319
323
|
getTtsJob(jobId: string): Promise<ApickResult<TtsJobData>>;
|
|
320
324
|
cancelTtsJob(jobId: string): Promise<ApickResult<TtsJobData>>;
|
|
321
325
|
downloadTtsResult(jobId: string): Promise<ApickBinaryResult>;
|
|
322
326
|
downloadTtsSubtitles(jobId: string): Promise<ApickBinaryResult>;
|
|
323
|
-
/** @deprecated Retired endpoint; the service returns HTTP 409. */
|
|
324
|
-
getTtsQuality(jobId: string): Promise<ApickResult<TtsQualityData>>;
|
|
325
|
-
/** @deprecated Retired endpoint; the service returns HTTP 409. */
|
|
326
|
-
retryTtsJob(jobId: string, utteranceIds: string[], idempotencyKey: string): Promise<ApickResult<TtsJobData>>;
|
|
327
|
-
/** @deprecated Retired endpoint; the service returns HTTP 409. */
|
|
327
|
+
/** @deprecated Retired endpoint; the service returns HTTP 409. */
|
|
328
|
+
getTtsQuality(jobId: string): Promise<ApickResult<TtsQualityData>>;
|
|
329
|
+
/** @deprecated Retired endpoint; the service returns HTTP 409. */
|
|
330
|
+
retryTtsJob(jobId: string, utteranceIds: string[], idempotencyKey: string): Promise<ApickResult<TtsJobData>>;
|
|
331
|
+
/** @deprecated Retired endpoint; the service returns HTTP 409. */
|
|
328
332
|
downloadTtsCandidate(jobId: string, candidateId: string): Promise<ApickBinaryResult>;
|
|
329
333
|
htmlToPdf(html: string, options?: { pagination?: boolean }): Promise<ApickBinaryResult>;
|
|
330
334
|
jsonToExcel(data: unknown[], options?: { sheetName?: string }): Promise<ApickBinaryResult>;
|
|
331
335
|
summarize(text: string): Promise<ApickResult>;
|
|
332
336
|
polish(text: string): Promise<ApickResult>;
|
|
333
|
-
generateImages(prompt:string, options?:ImageAiGenerateOptions): Promise<ApickResult<ImageAiResultData|ImageAiPendingData>>;
|
|
334
|
-
editImages(image:string|BinaryInput|ArrayBuffer|ArrayBufferView, prompt:string, options?:ImageAiEditOptions): Promise<ApickResult<ImageAiResultData|ImageAiPendingData>>;
|
|
337
|
+
generateImages(prompt:string, options?:ImageAiGenerateOptions): Promise<ApickResult<ImageAiResultData|ImageAiPendingData>>;
|
|
338
|
+
editImages(image:string|BinaryInput|ArrayBuffer|ArrayBufferView, prompt:string, options?:ImageAiEditOptions): Promise<ApickResult<ImageAiResultData|ImageAiPendingData>>;
|
|
335
339
|
createImageGenerationJob(prompt:string, options?:ImageAiGenerateOptions): Promise<ApickResult<ImageAiJobData>>;
|
|
336
340
|
createImageEditJob(image:string|BinaryInput|ArrayBuffer|ArrayBufferView, prompt:string, options?:ImageAiEditOptions): Promise<ApickResult<ImageAiJobData>>;
|
|
337
341
|
getImageJob(jobId:string): Promise<ApickResult<ImageAiJobData>>;
|
|
@@ -353,20 +357,20 @@ export class ApickClient {
|
|
|
353
357
|
getTaxReturnHistory(transactionId: string): Promise<ApickResult<DataRequestResult<TaxReturnHistoryResultPayload>>>;
|
|
354
358
|
searchSkills(options?: SkillSearchOptions): Promise<ApickResult<SkillPage<SkillSummary>>>;
|
|
355
359
|
/** Public measured results and methods; model scores are not accuracy guarantees. */
|
|
356
|
-
getSkillPerformance(): Promise<ApickResult<SkillPerformanceReport>>;
|
|
357
|
-
subagentStatus(): Promise<ApickResult<Record<string, unknown>>>;
|
|
358
|
-
subagentUsage(): Promise<ApickResult<Record<string, unknown>>>;
|
|
359
|
-
createSubagentFile(input: {path:string;bytes:number;sha256:string;retention?:'seven_days'|'none'}): Promise<ApickResult<SubagentFile>>;
|
|
360
|
-
getSubagentFile(fileId:string): Promise<ApickResult<SubagentFile>>;
|
|
361
|
-
uploadSubagentPart(fileId:string,partNo:number,data:string): Promise<ApickResult<Record<string,unknown>>>;
|
|
362
|
-
completeSubagentFile(fileId:string): Promise<ApickResult<SubagentFile>>;
|
|
363
|
-
deleteSubagentFile(fileId:string): Promise<ApickResult<Record<string,unknown>>>;
|
|
364
|
-
dispatchSubagent(input:SubagentTask,options:{idempotencyKey:string}): Promise<ApickResult<SubagentJob>>;
|
|
365
|
-
collectSubagent(jobId:string,options?:{cursor?:string}): Promise<ApickResult<SubagentJob>>;
|
|
366
|
-
subagentEvidence(jobId:string,evidenceIds:string[]): Promise<ApickResult<Record<string,unknown>>>;
|
|
367
|
-
reviewSubagent(jobId:string,resultHash:string,decision:'accepted'|'rejected'): Promise<ApickResult<Record<string,unknown>>>;
|
|
368
|
-
cancelSubagent(jobId:string): Promise<ApickResult<SubagentJob>>;
|
|
369
|
-
deleteSubagentJob(jobId:string): Promise<ApickResult<Record<string,unknown>>>;
|
|
360
|
+
getSkillPerformance(): Promise<ApickResult<SkillPerformanceReport>>;
|
|
361
|
+
subagentStatus(): Promise<ApickResult<Record<string, unknown>>>;
|
|
362
|
+
subagentUsage(): Promise<ApickResult<Record<string, unknown>>>;
|
|
363
|
+
createSubagentFile(input: {path:string;bytes:number;sha256:string;retention?:'seven_days'|'none'}): Promise<ApickResult<SubagentFile>>;
|
|
364
|
+
getSubagentFile(fileId:string): Promise<ApickResult<SubagentFile>>;
|
|
365
|
+
uploadSubagentPart(fileId:string,partNo:number,data:string): Promise<ApickResult<Record<string,unknown>>>;
|
|
366
|
+
completeSubagentFile(fileId:string): Promise<ApickResult<SubagentFile>>;
|
|
367
|
+
deleteSubagentFile(fileId:string): Promise<ApickResult<Record<string,unknown>>>;
|
|
368
|
+
dispatchSubagent(input:SubagentTask,options:{idempotencyKey:string}): Promise<ApickResult<SubagentJob>>;
|
|
369
|
+
collectSubagent(jobId:string,options?:{cursor?:string}): Promise<ApickResult<SubagentJob>>;
|
|
370
|
+
subagentEvidence(jobId:string,evidenceIds:string[]): Promise<ApickResult<Record<string,unknown>>>;
|
|
371
|
+
reviewSubagent(jobId:string,resultHash:string,decision:'accepted'|'rejected'): Promise<ApickResult<Record<string,unknown>>>;
|
|
372
|
+
cancelSubagent(jobId:string): Promise<ApickResult<SubagentJob>>;
|
|
373
|
+
deleteSubagentJob(jobId:string): Promise<ApickResult<Record<string,unknown>>>;
|
|
370
374
|
getSkill(skillId: string): Promise<ApickResult<SkillDetail>>;
|
|
371
375
|
quoteSkill(skillId: string, input: Record<string, unknown>, options?: { version?: string }): Promise<ApickResult<SkillQuote>>;
|
|
372
376
|
runSkill<T = Record<string, unknown>>(skillId: string, input: Record<string, unknown>, options: SkillRunOptions): Promise<ApickResult<SkillRun<T>>>;
|
|
@@ -461,8 +465,8 @@ export interface SkillSummary {
|
|
|
461
465
|
rating_average: number | null;
|
|
462
466
|
}
|
|
463
467
|
export interface SkillDetail extends SkillSummary {
|
|
464
|
-
description: string; billing_rule: 'validated_result' | 'subagent_usage'; limits: SkillLimits | null;
|
|
465
|
-
delivery?: 'installed_agent'; installation?: {package:string;command:string;api_key_env:string;guide:string;usage:string};
|
|
468
|
+
description: string; billing_rule: 'validated_result' | 'subagent_usage'; limits: SkillLimits | null;
|
|
469
|
+
delivery?: 'installed_agent'; installation?: {package:string;command:string;api_key_env:string;guide:string;usage:string};
|
|
466
470
|
billing?: {markup_percent:number;installation_points:number;base_points:number;complete_cache_points:number;quota:null};
|
|
467
471
|
input_schema: Record<string, unknown>; output_schema: Record<string, unknown>;
|
|
468
472
|
examples: unknown[]; stats: Record<string, unknown> | null; published_at: string | null;
|
|
@@ -523,7 +527,7 @@ export interface VideoJobData {
|
|
|
523
527
|
result_expires_at?: string | null; idempotent_replay?: boolean;
|
|
524
528
|
error?: { code: string; message: string };
|
|
525
529
|
}
|
|
526
|
-
|
|
527
|
-
export interface SubagentTask { kind:'inventory'|'extract'|'summarize'|'compare';goal:string;file_ids:string[];focus?:string[];acceptance?:string[];retention?:'seven_days'|'none'; }
|
|
528
|
-
export interface SubagentFile { file_id:string;path:string;sha256:string;bytes:number;state:string;expires_at:string;part_bytes?:number; }
|
|
529
|
-
export interface SubagentJob { job_id:string;kind:SubagentTask['kind'];state:string;billing_state:string;cache_hit:boolean;reserved_points:number;charged_points:number;accrued_points:string;result_hash?:string;result?:Record<string,unknown>; }
|
|
530
|
+
|
|
531
|
+
export interface SubagentTask { kind:'inventory'|'extract'|'summarize'|'compare';goal:string;file_ids:string[];focus?:string[];acceptance?:string[];retention?:'seven_days'|'none'; }
|
|
532
|
+
export interface SubagentFile { file_id:string;path:string;sha256:string;bytes:number;state:string;expires_at:string;part_bytes?:number; }
|
|
533
|
+
export interface SubagentJob { job_id:string;kind:SubagentTask['kind'];state:string;billing_state:string;cache_hit:boolean;reserved_points:number;charged_points:number;accrued_points:string;result_hash?:string;result?:Record<string,unknown>; }
|