@voltro/ai 0.75.0 → 0.76.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.
@@ -60,8 +60,8 @@ var u = [], d = (...e) => {
60
60
  }, v = (e, t) => {
61
61
  let n = i(e).image(t), r = (n) => i(g(e, {
62
62
  seed: n.seed,
63
- duration: void 0,
64
- fps: void 0
63
+ size: n.size,
64
+ aspectRatio: n.aspectRatio
65
65
  })).image(t).doGenerate(n);
66
66
  return new Proxy(n, { get: (e, t) => t === "doGenerate" ? r : _(e, t) });
67
67
  }, y = (e, t) => {
@@ -69,7 +69,9 @@ var u = [], d = (...e) => {
69
69
  let r = i(g(e, {
70
70
  seed: n.seed,
71
71
  duration: n.duration,
72
- fps: n.fps
72
+ fps: n.fps,
73
+ aspectRatio: n.aspectRatio,
74
+ resolution: n.resolution
73
75
  })).video(t);
74
76
  if (!r.doGenerate) throw Error("Gateway video does not implement doGenerate");
75
77
  return r.doGenerate(n);
@@ -77,7 +79,9 @@ var u = [], d = (...e) => {
77
79
  let r = i(g(e, {
78
80
  seed: n.seed,
79
81
  duration: n.duration,
80
- fps: n.fps
82
+ fps: n.fps,
83
+ aspectRatio: n.aspectRatio,
84
+ resolution: n.resolution
81
85
  })).video(t);
82
86
  if (!r.doStart) throw Error("Gateway video does not implement doStart");
83
87
  return r.doStart(n);
package/dist/test.js CHANGED
@@ -1,4 +1,4 @@
1
- import { t as e, u as t } from "./provider-Cts1BRhY.js";
1
+ import { t as e, u as t } from "./provider-BsyDya-H.js";
2
2
  //#region src/test/index.ts
3
3
  var n = (e) => e.turns && e.turns.length > 0 ? e.turns : e.stream && e.stream.length > 0 ? [{ text: e.stream.join("") }] : e.generate ? [{ text: e.generate.text }] : [{ text: "" }], r = (t) => {
4
4
  let r = new e(n(t));
@@ -556,7 +556,7 @@ declare interface ToolContext {
556
556
  readonly runtime?: Runtime.Runtime<unknown>;
557
557
  /** SDK tool-call identity for this execution, not a durable application idempotency key. */
558
558
  readonly invocationId?: string;
559
- /** The SDK's cancellation signal; Promise handlers must pass it to their I/O. */
559
+ /** Cancellation from either the caller's turn or SDK invocation; Promise handlers must pass it to their I/O. */
560
560
  readonly abortSignal?: AbortSignal;
561
561
  }
562
562
 
package/dist/workflow.js CHANGED
@@ -1,17 +1,17 @@
1
- import { r as e } from "./provider-Cts1BRhY.js";
2
- import { D as t, O as n, T as r, V as i, b as a, k as o, m as s, o as c, p as l, q as u, s as d, t as f, tt as p, y as m } from "./inferenceQueue-CdWTzRp7.js";
1
+ import { r as e } from "./provider-BsyDya-H.js";
2
+ import { D as t, O as n, T as r, V as i, b as a, k as o, m as s, o as c, p as l, q as u, rt as d, s as f, t as p, y as m } from "./inferenceQueue-t5ayqzjs.js";
3
3
  import { Effect as h, Schema as g } from "effect";
4
4
  import { eq as _ } from "@voltro/database";
5
- import { CurrentWorkflowExecutionId as v, awaitSignalSuspending as y, step as b, suspendForBudget as x } from "@voltro/workflow";
5
+ import { BudgetHoldExpired as v, CurrentWorkflowExecutionId as y, awaitSignalSuspending as b, step as x, suspendForBudget as S } from "@voltro/workflow";
6
6
  //#region src/inferStep.ts
7
- var S = {
7
+ var C = {
8
8
  maxAttempts: 4,
9
9
  strategy: "exponential",
10
10
  baseDelay: "1 second",
11
11
  maxDelay: "30 seconds",
12
12
  jitter: !0,
13
13
  respectRetryAfter: !0
14
- }, C = 36e5, w = "ai-usd", T = (e, t, n, r) => {
14
+ }, w = 36e5, T = "ai-usd", E = (e, t, n, r) => {
15
15
  let i = r === void 0 ? {} : {
16
16
  promptId: r.promptId,
17
17
  promptVersion: r.digest,
@@ -31,7 +31,7 @@ var S = {
31
31
  systemChars: t.length
32
32
  }
33
33
  };
34
- }, E = (e) => l(e.prompt) ? {
34
+ }, D = (e) => l(e.prompt) ? {
35
35
  text: e.prompt.prompt,
36
36
  system: e.system ?? e.prompt.system,
37
37
  rendered: e.prompt
@@ -39,13 +39,13 @@ var S = {
39
39
  text: e.prompt,
40
40
  system: e.system,
41
41
  rendered: void 0
42
- }, D = (e) => ({
42
+ }, O = (e) => ({
43
43
  provider: String(e.name),
44
44
  model: String(e.model ?? "unknown")
45
- }), O = (e, t, n, r, a) => {
45
+ }), k = (e, t, n, r, a) => {
46
46
  let o = e.store;
47
47
  if (o === void 0) return h.void;
48
- let { provider: s, model: c } = D(t), l = i(r.providerMetadata);
48
+ let { provider: s, model: c } = O(t), l = i(r.providerMetadata);
49
49
  return u(o, {
50
50
  provider: s,
51
51
  model: c,
@@ -56,52 +56,52 @@ var S = {
56
56
  ...l === void 0 ? {} : { actualCostUsd: l },
57
57
  ...a === void 0 ? {} : { prompt: a }
58
58
  });
59
- }, k = (e, t) => {
59
+ }, A = (e, t) => {
60
60
  let n = e.store;
61
61
  return n === void 0 || t === void 0 ? h.void : m(n, {
62
62
  ...t.definition,
63
63
  digest: t.digest
64
64
  }).pipe(h.asVoid, h.catchAllCause(() => h.void));
65
- }, A = g.Struct({
65
+ }, j = g.Struct({
66
66
  text: g.String,
67
67
  inputTokens: g.NullOr(g.Number),
68
68
  outputTokens: g.NullOr(g.Number),
69
69
  totalTokens: g.NullOr(g.Number)
70
- }), j = (e) => typeof e == "object" && !!e && e.__voltro_ai_error === !0, M = class extends Error {
70
+ }), M = (e) => typeof e == "object" && !!e && e.__voltro_ai_error === !0, N = class extends Error {
71
71
  attempts;
72
72
  outcome;
73
73
  constructor(e, t, n, r = "failed") {
74
74
  super(`aiStep('${e}'): the offloaded model call gave up after ${n} attempt(s): ${t}. The queued call is in _voltro_ai_inferences with status 'failed' — the Flow tab shows it with the provider's own message.`), this.name = "AiOffloadError", this.attempts = n, this.outcome = r;
75
75
  }
76
- }, N = class extends Error {
76
+ }, P = class extends Error {
77
77
  constructor(e) {
78
78
  super(`aiStep('${e}'): offload: true needs \`store\` — the queued call lives in a table and the dispatcher reads it from there. Pass ctx.store.`), this.name = "AiOffloadMisuseError";
79
79
  }
80
- }, P = (e, t, n, r, i, a, o) => h.gen(function* () {
80
+ }, F = (e, t, n, r, i, a, o) => h.gen(function* () {
81
81
  let s = e.store;
82
- if (s === void 0) return yield* h.die(new N(e.name));
83
- let l = yield* v;
82
+ if (s === void 0) return yield* h.die(new P(e.name));
83
+ let l = yield* y;
84
84
  if (l === void 0) return yield* h.die(/* @__PURE__ */ Error(`aiStep('${e.name}'): offload: true is only valid inside a workflow body — there is no execution to suspend here.`));
85
- let { provider: u, model: p } = D(t), m = d(l, e.name), g = yield* h.promise(() => s.query({
85
+ let { provider: u, model: d } = O(t), m = f(l, e.name), g = yield* h.promise(() => s.query({
86
86
  table: "_voltro_workflow_runs",
87
87
  predicate: _("executionId", l),
88
88
  order: [],
89
89
  take: 1,
90
90
  skip: void 0,
91
91
  projection: void 0
92
- })), y = String(g[0]?.tag ?? ""), b = g[0]?.id;
93
- return yield* h.promise(() => s.insertIgnore(f, {
92
+ })), v = String(g[0]?.tag ?? ""), b = g[0]?.id;
93
+ return yield* h.promise(() => s.insertIgnore(p, {
94
94
  id: m,
95
95
  tenantId: e.tenantId ?? null,
96
96
  executionId: l,
97
- workflowName: y,
97
+ workflowName: v,
98
98
  runId: typeof b == "string" ? b : null,
99
99
  signalName: c(m),
100
100
  stepName: e.name,
101
101
  status: "pending",
102
102
  kind: n,
103
103
  provider: u,
104
- model: p,
104
+ model: d,
105
105
  prompt: i.text,
106
106
  system: i.system ?? null,
107
107
  promptId: i.rendered?.promptId ?? null,
@@ -116,59 +116,59 @@ var S = {
116
116
  fence: 0,
117
117
  enqueuedAt: /* @__PURE__ */ new Date()
118
118
  }, { conflictColumns: ["id"] })), m;
119
- }), F = (e, t, n, r, i, a, o, s) => h.gen(function* () {
120
- let l = yield* b({
119
+ }), I = (e, t, n, r, i, a, o, s) => h.gen(function* () {
120
+ let l = yield* x({
121
121
  name: `${e.name}:enqueue`,
122
122
  success: g.String,
123
123
  input: i,
124
- execute: P(e, t, n, r, a, o, s)
124
+ execute: F(e, t, n, r, a, o, s)
125
125
  });
126
- yield* k(e, a.rendered);
127
- let u = yield* y({ store: e.store }, {
126
+ yield* A(e, a.rendered);
127
+ let u = yield* b({ store: e.store }, {
128
128
  name: c(l),
129
129
  schema: g.Unknown,
130
130
  timeoutMs: e.offloadTimeoutMs ?? 36e5
131
131
  });
132
- return j(u) ? yield* h.die(new M(e.name, u.message, u.attempts, u.outcome === "unknown" ? "unknown" : "failed")) : u;
133
- }), I = class extends Error {
132
+ return M(u) ? yield* h.die(new N(e.name, u.message, u.attempts, u.outcome === "unknown" ? "unknown" : "failed")) : u;
133
+ }), L = class extends Error {
134
134
  constructor(e) {
135
135
  super(`aiStep('${e}'): budget needs \`store\` — the reservation counter and the hold both live in tables. Pass ctx.store.`), this.name = "AiBudgetMisuseError";
136
136
  }
137
- }, L = (e) => h.gen(function* () {
137
+ }, R = (e) => h.gen(function* () {
138
138
  let t = e.budget;
139
139
  if (t === void 0) return;
140
140
  let n = e.store;
141
- if (n === void 0) return yield* h.die(new I(e.name));
142
- let r = e.tenantId ?? null, i = t.name ?? "ai-usd", a = yield* v, o = () => p(n, {
141
+ if (n === void 0) return yield* h.die(new L(e.name));
142
+ let r = e.tenantId ?? null, i = t.name ?? "ai-usd", a = yield* y, o = () => d(n, {
143
143
  tenantId: r,
144
144
  limitUsd: t.limitUsd,
145
145
  addUsd: 0,
146
146
  ...t.since === void 0 ? {} : { since: t.since }
147
- }).pipe(h.as(null), h.catchTag("AiBudgetExceeded", (e) => h.succeed(e))), s = () => t.estimateUsd === void 0 ? h.void : p(n, {
147
+ }).pipe(h.as(null), h.catchTag("AiBudgetExceeded", (e) => h.succeed(e))), s = () => t.estimateUsd === void 0 ? h.void : d(n, {
148
148
  tenantId: r,
149
149
  limitUsd: t.limitUsd,
150
150
  addUsd: t.estimateUsd,
151
- ...a === void 0 ? {} : { reservationId: d(a, JSON.stringify([
151
+ ...a === void 0 ? {} : { reservationId: f(a, JSON.stringify([
152
152
  "budget",
153
153
  i,
154
154
  e.name
155
155
  ])) },
156
156
  ...t.since === void 0 ? {} : { since: t.since }
157
- }).pipe(h.asVoid), c = yield* o();
158
- return c === null ? yield* s() : (t.onExceeded ?? "fail") !== "suspend" || a === void 0 ? yield* h.fail(c) : (yield* x({
157
+ }).pipe(h.asVoid), c = yield* t.estimateUsd !== void 0 && t.estimateUsd !== 0 ? s().pipe(h.as(null), h.catchTag("AiBudgetExceeded", (e) => h.succeed(e))) : o();
158
+ if (c !== null) return (t.onExceeded ?? "fail") !== "suspend" || a === void 0 ? yield* h.fail(c) : (yield* S({
159
159
  store: n,
160
160
  budget: i,
161
161
  tenantId: r,
162
162
  executionId: a,
163
- workflowName: yield* R(n, a),
163
+ workflowName: yield* z(n, a),
164
164
  stepName: e.name,
165
165
  spentMicroUsd: Math.round(c.spentUsd * 1e6),
166
166
  limitMicroUsd: Math.round(t.limitUsd * 1e6),
167
167
  hasHeadroom: o().pipe(h.map((e) => e === null)),
168
168
  ...t.holdTimeoutMs === void 0 ? {} : { timeoutMs: t.holdTimeoutMs },
169
169
  ...t.recheckEveryMs === void 0 ? {} : { recheckEveryMs: t.recheckEveryMs }
170
- }).pipe(h.catchAll((e) => h.die(e))), yield* s());
171
- }), R = (e, t) => h.promise(async () => {
170
+ }).pipe(h.catchAll((e) => e instanceof v ? h.die(e) : h.fail(e))), yield* s());
171
+ }), z = (e, t) => h.promise(async () => {
172
172
  let n = await e.query({
173
173
  table: "_voltro_workflow_runs",
174
174
  predicate: _("executionId", t),
@@ -178,18 +178,18 @@ var S = {
178
178
  projection: void 0
179
179
  });
180
180
  return String(n[0]?.tag ?? "");
181
- }), z = (t) => {
182
- let r = t.provider ?? e(), i = E(t), a = {
183
- ...D(r),
181
+ }), B = (t) => {
182
+ let r = t.provider ?? e(), i = D(t), a = {
183
+ ...O(r),
184
184
  operation: "generateText",
185
185
  offloaded: t.offload === !0,
186
- ...T(i.text, i.system, t.recordPrompt ?? "digest", i.rendered)
187
- }, o = (e) => t.budget === void 0 ? e : h.zipRight(L(t), e);
188
- return t.offload === !0 ? o(F(t, r, "text", null, a, i)) : o(b({
186
+ ...E(i.text, i.system, t.recordPrompt ?? "digest", i.rendered)
187
+ }, o = (e) => t.budget === void 0 ? e : h.zipRight(R(t), e);
188
+ return t.offload === !0 ? o(I(t, r, "text", null, a, i)) : o(x({
189
189
  name: t.name,
190
- success: A,
190
+ success: j,
191
191
  input: a,
192
- retry: t.retry ?? S,
192
+ retry: t.retry ?? C,
193
193
  execute: n({
194
194
  prompt: i.text,
195
195
  provider: r,
@@ -200,18 +200,18 @@ var S = {
200
200
  ...t.tools === void 0 ? {} : { tools: t.tools },
201
201
  ...t.maxSteps === void 0 ? {} : { maxSteps: t.maxSteps },
202
202
  ...t.toolContext === void 0 ? {} : { toolContext: t.toolContext }
203
- }).pipe(h.tap((e) => O(t, r, "generateText", e, i.rendered)), h.tap(() => k(t, i.rendered)), h.map((e) => ({
203
+ }).pipe(h.tap((e) => k(t, r, "generateText", e, i.rendered)), h.tap(() => A(t, i.rendered)), h.map((e) => ({
204
204
  text: e.text,
205
205
  inputTokens: e.usage.inputTokens ?? null,
206
206
  outputTokens: e.usage.outputTokens ?? null,
207
207
  totalTokens: e.usage.totalTokens ?? null
208
208
  })))
209
209
  }));
210
- }, B = g.Struct({
210
+ }, V = g.Struct({
211
211
  text: g.String,
212
212
  language: g.optional(g.String),
213
213
  durationSec: g.optional(g.Number)
214
- }), V = (t) => {
214
+ }), H = (t) => {
215
215
  let n = t.provider ?? e(), r = {
216
216
  source: t.source,
217
217
  ...t.language === void 0 ? {} : { language: t.language },
@@ -219,19 +219,19 @@ var S = {
219
219
  ...t.diarize === void 0 ? {} : { diarize: t.diarize },
220
220
  ...t.translateToEnglish === void 0 ? {} : { translateToEnglish: t.translateToEnglish }
221
221
  }, i = {
222
- ...D(n),
222
+ ...O(n),
223
223
  operation: "transcribe",
224
224
  offloaded: t.offload === !0
225
- }, o = (e) => t.budget === void 0 ? e : h.zipRight(L(t), e);
226
- return t.offload === !0 ? o(F(t, n, "transcription", null, i, {
225
+ }, o = (e) => t.budget === void 0 ? e : h.zipRight(R(t), e);
226
+ return t.offload === !0 ? o(I(t, n, "transcription", null, i, {
227
227
  text: "",
228
228
  system: void 0,
229
229
  rendered: void 0
230
- }, r)) : o(b({
230
+ }, r)) : o(x({
231
231
  name: t.name,
232
- success: B,
232
+ success: V,
233
233
  input: i,
234
- retry: t.retry ?? S,
234
+ retry: t.retry ?? C,
235
235
  execute: a({
236
236
  ...r,
237
237
  provider: n,
@@ -242,8 +242,8 @@ var S = {
242
242
  ...e.durationSec === void 0 ? {} : { durationSec: e.durationSec }
243
243
  })))
244
244
  }));
245
- }, H = (t) => {
246
- let n = t.provider ?? e(), r = E({
245
+ }, U = (t) => {
246
+ let n = t.provider ?? e(), r = D({
247
247
  ...t,
248
248
  prompt: t.prompt
249
249
  }), i = {
@@ -252,31 +252,31 @@ var S = {
252
252
  inputs: t.inputs ?? {},
253
253
  ...t.persist === void 0 ? {} : { persist: t.persist }
254
254
  }, a = {
255
- ...D(n),
255
+ ...O(n),
256
256
  operation: `generate${t.modality[0].toUpperCase()}${t.modality.slice(1)}`,
257
257
  offloaded: !0,
258
258
  modality: t.modality,
259
- ...T(r.text, void 0, t.recordPrompt ?? "digest", r.rendered)
259
+ ...E(r.text, void 0, t.recordPrompt ?? "digest", r.rendered)
260
260
  };
261
- return ((e) => t.budget === void 0 ? e : h.zipRight(L(t), e))(F({
261
+ return ((e) => t.budget === void 0 ? e : h.zipRight(R(t), e))(I({
262
262
  ...t,
263
263
  offload: !0
264
264
  }, n, "media", null, a, r, void 0, i));
265
- }, U = (n) => {
266
- let i = n.provider ?? e(), a = E(n), s = {
267
- ...D(i),
265
+ }, W = (n) => {
266
+ let i = n.provider ?? e(), a = D(n), s = {
267
+ ...O(i),
268
268
  operation: "generateObject",
269
269
  offloaded: n.offload === !0,
270
- ...T(a.text, a.system, n.recordPrompt ?? "digest", a.rendered)
271
- }, c = (e) => n.budget === void 0 ? e : h.zipRight(L(n), e);
270
+ ...E(a.text, a.system, n.recordPrompt ?? "digest", a.rendered)
271
+ }, c = (e) => n.budget === void 0 ? e : h.zipRight(R(n), e);
272
272
  return n.offload === !0 ? c(h.gen(function* () {
273
- let e = yield* o(n.schema, "aiObjectStep"), t = yield* F(n, i, "object", e, s, a);
273
+ let e = yield* o(n.schema, "aiObjectStep"), t = yield* I(n, i, "object", e, s, a);
274
274
  return yield* g.decodeUnknown(n.schema)(t);
275
- })) : c(b({
275
+ })) : c(x({
276
276
  name: n.name,
277
277
  success: n.schema,
278
278
  input: s,
279
- retry: n.retry ?? S,
279
+ retry: n.retry ?? C,
280
280
  execute: (n.tools === void 0 ? r({
281
281
  prompt: a.text,
282
282
  schema: n.schema,
@@ -296,8 +296,8 @@ var S = {
296
296
  ...n.fallbacks === void 0 ? {} : { fallbacks: n.fallbacks },
297
297
  ...n.maxTokens === void 0 ? {} : { maxTokens: n.maxTokens },
298
298
  ...n.providerOptions === void 0 ? {} : { providerOptions: n.providerOptions }
299
- })).pipe(h.tap((e) => O(n, i, "generateObject", e, a.rendered)), h.tap(() => k(n, a.rendered)), h.map((e) => e.object))
299
+ })).pipe(h.tap((e) => k(n, i, "generateObject", e, a.rendered)), h.tap(() => A(n, a.rendered)), h.map((e) => e.object))
300
300
  }));
301
301
  };
302
302
  //#endregion
303
- export { S as AI_STEP_RETRY, I as AiBudgetMisuseError, M as AiOffloadError, N as AiOffloadMisuseError, w as DEFAULT_AI_BUDGET_NAME, C as DEFAULT_OFFLOAD_TIMEOUT_MS, B as TranscriptionStepResult, U as aiObjectStep, z as aiStep, H as mediaStep, s as promptDigest, T as promptRecordFor, E as resolveStepPrompt, V as transcribeStep };
303
+ export { C as AI_STEP_RETRY, L as AiBudgetMisuseError, N as AiOffloadError, P as AiOffloadMisuseError, T as DEFAULT_AI_BUDGET_NAME, w as DEFAULT_OFFLOAD_TIMEOUT_MS, V as TranscriptionStepResult, W as aiObjectStep, B as aiStep, U as mediaStep, s as promptDigest, E as promptRecordFor, D as resolveStepPrompt, H as transcribeStep };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@voltro/ai",
3
- "version": "0.75.0",
3
+ "version": "0.76.0",
4
4
  "description": "Effect-native AI primitives — generateText / generateObject / streamText, tools, agents, media generation, cost tracking + budgets, and provider fallback.",
5
5
  "keywords": [
6
6
  "voltro",
@@ -53,20 +53,21 @@
53
53
  "node": ">=24.0.0"
54
54
  },
55
55
  "dependencies": {
56
- "@ai-sdk/anthropic": "^4.0.49",
57
- "@ai-sdk/openai": "^4.0.58",
58
- "@voltro/cache": "0.75.0",
59
- "@voltro/database": "0.75.0",
60
- "@voltro/protocol": "0.75.0",
61
- "@voltro/workflow": "0.75.0",
56
+ "@ai-sdk/anthropic": "^4.0.56",
57
+ "@ai-sdk/openai": "^4.0.69",
58
+ "@voltro/cache": "0.76.0",
59
+ "@voltro/database": "0.76.0",
60
+ "@voltro/protocol": "0.76.0",
61
+ "@voltro/workflow": "0.76.0",
62
62
  "ajv": "^8.20.0",
63
- "ajv-formats": "^3.0.1"
63
+ "ajv-formats": "^3.0.1",
64
+ "ws": "^8.21.3"
64
65
  },
65
66
  "peerDependencies": {
66
67
  "@ai-sdk/gateway": "^4.0.74",
67
68
  "@ai-sdk/provider": "^4.0.10",
68
69
  "ai": "^7.0.92",
69
- "effect": "^3.22.1"
70
+ "effect": "^3.22.2"
70
71
  },
71
72
  "publishConfig": {
72
73
  "access": "public"