@voltro/ai 0.70.0 → 0.71.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.
@@ -30,7 +30,45 @@ var u = [], d = (...e) => {
30
30
  model: n.modelId
31
31
  }), e())
32
32
  };
33
- }, g = {
33
+ }, g = (e, t) => ({
34
+ ...e,
35
+ fetch: async (n, r) => {
36
+ let i = e.fetch ?? globalThis.fetch;
37
+ if (t === void 0) return i(n, r);
38
+ if (r?.method !== "POST" || typeof r.body != "string") throw Error("Gateway media: expected a JSON POST to preserve the requested seed");
39
+ let a;
40
+ try {
41
+ a = JSON.parse(r.body);
42
+ } catch {
43
+ throw Error("Gateway media: expected a JSON object to preserve the requested seed");
44
+ }
45
+ if (typeof a != "object" || !a || Array.isArray(a)) throw Error("Gateway media: expected a JSON object to preserve the requested seed");
46
+ return i(n, {
47
+ ...r,
48
+ body: JSON.stringify({
49
+ ...a,
50
+ seed: t
51
+ })
52
+ });
53
+ }
54
+ }), _ = (e, t) => {
55
+ let n = Reflect.get(e, t, e);
56
+ return typeof n == "function" && t !== "constructor" ? n.bind(e) : n;
57
+ }, v = (e, t) => {
58
+ let n = i(e).image(t), r = (n) => i(g(e, n.seed)).image(t).doGenerate(n);
59
+ return new Proxy(n, { get: (e, t) => t === "doGenerate" ? r : _(e, t) });
60
+ }, y = (e, t) => {
61
+ let n = i(e).video(t), r = n.doGenerate === void 0 ? void 0 : (n) => {
62
+ let r = i(g(e, n.seed)).video(t);
63
+ if (!r.doGenerate) throw Error("Gateway video does not implement doGenerate");
64
+ return r.doGenerate(n);
65
+ }, a = n.doStart === void 0 ? void 0 : (n) => {
66
+ let r = i(g(e, n.seed)).video(t);
67
+ if (!r.doStart) throw Error("Gateway video does not implement doStart");
68
+ return r.doStart(n);
69
+ };
70
+ return new Proxy(n, { get: (e, t) => t === "doGenerate" ? r : t === "doStart" ? a : _(e, t) });
71
+ }, b = {
34
72
  inputTokens: {
35
73
  total: 0,
36
74
  noCache: 0,
@@ -42,10 +80,10 @@ var u = [], d = (...e) => {
42
80
  text: 0,
43
81
  reasoning: 0
44
82
  }
45
- }, _ = (e) => ({
83
+ }, x = (e) => ({
46
84
  unified: e,
47
85
  raw: void 0
48
- }), v = class {
86
+ }), S = class {
49
87
  turns;
50
88
  cursor = 0;
51
89
  calls = [];
@@ -65,12 +103,12 @@ var u = [], d = (...e) => {
65
103
  reset() {
66
104
  this.cursor = 0, this.calls.length = 0;
67
105
  }
68
- }, y = (e) => (e.toolCalls ?? []).map((e, t) => ({
106
+ }, C = (e) => (e.toolCalls ?? []).map((e, t) => ({
69
107
  type: "tool-call",
70
108
  toolCallId: `mock_tool_${t}`,
71
109
  toolName: e.name,
72
110
  input: JSON.stringify(e.input ?? {})
73
- })), b = (e) => (e.sources ?? []).map((e, t) => e.sourceType === "document" ? {
111
+ })), w = (e) => (e.sources ?? []).map((e, t) => e.sourceType === "document" ? {
74
112
  type: "source",
75
113
  sourceType: "document",
76
114
  id: e.id ?? `mock_src_${t}`,
@@ -83,14 +121,14 @@ var u = [], d = (...e) => {
83
121
  id: e.id ?? `mock_src_${t}`,
84
122
  url: e.url ?? "https://example.com",
85
123
  ...e.title === void 0 ? {} : { title: e.title }
86
- }), x = (e) => (e.files ?? []).map((e) => ({
124
+ }), T = (e) => (e.files ?? []).map((e) => ({
87
125
  type: "file",
88
126
  mediaType: e.mediaType,
89
127
  data: {
90
128
  type: "data",
91
129
  data: e.data
92
130
  }
93
- })), S = (e) => [
131
+ })), E = (e) => [
94
132
  {
95
133
  type: "text-start",
96
134
  id: "0"
@@ -104,7 +142,7 @@ var u = [], d = (...e) => {
104
142
  type: "text-end",
105
143
  id: "0"
106
144
  }
107
- ], C = (e) => e.length === 0 ? [] : [
145
+ ], D = (e) => e.length === 0 ? [] : [
108
146
  {
109
147
  type: "reasoning-start",
110
148
  id: "r0"
@@ -118,7 +156,7 @@ var u = [], d = (...e) => {
118
156
  type: "reasoning-end",
119
157
  id: "r0"
120
158
  }
121
- ], w = (e, t, n, r) => ({
159
+ ], O = (e, t, n, r) => ({
122
160
  specificationVersion: "v4",
123
161
  provider: "mock",
124
162
  modelId: e,
@@ -135,16 +173,16 @@ var u = [], d = (...e) => {
135
173
  toolName: e.name,
136
174
  input: JSON.stringify(e.input ?? {})
137
175
  })),
138
- finishReason: _("tool-calls"),
139
- usage: g,
176
+ finishReason: x("tool-calls"),
177
+ usage: b,
140
178
  warnings: []
141
179
  } : {
142
180
  content: [{
143
181
  type: "text",
144
182
  text: o?.text ?? t ?? `[mock(${e})] ${s}`
145
183
  }],
146
- finishReason: _("stop"),
147
- usage: g,
184
+ finishReason: x("stop"),
185
+ usage: b,
148
186
  warnings: [],
149
187
  ...r === void 0 ? {} : { providerMetadata: r }
150
188
  };
@@ -160,18 +198,18 @@ var u = [], d = (...e) => {
160
198
  error: Error(i.error.message)
161
199
  }), s.push({
162
200
  type: "finish",
163
- finishReason: _("error"),
164
- usage: g
165
- })) : (s.push(...C(i?.reasoning ?? "")), o.length > 0 && s.push(...S(o)), s.push(...b(i ?? {})), s.push(...x(i ?? {})), s.push(...y(i ?? {})), s.push({
201
+ finishReason: x("error"),
202
+ usage: b
203
+ })) : (s.push(...D(i?.reasoning ?? "")), o.length > 0 && s.push(...E(o)), s.push(...w(i ?? {})), s.push(...T(i ?? {})), s.push(...C(i ?? {})), s.push({
166
204
  type: "finish",
167
- finishReason: _(a ? "tool-calls" : "stop"),
168
- usage: g
205
+ finishReason: x(a ? "tool-calls" : "stop"),
206
+ usage: b
169
207
  })), { stream: new ReadableStream({ start(e) {
170
208
  for (let t of s) e.enqueue(t);
171
209
  e.close();
172
210
  } }) };
173
211
  }
174
- }), T = "iVBORw0KGgo=", E = "SUQzBAAAAAAAAA==", D = "video/mp4", O = "mock transcript", k = (e, t) => ({
212
+ }), k = "iVBORw0KGgo=", A = "SUQzBAAAAAAAAA==", j = "video/mp4", M = "mock transcript", N = (e, t) => ({
175
213
  specificationVersion: "v4",
176
214
  provider: "mock",
177
215
  modelId: e,
@@ -190,7 +228,7 @@ var u = [], d = (...e) => {
190
228
  totalTokens: 0
191
229
  }
192
230
  })
