braintrust 3.31.0 → 3.32.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/dev/dist/index.d.mts +736 -0
- package/dev/dist/index.d.ts +736 -0
- package/dev/dist/index.js +1280 -428
- package/dev/dist/index.mjs +859 -7
- package/dist/apply-auto-instrumentation.js +281 -216
- package/dist/apply-auto-instrumentation.mjs +66 -1
- package/dist/auto-instrumentations/bundler/esbuild.cjs +104 -2
- package/dist/auto-instrumentations/bundler/esbuild.mjs +2 -2
- package/dist/auto-instrumentations/bundler/next.cjs +104 -2
- package/dist/auto-instrumentations/bundler/next.mjs +3 -3
- package/dist/auto-instrumentations/bundler/rollup.cjs +104 -2
- package/dist/auto-instrumentations/bundler/rollup.mjs +2 -2
- package/dist/auto-instrumentations/bundler/vite.cjs +104 -2
- package/dist/auto-instrumentations/bundler/vite.mjs +2 -2
- package/dist/auto-instrumentations/bundler/webpack-loader.cjs +104 -2
- package/dist/auto-instrumentations/bundler/webpack.cjs +104 -2
- package/dist/auto-instrumentations/bundler/webpack.mjs +3 -3
- package/dist/auto-instrumentations/{chunk-U64OYU4Q.mjs → chunk-AFND2U7E.mjs} +38 -1
- package/dist/auto-instrumentations/{chunk-OXINGIEZ.mjs → chunk-QEEPRBIS.mjs} +1 -1
- package/dist/auto-instrumentations/{chunk-LW4HDHXT.mjs → chunk-RI4Y55ZF.mjs} +69 -2
- package/dist/auto-instrumentations/hook.mjs +124 -3
- package/dist/auto-instrumentations/index.cjs +39 -1
- package/dist/auto-instrumentations/index.d.mts +3 -1
- package/dist/auto-instrumentations/index.d.ts +3 -1
- package/dist/auto-instrumentations/index.mjs +3 -1
- package/dist/browser.d.mts +2124 -2
- package/dist/browser.d.ts +2124 -2
- package/dist/browser.js +994 -10
- package/dist/browser.mjs +994 -10
- package/dist/{chunk-AJT4FR25.mjs → chunk-4QSAHP7D.mjs} +818 -5
- package/dist/{chunk-4AQGZS6X.js → chunk-AW4QECG5.js} +47 -4
- package/dist/{chunk-V32LW47Z.js → chunk-BTRLPQG5.js} +1663 -850
- package/dist/{chunk-CE3BLB2L.mjs → chunk-WV6QZI2W.mjs} +46 -3
- package/dist/cli.js +923 -8
- package/dist/edge-light.d.mts +1 -1
- package/dist/edge-light.d.ts +1 -1
- package/dist/edge-light.js +994 -10
- package/dist/edge-light.mjs +994 -10
- package/dist/index.d.mts +2124 -2
- package/dist/index.d.ts +2124 -2
- package/dist/index.js +581 -447
- package/dist/index.mjs +136 -2
- package/dist/instrumentation/index.d.mts +434 -0
- package/dist/instrumentation/index.d.ts +434 -0
- package/dist/instrumentation/index.js +859 -7
- package/dist/instrumentation/index.mjs +859 -7
- package/dist/vitest-evals-reporter.js +16 -16
- package/dist/vitest-evals-reporter.mjs +2 -2
- package/dist/workerd.d.mts +1 -1
- package/dist/workerd.d.ts +1 -1
- package/dist/workerd.js +994 -10
- package/dist/workerd.mjs +994 -10
- package/package.json +1 -1
- package/util/dist/index.d.mts +326 -0
- package/util/dist/index.d.ts +326 -0
package/dist/browser.js
CHANGED
|
@@ -192,9 +192,11 @@ __export(browser_exports, {
|
|
|
192
192
|
wrapCohere: () => wrapCohere,
|
|
193
193
|
wrapCopilotClient: () => wrapCopilotClient,
|
|
194
194
|
wrapCursorSDK: () => wrapCursorSDK,
|
|
195
|
+
wrapElevenLabs: () => wrapElevenLabs,
|
|
195
196
|
wrapGenkit: () => wrapGenkit,
|
|
196
197
|
wrapGoogleADK: () => wrapGoogleADK,
|
|
197
198
|
wrapGoogleGenAI: () => wrapGoogleGenAI,
|
|
199
|
+
wrapGoogleGenerativeAI: () => wrapGoogleGenerativeAI,
|
|
198
200
|
wrapGroq: () => wrapGroq,
|
|
199
201
|
wrapHuggingFace: () => wrapHuggingFace,
|
|
200
202
|
wrapHuggingFaceTransformers: () => wrapHuggingFaceTransformers,
|
|
@@ -3028,6 +3030,14 @@ var ChatCompletionContentPartImageWithTitle = import_v36.z.object({
|
|
|
3028
3030
|
ttl: import_v36.z.enum(["5m", "1h"]).optional()
|
|
3029
3031
|
}).optional()
|
|
3030
3032
|
});
|
|
3033
|
+
var ChatCompletionContentPartInputAudioWithTitle = import_v36.z.object({
|
|
3034
|
+
input_audio: import_v36.z.object({ data: import_v36.z.string(), format: import_v36.z.enum(["wav", "mp3"]) }),
|
|
3035
|
+
type: import_v36.z.literal("input_audio"),
|
|
3036
|
+
cache_control: import_v36.z.object({
|
|
3037
|
+
type: import_v36.z.literal("ephemeral"),
|
|
3038
|
+
ttl: import_v36.z.enum(["5m", "1h"]).optional()
|
|
3039
|
+
}).optional()
|
|
3040
|
+
});
|
|
3031
3041
|
var ChatCompletionContentPartFileFile = import_v36.z.object({ file_data: import_v36.z.string(), filename: import_v36.z.string(), file_id: import_v36.z.string() }).partial();
|
|
3032
3042
|
var ChatCompletionContentPartFileWithTitle = import_v36.z.object({
|
|
3033
3043
|
file: ChatCompletionContentPartFileFile,
|
|
@@ -3040,6 +3050,7 @@ var ChatCompletionContentPartFileWithTitle = import_v36.z.object({
|
|
|
3040
3050
|
var ChatCompletionContentPart = import_v36.z.union([
|
|
3041
3051
|
ChatCompletionContentPartTextWithTitle,
|
|
3042
3052
|
ChatCompletionContentPartImageWithTitle,
|
|
3053
|
+
ChatCompletionContentPartInputAudioWithTitle,
|
|
3043
3054
|
ChatCompletionContentPartFileWithTitle
|
|
3044
3055
|
]);
|
|
3045
3056
|
var ChatCompletionContentPartText = import_v36.z.object({
|
|
@@ -5865,6 +5876,7 @@ var INSTRUMENTATION_NAMES = {
|
|
|
5865
5876
|
GENKIT: "genkit",
|
|
5866
5877
|
GITHUB_COPILOT: "github-copilot",
|
|
5867
5878
|
GOOGLE_ADK: "google-adk",
|
|
5879
|
+
GOOGLE_GENERATIVE_AI: "google-generative-ai",
|
|
5868
5880
|
GOOGLE_GENAI: "google-genai",
|
|
5869
5881
|
GROQ: "groq",
|
|
5870
5882
|
HUGGINGFACE: "huggingface",
|
|
@@ -5880,12 +5892,13 @@ var INSTRUMENTATION_NAMES = {
|
|
|
5880
5892
|
OPENROUTER_AGENT: "openrouter-agent",
|
|
5881
5893
|
PI_CODING_AGENT: "pi-coding-agent",
|
|
5882
5894
|
STRANDS_AGENT_SDK: "strands-agent-sdk",
|
|
5883
|
-
VOYAGEAI: "voyageai"
|
|
5895
|
+
VOYAGEAI: "voyageai",
|
|
5896
|
+
ELEVENLABS: "elevenlabs"
|
|
5884
5897
|
};
|
|
5885
5898
|
var INTERNAL_SPAN_INSTRUMENTATION_NAME = /* @__PURE__ */ Symbol.for(
|
|
5886
5899
|
"braintrust.spanInstrumentationName"
|
|
5887
5900
|
);
|
|
5888
|
-
var SDK_VERSION = true ? "3.
|
|
5901
|
+
var SDK_VERSION = true ? "3.32.0" : "0.0.0";
|
|
5889
5902
|
function withSpanInstrumentationName(args, instrumentationName) {
|
|
5890
5903
|
return {
|
|
5891
5904
|
...args,
|
|
@@ -11843,6 +11856,16 @@ function renderMessageImpl(render, message, variables) {
|
|
|
11843
11856
|
}
|
|
11844
11857
|
}
|
|
11845
11858
|
];
|
|
11859
|
+
case "input_audio":
|
|
11860
|
+
return [
|
|
11861
|
+
{
|
|
11862
|
+
...c,
|
|
11863
|
+
input_audio: {
|
|
11864
|
+
...c.input_audio,
|
|
11865
|
+
data: render(c.input_audio.data)
|
|
11866
|
+
}
|
|
11867
|
+
}
|
|
11868
|
+
];
|
|
11846
11869
|
case "file":
|
|
11847
11870
|
return [
|
|
11848
11871
|
{
|
|
@@ -24443,6 +24466,342 @@ var OpenAIAgentsPlugin = class extends BasePlugin {
|
|
|
24443
24466
|
}
|
|
24444
24467
|
};
|
|
24445
24468
|
|
|
24469
|
+
// src/instrumentation/plugins/google-generative-ai-channels.ts
|
|
24470
|
+
var googleGenerativeAIChannels = defineChannels(
|
|
24471
|
+
"@google/generative-ai",
|
|
24472
|
+
{
|
|
24473
|
+
generateContent: channel({ channelName: "GenerativeModel.generateContent", kind: "async" }),
|
|
24474
|
+
generateContentStream: channel({ channelName: "GenerativeModel.generateContentStream", kind: "async" }),
|
|
24475
|
+
embedContent: channel({ channelName: "GenerativeModel.embedContent", kind: "async" }),
|
|
24476
|
+
batchEmbedContents: channel({ channelName: "GenerativeModel.batchEmbedContents", kind: "async" }),
|
|
24477
|
+
sendMessage: channel({ channelName: "ChatSession.sendMessage", kind: "async" }),
|
|
24478
|
+
sendMessageStream: channel({ channelName: "ChatSession.sendMessageStream", kind: "async" })
|
|
24479
|
+
},
|
|
24480
|
+
{ instrumentationName: INSTRUMENTATION_NAMES.GOOGLE_GENERATIVE_AI }
|
|
24481
|
+
);
|
|
24482
|
+
|
|
24483
|
+
// src/instrumentation/plugins/google-generative-ai-plugin.ts
|
|
24484
|
+
var GENERATION_CONFIG_KEYS = [
|
|
24485
|
+
"temperature",
|
|
24486
|
+
"topP",
|
|
24487
|
+
"topK",
|
|
24488
|
+
"candidateCount",
|
|
24489
|
+
"maxOutputTokens",
|
|
24490
|
+
"stopSequences",
|
|
24491
|
+
"responseMimeType",
|
|
24492
|
+
"responseSchema",
|
|
24493
|
+
"presencePenalty",
|
|
24494
|
+
"frequencyPenalty",
|
|
24495
|
+
"responseLogprobs",
|
|
24496
|
+
"logprobs",
|
|
24497
|
+
"thinkingConfig"
|
|
24498
|
+
];
|
|
24499
|
+
var GoogleGenerativeAIPlugin = class extends BasePlugin {
|
|
24500
|
+
onEnable() {
|
|
24501
|
+
this.unsubscribers.push(
|
|
24502
|
+
interceptCall(
|
|
24503
|
+
googleGenerativeAIChannels.generateContent,
|
|
24504
|
+
"generateContent"
|
|
24505
|
+
),
|
|
24506
|
+
interceptCall(
|
|
24507
|
+
googleGenerativeAIChannels.generateContentStream,
|
|
24508
|
+
"generateContentStream"
|
|
24509
|
+
),
|
|
24510
|
+
interceptCall(googleGenerativeAIChannels.sendMessage, "sendMessage"),
|
|
24511
|
+
interceptCall(
|
|
24512
|
+
googleGenerativeAIChannels.sendMessageStream,
|
|
24513
|
+
"sendMessageStream"
|
|
24514
|
+
),
|
|
24515
|
+
interceptCall(googleGenerativeAIChannels.embedContent, "embedContent"),
|
|
24516
|
+
interceptCall(
|
|
24517
|
+
googleGenerativeAIChannels.batchEmbedContents,
|
|
24518
|
+
"batchEmbedContents"
|
|
24519
|
+
)
|
|
24520
|
+
);
|
|
24521
|
+
}
|
|
24522
|
+
onDisable() {
|
|
24523
|
+
this.unsubscribers = unsubscribeAll(this.unsubscribers);
|
|
24524
|
+
}
|
|
24525
|
+
};
|
|
24526
|
+
function interceptCall(channel2, operation) {
|
|
24527
|
+
return channel2.intercept((target, thisArg, args) => {
|
|
24528
|
+
const invokeTarget = () => Reflect.apply(target, thisArg, args);
|
|
24529
|
+
if (isAutoInstrumentationSuppressed()) return invokeTarget();
|
|
24530
|
+
const self = thisArg;
|
|
24531
|
+
const chat = operation.startsWith("sendMessage");
|
|
24532
|
+
const embedding = operation === "embedContent" || operation === "batchEmbedContents";
|
|
24533
|
+
const start = getCurrentUnixTimestamp();
|
|
24534
|
+
let span;
|
|
24535
|
+
try {
|
|
24536
|
+
span = startSpan(
|
|
24537
|
+
withSpanInstrumentationName(
|
|
24538
|
+
{
|
|
24539
|
+
name: embedding ? operation === "embedContent" ? "embed_content" : "batch_embed_contents" : "generate_content",
|
|
24540
|
+
spanAttributes: { type: "llm" /* LLM */ },
|
|
24541
|
+
event: extractInput(self, args[0], operation)
|
|
24542
|
+
},
|
|
24543
|
+
INSTRUMENTATION_NAMES.GOOGLE_GENERATIVE_AI
|
|
24544
|
+
)
|
|
24545
|
+
);
|
|
24546
|
+
} catch (error) {
|
|
24547
|
+
debugLogger.error("Error starting Google Generative AI span:", error);
|
|
24548
|
+
return invokeTarget();
|
|
24549
|
+
}
|
|
24550
|
+
let ended = false;
|
|
24551
|
+
const finish = (log3) => {
|
|
24552
|
+
if (ended) return;
|
|
24553
|
+
ended = true;
|
|
24554
|
+
try {
|
|
24555
|
+
log3();
|
|
24556
|
+
} catch (error) {
|
|
24557
|
+
debugLogger.error("Error logging Google Generative AI span:", error);
|
|
24558
|
+
}
|
|
24559
|
+
try {
|
|
24560
|
+
span.end();
|
|
24561
|
+
} catch (error) {
|
|
24562
|
+
debugLogger.error("Error ending Google Generative AI span:", error);
|
|
24563
|
+
}
|
|
24564
|
+
};
|
|
24565
|
+
if (chat) {
|
|
24566
|
+
try {
|
|
24567
|
+
void self._sendPromise.then(
|
|
24568
|
+
() => {
|
|
24569
|
+
try {
|
|
24570
|
+
span.log(extractInput(self, args[0], operation));
|
|
24571
|
+
} catch (error) {
|
|
24572
|
+
debugLogger.error("Error capturing Google chat history:", error);
|
|
24573
|
+
}
|
|
24574
|
+
},
|
|
24575
|
+
() => {
|
|
24576
|
+
}
|
|
24577
|
+
);
|
|
24578
|
+
} catch (error) {
|
|
24579
|
+
debugLogger.error("Error observing Google chat history:", error);
|
|
24580
|
+
}
|
|
24581
|
+
}
|
|
24582
|
+
let result;
|
|
24583
|
+
try {
|
|
24584
|
+
result = withCurrent(
|
|
24585
|
+
span,
|
|
24586
|
+
() => runWithAutoInstrumentationSuppressed(invokeTarget)
|
|
24587
|
+
);
|
|
24588
|
+
} catch (error) {
|
|
24589
|
+
finish(() => span.log({ error }));
|
|
24590
|
+
throw error;
|
|
24591
|
+
}
|
|
24592
|
+
void Promise.resolve(result).then(
|
|
24593
|
+
(value) => {
|
|
24594
|
+
try {
|
|
24595
|
+
if ("stream" in value) {
|
|
24596
|
+
let firstToken = false;
|
|
24597
|
+
const partial = { candidates: [] };
|
|
24598
|
+
const candidates = /* @__PURE__ */ new Map();
|
|
24599
|
+
patchStreamIfNeeded(value.stream, {
|
|
24600
|
+
aroundNext: (callback) => withCurrent(span, callback),
|
|
24601
|
+
onChunk: (chunk) => {
|
|
24602
|
+
for (const candidate of chunk.candidates ?? []) {
|
|
24603
|
+
const index = candidate.index ?? 0;
|
|
24604
|
+
const previous = candidates.get(index);
|
|
24605
|
+
const parts = [...previous?.content?.parts ?? []];
|
|
24606
|
+
for (const part of candidate.content?.parts ?? []) {
|
|
24607
|
+
const last = parts[parts.length - 1];
|
|
24608
|
+
if (part.text !== void 0 && last?.text !== void 0) {
|
|
24609
|
+
parts[parts.length - 1] = {
|
|
24610
|
+
...last,
|
|
24611
|
+
text: last.text + part.text
|
|
24612
|
+
};
|
|
24613
|
+
} else parts.push(part);
|
|
24614
|
+
}
|
|
24615
|
+
candidates.set(index, {
|
|
24616
|
+
...previous,
|
|
24617
|
+
...candidate,
|
|
24618
|
+
content: {
|
|
24619
|
+
role: candidate.content?.role ?? previous?.content?.role ?? "model",
|
|
24620
|
+
parts
|
|
24621
|
+
}
|
|
24622
|
+
});
|
|
24623
|
+
}
|
|
24624
|
+
partial.candidates = Array.from(candidates.values());
|
|
24625
|
+
if (chunk.usageMetadata)
|
|
24626
|
+
partial.usageMetadata = chunk.usageMetadata;
|
|
24627
|
+
if (!firstToken && chunk.candidates?.some(
|
|
24628
|
+
(candidate) => candidate.content?.parts.some(
|
|
24629
|
+
(part) => part.text !== void 0 ? part.text.length > 0 : Object.keys(part).length > 0
|
|
24630
|
+
)
|
|
24631
|
+
)) {
|
|
24632
|
+
firstToken = true;
|
|
24633
|
+
span.log({
|
|
24634
|
+
metrics: {
|
|
24635
|
+
time_to_first_token: getCurrentUnixTimestamp() - start
|
|
24636
|
+
}
|
|
24637
|
+
});
|
|
24638
|
+
}
|
|
24639
|
+
},
|
|
24640
|
+
onComplete: () => {
|
|
24641
|
+
},
|
|
24642
|
+
onError: (error) => finish(() => {
|
|
24643
|
+
logResponse(span, partial);
|
|
24644
|
+
span.log({ error });
|
|
24645
|
+
}),
|
|
24646
|
+
onCancel: () => finish(() => logResponse(span, partial))
|
|
24647
|
+
});
|
|
24648
|
+
void value.response.then(
|
|
24649
|
+
(response) => finish(() => logResponse(span, response)),
|
|
24650
|
+
(error) => finish(() => {
|
|
24651
|
+
logResponse(span, partial);
|
|
24652
|
+
span.log({ error });
|
|
24653
|
+
})
|
|
24654
|
+
);
|
|
24655
|
+
} else if ("response" in value) {
|
|
24656
|
+
finish(() => logResponse(span, value.response));
|
|
24657
|
+
} else {
|
|
24658
|
+
const metrics = {};
|
|
24659
|
+
const promptTokens = value.usageMetadata?.promptTokenCount;
|
|
24660
|
+
if (typeof promptTokens === "number" && Number.isFinite(promptTokens) && promptTokens >= 0) {
|
|
24661
|
+
metrics.prompt_tokens = promptTokens;
|
|
24662
|
+
metrics.tokens = promptTokens;
|
|
24663
|
+
}
|
|
24664
|
+
for (const detail of value.usageMetadata?.promptTokenDetails ?? []) {
|
|
24665
|
+
if (detail.modality === "AUDIO" && typeof detail.tokenCount === "number" && Number.isFinite(detail.tokenCount) && detail.tokenCount >= 0) {
|
|
24666
|
+
metrics.prompt_audio_tokens = (metrics.prompt_audio_tokens ?? 0) + detail.tokenCount;
|
|
24667
|
+
}
|
|
24668
|
+
}
|
|
24669
|
+
finish(
|
|
24670
|
+
() => span.log({
|
|
24671
|
+
metrics,
|
|
24672
|
+
output: {
|
|
24673
|
+
count: value.embeddings?.length ?? (value.embedding ? 1 : 0)
|
|
24674
|
+
}
|
|
24675
|
+
})
|
|
24676
|
+
);
|
|
24677
|
+
}
|
|
24678
|
+
} catch (error) {
|
|
24679
|
+
debugLogger.error(
|
|
24680
|
+
"Error observing Google Generative AI result:",
|
|
24681
|
+
error
|
|
24682
|
+
);
|
|
24683
|
+
finish(() => {
|
|
24684
|
+
});
|
|
24685
|
+
}
|
|
24686
|
+
},
|
|
24687
|
+
(error) => finish(() => span.log({ error }))
|
|
24688
|
+
);
|
|
24689
|
+
return result;
|
|
24690
|
+
});
|
|
24691
|
+
}
|
|
24692
|
+
function normalizeContent(message) {
|
|
24693
|
+
const parts = (typeof message === "string" ? [message] : message).map(
|
|
24694
|
+
(part) => typeof part === "string" ? { text: part } : part
|
|
24695
|
+
);
|
|
24696
|
+
return {
|
|
24697
|
+
role: parts.some((part) => part.functionResponse) ? "function" : "user",
|
|
24698
|
+
parts
|
|
24699
|
+
};
|
|
24700
|
+
}
|
|
24701
|
+
function extractInput(self, request, operation) {
|
|
24702
|
+
const model = self.model.replace(/^models\//, "");
|
|
24703
|
+
if (operation === "embedContent" || operation === "batchEmbedContents") {
|
|
24704
|
+
const requests = operation === "batchEmbedContents" ? request.requests : [
|
|
24705
|
+
typeof request === "string" || Array.isArray(request) ? { content: normalizeContent(request) } : request
|
|
24706
|
+
];
|
|
24707
|
+
const dimensions = requests[0]?.outputDimensionality;
|
|
24708
|
+
return {
|
|
24709
|
+
input: {
|
|
24710
|
+
inputs: convertAttachments(requests).map((item) => ({
|
|
24711
|
+
content: item.content.parts.length === 1 && item.content.parts[0].text !== void 0 ? item.content.parts[0].text : item.content.parts.map((part) => {
|
|
24712
|
+
if (part.text !== void 0)
|
|
24713
|
+
return { type: "text", text: part.text };
|
|
24714
|
+
const mimeType = part.inlineData?.mimeType ?? part.fileData?.mimeType;
|
|
24715
|
+
const data = part.inlineData ? typeof part.inlineData.data === "string" ? `data:${mimeType};base64,${part.inlineData.data}` : part.inlineData.data : part.fileData?.fileUri;
|
|
24716
|
+
return mimeType?.startsWith("image/") ? { type: "image_url", image_url: { url: data } } : { type: "file", file: { file_data: data } };
|
|
24717
|
+
})
|
|
24718
|
+
})),
|
|
24719
|
+
...dimensions !== void 0 && requests.every((item) => item.outputDimensionality === dimensions) ? { output_dimensions: dimensions } : {}
|
|
24720
|
+
},
|
|
24721
|
+
metadata: { model, provider: "google" }
|
|
24722
|
+
};
|
|
24723
|
+
}
|
|
24724
|
+
const chat = operation.startsWith("sendMessage");
|
|
24725
|
+
const config = chat ? self.params ?? {} : self;
|
|
24726
|
+
const params = typeof request === "string" || Array.isArray(request) ? { contents: [normalizeContent(request)] } : request;
|
|
24727
|
+
const system = params.systemInstruction ?? config.systemInstruction;
|
|
24728
|
+
const systemContent = typeof system === "string" ? { role: "system", parts: [{ text: system }] } : system && "parts" in system ? { ...system, role: "system" } : system ? { role: "system", parts: [system] } : void 0;
|
|
24729
|
+
const contents = [
|
|
24730
|
+
...systemContent ? [systemContent] : [],
|
|
24731
|
+
...chat ? self._history : [],
|
|
24732
|
+
...params.contents
|
|
24733
|
+
];
|
|
24734
|
+
const metadata = { model, provider: "google" };
|
|
24735
|
+
const generation = params.generationConfig ?? config.generationConfig;
|
|
24736
|
+
for (const key of GENERATION_CONFIG_KEYS) {
|
|
24737
|
+
if (generation && Object.hasOwn(generation, key))
|
|
24738
|
+
metadata[key] = generation[key];
|
|
24739
|
+
}
|
|
24740
|
+
for (const key of ["tools", "toolConfig", "safetySettings"]) {
|
|
24741
|
+
const value = params[key] ?? config[key];
|
|
24742
|
+
if (value !== void 0) metadata[key] = value;
|
|
24743
|
+
}
|
|
24744
|
+
const cached = params.cachedContent ?? config.cachedContent;
|
|
24745
|
+
if (cached)
|
|
24746
|
+
metadata.cachedContent = typeof cached === "string" ? cached : cached.name;
|
|
24747
|
+
return { input: convertAttachments({ model, contents }), metadata };
|
|
24748
|
+
}
|
|
24749
|
+
function convertAttachments(value) {
|
|
24750
|
+
const convert = (node) => {
|
|
24751
|
+
if (Array.isArray(node)) return node.map(convert);
|
|
24752
|
+
if (!isObject(node)) return node;
|
|
24753
|
+
if (isObject(node.inlineData)) {
|
|
24754
|
+
const { data, mimeType } = node.inlineData;
|
|
24755
|
+
const processed = processInputAttachments({
|
|
24756
|
+
type: "file",
|
|
24757
|
+
file: { file_data: `data:${mimeType};base64,${data}` }
|
|
24758
|
+
});
|
|
24759
|
+
if (typeof processed.file.file_data === "string")
|
|
24760
|
+
throw new Error("Unable to convert Google inline data");
|
|
24761
|
+
return {
|
|
24762
|
+
...node,
|
|
24763
|
+
inlineData: { ...node.inlineData, data: processed.file.file_data }
|
|
24764
|
+
};
|
|
24765
|
+
}
|
|
24766
|
+
return Object.fromEntries(
|
|
24767
|
+
Object.entries(node).map(([key, item]) => [key, convert(item)])
|
|
24768
|
+
);
|
|
24769
|
+
};
|
|
24770
|
+
try {
|
|
24771
|
+
return convert(value);
|
|
24772
|
+
} catch (error) {
|
|
24773
|
+
debugLogger.error(
|
|
24774
|
+
"Error converting Google Generative AI attachments:",
|
|
24775
|
+
error
|
|
24776
|
+
);
|
|
24777
|
+
return value;
|
|
24778
|
+
}
|
|
24779
|
+
}
|
|
24780
|
+
function logResponse(span, response) {
|
|
24781
|
+
const usage = response.usageMetadata;
|
|
24782
|
+
const metrics = {};
|
|
24783
|
+
if (usage) {
|
|
24784
|
+
if (usage.promptTokenCount !== void 0)
|
|
24785
|
+
metrics.prompt_tokens = usage.promptTokenCount;
|
|
24786
|
+
if (usage.candidatesTokenCount !== void 0 || usage.thoughtsTokenCount !== void 0)
|
|
24787
|
+
metrics.completion_tokens = (usage.candidatesTokenCount ?? 0) + (usage.thoughtsTokenCount ?? 0);
|
|
24788
|
+
if (usage.totalTokenCount !== void 0)
|
|
24789
|
+
metrics.tokens = usage.totalTokenCount;
|
|
24790
|
+
if (usage.cachedContentTokenCount !== void 0)
|
|
24791
|
+
metrics.prompt_cached_tokens = usage.cachedContentTokenCount;
|
|
24792
|
+
if (usage.thoughtsTokenCount !== void 0)
|
|
24793
|
+
metrics.completion_reasoning_tokens = usage.thoughtsTokenCount;
|
|
24794
|
+
}
|
|
24795
|
+
span.log({
|
|
24796
|
+
output: convertAttachments({
|
|
24797
|
+
candidates: response.candidates,
|
|
24798
|
+
promptFeedback: response.promptFeedback
|
|
24799
|
+
}),
|
|
24800
|
+
metrics,
|
|
24801
|
+
...response.modelVersion ? { metadata: { model: response.modelVersion } } : {}
|
|
24802
|
+
});
|
|
24803
|
+
}
|
|
24804
|
+
|
|
24446
24805
|
// src/instrumentation/plugins/google-genai-channels.ts
|
|
24447
24806
|
var googleGenAIChannels = defineChannels(
|
|
24448
24807
|
"@google/genai",
|
|
@@ -26086,7 +26445,7 @@ var HuggingFaceTransformersPlugin = class extends BasePlugin {
|
|
|
26086
26445
|
getTask(event)
|
|
26087
26446
|
),
|
|
26088
26447
|
extractInput: (args, event) => ({
|
|
26089
|
-
input:
|
|
26448
|
+
input: extractInput2(
|
|
26090
26449
|
getTask(event),
|
|
26091
26450
|
args
|
|
26092
26451
|
),
|
|
@@ -26176,7 +26535,7 @@ function modelIdentifier(pipeline) {
|
|
|
26176
26535
|
}
|
|
26177
26536
|
return void 0;
|
|
26178
26537
|
}
|
|
26179
|
-
function
|
|
26538
|
+
function extractInput2(task, args) {
|
|
26180
26539
|
switch (task) {
|
|
26181
26540
|
case "feature-extraction":
|
|
26182
26541
|
return args[0];
|
|
@@ -36530,6 +36889,477 @@ function logInstrumentationError5(context, error) {
|
|
|
36530
36889
|
debugLogger.debug(`${context}:`, error);
|
|
36531
36890
|
}
|
|
36532
36891
|
|
|
36892
|
+
// src/instrumentation/plugins/elevenlabs-channels.ts
|
|
36893
|
+
var elevenLabsChannels = defineChannels(
|
|
36894
|
+
"@elevenlabs/elevenlabs-js",
|
|
36895
|
+
{
|
|
36896
|
+
convert: channel({
|
|
36897
|
+
channelName: "textToSpeech.convert",
|
|
36898
|
+
kind: "async"
|
|
36899
|
+
}),
|
|
36900
|
+
stream: channel({
|
|
36901
|
+
channelName: "textToSpeech.stream",
|
|
36902
|
+
kind: "async"
|
|
36903
|
+
}),
|
|
36904
|
+
convertWithTimestamps: channel({ channelName: "textToSpeech.convertWithTimestamps", kind: "async" }),
|
|
36905
|
+
streamWithTimestamps: channel({ channelName: "textToSpeech.streamWithTimestamps", kind: "async" }),
|
|
36906
|
+
transcribe: channel({ channelName: "speechToText.convert", kind: "async" })
|
|
36907
|
+
},
|
|
36908
|
+
{ instrumentationName: INSTRUMENTATION_NAMES.ELEVENLABS }
|
|
36909
|
+
);
|
|
36910
|
+
|
|
36911
|
+
// src/instrumentation/plugins/elevenlabs-plugin.ts
|
|
36912
|
+
var ElevenLabsPlugin = class extends BasePlugin {
|
|
36913
|
+
onEnable() {
|
|
36914
|
+
for (const method of [
|
|
36915
|
+
"convert",
|
|
36916
|
+
"stream",
|
|
36917
|
+
"convertWithTimestamps",
|
|
36918
|
+
"streamWithTimestamps"
|
|
36919
|
+
]) {
|
|
36920
|
+
this.unsubscribers.push(
|
|
36921
|
+
interceptCall2(
|
|
36922
|
+
elevenLabsChannels[method],
|
|
36923
|
+
`elevenlabs.textToSpeech.${method}`,
|
|
36924
|
+
([voice, request]) => ({
|
|
36925
|
+
input: {
|
|
36926
|
+
operation: "speech",
|
|
36927
|
+
prompt: request.text,
|
|
36928
|
+
parameters: {
|
|
36929
|
+
voice,
|
|
36930
|
+
format: request.outputFormat,
|
|
36931
|
+
language: request.languageCode,
|
|
36932
|
+
speed: request.voiceSettings?.speed
|
|
36933
|
+
}
|
|
36934
|
+
},
|
|
36935
|
+
metadata: {
|
|
36936
|
+
provider: "elevenlabs",
|
|
36937
|
+
model: request.modelId ?? "eleven_multilingual_v2"
|
|
36938
|
+
}
|
|
36939
|
+
}),
|
|
36940
|
+
(value, args, span, finish, headers, started) => captureSpeech(
|
|
36941
|
+
value,
|
|
36942
|
+
args[1],
|
|
36943
|
+
method,
|
|
36944
|
+
span,
|
|
36945
|
+
finish,
|
|
36946
|
+
started,
|
|
36947
|
+
headers
|
|
36948
|
+
)
|
|
36949
|
+
)
|
|
36950
|
+
);
|
|
36951
|
+
}
|
|
36952
|
+
this.unsubscribers.push(
|
|
36953
|
+
interceptCall2(
|
|
36954
|
+
elevenLabsChannels.transcribe,
|
|
36955
|
+
"elevenlabs.speechToText.convert",
|
|
36956
|
+
([request]) => {
|
|
36957
|
+
if (request.webhook) return void 0;
|
|
36958
|
+
const file = request.file;
|
|
36959
|
+
const filename = typeof File !== "undefined" && file instanceof File ? file.name : "audio";
|
|
36960
|
+
const contentType = file instanceof Blob ? file.type || "application/octet-stream" : "application/octet-stream";
|
|
36961
|
+
const blob = file instanceof Blob ? file : file instanceof Uint8Array ? new Blob([new Uint8Array(file)], { type: contentType }) : file instanceof ArrayBuffer ? new Blob([file.slice(0)], { type: contentType }) : void 0;
|
|
36962
|
+
const fileData = blob ? new Attachment({ data: blob, filename, contentType }) : request.cloudStorageUrl;
|
|
36963
|
+
return {
|
|
36964
|
+
input: {
|
|
36965
|
+
operation: "transcribe",
|
|
36966
|
+
content: fileData ? [{ type: "file", file: { filename, file_data: fileData } }] : [],
|
|
36967
|
+
parameters: {
|
|
36968
|
+
language: request.languageCode,
|
|
36969
|
+
timestamp_granularities: request.timestampsGranularity
|
|
36970
|
+
}
|
|
36971
|
+
},
|
|
36972
|
+
metadata: { provider: "elevenlabs", model: request.modelId }
|
|
36973
|
+
};
|
|
36974
|
+
},
|
|
36975
|
+
(value, _args, span, finish) => {
|
|
36976
|
+
const result = value;
|
|
36977
|
+
const transcripts = result.transcripts ?? [result];
|
|
36978
|
+
span.log({
|
|
36979
|
+
output: {
|
|
36980
|
+
content: transcripts.flatMap(
|
|
36981
|
+
(transcript) => typeof transcript.text === "string" ? [{ type: "text", text: transcript.text }] : []
|
|
36982
|
+
),
|
|
36983
|
+
annotations: {
|
|
36984
|
+
language: result.languageCode,
|
|
36985
|
+
words: result.words ?? (result.transcripts ? result.transcripts.flatMap(
|
|
36986
|
+
(transcript) => transcript.words ?? []
|
|
36987
|
+
) : void 0)
|
|
36988
|
+
}
|
|
36989
|
+
}
|
|
36990
|
+
});
|
|
36991
|
+
finish();
|
|
36992
|
+
},
|
|
36993
|
+
([request], span) => {
|
|
36994
|
+
const file = request.file;
|
|
36995
|
+
if (!isAsyncIterable(file)) return;
|
|
36996
|
+
const chunks = [];
|
|
36997
|
+
const filename = isObject(file) && typeof file.path === "string" ? file.path.split(/[\\/]/).pop() || "audio" : "audio";
|
|
36998
|
+
observeAudioStream(
|
|
36999
|
+
file,
|
|
37000
|
+
(chunk) => chunks.push(new Uint8Array(chunk)),
|
|
37001
|
+
() => {
|
|
37002
|
+
const contentType = "application/octet-stream";
|
|
37003
|
+
const data = new Blob(chunks, {
|
|
37004
|
+
type: contentType
|
|
37005
|
+
});
|
|
37006
|
+
chunks.length = 0;
|
|
37007
|
+
span.log({
|
|
37008
|
+
input: {
|
|
37009
|
+
content: [
|
|
37010
|
+
{
|
|
37011
|
+
type: "file",
|
|
37012
|
+
file: {
|
|
37013
|
+
filename,
|
|
37014
|
+
file_data: new Attachment({
|
|
37015
|
+
data,
|
|
37016
|
+
filename,
|
|
37017
|
+
contentType
|
|
37018
|
+
})
|
|
37019
|
+
}
|
|
37020
|
+
}
|
|
37021
|
+
]
|
|
37022
|
+
}
|
|
37023
|
+
});
|
|
37024
|
+
},
|
|
37025
|
+
() => {
|
|
37026
|
+
chunks.length = 0;
|
|
37027
|
+
},
|
|
37028
|
+
span
|
|
37029
|
+
);
|
|
37030
|
+
}
|
|
37031
|
+
)
|
|
37032
|
+
);
|
|
37033
|
+
}
|
|
37034
|
+
onDisable() {
|
|
37035
|
+
this.unsubscribers = unsubscribeAll(this.unsubscribers);
|
|
37036
|
+
}
|
|
37037
|
+
};
|
|
37038
|
+
function interceptCall2(channel2, name, input, output, beforeInvoke) {
|
|
37039
|
+
return channel2.intercept((target, self, args) => {
|
|
37040
|
+
const invoke2 = () => Reflect.apply(target, self, args);
|
|
37041
|
+
if (isAutoInstrumentationSuppressed()) return invoke2();
|
|
37042
|
+
const started = Date.now() / 1e3;
|
|
37043
|
+
let span;
|
|
37044
|
+
try {
|
|
37045
|
+
const event = input(args);
|
|
37046
|
+
if (event !== void 0)
|
|
37047
|
+
span = startSpan(
|
|
37048
|
+
withSpanInstrumentationName(
|
|
37049
|
+
{
|
|
37050
|
+
name,
|
|
37051
|
+
spanAttributes: { type: "llm" /* LLM */ },
|
|
37052
|
+
event
|
|
37053
|
+
},
|
|
37054
|
+
INSTRUMENTATION_NAMES.ELEVENLABS
|
|
37055
|
+
)
|
|
37056
|
+
);
|
|
37057
|
+
} catch (error) {
|
|
37058
|
+
debugLogger.error("Error starting ElevenLabs span", error);
|
|
37059
|
+
return invoke2();
|
|
37060
|
+
}
|
|
37061
|
+
if (!span) return invoke2();
|
|
37062
|
+
const activeSpan = span;
|
|
37063
|
+
let ended = false;
|
|
37064
|
+
const finish = (error) => {
|
|
37065
|
+
if (ended) return;
|
|
37066
|
+
ended = true;
|
|
37067
|
+
try {
|
|
37068
|
+
if (error !== void 0) activeSpan.log({ error });
|
|
37069
|
+
activeSpan.end();
|
|
37070
|
+
} catch (loggingError) {
|
|
37071
|
+
debugLogger.error("Error ending ElevenLabs span", loggingError);
|
|
37072
|
+
}
|
|
37073
|
+
};
|
|
37074
|
+
try {
|
|
37075
|
+
beforeInvoke?.(args, span);
|
|
37076
|
+
} catch (error) {
|
|
37077
|
+
debugLogger.error("Error observing ElevenLabs input", error);
|
|
37078
|
+
}
|
|
37079
|
+
let result;
|
|
37080
|
+
try {
|
|
37081
|
+
result = withCurrent(
|
|
37082
|
+
span,
|
|
37083
|
+
() => runWithAutoInstrumentationSuppressed(invoke2)
|
|
37084
|
+
);
|
|
37085
|
+
} catch (error) {
|
|
37086
|
+
finish(error);
|
|
37087
|
+
throw error;
|
|
37088
|
+
}
|
|
37089
|
+
const capture = (value, headers) => {
|
|
37090
|
+
try {
|
|
37091
|
+
output(value, args, span, finish, headers, started);
|
|
37092
|
+
} catch (error) {
|
|
37093
|
+
debugLogger.error("Error capturing ElevenLabs output", error);
|
|
37094
|
+
finish();
|
|
37095
|
+
}
|
|
37096
|
+
};
|
|
37097
|
+
try {
|
|
37098
|
+
if (isObject(result) && typeof result.withRawResponse === "function") {
|
|
37099
|
+
void result.withRawResponse().then(
|
|
37100
|
+
({
|
|
37101
|
+
data,
|
|
37102
|
+
rawResponse
|
|
37103
|
+
}) => capture(data, rawResponse?.headers),
|
|
37104
|
+
finish
|
|
37105
|
+
);
|
|
37106
|
+
} else {
|
|
37107
|
+
void Promise.resolve(result).then((value) => capture(value), finish);
|
|
37108
|
+
}
|
|
37109
|
+
} catch (error) {
|
|
37110
|
+
debugLogger.error("Error observing ElevenLabs result", error);
|
|
37111
|
+
finish();
|
|
37112
|
+
}
|
|
37113
|
+
return result;
|
|
37114
|
+
});
|
|
37115
|
+
}
|
|
37116
|
+
function captureSpeech(value, request, method, span, finish, started, headers) {
|
|
37117
|
+
const format = request.outputFormat ?? "mp3_44100_128";
|
|
37118
|
+
const formatType = format.startsWith("mp3_") ? "audio/mpeg" : format.startsWith("pcm_") ? "audio/pcm" : format.startsWith("opus_") ? "audio/ogg" : format.startsWith("ulaw_") ? "audio/basic" : format.startsWith("alaw_") ? "audio/x-alaw" : void 0;
|
|
37119
|
+
const headerType = headers?.get("content-type")?.split(";")[0];
|
|
37120
|
+
const contentType = headerType?.startsWith("audio/") ? headerType : formatType;
|
|
37121
|
+
const disposition = headers?.get("content-disposition");
|
|
37122
|
+
const headerFilename = disposition?.match(
|
|
37123
|
+
/filename="([^"]+)"|filename=([^;]+)/i
|
|
37124
|
+
);
|
|
37125
|
+
const filename = headerFilename?.[1] ?? headerFilename?.[2]?.trim() ?? `speech.${contentType ? getExtensionFromMediaType(contentType) : "bin"}`;
|
|
37126
|
+
const chunks = [];
|
|
37127
|
+
const alignments = [];
|
|
37128
|
+
let bytes = 0;
|
|
37129
|
+
let first = true;
|
|
37130
|
+
let stopped = false;
|
|
37131
|
+
const observe = (chunk) => {
|
|
37132
|
+
if (stopped || chunk.byteLength === 0) return;
|
|
37133
|
+
if (first && method.startsWith("stream")) {
|
|
37134
|
+
span.log({
|
|
37135
|
+
metrics: { time_to_first_token: Date.now() / 1e3 - started }
|
|
37136
|
+
});
|
|
37137
|
+
}
|
|
37138
|
+
first = false;
|
|
37139
|
+
chunks.push(new Uint8Array(chunk));
|
|
37140
|
+
bytes += chunk.byteLength;
|
|
37141
|
+
};
|
|
37142
|
+
const complete = () => {
|
|
37143
|
+
if (stopped) return;
|
|
37144
|
+
stopped = true;
|
|
37145
|
+
try {
|
|
37146
|
+
const content = [];
|
|
37147
|
+
if (contentType && bytes) {
|
|
37148
|
+
const data = new Uint8Array(bytes);
|
|
37149
|
+
let offset = 0;
|
|
37150
|
+
for (const chunk of chunks) {
|
|
37151
|
+
data.set(chunk, offset);
|
|
37152
|
+
offset += chunk.length;
|
|
37153
|
+
}
|
|
37154
|
+
content.push({
|
|
37155
|
+
type: "file",
|
|
37156
|
+
file: {
|
|
37157
|
+
filename,
|
|
37158
|
+
byte_size: bytes,
|
|
37159
|
+
file_data: new Attachment({
|
|
37160
|
+
data: new Blob([data], { type: contentType }),
|
|
37161
|
+
filename,
|
|
37162
|
+
contentType
|
|
37163
|
+
})
|
|
37164
|
+
}
|
|
37165
|
+
});
|
|
37166
|
+
}
|
|
37167
|
+
span.log({
|
|
37168
|
+
output: {
|
|
37169
|
+
content,
|
|
37170
|
+
...alignments.length ? { annotations: alignments } : {}
|
|
37171
|
+
}
|
|
37172
|
+
});
|
|
37173
|
+
} finally {
|
|
37174
|
+
chunks.length = 0;
|
|
37175
|
+
finish();
|
|
37176
|
+
}
|
|
37177
|
+
};
|
|
37178
|
+
const cancel = (error) => {
|
|
37179
|
+
stopped = true;
|
|
37180
|
+
chunks.length = 0;
|
|
37181
|
+
finish(error);
|
|
37182
|
+
};
|
|
37183
|
+
const timestampChunk = (chunk) => {
|
|
37184
|
+
const binary = atob(chunk.audioBase64);
|
|
37185
|
+
observe(Uint8Array.from(binary, (character) => character.charCodeAt(0)));
|
|
37186
|
+
if (chunk.alignment || chunk.normalizedAlignment)
|
|
37187
|
+
alignments.push({
|
|
37188
|
+
alignment: chunk.alignment,
|
|
37189
|
+
normalized_alignment: chunk.normalizedAlignment
|
|
37190
|
+
});
|
|
37191
|
+
};
|
|
37192
|
+
if (method === "convertWithTimestamps") {
|
|
37193
|
+
timestampChunk(value);
|
|
37194
|
+
complete();
|
|
37195
|
+
} else if (method === "streamWithTimestamps") {
|
|
37196
|
+
patchStreamIfNeeded(value, {
|
|
37197
|
+
shouldCollect: (chunk) => {
|
|
37198
|
+
try {
|
|
37199
|
+
timestampChunk(chunk);
|
|
37200
|
+
} catch (error) {
|
|
37201
|
+
debugLogger.error("Error collecting ElevenLabs timestamps", error);
|
|
37202
|
+
cancel();
|
|
37203
|
+
}
|
|
37204
|
+
return false;
|
|
37205
|
+
},
|
|
37206
|
+
onComplete: complete,
|
|
37207
|
+
onCancel: () => cancel(),
|
|
37208
|
+
onError: cancel,
|
|
37209
|
+
aroundNext: (next) => withCurrent(span, next)
|
|
37210
|
+
});
|
|
37211
|
+
} else {
|
|
37212
|
+
observeAudioStream(value, observe, complete, cancel, span);
|
|
37213
|
+
}
|
|
37214
|
+
}
|
|
37215
|
+
function observeAudioStream(value, observe, complete, cancel, span) {
|
|
37216
|
+
let ended = false;
|
|
37217
|
+
const safeObserve = (chunk) => {
|
|
37218
|
+
if (ended) return;
|
|
37219
|
+
try {
|
|
37220
|
+
observe(chunk);
|
|
37221
|
+
} catch (error) {
|
|
37222
|
+
debugLogger.error("Error collecting ElevenLabs audio", error);
|
|
37223
|
+
end(false);
|
|
37224
|
+
}
|
|
37225
|
+
};
|
|
37226
|
+
const end = (success, error) => {
|
|
37227
|
+
if (ended) return;
|
|
37228
|
+
ended = true;
|
|
37229
|
+
try {
|
|
37230
|
+
if (success) complete();
|
|
37231
|
+
else cancel(error);
|
|
37232
|
+
} catch (loggingError) {
|
|
37233
|
+
debugLogger.error("Error logging ElevenLabs audio", loggingError);
|
|
37234
|
+
cancel();
|
|
37235
|
+
}
|
|
37236
|
+
};
|
|
37237
|
+
if (!isObject(value) || !Object.isExtensible(value)) {
|
|
37238
|
+
end(false);
|
|
37239
|
+
return;
|
|
37240
|
+
}
|
|
37241
|
+
if (typeof value.read === "function" && typeof value.on === "function") {
|
|
37242
|
+
value.on("end", () => end(true));
|
|
37243
|
+
value.on("close", () => end(false));
|
|
37244
|
+
const emit2 = value.emit;
|
|
37245
|
+
if (typeof emit2 === "function")
|
|
37246
|
+
value.emit = function(event, ...args) {
|
|
37247
|
+
if (event === "data" && args[0] instanceof Uint8Array)
|
|
37248
|
+
safeObserve(args[0]);
|
|
37249
|
+
if (event === "error") end(false, args[0]);
|
|
37250
|
+
return Reflect.apply(emit2, this, [event, ...args]);
|
|
37251
|
+
};
|
|
37252
|
+
return;
|
|
37253
|
+
}
|
|
37254
|
+
if (typeof value.getReader === "function") {
|
|
37255
|
+
const webStream = value;
|
|
37256
|
+
const pipeTo = webStream.pipeTo;
|
|
37257
|
+
const pipeThrough = webStream.pipeThrough;
|
|
37258
|
+
webStream.pipeTo = function(destination, options) {
|
|
37259
|
+
if (!isObject(destination) || this.locked || destination.locked)
|
|
37260
|
+
return pipeTo.call(this, destination, options);
|
|
37261
|
+
const tap = new TransformStream({
|
|
37262
|
+
transform(chunk, controller) {
|
|
37263
|
+
safeObserve(chunk);
|
|
37264
|
+
controller.enqueue(chunk);
|
|
37265
|
+
},
|
|
37266
|
+
flush() {
|
|
37267
|
+
end(true);
|
|
37268
|
+
}
|
|
37269
|
+
});
|
|
37270
|
+
const observed = pipeThrough.call(
|
|
37271
|
+
this,
|
|
37272
|
+
tap,
|
|
37273
|
+
options
|
|
37274
|
+
);
|
|
37275
|
+
return observed.pipeTo(destination, options).catch((error) => {
|
|
37276
|
+
end(false, error);
|
|
37277
|
+
throw error;
|
|
37278
|
+
});
|
|
37279
|
+
};
|
|
37280
|
+
webStream.pipeThrough = function(transform, options) {
|
|
37281
|
+
if (this.locked || transform.writable.locked || transform.readable.locked)
|
|
37282
|
+
return pipeThrough.call(this, transform, options);
|
|
37283
|
+
const result = webStream.pipeTo.call(this, transform.writable, options);
|
|
37284
|
+
void result.catch(() => {
|
|
37285
|
+
});
|
|
37286
|
+
return transform.readable;
|
|
37287
|
+
};
|
|
37288
|
+
const getReader = value.getReader;
|
|
37289
|
+
value.getReader = function(...args) {
|
|
37290
|
+
const reader = Reflect.apply(getReader, this, args);
|
|
37291
|
+
const read3 = reader.read;
|
|
37292
|
+
reader.read = function(...readArgs) {
|
|
37293
|
+
return Promise.resolve(
|
|
37294
|
+
withCurrent(span, () => Reflect.apply(read3, this, readArgs))
|
|
37295
|
+
).then(
|
|
37296
|
+
(result) => {
|
|
37297
|
+
if (result.value) safeObserve(result.value);
|
|
37298
|
+
if (result.done) end(true);
|
|
37299
|
+
return result;
|
|
37300
|
+
},
|
|
37301
|
+
(error) => {
|
|
37302
|
+
end(false, error);
|
|
37303
|
+
throw error;
|
|
37304
|
+
}
|
|
37305
|
+
);
|
|
37306
|
+
};
|
|
37307
|
+
const readerCancel = reader.cancel;
|
|
37308
|
+
reader.cancel = function(...cancelArgs) {
|
|
37309
|
+
const result = Reflect.apply(readerCancel, this, cancelArgs);
|
|
37310
|
+
end(false);
|
|
37311
|
+
return result;
|
|
37312
|
+
};
|
|
37313
|
+
return reader;
|
|
37314
|
+
};
|
|
37315
|
+
const streamCancel = value.cancel;
|
|
37316
|
+
if (typeof streamCancel === "function")
|
|
37317
|
+
value.cancel = function(...args) {
|
|
37318
|
+
const result = Reflect.apply(streamCancel, this, args);
|
|
37319
|
+
void Promise.resolve(result).then(
|
|
37320
|
+
() => end(false),
|
|
37321
|
+
() => {
|
|
37322
|
+
}
|
|
37323
|
+
);
|
|
37324
|
+
return result;
|
|
37325
|
+
};
|
|
37326
|
+
}
|
|
37327
|
+
if (typeof value.getReader === "function" && typeof value.values === "function") {
|
|
37328
|
+
const values = value.values;
|
|
37329
|
+
const iterate = function(...args) {
|
|
37330
|
+
const iterator = Reflect.apply(values, this, args);
|
|
37331
|
+
patchStreamIfNeeded(iterator, {
|
|
37332
|
+
shouldCollect(chunk) {
|
|
37333
|
+
safeObserve(chunk);
|
|
37334
|
+
return false;
|
|
37335
|
+
},
|
|
37336
|
+
onComplete: () => end(true),
|
|
37337
|
+
onCancel: () => end(false),
|
|
37338
|
+
onError: (error) => end(false, error),
|
|
37339
|
+
aroundNext: (next) => withCurrent(span, next)
|
|
37340
|
+
});
|
|
37341
|
+
return iterator;
|
|
37342
|
+
};
|
|
37343
|
+
value.values = iterate;
|
|
37344
|
+
Object.defineProperty(value, Symbol.asyncIterator, {
|
|
37345
|
+
configurable: true,
|
|
37346
|
+
writable: true,
|
|
37347
|
+
value: iterate
|
|
37348
|
+
});
|
|
37349
|
+
} else if (isAsyncIterable(value)) {
|
|
37350
|
+
patchStreamIfNeeded(value, {
|
|
37351
|
+
shouldCollect: (chunk) => {
|
|
37352
|
+
safeObserve(chunk);
|
|
37353
|
+
return false;
|
|
37354
|
+
},
|
|
37355
|
+
onComplete: () => end(true),
|
|
37356
|
+
onCancel: () => end(false),
|
|
37357
|
+
onError: (error) => end(false, error),
|
|
37358
|
+
aroundNext: (next) => withCurrent(span, next)
|
|
37359
|
+
});
|
|
37360
|
+
} else if (typeof value.getReader !== "function") end(false);
|
|
37361
|
+
}
|
|
37362
|
+
|
|
36533
37363
|
// src/instrumentation/plugins/voyageai-channels.ts
|
|
36534
37364
|
var voyageAIChannels = defineChannels(
|
|
36535
37365
|
"voyageai",
|
|
@@ -36597,7 +37427,7 @@ var VoyageAIPlugin = class extends BasePlugin {
|
|
|
36597
37427
|
this.unsubscribers = unsubscribeAll(this.unsubscribers);
|
|
36598
37428
|
}
|
|
36599
37429
|
};
|
|
36600
|
-
function interceptVoyageAICall(channel2, name,
|
|
37430
|
+
function interceptVoyageAICall(channel2, name, extractInput4, extractOutput2, extractMetrics2 = extractUsageMetrics3) {
|
|
36601
37431
|
return channel2.intercept((target, thisArg, args) => {
|
|
36602
37432
|
const invokeTarget = () => Reflect.apply(target, thisArg, args);
|
|
36603
37433
|
if (isAutoInstrumentationSuppressed()) {
|
|
@@ -36605,7 +37435,7 @@ function interceptVoyageAICall(channel2, name, extractInput3, extractOutput2, ex
|
|
|
36605
37435
|
}
|
|
36606
37436
|
let span;
|
|
36607
37437
|
try {
|
|
36608
|
-
const { input, metadata } =
|
|
37438
|
+
const { input, metadata } = extractInput4(args);
|
|
36609
37439
|
span = startSpan(
|
|
36610
37440
|
withSpanInstrumentationName(
|
|
36611
37441
|
{
|
|
@@ -37404,6 +38234,7 @@ var BraintrustPlugin = class extends BasePlugin {
|
|
|
37404
38234
|
cloudflareThinkPlugin = null;
|
|
37405
38235
|
cursorSDKPlugin = null;
|
|
37406
38236
|
openAIAgentsPlugin = null;
|
|
38237
|
+
googleGenerativeAIPlugin = null;
|
|
37407
38238
|
googleGenAIPlugin = null;
|
|
37408
38239
|
huggingFacePlugin = null;
|
|
37409
38240
|
huggingFaceTransformersPlugin = null;
|
|
@@ -37422,6 +38253,7 @@ var BraintrustPlugin = class extends BasePlugin {
|
|
|
37422
38253
|
langSmithPlugin = null;
|
|
37423
38254
|
piCodingAgentPlugin = null;
|
|
37424
38255
|
strandsAgentSDKPlugin = null;
|
|
38256
|
+
elevenLabsPlugin = null;
|
|
37425
38257
|
voyageAIPlugin = null;
|
|
37426
38258
|
cloudflareAIChatPlugin = null;
|
|
37427
38259
|
cloudflareAgentsPlugin = null;
|
|
@@ -37463,6 +38295,10 @@ var BraintrustPlugin = class extends BasePlugin {
|
|
|
37463
38295
|
this.openAIAgentsPlugin = new OpenAIAgentsPlugin();
|
|
37464
38296
|
this.openAIAgentsPlugin.enable();
|
|
37465
38297
|
}
|
|
38298
|
+
if (integrations.googleGenerativeAI !== false) {
|
|
38299
|
+
this.googleGenerativeAIPlugin = new GoogleGenerativeAIPlugin();
|
|
38300
|
+
this.googleGenerativeAIPlugin.enable();
|
|
38301
|
+
}
|
|
37466
38302
|
if (integrations.googleGenAI !== false && integrations.google !== false) {
|
|
37467
38303
|
this.googleGenAIPlugin = new GoogleGenAIPlugin();
|
|
37468
38304
|
this.googleGenAIPlugin.enable();
|
|
@@ -37497,6 +38333,10 @@ var BraintrustPlugin = class extends BasePlugin {
|
|
|
37497
38333
|
this.coherePlugin = new CoherePlugin();
|
|
37498
38334
|
this.coherePlugin.enable();
|
|
37499
38335
|
}
|
|
38336
|
+
if (integrations.elevenlabs !== false) {
|
|
38337
|
+
this.elevenLabsPlugin = new ElevenLabsPlugin();
|
|
38338
|
+
this.elevenLabsPlugin.enable();
|
|
38339
|
+
}
|
|
37500
38340
|
if (integrations.voyageai !== false) {
|
|
37501
38341
|
this.voyageAIPlugin = new VoyageAIPlugin();
|
|
37502
38342
|
this.voyageAIPlugin.enable();
|
|
@@ -37581,6 +38421,10 @@ var BraintrustPlugin = class extends BasePlugin {
|
|
|
37581
38421
|
this.openAIAgentsPlugin.disable();
|
|
37582
38422
|
this.openAIAgentsPlugin = null;
|
|
37583
38423
|
}
|
|
38424
|
+
if (this.googleGenerativeAIPlugin) {
|
|
38425
|
+
this.googleGenerativeAIPlugin.disable();
|
|
38426
|
+
this.googleGenerativeAIPlugin = null;
|
|
38427
|
+
}
|
|
37584
38428
|
if (this.googleGenAIPlugin) {
|
|
37585
38429
|
this.googleGenAIPlugin.disable();
|
|
37586
38430
|
this.googleGenAIPlugin = null;
|
|
@@ -37617,6 +38461,10 @@ var BraintrustPlugin = class extends BasePlugin {
|
|
|
37617
38461
|
this.coherePlugin.disable();
|
|
37618
38462
|
this.coherePlugin = null;
|
|
37619
38463
|
}
|
|
38464
|
+
if (this.elevenLabsPlugin) {
|
|
38465
|
+
this.elevenLabsPlugin.disable();
|
|
38466
|
+
this.elevenLabsPlugin = null;
|
|
38467
|
+
}
|
|
37620
38468
|
if (this.voyageAIPlugin) {
|
|
37621
38469
|
this.voyageAIPlugin.disable();
|
|
37622
38470
|
this.voyageAIPlugin = null;
|
|
@@ -37710,6 +38558,8 @@ var envIntegrationAliases = {
|
|
|
37710
38558
|
"openai-agents-core": "openAIAgents",
|
|
37711
38559
|
openaiagentscore: "openAIAgents",
|
|
37712
38560
|
google: "google",
|
|
38561
|
+
"google-generative-ai": "googleGenerativeAI",
|
|
38562
|
+
googlegenerativeai: "googleGenerativeAI",
|
|
37713
38563
|
"google-genai": "googleGenAI",
|
|
37714
38564
|
googlegenai: "googleGenAI",
|
|
37715
38565
|
huggingface: "huggingface",
|
|
@@ -37743,7 +38593,9 @@ var envIntegrationAliases = {
|
|
|
37743
38593
|
langsmith: "langsmith",
|
|
37744
38594
|
voyage: "voyageai",
|
|
37745
38595
|
"voyage-ai": "voyageai",
|
|
37746
|
-
voyageai: "voyageai"
|
|
38596
|
+
voyageai: "voyageai",
|
|
38597
|
+
elevenlabs: "elevenlabs",
|
|
38598
|
+
"@elevenlabs/elevenlabs-js": "elevenlabs"
|
|
37747
38599
|
};
|
|
37748
38600
|
function getDefaultInstrumentationIntegrations() {
|
|
37749
38601
|
return {
|
|
@@ -37754,6 +38606,7 @@ function getDefaultInstrumentationIntegrations() {
|
|
|
37754
38606
|
aisdk: true,
|
|
37755
38607
|
google: true,
|
|
37756
38608
|
googleGenAI: true,
|
|
38609
|
+
googleGenerativeAI: true,
|
|
37757
38610
|
googleADK: true,
|
|
37758
38611
|
huggingface: true,
|
|
37759
38612
|
claudeAgentSDK: true,
|
|
@@ -37779,6 +38632,7 @@ function getDefaultInstrumentationIntegrations() {
|
|
|
37779
38632
|
langgraph: true,
|
|
37780
38633
|
langsmith: true,
|
|
37781
38634
|
voyageai: true,
|
|
38635
|
+
elevenlabs: true,
|
|
37782
38636
|
piCodingAgent: true,
|
|
37783
38637
|
strandsAgentSDK: true,
|
|
37784
38638
|
cloudflareAgents: true
|
|
@@ -38097,9 +38951,11 @@ __export(exports_exports, {
|
|
|
38097
38951
|
wrapCohere: () => wrapCohere,
|
|
38098
38952
|
wrapCopilotClient: () => wrapCopilotClient,
|
|
38099
38953
|
wrapCursorSDK: () => wrapCursorSDK,
|
|
38954
|
+
wrapElevenLabs: () => wrapElevenLabs,
|
|
38100
38955
|
wrapGenkit: () => wrapGenkit,
|
|
38101
38956
|
wrapGoogleADK: () => wrapGoogleADK,
|
|
38102
38957
|
wrapGoogleGenAI: () => wrapGoogleGenAI,
|
|
38958
|
+
wrapGoogleGenerativeAI: () => wrapGoogleGenerativeAI,
|
|
38103
38959
|
wrapGroq: () => wrapGroq,
|
|
38104
38960
|
wrapHuggingFace: () => wrapHuggingFace,
|
|
38105
38961
|
wrapHuggingFaceTransformers: () => wrapHuggingFaceTransformers,
|
|
@@ -39709,7 +40565,7 @@ function extractToolCallsFromBlocks(blocks) {
|
|
|
39709
40565
|
if (!Array.isArray(blocks)) return [];
|
|
39710
40566
|
return extractToolCallsFromSteps([{ content: blocks }]);
|
|
39711
40567
|
}
|
|
39712
|
-
function
|
|
40568
|
+
function extractInput3(params) {
|
|
39713
40569
|
return params?.prompt ?? params?.messages ?? params?.system;
|
|
39714
40570
|
}
|
|
39715
40571
|
var V2_EXCLUDE_KEYS = /* @__PURE__ */ new Set([
|
|
@@ -39731,7 +40587,7 @@ function BraintrustMiddleware(config = {}) {
|
|
|
39731
40587
|
params,
|
|
39732
40588
|
model: modelFromWrapGenerate
|
|
39733
40589
|
}) => {
|
|
39734
|
-
const rawInput =
|
|
40590
|
+
const rawInput = extractInput3(params);
|
|
39735
40591
|
const processedInput = processInputAttachments(rawInput);
|
|
39736
40592
|
const spanArgs = {
|
|
39737
40593
|
name: config.spanInfo?.name || "ai-sdk.doGenerate",
|
|
@@ -39795,7 +40651,7 @@ function BraintrustMiddleware(config = {}) {
|
|
|
39795
40651
|
}
|
|
39796
40652
|
},
|
|
39797
40653
|
wrapStream: async ({ doStream, params }) => {
|
|
39798
|
-
const rawInput =
|
|
40654
|
+
const rawInput = extractInput3(params);
|
|
39799
40655
|
const processedInput = processInputAttachments(rawInput);
|
|
39800
40656
|
const spanArgs = {
|
|
39801
40657
|
name: config.spanInfo?.name || "ai-sdk.doStream",
|
|
@@ -43188,6 +44044,75 @@ function isModuleNamespace5(value) {
|
|
|
43188
44044
|
}
|
|
43189
44045
|
}
|
|
43190
44046
|
|
|
44047
|
+
// src/wrappers/google-generative-ai.ts
|
|
44048
|
+
function wrapGoogleGenerativeAI(client) {
|
|
44049
|
+
if (!isObject(client) || typeof client.getGenerativeModel !== "function")
|
|
44050
|
+
return client;
|
|
44051
|
+
return wrapClient(client);
|
|
44052
|
+
}
|
|
44053
|
+
var proxies = /* @__PURE__ */ new WeakMap();
|
|
44054
|
+
function wrapClient(client) {
|
|
44055
|
+
const cached = proxies.get(client);
|
|
44056
|
+
if (cached) return cached;
|
|
44057
|
+
const proxy = new Proxy(client, {
|
|
44058
|
+
get(target, prop, receiver) {
|
|
44059
|
+
const value = Reflect.get(target, prop, receiver);
|
|
44060
|
+
if (typeof value !== "function") return value;
|
|
44061
|
+
if (prop === "getGenerativeModel" || prop === "getGenerativeModelFromCachedContent" || prop === "startChat") {
|
|
44062
|
+
return (...args) => wrapClient(Reflect.apply(value, target, args));
|
|
44063
|
+
}
|
|
44064
|
+
switch (prop) {
|
|
44065
|
+
case "generateContent":
|
|
44066
|
+
return (...args) => googleGenerativeAIChannels.generateContent.invoke(
|
|
44067
|
+
value,
|
|
44068
|
+
target,
|
|
44069
|
+
args,
|
|
44070
|
+
{}
|
|
44071
|
+
);
|
|
44072
|
+
case "generateContentStream":
|
|
44073
|
+
return (...args) => googleGenerativeAIChannels.generateContentStream.invoke(
|
|
44074
|
+
value,
|
|
44075
|
+
target,
|
|
44076
|
+
args,
|
|
44077
|
+
{}
|
|
44078
|
+
);
|
|
44079
|
+
case "embedContent":
|
|
44080
|
+
return (...args) => googleGenerativeAIChannels.embedContent.invoke(
|
|
44081
|
+
value,
|
|
44082
|
+
target,
|
|
44083
|
+
args,
|
|
44084
|
+
{}
|
|
44085
|
+
);
|
|
44086
|
+
case "batchEmbedContents":
|
|
44087
|
+
return (...args) => googleGenerativeAIChannels.batchEmbedContents.invoke(
|
|
44088
|
+
value,
|
|
44089
|
+
target,
|
|
44090
|
+
args,
|
|
44091
|
+
{}
|
|
44092
|
+
);
|
|
44093
|
+
case "sendMessage":
|
|
44094
|
+
return (...args) => googleGenerativeAIChannels.sendMessage.invoke(
|
|
44095
|
+
value,
|
|
44096
|
+
target,
|
|
44097
|
+
args,
|
|
44098
|
+
{}
|
|
44099
|
+
);
|
|
44100
|
+
case "sendMessageStream":
|
|
44101
|
+
return (...args) => googleGenerativeAIChannels.sendMessageStream.invoke(
|
|
44102
|
+
value,
|
|
44103
|
+
target,
|
|
44104
|
+
args,
|
|
44105
|
+
{}
|
|
44106
|
+
);
|
|
44107
|
+
}
|
|
44108
|
+
return value.bind(target);
|
|
44109
|
+
}
|
|
44110
|
+
});
|
|
44111
|
+
proxies.set(client, proxy);
|
|
44112
|
+
proxies.set(proxy, proxy);
|
|
44113
|
+
return proxy;
|
|
44114
|
+
}
|
|
44115
|
+
|
|
43191
44116
|
// src/wrappers/google-genai.ts
|
|
43192
44117
|
function wrapGoogleGenAI(googleGenAI) {
|
|
43193
44118
|
if (!googleGenAI || typeof googleGenAI !== "object") {
|
|
@@ -50549,5 +51474,64 @@ var evaluatorDefinitionsSchema = import_v313.z.record(
|
|
|
50549
51474
|
evaluatorDefinitionSchema
|
|
50550
51475
|
);
|
|
50551
51476
|
|
|
51477
|
+
// src/wrappers/elevenlabs.ts
|
|
51478
|
+
var clients = /* @__PURE__ */ new WeakMap();
|
|
51479
|
+
function wrapElevenLabs(client) {
|
|
51480
|
+
if (!isObject(client) || !isObject(client.textToSpeech) || typeof client.textToSpeech.convert !== "function") {
|
|
51481
|
+
debugLogger.warn("Unsupported ElevenLabs client. Not wrapping.");
|
|
51482
|
+
return client;
|
|
51483
|
+
}
|
|
51484
|
+
const cached = clients.get(client);
|
|
51485
|
+
if (cached) return cached;
|
|
51486
|
+
const sdk = client;
|
|
51487
|
+
const speech = new Proxy(sdk.textToSpeech, {
|
|
51488
|
+
get(target, prop, receiver) {
|
|
51489
|
+
switch (prop) {
|
|
51490
|
+
case "convert":
|
|
51491
|
+
case "stream":
|
|
51492
|
+
return (...args) => elevenLabsChannels[prop].invoke(target[prop], target, args, {});
|
|
51493
|
+
case "convertWithTimestamps":
|
|
51494
|
+
return (...args) => elevenLabsChannels.convertWithTimestamps.invoke(
|
|
51495
|
+
target.convertWithTimestamps,
|
|
51496
|
+
target,
|
|
51497
|
+
args,
|
|
51498
|
+
{}
|
|
51499
|
+
);
|
|
51500
|
+
case "streamWithTimestamps":
|
|
51501
|
+
return (...args) => elevenLabsChannels.streamWithTimestamps.invoke(
|
|
51502
|
+
target.streamWithTimestamps,
|
|
51503
|
+
target,
|
|
51504
|
+
args,
|
|
51505
|
+
{}
|
|
51506
|
+
);
|
|
51507
|
+
default:
|
|
51508
|
+
return Reflect.get(target, prop, receiver);
|
|
51509
|
+
}
|
|
51510
|
+
}
|
|
51511
|
+
});
|
|
51512
|
+
const transcription = new Proxy(sdk.speechToText, {
|
|
51513
|
+
get(target, prop, receiver) {
|
|
51514
|
+
if (prop === "convert")
|
|
51515
|
+
return (request, options) => elevenLabsChannels.transcribe.invoke(
|
|
51516
|
+
target.convert,
|
|
51517
|
+
target,
|
|
51518
|
+
[request, options],
|
|
51519
|
+
{}
|
|
51520
|
+
);
|
|
51521
|
+
return Reflect.get(target, prop, receiver);
|
|
51522
|
+
}
|
|
51523
|
+
});
|
|
51524
|
+
const proxy = new Proxy(sdk, {
|
|
51525
|
+
get(target, prop, receiver) {
|
|
51526
|
+
if (prop === "textToSpeech") return speech;
|
|
51527
|
+
if (prop === "speechToText") return transcription;
|
|
51528
|
+
return Reflect.get(target, prop, receiver);
|
|
51529
|
+
}
|
|
51530
|
+
});
|
|
51531
|
+
clients.set(client, proxy);
|
|
51532
|
+
clients.set(proxy, proxy);
|
|
51533
|
+
return proxy;
|
|
51534
|
+
}
|
|
51535
|
+
|
|
50552
51536
|
// src/browser/index.ts
|
|
50553
51537
|
configureBrowser();
|