Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
190 changes: 111 additions & 79 deletions js/src/instrumentation/plugins/ai-sdk-plugin.ts

Large diffs are not rendered by default.

221 changes: 221 additions & 0 deletions js/src/vendor-sdk-types/ai-sdk-common.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,221 @@
/**
* Vendored AI SDK types used internally by the wrapper and auto-instrumentation.
*
* These are intentionally small and only model the surface Braintrust reads.
*/

export interface AISDKTokenBucket {
total?: number;
cacheRead?: number;
reasoning?: number;
[key: string]: unknown;
}

type AISDKTokenCount = number & AISDKTokenBucket;

export interface AISDKUsage {
inputTokens?: AISDKTokenCount;
outputTokens?: AISDKTokenCount;
totalTokens?: number;
tokens?: number;
total_tokens?: number;
promptTokens?: number;
prompt_tokens?: number;
completionTokens?: number;
completion_tokens?: number;
cachedInputTokens?: number;
promptCachedTokens?: number;
prompt_cached_tokens?: number;
promptCacheCreationTokens?: number;
prompt_cache_creation_tokens?: number;
promptReasoningTokens?: number;
prompt_reasoning_tokens?: number;
completionCachedTokens?: number;
completion_cached_tokens?: number;
reasoningTokens?: number;
completionReasoningTokens?: number;
completion_reasoning_tokens?: number;
reasoning_tokens?: number;
thinkingTokens?: number;
thinking_tokens?: number;
completionAudioTokens?: number;
completion_audio_tokens?: number;
}

export interface AISDKGatewayRouting {
resolvedProvider?: string;
finalProvider?: string;
resolvedProviderApiModelId?: string;
}

export interface AISDKGatewayMetadata {
routing?: AISDKGatewayRouting;
cost?: number | string;
marketCost?: number | string;
}

export interface AISDKProviderMetadata {
gateway?: AISDKGatewayMetadata;
[key: string]: unknown;
}

export interface AISDKStepResult {
providerMetadata?: AISDKProviderMetadata;
[key: string]: unknown;
}

export interface AISDKGeneratedFile {
mediaType?: string;
base64?: string;
uint8Array?: Uint8Array;
[key: string]: unknown;
}

export interface AISDKLanguageModel {
modelId?: string;
provider?: string;
supportsStructuredOutputs?: boolean;
doGenerate?: (options: AISDKCallParams) => Promise<AISDKResult>;
doStream?: (
options: AISDKCallParams,
) => Promise<AISDKResult & { stream: ReadableStream<AISDKModelStreamChunk> }>;
_braintrustWrapped?: boolean;
[key: string]: unknown;
}

export type AISDKModel = string | AISDKLanguageModel;

export interface AISDKOutputResponseFormat {
type?: unknown;
schema?: unknown;
[key: string]: unknown;
}

export interface AISDKSyncOutputObject {
type?: string;
responseFormat:
| AISDKOutputResponseFormat
| ((args: { model: AISDKLanguageModel }) => AISDKOutputResponseFormat);
[key: string]: unknown;
}

export interface AISDKAsyncOutputObject {
type?: string;
responseFormat:
| Promise<AISDKOutputResponseFormat>
| ((args: {
model: AISDKLanguageModel;
}) => AISDKOutputResponseFormat | Promise<AISDKOutputResponseFormat>);
[key: string]: unknown;
}

export type AISDKOutputObject = AISDKSyncOutputObject | AISDKAsyncOutputObject;

export interface AISDKMessage {
content?: unknown;
[key: string]: unknown;
}

export interface AISDKModelStreamChunk {
type: string;
textDelta?: string;
delta?: string;
text?: string;
content?: string;
object?: unknown;
rawValue?: {
delta?: { content?: string };
choices?: Array<{ delta?: { content?: string } }>;
text?: string;
content?: string;
[key: string]: unknown;
};
finishReason?: string;
usage?: AISDKUsage;
[key: string]: unknown;
}

export interface AISDKTool {
name?: string;
toolName?: string;
id?: string;
inputSchema?: unknown;
parameters?: unknown;
execute?: unknown;
render?: unknown;
[key: string]: unknown;
[key: symbol]: unknown;
}

export type AISDKTools = AISDKTool[] | Record<string, AISDKTool>;

export interface AISDKCallParams {
model?: AISDKModel;
prompt?: AISDKMessage[] | Record<string, unknown>;
messages?: AISDKMessage[];
tools?: AISDKTools;
schema?: unknown;
output?: unknown;
callOptionsSchema?: unknown;
onChunk?: (chunk: AISDKModelStreamChunk) => unknown;
onFinish?: (event: AISDKResult) => unknown;
onError?: (error: unknown) => unknown;
[key: string]: unknown;
}

type AISDKGeneratedFiles = AISDKGeneratedFile[] & Promise<AISDKGeneratedFile[]>;

