Notable Changes
- MCP client according to 2026-07-28 by @jmartisk in #5881
- Update milvus to V2 service & support hybrid search by @yangzho12138 in #3311
- Add tool actions compensation at agentic system level by @mariofusco in #5823
- Add
AnthropicBatchChatModelfor the Anthropic Message Batches API by @subhashpolisetti in #5875 - MCP: surface tool result
_metainToolExecutionResult.attributes()by @dliubarskyi in #6044 - Add watsonx.ai Model Gateway support and dedicated Deployment chat models by @andreadimaio in #5979
- Add thinking support to google-genai by @subhashpolisetti in #6041
Other Changes
- Update the watsonx.ai SDK to the latest version by @andreadimaio in #5710
- Redact sensitive AWS auth headers (Authorization, X-Amz-Security-Toke… by @OmkarKathile007 in #5799
- fix: do not consume the response body on the OkHttp streaming path by @thswlsqls in #5806
- Decode gzip/deflate responses in Utils.readBytes by @TimurRakhmatullin86 in #5801
- fix: Map connectTimeout to connection establishment in Apache HTTP client by @thswlsqls in #5807
- fix: Read SSE error response body as UTF-8 without reassembling line separators by @thswlsqls in #5809
- Disable Apache HttpClient's automatic retries by default in ApacheHttpClient by @dliubarskyi in #5811
- fix: preserve progressToken when applying a user-supplied MCP _meta by @wushiyuanmaimob in #5792
- fix: treat an MCP $ref outside $defs as a plain schema, not a reference by @subhashpolisetti in #5790
- fix: tear down previous MCP connection on reconnect to avoid resource leak by @farzad-sedaghatbin in #5757
- fix: make Utils.merge null-safe and never return null by @Ayomipo18 in #5817
- fix: avoid NoSuchElementException in dynamic tool refresh on evicted user message by @subhashpolisetti in #5820
- chore: update google-genai to 1.63.0 by @glaforge in #5824
- build(deps): bump websocket-driver from 0.7.4 to 0.7.5 in /docs by @dependabot[bot] in #5779
- Fix NPE when LanguageModelQueryRouter receives an unknown retriever id from the LLM by @TimurRakhmatullin86 in #5796
- docs: update Valkey embedding store to 9.1 GA container by @madolson in #5768
- fix(deps): update dependency org.postgresql:postgresql to v42.7.12 [security] by @renovate[bot] in #5832
- chore(deps): update dependency org.postgresql:postgresql to v42.7.12 [security] by @renovate[bot] in #5833
- chore(deps): bump dompurify from 3.4.11 to 3.4.12 in /docs by @dependabot[bot] in #5830
- chore(deps): bump body-parser from 1.20.4 to 1.20.6 in /docs by @dependabot[bot] in #5829
- chore(deps): bump svgo from 3.3.3 to 3.3.4 in /docs by @dependabot[bot] in #5828
- chore(deps): bump fast-uri from 3.1.2 to 3.1.4 in /docs by @dependabot[bot] in #5827
- test: add unit tests for GoogleAiGeminiChatRequestParameters by @gaoxiaolei-s59 in #5715
- test: fix swapped read/write method references in Tablestore metadata type guard message by @thswlsqls in #5611
- fix: support 3D logit output in OnnxScoringBertCrossEncoder by @CountClaw in #5739
- chore(deps-dev): bump org.postgresql:postgresql from 42.7.11 to 42.7.12 in /experimental/langchain4j-experimental-hibernate by @dependabot[bot] in #5826
- docs(agentic): remove invalid executor() from async sequence example by @arimu1 in #5842
- fix: support equals on agentic proxies by @thswlsqls in #5847
- fix: return empty collection from parallel mapper agent on empty input by @thswlsqls in #5848
- fix: Complete A2A response future when the stream ends without a result by @thswlsqls in #5850
- fix(deps): update dependency io.netty:netty-codec-http2 to v4.1.136.final [security] by @renovate[bot] in #5831
- Introduce
MistralAiChatRequestParametersfor per-request overrides by @subhashpolisetti in #5852 - Updated opennlp-tools version to 2.5.11 by @dliubarskyi in #5857
- fix: make tool search matching locale-independent by @thswlsqls in #5861
- Avoid NullPointerException when an async agent returns null by @subhashpolisetti in #5864
- Allow json deserialization of the AgenticScope only for known and registered classes by @mariofusco in #5872
- Fixes Ickle injection issue by @karesti in #5856
- docs(cdi): add integration page for LangChain4j CDI framework by @ehsavoie in #5873
- fix(anthropic): apply cache_control to image and pdf content blocks by @mrzgetbetter820 in #5868
- Handle the three distinct endpoint host formats depending on location type by @starksm64 in #5869
- chore(deps): bump postcss from 8.5.8 to 8.5.23 in /docs by @dependabot[bot] in #5853
- chore(deps): bump shell-quote from 1.8.4 to 1.10.0 in /docs by @dependabot[bot] in #5836
- chore(deps): bump webpack-dev-server from 5.2.5 to 5.2.6 in /docs by @dependabot[bot] in #5834
- Update actions/checkout digest to 3d3c42e by @renovate[bot] in #5854
- fix(google-genai): preserve declared property order in schemas by @subhashpolisetti in #5839
- fix: parse "reasoning" as an alias for "reasoning_content" in OpenAI chat responses by @brokenlander in #5843
- Add Builder and configurable text extraction to DoclingDocumentParser by @edeandrea in #5818
- fix: make metadata key collisions and skipped documents visible during document loading by @thswlsqls in #5542
- Fix agent using a summarizedContext with scope-dependent @ChatModelSupplier by @mariofusco in #5879
- chore(deps): update actions/setup-java digest to 03ad4de by @renovate[bot] in #5877
- fix(deps): update dependency com.google.errorprone:error_prone_annotations to v2.50.0 by @renovate[bot] in #5245
- fix(deps): update dependency com.microsoft.azure:msal4j to v1.25.1 by @renovate[bot] in #5246
- fix: add null/empty choices guard in AzureOpenAiChatModel by @farzad-sedaghatbin in #4815
- docs: fix Javadoc typo and test empty metadataCssSelectors match in HtmlToTextDocumentTransformer by @thswlsqls in #5452
- fix(mistralai): guard against empty/null choices in MistralAiChatModel.doChat by @dong0713 in #5821
- fix: Use configured similarity metric in CassandraEmbeddingStore search instead of hardcoded COSINE by @thswlsqls in #5507
- fix: Strip only a single leading space from SSE data field by @thswlsqls in #5532
- chore(deps): update dependency maven to v3.9.16 by @renovate[bot] in #5883
- chore(deps): update dependency com.ibm.db2:jcc to v12.1.5.0 by @renovate[bot] in #5882
- Fix parallel agent failures surfacing as RuntimeException instead of AgentInvocationException by @gnsharans in #5962
- Complete A2A response future exceptionally on interrupted task states by @angus-guo in #5924
- chore(deps-dev): bump org.jsoup:jsoup from 1.22.2 to 1.23.1 in /langchain4j-agentic-patterns by @dependabot[bot] in #6005
- fix(deps): update dependency org.jsoup:jsoup to v1.23.1 [security] by @renovate[bot] in #6004
- chore(deps): bump org.jsoup:jsoup from 1.18.3 to 1.23.1 in /langchain4j-oracle by @dependabot[bot] in #6002
- chore(deps): bump io.micrometer:micrometer-core from 1.16.5 to 1.16.6 in /langchain4j-micrometer-metrics by @dependabot[bot] in #5998
- chore(deps): bump js-yaml from 3.14.2 to 3.15.1 in /docs by @dependabot[bot] in #6011
- chore(deps): bump brace-expansion from 1.1.13 to 1.1.18 in /docs by @dependabot[bot] in #6010
- chore(deps): bump dompurify from 3.4.12 to 3.4.13 in /docs by @dependabot[bot] in #6009
- chore(deps): bump mermaid from 11.15.0 to 11.16.1 in /docs by @dependabot[bot] in #6000
- chore(deps): bump fast-uri from 3.1.4 to 3.1.5 in /docs by @dependabot[bot] in #5966
- fix: Include cache token fields in AnthropicTokenUsage equals and hashCode by @thswlsqls in #5893
- fix: Apply disableParallelToolUse when toolChoice is not set in Anthropic requests by @thswlsqls in #5892
- fix: parse a bare JSON array in collection output parsers by @farzad-sedaghatbin in #5905
- fix: use the exact metadata key in Coherence metadata filters by @thswlsqls in #5907
- fix: report Amazon Bedrock provider and model name from BedrockCohereEmbeddingModel by @thswlsqls in #5909
- fix: Handle nested Not in ChromaMetadataFilterMapper by @thswlsqls in #5912
- fix: Accept any memoryId type in CassandraChatMemoryStore by @thswlsqls in #5919
- fix: Validate ids/embeddings/textSegments size in ChromaEmbeddingStore.addAll by @thswlsqls in #5913
- fix: Stop double-normalizing relevance scores in CassandraEmbeddingStore by @thswlsqls in #5920
- Clean up AI Services doc formatting by @Abdullah8006 in #5940
- fix: Default ElasticsearchContentRetriever maxResults to 3 as documented by @thswlsqls in #5932
- fix: Render non-String metadata values in DefaultContentInjector by @thswlsqls in #5936
- fix: Repair toBuilder() copy constructors in observability events by @thswlsqls in #5937
- fix: Add missing Gemini finish reasons to prevent response deserialization failure by @thswlsqls in #5948
- fix: Report TOOL_EXECUTION finish reason for Google GenAI tool call responses by @thswlsqls in #5950
- fix: Correct mislabeled safeSearch field in WebSearchRequest toString by @thswlsqls in #5938
- fix: Check HTTP status in GeminiFiles.listFiles instead of returning an empty list by @thswlsqls in #5949
- fix: Map JsonAnyOfSchema to Google GenAI anyOf schema by @thswlsqls in #5951
- Handle non-complex metadata field when reading Azure AI Search results by @subhashpolisetti in #5862
- fix: Mask secret HTTP headers regardless of the JVM default locale by @thswlsqls in #5961
- fix: Restore serialization of Hugging Face request options by @thswlsqls in #5956
- fix: Return generated text when GPULlama3 generation stops at maxTokens by @thswlsqls in #5959
- Override equals, hashCode and toString in
BedrockChatRequestParametersby @subhashpolisetti in #5969 - fix: return null instead of throwing NPE for URIs without a file name by @Tundesjaiyesmi in #5977
- Fix
AgentInvocationExceptionwrapping in theDeferredResponsetimeout overload by @subhashpolisetti in #5986 - Keep generated images from every streamed chunk by @subhashpolisetti in #5972
- fix: make Elasticsearch full text and vector search return structurally identical TextSegments by @zya1020 in #5975
- Send tool parameters as JSON Schema when they have no typed form by @monrax in #6015
- Fix interface-level
@SystemMessagebeing ignored in AI Services by @subhashpolisetti in #5991 - Support the Ollama truncate field so an over-long prompt can fail instead of being trimmed by @monrax in #6018
- fix: only serialize responseLogprobs and enableEnhancedCivicAnswers when explicitly set by @Pahkho in #6016
- fix: make Utils.copy return an actual copy instead of an unmodifiable view by @Tundesjaiyesmi in #6020
- fix: Use a new Jlama session id for each request by @thswlsqls in #6027
- Fix Bedrock default request parameters to preserve serviceTier and responseFormat by @subhashpolisetti in #6031
- Fix Bedrock guardrail assessment handling for ConverseTrace without a guardrail by @subhashpolisetti in #6029
- Fix Pinecone segment text being overwritten by reserved metadata key by @subhashpolisetti in #6033
- fix: honor lateChunking in Jina multimodal embedding requests by @thswlsqls in #6026
- Fix
returnThinkingbeing ignored byBedrockStreamingChatModelby @subhashpolisetti in #6035 - fix: keep the sign of negative numbers in SqlFilterParser IN lists by @masiljangajji in #6037
- fix: Reset entity-declared metadata attributes in HibernateEmbeddingStore.createEntities by @thswlsqls in #5958
- Add generateContentConfigCustomizer to GoogleGenAiBatchChatModel by @angus-guo in #5880
- Update dependency org.apache.httpcomponents.core5:httpcore5 to v5.4.3 [SECURITY] by @renovate[bot] in #6040
- Fix Pinecone reserved text key being returned in metadata by @subhashpolisetti in #6043
- fix: Read error response body as UTF-8 without reassembling line separators by @angus-guo in #6021
- Allow to provide an agent with an external memory ID supplier by @mariofusco in #5903
- chore(deps): bump org.apache.httpcomponents.client5:httpclient5 from 5.6.1 to 5.6.3 in /http-clients/langchain4j-http-client-apache by @dependabot[bot] in #6049
- Fix Validate
maxSegmentsPerBatchinBedrockCohereEmbeddingModelby @subhashpolisetti in #6060 - Fix Convert a JSON null to a null
Documentinstead of the string "null" by @subhashpolisetti in #6058 - Fix Bedrock stop-reason mapping for AWS-added stop reasons by @subhashpolisetti in #6056
- fix: honor the negation in SqlFilterParser NOT BETWEEN by @masiljangajji in #6063
- fix: apply retrieval constraints to Elasticsearch full text search by @FyCode007 in #6046
New Contributors
- @OmkarKathile007 made their first contribution in #5799
- @TimurRakhmatullin86 made their first contribution in #5801
- @madolson made their first contribution in #5768
- @CountClaw made their first contribution in #5739
- @arimu1 made their first contribution in #5842
- @mrzgetbetter820 made their first contribution in #5868
- @starksm64 made their first contribution in #5869
- @brokenlander made their first contribution in #5843
- @dong0713 made their first contribution in #5821
- @gnsharans made their first contribution in #5962
- @Abdullah8006 made their first contribution in #5940
- @Tundesjaiyesmi made their first contribution in #5977
- @zya1020 made their first contribution in #5975
- @monrax made their first contribution in #6015
- @masiljangajji made their first contribution in #6037
- @FyCode007 made their first contribution in #6046
Full Changelog: 1.18.1...1.19.0