@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.
- package/README.md +21 -0
- package/dist/agents/agent-loop.d.ts +55 -0
- package/dist/agents/agent-loop.d.ts.map +1 -1
- package/dist/agents/agent-loop.js +90 -1
- package/dist/agents/agent-loop.js.map +1 -1
- package/dist/agents/channels/inbound-pipeline.d.ts +22 -0
- package/dist/agents/channels/inbound-pipeline.d.ts.map +1 -1
- package/dist/agents/channels/inbound-pipeline.js +31 -1
- package/dist/agents/channels/inbound-pipeline.js.map +1 -1
- package/dist/agents/channels/media-capture.d.ts +69 -6
- package/dist/agents/channels/media-capture.d.ts.map +1 -1
- package/dist/agents/channels/media-capture.js +125 -8
- package/dist/agents/channels/media-capture.js.map +1 -1
- package/dist/agents/channels/telegram/media.d.ts.map +1 -1
- package/dist/agents/channels/telegram/media.js +16 -4
- package/dist/agents/channels/telegram/media.js.map +1 -1
- package/dist/agents/channels/whatsapp/media.d.ts +19 -0
- package/dist/agents/channels/whatsapp/media.d.ts.map +1 -1
- package/dist/agents/channels/whatsapp/media.js +37 -2
- package/dist/agents/channels/whatsapp/media.js.map +1 -1
- package/dist/agents/media-understanding/anthropic-adapter.d.ts +49 -0
- package/dist/agents/media-understanding/anthropic-adapter.d.ts.map +1 -0
- package/dist/agents/media-understanding/anthropic-adapter.js +162 -0
- package/dist/agents/media-understanding/anthropic-adapter.js.map +1 -0
- package/dist/agents/media-understanding/config.d.ts +57 -0
- package/dist/agents/media-understanding/config.d.ts.map +1 -0
- package/dist/agents/media-understanding/config.js +289 -0
- package/dist/agents/media-understanding/config.js.map +1 -0
- package/dist/agents/media-understanding/gemini-adapter.d.ts +57 -0
- package/dist/agents/media-understanding/gemini-adapter.d.ts.map +1 -0
- package/dist/agents/media-understanding/gemini-adapter.js +343 -0
- package/dist/agents/media-understanding/gemini-adapter.js.map +1 -0
- package/dist/agents/media-understanding/index.d.ts +58 -0
- package/dist/agents/media-understanding/index.d.ts.map +1 -0
- package/dist/agents/media-understanding/index.js +275 -0
- package/dist/agents/media-understanding/index.js.map +1 -0
- package/dist/agents/media-understanding/pi-adapter.d.ts +72 -0
- package/dist/agents/media-understanding/pi-adapter.d.ts.map +1 -0
- package/dist/agents/media-understanding/pi-adapter.js +160 -0
- package/dist/agents/media-understanding/pi-adapter.js.map +1 -0
- package/dist/agents/media-understanding/types.d.ts +189 -0
- package/dist/agents/media-understanding/types.d.ts.map +1 -0
- package/dist/agents/media-understanding/types.js +51 -0
- package/dist/agents/media-understanding/types.js.map +1 -0
- package/dist/agents/session-wiring.d.ts +11 -0
- package/dist/agents/session-wiring.d.ts.map +1 -1
- package/dist/agents/session-wiring.js +1 -0
- package/dist/agents/session-wiring.js.map +1 -1
- package/dist/agents/tools/analyze-media-tool.d.ts +263 -0
- package/dist/agents/tools/analyze-media-tool.d.ts.map +1 -0
- package/dist/agents/tools/analyze-media-tool.js +2321 -0
- package/dist/agents/tools/analyze-media-tool.js.map +1 -0
- package/dist/agents/tools/doc-shared.d.ts +187 -0
- package/dist/agents/tools/doc-shared.d.ts.map +1 -0
- package/dist/agents/tools/doc-shared.js +484 -0
- package/dist/agents/tools/doc-shared.js.map +1 -0
- package/dist/agents/tools/edit-document-tool.d.ts +133 -0
- package/dist/agents/tools/edit-document-tool.d.ts.map +1 -0
- package/dist/agents/tools/edit-document-tool.js +815 -0
- package/dist/agents/tools/edit-document-tool.js.map +1 -0
- package/dist/agents/tools/image-downscale.d.ts +93 -0
- package/dist/agents/tools/image-downscale.d.ts.map +1 -0
- package/dist/agents/tools/image-downscale.js +257 -0
- package/dist/agents/tools/image-downscale.js.map +1 -0
- package/dist/agents/tools/make-document-tool.d.ts +114 -0
- package/dist/agents/tools/make-document-tool.d.ts.map +1 -0
- package/dist/agents/tools/make-document-tool.js +542 -0
- package/dist/agents/tools/make-document-tool.js.map +1 -0
- package/dist/agents/tools/media-cache.d.ts +56 -0
- package/dist/agents/tools/media-cache.d.ts.map +1 -0
- package/dist/agents/tools/media-cache.js +133 -0
- package/dist/agents/tools/media-cache.js.map +1 -0
- package/dist/agents/tools/ooxml-images.d.ts +107 -0
- package/dist/agents/tools/ooxml-images.d.ts.map +1 -0
- package/dist/agents/tools/ooxml-images.js +308 -0
- package/dist/agents/tools/ooxml-images.js.map +1 -0
- package/dist/agents/tools/registry.d.ts +12 -0
- package/dist/agents/tools/registry.d.ts.map +1 -1
- package/dist/agents/tools/registry.js +47 -0
- package/dist/agents/tools/registry.js.map +1 -1
- package/dist/buildstamp.json +1 -1
- package/dist/cli/commands/doctor.d.ts.map +1 -1
- package/dist/cli/commands/doctor.js +41 -0
- package/dist/cli/commands/doctor.js.map +1 -1
- package/dist/cli/commands/expose.d.ts +40 -0
- package/dist/cli/commands/expose.d.ts.map +1 -0
- package/dist/cli/commands/expose.js +200 -0
- package/dist/cli/commands/expose.js.map +1 -0
- package/dist/cli/program/build-program.d.ts.map +1 -1
- package/dist/cli/program/build-program.js +61 -0
- package/dist/cli/program/build-program.js.map +1 -1
- package/dist/config/io.d.ts +41 -0
- package/dist/config/io.d.ts.map +1 -1
- package/dist/config/io.js.map +1 -1
- package/dist/core/console-stream.d.ts.map +1 -1
- package/dist/core/console-stream.js +7 -5
- package/dist/core/console-stream.js.map +1 -1
- package/dist/core/server.js +6 -1
- package/dist/core/server.js.map +1 -1
- package/dist/core/tunnel/auth-proxy.d.ts +55 -0
- package/dist/core/tunnel/auth-proxy.d.ts.map +1 -0
- package/dist/core/tunnel/auth-proxy.js +179 -0
- package/dist/core/tunnel/auth-proxy.js.map +1 -0
- package/dist/core/tunnel/manager.d.ts +42 -0
- package/dist/core/tunnel/manager.d.ts.map +1 -0
- package/dist/core/tunnel/manager.js +102 -0
- package/dist/core/tunnel/manager.js.map +1 -0
- package/dist/core/tunnel/providers/bore.d.ts +18 -0
- package/dist/core/tunnel/providers/bore.d.ts.map +1 -0
- package/dist/core/tunnel/providers/bore.js +117 -0
- package/dist/core/tunnel/providers/bore.js.map +1 -0
- package/dist/core/tunnel/providers/cloudflared.d.ts +24 -0
- package/dist/core/tunnel/providers/cloudflared.d.ts.map +1 -0
- package/dist/core/tunnel/providers/cloudflared.js +179 -0
- package/dist/core/tunnel/providers/cloudflared.js.map +1 -0
- package/dist/core/tunnel/providers/custom.d.ts +21 -0
- package/dist/core/tunnel/providers/custom.d.ts.map +1 -0
- package/dist/core/tunnel/providers/custom.js +124 -0
- package/dist/core/tunnel/providers/custom.js.map +1 -0
- package/dist/core/tunnel/registry.d.ts +15 -0
- package/dist/core/tunnel/registry.d.ts.map +1 -0
- package/dist/core/tunnel/registry.js +26 -0
- package/dist/core/tunnel/registry.js.map +1 -0
- package/dist/core/tunnel/state.d.ts +39 -0
- package/dist/core/tunnel/state.d.ts.map +1 -0
- package/dist/core/tunnel/state.js +57 -0
- package/dist/core/tunnel/state.js.map +1 -0
- package/dist/core/tunnel/types.d.ts +61 -0
- package/dist/core/tunnel/types.d.ts.map +1 -0
- package/dist/core/tunnel/types.js +20 -0
- package/dist/core/tunnel/types.js.map +1 -0
- package/dist/system-prompt/assembler.d.ts.map +1 -1
- package/dist/system-prompt/assembler.js +25 -1
- package/dist/system-prompt/assembler.js.map +1 -1
- package/dist/system-prompt/guidance.d.ts +30 -0
- package/dist/system-prompt/guidance.d.ts.map +1 -1
- package/dist/system-prompt/guidance.js +50 -0
- package/dist/system-prompt/guidance.js.map +1 -1
- package/package.json +13 -1
|
@@ -71,6 +71,34 @@ function extFromMime(mime) {
|
|
|
71
71
|
};
|
|
72
72
|
return known[right] ?? (right.replace(/[^\w]+/g, "") || "bin");
|
|
73
73
|
}
|
|
74
|
+
/**
|
|
75
|
+
* Pull a clean lowercase extension (no dot, alphanumeric) from a real filename,
|
|
76
|
+
* or "" when the name has none / it isn't a sane extension. WhatsApp documents
|
|
77
|
+
* carry their original `fileName`, which is the AUTHORITATIVE source of the file
|
|
78
|
+
* type — `mimetype` defaults to `application/octet-stream`, so deriving the
|
|
79
|
+
* on-disk extension from the MIME alone saves a `report.csv` as `.octetstream`
|
|
80
|
+
* (and any unmapped type — .csv/.txt/.json/.odt/.epub/.rtf/.ipynb — as garbage),
|
|
81
|
+
* which then makes `analyze_media` fail to detect a perfectly readable file.
|
|
82
|
+
*/
|
|
83
|
+
function extFromFileName(fileName) {
|
|
84
|
+
const name = (fileName ?? "").trim();
|
|
85
|
+
if (!name)
|
|
86
|
+
return "";
|
|
87
|
+
const dot = name.lastIndexOf(".");
|
|
88
|
+
if (dot < 0 || dot === name.length - 1)
|
|
89
|
+
return "";
|
|
90
|
+
const ext = name.slice(dot + 1).toLowerCase().replace(/[^a-z0-9]/g, "");
|
|
91
|
+
return /^[a-z0-9]{1,12}$/.test(ext) ? ext : "";
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Decide the on-disk file extension for a saved inbound attachment: prefer the
|
|
95
|
+
* real `fileName`'s extension (documents), fall back to the MIME map. Keeps the
|
|
96
|
+
* MIME-derived behaviour for media that carries no filename (image/video/audio
|
|
97
|
+
* — they never set `fileName`).
|
|
98
|
+
*/
|
|
99
|
+
function savedExt(mime, fileName) {
|
|
100
|
+
return extFromFileName(fileName) || extFromMime(mime);
|
|
101
|
+
}
|
|
74
102
|
/** The Baileys message envelopes Brigade extracts inbound media from. */
|
|
75
103
|
const MEDIA_FIELDS = [
|
|
76
104
|
{
|
|
@@ -142,6 +170,7 @@ export async function downloadInboundMedia(args) {
|
|
|
142
170
|
const mime = spec.mimeFromMessage?.(env);
|
|
143
171
|
if (!mime)
|
|
144
172
|
continue; // e.g. an audio envelope that's not actually a voice note
|
|
173
|
+
const fileName = spec.fileNameFromMessage?.(env);
|
|
145
174
|
try {
|
|
146
175
|
const bytes = await args.downloadMediaMessage(args.rawMessage, "buffer", {});
|
|
147
176
|
if (!bytes || bytes.length === 0)
|
|
@@ -163,7 +192,10 @@ export async function downloadInboundMedia(args) {
|
|
|
163
192
|
const dir = path.join(baseDir, "media", dayBucket());
|
|
164
193
|
mkdirSync(dir, { recursive: true });
|
|
165
194
|
const suffix = MEDIA_FIELDS.length > 1 ? `-${index}` : "";
|
|
166
|
-
|
|
195
|
+
// Prefer the document's real filename extension (its `mimetype` is often
|
|
196
|
+
// the generic application/octet-stream) so the saved file is detectable by
|
|
197
|
+
// analyze_media; fall back to the MIME map for filename-less media.
|
|
198
|
+
const filePath = path.join(dir, `${args.msgId}${suffix}.${savedExt(mime, fileName)}`);
|
|
167
199
|
writeFileSync(filePath, bytes, { mode: 0o600 });
|
|
168
200
|
enqueueMediaMirror({
|
|
169
201
|
messageId: args.msgId,
|
|
@@ -176,7 +208,7 @@ export async function downloadInboundMedia(args) {
|
|
|
176
208
|
kind: spec.kind,
|
|
177
209
|
path: filePath,
|
|
178
210
|
mimeType: mime,
|
|
179
|
-
fileName
|
|
211
|
+
fileName,
|
|
180
212
|
caption: spec.captionFromMessage?.(env),
|
|
181
213
|
});
|
|
182
214
|
}
|
|
@@ -189,4 +221,7 @@ export async function downloadInboundMedia(args) {
|
|
|
189
221
|
}
|
|
190
222
|
return out;
|
|
191
223
|
}
|
|
224
|
+
// Exported for tests — the filename/MIME → extension resolution that keeps an
|
|
225
|
+
// inbound document detectable by analyze_media.
|
|
226
|
+
export { extFromMime, extFromFileName, savedExt };
|
|
192
227
|
//# sourceMappingURL=media.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"media.js","sourceRoot":"","sources":["../../../../src/agents/channels/whatsapp/media.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"media.js","sourceRoot":"","sources":["../../../../src/agents/channels/whatsapp/media.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Anthropic media-understanding adapter — talks to the Messages API at
|
|
3
|
+
* `api.anthropic.com/v1/messages` directly.
|
|
4
|
+
*
|
|
5
|
+
* Two paths:
|
|
6
|
+
* • native / scanned PDF → a `document` content block
|
|
7
|
+
* `{ type:"document", source:{ type:"base64", media_type:"application/pdf",
|
|
8
|
+
* data } }` + the prompt. Anthropic ingests the PDF natively: it reads the
|
|
9
|
+
* text layer AND runs OCR over scanned pages, and it sees the page layout —
|
|
10
|
+
* so a scanned, no-text-layer PDF that `unpdf` can't read works here.
|
|
11
|
+
* • image → an `image` content block + the prompt.
|
|
12
|
+
*
|
|
13
|
+
* Auth follows Brigade's existing validator (`providers/validate-key.ts`):
|
|
14
|
+
* a normal console key (`sk-ant-api…`) uses `x-api-key`; an OAuth /
|
|
15
|
+
* setup-token (`sk-ant-oat…`) uses `Authorization: Bearer` + the OAuth beta
|
|
16
|
+
* gate. Both send `anthropic-version`. Every call takes an injectable
|
|
17
|
+
* `fetchFn` so the adapter is exercised with zero real network.
|
|
18
|
+
*/
|
|
19
|
+
import { type MediaUnderstandingKind, type RunMediaUnderstandingResult } from "./types.js";
|
|
20
|
+
/** Canonical Anthropic API base. */
|
|
21
|
+
export declare const DEFAULT_ANTHROPIC_BASE_URL = "https://api.anthropic.com/v1";
|
|
22
|
+
/** Default model — a current Claude model that reads images + documents. */
|
|
23
|
+
export declare const DEFAULT_ANTHROPIC_MODEL = "claude-sonnet-4-5";
|
|
24
|
+
export interface AnthropicAdapterParams {
|
|
25
|
+
kind: MediaUnderstandingKind;
|
|
26
|
+
bytes: Buffer;
|
|
27
|
+
mimeType: string;
|
|
28
|
+
apiKey: string;
|
|
29
|
+
prompt?: string;
|
|
30
|
+
model?: string;
|
|
31
|
+
/** Max output tokens (clamped); default {@link DEFAULT_MAX_TOKENS}. */
|
|
32
|
+
maxTokens?: number;
|
|
33
|
+
baseUrl?: string;
|
|
34
|
+
fetchFn?: typeof fetch;
|
|
35
|
+
signal?: AbortSignal;
|
|
36
|
+
}
|
|
37
|
+
/** Build the auth headers, branching on key shape (OAuth token vs console key). */
|
|
38
|
+
declare function buildAuthHeaders(apiKey: string): Record<string, string>;
|
|
39
|
+
/** Build the media content block for the request, per kind. */
|
|
40
|
+
declare function buildMediaBlock(params: AnthropicAdapterParams): Record<string, unknown>;
|
|
41
|
+
/** Extract the concatenated text from a Messages API response. */
|
|
42
|
+
declare function extractMessageText(payload: unknown): string;
|
|
43
|
+
/**
|
|
44
|
+
* Run an Anthropic media-understanding request. PDFs go as a `document` block
|
|
45
|
+
* (native + OCR), images as an `image` block. Returns the model's text answer.
|
|
46
|
+
*/
|
|
47
|
+
export declare function runAnthropic(params: AnthropicAdapterParams): Promise<RunMediaUnderstandingResult>;
|
|
48
|
+
export { extractMessageText, buildAuthHeaders, buildMediaBlock };
|
|
49
|
+
//# sourceMappingURL=anthropic-adapter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"anthropic-adapter.d.ts","sourceRoot":"","sources":["../../../src/agents/media-understanding/anthropic-adapter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,EAEN,KAAK,sBAAsB,EAC3B,KAAK,2BAA2B,EAChC,MAAM,YAAY,CAAC;AAEpB,oCAAoC;AACpC,eAAO,MAAM,0BAA0B,iCAAiC,CAAC;AAMzE,4EAA4E;AAC5E,eAAO,MAAM,uBAAuB,sBAAsB,CAAC;AAoB3D,MAAM,WAAW,sBAAsB;IACtC,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,uEAAuE;IACvE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,OAAO,KAAK,CAAC;IACvB,MAAM,CAAC,EAAE,WAAW,CAAC;CACrB;AAmBD,mFAAmF;AACnF,iBAAS,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAahE;AAED,+DAA+D;AAC/D,iBAAS,eAAe,CAAC,MAAM,EAAE,sBAAsB,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAahF;AAED,kEAAkE;AAClE,iBAAS,kBAAkB,CAAC,OAAO,EAAE,OAAO,GAAG,MAAM,CASpD;AAYD;;;GAGG;AACH,wBAAsB,YAAY,CACjC,MAAM,EAAE,sBAAsB,GAC5B,OAAO,CAAC,2BAA2B,CAAC,CAoDtC;AAGD,OAAO,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,eAAe,EAAE,CAAC"}
|
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Anthropic media-understanding adapter — talks to the Messages API at
|
|
3
|
+
* `api.anthropic.com/v1/messages` directly.
|
|
4
|
+
*
|
|
5
|
+
* Two paths:
|
|
6
|
+
* • native / scanned PDF → a `document` content block
|
|
7
|
+
* `{ type:"document", source:{ type:"base64", media_type:"application/pdf",
|
|
8
|
+
* data } }` + the prompt. Anthropic ingests the PDF natively: it reads the
|
|
9
|
+
* text layer AND runs OCR over scanned pages, and it sees the page layout —
|
|
10
|
+
* so a scanned, no-text-layer PDF that `unpdf` can't read works here.
|
|
11
|
+
* • image → an `image` content block + the prompt.
|
|
12
|
+
*
|
|
13
|
+
* Auth follows Brigade's existing validator (`providers/validate-key.ts`):
|
|
14
|
+
* a normal console key (`sk-ant-api…`) uses `x-api-key`; an OAuth /
|
|
15
|
+
* setup-token (`sk-ant-oat…`) uses `Authorization: Bearer` + the OAuth beta
|
|
16
|
+
* gate. Both send `anthropic-version`. Every call takes an injectable
|
|
17
|
+
* `fetchFn` so the adapter is exercised with zero real network.
|
|
18
|
+
*/
|
|
19
|
+
import { MediaUnderstandingProviderError, } from "./types.js";
|
|
20
|
+
/** Canonical Anthropic API base. */
|
|
21
|
+
export const DEFAULT_ANTHROPIC_BASE_URL = "https://api.anthropic.com/v1";
|
|
22
|
+
/** Anthropic API version header — matches the rest of the Brigade tree. */
|
|
23
|
+
const ANTHROPIC_VERSION = "2023-06-01";
|
|
24
|
+
/** OAuth beta gate used when authenticating with an `sk-ant-oat…` token. */
|
|
25
|
+
const ANTHROPIC_OAUTH_BETA = "oauth-2025-04-20";
|
|
26
|
+
/** Default model — a current Claude model that reads images + documents. */
|
|
27
|
+
export const DEFAULT_ANTHROPIC_MODEL = "claude-sonnet-4-5";
|
|
28
|
+
/** Default max tokens for the description response. Bounded — this is a summary, not a doc. */
|
|
29
|
+
const DEFAULT_MAX_TOKENS = 4096;
|
|
30
|
+
/** Hard ceiling on `maxTokens` so a caller can't request an unbounded answer. */
|
|
31
|
+
const MAX_TOKENS_CEILING = 32_000;
|
|
32
|
+
/** Clamp a caller `maxTokens` to a sane window; default when unset/invalid. */
|
|
33
|
+
function resolveMaxTokens(maxTokens) {
|
|
34
|
+
if (typeof maxTokens !== "number" || !Number.isFinite(maxTokens))
|
|
35
|
+
return DEFAULT_MAX_TOKENS;
|
|
36
|
+
return Math.max(256, Math.min(MAX_TOKENS_CEILING, Math.floor(maxTokens)));
|
|
37
|
+
}
|
|
38
|
+
const GENERATE_TIMEOUT_MS = 180_000;
|
|
39
|
+
const DEFAULT_PROMPTS = {
|
|
40
|
+
pdf: "Read this document and summarize its contents, preserving key facts, figures, tables, and structure.",
|
|
41
|
+
image: "Describe this image in detail.",
|
|
42
|
+
};
|
|
43
|
+
function resolveModel(model) {
|
|
44
|
+
return model?.trim() || DEFAULT_ANTHROPIC_MODEL;
|
|
45
|
+
}
|
|
46
|
+
function resolvePrompt(kind, prompt) {
|
|
47
|
+
const trimmed = prompt?.trim();
|
|
48
|
+
if (trimmed)
|
|
49
|
+
return trimmed;
|
|
50
|
+
return DEFAULT_PROMPTS[kind] ?? "Describe the attached media in detail.";
|
|
51
|
+
}
|
|
52
|
+
/** Compose the caller signal with a per-request timeout. */
|
|
53
|
+
function withTimeout(signal, ms) {
|
|
54
|
+
const timeoutSignal = AbortSignal.timeout(ms);
|
|
55
|
+
if (!signal)
|
|
56
|
+
return timeoutSignal;
|
|
57
|
+
return AbortSignal.any([signal, timeoutSignal]);
|
|
58
|
+
}
|
|
59
|
+
/** Build the auth headers, branching on key shape (OAuth token vs console key). */
|
|
60
|
+
function buildAuthHeaders(apiKey) {
|
|
61
|
+
const isOAuth = apiKey.includes("sk-ant-oat");
|
|
62
|
+
if (isOAuth) {
|
|
63
|
+
return {
|
|
64
|
+
authorization: `Bearer ${apiKey}`,
|
|
65
|
+
"anthropic-version": ANTHROPIC_VERSION,
|
|
66
|
+
"anthropic-beta": ANTHROPIC_OAUTH_BETA,
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
return {
|
|
70
|
+
"x-api-key": apiKey,
|
|
71
|
+
"anthropic-version": ANTHROPIC_VERSION,
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
/** Build the media content block for the request, per kind. */
|
|
75
|
+
function buildMediaBlock(params) {
|
|
76
|
+
const data = params.bytes.toString("base64");
|
|
77
|
+
if (params.kind === "pdf") {
|
|
78
|
+
return {
|
|
79
|
+
type: "document",
|
|
80
|
+
source: { type: "base64", media_type: "application/pdf", data },
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
// image
|
|
84
|
+
return {
|
|
85
|
+
type: "image",
|
|
86
|
+
source: { type: "base64", media_type: params.mimeType, data },
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
/** Extract the concatenated text from a Messages API response. */
|
|
90
|
+
function extractMessageText(payload) {
|
|
91
|
+
const content = payload?.content;
|
|
92
|
+
if (!Array.isArray(content))
|
|
93
|
+
return "";
|
|
94
|
+
return content
|
|
95
|
+
.filter((b) => b?.type === "text" && typeof b.text === "string")
|
|
96
|
+
.map((b) => (b.text ?? "").trim())
|
|
97
|
+
.filter(Boolean)
|
|
98
|
+
.join("\n")
|
|
99
|
+
.trim();
|
|
100
|
+
}
|
|
101
|
+
async function readErrorMessage(res) {
|
|
102
|
+
try {
|
|
103
|
+
const body = (await res.json());
|
|
104
|
+
if (body?.error?.message)
|
|
105
|
+
return body.error.message;
|
|
106
|
+
}
|
|
107
|
+
catch {
|
|
108
|
+
/* fall through */
|
|
109
|
+
}
|
|
110
|
+
return `HTTP ${res.status}`;
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* Run an Anthropic media-understanding request. PDFs go as a `document` block
|
|
114
|
+
* (native + OCR), images as an `image` block. Returns the model's text answer.
|
|
115
|
+
*/
|
|
116
|
+
export async function runAnthropic(params) {
|
|
117
|
+
if (!params.apiKey) {
|
|
118
|
+
throw new MediaUnderstandingProviderError("anthropic", "No Anthropic API key configured.");
|
|
119
|
+
}
|
|
120
|
+
if (params.kind !== "pdf" && params.kind !== "image") {
|
|
121
|
+
throw new MediaUnderstandingProviderError("anthropic", `Anthropic media understanding supports image + pdf only (got ${params.kind}).`);
|
|
122
|
+
}
|
|
123
|
+
const fetchFn = params.fetchFn ?? fetch;
|
|
124
|
+
const baseUrl = (params.baseUrl ?? DEFAULT_ANTHROPIC_BASE_URL).replace(/\/+$/, "");
|
|
125
|
+
const model = resolveModel(params.model);
|
|
126
|
+
const prompt = resolvePrompt(params.kind, params.prompt);
|
|
127
|
+
const url = `${baseUrl}/messages`;
|
|
128
|
+
const body = {
|
|
129
|
+
model,
|
|
130
|
+
max_tokens: resolveMaxTokens(params.maxTokens),
|
|
131
|
+
messages: [
|
|
132
|
+
{
|
|
133
|
+
role: "user",
|
|
134
|
+
content: [buildMediaBlock(params), { type: "text", text: prompt }],
|
|
135
|
+
},
|
|
136
|
+
],
|
|
137
|
+
};
|
|
138
|
+
let res;
|
|
139
|
+
try {
|
|
140
|
+
res = await fetchFn(url, {
|
|
141
|
+
method: "POST",
|
|
142
|
+
headers: { ...buildAuthHeaders(params.apiKey), "content-type": "application/json" },
|
|
143
|
+
body: JSON.stringify(body),
|
|
144
|
+
signal: withTimeout(params.signal, GENERATE_TIMEOUT_MS),
|
|
145
|
+
});
|
|
146
|
+
}
|
|
147
|
+
catch (err) {
|
|
148
|
+
throw new MediaUnderstandingProviderError("anthropic", `Anthropic request failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
149
|
+
}
|
|
150
|
+
if (!res.ok) {
|
|
151
|
+
throw new MediaUnderstandingProviderError("anthropic", `Anthropic error: ${await readErrorMessage(res)}`, res.status);
|
|
152
|
+
}
|
|
153
|
+
const payload = await res.json().catch(() => ({}));
|
|
154
|
+
const text = extractMessageText(payload);
|
|
155
|
+
if (!text) {
|
|
156
|
+
throw new MediaUnderstandingProviderError("anthropic", "Anthropic returned no text for the media.");
|
|
157
|
+
}
|
|
158
|
+
return { text, provider: "anthropic", model };
|
|
159
|
+
}
|
|
160
|
+
// Exported for tests.
|
|
161
|
+
export { extractMessageText, buildAuthHeaders, buildMediaBlock };
|
|
162
|
+
//# sourceMappingURL=anthropic-adapter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"anthropic-adapter.js","sourceRoot":"","sources":["../../../src/agents/media-understanding/anthropic-adapter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,57 @@
|
|
|
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 type { MediaUnderstandingConfig } from "./types.js";
|
|
17
|
+
/**
|
|
18
|
+
* Resolve a provider's key for media understanding. Order:
|
|
19
|
+
* 1. Brigade credential store (`readBrigadeCredentials`) — api_key.key, or
|
|
20
|
+
* an oauth credential's access token (so subscription login works).
|
|
21
|
+
* 2. The provider's env var(s) — explicit overrides above, else the catalog's
|
|
22
|
+
* `envVar` + `envVarFallbacks` for that provider.
|
|
23
|
+
* Returns "" when nothing resolves (keyless local providers also return "").
|
|
24
|
+
*/
|
|
25
|
+
export declare function resolveMediaProviderKey(provider: string, agentId?: string): string;
|
|
26
|
+
/**
|
|
27
|
+
* Providers (catalog ids) that currently have a usable credential for the Pi
|
|
28
|
+
* path, MOST-PREFERRED first. A keyless local provider (Ollama) qualifies when
|
|
29
|
+
* its server is configured (we treat it as always-eligible — the real call
|
|
30
|
+
* surfaces an unreachable error). `google`/`anthropic` are excluded (the
|
|
31
|
+
* bespoke adapters own them); the Pi path is the catch-all for the rest.
|
|
32
|
+
*/
|
|
33
|
+
export declare function listKeyedPiProviders(agentId?: string): string[];
|
|
34
|
+
/**
|
|
35
|
+
* Build the `MediaUnderstandingConfig` the subsystem consumes, wired to
|
|
36
|
+
* Brigade's real credential store + config. `agentId` selects which agent's
|
|
37
|
+
* auth profiles back the key (defaults to `main`, with the main-agent fallback
|
|
38
|
+
* `readBrigadeCredentials` already applies for org agents).
|
|
39
|
+
*
|
|
40
|
+
* Wires the Pi path (`resolveModel` + `listKeyedProviders`) so image/audio
|
|
41
|
+
* understanding works for EVERY configured provider (OpenAI / OpenRouter / Groq
|
|
42
|
+
* / xAI / Mistral / Ollama / …), not just google + anthropic. `piComplete` is
|
|
43
|
+
* left at the subsystem default (the real `completeSimple` wrapper).
|
|
44
|
+
*/
|
|
45
|
+
export declare function buildMediaUnderstandingConfig(agentId?: string): MediaUnderstandingConfig;
|
|
46
|
+
/**
|
|
47
|
+
* Quick capability probe for doctor/status: which providers have a key, and
|
|
48
|
+
* therefore which kinds can be understood via a provider. Pure read — no calls.
|
|
49
|
+
*/
|
|
50
|
+
export declare function probeMediaUnderstanding(agentId?: string): {
|
|
51
|
+
google: boolean;
|
|
52
|
+
anthropic: boolean;
|
|
53
|
+
video: boolean;
|
|
54
|
+
pdf: boolean;
|
|
55
|
+
image: boolean;
|
|
56
|
+
};
|
|
57
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../../src/agents/media-understanding/config.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAQH,OAAO,KAAK,EACX,wBAAwB,EAIxB,MAAM,YAAY,CAAC;AA6BpB;;;;;;;GAOG;AACH,wBAAgB,uBAAuB,CACtC,QAAQ,EAAE,MAAM,EAChB,OAAO,GAAE,MAAyB,GAChC,MAAM,CAyBR;AAeD;;;;;;GAMG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,GAAE,MAAyB,GAAG,MAAM,EAAE,CAoBjF;AAkJD;;;;;;;;;;GAUG;AACH,wBAAgB,6BAA6B,CAC5C,OAAO,GAAE,MAAyB,GAChC,wBAAwB,CAS1B;AAED;;;GAGG;AACH,wBAAgB,uBAAuB,CAAC,OAAO,GAAE,MAAyB,GAAG;IAC5E,MAAM,EAAE,OAAO,CAAC;IAChB,SAAS,EAAE,OAAO,CAAC;IACnB,KAAK,EAAE,OAAO,CAAC;IACf,GAAG,EAAE,OAAO,CAAC;IACb,KAAK,EAAE,OAAO,CAAC;CACf,CAeA"}
|