Summary
The LangChain4j instrumentation wraps OpenAiChatModel, OpenAiStreamingChatModel, and AiServices, but does not instrument any EmbeddingModel implementation. Calls to embeddingModel.embed() or embeddingModel.embedAll() through LangChain4j produce no Braintrust spans, no input/output capture, and no usage metrics.
This is distinct from #60 (which covers missing non-OpenAI chat model providers) and from #71 (which covers Spring AI embedding gaps). LangChain4j's EmbeddingModel is a separate interface from ChatLanguageModel with its own implementations, builders, and HTTP transport.
What is missing
No wrapper methods for EmbeddingModel
BraintrustLangchain.java (lines 22–152) only handles:
AiServices<T> wrapping (lines 22–85)
OpenAiChatModel wrapping (lines 87–118)
OpenAiStreamingChatModel wrapping (lines 120–152)
There is no wrap(OpenTelemetry, EmbeddingModel) method or any reference to embedding models.
No auto-instrumentation for embedding builders
LangchainInstrumentationModule.java (lines 44–145) registers ByteBuddy advice for exactly 3 builder classes:
OpenAiChatModel$OpenAiChatModelBuilder
OpenAiStreamingChatModel$OpenAiStreamingChatModelBuilder
AiServices
No embedding model builder (e.g., OpenAiEmbeddingModel$OpenAiEmbeddingModelBuilder) is targeted.
No fallback to upstream SDK auto-instrumentation
LangChain4j embedding model implementations use LangChain4j's own internal dev.langchain4j.http.client.HttpClient, not the upstream provider SDKs (com.openai:openai-java, etc.). This means the OpenAI auto-instrumentation module (openai_2_8_0) does not intercept embedding calls made through LangChain4j's OpenAiEmbeddingModel.
The WrappedHttpClient class in the LangChain4j module already wraps LangChain4j's internal HTTP client for chat models — the same pattern could be applied to embedding models.
Affected LangChain4j embedding models
| LangChain4j class |
Provider |
OpenAiEmbeddingModel |
OpenAI |
AzureOpenAiEmbeddingModel |
Azure OpenAI |
GoogleAiEmbeddingModel |
Google AI |
VertexAiEmbeddingModel |
Google Vertex AI |
OllamaEmbeddingModel |
Ollama |
MistralAiEmbeddingModel |
Mistral AI |
Braintrust docs status
Upstream sources
Local files inspected
braintrust-sdk/instrumentation/langchain_1_8_0/src/main/java/dev/braintrust/instrumentation/langchain/v1_8_0/BraintrustLangchain.java — lines 22–152 (only chat model and AiServices wrapping; no embedding model handling)
braintrust-sdk/instrumentation/langchain_1_8_0/src/main/java/dev/braintrust/instrumentation/langchain/v1_8_0/auto/LangchainInstrumentationModule.java — lines 44–145 (only chat model builders and AiServices targeted; no embedding builder)
braintrust-sdk/instrumentation/langchain_1_8_0/src/main/java/dev/braintrust/instrumentation/langchain/v1_8_0/WrappedHttpClient.java — existing HTTP client wrapper that could be reused for embedding models
braintrust-sdk/instrumentation/langchain_1_8_0/src/test/java/dev/braintrust/instrumentation/langchain/v1_8_0/BraintrustLangchainTest.java — no embedding model tests exist
Summary
The LangChain4j instrumentation wraps
OpenAiChatModel,OpenAiStreamingChatModel, andAiServices, but does not instrument anyEmbeddingModelimplementation. Calls toembeddingModel.embed()orembeddingModel.embedAll()through LangChain4j produce no Braintrust spans, no input/output capture, and no usage metrics.This is distinct from #60 (which covers missing non-OpenAI chat model providers) and from #71 (which covers Spring AI embedding gaps). LangChain4j's
EmbeddingModelis a separate interface fromChatLanguageModelwith its own implementations, builders, and HTTP transport.What is missing
No wrapper methods for EmbeddingModel
BraintrustLangchain.java(lines 22–152) only handles:AiServices<T>wrapping (lines 22–85)OpenAiChatModelwrapping (lines 87–118)OpenAiStreamingChatModelwrapping (lines 120–152)There is no
wrap(OpenTelemetry, EmbeddingModel)method or any reference to embedding models.No auto-instrumentation for embedding builders
LangchainInstrumentationModule.java(lines 44–145) registers ByteBuddy advice for exactly 3 builder classes:OpenAiChatModel$OpenAiChatModelBuilderOpenAiStreamingChatModel$OpenAiStreamingChatModelBuilderAiServicesNo embedding model builder (e.g.,
OpenAiEmbeddingModel$OpenAiEmbeddingModelBuilder) is targeted.No fallback to upstream SDK auto-instrumentation
LangChain4j embedding model implementations use LangChain4j's own internal
dev.langchain4j.http.client.HttpClient, not the upstream provider SDKs (com.openai:openai-java, etc.). This means the OpenAI auto-instrumentation module (openai_2_8_0) does not intercept embedding calls made through LangChain4j'sOpenAiEmbeddingModel.The
WrappedHttpClientclass in the LangChain4j module already wraps LangChain4j's internal HTTP client for chat models — the same pattern could be applied to embedding models.Affected LangChain4j embedding models
OpenAiEmbeddingModelAzureOpenAiEmbeddingModelGoogleAiEmbeddingModelVertexAiEmbeddingModelOllamaEmbeddingModelMistralAiEmbeddingModelBraintrust docs status
Upstream sources
EmbeddingModelis a core interface withembed(String),embed(TextSegment), andembedAll(List<TextSegment>)methodslangchain4j-open-aimodule providesOpenAiEmbeddingModelas a first-party integrationLocal files inspected
braintrust-sdk/instrumentation/langchain_1_8_0/src/main/java/dev/braintrust/instrumentation/langchain/v1_8_0/BraintrustLangchain.java— lines 22–152 (only chat model and AiServices wrapping; no embedding model handling)braintrust-sdk/instrumentation/langchain_1_8_0/src/main/java/dev/braintrust/instrumentation/langchain/v1_8_0/auto/LangchainInstrumentationModule.java— lines 44–145 (only chat model builders and AiServices targeted; no embedding builder)braintrust-sdk/instrumentation/langchain_1_8_0/src/main/java/dev/braintrust/instrumentation/langchain/v1_8_0/WrappedHttpClient.java— existing HTTP client wrapper that could be reused for embedding modelsbraintrust-sdk/instrumentation/langchain_1_8_0/src/test/java/dev/braintrust/instrumentation/langchain/v1_8_0/BraintrustLangchainTest.java— no embedding model tests exist