@spinabot/brigade 1.8.0 → 1.10.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.
Files changed (139) hide show
  1. package/README.md +21 -0
  2. package/dist/agents/agent-loop.d.ts +55 -0
  3. package/dist/agents/agent-loop.d.ts.map +1 -1
  4. package/dist/agents/agent-loop.js +90 -1
  5. package/dist/agents/agent-loop.js.map +1 -1
  6. package/dist/agents/channels/inbound-pipeline.d.ts +22 -0
  7. package/dist/agents/channels/inbound-pipeline.d.ts.map +1 -1
  8. package/dist/agents/channels/inbound-pipeline.js +31 -1
  9. package/dist/agents/channels/inbound-pipeline.js.map +1 -1
  10. package/dist/agents/channels/media-capture.d.ts +69 -6
  11. package/dist/agents/channels/media-capture.d.ts.map +1 -1
  12. package/dist/agents/channels/media-capture.js +125 -8
  13. package/dist/agents/channels/media-capture.js.map +1 -1
  14. package/dist/agents/channels/telegram/media.d.ts.map +1 -1
  15. package/dist/agents/channels/telegram/media.js +16 -4
  16. package/dist/agents/channels/telegram/media.js.map +1 -1
  17. package/dist/agents/channels/whatsapp/media.d.ts +19 -0
  18. package/dist/agents/channels/whatsapp/media.d.ts.map +1 -1
  19. package/dist/agents/channels/whatsapp/media.js +37 -2
  20. package/dist/agents/channels/whatsapp/media.js.map +1 -1
  21. package/dist/agents/media-understanding/anthropic-adapter.d.ts +49 -0
  22. package/dist/agents/media-understanding/anthropic-adapter.d.ts.map +1 -0
  23. package/dist/agents/media-understanding/anthropic-adapter.js +162 -0
  24. package/dist/agents/media-understanding/anthropic-adapter.js.map +1 -0
  25. package/dist/agents/media-understanding/config.d.ts +57 -0
  26. package/dist/agents/media-understanding/config.d.ts.map +1 -0
  27. package/dist/agents/media-understanding/config.js +289 -0
  28. package/dist/agents/media-understanding/config.js.map +1 -0
  29. package/dist/agents/media-understanding/gemini-adapter.d.ts +57 -0
  30. package/dist/agents/media-understanding/gemini-adapter.d.ts.map +1 -0
  31. package/dist/agents/media-understanding/gemini-adapter.js +343 -0
  32. package/dist/agents/media-understanding/gemini-adapter.js.map +1 -0
  33. package/dist/agents/media-understanding/index.d.ts +58 -0
  34. package/dist/agents/media-understanding/index.d.ts.map +1 -0
  35. package/dist/agents/media-understanding/index.js +275 -0
  36. package/dist/agents/media-understanding/index.js.map +1 -0
  37. package/dist/agents/media-understanding/pi-adapter.d.ts +72 -0
  38. package/dist/agents/media-understanding/pi-adapter.d.ts.map +1 -0
  39. package/dist/agents/media-understanding/pi-adapter.js +160 -0
  40. package/dist/agents/media-understanding/pi-adapter.js.map +1 -0
  41. package/dist/agents/media-understanding/types.d.ts +189 -0
  42. package/dist/agents/media-understanding/types.d.ts.map +1 -0
  43. package/dist/agents/media-understanding/types.js +51 -0
  44. package/dist/agents/media-understanding/types.js.map +1 -0
  45. package/dist/agents/session-wiring.d.ts +11 -0
  46. package/dist/agents/session-wiring.d.ts.map +1 -1
  47. package/dist/agents/session-wiring.js +1 -0
  48. package/dist/agents/session-wiring.js.map +1 -1
  49. package/dist/agents/tools/analyze-media-tool.d.ts +263 -0
  50. package/dist/agents/tools/analyze-media-tool.d.ts.map +1 -0
  51. package/dist/agents/tools/analyze-media-tool.js +2321 -0
  52. package/dist/agents/tools/analyze-media-tool.js.map +1 -0
  53. package/dist/agents/tools/doc-shared.d.ts +187 -0
  54. package/dist/agents/tools/doc-shared.d.ts.map +1 -0
  55. package/dist/agents/tools/doc-shared.js +484 -0
  56. package/dist/agents/tools/doc-shared.js.map +1 -0
  57. package/dist/agents/tools/edit-document-tool.d.ts +133 -0
  58. package/dist/agents/tools/edit-document-tool.d.ts.map +1 -0
  59. package/dist/agents/tools/edit-document-tool.js +815 -0
  60. package/dist/agents/tools/edit-document-tool.js.map +1 -0
  61. package/dist/agents/tools/image-downscale.d.ts +93 -0
  62. package/dist/agents/tools/image-downscale.d.ts.map +1 -0
  63. package/dist/agents/tools/image-downscale.js +257 -0
  64. package/dist/agents/tools/image-downscale.js.map +1 -0
  65. package/dist/agents/tools/make-document-tool.d.ts +114 -0
  66. package/dist/agents/tools/make-document-tool.d.ts.map +1 -0
  67. package/dist/agents/tools/make-document-tool.js +542 -0
  68. package/dist/agents/tools/make-document-tool.js.map +1 -0
  69. package/dist/agents/tools/media-cache.d.ts +56 -0
  70. package/dist/agents/tools/media-cache.d.ts.map +1 -0
  71. package/dist/agents/tools/media-cache.js +133 -0
  72. package/dist/agents/tools/media-cache.js.map +1 -0
  73. package/dist/agents/tools/ooxml-images.d.ts +107 -0
  74. package/dist/agents/tools/ooxml-images.d.ts.map +1 -0
  75. package/dist/agents/tools/ooxml-images.js +308 -0
  76. package/dist/agents/tools/ooxml-images.js.map +1 -0
  77. package/dist/agents/tools/registry.d.ts +12 -0
  78. package/dist/agents/tools/registry.d.ts.map +1 -1
  79. package/dist/agents/tools/registry.js +47 -0
  80. package/dist/agents/tools/registry.js.map +1 -1
  81. package/dist/buildstamp.json +1 -1
  82. package/dist/cli/commands/doctor.d.ts.map +1 -1
  83. package/dist/cli/commands/doctor.js +41 -0
  84. package/dist/cli/commands/doctor.js.map +1 -1
  85. package/dist/cli/commands/expose.d.ts +40 -0
  86. package/dist/cli/commands/expose.d.ts.map +1 -0
  87. package/dist/cli/commands/expose.js +200 -0
  88. package/dist/cli/commands/expose.js.map +1 -0
  89. package/dist/cli/program/build-program.d.ts.map +1 -1
  90. package/dist/cli/program/build-program.js +61 -0
  91. package/dist/cli/program/build-program.js.map +1 -1
  92. package/dist/config/io.d.ts +41 -0
  93. package/dist/config/io.d.ts.map +1 -1
  94. package/dist/config/io.js.map +1 -1
  95. package/dist/core/console-stream.d.ts.map +1 -1
  96. package/dist/core/console-stream.js +7 -5
  97. package/dist/core/console-stream.js.map +1 -1
  98. package/dist/core/server.js +6 -1
  99. package/dist/core/server.js.map +1 -1
  100. package/dist/core/tunnel/auth-proxy.d.ts +55 -0
  101. package/dist/core/tunnel/auth-proxy.d.ts.map +1 -0
  102. package/dist/core/tunnel/auth-proxy.js +179 -0
  103. package/dist/core/tunnel/auth-proxy.js.map +1 -0
  104. package/dist/core/tunnel/manager.d.ts +42 -0
  105. package/dist/core/tunnel/manager.d.ts.map +1 -0
  106. package/dist/core/tunnel/manager.js +102 -0
  107. package/dist/core/tunnel/manager.js.map +1 -0
  108. package/dist/core/tunnel/providers/bore.d.ts +18 -0
  109. package/dist/core/tunnel/providers/bore.d.ts.map +1 -0
  110. package/dist/core/tunnel/providers/bore.js +117 -0
  111. package/dist/core/tunnel/providers/bore.js.map +1 -0
  112. package/dist/core/tunnel/providers/cloudflared.d.ts +24 -0
  113. package/dist/core/tunnel/providers/cloudflared.d.ts.map +1 -0
  114. package/dist/core/tunnel/providers/cloudflared.js +179 -0
  115. package/dist/core/tunnel/providers/cloudflared.js.map +1 -0
  116. package/dist/core/tunnel/providers/custom.d.ts +21 -0
  117. package/dist/core/tunnel/providers/custom.d.ts.map +1 -0
  118. package/dist/core/tunnel/providers/custom.js +124 -0
  119. package/dist/core/tunnel/providers/custom.js.map +1 -0
  120. package/dist/core/tunnel/registry.d.ts +15 -0
  121. package/dist/core/tunnel/registry.d.ts.map +1 -0
  122. package/dist/core/tunnel/registry.js +26 -0
  123. package/dist/core/tunnel/registry.js.map +1 -0
  124. package/dist/core/tunnel/state.d.ts +39 -0
  125. package/dist/core/tunnel/state.d.ts.map +1 -0
  126. package/dist/core/tunnel/state.js +57 -0
  127. package/dist/core/tunnel/state.js.map +1 -0
  128. package/dist/core/tunnel/types.d.ts +61 -0
  129. package/dist/core/tunnel/types.d.ts.map +1 -0
  130. package/dist/core/tunnel/types.js +20 -0
  131. package/dist/core/tunnel/types.js.map +1 -0
  132. package/dist/system-prompt/assembler.d.ts.map +1 -1
  133. package/dist/system-prompt/assembler.js +25 -1
  134. package/dist/system-prompt/assembler.js.map +1 -1
  135. package/dist/system-prompt/guidance.d.ts +30 -0
  136. package/dist/system-prompt/guidance.d.ts.map +1 -1
  137. package/dist/system-prompt/guidance.js +50 -0
  138. package/dist/system-prompt/guidance.js.map +1 -1
  139. package/package.json +13 -1
