Expected Behavior
I wish SpringAiRetryAutoConfiguration
could be disabled like AnthropicAutoConfiguration
, ChatClientAutoConfiguration
and so on.
Current Behavior
The SpringAiRetryAutoConfiguration
cannot be disabled and the spring.ai.retry.max-attempts
property cannot be set 0.
Context
I'm using OpenAiChatModel
and ChatClient
, and I don't want to retry.
Comment From: codespearhead
Show us the stack trace you get when setting property spring.ai.retry.max-attempts=0
.
Also, make sure you're using the latest Spring AI version (1.0.0-M1
).
Comment From: Cho-D-YoungRae
I wanted to disable retries because my application was retrying at 400 and 429 errors.
However, my problem seems to be related to this issue(#846) rather than the retry disabling feature.
I apologize for the confusion and will close this issue.
Below, I'll leave a log of the issues we encountered.
2024-07-16T14:54:29.306+09:00 WARN 69522 --- [tech-swipe-batch] [tSummarizeJob-3] o.s.a.a.r.SpringAiRetryAutoConfiguration : Retry error. Retry count:4
org.springframework.ai.retry.NonTransientAiException: 400 - {
"error": {
"message": "This model's maximum context length is 16385 tokens. However, your messages resulted in 18988 tokens. Please reduce the length of the messages.",
"type": "invalid_request_error",
"param": "messages",
"code": "context_length_exceeded"
}
}
at org.springframework.ai.autoconfigure.retry.SpringAiRetryAutoConfiguration$2.handleError(SpringAiRetryAutoConfiguration.java:95) ~[spring-ai-spring-boot-autoconfigure-1.0.0-M1.jar:1.0.0-M1]
at org.springframework.web.client.ResponseErrorHandler.handleError(ResponseErrorHandler.java:63) ~[spring-web-6.1.4.jar:6.1.4]
at org.springframework.web.client.StatusHandler.lambda$fromErrorHandler$1(StatusHandler.java:71) ~[spring-web-6.1.4.jar:6.1.4]
at org.springframework.web.client.StatusHandler.handle(StatusHandler.java:146) ~[spring-web-6.1.4.jar:6.1.4]
at org.springframework.web.client.DefaultRestClient$DefaultResponseSpec.applyStatusHandlers(DefaultRestClient.java:680) ~[spring-web-6.1.4.jar:6.1.4]
at org.springframework.web.client.DefaultRestClient.readWithMessageConverters(DefaultRestClient.java:200) ~[spring-web-6.1.4.jar:6.1.4]
at org.springframework.web.client.DefaultRestClient$DefaultResponseSpec.readBody(DefaultRestClient.java:667) ~[spring-web-6.1.4.jar:6.1.4]
at org.springframework.web.client.DefaultRestClient$DefaultResponseSpec.toEntityInternal(DefaultRestClient.java:637) ~[spring-web-6.1.4.jar:6.1.4]
at org.springframework.web.client.DefaultRestClient$DefaultResponseSpec.toEntity(DefaultRestClient.java:626) ~[spring-web-6.1.4.jar:6.1.4]
at org.springframework.ai.openai.api.OpenAiApi.chatCompletionEntity(OpenAiApi.java:778) ~[spring-ai-openai-1.0.0-M1.jar:1.0.0-M1]
at org.springframework.ai.openai.OpenAiChatModel.doChatCompletion(OpenAiChatModel.java:376) ~[spring-ai-openai-1.0.0-M1.jar:1.0.0-M1]
at org.springframework.ai.openai.OpenAiChatModel.doChatCompletion(OpenAiChatModel.java:76) ~[spring-ai-openai-1.0.0-M1.jar:1.0.0-M1]
at org.springframework.ai.model.function.AbstractFunctionCallSupport.callWithFunctionSupport(AbstractFunctionCallSupport.java:127) ~[spring-ai-core-1.0.0-M1.jar:1.0.0-M1]
at org.springframework.ai.openai.OpenAiChatModel.lambda$call$1(OpenAiChatModel.java:144) ~[spring-ai-openai-1.0.0-M1.jar:1.0.0-M1]
at org.springframework.retry.support.RetryTemplate.doExecute(RetryTemplate.java:335) ~[spring-retry-2.0.5.jar:na]
at org.springframework.retry.support.RetryTemplate.execute(RetryTemplate.java:211) ~[spring-retry-2.0.5.jar:na]
at org.springframework.ai.openai.OpenAiChatModel.call(OpenAiChatModel.java:142) ~[spring-ai-openai-1.0.0-M1.jar:1.0.0-M1]
at org.springframework.ai.chat.client.ChatClient$ChatClientRequest$CallResponseSpec.doGetChatResponse(ChatClient.java:616) ~[spring-ai-core-1.0.0-M1.jar:1.0.0-M1]
at org.springframework.ai.chat.client.ChatClient$ChatClientRequest$CallResponseSpec.doGetChatResponse(ChatClient.java:569) ~[spring-ai-core-1.0.0-M1.jar:1.0.0-M1]
at org.springframework.ai.chat.client.ChatClient$ChatClientRequest$CallResponseSpec.content(ChatClient.java:635) ~[spring-ai-core-1.0.0-M1.jar:1.0.0-M1]
at com.nocommittoday.techswipe.collection.infrastructure.SummarizationClientOpenAi.summarize(SummarizationClientOpenAi.java:59) ~[main/:na]
at com.nocommittoday.techswipe.collection.infrastructure.SummarizationProcessor.summarize(SummarizationProcessor.java:24) ~[main/:na]
at com.nocommittoday.techswipe.batch.processor.CollectedContentSummarizeProcessor.process(CollectedContentSummarizeProcessor.java:20) ~[main/:na]
at jdk.internal.reflect.GeneratedMethodAccessor90.invoke(Unknown Source) ~[na:na]
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na]
at java.base/java.lang.reflect.Method.invoke(Method.java:568) ~[na:na]
at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:351) ~[spring-aop-6.1.4.jar:6.1.4]
at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:196) ~[spring-aop-6.1.4.jar:6.1.4]
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) ~[spring-aop-6.1.4.jar:6.1.4]
at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:765) ~[spring-aop-6.1.4.jar:6.1.4]
at org.springframework.aop.support.DelegatingIntroductionInterceptor.doProceed(DelegatingIntroductionInterceptor.java:137) ~[spring-aop-6.1.4.jar:6.1.4]
at org.springframework.aop.support.DelegatingIntroductionInterceptor.invoke(DelegatingIntroductionInterceptor.java:124) ~[spring-aop-6.1.4.jar:6.1.4]
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184) ~[spring-aop-6.1.4.jar:6.1.4]
at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:765) ~[spring-aop-6.1.4.jar:6.1.4]
at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:717) ~[spring-aop-6.1.4.jar:6.1.4]
at com.nocommittoday.techswipe.batch.processor.CollectedContentSummarizeProcessor$$SpringCGLIB$$0.process(<generated>) ~[main/:na]
at org.springframework.batch.integration.async.AsyncItemProcessor.lambda$process$0(AsyncItemProcessor.java:98) ~[spring-batch-integration-5.1.1.jar:5.1.1]
at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264) ~[na:na]
at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136) ~[na:na]
at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635) ~[na:na]
at java.base/java.lang.Thread.run(Thread.java:840) ~[na:na]
Comment From: Cho-D-YoungRae
Show us the stack trace you get when setting property
spring.ai.retry.max-attempts=0
.Also, make sure you're using the latest Spring AI version (
1.0.0-M1
).
@codespearhead Thank you for your interest. However, I have fixed this issue, see #1075 for that.
I'll show you the logs, though, in case you're curious.
This is that log. And I'm using Spring AI version 1.0.0-M1.
This exception seems to be related to RetryTemplateBuilder, not Spring AI.
....
2024-07-19T00:49:52.128+09:00 INFO 33876 --- [tech-swipe-batch] [ main] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Shutdown initiated...
2024-07-19T00:49:52.135+09:00 INFO 33876 --- [tech-swipe-batch] [ main] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Shutdown completed.
2024-07-19T00:49:52.136+09:00 INFO 33876 --- [tech-swipe-batch] [ main] o.apache.catalina.core.StandardService : Stopping service [Tomcat]
2024-07-19T00:49:52.144+09:00 INFO 33876 --- [tech-swipe-batch] [ main] .s.b.a.l.ConditionEvaluationReportLogger :
Error starting ApplicationContext. To display the condition evaluation report re-run your application with 'debug' enabled.
2024-07-19T00:49:52.156+09:00 ERROR 33876 --- [tech-swipe-batch] [ main] o.s.boot.SpringApplication : Application run failed
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'retryTemplate' defined in class path resource [org/springframework/ai/autoconfigure/retry/SpringAiRetryAutoConfiguration.class]: Failed to instantiate [org.springframework.retry.support.RetryTemplate]: Factory method 'retryTemplate' threw exception with message: Number of attempts should be positive
at org.springframework.beans.factory.support.ConstructorResolver.instantiate(ConstructorResolver.java:651) ~[spring-beans-6.1.4.jar:6.1.4]
at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:639) ~[spring-beans-6.1.4.jar:6.1.4]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod(AbstractAutowireCapableBeanFactory.java:1335) ~[spring-beans-6.1.4.jar:6.1.4]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1165) ~[spring-beans-6.1.4.jar:6.1.4]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:562) ~[spring-beans-6.1.4.jar:6.1.4]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:522) ~[spring-beans-6.1.4.jar:6.1.4]
at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:325) ~[spring-beans-6.1.4.jar:6.1.4]
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234) ~[spring-beans-6.1.4.jar:6.1.4]
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:323) ~[spring-beans-6.1.4.jar:6.1.4]
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:199) ~[spring-beans-6.1.4.jar:6.1.4]
at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:975) ~[spring-beans-6.1.4.jar:6.1.4]
at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:959) ~[spring-context-6.1.4.jar:6.1.4]
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:624) ~[spring-context-6.1.4.jar:6.1.4]
at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:146) ~[spring-boot-3.2.3.jar:3.2.3]
at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:754) ~[spring-boot-3.2.3.jar:3.2.3]
at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:456) ~[spring-boot-3.2.3.jar:3.2.3]
at org.springframework.boot.SpringApplication.run(SpringApplication.java:334) ~[spring-boot-3.2.3.jar:3.2.3]
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1354) ~[spring-boot-3.2.3.jar:3.2.3]
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1343) ~[spring-boot-3.2.3.jar:3.2.3]
at com.nocommittoday.techswipe.TechSwipeBatchApplication.main(TechSwipeBatchApplication.java:10) ~[main/:na]
Caused by: org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.springframework.retry.support.RetryTemplate]: Factory method 'retryTemplate' threw exception with message: Number of attempts should be positive
at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:177) ~[spring-beans-6.1.4.jar:6.1.4]
at org.springframework.beans.factory.support.ConstructorResolver.instantiate(ConstructorResolver.java:647) ~[spring-beans-6.1.4.jar:6.1.4]
... 19 common frames omitted
Caused by: java.lang.IllegalArgumentException: Number of attempts should be positive
at org.springframework.util.Assert.isTrue(Assert.java:111) ~[spring-core-6.1.4.jar:6.1.4]
at org.springframework.retry.support.RetryTemplateBuilder.maxAttempts(RetryTemplateBuilder.java:102) ~[spring-retry-2.0.5.jar:na]
at org.springframework.ai.autoconfigure.retry.SpringAiRetryAutoConfiguration.retryTemplate(SpringAiRetryAutoConfiguration.java:55) ~[spring-ai-spring-boot-autoconfigure-1.0.0-M1.jar:1.0.0-M1]
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na]
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) ~[na:na]
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na]
at java.base/java.lang.reflect.Method.invoke(Method.java:568) ~[na:na]
at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:140) ~[spring-beans-6.1.4.jar:6.1.4]
... 20 common frames omitted
Process finished with exit code 1