Commit Graph

507 Commits

Author SHA1 Message Date
Christian Tzolov
10193431f6 Observability instrumentation for VertexAI Text Embedding 2024-10-08 11:20:08 +02:00
Christian Tzolov
d71ca0e68e Add observability support to TransformersEmbeddingModel
- Integrate ObservationRegistry and EmbeddingModelObservationConvention
 - Update TransformersEmbeddingModel to use observations
 - Add TransformersEmbeddingModelObservationTests
 - Update TransformersEmbeddingModelAutoConfiguration for observation support
 - Add ONNX to AiProvider enum
2024-10-08 10:48:48 +02:00
GR
7bd8a17d33 Add observability to zhipu chat model 2024-10-08 10:38:18 +02:00
GR
6203325f30 Add observability to qianfan chat model 2024-10-08 10:33:58 +02:00
GR
1606383704 Add observability to moonshot chat model 2024-10-08 00:40:27 +02:00
GR
ee7d2b2556 Add observability to minimax chat model
- add observability to minimax embedding model
- fix chat web search result error
- fix minimax auto configuration
2024-10-08 00:24:22 +02:00
Soby Chacko
bac002bf83 Observation for Vertex gemini chat model streaming operation
- Adding observability for Vertex Gemini chat model streaming call
- Updating auto-configuration for gemini chat model with the observability components
- Integration test for streaming observability
2024-10-08 00:14:47 +02:00
Mark Pollack
06392f90cb Update azure embedding test not to set dimensions 2024-10-08 00:10:46 +02:00
Christian Tzolov
6f39704d46 Extend observation support to Azure OpenAI models (#1491)
- Implement observation instrumentation for AzureOpenAiEmbeddingModel
 - Create AzureOpenAiEmbeddingModelObservationIT for integration testing
 - Update AzureOpenAiAutoConfiguration to support observation
 - Introduce ObservationRegistry and observation conventions
2024-10-07 17:43:13 -04:00
Soby Chacko
0763d78fef Add observability for the regular imperative call in VertexAi Gemini chat model
- Integrate ObservationRegistry for instrumentation in VertexAiGeminiChatModel's non-streaming call
- Add ChatModelObservationContext and related classes for observation
- Refactor createGeminiRequest method to support runtime options for imperative calls
- Implement observation for non-streaming chat operations in VertexAiChatModelObservationIT
- Add VertexAiGeminiConstants class for provider name

This commit enhances the VertexAiGeminiChatModel with observability features
for the non-streaming, imperative call() method. It allows for better
monitoring and instrumentation of synchronous chat operations. The changes
include refactoring to improve runtime option handling for these calls and
adds integration tests for the new observability features.
2024-10-07 23:25:40 +02:00
Christian Tzolov
9678ea53e8 Fix NPE in a test fixture 2024-10-07 20:48:10 +02:00
Mark Pollack
64b147e699 Restructure OpenAI and AzureOpenAI ChatClientITs
- Use List<ChatResponse> to better examine the full response
2024-10-07 17:29:11 +02:00
Mark Pollack
22a61548ac Fix Keyword extractor test as chatgpt's response changed 2024-10-07 16:25:19 +02:00
Christian Tzolov
38082de0f8 Refactor FunctionCallback API to use ToolContext instead of Map<String, Object>
- Replaced `Map<String, Object>` with `ToolContext` in the `FunctionCallback`, `AbstractFunctionCallback`, and related classes.
 - Updated all BiFunction definitions to use `ToolContext` as the second parameter,
   enhancing the clarity and structure of the tool context management.
 - Modified `FunctionCallbackWrapper` and `FunctionCallbackContext` to adapt to the new `ToolContext` parameter.
 - Adjusted the handling of tool context in the documentation and test classes.
 - Updated relevant test cases to reflect the API changes and modified the function handling logic to ensure consistency.
2024-10-07 16:15:55 +02:00
Christian Tzolov
4e7e4cf2b5 Add tool context support to ChatClient and related classes
- Introduce toolContext to ChatClient, DefaultChatClient, and AdvisedRequest
 - Add methods to set and manage toolContext via the FunctionCallingOptions
 - Update tests to include toolContext in relevant scenarios
 - Implement toolContext handling in function calling options
2024-10-07 11:50:41 +02:00
Mudabir Hussain
2090826656 Fix NullPointerException with Ollama + tool calls
Fixed #1459
2024-10-07 11:48:40 +02:00
Hyune-c
e12372171b Fix anthropicApi visibility in AnthropicChatModel 2024-10-06 22:41:23 +02:00
Soby Chacko
8ea56329ac Adding observability for AzureOpenAiChatModel streaming 2024-10-06 15:37:15 +02:00
Thomas Vitale
21504a6296 Keep model metric attributes fixed for Prometheus
Unlike other metrics implementations supported by Micrometer, when using the Prometheus integration, all metric attributes are supposed to have a value, or else the related metrics are dropped.

Signed-off-by: Thomas Vitale <ThomasVitale@users.noreply.github.com>
2024-10-06 15:36:49 +02:00
Thomas Vitale
3b1c68ac10 Improve optional values handling in chat model observations
Chat model observations support several key-value pairs, coming from the Spring AI abstractions.
Currently, whenever a value is not available (either because not configured by the user or not supported by the model provider), a span/metrics is generated anyway with value none.
That causes several issues, including an unneeded increase in time series, challenges in alerting/monitoring (especially for integer/double attributes that suddenly are populated with a string), and incompliance with the OpenTelemetry Semantic Conventions (according to which, attributes should be excluded altogether if there's no value).
This pull request changes the conventions for chat model observation to exclude the generation of span/metrics attributes for optional values which don't have any value.

Signed-off-by: Thomas Vitale <ThomasVitale@users.noreply.github.com>
2024-10-05 23:55:16 +02:00
Christian Tzolov
9c10a08bef Add tool context support to chat options and enhance function calling
This commit adds support for tool context in various chat options classes across
  different AI model implementations and enhances function calling capabilities.

  The tool context allows passing additional contextual information to function callbacks.

 - Add toolContext field to chat options classes
 - Update builder classes to support setting toolContext
 - Enhance FunctionCallback interface to support context-aware function calls
 - Update AbstractFunctionCallback to implement BiFunction instead of Function
 - Modify FunctionCallbackWrapper to support both Function and BiFunction and
   to use the new SchemaType location
 - Add support for BiFunction in TypeResolverHelper
 - Update ChatClient interface and DefaultChatClient implementation to support
   new function calling methods with Function, BiFunction and FunctionCallback arguments
 - Refactor AbstractToolCallSupport to pass tool context to function execution
 - Update all affected <Model>ChatOptions with tool context support
 - Simplify OpenAiChatClientMultipleFunctionCallsIT test
 - Add tests for function calling with tool context
 - Add new test cases for function callbacks with context in various integration tests
 - Modify existing tests to incorporate new context-aware function calling capabilities
 - Add docs in in openai function calling

 Resolves #864, #1303, #991
2024-10-04 16:47:42 -04:00
Soby Chacko
b68112d4cb Add Micrometer observability for Azure OpenAI chat
Implement observability for imperative calls in AzureOpenAiChatModel:

* Integrate ObservationRegistry to track metrics and events
* Create observation context and define conventions for consistency
* Add integration test to verify chat model observations
* Update AiProvider enum with new AZURE_OPENAI entry
2024-10-04 16:09:18 -04:00
Christian Tzolov
45c6622736 Fix support for FunctionCallingOptions across AI models
Add support for PortableFunctionCallingOptions across AI models

- Modify FunctionCallingOptions interface to extend ChatOptions for better integration
- Refactor option handling in chat models to accommodate both ChatOptions and FunctionCallingOptions
- Implement handling of FunctionCallingOptions in Anthropic, Azure OpenAI,
  MistralAI, Ollama, OpenAI, VertexAI Gemini, and other models
- Update existing function calling tests to use new FunctionCallingOptions.

Resolves #624
2024-10-04 15:50:59 -04:00
Christian Tzolov
89cfa9911d Simplify advisor observation naming
- Simplify advisor naming in DefaultAdvisorObservationConvention
 - Update corresponding test cases
2024-10-04 19:52:33 +02:00
dafriz
250d2afbb6 Add Meta Llama 3.1, 3.2 instruct model enums
This commit adds support for new Meta Llama 3.1 and 3.2 instruct models
to the LlamaChatBedrockApi enum. It includes model IDs for:

Llama 3.1: 8B, 70B, 405B
Llama 3.2: 1B, 3B, 11B, 90B

These additions allow users to specify the latest Llama models when
using the Bedrock API. The commit also updates the class Javadoc with
a link to AWS documentation for model IDs and bumps the @since version
to 1.0.0.
2024-10-03 16:24:56 -04:00
Soby Chacko
ef3d43ca9c Use OpenAIAsyncClient for streaming in AzureOpenAiChatModel
- Switch to OpenAIAsyncClient for streaming operations
- Modify AzureOpenAiChatModel constructor to accept OpenAIClientBuilder
- Update getChatCompletionsStream to use non-blocking async client
- Refactor related classes and tests to support OpenAIClientBuilder
- Revise AzureOpenAiAutoConfiguration to provide OpenAIClientBuilder
- Add AzureOpenAiChatClientTest to verify streaming functionality
- Adjust existing tests for compatibility with OpenAIClientBuilder

Resolves https://github.com/spring-projects/spring-ai/issues/981

This change improves support for asynchronous streaming operations
in the AzureOpenAiChatModel, addressing potential issues in reactive environments.
2024-10-03 15:55:38 -04:00
Mark Pollack
bb88e2f2de Add retry support to VertexAI embedding and chat models
Resolves https://github.com/spring-projects/spring-ai/issues/832

Introduces retry functionality to VertexAI embedding and
chat models, enhancing their resilience against transient failures.

It also corrects a typo in the VertexAiEmbeddingConnectionDetails
class name.

Key changes:

* Add RetryTemplate to VertexAiTextEmbeddingModel and VertexAiGeminiChatModel
* Introduce spring-ai-retry dependency
* Refactor code to support retry logic
* Update auto-configuration classes to incorporate retry functionality
* Fix typo in VertexAiEmbeddingConnectionDetails class name

remove extraneous commented out code

Add missing copyright headers, author etc.
2024-10-02 14:38:06 -04:00
Christian Tzolov
6fc76b7f9b Refactor advisor architecture in Spring AI
This commit introduces a major overhaul of the advisor system in Spring AI,
improving modularity, type safety, and consistency

Core Changes:
- Replace RequestAdvisor and ResponseAdvisor with CallAroundAdvisor and StreamAroundAdvisor
- Introduce AdvisedRequest and AdvisedResponse classes for better encapsulation
- Deprecate RequestResponseAdvisor in favor of new advisor types
- Remove AdvisorObservableHelper class

Advisor Implementation Updates:
- Update AbstractChatMemoryAdvisor, MessageChatMemoryAdvisor, PromptChatMemoryAdvisor,
QuestionAnswerAdvisor, SafeGuardAroundAdvisor, SimpleLoggerAdvisor, and
VectorStoreChatMemoryAdvisor to implement new advisor interfaces
- Remove CacheAroundAdvisor (functionality likely moved elsewhere)
- Make CallAroundAdvisor and StreamAroundAdvisor extend Ordered interface

Client and Chain Management:
- Modify DefaultChatClient to use new advisor chain approach
- Refactor DefaultAroundAdvisorChain for better ordering and observation
- Implement builder pattern for advisor chain construction in DefaultChatClient
- Separate call and stream advisors in DefaultAroundAdvisorChain

Observation and Context Handling:
- Update observation conventions and context handling in advisors
- Add order field to AdvisorObservationContext
- Modify DefaultAdvisorObservationConvention to include order in high cardinality key values

Testing and Integration:
- Refactor ChatClientAdvisorTests and add new AdvisorsTests
- Update integration tests to reflect new advisor structure
- Enhance AdvisorsTests to verify correct advisor execution order

New Features:
- Generalize the Protect From Blocking functionality across all advisors
- Add (experimental) Re2 advisor to enhance reasoning capabilities of LLMs
- Add disabled Re2 test in OpenAiChatClientIT

Documentation:
- Add Advisors documentation
- Enhance advisors documentation with order explanation and Re2 example

Advisor Ordering:
- Introduce Advisor constants for precedence ordering
- Update AbstractChatMemoryAdvisor to use new precedence constant
- Improve advisor ordering and management in DefaultAroundAdvisorChain.Builder
- Remove redundant reordering logic from DefaultAroundAdvisorChain

These changes aim to provide a more flexible and powerful advisor system,
allowing for easier implementation of complex AI-driven interactions

Co-authored-by: Dariusz Jędrzejczyk <dariusz.jedrzejczyk@broadcom.com>
2024-10-01 15:08:21 -04:00
dafriz
f56ce20cad Add support for max_completion_tokens in OpenAI chat options request
An upper bound for the number of tokens that can be generated for a completion,
  including visible output tokens and reasoning tokens.
  Replaces max_tokens field which is now deprecated.
2024-10-01 11:05:51 +02:00
Christian Tzolov
110a520a40 Add Llama 3.2 models to OllamaModel enum
- Include LLAMA3_2 (3B) and LLAMA3_2_1B (1B) variants
2024-09-29 15:53:27 +02:00
Soby Chacko
e29d38d987 Remove unnecessary null checks in AzureOpenAiChatOptions.Builder
This is related to https://github.com/spring-projects/spring-ai/issues/889

This commit addresses a bug where certain fields were being made
indirectly mandatory due to Assert.notNull checks in the Builder's
with* methods. Specifically:

- Removed Assert.notNull checks from withResponseFormat, withSeed,
  withLogprobs, withTopLogprobs, and withEnhancements methods.

These checks were causing exceptions in AzureOpenAiChatModel.getDefaultOptions
when not all fields were set, leading to failures in methods like
ChatClient.create, even when using the AzureOpenAiChatModel constructor
with OpenAIClient.

The removal of these checks aligns with the @JsonInclude(Include.NON_NULL)
annotation on AzureOpenAiChatOptions, which already ignores null options.
This change maintains the intended flexibility while preventing unintended
mandatory requirements.
2024-09-27 13:22:44 -04:00
Anders Swanson
ccf190c77c Add OCI GenAI embedding model support
This commit introduces support for Oracle Cloud Infrastructure (OCI)
GenAI embedding models in Spring AI. It includes:

* New OCIEmbeddingModel class for interacting with OCI GenAI API
* Auto-configuration for easy setup and integration
* Properties for configuring OCI connection and embedding options
* Documentation updates explaining usage and configuration
* Integration tests to verify functionality

Signed-off-by: Anders Swanson <anders.swanson@oracle.com>
2024-09-26 17:04:05 -04:00
Christian Tzolov
a55316c44d Remove name assertion from ToolResponseMessage validation
- Removed the assertion checking for a non-null 'name' in ToolResponseMessage
 - This change affects multiple AI model implementations:
   AzureOpenAiChatModel, MiniMaxChatModel, MistralAiChatModel,
   MoonshotChatModel, OpenAiChatModel, and ZhiPuAiChatModel

 Resolves #1410
2024-09-25 18:49:36 +02:00
dafriz
1673907db0 Add support for reasoning tokens in OpenAI usage data
This change introduces a new field for tracking reasoning tokens in the
OpenAI API response. It extends the Usage record to include
CompletionTokenDetails, allowing for more granular token usage
reporting. The OpenAiUsage class is updated to expose this new data,
and corresponding unit tests are added to verify the behavior.

This enhancement provides more detailed insights into token usage,
particularly for advanced AI models that separate reasoning from other
generation processes.
2024-09-24 17:18:20 -04:00
Soby Chacko
42dcb45f32 Align AzureOpenAiChatOptions with Azure ChatCompletionsOptions
Add missing options from Azure ChatCompletionsOptions to Spring AI
AzureOpenAiChatOptions. The following fields have been added:

- seed
- logprobs
- topLogprobs
- enhancements

This change ensures better alignment between the two option sets,
improving compatibility and feature parity.

Resolves https://github.com/spring-projects/spring-ai/issues/889
2024-09-24 16:35:37 -04:00
“claudio-code”
b468354dd3 Improve AnthropicChatModel handling of empty generations
- Add handling for cases where ChatCompletion has a stop reason but empty generations.
   Creates a Generation with empty content and metadata when this occurs.
 - Update AnthropicChatModelObservationIT to expect "end_turn" finish reason.
 - Update javadoc.
2024-09-24 10:42:22 +02:00
Christian Tzolov
e63dc6a457 Enhance ChatClientRequestSpec with sealed Prompt input
- When ChatClientRequestSpec#prompt(Prompt) is used, unseal the prompt instance.
   Convert the last message instance (if user message) into spec#user and spec#media
   and add the remaining messages (excluding the last) to the spec#messages.
   Add the prompt#options to the spec#options.
 - Improve DefaultChatClient to handle UserMessage media and content separately.
 - Update AbstractToolCallSupport to use new hasToolCalls() method.
 - Add hasToolCalls() method to AssistantMessage.
 - Enhance ChatClientTest with additional test cases for media handling.
 - Disable Groq and Nvidia integration tests due to rate limiting and credit requirements.
2024-09-24 10:19:08 +02:00
Christian Tzolov
9822eabb7f Fix Ollama ITs 2024-09-23 23:49:07 +02:00
Christian Tzolov
c98caf26d2 Minor test fixtures fixes 2024-09-23 23:03:56 +02:00
Christian Tzolov
501774925c Add proxy tool calls option to chat models
This commit introduces a new proxyToolCalls option for various chat
 models in the Spring AI project. When enabled, it allows the client to
 handle function calls externally instead of being processed internally
 by Spring AI.

 The change affects multiple chat model implementations, including:
  AnthropicChatModel
  AzureOpenAiChatModel
  MiniMaxChatModel
  MistralAiChatModel
  MoonshotChatModel
  OllamaChatModel
  OpenAiChatModel
  VertexAiGeminiChatModel
  ZhiPuAiChatModel

 The proxyToolCalls option is added to the respective chat options
 classes and integrated into the AbstractToolCallSupport class for
 consistent handling across different implementations.

 The proxyToolCalls option can be set either programmatically via
 the <ModelName>ChatOptions.builder().withProxyToolCalls() method
 or the spring.ai.<model-name>.chat.options.proxy-tool-calls
 application property.

 Documentation for the new option is also updated in the relevant
 Antora pages.

 Added ITs for proxy tool calls

 Remove ChatClientPromptRequestSpec and all ChatClient.prompt() overloads can how take advantage of the full fluent API.  Docs updated

 Resolves #1367
2024-09-23 16:22:58 -04:00
PabloSanchi
035036c7f2 Add support for watsonx.ai embedding model
This commit introduces support for the Watsonx.ai embedding model.
It includes:

- Watsonx embedding options class with tests
- Watsonx embedding model implementation
- Auto-configuration and properties for the embedding model
- Tests for the Watsonx embedding model
- Documentation for using the Watsonx embedding model

Also removed use of deprecated APIs in WatsonAIChatModel
2024-09-19 11:45:04 -04:00
Mark Pollack
db9cc62def Change enums of chatgpt o1 modesl to correct values 2024-09-19 10:42:26 -04:00
Johnny Lim
8b019c5fee Polish Javadoc for OpenAiApi.ChatModel 2024-09-17 18:32:05 -04:00
Mark Pollack
8bfb25da86 Fix streaming function call for MiniMax chat model
Sometimes, the MiniMax stream mode function calls might get split,
resulting in an empty tool call ID. This indicates that the previous
call is not finished, which is an unusual API design.

The issue occurs when tool calls return in a format like:
[{"id":"1","function":{"name":"a"}},{"id":"","function":{"arguments":"[1]"}}]

These need to be merged into:
[{"id":"1","name":"a","arguments":"[1]"}]

This commit addresses the merging process to handle split function calls.

authored-by: mxsl-gr <mxsl-gr@users.noreply.github.com>
2024-09-17 14:56:23 -04:00
dafriz
f226b1a570 Fix typos in assert notNull in Bedrock model 2024-09-16 23:55:45 -04:00
PARK-afk
7fda93f7a4 docs: ChatModelDesciption (#1357)
Co-authored-by: 박준서 <junsepar@student.42seoul.kr>
2024-09-16 23:48:13 -04:00
박준서
40eaa9974e OpenAI: Add gpt-o1/o1-mini to chat model enum 2024-09-16 23:45:34 -04:00
Thomas Vitale
4b123a7516 Use Double instead of Float for portable ChatOptions
This change updates the type of portable chat options from Float to
Double. Affected options include:
- frequencyPenalty
- presencePenalty
- temperature
- topP

The motivation for this change is to simplify coding. In Java, Float
values require an "f" suffix (e.g., 0.5f), while Double values don't
need any suffix. This makes Double easier to type and reduces
potential errors from forgetting the "f" suffix.

APIs, tests, and documentation have been updated to reflect this
change.

Fixes gh-712

Signed-off-by: Thomas Vitale <ThomasVitale@users.noreply.github.com>
2024-09-16 15:35:51 -04:00
Christian Tzolov
b22a577ebc Add message history ITs for few chat models 2024-09-10 12:08:57 +02:00
Christian Tzolov
b5c7975fac Add test for #1317
add integration test for https://github.com/spring-projects/spring-ai/pull/1317
2024-09-10 11:23:17 +02:00