braintrust 3.15.0 → 3.17.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/dist/index.js CHANGED
@@ -3854,7 +3854,7 @@ function btStreamParser() {
3854
3854
  },
3855
3855
  async transform(chunk, controller) {
3856
3856
  if (chunk instanceof Uint8Array) {
3857
- parser.feed(decoder.decode(chunk));
3857
+ parser.feed(decoder.decode(chunk, { stream: true }));
3858
3858
  } else if (typeof chunk === "string") {
3859
3859
  parser.feed(chunk);
3860
3860
  } else {
@@ -3862,6 +3862,10 @@ function btStreamParser() {
3862
3862
  }
3863
3863
  },
3864
3864
  async flush(controller) {
3865
+ const tail = decoder.decode();
3866
+ if (tail) {
3867
+ parser.feed(tail);
3868
+ }
3865
3869
  controller.terminate();
3866
3870
  }
3867
3871
  });
@@ -25480,6 +25484,7 @@ _chunkVMBQETG3js.__export.call(void 0, exports_exports, {
25480
25484
  LEGACY_CACHED_HEADER: () => LEGACY_CACHED_HEADER,
25481
25485
  LOGS3_OVERFLOW_REFERENCE_TYPE: () => LOGS3_OVERFLOW_REFERENCE_TYPE,
25482
25486
  LazyValue: () => LazyValue,
25487
+ LocalTrace: () => LocalTrace,
25483
25488
  Logger: () => Logger,
25484
25489
  LoginInvalidOrgError: () => LoginInvalidOrgError,
25485
25490
  NOOP_SPAN: () => NOOP_SPAN,
@@ -25713,6 +25718,7 @@ async function invoke(args) {
25713
25718
  mode,
25714
25719
  schema,
25715
25720
  strict,
25721
+ overrides,
25716
25722
  projectId,
25717
25723
  ...functionIdArgs
25718
25724
  } = args;
@@ -25749,7 +25755,8 @@ async function invoke(args) {
25749
25755
  tags,
25750
25756
  stream,
25751
25757
  mode,
25752
- strict
25758
+ strict,
25759
+ overrides
25753
25760
  };
25754
25761
  const headers = {
25755
25762
  Accept: stream ? "text/event-stream" : "application/json"
@@ -32709,4 +32716,5 @@ configureNode();
32709
32716
 
32710
32717
 
32711
32718
 
32712
- exports.Attachment = Attachment; exports.AttachmentReference = AttachmentReference; exports.BRAINTRUST_CURRENT_SPAN_STORE = BRAINTRUST_CURRENT_SPAN_STORE; exports.BRAINTRUST_LANGCHAIN_CALLBACK_HANDLER_NAME = BRAINTRUST_LANGCHAIN_CALLBACK_HANDLER_NAME; exports.BaseAttachment = BaseAttachment; exports.BaseExperiment = BaseExperiment; exports.BraintrustLangChainCallbackHandler = BraintrustLangChainCallbackHandler; exports.BraintrustMiddleware = BraintrustMiddleware; exports.BraintrustObservabilityExporter = BraintrustObservabilityExporter; exports.BraintrustState = BraintrustState; exports.BraintrustStream = BraintrustStream; exports.CachedSpanFetcher = CachedSpanFetcher; exports.CodeFunction = CodeFunction; exports.CodePrompt = CodePrompt; exports.ContextManager = ContextManager; exports.DEFAULT_FETCH_BATCH_SIZE = DEFAULT_FETCH_BATCH_SIZE; exports.DEFAULT_MAX_REQUEST_SIZE = DEFAULT_MAX_REQUEST_SIZE; exports.Dataset = Dataset2; exports.DatasetPipeline = DatasetPipeline; exports.ERR_PERMALINK = ERR_PERMALINK; exports.Eval = Eval; exports.EvalResultWithSummary = EvalResultWithSummary; exports.Experiment = Experiment2; exports.ExternalAttachment = ExternalAttachment; exports.FailedHTTPResponse = FailedHTTPResponse; exports.IDGenerator = IDGenerator; exports.JSONAttachment = JSONAttachment; exports.LEGACY_CACHED_HEADER = LEGACY_CACHED_HEADER; exports.LOGS3_OVERFLOW_REFERENCE_TYPE = LOGS3_OVERFLOW_REFERENCE_TYPE; exports.LazyValue = LazyValue; exports.Logger = Logger; exports.LoginInvalidOrgError = LoginInvalidOrgError; exports.NOOP_SPAN = NOOP_SPAN; exports.NOOP_SPAN_PERMALINK = NOOP_SPAN_PERMALINK; exports.NoopSpan = NoopSpan; exports.ObjectFetcher = ObjectFetcher; exports.Project = Project2; exports.ProjectNameIdMap = ProjectNameIdMap; exports.Prompt = Prompt2; exports.PromptBuilder = PromptBuilder; exports.ReadonlyAttachment = ReadonlyAttachment; exports.ReadonlyExperiment = ReadonlyExperiment; exports.Reporter = Reporter; exports.ScorerBuilder = ScorerBuilder; exports.SpanFetcher = SpanFetcher; exports.SpanImpl = SpanImpl; exports.TestBackgroundLogger = TestBackgroundLogger; exports.ToolBuilder = ToolBuilder; exports.UUIDGenerator = UUIDGenerator; exports.X_CACHED_HEADER = X_CACHED_HEADER; exports._exportsForTestingOnly = _exportsForTestingOnly; exports._internalGetGlobalState = _internalGetGlobalState; exports._internalIso = _chunkVMBQETG3js.isomorph_default; exports._internalSetInitialState = _internalSetInitialState; exports.addAzureBlobHeaders = addAzureBlobHeaders; exports.braintrustFlueObserver = braintrustFlueObserver; exports.braintrustStreamChunkSchema = braintrustStreamChunkSchema; exports.buildLocalSummary = buildLocalSummary; exports.configureInstrumentation = configureInstrumentation; exports.constructLogs3OverflowRequest = constructLogs3OverflowRequest; exports.createFinalValuePassThroughStream = createFinalValuePassThroughStream; exports.currentExperiment = currentExperiment; exports.currentLogger = currentLogger; exports.currentSpan = currentSpan; exports.deepCopyEvent = deepCopyEvent; exports.default = exports_exports; exports.defaultErrorScoreHandler = defaultErrorScoreHandler; exports.deserializePlainStringAsJSON = deserializePlainStringAsJSON; exports.devNullWritableStream = devNullWritableStream; exports.evaluatorDefinitionSchema = evaluatorDefinitionSchema; exports.evaluatorDefinitionsSchema = evaluatorDefinitionsSchema; exports.flush = flush; exports.getContextManager = getContextManager; exports.getIdGenerator = getIdGenerator; exports.getPromptVersions = getPromptVersions; exports.getSpanParentObject = getSpanParentObject; exports.getTemplateRenderer = getTemplateRenderer; exports.graph = graph_framework_exports; exports.init = init; exports.initDataset = initDataset; exports.initExperiment = initExperiment; exports.initFunction = initFunction; exports.initLogger = initLogger; exports.initNodeTestSuite = initNodeTestSuite; exports.invoke = invoke; exports.isTemplateFormat = isTemplateFormat; exports.loadParameters = loadParameters; exports.loadPrompt = loadPrompt; exports.log = log; exports.logError = logError; exports.login = login; exports.loginToState = loginToState; exports.logs3OverflowUploadSchema = logs3OverflowUploadSchema; exports.newId = newId; exports.parseCachedHeader = parseCachedHeader; exports.parseTemplateFormat = parseTemplateFormat; exports.permalink = permalink; exports.pickLogs3OverflowObjectIds = pickLogs3OverflowObjectIds; exports.projects = projects; exports.promptContentsSchema = promptContentsSchema; exports.promptDefinitionSchema = promptDefinitionSchema; exports.promptDefinitionToPromptData = promptDefinitionToPromptData; exports.promptDefinitionWithToolsSchema = promptDefinitionWithToolsSchema; exports.registerOtelFlush = registerOtelFlush; exports.registerSandbox = registerSandbox; exports.registerTemplatePlugin = registerTemplatePlugin; exports.renderMessage = renderMessage; exports.renderPromptParams = renderPromptParams; exports.renderTemplateContent = renderTemplateContent; exports.reportFailures = reportFailures; exports.runEvaluator = runEvaluator; exports.setFetch = setFetch; exports.setMaskingFunction = setMaskingFunction; exports.spanComponentsToObjectId = spanComponentsToObjectId; exports.startSpan = startSpan; exports.summarize = summarize; exports.templateRegistry = templateRegistry; exports.toolFunctionDefinitionSchema = ToolFunctionDefinition; exports.traceable = traceable; exports.traced = traced; exports.updateSpan = updateSpan; exports.uploadLogs3OverflowPayload = uploadLogs3OverflowPayload; exports.utf8ByteLength = utf8ByteLength; exports.withCurrent = withCurrent; exports.withDataset = withDataset; exports.withExperiment = withExperiment; exports.withLogger = withLogger; exports.withParent = withParent; exports.wrapAISDK = wrapAISDK; exports.wrapAISDKModel = wrapAISDKModel; exports.wrapAgentClass = wrapAgentClass; exports.wrapAnthropic = wrapAnthropic; exports.wrapClaudeAgentSDK = wrapClaudeAgentSDK; exports.wrapCohere = wrapCohere; exports.wrapCopilotClient = wrapCopilotClient; exports.wrapCursorSDK = wrapCursorSDK; exports.wrapGenkit = wrapGenkit; exports.wrapGoogleADK = wrapGoogleADK; exports.wrapGoogleGenAI = wrapGoogleGenAI; exports.wrapGroq = wrapGroq; exports.wrapHuggingFace = wrapHuggingFace; exports.wrapMastraAgent = wrapMastraAgent; exports.wrapMistral = wrapMistral; exports.wrapOpenAI = wrapOpenAI; exports.wrapOpenAICodexSDK = wrapOpenAICodexSDK; exports.wrapOpenAIv4 = wrapOpenAIv4; exports.wrapOpenRouter = wrapOpenRouter; exports.wrapOpenRouterAgent = wrapOpenRouterAgent; exports.wrapTraced = wrapTraced; exports.wrapVitest = wrapVitest;
32719
+
32720
+ exports.Attachment = Attachment; exports.AttachmentReference = AttachmentReference; exports.BRAINTRUST_CURRENT_SPAN_STORE = BRAINTRUST_CURRENT_SPAN_STORE; exports.BRAINTRUST_LANGCHAIN_CALLBACK_HANDLER_NAME = BRAINTRUST_LANGCHAIN_CALLBACK_HANDLER_NAME; exports.BaseAttachment = BaseAttachment; exports.BaseExperiment = BaseExperiment; exports.BraintrustLangChainCallbackHandler = BraintrustLangChainCallbackHandler; exports.BraintrustMiddleware = BraintrustMiddleware; exports.BraintrustObservabilityExporter = BraintrustObservabilityExporter; exports.BraintrustState = BraintrustState; exports.BraintrustStream = BraintrustStream; exports.CachedSpanFetcher = CachedSpanFetcher; exports.CodeFunction = CodeFunction; exports.CodePrompt = CodePrompt; exports.ContextManager = ContextManager; exports.DEFAULT_FETCH_BATCH_SIZE = DEFAULT_FETCH_BATCH_SIZE; exports.DEFAULT_MAX_REQUEST_SIZE = DEFAULT_MAX_REQUEST_SIZE; exports.Dataset = Dataset2; exports.DatasetPipeline = DatasetPipeline; exports.ERR_PERMALINK = ERR_PERMALINK; exports.Eval = Eval; exports.EvalResultWithSummary = EvalResultWithSummary; exports.Experiment = Experiment2; exports.ExternalAttachment = ExternalAttachment; exports.FailedHTTPResponse = FailedHTTPResponse; exports.IDGenerator = IDGenerator; exports.JSONAttachment = JSONAttachment; exports.LEGACY_CACHED_HEADER = LEGACY_CACHED_HEADER; exports.LOGS3_OVERFLOW_REFERENCE_TYPE = LOGS3_OVERFLOW_REFERENCE_TYPE; exports.LazyValue = LazyValue; exports.LocalTrace = LocalTrace; exports.Logger = Logger; exports.LoginInvalidOrgError = LoginInvalidOrgError; exports.NOOP_SPAN = NOOP_SPAN; exports.NOOP_SPAN_PERMALINK = NOOP_SPAN_PERMALINK; exports.NoopSpan = NoopSpan; exports.ObjectFetcher = ObjectFetcher; exports.Project = Project2; exports.ProjectNameIdMap = ProjectNameIdMap; exports.Prompt = Prompt2; exports.PromptBuilder = PromptBuilder; exports.ReadonlyAttachment = ReadonlyAttachment; exports.ReadonlyExperiment = ReadonlyExperiment; exports.Reporter = Reporter; exports.ScorerBuilder = ScorerBuilder; exports.SpanFetcher = SpanFetcher; exports.SpanImpl = SpanImpl; exports.TestBackgroundLogger = TestBackgroundLogger; exports.ToolBuilder = ToolBuilder; exports.UUIDGenerator = UUIDGenerator; exports.X_CACHED_HEADER = X_CACHED_HEADER; exports._exportsForTestingOnly = _exportsForTestingOnly; exports._internalGetGlobalState = _internalGetGlobalState; exports._internalIso = _chunkVMBQETG3js.isomorph_default; exports._internalSetInitialState = _internalSetInitialState; exports.addAzureBlobHeaders = addAzureBlobHeaders; exports.braintrustFlueObserver = braintrustFlueObserver; exports.braintrustStreamChunkSchema = braintrustStreamChunkSchema; exports.buildLocalSummary = buildLocalSummary; exports.configureInstrumentation = configureInstrumentation; exports.constructLogs3OverflowRequest = constructLogs3OverflowRequest; exports.createFinalValuePassThroughStream = createFinalValuePassThroughStream; exports.currentExperiment = currentExperiment; exports.currentLogger = currentLogger; exports.currentSpan = currentSpan; exports.deepCopyEvent = deepCopyEvent; exports.default = exports_exports; exports.defaultErrorScoreHandler = defaultErrorScoreHandler; exports.deserializePlainStringAsJSON = deserializePlainStringAsJSON; exports.devNullWritableStream = devNullWritableStream; exports.evaluatorDefinitionSchema = evaluatorDefinitionSchema; exports.evaluatorDefinitionsSchema = evaluatorDefinitionsSchema; exports.flush = flush; exports.getContextManager = getContextManager; exports.getIdGenerator = getIdGenerator; exports.getPromptVersions = getPromptVersions; exports.getSpanParentObject = getSpanParentObject; exports.getTemplateRenderer = getTemplateRenderer; exports.graph = graph_framework_exports; exports.init = init; exports.initDataset = initDataset; exports.initExperiment = initExperiment; exports.initFunction = initFunction; exports.initLogger = initLogger; exports.initNodeTestSuite = initNodeTestSuite; exports.invoke = invoke; exports.isTemplateFormat = isTemplateFormat; exports.loadParameters = loadParameters; exports.loadPrompt = loadPrompt; exports.log = log; exports.logError = logError; exports.login = login; exports.loginToState = loginToState; exports.logs3OverflowUploadSchema = logs3OverflowUploadSchema; exports.newId = newId; exports.parseCachedHeader = parseCachedHeader; exports.parseTemplateFormat = parseTemplateFormat; exports.permalink = permalink; exports.pickLogs3OverflowObjectIds = pickLogs3OverflowObjectIds; exports.projects = projects; exports.promptContentsSchema = promptContentsSchema; exports.promptDefinitionSchema = promptDefinitionSchema; exports.promptDefinitionToPromptData = promptDefinitionToPromptData; exports.promptDefinitionWithToolsSchema = promptDefinitionWithToolsSchema; exports.registerOtelFlush = registerOtelFlush; exports.registerSandbox = registerSandbox; exports.registerTemplatePlugin = registerTemplatePlugin; exports.renderMessage = renderMessage; exports.renderPromptParams = renderPromptParams; exports.renderTemplateContent = renderTemplateContent; exports.reportFailures = reportFailures; exports.runEvaluator = runEvaluator; exports.setFetch = setFetch; exports.setMaskingFunction = setMaskingFunction; exports.spanComponentsToObjectId = spanComponentsToObjectId; exports.startSpan = startSpan; exports.summarize = summarize; exports.templateRegistry = templateRegistry; exports.toolFunctionDefinitionSchema = ToolFunctionDefinition; exports.traceable = traceable; exports.traced = traced; exports.updateSpan = updateSpan; exports.uploadLogs3OverflowPayload = uploadLogs3OverflowPayload; exports.utf8ByteLength = utf8ByteLength; exports.withCurrent = withCurrent; exports.withDataset = withDataset; exports.withExperiment = withExperiment; exports.withLogger = withLogger; exports.withParent = withParent; exports.wrapAISDK = wrapAISDK; exports.wrapAISDKModel = wrapAISDKModel; exports.wrapAgentClass = wrapAgentClass; exports.wrapAnthropic = wrapAnthropic; exports.wrapClaudeAgentSDK = wrapClaudeAgentSDK; exports.wrapCohere = wrapCohere; exports.wrapCopilotClient = wrapCopilotClient; exports.wrapCursorSDK = wrapCursorSDK; exports.wrapGenkit = wrapGenkit; exports.wrapGoogleADK = wrapGoogleADK; exports.wrapGoogleGenAI = wrapGoogleGenAI; exports.wrapGroq = wrapGroq; exports.wrapHuggingFace = wrapHuggingFace; exports.wrapMastraAgent = wrapMastraAgent; exports.wrapMistral = wrapMistral; exports.wrapOpenAI = wrapOpenAI; exports.wrapOpenAICodexSDK = wrapOpenAICodexSDK; exports.wrapOpenAIv4 = wrapOpenAIv4; exports.wrapOpenRouter = wrapOpenRouter; exports.wrapOpenRouterAgent = wrapOpenRouterAgent; exports.wrapTraced = wrapTraced; exports.wrapVitest = wrapVitest;
package/dist/index.mjs CHANGED
@@ -3854,7 +3854,7 @@ function btStreamParser() {
3854
3854
  },
3855
3855
  async transform(chunk, controller) {
3856
3856
  if (chunk instanceof Uint8Array) {
3857
- parser.feed(decoder.decode(chunk));
3857
+ parser.feed(decoder.decode(chunk, { stream: true }));
3858
3858
  } else if (typeof chunk === "string") {
3859
3859
  parser.feed(chunk);
3860
3860
  } else {
@@ -3862,6 +3862,10 @@ function btStreamParser() {
3862
3862
  }
3863
3863
  },
3864
3864
  async flush(controller) {
3865
+ const tail = decoder.decode();
3866
+ if (tail) {
3867
+ parser.feed(tail);
3868
+ }
3865
3869
  controller.terminate();
3866
3870
  }
3867
3871
  });
@@ -25480,6 +25484,7 @@ __export(exports_exports, {
25480
25484
  LEGACY_CACHED_HEADER: () => LEGACY_CACHED_HEADER,
25481
25485
  LOGS3_OVERFLOW_REFERENCE_TYPE: () => LOGS3_OVERFLOW_REFERENCE_TYPE,
25482
25486
  LazyValue: () => LazyValue,
25487
+ LocalTrace: () => LocalTrace,
25483
25488
  Logger: () => Logger,
25484
25489
  LoginInvalidOrgError: () => LoginInvalidOrgError,
25485
25490
  NOOP_SPAN: () => NOOP_SPAN,
@@ -25713,6 +25718,7 @@ async function invoke(args) {
25713
25718
  mode,
25714
25719
  schema,
25715
25720
  strict,
25721
+ overrides,
25716
25722
  projectId,
25717
25723
  ...functionIdArgs
25718
25724
  } = args;
@@ -25749,7 +25755,8 @@ async function invoke(args) {
25749
25755
  tags,
25750
25756
  stream,
25751
25757
  mode,
25752
- strict
25758
+ strict,
25759
+ overrides
25753
25760
  };
25754
25761
  const headers = {
25755
25762
  Accept: stream ? "text/event-stream" : "application/json"
@@ -32589,6 +32596,7 @@ export {
32589
32596
  LEGACY_CACHED_HEADER,
32590
32597
  LOGS3_OVERFLOW_REFERENCE_TYPE,
32591
32598
  LazyValue,
32599
+ LocalTrace,
32592
32600
  Logger,
32593
32601
  LoginInvalidOrgError,
32594
32602
  NOOP_SPAN,
@@ -3787,7 +3787,7 @@ function btStreamParser() {
3787
3787
  },
3788
3788
  async transform(chunk, controller) {
3789
3789
  if (chunk instanceof Uint8Array) {
3790
- parser.feed(decoder.decode(chunk));
3790
+ parser.feed(decoder.decode(chunk, { stream: true }));
3791
3791
  } else if (typeof chunk === "string") {
3792
3792
  parser.feed(chunk);
3793
3793
  } else {
@@ -3795,6 +3795,10 @@ function btStreamParser() {
3795
3795
  }
3796
3796
  },
3797
3797
  async flush(controller) {
3798
+ const tail = decoder.decode();
3799
+ if (tail) {
3800
+ parser.feed(tail);
3801
+ }
3798
3802
  controller.terminate();
3799
3803
  }
3800
3804
  });
@@ -3746,7 +3746,7 @@ function btStreamParser() {
3746
3746
  },
3747
3747
  async transform(chunk, controller) {
3748
3748
  if (chunk instanceof Uint8Array) {
3749
- parser.feed(decoder.decode(chunk));
3749
+ parser.feed(decoder.decode(chunk, { stream: true }));
3750
3750
  } else if (typeof chunk === "string") {
3751
3751
  parser.feed(chunk);
3752
3752
  } else {
@@ -3754,6 +3754,10 @@ function btStreamParser() {
3754
3754
  }
3755
3755
  },
3756
3756
  async flush(controller) {
3757
+ const tail = decoder.decode();
3758
+ if (tail) {
3759
+ parser.feed(tail);
3760
+ }
3757
3761
  controller.terminate();
3758
3762
  }
3759
3763
  });
@@ -1,2 +1,2 @@
1
- export { AnyDataset, Attachment, AttachmentParams, AttachmentReference, BRAINTRUST_CURRENT_SPAN_STORE, BRAINTRUST_LANGCHAIN_CALLBACK_HANDLER_NAME, BackgroundLoggerOpts, BaseAttachment, BaseExperiment, BaseMetadata, BraintrustLangChainCallbackHandler, BraintrustMiddleware, BraintrustObservabilityExporter, BraintrustState, BraintrustStream, BraintrustStreamChunk, CachedSpanFetcher, ChatPrompt, CodeFunction, CodeOpts, CodePrompt, CommentEvent, CompiledPrompt, CompiledPromptParams, CompletionPrompt, ContextManager, ContextParentSpanIds, CreateProjectOpts, CurrentSpanStore, DEFAULT_FETCH_BATCH_SIZE, DEFAULT_MAX_REQUEST_SIZE, DataSummary, Dataset, DatasetPipeline, DatasetRecord, DatasetRestorePreviewResult, DatasetRestoreResult, DatasetSnapshot, DatasetSummary, DefaultMetadataType, DefaultPromptArgs, ERR_PERMALINK, EndSpanArgs, Eval, EvalCase, EvalClassifier, EvalHooks, EvalParameterSerializedSchema, EvalParameters, EvalResult, EvalResultWithSummary, EvalScorer, EvalScorerArgs, EvalTask, Evaluator, EvaluatorDef, EvaluatorDefinition, EvaluatorDefinitions, EvaluatorFile, EvaluatorManifest, Experiment, ExperimentLogFullArgs, ExperimentLogPartialArgs, ExperimentSummary, Exportable, ExternalAttachment, ExternalAttachmentParams, FailedHTTPResponse, FullInitDatasetOptions, FullInitOptions, FullLoginOptions, FunctionEvent, GetThreadOptions, IDGenerator, IdField, InitDatasetOptions, InitLoggerOptions, InitOptions, InputField, InstrumentationConfig, InvokeFunctionArgs, InvokeReturn, JSONAttachment, LEGACY_CACHED_HEADER, LOGS3_OVERFLOW_REFERENCE_TYPE, LangChainCallbackHandlerOptions, LazyValue, LoadPromptOptions, LogCommentFullArgs, LogFeedbackFullArgs, LogOptions, Logger, LoginInvalidOrgError, LoginOptions, Logs3OverflowInputRow, Logs3OverflowUpload, MastraObservabilityExporter, MetricSummary, NOOP_SPAN, NOOP_SPAN_PERMALINK, NoopSpan, ObjectFetcher, ObjectMetadata, OtherExperimentLogFields, ParametersSource, ParentExperimentIds, ParentProjectLogIds, Project, ProjectNameIdMap, PromiseUnless, Prompt, PromptBuilder, PromptContents, PromptDefinition, PromptDefinitionWithTools, PromptOpts, PromptRowWithId, ReadonlyAttachment, ReadonlyExperiment, RegisterSandboxOptions, RegisterSandboxResult, Reporter, ReporterBody, SandboxConfig, ScoreSummary, ScorerBuilder, ScorerOpts, SerializedBraintrustState, SetCurrentArg, Span, SpanContext, SpanData, SpanFetcher, SpanImpl, StartSpanArgs, TemplateFormat, TemplateRenderer, TemplateRendererPlugin, TestBackgroundLogger, ToolBuilder, Trace, UUIDGenerator, WithTransactionId, X_CACHED_HEADER, _exportsForTestingOnly, _internalGetGlobalState, _internalIso, _internalSetInitialState, addAzureBlobHeaders, braintrustFlueObserver, braintrustStreamChunkSchema, buildLocalSummary, configureInstrumentation, constructLogs3OverflowRequest, createFinalValuePassThroughStream, currentExperiment, currentLogger, currentSpan, deepCopyEvent, default, defaultErrorScoreHandler, deserializePlainStringAsJSON, devNullWritableStream, evaluatorDefinitionSchema, evaluatorDefinitionsSchema, flush, getContextManager, getIdGenerator, getPromptVersions, getSpanParentObject, getTemplateRenderer, graph, init, initDataset, initExperiment, initFunction, initLogger, initNodeTestSuite, invoke, isTemplateFormat, loadParameters, loadPrompt, log, logError, login, loginToState, logs3OverflowUploadSchema, newId, parseCachedHeader, parseTemplateFormat, permalink, pickLogs3OverflowObjectIds, projects, promptContentsSchema, promptDefinitionSchema, promptDefinitionToPromptData, promptDefinitionWithToolsSchema, registerOtelFlush, registerSandbox, registerTemplatePlugin, renderMessage, renderPromptParams, renderTemplateContent, reportFailures, runEvaluator, setFetch, setMaskingFunction, spanComponentsToObjectId, startSpan, summarize, templateRegistry, toolFunctionDefinitionSchema, traceable, traced, updateSpan, uploadLogs3OverflowPayload, utf8ByteLength, withCurrent, withDataset, withExperiment, withLogger, withParent, wrapAISDK, wrapAISDKModel, wrapAgentClass, wrapAnthropic, wrapClaudeAgentSDK, wrapCohere, wrapCopilotClient, wrapCursorSDK, wrapGenkit, wrapGoogleADK, wrapGoogleGenAI, wrapGroq, wrapHuggingFace, wrapMastraAgent, wrapMistral, wrapOpenAI, wrapOpenAICodexSDK, wrapOpenAIv4, wrapOpenRouter, wrapOpenRouterAgent, wrapTraced, wrapVitest } from './browser.mjs';
1
+ export { AnyDataset, Attachment, AttachmentParams, AttachmentReference, BRAINTRUST_CURRENT_SPAN_STORE, BRAINTRUST_LANGCHAIN_CALLBACK_HANDLER_NAME, BackgroundLoggerOpts, BaseAttachment, BaseExperiment, BaseMetadata, BraintrustLangChainCallbackHandler, BraintrustMiddleware, BraintrustObservabilityExporter, BraintrustState, BraintrustStream, BraintrustStreamChunk, CachedSpanFetcher, ChatPrompt, CodeFunction, CodeOpts, CodePrompt, CommentEvent, CompiledPrompt, CompiledPromptParams, CompletionPrompt, ContextManager, ContextParentSpanIds, CreateProjectOpts, CurrentSpanStore, DEFAULT_FETCH_BATCH_SIZE, DEFAULT_MAX_REQUEST_SIZE, DataSummary, Dataset, DatasetPipeline, DatasetRecord, DatasetRestorePreviewResult, DatasetRestoreResult, DatasetSnapshot, DatasetSummary, DefaultMetadataType, DefaultPromptArgs, ERR_PERMALINK, EndSpanArgs, Eval, EvalCase, EvalClassifier, EvalHooks, EvalParameterSerializedSchema, EvalParameters, EvalResult, EvalResultWithSummary, EvalScorer, EvalScorerArgs, EvalTask, Evaluator, EvaluatorDef, EvaluatorDefinition, EvaluatorDefinitions, EvaluatorFile, EvaluatorManifest, Experiment, ExperimentLogFullArgs, ExperimentLogPartialArgs, ExperimentSummary, Exportable, ExternalAttachment, ExternalAttachmentParams, FailedHTTPResponse, FullInitDatasetOptions, FullInitOptions, FullLoginOptions, FunctionEvent, GetThreadOptions, IDGenerator, IdField, InitDatasetOptions, InitLoggerOptions, InitOptions, InputField, InstrumentationConfig, InvokeFunctionArgs, InvokeReturn, JSONAttachment, LEGACY_CACHED_HEADER, LOGS3_OVERFLOW_REFERENCE_TYPE, LangChainCallbackHandlerOptions, LazyValue, LoadPromptOptions, LocalTrace, LogCommentFullArgs, LogFeedbackFullArgs, LogOptions, Logger, LoginInvalidOrgError, LoginOptions, Logs3OverflowInputRow, Logs3OverflowUpload, MastraObservabilityExporter, MetricSummary, NOOP_SPAN, NOOP_SPAN_PERMALINK, NoopSpan, ObjectFetcher, ObjectMetadata, OtherExperimentLogFields, ParametersSource, ParentExperimentIds, ParentProjectLogIds, Project, ProjectNameIdMap, PromiseUnless, Prompt, PromptBuilder, PromptContents, PromptDefinition, PromptDefinitionWithTools, PromptOpts, PromptRowWithId, ReadonlyAttachment, ReadonlyExperiment, RegisterSandboxOptions, RegisterSandboxResult, Reporter, ReporterBody, SandboxConfig, ScoreSummary, ScorerBuilder, ScorerOpts, SerializedBraintrustState, SetCurrentArg, Span, SpanContext, SpanData, SpanFetcher, SpanImpl, StartSpanArgs, TemplateFormat, TemplateRenderer, TemplateRendererPlugin, TestBackgroundLogger, ToolBuilder, Trace, UUIDGenerator, WithTransactionId, X_CACHED_HEADER, _exportsForTestingOnly, _internalGetGlobalState, _internalIso, _internalSetInitialState, addAzureBlobHeaders, braintrustFlueObserver, braintrustStreamChunkSchema, buildLocalSummary, configureInstrumentation, constructLogs3OverflowRequest, createFinalValuePassThroughStream, currentExperiment, currentLogger, currentSpan, deepCopyEvent, default, defaultErrorScoreHandler, deserializePlainStringAsJSON, devNullWritableStream, evaluatorDefinitionSchema, evaluatorDefinitionsSchema, flush, getContextManager, getIdGenerator, getPromptVersions, getSpanParentObject, getTemplateRenderer, graph, init, initDataset, initExperiment, initFunction, initLogger, initNodeTestSuite, invoke, isTemplateFormat, loadParameters, loadPrompt, log, logError, login, loginToState, logs3OverflowUploadSchema, newId, parseCachedHeader, parseTemplateFormat, permalink, pickLogs3OverflowObjectIds, projects, promptContentsSchema, promptDefinitionSchema, promptDefinitionToPromptData, promptDefinitionWithToolsSchema, registerOtelFlush, registerSandbox, registerTemplatePlugin, renderMessage, renderPromptParams, renderTemplateContent, reportFailures, runEvaluator, setFetch, setMaskingFunction, spanComponentsToObjectId, startSpan, summarize, templateRegistry, toolFunctionDefinitionSchema, traceable, traced, updateSpan, uploadLogs3OverflowPayload, utf8ByteLength, withCurrent, withDataset, withExperiment, withLogger, withParent, wrapAISDK, wrapAISDKModel, wrapAgentClass, wrapAnthropic, wrapClaudeAgentSDK, wrapCohere, wrapCopilotClient, wrapCursorSDK, wrapGenkit, wrapGoogleADK, wrapGoogleGenAI, wrapGroq, wrapHuggingFace, wrapMastraAgent, wrapMistral, wrapOpenAI, wrapOpenAICodexSDK, wrapOpenAIv4, wrapOpenRouter, wrapOpenRouterAgent, wrapTraced, wrapVitest } from './browser.mjs';
2
2
  import 'zod/v3';
package/dist/workerd.d.ts CHANGED
@@ -1,2 +1,2 @@
1
- export { AnyDataset, Attachment, AttachmentParams, AttachmentReference, BRAINTRUST_CURRENT_SPAN_STORE, BRAINTRUST_LANGCHAIN_CALLBACK_HANDLER_NAME, BackgroundLoggerOpts, BaseAttachment, BaseExperiment, BaseMetadata, BraintrustLangChainCallbackHandler, BraintrustMiddleware, BraintrustObservabilityExporter, BraintrustState, BraintrustStream, BraintrustStreamChunk, CachedSpanFetcher, ChatPrompt, CodeFunction, CodeOpts, CodePrompt, CommentEvent, CompiledPrompt, CompiledPromptParams, CompletionPrompt, ContextManager, ContextParentSpanIds, CreateProjectOpts, CurrentSpanStore, DEFAULT_FETCH_BATCH_SIZE, DEFAULT_MAX_REQUEST_SIZE, DataSummary, Dataset, DatasetPipeline, DatasetRecord, DatasetRestorePreviewResult, DatasetRestoreResult, DatasetSnapshot, DatasetSummary, DefaultMetadataType, DefaultPromptArgs, ERR_PERMALINK, EndSpanArgs, Eval, EvalCase, EvalClassifier, EvalHooks, EvalParameterSerializedSchema, EvalParameters, EvalResult, EvalResultWithSummary, EvalScorer, EvalScorerArgs, EvalTask, Evaluator, EvaluatorDef, EvaluatorDefinition, EvaluatorDefinitions, EvaluatorFile, EvaluatorManifest, Experiment, ExperimentLogFullArgs, ExperimentLogPartialArgs, ExperimentSummary, Exportable, ExternalAttachment, ExternalAttachmentParams, FailedHTTPResponse, FullInitDatasetOptions, FullInitOptions, FullLoginOptions, FunctionEvent, GetThreadOptions, IDGenerator, IdField, InitDatasetOptions, InitLoggerOptions, InitOptions, InputField, InstrumentationConfig, InvokeFunctionArgs, InvokeReturn, JSONAttachment, LEGACY_CACHED_HEADER, LOGS3_OVERFLOW_REFERENCE_TYPE, LangChainCallbackHandlerOptions, LazyValue, LoadPromptOptions, LogCommentFullArgs, LogFeedbackFullArgs, LogOptions, Logger, LoginInvalidOrgError, LoginOptions, Logs3OverflowInputRow, Logs3OverflowUpload, MastraObservabilityExporter, MetricSummary, NOOP_SPAN, NOOP_SPAN_PERMALINK, NoopSpan, ObjectFetcher, ObjectMetadata, OtherExperimentLogFields, ParametersSource, ParentExperimentIds, ParentProjectLogIds, Project, ProjectNameIdMap, PromiseUnless, Prompt, PromptBuilder, PromptContents, PromptDefinition, PromptDefinitionWithTools, PromptOpts, PromptRowWithId, ReadonlyAttachment, ReadonlyExperiment, RegisterSandboxOptions, RegisterSandboxResult, Reporter, ReporterBody, SandboxConfig, ScoreSummary, ScorerBuilder, ScorerOpts, SerializedBraintrustState, SetCurrentArg, Span, SpanContext, SpanData, SpanFetcher, SpanImpl, StartSpanArgs, TemplateFormat, TemplateRenderer, TemplateRendererPlugin, TestBackgroundLogger, ToolBuilder, Trace, UUIDGenerator, WithTransactionId, X_CACHED_HEADER, _exportsForTestingOnly, _internalGetGlobalState, _internalIso, _internalSetInitialState, addAzureBlobHeaders, braintrustFlueObserver, braintrustStreamChunkSchema, buildLocalSummary, configureInstrumentation, constructLogs3OverflowRequest, createFinalValuePassThroughStream, currentExperiment, currentLogger, currentSpan, deepCopyEvent, default, defaultErrorScoreHandler, deserializePlainStringAsJSON, devNullWritableStream, evaluatorDefinitionSchema, evaluatorDefinitionsSchema, flush, getContextManager, getIdGenerator, getPromptVersions, getSpanParentObject, getTemplateRenderer, graph, init, initDataset, initExperiment, initFunction, initLogger, initNodeTestSuite, invoke, isTemplateFormat, loadParameters, loadPrompt, log, logError, login, loginToState, logs3OverflowUploadSchema, newId, parseCachedHeader, parseTemplateFormat, permalink, pickLogs3OverflowObjectIds, projects, promptContentsSchema, promptDefinitionSchema, promptDefinitionToPromptData, promptDefinitionWithToolsSchema, registerOtelFlush, registerSandbox, registerTemplatePlugin, renderMessage, renderPromptParams, renderTemplateContent, reportFailures, runEvaluator, setFetch, setMaskingFunction, spanComponentsToObjectId, startSpan, summarize, templateRegistry, toolFunctionDefinitionSchema, traceable, traced, updateSpan, uploadLogs3OverflowPayload, utf8ByteLength, withCurrent, withDataset, withExperiment, withLogger, withParent, wrapAISDK, wrapAISDKModel, wrapAgentClass, wrapAnthropic, wrapClaudeAgentSDK, wrapCohere, wrapCopilotClient, wrapCursorSDK, wrapGenkit, wrapGoogleADK, wrapGoogleGenAI, wrapGroq, wrapHuggingFace, wrapMastraAgent, wrapMistral, wrapOpenAI, wrapOpenAICodexSDK, wrapOpenAIv4, wrapOpenRouter, wrapOpenRouterAgent, wrapTraced, wrapVitest } from './browser.js';
1
+ export { AnyDataset, Attachment, AttachmentParams, AttachmentReference, BRAINTRUST_CURRENT_SPAN_STORE, BRAINTRUST_LANGCHAIN_CALLBACK_HANDLER_NAME, BackgroundLoggerOpts, BaseAttachment, BaseExperiment, BaseMetadata, BraintrustLangChainCallbackHandler, BraintrustMiddleware, BraintrustObservabilityExporter, BraintrustState, BraintrustStream, BraintrustStreamChunk, CachedSpanFetcher, ChatPrompt, CodeFunction, CodeOpts, CodePrompt, CommentEvent, CompiledPrompt, CompiledPromptParams, CompletionPrompt, ContextManager, ContextParentSpanIds, CreateProjectOpts, CurrentSpanStore, DEFAULT_FETCH_BATCH_SIZE, DEFAULT_MAX_REQUEST_SIZE, DataSummary, Dataset, DatasetPipeline, DatasetRecord, DatasetRestorePreviewResult, DatasetRestoreResult, DatasetSnapshot, DatasetSummary, DefaultMetadataType, DefaultPromptArgs, ERR_PERMALINK, EndSpanArgs, Eval, EvalCase, EvalClassifier, EvalHooks, EvalParameterSerializedSchema, EvalParameters, EvalResult, EvalResultWithSummary, EvalScorer, EvalScorerArgs, EvalTask, Evaluator, EvaluatorDef, EvaluatorDefinition, EvaluatorDefinitions, EvaluatorFile, EvaluatorManifest, Experiment, ExperimentLogFullArgs, ExperimentLogPartialArgs, ExperimentSummary, Exportable, ExternalAttachment, ExternalAttachmentParams, FailedHTTPResponse, FullInitDatasetOptions, FullInitOptions, FullLoginOptions, FunctionEvent, GetThreadOptions, IDGenerator, IdField, InitDatasetOptions, InitLoggerOptions, InitOptions, InputField, InstrumentationConfig, InvokeFunctionArgs, InvokeReturn, JSONAttachment, LEGACY_CACHED_HEADER, LOGS3_OVERFLOW_REFERENCE_TYPE, LangChainCallbackHandlerOptions, LazyValue, LoadPromptOptions, LocalTrace, LogCommentFullArgs, LogFeedbackFullArgs, LogOptions, Logger, LoginInvalidOrgError, LoginOptions, Logs3OverflowInputRow, Logs3OverflowUpload, MastraObservabilityExporter, MetricSummary, NOOP_SPAN, NOOP_SPAN_PERMALINK, NoopSpan, ObjectFetcher, ObjectMetadata, OtherExperimentLogFields, ParametersSource, ParentExperimentIds, ParentProjectLogIds, Project, ProjectNameIdMap, PromiseUnless, Prompt, PromptBuilder, PromptContents, PromptDefinition, PromptDefinitionWithTools, PromptOpts, PromptRowWithId, ReadonlyAttachment, ReadonlyExperiment, RegisterSandboxOptions, RegisterSandboxResult, Reporter, ReporterBody, SandboxConfig, ScoreSummary, ScorerBuilder, ScorerOpts, SerializedBraintrustState, SetCurrentArg, Span, SpanContext, SpanData, SpanFetcher, SpanImpl, StartSpanArgs, TemplateFormat, TemplateRenderer, TemplateRendererPlugin, TestBackgroundLogger, ToolBuilder, Trace, UUIDGenerator, WithTransactionId, X_CACHED_HEADER, _exportsForTestingOnly, _internalGetGlobalState, _internalIso, _internalSetInitialState, addAzureBlobHeaders, braintrustFlueObserver, braintrustStreamChunkSchema, buildLocalSummary, configureInstrumentation, constructLogs3OverflowRequest, createFinalValuePassThroughStream, currentExperiment, currentLogger, currentSpan, deepCopyEvent, default, defaultErrorScoreHandler, deserializePlainStringAsJSON, devNullWritableStream, evaluatorDefinitionSchema, evaluatorDefinitionsSchema, flush, getContextManager, getIdGenerator, getPromptVersions, getSpanParentObject, getTemplateRenderer, graph, init, initDataset, initExperiment, initFunction, initLogger, initNodeTestSuite, invoke, isTemplateFormat, loadParameters, loadPrompt, log, logError, login, loginToState, logs3OverflowUploadSchema, newId, parseCachedHeader, parseTemplateFormat, permalink, pickLogs3OverflowObjectIds, projects, promptContentsSchema, promptDefinitionSchema, promptDefinitionToPromptData, promptDefinitionWithToolsSchema, registerOtelFlush, registerSandbox, registerTemplatePlugin, renderMessage, renderPromptParams, renderTemplateContent, reportFailures, runEvaluator, setFetch, setMaskingFunction, spanComponentsToObjectId, startSpan, summarize, templateRegistry, toolFunctionDefinitionSchema, traceable, traced, updateSpan, uploadLogs3OverflowPayload, utf8ByteLength, withCurrent, withDataset, withExperiment, withLogger, withParent, wrapAISDK, wrapAISDKModel, wrapAgentClass, wrapAnthropic, wrapClaudeAgentSDK, wrapCohere, wrapCopilotClient, wrapCursorSDK, wrapGenkit, wrapGoogleADK, wrapGoogleGenAI, wrapGroq, wrapHuggingFace, wrapMastraAgent, wrapMistral, wrapOpenAI, wrapOpenAICodexSDK, wrapOpenAIv4, wrapOpenRouter, wrapOpenRouterAgent, wrapTraced, wrapVitest } from './browser.js';
2
2
  import 'zod/v3';
package/dist/workerd.js CHANGED
@@ -60,6 +60,7 @@ __export(workerd_exports, {
60
60
  LEGACY_CACHED_HEADER: () => LEGACY_CACHED_HEADER,
61
61
  LOGS3_OVERFLOW_REFERENCE_TYPE: () => LOGS3_OVERFLOW_REFERENCE_TYPE,
62
62
  LazyValue: () => LazyValue,
63
+ LocalTrace: () => LocalTrace,
63
64
  Logger: () => Logger,
64
65
  LoginInvalidOrgError: () => LoginInvalidOrgError,
65
66
  NOOP_SPAN: () => NOOP_SPAN,
@@ -3879,7 +3880,7 @@ function btStreamParser() {
3879
3880
  },
3880
3881
  async transform(chunk, controller) {
3881
3882
  if (chunk instanceof Uint8Array) {
3882
- parser.feed(decoder.decode(chunk));
3883
+ parser.feed(decoder.decode(chunk, { stream: true }));
3883
3884
  } else if (typeof chunk === "string") {
3884
3885
  parser.feed(chunk);
3885
3886
  } else {
@@ -3887,6 +3888,10 @@ function btStreamParser() {
3887
3888
  }
3888
3889
  },
3889
3890
  async flush(controller) {
3891
+ const tail = decoder.decode();
3892
+ if (tail) {
3893
+ parser.feed(tail);
3894
+ }
3890
3895
  controller.terminate();
3891
3896
  }
3892
3897
  });
@@ -25954,6 +25959,7 @@ __export(exports_exports, {
25954
25959
  LEGACY_CACHED_HEADER: () => LEGACY_CACHED_HEADER,
25955
25960
  LOGS3_OVERFLOW_REFERENCE_TYPE: () => LOGS3_OVERFLOW_REFERENCE_TYPE,
25956
25961
  LazyValue: () => LazyValue,
25962
+ LocalTrace: () => LocalTrace,
25957
25963
  Logger: () => Logger,
25958
25964
  LoginInvalidOrgError: () => LoginInvalidOrgError,
25959
25965
  NOOP_SPAN: () => NOOP_SPAN,
@@ -26187,6 +26193,7 @@ async function invoke(args) {
26187
26193
  mode,
26188
26194
  schema,
26189
26195
  strict,
26196
+ overrides,
26190
26197
  projectId,
26191
26198
  ...functionIdArgs
26192
26199
  } = args;
@@ -26223,7 +26230,8 @@ async function invoke(args) {
26223
26230
  tags,
26224
26231
  stream,
26225
26232
  mode,
26226
- strict
26233
+ strict,
26234
+ overrides
26227
26235
  };
26228
26236
  const headers = {
26229
26237
  Accept: stream ? "text/event-stream" : "application/json"
package/dist/workerd.mjs CHANGED
@@ -3702,7 +3702,7 @@ function btStreamParser() {
3702
3702
  },
3703
3703
  async transform(chunk, controller) {
3704
3704
  if (chunk instanceof Uint8Array) {
3705
- parser.feed(decoder.decode(chunk));
3705
+ parser.feed(decoder.decode(chunk, { stream: true }));
3706
3706
  } else if (typeof chunk === "string") {
3707
3707
  parser.feed(chunk);
3708
3708
  } else {
@@ -3710,6 +3710,10 @@ function btStreamParser() {
3710
3710
  }
3711
3711
  },
3712
3712
  async flush(controller) {
3713
+ const tail = decoder.decode();
3714
+ if (tail) {
3715
+ parser.feed(tail);
3716
+ }
3713
3717
  controller.terminate();
3714
3718
  }
3715
3719
  });
@@ -25777,6 +25781,7 @@ __export(exports_exports, {
25777
25781
  LEGACY_CACHED_HEADER: () => LEGACY_CACHED_HEADER,
25778
25782
  LOGS3_OVERFLOW_REFERENCE_TYPE: () => LOGS3_OVERFLOW_REFERENCE_TYPE,
25779
25783
  LazyValue: () => LazyValue,
25784
+ LocalTrace: () => LocalTrace,
25780
25785
  Logger: () => Logger,
25781
25786
  LoginInvalidOrgError: () => LoginInvalidOrgError,
25782
25787
  NOOP_SPAN: () => NOOP_SPAN,
@@ -26010,6 +26015,7 @@ async function invoke(args) {
26010
26015
  mode,
26011
26016
  schema,
26012
26017
  strict,
26018
+ overrides,
26013
26019
  projectId,
26014
26020
  ...functionIdArgs
26015
26021
  } = args;
@@ -26046,7 +26052,8 @@ async function invoke(args) {
26046
26052
  tags,
26047
26053
  stream,
26048
26054
  mode,
26049
- strict
26055
+ strict,
26056
+ overrides
26050
26057
  };
26051
26058
  const headers = {
26052
26059
  Accept: stream ? "text/event-stream" : "application/json"
@@ -33081,6 +33088,7 @@ export {
33081
33088
  LEGACY_CACHED_HEADER,
33082
33089
  LOGS3_OVERFLOW_REFERENCE_TYPE,
33083
33090
  LazyValue,
33091
+ LocalTrace,
33084
33092
  Logger,
33085
33093
  LoginInvalidOrgError,
33086
33094
  NOOP_SPAN,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "braintrust",
3
- "version": "3.15.0",
3
+ "version": "3.17.0",
4
4
  "description": "SDK for integrating Braintrust",
5
5
  "repository": {
6
6
  "type": "git",
@@ -19,7 +19,8 @@
19
19
  "./dist/index.d.mts": "./dist/browser.d.mts"
20
20
  },
21
21
  "bin": {
22
- "braintrust": "./dist/cli.js"
22
+ "braintrust": "./dist/cli.js",
23
+ "bt": "./bin/bt"
23
24
  },
24
25
  "exports": {
25
26
  "./package.json": "./package.json",
@@ -127,9 +128,13 @@
127
128
  "files": [
128
129
  "dist/**/*",
129
130
  "dev/dist/**/*",
130
- "util/dist/**/*"
131
+ "util/dist/**/*",
132
+ "bin/bt",
133
+ "scripts/bt-helper.js",
134
+ "scripts/install.js"
131
135
  ],
132
136
  "scripts": {
137
+ "postinstall": "node ./scripts/install.js",
133
138
  "build": "cross-env NODE_OPTIONS=\"--max-old-space-size=8192\" tsup",
134
139
  "check:typings": "tsc --noEmit",
135
140
  "watch": "tsup --watch",
@@ -224,6 +229,15 @@
224
229
  "peerDependencies": {
225
230
  "zod": "^3.25.34 || ^4.0"
226
231
  },
232
+ "optionalDependencies": {
233
+ "@braintrust/bt-darwin-arm64": "0.11.1",
234
+ "@braintrust/bt-darwin-x64": "0.11.1",
235
+ "@braintrust/bt-linux-arm64": "0.11.1",
236
+ "@braintrust/bt-linux-x64": "0.11.1",
237
+ "@braintrust/bt-linux-x64-musl": "0.11.1",
238
+ "@braintrust/bt-win32-arm64": "0.11.1",
239
+ "@braintrust/bt-win32-x64": "0.11.1"
240
+ },
227
241
  "publishConfig": {
228
242
  "access": "public",
229
243
  "registry": "https://registry.npmjs.org/",
@@ -0,0 +1,139 @@
1
+ "use strict";
2
+
3
+ // Shared helpers for locating the `bt` binary. Used by both `bin/bt`
4
+ // (the runtime launcher) and `scripts/install.js` (the postinstall
5
+ // fallback downloader).
6
+
7
+ const fs = require("node:fs");
8
+ const os = require("node:os");
9
+ const path = require("node:path");
10
+
11
+ const BINARY_DISTRIBUTIONS = [
12
+ { packageName: "@braintrust/bt-darwin-arm64", subpath: "bin/bt" },
13
+ { packageName: "@braintrust/bt-darwin-x64", subpath: "bin/bt" },
14
+ { packageName: "@braintrust/bt-linux-arm64", subpath: "bin/bt" },
15
+ { packageName: "@braintrust/bt-linux-x64", subpath: "bin/bt" },
16
+ { packageName: "@braintrust/bt-linux-x64-musl", subpath: "bin/bt" },
17
+ { packageName: "@braintrust/bt-win32-arm64", subpath: "bin/bt.exe" },
18
+ { packageName: "@braintrust/bt-win32-x64", subpath: "bin/bt.exe" },
19
+ ];
20
+
21
+ function detectLibc() {
22
+ if (process.platform !== "linux") return null;
23
+ try {
24
+ const report = process.report && process.report.getReport();
25
+ if (report && report.header && report.header.glibcVersionRuntime) {
26
+ return "glibc";
27
+ }
28
+ return "musl";
29
+ } catch {
30
+ return "glibc";
31
+ }
32
+ }
33
+
34
+ function binaryName() {
35
+ return process.platform === "win32" ? "bt.exe" : "bt";
36
+ }
37
+
38
+ function getDistributionForThisPlatform() {
39
+ const arch = os.arch();
40
+ const platform = os.platform();
41
+ const subpath = `bin/${binaryName()}`;
42
+
43
+ let packageName;
44
+ if (platform === "darwin") {
45
+ if (arch === "arm64") packageName = "@braintrust/bt-darwin-arm64";
46
+ else if (arch === "x64") packageName = "@braintrust/bt-darwin-x64";
47
+ } else if (platform === "linux") {
48
+ if (arch === "arm64") {
49
+ packageName = "@braintrust/bt-linux-arm64";
50
+ } else if (arch === "x64") {
51
+ packageName =
52
+ detectLibc() === "musl"
53
+ ? "@braintrust/bt-linux-x64-musl"
54
+ : "@braintrust/bt-linux-x64";
55
+ }
56
+ } else if (platform === "win32") {
57
+ if (arch === "arm64") packageName = "@braintrust/bt-win32-arm64";
58
+ else if (arch === "x64") packageName = "@braintrust/bt-win32-x64";
59
+ }
60
+
61
+ return { packageName, subpath };
62
+ }
63
+
64
+ function throwUnsupportedPlatformError() {
65
+ throw new Error(
66
+ `Unsupported operating system or architecture! The bt CLI does not work on ${process.platform}-${process.arch}.
67
+
68
+ bt supports:
69
+ - macOS (darwin) on arm64 and x64
70
+ - Linux on arm64 and x64 (glibc and musl)
71
+ - Windows on arm64 and x64`,
72
+ );
73
+ }
74
+
75
+ // Constructed indirectly so bundlers (e.g. @vercel/nft) don't statically
76
+ // detect the fallback binary path as an asset to trace.
77
+ function getFallbackBinaryPath() {
78
+ const parts = [__dirname, binaryName()];
79
+ return path.resolve(...parts);
80
+ }
81
+
82
+ function getBinaryPath() {
83
+ if (process.env.BT_BINARY_PATH) {
84
+ return process.env.BT_BINARY_PATH;
85
+ }
86
+
87
+ const { packageName, subpath } = getDistributionForThisPlatform();
88
+
89
+ if (packageName === undefined) {
90
+ throwUnsupportedPlatformError();
91
+ }
92
+
93
+ // Prefer the optional dep so a stale fallback from a prior
94
+ // `--omit=optional` install can't shadow a newer optional dep on upgrade.
95
+ try {
96
+ return require.resolve(`${packageName}/${subpath}`);
97
+ } catch (e) {
98
+ const fallbackBinaryPath = getFallbackBinaryPath();
99
+ if (fs.existsSync(fallbackBinaryPath)) {
100
+ return fallbackBinaryPath;
101
+ }
102
+
103
+ const otherInstalled = BINARY_DISTRIBUTIONS.find((dist) => {
104
+ try {
105
+ require.resolve(`${dist.packageName}/${dist.subpath}`);
106
+ return true;
107
+ } catch {
108
+ return false;
109
+ }
110
+ });
111
+
112
+ // Error messages inspired by esbuild:
113
+ // https://github.com/evanw/esbuild/blob/f3d535262e3998d845d0f102b944ecd5a9efda57/lib/npm/node-platform.ts#L150
114
+ if (otherInstalled) {
115
+ throw new Error(
116
+ `bt binary for this platform/architecture not found!
117
+
118
+ The "${otherInstalled.packageName}" package is installed, but for the current platform you should have the "${packageName}" package installed instead. This usually happens if "braintrust" is installed on one platform (for example macOS or Windows) and the "node_modules" folder is then reused on another (for example Linux in Docker).
119
+
120
+ To fix this, avoid copying the "node_modules" folder, and instead freshly install your dependencies on the target system. You can also configure your package manager to install the right package. For example, yarn has the "supportedArchitectures" feature: https://yarnpkg.com/configuration/yarnrc/#supportedArchitecture.`,
121
+ );
122
+ }
123
+
124
+ throw new Error(
125
+ `bt binary for this platform/architecture not found!
126
+
127
+ It seems like none of the "braintrust" package's optional dependencies got installed. Please make sure your package manager is configured to install optional dependencies. If you are using npm, don't set the "--no-optional", "--ignore-optional", or "--omit=optional" flags. The "braintrust" package needs the "optionalDependencies" feature in order to install the bt binary.`,
128
+ );
129
+ }
130
+ }
131
+
132
+ module.exports = {
133
+ BINARY_DISTRIBUTIONS,
134
+ binaryName,
135
+ getBinaryPath,
136
+ getDistributionForThisPlatform,
137
+ getFallbackBinaryPath,
138
+ throwUnsupportedPlatformError,
139
+ };
@@ -0,0 +1,153 @@
1
+ "use strict";
2
+
3
+ // Postinstall script for the `bt` CLI binary.
4
+ //
5
+ // The native binary ships in a per-platform `@braintrust/bt-*` package listed
6
+ // in `optionalDependencies`; npm/pnpm install only the one matching the host.
7
+ // If a package manager is run with `--no-optional`, `--ignore-optional`, or
8
+ // `--omit=optional`, none of those packages get installed and `bt` would be
9
+ // unusable. As a workaround, we manually fetch the matching tarball from the
10
+ // npm registry and extract the binary so the launcher can find it.
11
+
12
+ const fs = require("node:fs");
13
+ const https = require("node:https");
14
+ const path = require("node:path");
15
+ const zlib = require("node:zlib");
16
+
17
+ const helper = require("./bt-helper");
18
+ const pkg = require("../package.json");
19
+
20
+ if (process.env.BT_SKIP_DOWNLOAD === "1") {
21
+ console.log(
22
+ "bt: skipping post-install binary download because BT_SKIP_DOWNLOAD=1 is set.",
23
+ );
24
+ process.exit(0);
25
+ }
26
+
27
+ const { packageName, subpath } = helper.getDistributionForThisPlatform();
28
+
29
+ if (packageName === undefined) {
30
+ // Don't fail the install; the launcher will surface the unsupported-platform
31
+ // error if/when the user actually tries to run `bt`.
32
+ console.error(
33
+ `bt: no prebuilt binary available for ${process.platform}-${process.arch}; the bt CLI will not be available.`,
34
+ );
35
+ process.exit(0);
36
+ }
37
+
38
+ try {
39
+ require.resolve(`${packageName}/${subpath}`);
40
+ // Optional dependency was installed successfully. Nothing to do.
41
+ process.exit(0);
42
+ } catch (e) {
43
+ // Fall through to the manual download path below.
44
+ console.log(
45
+ `bt: failed to locate the "${packageName}" package after installation.
46
+
47
+ This can happen if you use an option to disable optional dependencies during installation, like "--no-optional", "--ignore-optional", or "--omit=optional". The "braintrust" package uses the "optionalDependencies" package.json feature to install the correct bt binary for your platform and operating system. This post-install script will now try to work around that by manually downloading the bt binary from the npm registry. If this fails, you need to remove the "--no-optional", "--ignore-optional", and "--omit=optional" flags for bt to work.`,
48
+ );
49
+ }
50
+
51
+ const version = (pkg.optionalDependencies || {})[packageName];
52
+ if (!version) {
53
+ // Don't fail the parent install: the SDK works without `bt`, and the
54
+ // launcher errors clearly if it's actually invoked.
55
+ console.error(
56
+ `bt: cannot determine which version of "${packageName}" to download — it is not listed in the "braintrust" package's optionalDependencies. The bt CLI will not be available; the rest of the braintrust SDK is unaffected.`,
57
+ );
58
+ process.exit(0);
59
+ }
60
+
61
+ function fetchBuffer(url, redirectsRemaining = 5) {
62
+ return new Promise((resolve, reject) => {
63
+ https
64
+ .get(url, (response) => {
65
+ const { statusCode = 0, headers } = response;
66
+ if (statusCode >= 200 && statusCode < 300) {
67
+ const chunks = [];
68
+ response.on("data", (chunk) => chunks.push(chunk));
69
+ response.on("end", () => resolve(Buffer.concat(chunks)));
70
+ response.on("error", reject);
71
+ return;
72
+ }
73
+ if (
74
+ statusCode >= 300 &&
75
+ statusCode < 400 &&
76
+ headers.location &&
77
+ redirectsRemaining > 0
78
+ ) {
79
+ response.resume();
80
+ fetchBuffer(headers.location, redirectsRemaining - 1).then(
81
+ resolve,
82
+ reject,
83
+ );
84
+ return;
85
+ }
86
+ response.resume();
87
+ reject(
88
+ new Error(
89
+ `npm registry responded with status code ${statusCode} when downloading ${url}`,
90
+ ),
91
+ );
92
+ })
93
+ .on("error", reject);
94
+ });
95
+ }
96
+
97
+ // Extracts a single file from an uncompressed tar archive. Tar archives are
98
+ // organized in 512-byte blocks: a header block (file name in bytes 0-99,
99
+ // file size in bytes 124-135 as an octal string) followed by data blocks
100
+ // padded out to the next multiple of 512.
101
+ function extractFileFromTarball(tarball, target) {
102
+ let offset = 0;
103
+ while (offset + 512 <= tarball.length) {
104
+ const header = tarball.subarray(offset, offset + 512);
105
+ offset += 512;
106
+ const fileName = header.toString("utf-8", 0, 100).replace(/\0.*/g, "");
107
+ if (!fileName) break;
108
+ const fileSize = parseInt(
109
+ header.toString("utf-8", 124, 136).replace(/\0.*/g, ""),
110
+ 8,
111
+ );
112
+ if (fileName === target) {
113
+ return tarball.subarray(offset, offset + fileSize);
114
+ }
115
+ offset = (offset + fileSize + 511) & ~511;
116
+ }
117
+ return null;
118
+ }
119
+
120
+ async function downloadFallback() {
121
+ // npm tarball URLs look like:
122
+ // https://registry.npmjs.org/<scope>/<name>/-/<name>-<version>.tgz
123
+ // where <name> is the unscoped package name.
124
+ const tarballName = packageName.split("/").pop();
125
+ const url = `https://registry.npmjs.org/${packageName}/-/${tarballName}-${version}.tgz`;
126
+ console.log(`bt: downloading ${packageName}@${version} from ${url}`);
127
+
128
+ const gzipped = await fetchBuffer(url);
129
+ const tarball = zlib.gunzipSync(gzipped);
130
+ const binary = extractFileFromTarball(tarball, `package/${subpath}`);
131
+
132
+ if (!binary) {
133
+ throw new Error(
134
+ `could not find "package/${subpath}" inside ${packageName}@${version} tarball`,
135
+ );
136
+ }
137
+
138
+ const fallbackBinaryPath = helper.getFallbackBinaryPath();
139
+ fs.mkdirSync(path.dirname(fallbackBinaryPath), { recursive: true });
140
+ fs.writeFileSync(fallbackBinaryPath, binary);
141
+ fs.chmodSync(fallbackBinaryPath, 0o755);
142
+ console.log(`bt: installed fallback binary at ${fallbackBinaryPath}`);
143
+ }
144
+
145
+ downloadFallback().catch((err) => {
146
+ // Don't fail the parent install: airgapped/proxied CI may not reach the
147
+ // npm registry, and the SDK works without `bt`.
148
+ console.error(
149
+ `bt: failed to download fallback binary for ${packageName}@${version}: ${err.message}
150
+ The bt CLI will not be available; the rest of the braintrust SDK is unaffected.`,
151
+ );
152
+ process.exit(0);
153
+ });