braintrust 0.0.181 → 0.0.183
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/dist/browser.d.mts +3 -0
- package/dist/browser.d.ts +3 -0
- package/dist/browser.js +64 -49
- package/dist/browser.mjs +64 -49
- package/dist/cli.js +8 -4
- package/dist/index.d.mts +3 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.js +66 -51
- package/dist/index.mjs +66 -51
- package/package.json +2 -2
- package/turbo.json +1 -1
package/dist/browser.d.mts
CHANGED
|
@@ -1274,6 +1274,7 @@ declare class SpanImpl implements Span {
|
|
|
1274
1274
|
declare class Dataset<IsLegacyDataset extends boolean = typeof DEFAULT_IS_LEGACY_DATASET> extends ObjectFetcher<DatasetRecord<IsLegacyDataset>> {
|
|
1275
1275
|
private state;
|
|
1276
1276
|
private readonly lazyMetadata;
|
|
1277
|
+
private readonly __braintrust_dataset_marker;
|
|
1277
1278
|
constructor(state: BraintrustState, lazyMetadata: LazyValue<ProjectDatasetMetadata>, pinnedVersion?: string, legacy?: IsLegacyDataset);
|
|
1278
1279
|
get id(): Promise<string>;
|
|
1279
1280
|
get name(): Promise<string>;
|
|
@@ -1343,6 +1344,7 @@ declare class Dataset<IsLegacyDataset extends boolean = typeof DEFAULT_IS_LEGACY
|
|
|
1343
1344
|
* @deprecated This function is deprecated. You can simply remove it from your code.
|
|
1344
1345
|
*/
|
|
1345
1346
|
close(): Promise<string>;
|
|
1347
|
+
static isDataset(data: unknown): data is Dataset;
|
|
1346
1348
|
}
|
|
1347
1349
|
type CompiledPromptParams = Omit<NonNullable<PromptData["options"]>["params"], "use_cache"> & {
|
|
1348
1350
|
model: NonNullable<NonNullable<PromptData["options"]>["model"]>;
|
|
@@ -1845,6 +1847,7 @@ interface ChatLike {
|
|
|
1845
1847
|
interface OpenAILike {
|
|
1846
1848
|
chat: ChatLike;
|
|
1847
1849
|
embeddings: any;
|
|
1850
|
+
moderations: any;
|
|
1848
1851
|
beta?: BetaLike;
|
|
1849
1852
|
}
|
|
1850
1853
|
declare global {
|
package/dist/browser.d.ts
CHANGED
|
@@ -1274,6 +1274,7 @@ declare class SpanImpl implements Span {
|
|
|
1274
1274
|
declare class Dataset<IsLegacyDataset extends boolean = typeof DEFAULT_IS_LEGACY_DATASET> extends ObjectFetcher<DatasetRecord<IsLegacyDataset>> {
|
|
1275
1275
|
private state;
|
|
1276
1276
|
private readonly lazyMetadata;
|
|
1277
|
+
private readonly __braintrust_dataset_marker;
|
|
1277
1278
|
constructor(state: BraintrustState, lazyMetadata: LazyValue<ProjectDatasetMetadata>, pinnedVersion?: string, legacy?: IsLegacyDataset);
|
|
1278
1279
|
get id(): Promise<string>;
|
|
1279
1280
|
get name(): Promise<string>;
|
|
@@ -1343,6 +1344,7 @@ declare class Dataset<IsLegacyDataset extends boolean = typeof DEFAULT_IS_LEGACY
|
|
|
1343
1344
|
* @deprecated This function is deprecated. You can simply remove it from your code.
|
|
1344
1345
|
*/
|
|
1345
1346
|
close(): Promise<string>;
|
|
1347
|
+
static isDataset(data: unknown): data is Dataset;
|
|
1346
1348
|
}
|
|
1347
1349
|
type CompiledPromptParams = Omit<NonNullable<PromptData["options"]>["params"], "use_cache"> & {
|
|
1348
1350
|
model: NonNullable<NonNullable<PromptData["options"]>["model"]>;
|
|
@@ -1845,6 +1847,7 @@ interface ChatLike {
|
|
|
1845
1847
|
interface OpenAILike {
|
|
1846
1848
|
chat: ChatLike;
|
|
1847
1849
|
embeddings: any;
|
|
1850
|
+
moderations: any;
|
|
1848
1851
|
beta?: BetaLike;
|
|
1849
1852
|
}
|
|
1850
1853
|
declare global {
|
package/dist/browser.js
CHANGED
|
@@ -3437,6 +3437,7 @@ var Dataset = class extends ObjectFetcher {
|
|
|
3437
3437
|
this.lazyMetadata = lazyMetadata;
|
|
3438
3438
|
}
|
|
3439
3439
|
lazyMetadata;
|
|
3440
|
+
__braintrust_dataset_marker = true;
|
|
3440
3441
|
get id() {
|
|
3441
3442
|
return (async () => {
|
|
3442
3443
|
return (await this.lazyMetadata.get()).dataset.id;
|
|
@@ -3639,6 +3640,9 @@ var Dataset = class extends ObjectFetcher {
|
|
|
3639
3640
|
);
|
|
3640
3641
|
return this.id;
|
|
3641
3642
|
}
|
|
3643
|
+
static isDataset(data) {
|
|
3644
|
+
return typeof data === "object" && data !== null && "__braintrust_dataset_marker" in data;
|
|
3645
|
+
}
|
|
3642
3646
|
};
|
|
3643
3647
|
function renderMessage(render, message) {
|
|
3644
3648
|
return {
|
|
@@ -3990,16 +3994,11 @@ function wrapOpenAI(openai) {
|
|
|
3990
3994
|
}
|
|
3991
3995
|
globalThis.__inherited_braintrust_wrap_openai = wrapOpenAI;
|
|
3992
3996
|
function wrapOpenAIv4(openai) {
|
|
3993
|
-
|
|
3994
|
-
|
|
3995
|
-
|
|
3996
|
-
|
|
3997
|
-
|
|
3998
|
-
}
|
|
3999
|
-
return baseVal;
|
|
4000
|
-
}
|
|
4001
|
-
});
|
|
4002
|
-
let chatProxy = new Proxy(openai.chat, {
|
|
3997
|
+
const completionProxy = createEndpointProxy(
|
|
3998
|
+
openai.chat.completions,
|
|
3999
|
+
wrapChatCompletion
|
|
4000
|
+
);
|
|
4001
|
+
const chatProxy = new Proxy(openai.chat, {
|
|
4003
4002
|
get(target, name, receiver) {
|
|
4004
4003
|
if (name === "completions") {
|
|
4005
4004
|
return completionProxy;
|
|
@@ -4007,18 +4006,11 @@ function wrapOpenAIv4(openai) {
|
|
|
4007
4006
|
return Reflect.get(target, name, receiver);
|
|
4008
4007
|
}
|
|
4009
4008
|
});
|
|
4010
|
-
|
|
4011
|
-
|
|
4012
|
-
const baseVal = Reflect.get(target, name, receiver);
|
|
4013
|
-
if (name === "create") {
|
|
4014
|
-
return wrapEmbeddings(baseVal.bind(target));
|
|
4015
|
-
}
|
|
4016
|
-
return baseVal;
|
|
4017
|
-
}
|
|
4018
|
-
});
|
|
4009
|
+
const embeddingProxy = createEndpointProxy(openai.embeddings, wrapEmbeddings);
|
|
4010
|
+
const moderationProxy = createEndpointProxy(openai.moderations, wrapModerations);
|
|
4019
4011
|
let betaProxy;
|
|
4020
4012
|
if (openai.beta?.chat?.completions?.stream) {
|
|
4021
|
-
|
|
4013
|
+
const betaChatCompletionProxy = new Proxy(openai?.beta?.chat.completions, {
|
|
4022
4014
|
get(target, name, receiver) {
|
|
4023
4015
|
const baseVal = Reflect.get(target, name, receiver);
|
|
4024
4016
|
if (name === "parse") {
|
|
@@ -4029,7 +4021,7 @@ function wrapOpenAIv4(openai) {
|
|
|
4029
4021
|
return baseVal;
|
|
4030
4022
|
}
|
|
4031
4023
|
});
|
|
4032
|
-
|
|
4024
|
+
const betaChatProxy = new Proxy(openai.beta.chat, {
|
|
4033
4025
|
get(target, name, receiver) {
|
|
4034
4026
|
if (name === "completions") {
|
|
4035
4027
|
return betaChatCompletionProxy;
|
|
@@ -4046,7 +4038,7 @@ function wrapOpenAIv4(openai) {
|
|
|
4046
4038
|
}
|
|
4047
4039
|
});
|
|
4048
4040
|
}
|
|
4049
|
-
|
|
4041
|
+
return new Proxy(openai, {
|
|
4050
4042
|
get(target, name, receiver) {
|
|
4051
4043
|
if (name === "chat") {
|
|
4052
4044
|
return chatProxy;
|
|
@@ -4054,13 +4046,15 @@ function wrapOpenAIv4(openai) {
|
|
|
4054
4046
|
if (name === "embeddings") {
|
|
4055
4047
|
return embeddingProxy;
|
|
4056
4048
|
}
|
|
4049
|
+
if (name === "moderations") {
|
|
4050
|
+
return moderationProxy;
|
|
4051
|
+
}
|
|
4057
4052
|
if (name === "beta" && betaProxy) {
|
|
4058
4053
|
return betaProxy;
|
|
4059
4054
|
}
|
|
4060
4055
|
return Reflect.get(target, name, receiver);
|
|
4061
4056
|
}
|
|
4062
4057
|
});
|
|
4063
|
-
return proxy;
|
|
4064
4058
|
}
|
|
4065
4059
|
function logCompletionResponse(startTime, response, span) {
|
|
4066
4060
|
span.log({
|
|
@@ -4209,7 +4203,7 @@ function wrapChatCompletion(completion) {
|
|
|
4209
4203
|
}
|
|
4210
4204
|
};
|
|
4211
4205
|
}
|
|
4212
|
-
function
|
|
4206
|
+
function parseBaseParams(allParams, inputField) {
|
|
4213
4207
|
const { span_info, ...params } = allParams;
|
|
4214
4208
|
const { metadata: spanInfoMetadata, ...spanInfoRest } = span_info ?? {};
|
|
4215
4209
|
let ret = {
|
|
@@ -4218,10 +4212,12 @@ function parseChatCompletionParams(allParams) {
|
|
|
4218
4212
|
metadata: spanInfoMetadata
|
|
4219
4213
|
}
|
|
4220
4214
|
};
|
|
4221
|
-
const
|
|
4222
|
-
|
|
4215
|
+
const input = params[inputField];
|
|
4216
|
+
const paramsRest = { ...params };
|
|
4217
|
+
delete paramsRest[inputField];
|
|
4218
|
+
return (0, import_core3.mergeDicts)(ret, { event: { input, metadata: paramsRest } });
|
|
4223
4219
|
}
|
|
4224
|
-
function
|
|
4220
|
+
function createApiWrapper(name, create, processResponse, parseParams) {
|
|
4225
4221
|
return async (allParams, options) => {
|
|
4226
4222
|
const { span_info: _, ...params } = allParams;
|
|
4227
4223
|
return traced(
|
|
@@ -4231,42 +4227,61 @@ function wrapEmbeddings(create) {
|
|
|
4231
4227
|
options
|
|
4232
4228
|
).withResponse();
|
|
4233
4229
|
logHeaders(response, span);
|
|
4234
|
-
|
|
4235
|
-
span.log({
|
|
4236
|
-
// TODO: Add a flag to control whether to log the full embedding vector,
|
|
4237
|
-
// possibly w/ JSON compression.
|
|
4238
|
-
output: { embedding_length },
|
|
4239
|
-
metrics: {
|
|
4240
|
-
tokens: result.usage?.total_tokens,
|
|
4241
|
-
prompt_tokens: result.usage?.prompt_tokens
|
|
4242
|
-
}
|
|
4243
|
-
});
|
|
4230
|
+
processResponse(result, span);
|
|
4244
4231
|
return result;
|
|
4245
4232
|
},
|
|
4246
4233
|
(0, import_core3.mergeDicts)(
|
|
4247
4234
|
{
|
|
4248
|
-
name
|
|
4235
|
+
name,
|
|
4249
4236
|
spanAttributes: {
|
|
4250
4237
|
type: import_core2.SpanTypeAttribute.LLM
|
|
4251
4238
|
}
|
|
4252
4239
|
},
|
|
4253
|
-
|
|
4240
|
+
parseParams(allParams)
|
|
4254
4241
|
)
|
|
4255
4242
|
);
|
|
4256
4243
|
};
|
|
4257
4244
|
}
|
|
4258
|
-
function
|
|
4259
|
-
|
|
4260
|
-
|
|
4261
|
-
|
|
4262
|
-
|
|
4263
|
-
|
|
4264
|
-
|
|
4245
|
+
function createEndpointProxy(target, wrapperFn) {
|
|
4246
|
+
return new Proxy(target, {
|
|
4247
|
+
get(target2, name, receiver) {
|
|
4248
|
+
const baseVal = Reflect.get(target2, name, receiver);
|
|
4249
|
+
if (name === "create") {
|
|
4250
|
+
return wrapperFn(baseVal.bind(target2));
|
|
4251
|
+
}
|
|
4252
|
+
return baseVal;
|
|
4265
4253
|
}
|
|
4266
|
-
};
|
|
4267
|
-
|
|
4268
|
-
|
|
4254
|
+
});
|
|
4255
|
+
}
|
|
4256
|
+
function parseChatCompletionParams(params) {
|
|
4257
|
+
return parseBaseParams(params, "messages");
|
|
4258
|
+
}
|
|
4259
|
+
function processEmbeddingResponse(result, span) {
|
|
4260
|
+
span.log({
|
|
4261
|
+
output: { embedding_length: result.data[0].embedding.length },
|
|
4262
|
+
metrics: {
|
|
4263
|
+
tokens: result.usage?.total_tokens,
|
|
4264
|
+
prompt_tokens: result.usage?.prompt_tokens
|
|
4265
|
+
}
|
|
4266
|
+
});
|
|
4267
|
+
}
|
|
4268
|
+
function processModerationResponse(result, span) {
|
|
4269
|
+
span.log({
|
|
4270
|
+
output: result.results
|
|
4271
|
+
});
|
|
4269
4272
|
}
|
|
4273
|
+
var wrapEmbeddings = (create) => createApiWrapper(
|
|
4274
|
+
"Embedding",
|
|
4275
|
+
create,
|
|
4276
|
+
processEmbeddingResponse,
|
|
4277
|
+
(params) => parseBaseParams(params, "input")
|
|
4278
|
+
);
|
|
4279
|
+
var wrapModerations = (create) => createApiWrapper(
|
|
4280
|
+
"Moderation",
|
|
4281
|
+
create,
|
|
4282
|
+
processModerationResponse,
|
|
4283
|
+
(params) => parseBaseParams(params, "input")
|
|
4284
|
+
);
|
|
4270
4285
|
function postprocessStreamingResults(allResults) {
|
|
4271
4286
|
let role = void 0;
|
|
4272
4287
|
let content = void 0;
|
package/dist/browser.mjs
CHANGED
|
@@ -3385,6 +3385,7 @@ var Dataset = class extends ObjectFetcher {
|
|
|
3385
3385
|
this.lazyMetadata = lazyMetadata;
|
|
3386
3386
|
}
|
|
3387
3387
|
lazyMetadata;
|
|
3388
|
+
__braintrust_dataset_marker = true;
|
|
3388
3389
|
get id() {
|
|
3389
3390
|
return (async () => {
|
|
3390
3391
|
return (await this.lazyMetadata.get()).dataset.id;
|
|
@@ -3587,6 +3588,9 @@ var Dataset = class extends ObjectFetcher {
|
|
|
3587
3588
|
);
|
|
3588
3589
|
return this.id;
|
|
3589
3590
|
}
|
|
3591
|
+
static isDataset(data) {
|
|
3592
|
+
return typeof data === "object" && data !== null && "__braintrust_dataset_marker" in data;
|
|
3593
|
+
}
|
|
3590
3594
|
};
|
|
3591
3595
|
function renderMessage(render, message) {
|
|
3592
3596
|
return {
|
|
@@ -3940,16 +3944,11 @@ function wrapOpenAI(openai) {
|
|
|
3940
3944
|
}
|
|
3941
3945
|
globalThis.__inherited_braintrust_wrap_openai = wrapOpenAI;
|
|
3942
3946
|
function wrapOpenAIv4(openai) {
|
|
3943
|
-
|
|
3944
|
-
|
|
3945
|
-
|
|
3946
|
-
|
|
3947
|
-
|
|
3948
|
-
}
|
|
3949
|
-
return baseVal;
|
|
3950
|
-
}
|
|
3951
|
-
});
|
|
3952
|
-
let chatProxy = new Proxy(openai.chat, {
|
|
3947
|
+
const completionProxy = createEndpointProxy(
|
|
3948
|
+
openai.chat.completions,
|
|
3949
|
+
wrapChatCompletion
|
|
3950
|
+
);
|
|
3951
|
+
const chatProxy = new Proxy(openai.chat, {
|
|
3953
3952
|
get(target, name, receiver) {
|
|
3954
3953
|
if (name === "completions") {
|
|
3955
3954
|
return completionProxy;
|
|
@@ -3957,18 +3956,11 @@ function wrapOpenAIv4(openai) {
|
|
|
3957
3956
|
return Reflect.get(target, name, receiver);
|
|
3958
3957
|
}
|
|
3959
3958
|
});
|
|
3960
|
-
|
|
3961
|
-
|
|
3962
|
-
const baseVal = Reflect.get(target, name, receiver);
|
|
3963
|
-
if (name === "create") {
|
|
3964
|
-
return wrapEmbeddings(baseVal.bind(target));
|
|
3965
|
-
}
|
|
3966
|
-
return baseVal;
|
|
3967
|
-
}
|
|
3968
|
-
});
|
|
3959
|
+
const embeddingProxy = createEndpointProxy(openai.embeddings, wrapEmbeddings);
|
|
3960
|
+
const moderationProxy = createEndpointProxy(openai.moderations, wrapModerations);
|
|
3969
3961
|
let betaProxy;
|
|
3970
3962
|
if (openai.beta?.chat?.completions?.stream) {
|
|
3971
|
-
|
|
3963
|
+
const betaChatCompletionProxy = new Proxy(openai?.beta?.chat.completions, {
|
|
3972
3964
|
get(target, name, receiver) {
|
|
3973
3965
|
const baseVal = Reflect.get(target, name, receiver);
|
|
3974
3966
|
if (name === "parse") {
|
|
@@ -3979,7 +3971,7 @@ function wrapOpenAIv4(openai) {
|
|
|
3979
3971
|
return baseVal;
|
|
3980
3972
|
}
|
|
3981
3973
|
});
|
|
3982
|
-
|
|
3974
|
+
const betaChatProxy = new Proxy(openai.beta.chat, {
|
|
3983
3975
|
get(target, name, receiver) {
|
|
3984
3976
|
if (name === "completions") {
|
|
3985
3977
|
return betaChatCompletionProxy;
|
|
@@ -3996,7 +3988,7 @@ function wrapOpenAIv4(openai) {
|
|
|
3996
3988
|
}
|
|
3997
3989
|
});
|
|
3998
3990
|
}
|
|
3999
|
-
|
|
3991
|
+
return new Proxy(openai, {
|
|
4000
3992
|
get(target, name, receiver) {
|
|
4001
3993
|
if (name === "chat") {
|
|
4002
3994
|
return chatProxy;
|
|
@@ -4004,13 +3996,15 @@ function wrapOpenAIv4(openai) {
|
|
|
4004
3996
|
if (name === "embeddings") {
|
|
4005
3997
|
return embeddingProxy;
|
|
4006
3998
|
}
|
|
3999
|
+
if (name === "moderations") {
|
|
4000
|
+
return moderationProxy;
|
|
4001
|
+
}
|
|
4007
4002
|
if (name === "beta" && betaProxy) {
|
|
4008
4003
|
return betaProxy;
|
|
4009
4004
|
}
|
|
4010
4005
|
return Reflect.get(target, name, receiver);
|
|
4011
4006
|
}
|
|
4012
4007
|
});
|
|
4013
|
-
return proxy;
|
|
4014
4008
|
}
|
|
4015
4009
|
function logCompletionResponse(startTime, response, span) {
|
|
4016
4010
|
span.log({
|
|
@@ -4159,7 +4153,7 @@ function wrapChatCompletion(completion) {
|
|
|
4159
4153
|
}
|
|
4160
4154
|
};
|
|
4161
4155
|
}
|
|
4162
|
-
function
|
|
4156
|
+
function parseBaseParams(allParams, inputField) {
|
|
4163
4157
|
const { span_info, ...params } = allParams;
|
|
4164
4158
|
const { metadata: spanInfoMetadata, ...spanInfoRest } = span_info ?? {};
|
|
4165
4159
|
let ret = {
|
|
@@ -4168,10 +4162,12 @@ function parseChatCompletionParams(allParams) {
|
|
|
4168
4162
|
metadata: spanInfoMetadata
|
|
4169
4163
|
}
|
|
4170
4164
|
};
|
|
4171
|
-
const
|
|
4172
|
-
|
|
4165
|
+
const input = params[inputField];
|
|
4166
|
+
const paramsRest = { ...params };
|
|
4167
|
+
delete paramsRest[inputField];
|
|
4168
|
+
return mergeDicts2(ret, { event: { input, metadata: paramsRest } });
|
|
4173
4169
|
}
|
|
4174
|
-
function
|
|
4170
|
+
function createApiWrapper(name, create, processResponse, parseParams) {
|
|
4175
4171
|
return async (allParams, options) => {
|
|
4176
4172
|
const { span_info: _, ...params } = allParams;
|
|
4177
4173
|
return traced(
|
|
@@ -4181,42 +4177,61 @@ function wrapEmbeddings(create) {
|
|
|
4181
4177
|
options
|
|
4182
4178
|
).withResponse();
|
|
4183
4179
|
logHeaders(response, span);
|
|
4184
|
-
|
|
4185
|
-
span.log({
|
|
4186
|
-
// TODO: Add a flag to control whether to log the full embedding vector,
|
|
4187
|
-
// possibly w/ JSON compression.
|
|
4188
|
-
output: { embedding_length },
|
|
4189
|
-
metrics: {
|
|
4190
|
-
tokens: result.usage?.total_tokens,
|
|
4191
|
-
prompt_tokens: result.usage?.prompt_tokens
|
|
4192
|
-
}
|
|
4193
|
-
});
|
|
4180
|
+
processResponse(result, span);
|
|
4194
4181
|
return result;
|
|
4195
4182
|
},
|
|
4196
4183
|
mergeDicts2(
|
|
4197
4184
|
{
|
|
4198
|
-
name
|
|
4185
|
+
name,
|
|
4199
4186
|
spanAttributes: {
|
|
4200
4187
|
type: SpanTypeAttribute2.LLM
|
|
4201
4188
|
}
|
|
4202
4189
|
},
|
|
4203
|
-
|
|
4190
|
+
parseParams(allParams)
|
|
4204
4191
|
)
|
|
4205
4192
|
);
|
|
4206
4193
|
};
|
|
4207
4194
|
}
|
|
4208
|
-
function
|
|
4209
|
-
|
|
4210
|
-
|
|
4211
|
-
|
|
4212
|
-
|
|
4213
|
-
|
|
4214
|
-
|
|
4195
|
+
function createEndpointProxy(target, wrapperFn) {
|
|
4196
|
+
return new Proxy(target, {
|
|
4197
|
+
get(target2, name, receiver) {
|
|
4198
|
+
const baseVal = Reflect.get(target2, name, receiver);
|
|
4199
|
+
if (name === "create") {
|
|
4200
|
+
return wrapperFn(baseVal.bind(target2));
|
|
4201
|
+
}
|
|
4202
|
+
return baseVal;
|
|
4215
4203
|
}
|
|
4216
|
-
};
|
|
4217
|
-
|
|
4218
|
-
|
|
4204
|
+
});
|
|
4205
|
+
}
|
|
4206
|
+
function parseChatCompletionParams(params) {
|
|
4207
|
+
return parseBaseParams(params, "messages");
|
|
4208
|
+
}
|
|
4209
|
+
function processEmbeddingResponse(result, span) {
|
|
4210
|
+
span.log({
|
|
4211
|
+
output: { embedding_length: result.data[0].embedding.length },
|
|
4212
|
+
metrics: {
|
|
4213
|
+
tokens: result.usage?.total_tokens,
|
|
4214
|
+
prompt_tokens: result.usage?.prompt_tokens
|
|
4215
|
+
}
|
|
4216
|
+
});
|
|
4217
|
+
}
|
|
4218
|
+
function processModerationResponse(result, span) {
|
|
4219
|
+
span.log({
|
|
4220
|
+
output: result.results
|
|
4221
|
+
});
|
|
4219
4222
|
}
|
|
4223
|
+
var wrapEmbeddings = (create) => createApiWrapper(
|
|
4224
|
+
"Embedding",
|
|
4225
|
+
create,
|
|
4226
|
+
processEmbeddingResponse,
|
|
4227
|
+
(params) => parseBaseParams(params, "input")
|
|
4228
|
+
);
|
|
4229
|
+
var wrapModerations = (create) => createApiWrapper(
|
|
4230
|
+
"Moderation",
|
|
4231
|
+
create,
|
|
4232
|
+
processModerationResponse,
|
|
4233
|
+
(params) => parseBaseParams(params, "input")
|
|
4234
|
+
);
|
|
4220
4235
|
function postprocessStreamingResults(allResults) {
|
|
4221
4236
|
let role = void 0;
|
|
4222
4237
|
let content = void 0;
|
package/dist/cli.js
CHANGED
|
@@ -1236,7 +1236,7 @@ var require_package = __commonJS({
|
|
|
1236
1236
|
"package.json"(exports2, module2) {
|
|
1237
1237
|
module2.exports = {
|
|
1238
1238
|
name: "braintrust",
|
|
1239
|
-
version: "0.0.
|
|
1239
|
+
version: "0.0.183",
|
|
1240
1240
|
description: "SDK for integrating Braintrust",
|
|
1241
1241
|
repository: {
|
|
1242
1242
|
type: "git",
|
|
@@ -1311,7 +1311,7 @@ var require_package = __commonJS({
|
|
|
1311
1311
|
},
|
|
1312
1312
|
dependencies: {
|
|
1313
1313
|
"@ai-sdk/provider": "^1.0.1",
|
|
1314
|
-
"@braintrust/core": "0.0.
|
|
1314
|
+
"@braintrust/core": "0.0.77",
|
|
1315
1315
|
"@next/env": "^14.2.3",
|
|
1316
1316
|
"@vercel/functions": "^1.0.2",
|
|
1317
1317
|
ai: "^3.2.16",
|
|
@@ -4404,6 +4404,7 @@ var Dataset = class extends ObjectFetcher {
|
|
|
4404
4404
|
this.lazyMetadata = lazyMetadata;
|
|
4405
4405
|
}
|
|
4406
4406
|
lazyMetadata;
|
|
4407
|
+
__braintrust_dataset_marker = true;
|
|
4407
4408
|
get id() {
|
|
4408
4409
|
return (async () => {
|
|
4409
4410
|
return (await this.lazyMetadata.get()).dataset.id;
|
|
@@ -4606,6 +4607,9 @@ var Dataset = class extends ObjectFetcher {
|
|
|
4606
4607
|
);
|
|
4607
4608
|
return this.id;
|
|
4608
4609
|
}
|
|
4610
|
+
static isDataset(data) {
|
|
4611
|
+
return typeof data === "object" && data !== null && "__braintrust_dataset_marker" in data;
|
|
4612
|
+
}
|
|
4609
4613
|
};
|
|
4610
4614
|
function renderMessage(render, message) {
|
|
4611
4615
|
return {
|
|
@@ -6099,7 +6103,7 @@ async function runEvaluatorInternal(experiment, evaluator, progressReporter, fil
|
|
|
6099
6103
|
const q = queue(
|
|
6100
6104
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
6101
6105
|
async (datum) => {
|
|
6102
|
-
const eventDataset = experiment ? experiment.dataset : evaluator.data
|
|
6106
|
+
const eventDataset = experiment ? experiment.dataset : Dataset.isDataset(evaluator.data) ? evaluator.data : void 0;
|
|
6103
6107
|
const baseEvent = {
|
|
6104
6108
|
name: "eval",
|
|
6105
6109
|
spanAttributes: {
|
|
@@ -7821,7 +7825,7 @@ async function initExperiment2(evaluator, evaluatorData) {
|
|
|
7821
7825
|
baseExperimentId: evaluator.baseExperimentId,
|
|
7822
7826
|
gitMetadataSettings: evaluator.gitMetadataSettings,
|
|
7823
7827
|
repoInfo: evaluator.repoInfo,
|
|
7824
|
-
dataset: data
|
|
7828
|
+
dataset: Dataset.isDataset(data) ? data : void 0,
|
|
7825
7829
|
setCurrent: false
|
|
7826
7830
|
});
|
|
7827
7831
|
const info = await logger.summarize({ summarizeScores: false });
|
package/dist/index.d.mts
CHANGED
|
@@ -1276,6 +1276,7 @@ declare class SpanImpl implements Span {
|
|
|
1276
1276
|
declare class Dataset<IsLegacyDataset extends boolean = typeof DEFAULT_IS_LEGACY_DATASET> extends ObjectFetcher<DatasetRecord<IsLegacyDataset>> {
|
|
1277
1277
|
private state;
|
|
1278
1278
|
private readonly lazyMetadata;
|
|
1279
|
+
private readonly __braintrust_dataset_marker;
|
|
1279
1280
|
constructor(state: BraintrustState, lazyMetadata: LazyValue<ProjectDatasetMetadata>, pinnedVersion?: string, legacy?: IsLegacyDataset);
|
|
1280
1281
|
get id(): Promise<string>;
|
|
1281
1282
|
get name(): Promise<string>;
|
|
@@ -1345,6 +1346,7 @@ declare class Dataset<IsLegacyDataset extends boolean = typeof DEFAULT_IS_LEGACY
|
|
|
1345
1346
|
* @deprecated This function is deprecated. You can simply remove it from your code.
|
|
1346
1347
|
*/
|
|
1347
1348
|
close(): Promise<string>;
|
|
1349
|
+
static isDataset(data: unknown): data is Dataset;
|
|
1348
1350
|
}
|
|
1349
1351
|
type CompiledPromptParams = Omit<NonNullable<PromptData["options"]>["params"], "use_cache"> & {
|
|
1350
1352
|
model: NonNullable<NonNullable<PromptData["options"]>["model"]>;
|
|
@@ -2200,6 +2202,7 @@ interface ChatLike {
|
|
|
2200
2202
|
interface OpenAILike {
|
|
2201
2203
|
chat: ChatLike;
|
|
2202
2204
|
embeddings: any;
|
|
2205
|
+
moderations: any;
|
|
2203
2206
|
beta?: BetaLike;
|
|
2204
2207
|
}
|
|
2205
2208
|
declare global {
|
package/dist/index.d.ts
CHANGED
|
@@ -1276,6 +1276,7 @@ declare class SpanImpl implements Span {
|
|
|
1276
1276
|
declare class Dataset<IsLegacyDataset extends boolean = typeof DEFAULT_IS_LEGACY_DATASET> extends ObjectFetcher<DatasetRecord<IsLegacyDataset>> {
|
|
1277
1277
|
private state;
|
|
1278
1278
|
private readonly lazyMetadata;
|
|
1279
|
+
private readonly __braintrust_dataset_marker;
|
|
1279
1280
|
constructor(state: BraintrustState, lazyMetadata: LazyValue<ProjectDatasetMetadata>, pinnedVersion?: string, legacy?: IsLegacyDataset);
|
|
1280
1281
|
get id(): Promise<string>;
|
|
1281
1282
|
get name(): Promise<string>;
|
|
@@ -1345,6 +1346,7 @@ declare class Dataset<IsLegacyDataset extends boolean = typeof DEFAULT_IS_LEGACY
|
|
|
1345
1346
|
* @deprecated This function is deprecated. You can simply remove it from your code.
|
|
1346
1347
|
*/
|
|
1347
1348
|
close(): Promise<string>;
|
|
1349
|
+
static isDataset(data: unknown): data is Dataset;
|
|
1348
1350
|
}
|
|
1349
1351
|
type CompiledPromptParams = Omit<NonNullable<PromptData["options"]>["params"], "use_cache"> & {
|
|
1350
1352
|
model: NonNullable<NonNullable<PromptData["options"]>["model"]>;
|
|
@@ -2200,6 +2202,7 @@ interface ChatLike {
|
|
|
2200
2202
|
interface OpenAILike {
|
|
2201
2203
|
chat: ChatLike;
|
|
2202
2204
|
embeddings: any;
|
|
2205
|
+
moderations: any;
|
|
2203
2206
|
beta?: BetaLike;
|
|
2204
2207
|
}
|
|
2205
2208
|
declare global {
|
package/dist/index.js
CHANGED
|
@@ -3673,6 +3673,7 @@ var Dataset = class extends ObjectFetcher {
|
|
|
3673
3673
|
this.lazyMetadata = lazyMetadata;
|
|
3674
3674
|
}
|
|
3675
3675
|
lazyMetadata;
|
|
3676
|
+
__braintrust_dataset_marker = true;
|
|
3676
3677
|
get id() {
|
|
3677
3678
|
return (async () => {
|
|
3678
3679
|
return (await this.lazyMetadata.get()).dataset.id;
|
|
@@ -3875,6 +3876,9 @@ var Dataset = class extends ObjectFetcher {
|
|
|
3875
3876
|
);
|
|
3876
3877
|
return this.id;
|
|
3877
3878
|
}
|
|
3879
|
+
static isDataset(data) {
|
|
3880
|
+
return typeof data === "object" && data !== null && "__braintrust_dataset_marker" in data;
|
|
3881
|
+
}
|
|
3878
3882
|
};
|
|
3879
3883
|
function renderMessage(render, message) {
|
|
3880
3884
|
return {
|
|
@@ -5485,7 +5489,7 @@ async function Eval(name, evaluator, reporterOrOpts) {
|
|
|
5485
5489
|
baseExperimentId: evaluator.baseExperimentId,
|
|
5486
5490
|
gitMetadataSettings: evaluator.gitMetadataSettings,
|
|
5487
5491
|
repoInfo: evaluator.repoInfo,
|
|
5488
|
-
dataset: data
|
|
5492
|
+
dataset: Dataset.isDataset(data) ? data : void 0
|
|
5489
5493
|
});
|
|
5490
5494
|
if (experiment && options.onStart) {
|
|
5491
5495
|
const summary = await experiment.summarize({ summarizeScores: false });
|
|
@@ -5636,7 +5640,7 @@ async function runEvaluatorInternal(experiment, evaluator, progressReporter, fil
|
|
|
5636
5640
|
const q = queue(
|
|
5637
5641
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
5638
5642
|
async (datum) => {
|
|
5639
|
-
const eventDataset = experiment ? experiment.dataset : evaluator.data
|
|
5643
|
+
const eventDataset = experiment ? experiment.dataset : Dataset.isDataset(evaluator.data) ? evaluator.data : void 0;
|
|
5640
5644
|
const baseEvent = {
|
|
5641
5645
|
name: "eval",
|
|
5642
5646
|
spanAttributes: {
|
|
@@ -6190,16 +6194,11 @@ function wrapOpenAI(openai) {
|
|
|
6190
6194
|
}
|
|
6191
6195
|
globalThis.__inherited_braintrust_wrap_openai = wrapOpenAI;
|
|
6192
6196
|
function wrapOpenAIv4(openai) {
|
|
6193
|
-
|
|
6194
|
-
|
|
6195
|
-
|
|
6196
|
-
|
|
6197
|
-
|
|
6198
|
-
}
|
|
6199
|
-
return baseVal;
|
|
6200
|
-
}
|
|
6201
|
-
});
|
|
6202
|
-
let chatProxy = new Proxy(openai.chat, {
|
|
6197
|
+
const completionProxy = createEndpointProxy(
|
|
6198
|
+
openai.chat.completions,
|
|
6199
|
+
wrapChatCompletion
|
|
6200
|
+
);
|
|
6201
|
+
const chatProxy = new Proxy(openai.chat, {
|
|
6203
6202
|
get(target, name, receiver) {
|
|
6204
6203
|
if (name === "completions") {
|
|
6205
6204
|
return completionProxy;
|
|
@@ -6207,18 +6206,11 @@ function wrapOpenAIv4(openai) {
|
|
|
6207
6206
|
return Reflect.get(target, name, receiver);
|
|
6208
6207
|
}
|
|
6209
6208
|
});
|
|
6210
|
-
|
|
6211
|
-
|
|
6212
|
-
const baseVal = Reflect.get(target, name, receiver);
|
|
6213
|
-
if (name === "create") {
|
|
6214
|
-
return wrapEmbeddings(baseVal.bind(target));
|
|
6215
|
-
}
|
|
6216
|
-
return baseVal;
|
|
6217
|
-
}
|
|
6218
|
-
});
|
|
6209
|
+
const embeddingProxy = createEndpointProxy(openai.embeddings, wrapEmbeddings);
|
|
6210
|
+
const moderationProxy = createEndpointProxy(openai.moderations, wrapModerations);
|
|
6219
6211
|
let betaProxy;
|
|
6220
6212
|
if (openai.beta?.chat?.completions?.stream) {
|
|
6221
|
-
|
|
6213
|
+
const betaChatCompletionProxy = new Proxy(openai?.beta?.chat.completions, {
|
|
6222
6214
|
get(target, name, receiver) {
|
|
6223
6215
|
const baseVal = Reflect.get(target, name, receiver);
|
|
6224
6216
|
if (name === "parse") {
|
|
@@ -6229,7 +6221,7 @@ function wrapOpenAIv4(openai) {
|
|
|
6229
6221
|
return baseVal;
|
|
6230
6222
|
}
|
|
6231
6223
|
});
|
|
6232
|
-
|
|
6224
|
+
const betaChatProxy = new Proxy(openai.beta.chat, {
|
|
6233
6225
|
get(target, name, receiver) {
|
|
6234
6226
|
if (name === "completions") {
|
|
6235
6227
|
return betaChatCompletionProxy;
|
|
@@ -6246,7 +6238,7 @@ function wrapOpenAIv4(openai) {
|
|
|
6246
6238
|
}
|
|
6247
6239
|
});
|
|
6248
6240
|
}
|
|
6249
|
-
|
|
6241
|
+
return new Proxy(openai, {
|
|
6250
6242
|
get(target, name, receiver) {
|
|
6251
6243
|
if (name === "chat") {
|
|
6252
6244
|
return chatProxy;
|
|
@@ -6254,13 +6246,15 @@ function wrapOpenAIv4(openai) {
|
|
|
6254
6246
|
if (name === "embeddings") {
|
|
6255
6247
|
return embeddingProxy;
|
|
6256
6248
|
}
|
|
6249
|
+
if (name === "moderations") {
|
|
6250
|
+
return moderationProxy;
|
|
6251
|
+
}
|
|
6257
6252
|
if (name === "beta" && betaProxy) {
|
|
6258
6253
|
return betaProxy;
|
|
6259
6254
|
}
|
|
6260
6255
|
return Reflect.get(target, name, receiver);
|
|
6261
6256
|
}
|
|
6262
6257
|
});
|
|
6263
|
-
return proxy;
|
|
6264
6258
|
}
|
|
6265
6259
|
function logCompletionResponse(startTime, response, span) {
|
|
6266
6260
|
span.log({
|
|
@@ -6409,7 +6403,7 @@ function wrapChatCompletion(completion) {
|
|
|
6409
6403
|
}
|
|
6410
6404
|
};
|
|
6411
6405
|
}
|
|
6412
|
-
function
|
|
6406
|
+
function parseBaseParams(allParams, inputField) {
|
|
6413
6407
|
const { span_info, ...params } = allParams;
|
|
6414
6408
|
const { metadata: spanInfoMetadata, ...spanInfoRest } = span_info ?? {};
|
|
6415
6409
|
let ret = {
|
|
@@ -6418,10 +6412,12 @@ function parseChatCompletionParams(allParams) {
|
|
|
6418
6412
|
metadata: spanInfoMetadata
|
|
6419
6413
|
}
|
|
6420
6414
|
};
|
|
6421
|
-
const
|
|
6422
|
-
|
|
6415
|
+
const input = params[inputField];
|
|
6416
|
+
const paramsRest = { ...params };
|
|
6417
|
+
delete paramsRest[inputField];
|
|
6418
|
+
return (0, import_core4.mergeDicts)(ret, { event: { input, metadata: paramsRest } });
|
|
6423
6419
|
}
|
|
6424
|
-
function
|
|
6420
|
+
function createApiWrapper(name, create, processResponse, parseParams) {
|
|
6425
6421
|
return async (allParams, options) => {
|
|
6426
6422
|
const { span_info: _, ...params } = allParams;
|
|
6427
6423
|
return traced(
|
|
@@ -6431,42 +6427,61 @@ function wrapEmbeddings(create) {
|
|
|
6431
6427
|
options
|
|
6432
6428
|
).withResponse();
|
|
6433
6429
|
logHeaders(response, span);
|
|
6434
|
-
|
|
6435
|
-
span.log({
|
|
6436
|
-
// TODO: Add a flag to control whether to log the full embedding vector,
|
|
6437
|
-
// possibly w/ JSON compression.
|
|
6438
|
-
output: { embedding_length },
|
|
6439
|
-
metrics: {
|
|
6440
|
-
tokens: result.usage?.total_tokens,
|
|
6441
|
-
prompt_tokens: result.usage?.prompt_tokens
|
|
6442
|
-
}
|
|
6443
|
-
});
|
|
6430
|
+
processResponse(result, span);
|
|
6444
6431
|
return result;
|
|
6445
6432
|
},
|
|
6446
6433
|
(0, import_core4.mergeDicts)(
|
|
6447
6434
|
{
|
|
6448
|
-
name
|
|
6435
|
+
name,
|
|
6449
6436
|
spanAttributes: {
|
|
6450
6437
|
type: import_core3.SpanTypeAttribute.LLM
|
|
6451
6438
|
}
|
|
6452
6439
|
},
|
|
6453
|
-
|
|
6440
|
+
parseParams(allParams)
|
|
6454
6441
|
)
|
|
6455
6442
|
);
|
|
6456
6443
|
};
|
|
6457
6444
|
}
|
|
6458
|
-
function
|
|
6459
|
-
|
|
6460
|
-
|
|
6461
|
-
|
|
6462
|
-
|
|
6463
|
-
|
|
6464
|
-
|
|
6445
|
+
function createEndpointProxy(target, wrapperFn) {
|
|
6446
|
+
return new Proxy(target, {
|
|
6447
|
+
get(target2, name, receiver) {
|
|
6448
|
+
const baseVal = Reflect.get(target2, name, receiver);
|
|
6449
|
+
if (name === "create") {
|
|
6450
|
+
return wrapperFn(baseVal.bind(target2));
|
|
6451
|
+
}
|
|
6452
|
+
return baseVal;
|
|
6465
6453
|
}
|
|
6466
|
-
};
|
|
6467
|
-
|
|
6468
|
-
|
|
6454
|
+
});
|
|
6455
|
+
}
|
|
6456
|
+
function parseChatCompletionParams(params) {
|
|
6457
|
+
return parseBaseParams(params, "messages");
|
|
6458
|
+
}
|
|
6459
|
+
function processEmbeddingResponse(result, span) {
|
|
6460
|
+
span.log({
|
|
6461
|
+
output: { embedding_length: result.data[0].embedding.length },
|
|
6462
|
+
metrics: {
|
|
6463
|
+
tokens: result.usage?.total_tokens,
|
|
6464
|
+
prompt_tokens: result.usage?.prompt_tokens
|
|
6465
|
+
}
|
|
6466
|
+
});
|
|
6467
|
+
}
|
|
6468
|
+
function processModerationResponse(result, span) {
|
|
6469
|
+
span.log({
|
|
6470
|
+
output: result.results
|
|
6471
|
+
});
|
|
6469
6472
|
}
|
|
6473
|
+
var wrapEmbeddings = (create) => createApiWrapper(
|
|
6474
|
+
"Embedding",
|
|
6475
|
+
create,
|
|
6476
|
+
processEmbeddingResponse,
|
|
6477
|
+
(params) => parseBaseParams(params, "input")
|
|
6478
|
+
);
|
|
6479
|
+
var wrapModerations = (create) => createApiWrapper(
|
|
6480
|
+
"Moderation",
|
|
6481
|
+
create,
|
|
6482
|
+
processModerationResponse,
|
|
6483
|
+
(params) => parseBaseParams(params, "input")
|
|
6484
|
+
);
|
|
6470
6485
|
function postprocessStreamingResults(allResults) {
|
|
6471
6486
|
let role = void 0;
|
|
6472
6487
|
let content = void 0;
|
package/dist/index.mjs
CHANGED
|
@@ -3605,6 +3605,7 @@ var Dataset = class extends ObjectFetcher {
|
|
|
3605
3605
|
this.lazyMetadata = lazyMetadata;
|
|
3606
3606
|
}
|
|
3607
3607
|
lazyMetadata;
|
|
3608
|
+
__braintrust_dataset_marker = true;
|
|
3608
3609
|
get id() {
|
|
3609
3610
|
return (async () => {
|
|
3610
3611
|
return (await this.lazyMetadata.get()).dataset.id;
|
|
@@ -3807,6 +3808,9 @@ var Dataset = class extends ObjectFetcher {
|
|
|
3807
3808
|
);
|
|
3808
3809
|
return this.id;
|
|
3809
3810
|
}
|
|
3811
|
+
static isDataset(data) {
|
|
3812
|
+
return typeof data === "object" && data !== null && "__braintrust_dataset_marker" in data;
|
|
3813
|
+
}
|
|
3810
3814
|
};
|
|
3811
3815
|
function renderMessage(render, message) {
|
|
3812
3816
|
return {
|
|
@@ -5419,7 +5423,7 @@ async function Eval(name, evaluator, reporterOrOpts) {
|
|
|
5419
5423
|
baseExperimentId: evaluator.baseExperimentId,
|
|
5420
5424
|
gitMetadataSettings: evaluator.gitMetadataSettings,
|
|
5421
5425
|
repoInfo: evaluator.repoInfo,
|
|
5422
|
-
dataset: data
|
|
5426
|
+
dataset: Dataset.isDataset(data) ? data : void 0
|
|
5423
5427
|
});
|
|
5424
5428
|
if (experiment && options.onStart) {
|
|
5425
5429
|
const summary = await experiment.summarize({ summarizeScores: false });
|
|
@@ -5570,7 +5574,7 @@ async function runEvaluatorInternal(experiment, evaluator, progressReporter, fil
|
|
|
5570
5574
|
const q = queue(
|
|
5571
5575
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
5572
5576
|
async (datum) => {
|
|
5573
|
-
const eventDataset = experiment ? experiment.dataset : evaluator.data
|
|
5577
|
+
const eventDataset = experiment ? experiment.dataset : Dataset.isDataset(evaluator.data) ? evaluator.data : void 0;
|
|
5574
5578
|
const baseEvent = {
|
|
5575
5579
|
name: "eval",
|
|
5576
5580
|
spanAttributes: {
|
|
@@ -6126,16 +6130,11 @@ function wrapOpenAI(openai) {
|
|
|
6126
6130
|
}
|
|
6127
6131
|
globalThis.__inherited_braintrust_wrap_openai = wrapOpenAI;
|
|
6128
6132
|
function wrapOpenAIv4(openai) {
|
|
6129
|
-
|
|
6130
|
-
|
|
6131
|
-
|
|
6132
|
-
|
|
6133
|
-
|
|
6134
|
-
}
|
|
6135
|
-
return baseVal;
|
|
6136
|
-
}
|
|
6137
|
-
});
|
|
6138
|
-
let chatProxy = new Proxy(openai.chat, {
|
|
6133
|
+
const completionProxy = createEndpointProxy(
|
|
6134
|
+
openai.chat.completions,
|
|
6135
|
+
wrapChatCompletion
|
|
6136
|
+
);
|
|
6137
|
+
const chatProxy = new Proxy(openai.chat, {
|
|
6139
6138
|
get(target, name, receiver) {
|
|
6140
6139
|
if (name === "completions") {
|
|
6141
6140
|
return completionProxy;
|
|
@@ -6143,18 +6142,11 @@ function wrapOpenAIv4(openai) {
|
|
|
6143
6142
|
return Reflect.get(target, name, receiver);
|
|
6144
6143
|
}
|
|
6145
6144
|
});
|
|
6146
|
-
|
|
6147
|
-
|
|
6148
|
-
const baseVal = Reflect.get(target, name, receiver);
|
|
6149
|
-
if (name === "create") {
|
|
6150
|
-
return wrapEmbeddings(baseVal.bind(target));
|
|
6151
|
-
}
|
|
6152
|
-
return baseVal;
|
|
6153
|
-
}
|
|
6154
|
-
});
|
|
6145
|
+
const embeddingProxy = createEndpointProxy(openai.embeddings, wrapEmbeddings);
|
|
6146
|
+
const moderationProxy = createEndpointProxy(openai.moderations, wrapModerations);
|
|
6155
6147
|
let betaProxy;
|
|
6156
6148
|
if (openai.beta?.chat?.completions?.stream) {
|
|
6157
|
-
|
|
6149
|
+
const betaChatCompletionProxy = new Proxy(openai?.beta?.chat.completions, {
|
|
6158
6150
|
get(target, name, receiver) {
|
|
6159
6151
|
const baseVal = Reflect.get(target, name, receiver);
|
|
6160
6152
|
if (name === "parse") {
|
|
@@ -6165,7 +6157,7 @@ function wrapOpenAIv4(openai) {
|
|
|
6165
6157
|
return baseVal;
|
|
6166
6158
|
}
|
|
6167
6159
|
});
|
|
6168
|
-
|
|
6160
|
+
const betaChatProxy = new Proxy(openai.beta.chat, {
|
|
6169
6161
|
get(target, name, receiver) {
|
|
6170
6162
|
if (name === "completions") {
|
|
6171
6163
|
return betaChatCompletionProxy;
|
|
@@ -6182,7 +6174,7 @@ function wrapOpenAIv4(openai) {
|
|
|
6182
6174
|
}
|
|
6183
6175
|
});
|
|
6184
6176
|
}
|
|
6185
|
-
|
|
6177
|
+
return new Proxy(openai, {
|
|
6186
6178
|
get(target, name, receiver) {
|
|
6187
6179
|
if (name === "chat") {
|
|
6188
6180
|
return chatProxy;
|
|
@@ -6190,13 +6182,15 @@ function wrapOpenAIv4(openai) {
|
|
|
6190
6182
|
if (name === "embeddings") {
|
|
6191
6183
|
return embeddingProxy;
|
|
6192
6184
|
}
|
|
6185
|
+
if (name === "moderations") {
|
|
6186
|
+
return moderationProxy;
|
|
6187
|
+
}
|
|
6193
6188
|
if (name === "beta" && betaProxy) {
|
|
6194
6189
|
return betaProxy;
|
|
6195
6190
|
}
|
|
6196
6191
|
return Reflect.get(target, name, receiver);
|
|
6197
6192
|
}
|
|
6198
6193
|
});
|
|
6199
|
-
return proxy;
|
|
6200
6194
|
}
|
|
6201
6195
|
function logCompletionResponse(startTime, response, span) {
|
|
6202
6196
|
span.log({
|
|
@@ -6345,7 +6339,7 @@ function wrapChatCompletion(completion) {
|
|
|
6345
6339
|
}
|
|
6346
6340
|
};
|
|
6347
6341
|
}
|
|
6348
|
-
function
|
|
6342
|
+
function parseBaseParams(allParams, inputField) {
|
|
6349
6343
|
const { span_info, ...params } = allParams;
|
|
6350
6344
|
const { metadata: spanInfoMetadata, ...spanInfoRest } = span_info ?? {};
|
|
6351
6345
|
let ret = {
|
|
@@ -6354,10 +6348,12 @@ function parseChatCompletionParams(allParams) {
|
|
|
6354
6348
|
metadata: spanInfoMetadata
|
|
6355
6349
|
}
|
|
6356
6350
|
};
|
|
6357
|
-
const
|
|
6358
|
-
|
|
6351
|
+
const input = params[inputField];
|
|
6352
|
+
const paramsRest = { ...params };
|
|
6353
|
+
delete paramsRest[inputField];
|
|
6354
|
+
return mergeDicts3(ret, { event: { input, metadata: paramsRest } });
|
|
6359
6355
|
}
|
|
6360
|
-
function
|
|
6356
|
+
function createApiWrapper(name, create, processResponse, parseParams) {
|
|
6361
6357
|
return async (allParams, options) => {
|
|
6362
6358
|
const { span_info: _, ...params } = allParams;
|
|
6363
6359
|
return traced(
|
|
@@ -6367,42 +6363,61 @@ function wrapEmbeddings(create) {
|
|
|
6367
6363
|
options
|
|
6368
6364
|
).withResponse();
|
|
6369
6365
|
logHeaders(response, span);
|
|
6370
|
-
|
|
6371
|
-
span.log({
|
|
6372
|
-
// TODO: Add a flag to control whether to log the full embedding vector,
|
|
6373
|
-
// possibly w/ JSON compression.
|
|
6374
|
-
output: { embedding_length },
|
|
6375
|
-
metrics: {
|
|
6376
|
-
tokens: result.usage?.total_tokens,
|
|
6377
|
-
prompt_tokens: result.usage?.prompt_tokens
|
|
6378
|
-
}
|
|
6379
|
-
});
|
|
6366
|
+
processResponse(result, span);
|
|
6380
6367
|
return result;
|
|
6381
6368
|
},
|
|
6382
6369
|
mergeDicts3(
|
|
6383
6370
|
{
|
|
6384
|
-
name
|
|
6371
|
+
name,
|
|
6385
6372
|
spanAttributes: {
|
|
6386
6373
|
type: SpanTypeAttribute3.LLM
|
|
6387
6374
|
}
|
|
6388
6375
|
},
|
|
6389
|
-
|
|
6376
|
+
parseParams(allParams)
|
|
6390
6377
|
)
|
|
6391
6378
|
);
|
|
6392
6379
|
};
|
|
6393
6380
|
}
|
|
6394
|
-
function
|
|
6395
|
-
|
|
6396
|
-
|
|
6397
|
-
|
|
6398
|
-
|
|
6399
|
-
|
|
6400
|
-
|
|
6381
|
+
function createEndpointProxy(target, wrapperFn) {
|
|
6382
|
+
return new Proxy(target, {
|
|
6383
|
+
get(target2, name, receiver) {
|
|
6384
|
+
const baseVal = Reflect.get(target2, name, receiver);
|
|
6385
|
+
if (name === "create") {
|
|
6386
|
+
return wrapperFn(baseVal.bind(target2));
|
|
6387
|
+
}
|
|
6388
|
+
return baseVal;
|
|
6401
6389
|
}
|
|
6402
|
-
};
|
|
6403
|
-
|
|
6404
|
-
|
|
6390
|
+
});
|
|
6391
|
+
}
|
|
6392
|
+
function parseChatCompletionParams(params) {
|
|
6393
|
+
return parseBaseParams(params, "messages");
|
|
6394
|
+
}
|
|
6395
|
+
function processEmbeddingResponse(result, span) {
|
|
6396
|
+
span.log({
|
|
6397
|
+
output: { embedding_length: result.data[0].embedding.length },
|
|
6398
|
+
metrics: {
|
|
6399
|
+
tokens: result.usage?.total_tokens,
|
|
6400
|
+
prompt_tokens: result.usage?.prompt_tokens
|
|
6401
|
+
}
|
|
6402
|
+
});
|
|
6403
|
+
}
|
|
6404
|
+
function processModerationResponse(result, span) {
|
|
6405
|
+
span.log({
|
|
6406
|
+
output: result.results
|
|
6407
|
+
});
|
|
6405
6408
|
}
|
|
6409
|
+
var wrapEmbeddings = (create) => createApiWrapper(
|
|
6410
|
+
"Embedding",
|
|
6411
|
+
create,
|
|
6412
|
+
processEmbeddingResponse,
|
|
6413
|
+
(params) => parseBaseParams(params, "input")
|
|
6414
|
+
);
|
|
6415
|
+
var wrapModerations = (create) => createApiWrapper(
|
|
6416
|
+
"Moderation",
|
|
6417
|
+
create,
|
|
6418
|
+
processModerationResponse,
|
|
6419
|
+
(params) => parseBaseParams(params, "input")
|
|
6420
|
+
);
|
|
6406
6421
|
function postprocessStreamingResults(allResults) {
|
|
6407
6422
|
let role = void 0;
|
|
6408
6423
|
let content = void 0;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "braintrust",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.183",
|
|
4
4
|
"description": "SDK for integrating Braintrust",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -75,7 +75,7 @@
|
|
|
75
75
|
},
|
|
76
76
|
"dependencies": {
|
|
77
77
|
"@ai-sdk/provider": "^1.0.1",
|
|
78
|
-
"@braintrust/core": "0.0.
|
|
78
|
+
"@braintrust/core": "0.0.77",
|
|
79
79
|
"@next/env": "^14.2.3",
|
|
80
80
|
"@vercel/functions": "^1.0.2",
|
|
81
81
|
"ai": "^3.2.16",
|