export interface AISDKResult {
usage?: AISDKUsage;
totalUsage?: AISDKUsage;
providerMetadata?: AISDKProviderMetadata;
experimental_providerMetadata?: AISDKProviderMetadata;
steps?: AISDKStepResult[];
text?: string;
object?: unknown;
finishReason?: string;
toolCalls?: unknown[];
toolResults?: unknown[];
warnings?: unknown[];
rawResponse?: Record<string, unknown>;
response?: Record<string, unknown>;
request?: Record<string, unknown>;
files?: AISDKGeneratedFiles;
baseStream?: ReadableStream<unknown>;
stream?: ReadableStream<AISDKModelStreamChunk>;
[key: string]: unknown;
}

export type AISDKGenerateFunction = (
params: AISDKCallParams,
) => Promise<AISDKResult>;

export type AISDKStreamFunction = (params: AISDKCallParams) => AISDKResult;

export interface AISDKAgentInstance {
settings: AISDKCallParams;
generate: AISDKGenerateFunction;
stream: AISDKStreamFunction;
constructor: {
name: string;
};
[key: string]: unknown;
}

export interface AISDKAgentClass {
new (...args: unknown[]): AISDKAgentInstance;
}

export interface AISDKProviderResolver {
languageModel?: (modelId: string) => AISDKLanguageModel;
[key: string]: unknown;
}

export interface AISDKNamespaceBase {
generateText: AISDKGenerateFunction;
streamText: AISDKStreamFunction;
generateObject: AISDKGenerateFunction;
streamObject: AISDKStreamFunction;
gateway?: AISDKProviderResolver;
[key: string]: unknown;
}
12 changes: 12 additions & 0 deletions js/src/vendor-sdk-types/ai-sdk-v3.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
import type {
AISDKGenerateFunction,
AISDKNamespaceBase,
AISDKStreamFunction,
} from "./ai-sdk-common";

export interface AISDKV3 extends AISDKNamespaceBase {
experimental_generateText?: AISDKGenerateFunction;
experimental_streamText?: AISDKStreamFunction;
experimental_generateObject?: AISDKGenerateFunction;
experimental_streamObject?: AISDKStreamFunction;
}
3 changes: 3 additions & 0 deletions js/src/vendor-sdk-types/ai-sdk-v4.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
import type { AISDKNamespaceBase } from "./ai-sdk-common";

export type AISDKV4 = AISDKNamespaceBase;
6 changes: 6 additions & 0 deletions js/src/vendor-sdk-types/ai-sdk-v5.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
import type { AISDKAgentClass, AISDKNamespaceBase } from "./ai-sdk-common";

export interface AISDKV5 extends AISDKNamespaceBase {
Agent?: AISDKAgentClass;
Experimental_Agent?: AISDKAgentClass;
}
7 changes: 7 additions & 0 deletions js/src/vendor-sdk-types/ai-sdk-v6.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
import type { AISDKAgentClass, AISDKNamespaceBase } from "./ai-sdk-common";

export interface AISDKV6 extends AISDKNamespaceBase {
Agent?: AISDKAgentClass;
Experimental_Agent?: AISDKAgentClass;
ToolLoopAgent?: AISDKAgentClass;
}
63 changes: 63 additions & 0 deletions js/src/vendor-sdk-types/ai-sdk.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
import type {
AISDKAgentClass,
AISDKAgentInstance,
AISDKCallParams,
AISDKGeneratedFile,
AISDKGenerateFunction,
AISDKLanguageModel,
AISDKMessage,
AISDKModel,
AISDKModelStreamChunk,
AISDKNamespaceBase,
AISDKOutputObject,
AISDKOutputResponseFormat,
AISDKProviderMetadata,
AISDKProviderResolver,
AISDKResult,
AISDKStepResult,
AISDKStreamFunction,
AISDKSyncOutputObject,
AISDKAsyncOutputObject,
AISDKTool,
AISDKTools,
AISDKTokenBucket,
AISDKUsage,
} from "./ai-sdk-common";
import type { AISDKV3 } from "./ai-sdk-v3";
import type { AISDKV4 } from "./ai-sdk-v4";
import type { AISDKV5 } from "./ai-sdk-v5";
import type { AISDKV6 } from "./ai-sdk-v6";

export type AISDKVersion =
| { majorVersion: 3; sdk: AISDKV3 }
| { majorVersion: 4; sdk: AISDKV4 }
| { majorVersion: 5; sdk: AISDKV5 }
| { majorVersion: 6; sdk: AISDKV6 };

export type AISDK = AISDKVersion["sdk"];

export type {
AISDKAgentClass,
AISDKAgentInstance,
AISDKAsyncOutputObject,
AISDKCallParams,
AISDKGeneratedFile,
AISDKGenerateFunction,
AISDKLanguageModel,
AISDKMessage,
AISDKModel,
AISDKModelStreamChunk,
AISDKNamespaceBase,
AISDKOutputObject,
AISDKOutputResponseFormat,
AISDKProviderMetadata,
AISDKProviderResolver,
AISDKResult,
AISDKStepResult,
AISDKStreamFunction,
AISDKSyncOutputObject,
AISDKTool,
AISDKTools,
AISDKTokenBucket,
AISDKUsage,
};
Loading
Loading