When I use the batch processing SDK in the Java SDK, I replace addUserMessage in example/BatchExample with addUserMessageOfBlockParams to support the input of image + text blocks, but this will report an error "com.anthropic.errors.PermissionDeniedException: 403: {error={type=forbidden, message=Request not allowed}}". After my detailed test, if addUserMessageOfBlockParams is followed by an ImageBlock, an error will be reported, but not for TextBlock. This shows that batch processing is not supported as long as there are images in the input. What is the reason and how to solve this problem?
public List<String> generateBatch(List<List<ContentBlockParam>> blocks) throws InterruptedException {
BatchCreateParams.Builder builder = BatchCreateParams.builder();
IntStream.range(0, blocks.size()).forEach(i ->
builder.addRequest(
BatchCreateParams.Request.builder()
.customId(String.valueOf(i))
.params(
BatchCreateParams.Request.Params.builder()
.model(Model.CLAUDE_3_5_SONNET_LATEST)
.addUserMessageOfBlockParams(blocks.get(i))
.maxTokens(512L)
.build()
)
.build()
)
);
BatchCreateParams createParams = builder.build();
MessageBatch batch = client.messages()
.batches()
.create(createParams);
I made a slight modification in BatchExample
BatchCreateParams createParams = BatchCreateParams.builder()
.addRequest(BatchCreateParams.Request.builder()
.customId("best-sdk")
.params(BatchCreateParams.Request.Params.builder()
.model(Model.CLAUDE_3_5_SONNET_LATEST)
.maxTokens(2048)
.addUserMessageOfBlockParams(Collections.singletonList(ContentBlockParam.ofImage(
ImageBlockParam.builder()
.source(Base64ImageSource.builder()
.data(base64)
.mediaType(IMAGE_PNG)
.build())
.build()
)))
.build())
.build())
.addRequest(BatchCreateParams.Request.builder()
.customId("sdk-company")
.params(BatchCreateParams.Request.Params.builder()
.model(Model.CLAUDE_3_5_SONNET_LATEST)
.maxTokens(2048)
.addUserMessage("Which company made of metal generates SDKs?")
.build())
.build())
.build();
The detailed error information is as follows:
com.anthropic.errors.PermissionDeniedException: 403: {error={type=forbidden, message=Request not allowed}}
at com.anthropic.errors.PermissionDeniedException$Builder.build(PermissionDeniedException.kt:74)
at com.anthropic.core.handlers.ErrorHandler$withErrorHandler$1.handle(ErrorHandler.kt:55)
at com.anthropic.services.blocking.messages.BatchServiceImpl$WithRawResponseImpl$create$1.invoke(BatchServiceImpl.kt:97)
at com.anthropic.services.blocking.messages.BatchServiceImpl$WithRawResponseImpl$create$1.invoke(BatchServiceImpl.kt:95)
at com.anthropic.core.http.HttpResponseForKt$parseable$1$parsed$2.invoke(HttpResponseFor.kt:14)
at kotlin.SynchronizedLazyImpl.getValue(LazyJVM.kt:74)
at com.anthropic.core.http.HttpResponseForKt$parseable$1.getParsed(HttpResponseFor.kt:14)
at com.anthropic.core.http.HttpResponseForKt$parseable$1.parse(HttpResponseFor.kt:16)
at com.anthropic.services.blocking.messages.BatchServiceImpl.create(BatchServiceImpl.kt:43)
at com.anthropic.services.blocking.messages.BatchService.create(BatchService.kt:37)
at com.clong.springboot3.example.BatchExample.generateBatch(BatchExample.java:67)
at com.clong.springboot3.Springboot3ApplicationTests.testGenerationBatch(Springboot3ApplicationTests.java:71)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:569)
at org.junit.platform.commons.util.ReflectionUtils.invokeMethod(ReflectionUtils.java:727)
at org.junit.jupiter.engine.execution.MethodInvocation.proceed(MethodInvocation.java:60)
at org.junit.jupiter.engine.execution.InvocationInterceptorChain$ValidatingInvocation.proceed(InvocationInterceptorChain.java:131)
at org.junit.jupiter.engine.extension.TimeoutExtension.intercept(TimeoutExtension.java:156)
at org.junit.jupiter.engine.extension.TimeoutExtension.interceptTestableMethod(TimeoutExtension.java:147)
at org.junit.jupiter.engine.extension.TimeoutExtension.interceptTestMethod(TimeoutExtension.java:86)
at org.junit.jupiter.engine.execution.InterceptingExecutableInvoker$ReflectiveInterceptorCall.lambda$ofVoidMethod$0(InterceptingExecutableInvoker.java:103)
at org.junit.jupiter.engine.execution.InterceptingExecutableInvoker.lambda$invoke$0(InterceptingExecutableInvoker.java:93)
at org.junit.jupiter.engine.execution.InvocationInterceptorChain$InterceptedInvocation.proceed(InvocationInterceptorChain.java:106)
at org.junit.jupiter.engine.execution.InvocationInterceptorChain.proceed(InvocationInterceptorChain.java:64)
at org.junit.jupiter.engine.execution.InvocationInterceptorChain.chainAndInvoke(InvocationInterceptorChain.java:45)
at org.junit.jupiter.engine.execution.InvocationInterceptorChain.invoke(InvocationInterceptorChain.java:37)
at org.junit.jupiter.engine.execution.InterceptingExecutableInvoker.invoke(InterceptingExecutableInvoker.java:92)
at org.junit.jupiter.engine.execution.InterceptingExecutableInvoker.invoke(InterceptingExecutableInvoker.java:86)
at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.lambda$invokeTestMethod$7(TestMethodTestDescriptor.java:217)
at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.invokeTestMethod(TestMethodTestDescriptor.java:213)
at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:138)
at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:68)
at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$6(NodeTestTask.java:151)
at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:141)
at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137)
at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$9(NodeTestTask.java:139)
at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:138)
at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:95)
at java.base/java.util.ArrayList.forEach(ArrayList.java:1511)
at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:41)
at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$6(NodeTestTask.java:155)
at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:141)
at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137)
at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$9(NodeTestTask.java:139)
at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:138)
at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:95)
at java.base/java.util.ArrayList.forEach(ArrayList.java:1511)
at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:41)
at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$6(NodeTestTask.java:155)
at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:141)
at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137)
at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$9(NodeTestTask.java:139)
at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:138)
at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:95)
at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.submit(SameThreadHierarchicalTestExecutorService.java:35)
at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor.execute(HierarchicalTestExecutor.java:57)
at org.junit.platform.engine.support.hierarchical.HierarchicalTestEngine.execute(HierarchicalTestEngine.java:54)
at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:147)
at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:127)
at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:90)
at org.junit.platform.launcher.core.EngineExecutionOrchestrator.lambda$execute$0(EngineExecutionOrchestrator.java:55)
at org.junit.platform.launcher.core.EngineExecutionOrchestrator.withInterceptedStreams(EngineExecutionOrchestrator.java:102)
at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:54)
at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:114)
at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:86)
at org.junit.platform.launcher.core.DefaultLauncherSession$DelegatingLauncher.execute(DefaultLauncherSession.java:86)
at org.junit.platform.launcher.core.SessionPerRequestLauncher.execute(SessionPerRequestLauncher.java:53)
at com.intellij.junit5.JUnit5IdeaTestRunner.startRunnerWithArgs(JUnit5IdeaTestRunner.java:57)
at com.intellij.rt.junit.IdeaTestRunner$Repeater$1.execute(IdeaTestRunner.java:38)
at com.intellij.rt.execution.junit.TestsRepeater.repeat(TestsRepeater.java:11)
at com.intellij.rt.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:35)
at com.intellij.rt.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:232)
at com.intellij.rt.junit.JUnitStarter.main(JUnitStarter.java:55)
When I use the batch processing SDK in the Java SDK, I replace
addUserMessagein example/BatchExample withaddUserMessageOfBlockParamsto support the input of image + text blocks, but this will report an error "com.anthropic.errors.PermissionDeniedException: 403: {error={type=forbidden, message=Request not allowed}}". After my detailed test, ifaddUserMessageOfBlockParamsis followed by anImageBlock, an error will be reported, but not forTextBlock. This shows that batch processing is not supported as long as there are images in the input. What is the reason and how to solve this problem?I made a slight modification in BatchExample
The detailed error information is as follows: