corent-sdk 0.2.0 → 0.3.0

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.cts CHANGED
@@ -1,5 +1,5 @@
1
1
  /**
2
- * Corent TypeScript SDK — one API for AI image, video, and voice.
2
+ * Corent TypeScript SDK — one API for AI image, video, voice, and text.
3
3
  *
4
4
  * import { Corent } from "corent-sdk";
5
5
  * const client = new Corent("co_live_...");
@@ -16,6 +16,8 @@ interface GeneratedImage {
16
16
  /** MEASURED pixels of the delivered file — Corent parses the file, never echoes the request. */
17
17
  width?: number;
18
18
  height?: number;
19
+ /** The tier that served it ("image-premium"), or the model you pinned,
20
+ * always in its published spelling ("corent-flux-schnell"). */
19
21
  model?: string;
20
22
  costCents?: number;
21
23
  }
@@ -26,15 +28,90 @@ interface GeneratedVideo {
26
28
  height?: number;
27
29
  resolution?: string;
28
30
  durationS?: number;
31
+ /** The tier that served it ("video-premium"), or the model you pinned,
32
+ * always in its published spelling ("corent-seedance-2.0"). */
29
33
  model?: string;
30
34
  costCents?: number;
31
35
  }
32
36
  interface GeneratedSpeech {
33
37
  id: string;
34
38
  url: string;
39
+ /** The tier that served it ("corent-speech-tts"), or the model you pinned,
40
+ * always in its published spelling ("corent-eleven-multilingual-v2"). */
35
41
  model?: string;
36
42
  costCents?: number;
37
43
  }