193
- }), A = (e, t, n) => ({
231
+ }), P = (e, t, n) => ({
194
232
  specificationVersion: "v4",
195
233
  provider: "mock",
196
234
  modelId: e,
@@ -203,7 +241,7 @@ var u = [], d = (...e) => {
203
241
  },
204
242
  ...n === void 0 ? {} : { providerMetadata: n }
205
243
  })
206
- }), j = (e, t, n) => ({
244
+ }), F = (e, t, n) => ({
207
245
  specificationVersion: "v4",
208
246
  provider: "mock",
209
247
  modelId: e,
@@ -221,7 +259,7 @@ var u = [], d = (...e) => {
221
259
  },
222
260
  ...n === void 0 ? {} : { providerMetadata: n }
223
261
  })
224
- }), M = (e, t, n) => ({
262
+ }), I = (e, t, n) => ({
225
263
  specificationVersion: "v4",
226
264
  provider: "mock",
227
265
  modelId: e,
@@ -236,67 +274,67 @@ var u = [], d = (...e) => {
236
274
  },
237
275
  ...n === void 0 ? {} : { providerMetadata: n }
238
276
  })
239
- }), N = (e) => e.apiKey !== void 0 || e.baseURL !== void 0, P = (e) => ({
277
+ }), L = (e) => e.apiKey !== void 0 || e.baseURL !== void 0, R = (e) => ({
240
278
  ...e.apiKey === void 0 ? {} : { apiKey: e.apiKey },
241
279
  ...e.baseURL === void 0 ? {} : { baseURL: e.baseURL }
242
- }), F = (o, s) => m((() => {
280
+ }), z = (o, s) => m((() => {
243
281
  switch (o.name) {
244
- case "mock": return w(o.model ?? "mock", o.mockText, o.script, o.providerMetadata);
245
- case "anthropic": return N(o) ? t(P(o))(o.model) : e(o.model);
246
- case "openai": return N(o) ? n(P(o))(o.model) : r(o.model);
247
- case "gateway": return N(o) ? i(P(o))(o.model) : a(o.model);
282
+ case "mock": return O(o.model ?? "mock", o.mockText, o.script, o.providerMetadata);
283
+ case "anthropic": return L(o) ? t(R(o))(o.model) : e(o.model);
284
+ case "openai": return L(o) ? n(R(o))(o.model) : r(o.model);
285
+ case "gateway": return L(o) ? i(R(o))(o.model) : a(o.model);
248
286
  }
249
- })(), s), I = (e) => {
287
+ })(), s), B = (e) => {
250
288
  switch (e.name) {
251
- case "mock": return k(e.model ?? "mock", e.mockMedia?.imageBase64 ?? T);
252
- case "openai": return N(e) ? n(P(e)).image(e.model) : r.image(e.model);
253
- case "gateway": return N(e) ? i(P(e)).image(e.model) : a.image(e.model);
289
+ case "mock": return N(e.model ?? "mock", e.mockMedia?.imageBase64 ?? k);
290
+ case "openai": return L(e) ? n(R(e)).image(e.model) : r.image(e.model);
291
+ case "gateway": return v(R(e), e.model);
254
292
  case "anthropic": throw Error("Provider 'anthropic' does not support image generation. Use 'openai' or 'gateway'.");
255
293
  }
256
- }, L = (e) => {
294
+ }, V = (e) => {
257
295
  switch (e.name) {
258
- case "mock": return A(e.model ?? "mock", e.mockMedia?.audioBase64 ?? E, e.providerMetadata);
259
- case "openai": return N(e) ? n(P(e)).speech(e.model) : r.speech(e.model);
260
- case "gateway": return N(e) ? i(P(e)).speech(e.model) : a.speech(e.model);
296
+ case "mock": return P(e.model ?? "mock", e.mockMedia?.audioBase64 ?? A, e.providerMetadata);
297
+ case "openai": return L(e) ? n(R(e)).speech(e.model) : r.speech(e.model);
298
+ case "gateway": return L(e) ? i(R(e)).speech(e.model) : a.speech(e.model);
261
299
  case "anthropic": throw Error("Provider 'anthropic' does not support speech generation. Use 'openai' or 'gateway'.");
262
300
  }
263
- }, R = (e) => {
301
+ }, H = (e) => {
264
302
  switch (e.name) {
265
- case "mock": return j(e.model ?? "mock", e.mockMedia?.transcript ?? O, e.providerMetadata);
266
- case "openai": return N(e) ? n(P(e)).transcription(e.model) : r.transcription(e.model);
267
- case "gateway": return N(e) ? i(P(e)).transcription(e.model) : a.transcription(e.model);
303
+ case "mock": return F(e.model ?? "mock", e.mockMedia?.transcript ?? M, e.providerMetadata);
304
+ case "openai": return L(e) ? n(R(e)).transcription(e.model) : r.transcription(e.model);
305
+ case "gateway": return L(e) ? i(R(e)).transcription(e.model) : a.transcription(e.model);
268
306
  case "anthropic": throw Error("Provider 'anthropic' does not support transcription. Use 'openai' or 'gateway'.");
269
307
  }
270
- }, z = (e) => {
308
+ }, U = (e) => {
271
309
  switch (e.name) {
272
310
  case "mock": {
273
311
  let t = e.mockMedia, n = t?.videoBase64 === void 0 ? {
274
312
  type: "url",
275
313
  url: t?.videoUrl ?? `https://mock.local/${e.model ?? "mock"}.mp4`,
276
- mediaType: D
314
+ mediaType: j
277
315
  } : {
278
316
  type: "base64",
279
317
  data: t.videoBase64,
280
- mediaType: D
318
+ mediaType: j
281
319
  };
282
- return M(e.model ?? "mock", n, e.providerMetadata);
320
+ return I(e.model ?? "mock", n, e.providerMetadata);
283
321
  }
284
- case "gateway": return N(e) ? i(P(e)).video(e.model) : a.video(e.model);
322
+ case "gateway": return y(R(e), e.model);
285
323
  case "openai": throw Error("Provider 'openai' does not support video generation. Use 'gateway'.");
286
324
  case "anthropic": throw Error("Provider 'anthropic' does not support video generation. Use 'gateway'.");
287
325
  }
288
- }, B = null, V = (e) => {
289
- let t = B;
290
- return B = e, t;
291
- }, H = () => B, U = (e) => {
326
+ }, W = null, G = (e) => {
327
+ let t = W;
328
+ return W = e, t;
329
+ }, K = () => W, q = (e) => {
292
330
  switch (e.toLowerCase()) {
293
331
  case "anthropic": return "ANTHROPIC_API_KEY";
294
332
  case "openai": return "OPENAI_API_KEY";
295
333
  case "gateway": return "AI_GATEWAY_API_KEY";
296
334
  default: return;
297
335
  }
298
- }, W = (e = process.env) => {
299
- if (B) return B;
336
+ }, J = (e = process.env) => {
337
+ if (W) return W;
300
338
  let t = (e.AI_PROVIDER ?? "mock").toLowerCase(), n = e.AI_MODEL;
301
339
  switch (t) {
302
340
  case "mock": return {
@@ -323,4 +361,4 @@ var u = [], d = (...e) => {
323
361
  }
324
362
  };
325
363
  //#endregion
326
- export { d as _, I as a, R as c, m as d, p as f, h as g, f as h, U as i, z as l, s as m, H as n, F as o, o as p, W as r, L as s, v as t, V as u, c as v };
364
+ export { d as _, B as a, H as c, m as d, p as f, h as g, f as h, q as i, U as l, s as m, K as n, z as o, o as p, J as r, V as s, S as t, G as u, c as v };
package/dist/test.js CHANGED
@@ -1,4 +1,4 @@
1
- import { t as e, u as t } from "./provider-RA0getTL.js";
1
+ import { t as e, u as t } from "./provider-C_Sms_DA.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));
@@ -492,6 +492,10 @@ declare interface ToolContext {
492
492
  readonly subject?: unknown;
493
493
  };
494
494
  readonly runtime?: Runtime.Runtime<unknown>;
495
+ /** SDK tool-call identity for this execution, not a durable application idempotency key. */
496
+ readonly invocationId?: string;
497
+ /** The SDK's cancellation signal; Promise handlers must pass it to their I/O. */
498
+ readonly abortSignal?: AbortSignal;
495
499
  }
496
500
 
497
501
  /** A context-receiving tool body — the `*.tool.tsx` default-export form.
package/dist/workflow.js CHANGED
@@ -1,5 +1,5 @@
1
- import { r as e } from "./provider-RA0getTL.js";
2
- import { B as t, D as n, E as r, G as i, K as a, O as o, b as s, m as c, o as l, p as u, s as d, t as f, w as p, y as m } from "./inferenceQueue-BS3PVSkk.js";
1
+ import { r as e } from "./provider-C_Sms_DA.js";
2
+ import { D as t, E as n, O as r, R as i, U as a, Z as o, b as s, m as c, o as l, p as u, s as d, t as f, w as p, y as m } from "./inferenceQueue-TwTEBG3Q.js";
3
3
  import { Effect as h, Schema as g } from "effect";
4
4
  import { eq as _ } from "@voltro/database";
5
5
  import { CurrentWorkflowExecutionId as v, awaitSignalSuspending as y, step as b, suspendForBudget as x } from "@voltro/workflow";
@@ -42,16 +42,16 @@ var S = {
42
42
  }, D = (e) => ({
43
43
  provider: String(e.provider ?? "unknown"),
44
44
  model: String(e.model ?? "unknown")
45
- }), O = (e, n, r, a, o) => {
45
+ }), O = (e, t, n, r, o) => {
46
46
  let s = e.store;
47
47
  if (s === void 0) return h.void;
48
- let { provider: c, model: l } = D(n), u = t(a.providerMetadata);
49
- return i(s, {
48
+ let { provider: c, model: l } = D(t), u = i(r.providerMetadata);
49
+ return a(s, {
50
50
  provider: c,
51
51
  model: l,
52
- operation: r,
52
+ operation: n,
53
53
  agent: e.name,
54
- usage: a.usage,
54
+ usage: r.usage,
55
55
  ...e.tenantId === void 0 ? {} : { tenantId: e.tenantId },
56
56
  ...u === void 0 ? {} : { actualCostUsd: u },
57
57
  ...o === void 0 ? {} : { prompt: o }
@@ -136,33 +136,35 @@ var S = {
136
136
  if (t === void 0) return;
137
137
  let n = e.store;
138
138
  if (n === void 0) return yield* h.die(new I(e.name));
139
- let r = e.tenantId ?? null, i = t.name ?? "ai-usd", o = () => a(n, {
139
+ let r = e.tenantId ?? null, i = t.name ?? "ai-usd", a = yield* v, s = () => o(n, {
140
140
  tenantId: r,
141
141
  limitUsd: t.limitUsd,
142
142
  addUsd: 0,
143
143
  ...t.since === void 0 ? {} : { since: t.since }
144
- }).pipe(h.as(null), h.catchTag("AiBudgetExceeded", (e) => h.succeed(e))), s = () => t.estimateUsd === void 0 ? h.void : a(n, {
144
+ }).pipe(h.as(null), h.catchTag("AiBudgetExceeded", (e) => h.succeed(e))), c = () => t.estimateUsd === void 0 ? h.void : o(n, {
145
145
  tenantId: r,
146
146
  limitUsd: t.limitUsd,
147
147
  addUsd: t.estimateUsd,
148
+ ...a === void 0 ? {} : { reservationId: d(a, JSON.stringify([
149
+ "budget",
150
+ i,
151
+ e.name
152
+ ])) },
148
153
  ...t.since === void 0 ? {} : { since: t.since }
149
- }), c = yield* o();
150
- if (c === null) return yield* s();
151
- if ((t.onExceeded ?? "fail") !== "suspend") return yield* h.fail(c);
152
- let l = yield* v;
153
- return l === void 0 ? yield* h.fail(c) : (yield* x({
154
+ }).pipe(h.asVoid), l = yield* s();
155
+ return l === null ? yield* c() : (t.onExceeded ?? "fail") !== "suspend" || a === void 0 ? yield* h.fail(l) : (yield* x({
154
156
  store: n,
155
157
  budget: i,
156
158
  tenantId: r,
157
- executionId: l,
158
- workflowName: yield* R(n, l),
159
+ executionId: a,
160
+ workflowName: yield* R(n, a),
159
161
  stepName: e.name,
160
- spentMicroUsd: Math.round(c.spentUsd * 1e6),
162
+ spentMicroUsd: Math.round(l.spentUsd * 1e6),
161
163
  limitMicroUsd: Math.round(t.limitUsd * 1e6),
162
- hasHeadroom: o().pipe(h.map((e) => e === null)),
164
+ hasHeadroom: s().pipe(h.map((e) => e === null)),
163
165
  ...t.holdTimeoutMs === void 0 ? {} : { timeoutMs: t.holdTimeoutMs },
164
166
  ...t.recheckEveryMs === void 0 ? {} : { recheckEveryMs: t.recheckEveryMs }
165
- }).pipe(h.catchAll((e) => h.die(e))), yield* s());
167
+ }).pipe(h.catchAll((e) => h.die(e))), yield* c());
166
168
  }), R = (e, t) => h.promise(async () => {
167
169
  let n = await e.query({
168
170
  table: "_voltro_workflow_runs",
@@ -173,29 +175,29 @@ var S = {
173
175
  projection: void 0
174
176
  });
175
177
  return String(n[0]?.tag ?? "");
176
- }), z = (t) => {
177
- let r = t.provider ?? e(), i = E(t), a = {
178
+ }), z = (n) => {
179
+ let r = n.provider ?? e(), i = E(n), a = {
178
180
  ...D(r),
179
181
  operation: "generateText",
180
- offloaded: t.offload === !0,
181
- ...T(i.text, i.system, t.recordPrompt ?? "digest", i.rendered)
182
- }, o = (e) => t.budget === void 0 ? e : h.zipRight(L(t), e);
183
- return t.offload === !0 ? o(F(t, r, "text", null, a, i)) : o(b({
184
- name: t.name,
182
+ offloaded: n.offload === !0,
183
+ ...T(i.text, i.system, n.recordPrompt ?? "digest", i.rendered)
184
+ }, o = (e) => n.budget === void 0 ? e : h.zipRight(L(n), e);
185
+ return n.offload === !0 ? o(F(n, r, "text", null, a, i)) : o(b({
186
+ name: n.name,
185
187
  success: A,
186
188
  input: a,
187
- retry: t.retry ?? S,
188
- execute: n({
189
+ retry: n.retry ?? S,
190
+ execute: t({
189
191
  prompt: i.text,
190
192
  provider: r,
191
193
  ...i.system === void 0 ? {} : { system: i.system },
192
- ...t.fallbacks === void 0 ? {} : { fallbacks: t.fallbacks },
193
- ...t.maxTokens === void 0 ? {} : { maxTokens: t.maxTokens },
194
- ...t.providerOptions === void 0 ? {} : { providerOptions: t.providerOptions },
195
- ...t.tools === void 0 ? {} : { tools: t.tools },
196
- ...t.maxSteps === void 0 ? {} : { maxSteps: t.maxSteps },
197
- ...t.toolContext === void 0 ? {} : { toolContext: t.toolContext }
198
- }).pipe(h.tap((e) => O(t, r, "generateText", e, i.rendered)), h.tap(() => k(t, i.rendered)), h.map((e) => ({
194
+ ...n.fallbacks === void 0 ? {} : { fallbacks: n.fallbacks },
195
+ ...n.maxTokens === void 0 ? {} : { maxTokens: n.maxTokens },
196
+ ...n.providerOptions === void 0 ? {} : { providerOptions: n.providerOptions },
197
+ ...n.tools === void 0 ? {} : { tools: n.tools },
198
+ ...n.maxSteps === void 0 ? {} : { maxSteps: n.maxSteps },
199
+ ...n.toolContext === void 0 ? {} : { toolContext: n.toolContext }
200
+ }).pipe(h.tap((e) => O(n, r, "generateText", e, i.rendered)), h.tap(() => k(n, i.rendered)), h.map((e) => ({
199
201
  text: e.text,
200
202
  inputTokens: e.usage.inputTokens ?? null,
201
203
  outputTokens: e.usage.outputTokens ?? null,
@@ -238,40 +240,40 @@ var S = {
238
240
  })))
239
241
  }));
240
242
  }, H = (t) => {
241
- let n = t.provider ?? e(), i = E(t), a = {
242
- ...D(n),
243
+ let i = t.provider ?? e(), a = E(t), o = {
244
+ ...D(i),
243
245
  operation: "generateObject",
244
246
  offloaded: t.offload === !0,
245
- ...T(i.text, i.system, t.recordPrompt ?? "digest", i.rendered)
247
+ ...T(a.text, a.system, t.recordPrompt ?? "digest", a.rendered)
246
248
  }, s = (e) => t.budget === void 0 ? e : h.zipRight(L(t), e);
247
249
  return t.offload === !0 ? s(h.gen(function* () {
248
- let e = yield* o(t.schema, "aiObjectStep"), r = yield* F(t, n, "object", e, a, i);
249
- return yield* g.decodeUnknown(t.schema)(r);
250
+ let e = yield* r(t.schema, "aiObjectStep"), n = yield* F(t, i, "object", e, o, a);
251
+ return yield* g.decodeUnknown(t.schema)(n);
250
252
  })) : s(b({
251
253
  name: t.name,
252
254
  success: t.schema,
253
- input: a,
255
+ input: o,
254
256
  retry: t.retry ?? S,
255
257
  execute: (t.tools === void 0 ? p({
256
- prompt: i.text,
258
+ prompt: a.text,
257
259
  schema: t.schema,
258
- provider: n,
259
- ...i.system === void 0 ? {} : { system: i.system },
260
+ provider: i,
261
+ ...a.system === void 0 ? {} : { system: a.system },
260
262
  ...t.fallbacks === void 0 ? {} : { fallbacks: t.fallbacks },
261
263
  ...t.maxTokens === void 0 ? {} : { maxTokens: t.maxTokens },
262
264
  ...t.providerOptions === void 0 ? {} : { providerOptions: t.providerOptions }
263
- }) : r({
264
- prompt: i.text,
265
+ }) : n({
266
+ prompt: a.text,
265
267
  schema: t.schema,
266
- provider: n,
268
+ provider: i,
267
269
  tools: t.tools,
268
270
  ...t.maxSteps === void 0 ? {} : { maxSteps: t.maxSteps },
269
271
  ...t.toolContext === void 0 ? {} : { toolContext: t.toolContext },
270
- ...i.system === void 0 ? {} : { system: i.system },
272
+ ...a.system === void 0 ? {} : { system: a.system },
271
273
  ...t.fallbacks === void 0 ? {} : { fallbacks: t.fallbacks },
272
274
  ...t.maxTokens === void 0 ? {} : { maxTokens: t.maxTokens },
273
275
  ...t.providerOptions === void 0 ? {} : { providerOptions: t.providerOptions }
274
- })).pipe(h.tap((e) => O(t, n, "generateObject", e, i.rendered)), h.tap(() => k(t, i.rendered)), h.map((e) => e.object))
276
+ })).pipe(h.tap((e) => O(t, i, "generateObject", e, a.rendered)), h.tap(() => k(t, a.rendered)), h.map((e) => e.object))
275
277
  }));
276
278
  };
277
279
  //#endregion
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@voltro/ai",
3
- "version": "0.70.0",
3
+ "version": "0.71.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",
@@ -55,10 +55,12 @@
55
55
  "dependencies": {
56
56
  "@ai-sdk/anthropic": "^4.0.49",
57
57
  "@ai-sdk/openai": "^4.0.58",
58
- "@voltro/cache": "0.70.0",
59
- "@voltro/database": "0.70.0",
60
- "@voltro/protocol": "0.70.0",
61
- "@voltro/workflow": "0.70.0"
58
+ "@voltro/cache": "0.71.0",
59
+ "@voltro/database": "0.71.0",
60
+ "@voltro/protocol": "0.71.0",
61
+ "@voltro/workflow": "0.71.0",
62
+ "ajv": "^8.20.0",
63
+ "ajv-formats": "^3.0.1"
62
64
  },
63
65
  "peerDependencies": {
64
66
  "@ai-sdk/gateway": "^4.0.74",