@blockrun/franklin 3.15.51 → 3.15.52

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.
@@ -23,6 +23,7 @@ import path from 'node:path';
23
23
  import { getOrCreateWallet, getOrCreateSolanaWallet, createPaymentPayload, createSolanaPaymentPayload, parsePaymentRequired, extractPaymentDetails, solanaKeyToBytes, SOLANA_NETWORK, } from '@blockrun/llm';
24
24
  import { loadChain, API_URLS, VERSION } from '../config.js';
25
25
  import { logger } from '../logger.js';
26
+ import { resolveReferenceImage } from './imagegen.js';
26
27
  import { ModelClient } from '../agent/llm.js';
27
28
  import { analyzeMediaRequest, renderProposalForAskUser } from '../agent/media-router.js';
28
29
  import { recordUsage } from '../stats/tracker.js';
@@ -46,6 +47,28 @@ function buildExecute(deps) {
46
47
  const { output_path, model, image_url, duration_seconds, contentId } = rawInput;
47
48
  if (!rawInput.prompt)
48
49
  return { output: 'Error: prompt is required', isError: true };
50
+ // Resolve image_url before sending. The gateway requires a URL (http(s)
51
+ // or data: URI), but agents naturally pass a local file path —
52
+ // verified 2026-05-04 in a live session: agent passed
53
+ // `/Users/.../keyframe.png` and the gateway returned
54
+ // `400 Invalid request body: invalid_format url path: image_url`.
55
+ // ImageGen already had `resolveReferenceImage` for the same problem;
56
+ // sharing the helper keeps the contract consistent across both tools
57
+ // (local path → base64 data URI; http(s) URL → fetched + inlined;
58
+ // data: URI → passes through). On any resolution failure, surface
59
+ // the message instead of letting the gateway 400 bubble back.
60
+ let resolvedImageUrl;
61
+ if (image_url) {
62
+ try {
63
+ resolvedImageUrl = await resolveReferenceImage(image_url, ctx.workingDir);
64
+ }
65
+ catch (err) {
66
+ return {
67
+ output: `Could not resolve image_url ${JSON.stringify(image_url)}: ${err.message}`,
68
+ isError: true,
69
+ };
70
+ }
71
+ }
49
72
  // One-shot refinement opt-out: leading `///` tells Franklin "don't
50
73
  // refine this prompt." Strip the prefix and pass skipRefine through.
51
74
  let prompt = rawInput.prompt;
@@ -131,7 +154,7 @@ function buildExecute(deps) {
131
154
  const body = JSON.stringify({
132
155
  model: videoModel,
133
156
  prompt: chosenPrompt,
134
- ...(image_url ? { image_url } : {}),
157
+ ...(resolvedImageUrl ? { image_url: resolvedImageUrl } : {}),
135
158
  ...(duration_seconds ? { duration_seconds } : {}),
136
159
  });
137
160
  const headers = {
@@ -440,7 +463,7 @@ export function createVideoGenCapability(deps = {}) {
440
463
  prompt: { type: 'string', description: 'Text description of the video to generate' },
441
464
  output_path: { type: 'string', description: 'Where to save the MP4. Default: generated-<timestamp>.mp4 in working directory' },
442
465
  model: { type: 'string', description: 'Video model. Default: xai/grok-imagine-video' },
443
- image_url: { type: 'string', description: 'Optional seed image URL (image-to-video)' },
466
+ image_url: { type: 'string', description: 'Optional seed image (image-to-video). Accepts http(s) URL, data: URI, or local file path — local paths get inlined as base64 data URIs automatically.' },
444
467
  duration_seconds: { type: 'number', description: 'Duration billed for. Default depends on model (8s for grok-imagine-video).' },
445
468
  contentId: { type: 'string', description: 'Optional Content id to attach and budget against.' },
446
469
  },
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@blockrun/franklin",
3
- "version": "3.15.51",
3
+ "version": "3.15.52",
4
4
  "description": "Franklin — The AI agent with a wallet. Spends USDC autonomously to get real work done. Pay per action, no subscriptions.",
5
5
  "type": "module",
6
6
  "exports": {