@@ -0,0 +1,289 @@
1
+ /**
2
+ * Build a `MediaUnderstandingConfig` from Brigade's existing credential store
3
+ * + main config — so the subsystem resolves keys the SAME way the agent kernel
4
+ * does, and never invents its own auth path.
5
+ *
6
+ * Key resolution reuses `readBrigadeCredentials(agentId)` (the mode-aware
7
+ * choke point over `auth-profiles.json` / the Convex sealed cache that
8
+ * onboarding writes), then falls back to the provider's env var. For Anthropic
9
+ * we accept a literal `api_key` credential; an `oauth` credential (subscription
10
+ * login) is passed through as its access token so direct REST calls still
11
+ * authenticate (Anthropic's `sk-ant-oat…` Bearer path).
12
+ *
13
+ * Per-kind model/provider defaults are read from
14
+ * `cfg.tools.mediaUnderstanding` when present.
15
+ */
16
+ import { ModelRegistry } from "@earendil-works/pi-coding-agent";
17
+ import { DEFAULT_AGENT_ID, resolveModelsPath } from "../../config/paths.js";
18
+ import { loadBrigadeAuthStorage, readBrigadeCredentials } from "../../core/auth-bridge.js";
19
+ import { loadConfig } from "../../core/config.js";
20
+ import { PROVIDERS } from "../../providers/catalog.js";
21
+ /**
22
+ * Extra env-var fallbacks for the two bespoke-adapter providers, consulted
23
+ * AFTER the credential store. Other providers fall back through the shared
24
+ * catalog (`PROVIDERS[*].envVar` + `envVarFallbacks`) in `resolveMediaProviderKey`.
25
+ */
26
+ const PROVIDER_ENV = {
27
+ google: ["GEMINI_API_KEY", "GOOGLE_API_KEY"],
28
+ anthropic: ["ANTHROPIC_API_KEY", "ANTHROPIC_OAUTH_TOKEN"],
29
+ };
30
+ /**
31
+ * Preference order for the Pi path's provider sweep. Vision-strong, widely-keyed
32
+ * providers first. Providers NOT listed here still work (any keyed catalog
33
+ * provider with an image-capable model is appended), this just orders the common
34
+ * ones. `google`/`anthropic` are intentionally omitted — the bespoke REST
35
+ * adapters serve those first; the Pi path is the catch-all for the rest.
36
+ */
37
+ const PI_PROVIDER_PREFERENCE = [
38
+ "openai",
39
+ "openrouter",
40
+ "groq",
41
+ "xai",
42
+ "mistral",
43
+ "cerebras",
44
+ "ollama",
45
+ ];
46
+ /**
47
+ * Resolve a provider's key for media understanding. Order:
48
+ * 1. Brigade credential store (`readBrigadeCredentials`) — api_key.key, or
49
+ * an oauth credential's access token (so subscription login works).
50
+ * 2. The provider's env var(s) — explicit overrides above, else the catalog's
51
+ * `envVar` + `envVarFallbacks` for that provider.
52
+ * Returns "" when nothing resolves (keyless local providers also return "").
53
+ */
54
+ export function resolveMediaProviderKey(provider, agentId = DEFAULT_AGENT_ID) {
55
+ try {
56
+ const creds = readBrigadeCredentials(agentId);
57
+ const cred = creds[provider];
58
+ if (cred) {
59
+ if (cred.type === "api_key" && typeof cred.key === "string" && cred.key.length > 0) {
60
+ return cred.key;
61
+ }
62
+ // Subscription login (oauth): use the access token for the Bearer path.
63
+ if (cred.type === "oauth" && typeof cred.access === "string" && cred.access.length > 0) {
64
+ return cred.access;
65
+ }
66
+ }
67
+ }
68
+ catch {
69
+ /* fall through to env */
70
+ }
71
+ const envNames = PROVIDER_ENV[provider] ?? envVarsFromCatalog(provider);
72
+ for (const name of envNames) {
73
+ if (!name)
74
+ continue;
75
+ const value = process.env[name];
76
+ if (value)
77
+ return value;
78
+ }
79
+ return "";
80
+ }
81
+ /** Env-var names a catalog provider can be keyed from (primary + fallbacks). */
82
+ function envVarsFromCatalog(provider) {
83
+ const entry = PROVIDERS.find((p) => p.id === provider || p.providerId === provider);
84
+ if (!entry)
85
+ return [];
86
+ return [entry.envVar, ...(entry.envVarFallbacks ?? [])].filter((n) => !!n);
87
+ }
88
+ /** True when a catalog provider runs without an API key (Ollama, LM Studio). */
89
+ function providerIsKeyless(provider) {
90
+ const entry = PROVIDERS.find((p) => p.id === provider || p.providerId === provider);
91
+ return Boolean(entry?.noAuth);
92
+ }
93
+ /**
94
+ * Providers (catalog ids) that currently have a usable credential for the Pi
95
+ * path, MOST-PREFERRED first. A keyless local provider (Ollama) qualifies when
96
+ * its server is configured (we treat it as always-eligible — the real call
97
+ * surfaces an unreachable error). `google`/`anthropic` are excluded (the
98
+ * bespoke adapters own them); the Pi path is the catch-all for the rest.
99
+ */
100
+ export function listKeyedPiProviders(agentId = DEFAULT_AGENT_ID) {
101
+ const eligible = new Set();
102
+ for (const entry of PROVIDERS) {
103
+ const id = entry.providerId ?? entry.id;
104
+ if (id === "google" || id === "anthropic")
105
+ continue;
106
+ if (providerIsKeyless(entry.id)) {
107
+ eligible.add(id);
108
+ continue;
109
+ }
110
+ if (resolveMediaProviderKey(id, agentId))
111
+ eligible.add(id);
112
+ }
113
+ // Order: preference list first (those that are eligible), then any remaining.
114
+ const ordered = [];
115
+ for (const p of PI_PROVIDER_PREFERENCE) {
116
+ if (eligible.has(p)) {
117
+ ordered.push(p);
118
+ eligible.delete(p);
119
+ }
120
+ }
121
+ return [...ordered, ...eligible];
122
+ }
123
+ /** Read `cfg.tools.mediaUnderstanding` defaults (model/provider per kind), best-effort. */
124
+ function readConfiguredDefaults() {
125
+ try {
126
+ const cfg = loadConfig();
127
+ const mu = cfg.tools?.mediaUnderstanding;
128
+ if (!mu)
129
+ return {};
130
+ const out = {};
131
+ if (mu.models && typeof mu.models === "object") {
132
+ const models = {};
133
+ for (const [k, v] of Object.entries(mu.models)) {
134
+ if (typeof v === "string" && v.trim())
135
+ models[k] = v.trim();
136
+ }
137
+ if (Object.keys(models).length > 0)
138
+ out.defaultModels = models;
139
+ }
140
+ if (mu.providers && typeof mu.providers === "object") {
141
+ const providers = {};
142
+ for (const [k, v] of Object.entries(mu.providers)) {
143
+ if (v === "google" || v === "anthropic")
144
+ providers[k] = v;
145
+ }
146
+ if (Object.keys(providers).length > 0)
147
+ out.preferredProvider = providers;
148
+ }
149
+ return out;
150
+ }
151
+ catch {
152
+ return {};
153
+ }
154
+ }
155
+ /** True when a Pi `Model`-ish object declares image input. */
156
+ function modelHasImageInput(m) {
157
+ const input = m?.input;
158
+ return Array.isArray(input) && input.includes("image");
159
+ }
160
+ /**
161
+ * Build a Pi `ModelRegistry` from Brigade's auth + models.json, lazily and
162
+ * defensively. Returns `undefined` on any failure (the Pi path then can't
163
+ * resolve a model and the subsystem reports unavailable / falls back).
164
+ */
165
+ function buildRegistry(agentId) {
166
+ try {
167
+ const Registry = ModelRegistry;
168
+ if (!Registry)
169
+ return undefined;
170
+ const authStorage = loadBrigadeAuthStorage(agentId);
171
+ const modelsFile = resolveModelsPath(agentId);
172
+ const registry = typeof Registry.create === "function"
173
+ ? Registry.create(authStorage, modelsFile)
174
+ : new Registry(authStorage, modelsFile);
175
+ return registry;
176
+ }
177
+ catch {
178
+ return undefined;
179
+ }
180
+ }
181
+ /**
182
+ * Make a `resolveModel` closure for the Pi path. Given a provider id (+ kind),
183
+ * returns an image-capable Pi `Model` for that provider, or `undefined`.
184
+ *
185
+ * Resolution per provider:
186
+ * 1. A configured default model id for this kind that belongs to the provider
187
+ * (`registry.find(provider, id)`), when image-capable.
188
+ * 2. The first `registry.getAvailable()` model for the provider whose `input`
189
+ * includes "image".
190
+ * The registry (built once, memoized) covers Pi's built-in catalog + models.json
191
+ * + discovered Ollama models, so an image-capable model resolves for whichever
192
+ * provider the operator actually has.
193
+ */
194
+ function makeResolveModel(agentId, configuredModels) {
195
+ let registry;
196
+ let built = false;
197
+ const getRegistry = () => {
198
+ if (!built) {
199
+ registry = buildRegistry(agentId);
200
+ built = true;
201
+ }
202
+ return registry;
203
+ };
204
+ return (provider, kind) => {
205
+ const reg = getRegistry();
206
+ if (!reg)
207
+ return undefined;
208
+ const available = typeof reg.getAvailable === "function" ? safeGetAvailable(reg) : [];
209
+ // 1. Configured default model id for this kind, scoped to the provider.
210
+ const configuredId = configuredModels?.[kind]?.trim();
211
+ if (configuredId && provider && typeof reg.find === "function") {
212
+ let found;
213
+ try {
214
+ found = reg.find(provider, configuredId);
215
+ }
216
+ catch {
217
+ found = undefined;
218
+ }
219
+ // The Pi path can only carry an image block, so a configured model is
220
+ // eligible only when it declares image input — for EVERY kind. (Audio
221
+ // never resolves here: its provider chain excludes `pi`; this is the
222
+ // defensive backstop so a stray audio request can't pick a non-image
223
+ // model and 400 at the provider.)
224
+ if (found && modelHasImageInput(found)) {
225
+ return found;
226
+ }
227
+ }
228
+ // 2. First image-capable model for the provider (or, when no provider is
229
+ // pinned, the first image-capable model overall).
230
+ for (const m of available) {
231
+ const mp = m.provider;
232
+ if (provider && mp !== provider)
233
+ continue;
234
+ if (modelHasImageInput(m))
235
+ return m;
236
+ }
237
+ return undefined;
238
+ };
239
+ }
240
+ function safeGetAvailable(reg) {
241
+ try {
242
+ return reg.getAvailable?.() ?? [];
243
+ }
244
+ catch {
245
+ return [];
246
+ }
247
+ }
248
+ /**
249
+ * Build the `MediaUnderstandingConfig` the subsystem consumes, wired to
250
+ * Brigade's real credential store + config. `agentId` selects which agent's
251
+ * auth profiles back the key (defaults to `main`, with the main-agent fallback
252
+ * `readBrigadeCredentials` already applies for org agents).
253
+ *
254
+ * Wires the Pi path (`resolveModel` + `listKeyedProviders`) so image/audio
255
+ * understanding works for EVERY configured provider (OpenAI / OpenRouter / Groq
256
+ * / xAI / Mistral / Ollama / …), not just google + anthropic. `piComplete` is
257
+ * left at the subsystem default (the real `completeSimple` wrapper).
258
+ */
259
+ export function buildMediaUnderstandingConfig(agentId = DEFAULT_AGENT_ID) {
260
+ const configured = readConfiguredDefaults();
261
+ return {
262
+ resolveKey: (provider) => resolveMediaProviderKey(provider, agentId),
263
+ ...(configured.defaultModels ? { defaultModels: configured.defaultModels } : {}),
264
+ ...(configured.preferredProvider ? { preferredProvider: configured.preferredProvider } : {}),
265
+ resolveModel: makeResolveModel(agentId, configured.defaultModels),
266
+ listKeyedProviders: () => listKeyedPiProviders(agentId),
267
+ };
268
+ }
269
+ /**
270
+ * Quick capability probe for doctor/status: which providers have a key, and
271
+ * therefore which kinds can be understood via a provider. Pure read — no calls.
272
+ */
273
+ export function probeMediaUnderstanding(agentId = DEFAULT_AGENT_ID) {
274
+ const google = Boolean(resolveMediaProviderKey("google", agentId));
275
+ const anthropic = Boolean(resolveMediaProviderKey("anthropic", agentId));
276
+ // Image understanding is ALSO available via the Pi path whenever any non-
277
+ // google/anthropic provider is keyed (or a keyless local provider like
278
+ // Ollama is configured) — the real model-capability check happens at call
279
+ // time. Lightweight probe (no registry build) keeps `doctor` fast.
280
+ const piImage = listKeyedPiProviders(agentId).length > 0;
281
+ return {
282
+ google,
283
+ anthropic,
284
+ video: google,
285
+ pdf: anthropic || google,
286
+ image: anthropic || google || piImage,
287
+ };
288
+ }
289
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../../src/agents/media-understanding/config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,57 @@
1
+ /**
2
+ * Gemini (Google) media-understanding adapter — talks to the Generative
3
+ * Language REST API at `generativelanguage.googleapis.com/v1beta` directly.
4
+ *
5
+ * Two paths:
6
+ * • VIDEO → the Files API. Inline base64 caps out well below real video
7
+ * sizes, so video is UPLOADED first (resumable upload), POLLED until the
8
+ * file state flips to ACTIVE (Gemini transcodes/indexes asynchronously),
9
+ * then referenced from `generateContent` via a `file_data` part holding
10
+ * the returned `fileUri`. This is the only way large video works.
11
+ * • image / pdf → an inline `inline_data` part (base64) + the prompt, sent
12
+ * straight to `generateContent`. These are small enough to inline.
13
+ *
14
+ * The Google key rides in the query string (`?key=…`), matching Brigade's
15
+ * existing validator (`providers/validate-key.ts`) and the Gemini convention
16
+ * — there is no auth header. Every call takes an injectable `fetchFn` so the
17
+ * adapter is exercised with zero real network.
18
+ */
19
+ import { type MediaUnderstandingKind, type RunMediaUnderstandingResult } from "./types.js";
20
+ /** Canonical Gemini API base — keep on the trusted Google host. */
21
+ export declare const DEFAULT_GEMINI_BASE_URL = "https://generativelanguage.googleapis.com/v1beta";
22
+ /**
23
+ * Default models per kind. Current Gemini multimodal models that read video,
24
+ * images and PDFs. `gemini-2.5-flash` is the cheap/fast default; callers can
25
+ * override per call or via config.
26
+ */
27
+ export declare const DEFAULT_GEMINI_MODELS: Record<Exclude<MediaUnderstandingKind, "audio"> | "audio", string>;
28
+ export interface GeminiAdapterParams {
29
+ kind: MediaUnderstandingKind;
30
+ bytes: Buffer;
31
+ mimeType: string;
32
+ apiKey: string;
33
+ prompt?: string;
34
+ model?: string;
35
+ /** Max output tokens (clamped); omitted → the model's own default. */
36
+ maxTokens?: number;
37
+ baseUrl?: string;
38
+ fetchFn?: typeof fetch;
39
+ signal?: AbortSignal;
40
+ /** Test seam: replaces the real inter-poll delay so tests don't actually sleep. */
41
+ sleepFn?: (ms: number) => Promise<void>;
42
+ }
43
+ /**
44
+ * Strip a leading `models/` so callers can pass either `gemini-2.5-pro` or
45
+ * `models/gemini-2.5-pro`; we always rebuild the `models/<id>:method` path.
46
+ */
47
+ declare function normalizeModelId(model: string): string;
48
+ /** Extract the concatenated text from a generateContent response payload. */
49
+ declare function extractGeneratedText(payload: unknown): string;
50
+ /**
51
+ * Run a Gemini media-understanding request. Video goes through the Files API
52
+ * (upload → poll ACTIVE → generate); image/pdf go inline. Returns the model's
53
+ * textual answer.
54
+ */
55
+ export declare function runGemini(params: GeminiAdapterParams): Promise<RunMediaUnderstandingResult>;
56
+ export { extractGeneratedText, normalizeModelId };
57
+ //# sourceMappingURL=gemini-adapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gemini-adapter.d.ts","sourceRoot":"","sources":["../../../src/agents/media-understanding/gemini-adapter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,EAEN,KAAK,sBAAsB,EAC3B,KAAK,2BAA2B,EAChC,MAAM,YAAY,CAAC;AAEpB,mEAAmE;AACnE,eAAO,MAAM,uBAAuB,qDAAqD,CAAC;AAE1F;;;;GAIG;AACH,eAAO,MAAM,qBAAqB,EAAE,MAAM,CAAC,OAAO,CAAC,sBAAsB,EAAE,OAAO,CAAC,GAAG,OAAO,EAAE,MAAM,CAKpG,CAAC;AAkBF,MAAM,WAAW,mBAAmB;IACnC,IAAI,EAAE,sBAAsB,CAAC;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,sEAAsE;IACtE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,OAAO,KAAK,CAAC;IACvB,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,mFAAmF;IACnF,OAAO,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CACxC;AAgBD;;;GAGG;AACH,iBAAS,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAE/C;AAuBD,6EAA6E;AAC7E,iBAAS,oBAAoB,CAAC,OAAO,EAAE,OAAO,GAAG,MAAM,CAStD;AA2SD;;;;GAIG;AACH,wBAAsB,SAAS,CAAC,MAAM,EAAE,mBAAmB,GAAG,OAAO,CAAC,2BAA2B,CAAC,CAWjG;AAGD,OAAO,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,CAAC"}