44
+ /** One voice `speech.generate` accepts. Descriptors are neutral labels a
45
+ * picker can filter on; no supplier or model name is published. */
46
+ interface Voice {
47
+ voice_id: string;
48
+ name?: string;
49
+ preview_url?: string;
50
+ gender?: string;
51
+ age?: string;
52
+ accent?: string;
53
+ use_case?: string;
54
+ }
55
+ interface Balance {
56
+ balanceCents: number;
57
+ /** Reserved by generations still running. */
58
+ heldCents: number;
59
+ /** What a new request can actually spend: balance minus holds. */
60
+ availableCents: number;
61
+ }
62
+ /** One image in a batch. Batch items are tier-routed: to pin an exact model,
63
+ * use images.generate() one at a time. */
64
+ interface ImageBatchItem {
65
+ prompt: string;
66
+ tier?: Tier;
67
+ style?: string;
68
+ aspectRatio?: string;
69
+ }
70
+ interface VideoBatchItem {
71
+ prompt: string;
72
+ tier?: Tier;
73
+ style?: string;
74
+ aspectRatio?: string;
75
+ durationS?: number;
76
+ resolution?: "720p" | "1080p" | "4k";
77
+ }
78
+ /** The 202 from a batch submission: the batch id and one job id per item. */
79
+ interface SubmittedBatch {
80
+ batchId: string;
81
+ jobIds: string[];
82
+ }
83
+ interface BatchProgress {
84
+ batchId: string;
85
+ total: number;
86
+ completed: number;
87
+ failed: number;
88
+ pending: number;
89
+ jobs: {
90
+ id: string;
91
+ status: string;
92
+ }[];
93
+ }
94
+ /** OpenAI-shaped message, for callers driving a real conversation. */
95
+ interface ChatMessage {
96
+ role: "system" | "user" | "assistant" | "tool";
97
+ content?: unknown;
98
+ name?: string;
99
+ tool_call_id?: string;
100
+ tool_calls?: Record<string, unknown>[];
101
+ }
102
+ interface GeneratedText {
103
+ id: string;
104
+ text: string;
105
+ /** The tier that served it ("corent/text-premium"), or the model you pinned,
106
+ * always in its published spelling ("corent-claude-opus-5"). */
107
+ model?: string;
108
+ finishReason?: string;
109
+ /** Present when the model answered with tool calls instead of prose. */
110
+ toolCalls?: Record<string, unknown>[];
111
+ promptTokens?: number;
112
+ completionTokens?: number;
113
+ costCents?: number;
114
+ }
38
115
  interface Job {
39
116
  id: string;
40
117
  status: "processing" | "completed" | "failed";
@@ -67,17 +144,34 @@ declare class Corent {
67
144
  readonly images: Images;
68
145
  readonly videos: Videos;
69
146
  readonly speech: Speech;
147
+ readonly text: Text;
70
148
  readonly jobs: Jobs;
149
+ readonly batches: Batches;
71
150
  constructor(apiKey: string, options?: ClientOptions);
72
- /** Prepaid balance in cents. */
151
+ /** Prepaid balance in cents. See `balance()` for what is actually spendable. */
73
152
  balanceCents(): Promise<number>;
153
+ /** The full picture: the total, what running generations have reserved, and
154
+ * what a new request can actually spend. availableCents is the number a 402
155
+ * is decided against — check that one before an expensive batch. */
156
+ balance(): Promise<Balance>;
157
+ /** The voices `speech.generate` will accept as voiceId. This exists
158
+ * because the API requires a voice id and, until 2026-08-30, published no
159
+ * list of legal values. */
160
+ voices(): Promise<Voice[]>;
161
+ /** What this account has spent, by lane and over time. */
162
+ usage(): Promise<Record<string, unknown>>;
163
+ /** Live operational status of the generation tiers. Public. */
164
+ status(): Promise<Record<string, unknown>>;
74
165
  /** The live tier catalog with honest min–max price ranges. Public. */
75
166
  tiers(): Promise<Record<string, unknown>[]>;
76
167
  /** The direct-access menu: every model you can pin by name, with its kind,
77
- * quality score and flat cost-plus price. Public. */
168
+ * quality score and live status. Names come back in their published
169
+ * spelling ("corent-flux-schnell") and can be passed straight back as
170
+ * `model`. Carries no price -- billing is flat cost-plus and the exact
171
+ * charge comes back on each generation. Public. */
78
172
  models(): Promise<Record<string, unknown>[]>;
79
173
  /** @internal */
80
- request(method: string, path: string, body?: Record<string, unknown>, idempotent?: boolean): Promise<Record<string, any>>;
174
+ request(method: string, path: string, body?: Record<string, unknown>, idempotent?: boolean, retryTransport?: boolean, idempotencyKey?: string): Promise<Record<string, any>>;
81
175
  /** @internal */
82
176
  waitForJob(jobId: string, timeoutMs: number): Promise<Record<string, any>>;
83
177
  }
@@ -89,15 +183,63 @@ declare class Images {
89
183
  *
90
184
  * `model` pins an exact model from client.models() instead of letting the
91
185
  * router choose — direct access: never substituted, flat cost-plus price.
92
- * Pass tier OR model, not both. */
186
+ * e.g. model: "corent-flux-schnell". Pass tier OR model, not both. */
93
187
  generate(prompt: string, options?: {
94
188
  tier?: Tier;
95
189
  model?: string;
96
190
  style?: string;
97
191
  aspectRatio?: string;
192
+ /** 1–4 public https image URLs that keep a character, face, or product
193
+ * consistent across generations: the prompt is applied as an EDIT of
194
+ * these references. Served only by edit-capable models, which sit at
195
+ * premium and up — pass tier "premium" | "pro" | "max_pro" (or no tier
196
+ * at all), never "air" or "lite". Omit for plain text-to-image. */
197
+ referenceImageUrls?: string[];
198
+ /** Reproducibility. The same seed, prompt and model give the same
199
+ * image, so you can render it again and change one thing. The seed that
200
+ * was actually used comes back on the result. */
201
+ seed?: number;
202
+ /** What must NOT appear, e.g. "text, watermark". */
203
+ negativePrompt?: string;
204
+ /** Image-to-image: start from this picture instead of from noise.
205
+ * Different from referenceImageUrls, which pins an identity. */
206
+ sourceImageUrl?: string;
207
+ /** How far the render may travel from sourceImageUrl. 0 keeps it, 1 ignores it. */
208
+ strength?: number;
209
+ /** Delivered file type: png | jpeg | webp. png is the one with transparency. */
210
+ outputFormat?: "png" | "jpeg" | "webp";
211
+ /** Transparent background, for logos and cutouts. Forces png. */
212
+ transparent?: boolean;
213
+ /** Explicit pixel size. Pass both or neither. */
214
+ width?: number;
215
+ height?: number;
216
+ /** Corent rewrites your prompt before dispatch to get a better render.
217
+ * Set false to send it exactly as typed. */
218
+ enhancePrompt?: boolean;
219
+ /** Deliver the finished job to your own https endpoint instead of
220
+ * polling. Returns the Job immediately when set. */
221
+ webhookUrl?: string;
222
+ /** Signs each delivery: X-Corent-Signature: t=<unix>,v1=HMAC-SHA256. */
223
+ webhookSecret?: string;
224
+ /** Your own idempotency key, so a retry from another process or after a
225
+ * restart replays the original job instead of generating again. */
226
+ idempotencyKey?: string;
98
227
  wait?: false | true;
99
228
  timeoutMs?: number;
100
229
  }): Promise<GeneratedImage | Job>;
230
+ /** Render several versions of one prompt in a single call, 2–10.
231
+ *
232
+ * Each one is a real render at the normal price, so asking for four costs
233
+ * four images. They come back together, and `totalCostCents` is the whole
234
+ * charge. Partial success is a real outcome: if three of four land you get
235
+ * three and are billed for three.
236
+ *
237
+ * Different from client.batches.images(), which runs DIFFERENT prompts and
238
+ * returns job ids to poll. This one runs the SAME prompt and waits. */
239
+ generateMany(prompt: string, count: number, options?: Omit<Parameters<Images["generate"]>[1], "wait">): Promise<{
240
+ images: GeneratedImage[];
241
+ totalCostCents?: number;
242
+ }>;
101
243
  }
102
244
  declare class Videos {
103
245
  private c;
@@ -108,14 +250,38 @@ declare class Videos {
108
250
  *
109
251
  * `model` pins an exact model from client.models() — direct access, never
110
252
  * substituted, and duration/resolution snap to THAT model's own menu rather
111
- * than a tier cap. Pass tier OR model, not both. */
253
+ * than a tier cap. e.g. model: "corent-seedance-2.0". Pass tier OR model,
254
+ * not both. */
112
255
  generate(prompt: string, options?: {
113
256
  tier?: Tier;
114
257
  model?: string;
258
+ style?: string;
115
259
  aspectRatio?: string;
116
260
  durationS?: number;
117
261
  resolution?: "720p" | "1080p" | "4k";
118
262
  imageUrl?: string;
263
+ /** Ask for native sound. Some models render audio and some are
264
+ * silent. true routes only to models that deliver sound, so a silent
265
+ * model can never quietly serve the request; false prefers a silent
266
+ * one; omit to let routing choose. */
267
+ audio?: boolean;
268
+ /** The frame the clip should END on. With imageUrl this is the
269
+ * go-from-A-to-B effect. */
270
+ endImageUrl?: string;
271
+ /** Camera move: static | pan_left | pan_right | zoom_in | zoom_out |
272
+ * orbit_left | orbit_right | tilt_up | tilt_down. */
273
+ camera?: string;
274
+ /** What must NOT appear in the clip. */
275
+ negativePrompt?: string;
276
+ seed?: number;
277
+ fps?: number;
278
+ /** Set false to send your prompt exactly as typed. */
279
+ enhancePrompt?: boolean;
280
+ /** Deliver the finished clip to your own https endpoint instead of
281
+ * polling. Recommended for video, which takes 1–5 minutes. */
282
+ webhookUrl?: string;
283
+ webhookSecret?: string;
284
+ idempotencyKey?: string;
119
285
  wait?: false | true;
120
286
  timeoutMs?: number;
121
287
  }): Promise<GeneratedVideo | Job>;
@@ -124,17 +290,91 @@ declare class Speech {
124
290
  private c;
125
291
  constructor(c: Corent);
126
292
  /** Text to speech; synchronous, returns the finished audio and exact charge.
127
- * `model` pins an exact speech model from client.models(). */
293
+ * `model` pins an exact speech model from client.models(),
294
+ * e.g. model: "corent-eleven-multilingual-v2". */
128
295
  generate(text: string, options?: {
129
296
  voiceId?: string;
130
297
  model?: string;
298
+ /** 0–1. Low is more expressive and more variable; high is steadier. */
299
+ stability?: number;
300
+ /** 0–1. How closely to hold the original voice's character. */
301
+ similarity?: number;
302
+ /** 0–1. Extra expressiveness. */
303
+ style?: number;
304
+ /** Playback speed; 1.0 is natural pace. */
305
+ speed?: number;
306
+ /** ISO code for the multilingual models, e.g. "en" or "pt-BR". */
307
+ language?: string;
308
+ /** "mp3" | "wav" | "pcm", or an exact "mp3_44100_128". */
309
+ outputFormat?: string;
310
+ idempotencyKey?: string;
131
311
  }): Promise<GeneratedSpeech>;
132
312
  }
313
+ interface TextOptions {
314
+ tier?: Tier;
315
+ model?: string;
316
+ maxTokens?: number;
317
+ /** OpenAI's newer alias; honoured by the API when maxTokens is absent. */
318
+ maxCompletionTokens?: number;
319
+ temperature?: number;
320
+ tools?: Record<string, unknown>[];
321
+ /** "auto" | "none" | "required" | { type: "function", function: { name } } */
322
+ toolChoice?: unknown;
323
+ responseFormat?: Record<string, unknown>;
324
+ }
325
+ declare class Text {
326
+ private c;
327
+ constructor(c: Corent);
328
+ /** One prompt in, the finished text out. `system` frames the request.
329
+ *
330
+ * `model` pins an exact text model from client.models() (kind "text"),
331
+ * e.g. model: "corent-claude-opus-5"; otherwise `tier` picks the routed
332
+ * lane. Pass tier OR model, not both. */
333
+ generate(prompt: string, options?: TextOptions & {
334
+ system?: string;
335
+ }): Promise<GeneratedText>;
336
+ /** A full OpenAI-shaped conversation, including tool results. Streaming is
337
+ * not wrapped here — point any OpenAI client at https://api.corent.tech/v1
338
+ * with your Corent key for that. */
339
+ chat(messages: ChatMessage[], options?: TextOptions): Promise<GeneratedText>;
340
+ }
341
+ /** Up to 50 renders in one call. Every item bills at the normal rate, so a
342
+ * 30-item image batch costs 30 generations — check client.balance() first.
343
+ * Asynchronous: submit returns immediately, then poll progress() or give the
344
+ * server a webhookUrl and let it deliver each item. */
345
+ declare class Batches {
346
+ private c;
347
+ constructor(c: Corent);
348
+ images(items: ImageBatchItem[], options?: {
349
+ webhookUrl?: string;
350
+ webhookSecret?: string;
351
+ idempotencyKey?: string;
352
+ }): Promise<SubmittedBatch>;
353
+ videos(items: VideoBatchItem[], options?: {
354
+ webhookUrl?: string;
355
+ webhookSecret?: string;
356
+ idempotencyKey?: string;
357
+ }): Promise<SubmittedBatch>;
358
+ /** How far along a submitted batch is, and each item's job id. Fetch a
359
+ * finished item's media with client.jobs.get(). */
360
+ progress(batchId: string): Promise<BatchProgress>;
361
+ private submit;
362
+ }
133
363
  declare class Jobs {
134
364
  private c;
135
365
  constructor(c: Corent);
136
366
  get(jobId: string): Promise<Job>;
367
+ /** Stop a job that has not finished and release its money hold.
368
+ *
369
+ * Charges nothing. A job that completed just before the cancel landed stays
370
+ * completed and stays billed for what was really delivered — `cancelled`
371
+ * says which happened. */
372
+ cancel(jobId: string): Promise<{
373
+ id: string;
374
+ status: string;
375
+ cancelled: boolean;
376
+ }>;
137
377
  wait(jobId: string, timeoutMs?: number): Promise<Job>;
138
378
  }
139
379
 
140
- export { Corent, CorentError, type GeneratedImage, type GeneratedSpeech, type GeneratedVideo, GenerationFailedError, InsufficientBalanceError, InvalidRequestError, type Job, RateLimitedError, type Tier };
380
+ export { type Balance, type BatchProgress, type ChatMessage, Corent, CorentError, type GeneratedImage, type GeneratedSpeech, type GeneratedText, type GeneratedVideo, GenerationFailedError, type ImageBatchItem, InsufficientBalanceError, InvalidRequestError, type Job, RateLimitedError, type SubmittedBatch, type Tier, type VideoBatchItem, type Voice };
package/dist/index.d.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  /**
2
- * Corent TypeScript SDK — one API for AI image, video, and voice.
2
+ * Corent TypeScript SDK — one API for AI image, video, voice, and text.
3
3
  *
4
4
  * import { Corent } from "corent-sdk";
5
5
  * const client = new Corent("co_live_...");
@@ -16,6 +16,8 @@ interface GeneratedImage {
16
16
  /** MEASURED pixels of the delivered file — Corent parses the file, never echoes the request. */
17
17
  width?: number;
18
18
  height?: number;
19
+ /** The tier that served it ("image-premium"), or the model you pinned,
20
+ * always in its published spelling ("corent-flux-schnell"). */
19
21
  model?: string;
20
22
  costCents?: number;
21
23
  }
@@ -26,15 +28,90 @@ interface GeneratedVideo {
26
28
  height?: number;
27
29
  resolution?: string;
28
30
  durationS?: number;
31
+ /** The tier that served it ("video-premium"), or the model you pinned,
32
+ * always in its published spelling ("corent-seedance-2.0"). */
29
33
  model?: string;
30
34
  costCents?: number;
31
35
  }
32
36
  interface GeneratedSpeech {
33
37
  id: string;
34
38
  url: string;
39
+ /** The tier that served it ("corent-speech-tts"), or the model you pinned,
40
+ * always in its published spelling ("corent-eleven-multilingual-v2"). */
35
41
  model?: string;
36
42
  costCents?: number;
37
43
  }
44
+ /** One voice `speech.generate` accepts. Descriptors are neutral labels a
45
+ * picker can filter on; no supplier or model name is published. */
46
+ interface Voice {
47
+ voice_id: string;
48
+ name?: string;
49
+ preview_url?: string;
50
+ gender?: string;
51
+ age?: string;
52
+ accent?: string;
53
+ use_case?: string;
54
+ }
55
+ interface Balance {
56
+ balanceCents: number;
57
+ /** Reserved by generations still running. */
58
+ heldCents: number;
59
+ /** What a new request can actually spend: balance minus holds. */
60
+ availableCents: number;
61
+ }
62
+ /** One image in a batch. Batch items are tier-routed: to pin an exact model,
63
+ * use images.generate() one at a time. */
64
+ interface ImageBatchItem {
65
+ prompt: string;
66
+ tier?: Tier;
67
+ style?: string;
68
+ aspectRatio?: string;
69
+ }
70
+ interface VideoBatchItem {
71
+ prompt: string;
72
+ tier?: Tier;
73
+ style?: string;
74
+ aspectRatio?: string;
75
+ durationS?: number;
76
+ resolution?: "720p" | "1080p" | "4k";
77
+ }
78
+ /** The 202 from a batch submission: the batch id and one job id per item. */
79
+ interface SubmittedBatch {
80
+ batchId: string;
81
+ jobIds: string[];
82
+ }
83
+ interface BatchProgress {
84
+ batchId: string;
85
+ total: number;
86
+ completed: number;
87
+ failed: number;
88
+ pending: number;
89
+ jobs: {
90
+ id: string;
91
+ status: string;
92
+ }[];
93
+ }
94
+ /** OpenAI-shaped message, for callers driving a real conversation. */
95
+ interface ChatMessage {
96
+ role: "system" | "user" | "assistant" | "tool";
97
+ content?: unknown;
98
+ name?: string;
99
+ tool_call_id?: string;
100
+ tool_calls?: Record<string, unknown>[];
101
+ }
102
+ interface GeneratedText {
103
+ id: string;
104
+ text: string;
105
+ /** The tier that served it ("corent/text-premium"), or the model you pinned,
106
+ * always in its published spelling ("corent-claude-opus-5"). */
107
+ model?: string;
108
+ finishReason?: string;
109
+ /** Present when the model answered with tool calls instead of prose. */
110
+ toolCalls?: Record<string, unknown>[];
111
+ promptTokens?: number;
112
+ completionTokens?: number;
113
+ costCents?: number;
114
+ }
38
115
  interface Job {
39
116
  id: string;
40
117
  status: "processing" | "completed" | "failed";
@@ -67,17 +144,34 @@ declare class Corent {
67
144
  readonly images: Images;
68
145
  readonly videos: Videos;
69
146
  readonly speech: Speech;
147
+ readonly text: Text;
70
148
  readonly jobs: Jobs;
149
+ readonly batches: Batches;
71
150
  constructor(apiKey: string, options?: ClientOptions);
72
- /** Prepaid balance in cents. */
151
+ /** Prepaid balance in cents. See `balance()` for what is actually spendable. */
73
152
  balanceCents(): Promise<number>;
153
+ /** The full picture: the total, what running generations have reserved, and
154
+ * what a new request can actually spend. availableCents is the number a 402
155
+ * is decided against — check that one before an expensive batch. */
156
+ balance(): Promise<Balance>;
157
+ /** The voices `speech.generate` will accept as voiceId. This exists
158
+ * because the API requires a voice id and, until 2026-08-30, published no
159
+ * list of legal values. */
160
+ voices(): Promise<Voice[]>;
161
+ /** What this account has spent, by lane and over time. */
162
+ usage(): Promise<Record<string, unknown>>;
163
+ /** Live operational status of the generation tiers. Public. */
164
+ status(): Promise<Record<string, unknown>>;
74
165
  /** The live tier catalog with honest min–max price ranges. Public. */
75
166
  tiers(): Promise<Record<string, unknown>[]>;
76
167
  /** The direct-access menu: every model you can pin by name, with its kind,
77
- * quality score and flat cost-plus price. Public. */
168
+ * quality score and live status. Names come back in their published
169
+ * spelling ("corent-flux-schnell") and can be passed straight back as
170
+ * `model`. Carries no price -- billing is flat cost-plus and the exact
171
+ * charge comes back on each generation. Public. */
78
172
  models(): Promise<Record<string, unknown>[]>;
79
173
  /** @internal */
80
- request(method: string, path: string, body?: Record<string, unknown>, idempotent?: boolean): Promise<Record<string, any>>;
174
+ request(method: string, path: string, body?: Record<string, unknown>, idempotent?: boolean, retryTransport?: boolean, idempotencyKey?: string): Promise<Record<string, any>>;
81
175
  /** @internal */
82
176
  waitForJob(jobId: string, timeoutMs: number): Promise<Record<string, any>>;
83
177
  }
@@ -89,15 +183,63 @@ declare class Images {
89
183
  *
90
184
  * `model` pins an exact model from client.models() instead of letting the
91
185
  * router choose — direct access: never substituted, flat cost-plus price.
92
- * Pass tier OR model, not both. */
186
+ * e.g. model: "corent-flux-schnell". Pass tier OR model, not both. */
93
187
  generate(prompt: string, options?: {
94
188
  tier?: Tier;
95
189
  model?: string;
96
190
  style?: string;
97
191
  aspectRatio?: string;
192
+ /** 1–4 public https image URLs that keep a character, face, or product
193
+ * consistent across generations: the prompt is applied as an EDIT of
194
+ * these references. Served only by edit-capable models, which sit at
195
+ * premium and up — pass tier "premium" | "pro" | "max_pro" (or no tier
196
+ * at all), never "air" or "lite". Omit for plain text-to-image. */
197
+ referenceImageUrls?: string[];
198
+ /** Reproducibility. The same seed, prompt and model give the same
199
+ * image, so you can render it again and change one thing. The seed that
200
+ * was actually used comes back on the result. */
201
+ seed?: number;
202
+ /** What must NOT appear, e.g. "text, watermark". */
203
+ negativePrompt?: string;
204
+ /** Image-to-image: start from this picture instead of from noise.
205
+ * Different from referenceImageUrls, which pins an identity. */
206
+ sourceImageUrl?: string;
207
+ /** How far the render may travel from sourceImageUrl. 0 keeps it, 1 ignores it. */
208
+ strength?: number;
209
+ /** Delivered file type: png | jpeg | webp. png is the one with transparency. */
210
+ outputFormat?: "png" | "jpeg" | "webp";
211
+ /** Transparent background, for logos and cutouts. Forces png. */
212
+ transparent?: boolean;
213
+ /** Explicit pixel size. Pass both or neither. */
214
+ width?: number;
215
+ height?: number;
216
+ /** Corent rewrites your prompt before dispatch to get a better render.
217
+ * Set false to send it exactly as typed. */
218
+ enhancePrompt?: boolean;
219
+ /** Deliver the finished job to your own https endpoint instead of
220
+ * polling. Returns the Job immediately when set. */
221
+ webhookUrl?: string;
222
+ /** Signs each delivery: X-Corent-Signature: t=<unix>,v1=HMAC-SHA256. */
223
+ webhookSecret?: string;
224
+ /** Your own idempotency key, so a retry from another process or after a
225
+ * restart replays the original job instead of generating again. */
226
+ idempotencyKey?: string;
98
227
  wait?: false | true;
99
228
  timeoutMs?: number;
100
229
  }): Promise<GeneratedImage | Job>;
230
+ /** Render several versions of one prompt in a single call, 2–10.
231
+ *
232
+ * Each one is a real render at the normal price, so asking for four costs
233
+ * four images. They come back together, and `totalCostCents` is the whole
234
+ * charge. Partial success is a real outcome: if three of four land you get
235
+ * three and are billed for three.
236
+ *
237
+ * Different from client.batches.images(), which runs DIFFERENT prompts and
238
+ * returns job ids to poll. This one runs the SAME prompt and waits. */
239
+ generateMany(prompt: string, count: number, options?: Omit<Parameters<Images["generate"]>[1], "wait">): Promise<{
240
+ images: GeneratedImage[];
241
+ totalCostCents?: number;
242
+ }>;
101
243
  }
102
244
  declare class Videos {
103
245
  private c;
@@ -108,14 +250,38 @@ declare class Videos {
108
250
  *
109
251
  * `model` pins an exact model from client.models() — direct access, never
110
252
  * substituted, and duration/resolution snap to THAT model's own menu rather
111
- * than a tier cap. Pass tier OR model, not both. */
253
+ * than a tier cap. e.g. model: "corent-seedance-2.0". Pass tier OR model,
254
+ * not both. */
112
255
  generate(prompt: string, options?: {
113
256
  tier?: Tier;
114
257
  model?: string;
258
+ style?: string;
115
259
  aspectRatio?: string;
116
260
  durationS?: number;
117
261
  resolution?: "720p" | "1080p" | "4k";
118
262
  imageUrl?: string;
263
+ /** Ask for native sound. Some models render audio and some are
264
+ * silent. true routes only to models that deliver sound, so a silent
265
+ * model can never quietly serve the request; false prefers a silent
266
+ * one; omit to let routing choose. */
267
+ audio?: boolean;
268
+ /** The frame the clip should END on. With imageUrl this is the
269
+ * go-from-A-to-B effect. */
270
+ endImageUrl?: string;
271
+ /** Camera move: static | pan_left | pan_right | zoom_in | zoom_out |
272
+ * orbit_left | orbit_right | tilt_up | tilt_down. */
273
+ camera?: string;
274
+ /** What must NOT appear in the clip. */
275
+ negativePrompt?: string;
276
+ seed?: number;
277
+ fps?: number;
278
+ /** Set false to send your prompt exactly as typed. */
279
+ enhancePrompt?: boolean;
280
+ /** Deliver the finished clip to your own https endpoint instead of
281
+ * polling. Recommended for video, which takes 1–5 minutes. */
282
+ webhookUrl?: string;
283
+ webhookSecret?: string;
284
+ idempotencyKey?: string;
119
285
  wait?: false | true;
120
286
  timeoutMs?: number;
121
287
  }): Promise<GeneratedVideo | Job>;
@@ -124,17 +290,91 @@ declare class Speech {
124
290
  private c;
125
291
  constructor(c: Corent);
126
292
  /** Text to speech; synchronous, returns the finished audio and exact charge.
127
- * `model` pins an exact speech model from client.models(). */
293
+ * `model` pins an exact speech model from client.models(),
294
+ * e.g. model: "corent-eleven-multilingual-v2". */
128
295
  generate(text: string, options?: {
129
296
  voiceId?: string;
130
297
  model?: string;
298
+ /** 0–1. Low is more expressive and more variable; high is steadier. */
299
+ stability?: number;
300
+ /** 0–1. How closely to hold the original voice's character. */
301
+ similarity?: number;
302
+ /** 0–1. Extra expressiveness. */
303
+ style?: number;
304
+ /** Playback speed; 1.0 is natural pace. */
305
+ speed?: number;
306
+ /** ISO code for the multilingual models, e.g. "en" or "pt-BR". */
307
+ language?: string;
308
+ /** "mp3" | "wav" | "pcm", or an exact "mp3_44100_128". */
309
+ outputFormat?: string;
310
+ idempotencyKey?: string;
131
311
  }): Promise<GeneratedSpeech>;
132
312
  }
313
+ interface TextOptions {
314
+ tier?: Tier;
315
+ model?: string;
316
+ maxTokens?: number;
317
+ /** OpenAI's newer alias; honoured by the API when maxTokens is absent. */
318
+ maxCompletionTokens?: number;
319
+ temperature?: number;
320
+ tools?: Record<string, unknown>[];
321
+ /** "auto" | "none" | "required" | { type: "function", function: { name } } */
322
+ toolChoice?: unknown;
323
+ responseFormat?: Record<string, unknown>;
324
+ }
325
+ declare class Text {
326
+ private c;
327
+ constructor(c: Corent);
328
+ /** One prompt in, the finished text out. `system` frames the request.
329
+ *
330
+ * `model` pins an exact text model from client.models() (kind "text"),
331
+ * e.g. model: "corent-claude-opus-5"; otherwise `tier` picks the routed
332
+ * lane. Pass tier OR model, not both. */
333
+ generate(prompt: string, options?: TextOptions & {
334
+ system?: string;
335
+ }): Promise<GeneratedText>;
336
+ /** A full OpenAI-shaped conversation, including tool results. Streaming is
337
+ * not wrapped here — point any OpenAI client at https://api.corent.tech/v1
338
+ * with your Corent key for that. */
339
+ chat(messages: ChatMessage[], options?: TextOptions): Promise<GeneratedText>;
340
+ }
341
+ /** Up to 50 renders in one call. Every item bills at the normal rate, so a
342
+ * 30-item image batch costs 30 generations — check client.balance() first.
343
+ * Asynchronous: submit returns immediately, then poll progress() or give the
344
+ * server a webhookUrl and let it deliver each item. */
345
+ declare class Batches {
346
+ private c;
347
+ constructor(c: Corent);
348
+ images(items: ImageBatchItem[], options?: {
349
+ webhookUrl?: string;
350
+ webhookSecret?: string;
351
+ idempotencyKey?: string;
352
+ }): Promise<SubmittedBatch>;
353
+ videos(items: VideoBatchItem[], options?: {
354
+ webhookUrl?: string;
355
+ webhookSecret?: string;
356
+ idempotencyKey?: string;
357
+ }): Promise<SubmittedBatch>;
358
+ /** How far along a submitted batch is, and each item's job id. Fetch a
359
+ * finished item's media with client.jobs.get(). */
360
+ progress(batchId: string): Promise<BatchProgress>;
361
+ private submit;
362
+ }
133
363
  declare class Jobs {
134
364
  private c;
135
365
  constructor(c: Corent);
136
366
  get(jobId: string): Promise<Job>;
367
+ /** Stop a job that has not finished and release its money hold.
368
+ *
369
+ * Charges nothing. A job that completed just before the cancel landed stays
370
+ * completed and stays billed for what was really delivered — `cancelled`
371
+ * says which happened. */
372
+ cancel(jobId: string): Promise<{
373
+ id: string;
374
+ status: string;
375
+ cancelled: boolean;
376
+ }>;
137
377
  wait(jobId: string, timeoutMs?: number): Promise<Job>;
138
378
  }
139
379
 
140
- export { Corent, CorentError, type GeneratedImage, type GeneratedSpeech, type GeneratedVideo, GenerationFailedError, InsufficientBalanceError, InvalidRequestError, type Job, RateLimitedError, type Tier };
380
+ export { type Balance, type BatchProgress, type ChatMessage, Corent, CorentError, type GeneratedImage, type GeneratedSpeech, type GeneratedText, type GeneratedVideo, GenerationFailedError, type ImageBatchItem, InsufficientBalanceError, InvalidRequestError, type Job, RateLimitedError, type SubmittedBatch, type Tier, type VideoBatchItem, type Voice };