diff --git a/sdk/openai/azure-ai-openai-assistants/CHANGELOG.md b/sdk/openai/azure-ai-openai-assistants/CHANGELOG.md index 95dc3d85282d..bba36295668e 100644 --- a/sdk/openai/azure-ai-openai-assistants/CHANGELOG.md +++ b/sdk/openai/azure-ai-openai-assistants/CHANGELOG.md @@ -4,8 +4,28 @@ ### Features Added +- `file_search` tool definitions now have the ability to configure `max_num_results` via the matching, named inner options object + Previously, only a stubbed `{ "type": "file_search" }` was valid. Now, e.g.: `{ "type": "file_search", "file_search": { "max_num_results": 20 } }` + - Added a new property `FileSearchToolDefinitionDetails fileSearch` to `FileSearchToolDefinition` model. + - Added new class `FileSearchToolDefinitionDetails` to represent the details of a file search tool. + +- `chunking_strategy` is added as a new optional property when creating a vector store (either via the vector store creation operation + or the helper when creating an assistant) -- this allows customization of the chunk size and overlap used when ingesting data. + See the OpenAI reference for full details. + - Added a new property `VectorStoreChunkingStrategyRequest chunkingStrategy` to `VectorStoreOptions` model. + - Added a new property `VectorStoreChunkingStrategyResponse chunkingStrategy` to `VectorStoreFile` model. + - Added new enum `VectorStoreChunkingStrategyRequestType` and `VectorStoreChunkingStrategyResponseType` to represent the chunking strategy `type` for vector stores. + - Added new class `VectorStoreChunkingStrategyRequest` and `VectorStoreChunkingStrategyResponse` to represent the chunking strategy for vector stores. + - Added new class `VectorStoreAutoChunkingStrategyRequest` and `VectorStoreAutoChunkingStrategyResponse` to represent the `auto` chunking strategy for vector stores. + - Added new class `VectorStoreStaticChunkingStrategyOptions`, `VectorStoreStaticChunkingStrategyRequest` and `VectorStoreStaticChunkingStrategyResponse` + to represent the `static` chunking strategy for vector stores. + ### Breaking Changes +- Replaced constructor `CreateFileSearchToolResourceVectorStoreOptions(List fileIds)` by + `CreateFileSearchToolResourceVectorStoreOptions(List fileIds, VectorStoreChunkingStrategyRequest chunkingStrategy)` + in `CreateFileSearchToolResourceVectorStoreOptions` model, to take one more parameter `chunkingStrategy`. + ### Bugs Fixed ### Other Changes diff --git a/sdk/openai/azure-ai-openai-assistants/README.md b/sdk/openai/azure-ai-openai-assistants/README.md index 2167db2e0ed0..69d9037b2e46 100644 --- a/sdk/openai/azure-ai-openai-assistants/README.md +++ b/sdk/openai/azure-ai-openai-assistants/README.md @@ -168,7 +168,10 @@ CreateToolResourcesOptions createToolResourcesOptions = new CreateToolResourcesO createToolResourcesOptions.setFileSearch( new CreateFileSearchToolResourceOptions( new CreateFileSearchToolResourceVectorStoreOptionsList( - Arrays.asList(new CreateFileSearchToolResourceVectorStoreOptions(Arrays.asList(openAIFile.getId())))))); + Arrays.asList(new CreateFileSearchToolResourceVectorStoreOptions( + Arrays.asList(openAIFile.getId()), + null + ))))); Assistant assistant = client.createAssistant( new AssistantCreationOptions(deploymentOrModelId) diff --git a/sdk/openai/azure-ai-openai-assistants/assets.json b/sdk/openai/azure-ai-openai-assistants/assets.json index bb5b7fab51bf..92cc4e95731d 100644 --- a/sdk/openai/azure-ai-openai-assistants/assets.json +++ b/sdk/openai/azure-ai-openai-assistants/assets.json @@ -2,5 +2,5 @@ "AssetsRepo" : "Azure/azure-sdk-assets", "AssetsRepoPrefixPath" : "java", "TagPrefix" : "java/assistants/azure-ai-openai-assistants", - "Tag" : "java/assistants/azure-ai-openai-assistants_868e5c86d0" -} \ No newline at end of file + "Tag" : "java/assistants/azure-ai-openai-assistants_ba2f3816c8" +} diff --git a/sdk/openai/azure-ai-openai-assistants/src/samples/java/com/azure/ai/openai/assistants/FileSearchToolSample.java b/sdk/openai/azure-ai-openai-assistants/src/samples/java/com/azure/ai/openai/assistants/FileSearchToolSample.java index fa327e745afb..12545a9a3e1e 100644 --- a/sdk/openai/azure-ai-openai-assistants/src/samples/java/com/azure/ai/openai/assistants/FileSearchToolSample.java +++ b/sdk/openai/azure-ai-openai-assistants/src/samples/java/com/azure/ai/openai/assistants/FileSearchToolSample.java @@ -63,7 +63,10 @@ public static void main(String[] args) throws InterruptedException { createToolResourcesOptions.setFileSearch( new CreateFileSearchToolResourceOptions( new CreateFileSearchToolResourceVectorStoreOptionsList( - Arrays.asList(new CreateFileSearchToolResourceVectorStoreOptions(Arrays.asList(openAIFile.getId())))))); + Arrays.asList(new CreateFileSearchToolResourceVectorStoreOptions( + Arrays.asList(openAIFile.getId()), + null + ))))); // Create assistant passing the file ID Assistant assistant = client.createAssistant( diff --git a/sdk/openai/azure-ai-openai-assistants/src/samples/java/com/azure/ai/openai/assistants/ReadmeSamples.java b/sdk/openai/azure-ai-openai-assistants/src/samples/java/com/azure/ai/openai/assistants/ReadmeSamples.java index 9140b9d01ee1..d00584b7bf95 100644 --- a/sdk/openai/azure-ai-openai-assistants/src/samples/java/com/azure/ai/openai/assistants/ReadmeSamples.java +++ b/sdk/openai/azure-ai-openai-assistants/src/samples/java/com/azure/ai/openai/assistants/ReadmeSamples.java @@ -183,7 +183,10 @@ public void simpleRetrievalOperation() throws InterruptedException { createToolResourcesOptions.setFileSearch( new CreateFileSearchToolResourceOptions( new CreateFileSearchToolResourceVectorStoreOptionsList( - Arrays.asList(new CreateFileSearchToolResourceVectorStoreOptions(Arrays.asList(openAIFile.getId())))))); + Arrays.asList(new CreateFileSearchToolResourceVectorStoreOptions( + Arrays.asList(openAIFile.getId()), + null + ))))); Assistant assistant = client.createAssistant( new AssistantCreationOptions(deploymentOrModelId) diff --git a/sdk/openai/azure-ai-openai-assistants/src/test/java/com/azure/ai/openai/assistants/AssistantsClientTestBase.java b/sdk/openai/azure-ai-openai-assistants/src/test/java/com/azure/ai/openai/assistants/AssistantsClientTestBase.java index 65b6f371b404..99600264e206 100644 --- a/sdk/openai/azure-ai-openai-assistants/src/test/java/com/azure/ai/openai/assistants/AssistantsClientTestBase.java +++ b/sdk/openai/azure-ai-openai-assistants/src/test/java/com/azure/ai/openai/assistants/AssistantsClientTestBase.java @@ -17,7 +17,6 @@ import com.azure.ai.openai.assistants.models.FileDeletionStatus; import com.azure.ai.openai.assistants.models.FileDetails; import com.azure.ai.openai.assistants.models.FilePurpose; -import com.azure.ai.openai.assistants.models.FileSearchToolDefinition; import com.azure.ai.openai.assistants.models.FunctionDefinition; import com.azure.ai.openai.assistants.models.FunctionToolDefinition; import com.azure.ai.openai.assistants.models.MessageRole; @@ -214,18 +213,6 @@ void createRunRunner(Consumer testRunner, String assistantId) testRunner.accept(new CreateRunOptions(assistantId)); } - void createRetrievalRunner(BiConsumer testRunner) { - FileDetails fileDetails = new FileDetails( - BinaryData.fromFile(openResourceFile("java_sdk_tests_assistants.txt")), "java_sdk_tests_assistants.txt"); - - AssistantCreationOptions assistantOptions = new AssistantCreationOptions(GPT_4_1106_PREVIEW) - .setName("Java SDK Retrieval Sample") - .setInstructions("You are a helpful assistant that can help fetch data from files you know about.") - .setTools(Arrays.asList(new FileSearchToolDefinition())); - - testRunner.accept(fileDetails, assistantOptions); - } - void createFunctionToolCallRunner(BiConsumer testRunner) { FunctionsToolCallHelper functionsToolCallHelper = new FunctionsToolCallHelper(); List toolDefinition = Arrays.asList( diff --git a/sdk/openai/azure-ai-openai-assistants/src/test/java/com/azure/ai/openai/assistants/AzureFileSearchAsyncTest.java b/sdk/openai/azure-ai-openai-assistants/src/test/java/com/azure/ai/openai/assistants/AzureFileSearchAsyncTest.java index dc5ca7c7223c..01f4f86e4384 100644 --- a/sdk/openai/azure-ai-openai-assistants/src/test/java/com/azure/ai/openai/assistants/AzureFileSearchAsyncTest.java +++ b/sdk/openai/azure-ai-openai-assistants/src/test/java/com/azure/ai/openai/assistants/AzureFileSearchAsyncTest.java @@ -19,6 +19,7 @@ import com.azure.ai.openai.assistants.models.ThreadMessageOptions; import com.azure.ai.openai.assistants.models.ThreadRun; import com.azure.ai.openai.assistants.implementation.AsyncUtils; +import com.azure.core.exception.HttpResponseException; import com.azure.core.http.HttpClient; import org.junit.jupiter.api.Disabled; import org.junit.jupiter.params.ParameterizedTest; @@ -32,10 +33,11 @@ import static com.azure.ai.openai.assistants.TestUtils.DISPLAY_NAME_WITH_ARGUMENTS; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertInstanceOf; import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.junit.jupiter.api.Assertions.assertTrue; -public class AzureFileSearchAsyncTest extends AssistantsClientTestBase { +public class AzureFileSearchAsyncTest extends FileSearchTestBase { AssistantsAsyncClient client; @@ -55,7 +57,10 @@ public void basicFileSearch(HttpClient httpClient, AssistantsServiceVersion serv createToolResourcesOptions.setFileSearch( new CreateFileSearchToolResourceOptions( new CreateFileSearchToolResourceVectorStoreOptionsList( - Arrays.asList(new CreateFileSearchToolResourceVectorStoreOptions(Arrays.asList(openAIFile.getId())))))); + Arrays.asList(new CreateFileSearchToolResourceVectorStoreOptions( + Arrays.asList(openAIFile.getId()), + null + ))))); assistantCreationOptions.setToolResources(createToolResourcesOptions); cleanUp.setFile(openAIFile); return client.createAssistant(assistantCreationOptions).zipWith(Mono.just(cleanUp)); @@ -122,4 +127,37 @@ public void basicFileSearch(HttpClient httpClient, AssistantsServiceVersion serv .verifyComplete(); }); } + + @Disabled("file_search tools are not supported in Azure") + @ParameterizedTest(name = DISPLAY_NAME_WITH_ARGUMENTS) + @MethodSource("com.azure.ai.openai.assistants.TestUtils#getTestParameters") + public void fileSearchWithMaxNumberResult(HttpClient httpClient, AssistantsServiceVersion serviceVersion) { + client = getAssistantsAsyncClient(httpClient, serviceVersion); + + fileSearchWithMaxNumberResultRunner((fileDetails, assistantCreationOptions) -> { + // Upload file + StepVerifier.create(client.uploadFile(fileDetails, FilePurpose.ASSISTANTS) + .flatMap(openAIFile -> { + // Create assistant + AsyncUtils cleanUp = new AsyncUtils(); + CreateToolResourcesOptions createToolResourcesOptions = new CreateToolResourcesOptions(); + createToolResourcesOptions.setFileSearch( + new CreateFileSearchToolResourceOptions( + new CreateFileSearchToolResourceVectorStoreOptionsList( + Arrays.asList(new CreateFileSearchToolResourceVectorStoreOptions( + Arrays.asList(openAIFile.getId()), + null + )) + ) + ) + ); + assistantCreationOptions.setToolResources(createToolResourcesOptions); + + cleanUp.setFile(openAIFile); + return client.createAssistant(assistantCreationOptions) + .zipWith(Mono.just(cleanUp)); + }) + ).verifyErrorSatisfies(error -> assertInstanceOf(HttpResponseException.class, error)); + }); + } } diff --git a/sdk/openai/azure-ai-openai-assistants/src/test/java/com/azure/ai/openai/assistants/AzureFileSearchSyncTest.java b/sdk/openai/azure-ai-openai-assistants/src/test/java/com/azure/ai/openai/assistants/AzureFileSearchSyncTest.java index 3b3d10e4a0ee..45b4d92b4309 100644 --- a/sdk/openai/azure-ai-openai-assistants/src/test/java/com/azure/ai/openai/assistants/AzureFileSearchSyncTest.java +++ b/sdk/openai/azure-ai-openai-assistants/src/test/java/com/azure/ai/openai/assistants/AzureFileSearchSyncTest.java @@ -19,6 +19,7 @@ import com.azure.ai.openai.assistants.models.ThreadMessage; import com.azure.ai.openai.assistants.models.ThreadMessageOptions; import com.azure.ai.openai.assistants.models.ThreadRun; +import com.azure.core.exception.HttpResponseException; import com.azure.core.http.HttpClient; import org.junit.jupiter.api.Disabled; import org.junit.jupiter.params.ParameterizedTest; @@ -30,16 +31,17 @@ import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertThrows; import static org.junit.jupiter.api.Assertions.assertTrue; -public class AzureFileSearchSyncTest extends AssistantsClientTestBase { +public class AzureFileSearchSyncTest extends FileSearchTestBase { AssistantsClient client; @Disabled("Retrieval tools are not supported in Azure") @ParameterizedTest(name = DISPLAY_NAME_WITH_ARGUMENTS) @MethodSource("com.azure.ai.openai.assistants.TestUtils#getTestParameters") - public void basicRetrieval(HttpClient httpClient, AssistantsServiceVersion serviceVersion) { + public void basicFileSearch(HttpClient httpClient, AssistantsServiceVersion serviceVersion) { client = getAssistantsClient(httpClient, serviceVersion); createRetrievalRunner((fileDetails, assistantCreationOptions) -> { @@ -51,7 +53,10 @@ public void basicRetrieval(HttpClient httpClient, AssistantsServiceVersion servi createToolResourcesOptions.setFileSearch( new CreateFileSearchToolResourceOptions( new CreateFileSearchToolResourceVectorStoreOptionsList( - Arrays.asList(new CreateFileSearchToolResourceVectorStoreOptions(Arrays.asList(openAIFile.getId())))))); + Arrays.asList(new CreateFileSearchToolResourceVectorStoreOptions( + Arrays.asList(openAIFile.getId()), + null + ))))); assistantCreationOptions.setToolResources(createToolResourcesOptions); Assistant assistant = client.createAssistant(assistantCreationOptions); @@ -97,5 +102,38 @@ public void basicRetrieval(HttpClient httpClient, AssistantsServiceVersion servi }); } + @Disabled("file_search tools are not supported in Azure") + @ParameterizedTest(name = DISPLAY_NAME_WITH_ARGUMENTS) + @MethodSource("com.azure.ai.openai.assistants.TestUtils#getTestParameters") + public void fileSearchWithMaxNumberResult(HttpClient httpClient, AssistantsServiceVersion serviceVersion) { + client = getAssistantsClient(httpClient, serviceVersion); + + fileSearchWithMaxNumberResultRunner((fileDetails, assistantCreationOptions) -> { + // Upload file for assistant + OpenAIFile openAIFile = client.uploadFile(fileDetails, FilePurpose.ASSISTANTS); + + // Create assistant + CreateToolResourcesOptions createToolResourcesOptions = new CreateToolResourcesOptions(); + createToolResourcesOptions.setFileSearch( + new CreateFileSearchToolResourceOptions( + new CreateFileSearchToolResourceVectorStoreOptionsList( + Arrays.asList( + new CreateFileSearchToolResourceVectorStoreOptions( + Arrays.asList(openAIFile.getId()), + null) + ) + ) + ) + ); + assistantCreationOptions.setToolResources(createToolResourcesOptions); + + assertThrows(HttpResponseException.class, () -> { + Assistant assistant = client.createAssistant(assistantCreationOptions); + client.deleteAssistant(assistant.getId()); + }); + // cleanup + client.deleteFile(openAIFile.getId()); + }); + } } diff --git a/sdk/openai/azure-ai-openai-assistants/src/test/java/com/azure/ai/openai/assistants/AzureStreamingSyncTest.java b/sdk/openai/azure-ai-openai-assistants/src/test/java/com/azure/ai/openai/assistants/AzureStreamingSyncTest.java index e6d6e2b2d0a1..40d9cc30cb3e 100644 --- a/sdk/openai/azure-ai-openai-assistants/src/test/java/com/azure/ai/openai/assistants/AzureStreamingSyncTest.java +++ b/sdk/openai/azure-ai-openai-assistants/src/test/java/com/azure/ai/openai/assistants/AzureStreamingSyncTest.java @@ -43,6 +43,7 @@ public void runThreadSimpleTest(HttpClient httpClient, AssistantsServiceVersion streamEvents.forEach(AssistantsClientTestBase::assertStreamUpdate); }, mathTutorAssistantId); } + @ParameterizedTest(name = DISPLAY_NAME_WITH_ARGUMENTS) @MethodSource("com.azure.ai.openai.assistants.TestUtils#getTestParameters") public void runThreadWithTools(HttpClient httpClient, AssistantsServiceVersion serviceVersion) { diff --git a/sdk/openai/azure-ai-openai-assistants/src/test/java/com/azure/ai/openai/assistants/AzureVectorStoreAsyncTests.java b/sdk/openai/azure-ai-openai-assistants/src/test/java/com/azure/ai/openai/assistants/AzureVectorStoreAsyncTests.java index c886ea4cc1a6..b7b24e52443c 100644 --- a/sdk/openai/azure-ai-openai-assistants/src/test/java/com/azure/ai/openai/assistants/AzureVectorStoreAsyncTests.java +++ b/sdk/openai/azure-ai-openai-assistants/src/test/java/com/azure/ai/openai/assistants/AzureVectorStoreAsyncTests.java @@ -4,10 +4,15 @@ package com.azure.ai.openai.assistants; import com.azure.ai.openai.assistants.models.VectorStore; +import com.azure.ai.openai.assistants.models.VectorStoreAutoChunkingStrategyRequest; +import com.azure.ai.openai.assistants.models.VectorStoreExpirationPolicy; import com.azure.ai.openai.assistants.models.VectorStoreFile; import com.azure.ai.openai.assistants.models.VectorStoreFileBatch; import com.azure.ai.openai.assistants.models.VectorStoreFileBatchStatus; import com.azure.ai.openai.assistants.models.VectorStoreOptions; +import com.azure.ai.openai.assistants.models.VectorStoreStaticChunkingStrategyOptions; +import com.azure.ai.openai.assistants.models.VectorStoreStaticChunkingStrategyRequest; +import com.azure.core.exception.HttpResponseException; import com.azure.core.http.HttpClient; import com.azure.core.util.logging.ClientLogger; import org.junit.jupiter.api.Disabled; @@ -21,31 +26,37 @@ import static com.azure.ai.openai.assistants.TestUtils.DISPLAY_NAME_WITH_ARGUMENTS; import static com.azure.ai.openai.assistants.models.FilePurpose.ASSISTANTS; +import static com.azure.ai.openai.assistants.models.VectorStoreExpirationPolicyAnchor.LAST_ACTIVE_AT; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertInstanceOf; import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.junit.jupiter.api.Assertions.assertTrue; -public class AzureVectorStoreAsyncTests extends AssistantsClientTestBase { +public class AzureVectorStoreAsyncTests extends VectorStoreTestBase { private static final ClientLogger LOGGER = new ClientLogger(AzureVectorStoreAsyncTests.class); private AssistantsAsyncClient client; private VectorStore vectorStore; private List fileIds = new ArrayList<>(); + protected void beforeTest(HttpClient httpClient, AssistantsServiceVersion serviceVersion) { client = getAssistantsAsyncClient(httpClient, serviceVersion); - fileIds.add(uploadFileAsync(client, "20210203_alphabet_10K.pdf", ASSISTANTS)); + addFile(ALPHABET_FINANCIAL_STATEMENT); VectorStoreOptions vectorStoreOptions = new VectorStoreOptions() - .setName("Financial Statements") - .setFileIds(fileIds); - + .setName("Financial Statements") + .setExpiresAfter(new VectorStoreExpirationPolicy(LAST_ACTIVE_AT, 1)); StepVerifier.create(client.createVectorStore(vectorStoreOptions)) - .assertNext(vectorStore -> { - this.vectorStore = vectorStore; - assertNotNull(vectorStore); - assertNotNull(vectorStore.getId()); - }) - .verifyComplete(); + .assertNext(vectorStore -> { + this.vectorStore = vectorStore; + assertNotNull(vectorStore); + assertNotNull(vectorStore.getId()); + }) + .verifyComplete(); + } + + private void addFile(String fileId) { + fileIds.add(uploadFileAsync(client, fileId, ASSISTANTS)); } @Override @@ -110,13 +121,49 @@ public void listVectorStore(HttpClient httpClient, AssistantsServiceVersion serv @MethodSource("com.azure.ai.openai.assistants.TestUtils#getTestParameters") public void createVectorStoreFile(HttpClient httpClient, AssistantsServiceVersion serviceVersion) { beforeTest(httpClient, serviceVersion); - String storeId = vectorStore.getId(); - StepVerifier.create(client.createVectorStoreFile(storeId, fileIds.get(0))) - .assertNext(vectorStoreFile -> { - assertNotNull(vectorStoreFile); - assertNotNull(vectorStoreFile.getId()); - }) - .verifyComplete(); + StepVerifier.create(client.createVectorStoreFile(vectorStore.getId(), fileIds.get(0))) + .assertNext(this::assertVectorStoreFile) + .verifyComplete(); + } + + @ParameterizedTest(name = DISPLAY_NAME_WITH_ARGUMENTS) + @MethodSource("com.azure.ai.openai.assistants.TestUtils#getTestParameters") + public void createVectorStoreFileWithAutoChunkingStrategy(HttpClient httpClient, AssistantsServiceVersion serviceVersion) { + beforeTest(httpClient, serviceVersion); + StepVerifier.create(client.createVectorStoreFile(vectorStore.getId(), fileIds.get(0), + new VectorStoreAutoChunkingStrategyRequest())) + .assertNext(this::assertVectorStoreFile) + .verifyComplete(); + } + + @ParameterizedTest(name = DISPLAY_NAME_WITH_ARGUMENTS) + @MethodSource("com.azure.ai.openai.assistants.TestUtils#getTestParameters") + public void createVectorStoreFileWithStaticChunkingStrategy(HttpClient httpClient, AssistantsServiceVersion serviceVersion) { + beforeTest(httpClient, serviceVersion); + int maxChunkSizeTokens = 101; + int chunkOverlapTokens = 50; + StepVerifier.create(client.createVectorStoreFile(vectorStore.getId(), fileIds.get(0), + new VectorStoreStaticChunkingStrategyRequest( + new VectorStoreStaticChunkingStrategyOptions(maxChunkSizeTokens, chunkOverlapTokens)))) + .assertNext(vectorStoreFile -> { + assertVectorStoreFile(vectorStoreFile); + assertStaticChunkingStrategy(vectorStoreFile, maxChunkSizeTokens, chunkOverlapTokens); + }) + .verifyComplete(); + } + + @ParameterizedTest(name = DISPLAY_NAME_WITH_ARGUMENTS) + @MethodSource("com.azure.ai.openai.assistants.TestUtils#getTestParameters") + public void throwExceptionWhenOverrideExistChunkStrategy(HttpClient httpClient, AssistantsServiceVersion serviceVersion) { + beforeTest(httpClient, serviceVersion); + StepVerifier.create(client.createVectorStoreFile(vectorStore.getId(), fileIds.get(0), + new VectorStoreAutoChunkingStrategyRequest())) + .assertNext(this::assertVectorStoreFile) + .verifyComplete(); + StepVerifier.create(client.createVectorStoreFile(vectorStore.getId(), fileIds.get(0), + new VectorStoreStaticChunkingStrategyRequest( + new VectorStoreStaticChunkingStrategyOptions(101, 50)))) + .verifyErrorSatisfies(error -> assertInstanceOf(HttpResponseException.class, error)); } @ParameterizedTest(name = DISPLAY_NAME_WITH_ARGUMENTS) @@ -169,13 +216,17 @@ public void deleteVectorStoreFile(HttpClient httpClient, AssistantsServiceVersio beforeTest(httpClient, serviceVersion); String storeId = vectorStore.getId(); String fileId = fileIds.get(0); + // Create Vector Store File + StepVerifier.create(client.createVectorStoreFile(vectorStore.getId(), fileIds.get(0))) + .assertNext(this::assertVectorStoreFile) + .verifyComplete(); // Delete Vector Store File StepVerifier.create(client.deleteVectorStoreFile(storeId, fileId)) - .assertNext(deletionStatus -> { - assertTrue(deletionStatus.isDeleted()); - assertEquals(fileId, deletionStatus.getId()); - }) - .verifyComplete(); + .assertNext(deletionStatus -> { + assertTrue(deletionStatus.isDeleted()); + assertEquals(fileId, deletionStatus.getId()); + }) + .verifyComplete(); } // Vector Store File Batch @@ -183,18 +234,55 @@ public void deleteVectorStoreFile(HttpClient httpClient, AssistantsServiceVersio @MethodSource("com.azure.ai.openai.assistants.TestUtils#getTestParameters") public void createVectorStoreFileBatch(HttpClient httpClient, AssistantsServiceVersion serviceVersion) { beforeTest(httpClient, serviceVersion); - String storeId = vectorStore.getId(); - String fileId = fileIds.get(0); - String fileId2 = uploadFileAsync(client, "20220924_aapl_10k.pdf", ASSISTANTS); - fileIds.add(fileId2); + addFile(APPLE_FINANCIAL_STATEMENT); + StepVerifier.create(client.createVectorStoreFileBatch(vectorStore.getId(), + Arrays.asList(fileIds.get(0), fileIds.get(1)))) + .assertNext(vectorStoreFileBatch -> assertVectorStoreFileBatch(vectorStoreFileBatch, 2)) + .verifyComplete(); + } - StepVerifier.create(client.createVectorStoreFileBatch(storeId, Arrays.asList(fileId, fileId2))) - .assertNext(vectorStoreFileBatch -> { - assertNotNull(vectorStoreFileBatch); - assertNotNull(vectorStoreFileBatch.getId()); - assertEquals(2, vectorStoreFileBatch.getFileCounts().getTotal()); - }) - .verifyComplete(); + @ParameterizedTest(name = DISPLAY_NAME_WITH_ARGUMENTS) + @MethodSource("com.azure.ai.openai.assistants.TestUtils#getTestParameters") + public void createVectorStoreFileBatchWithAutoChunkingStrategy(HttpClient httpClient, AssistantsServiceVersion serviceVersion) { + beforeTest(httpClient, serviceVersion); + addFile(APPLE_FINANCIAL_STATEMENT); + StepVerifier.create(client.createVectorStoreFileBatch(vectorStore.getId(), + Arrays.asList(fileIds.get(0), fileIds.get(1)), + new VectorStoreAutoChunkingStrategyRequest())) + .assertNext(vectorStoreFileBatch -> assertVectorStoreFileBatch(vectorStoreFileBatch, 2)) + .verifyComplete(); + } + + @ParameterizedTest(name = DISPLAY_NAME_WITH_ARGUMENTS) + @MethodSource("com.azure.ai.openai.assistants.TestUtils#getTestParameters") + public void createVectorStoreFileBatchWithStaticChunkingStrategy(HttpClient httpClient, AssistantsServiceVersion serviceVersion) { + beforeTest(httpClient, serviceVersion); + addFile(APPLE_FINANCIAL_STATEMENT); + StepVerifier.create(client.createVectorStoreFileBatch(vectorStore.getId(), + Arrays.asList(fileIds.get(0), fileIds.get(1)), + new VectorStoreStaticChunkingStrategyRequest( + new VectorStoreStaticChunkingStrategyOptions(101, 50)))) + .assertNext(vectorStoreFileBatch -> assertVectorStoreFileBatch(vectorStoreFileBatch, 2)) + .verifyComplete(); + } + + @ParameterizedTest(name = DISPLAY_NAME_WITH_ARGUMENTS) + @MethodSource("com.azure.ai.openai.assistants.TestUtils#getTestParameters") + public void throwExceptionWhenOverrideExistChunkStrategyInBatch(HttpClient httpClient, AssistantsServiceVersion serviceVersion) { + beforeTest(httpClient, serviceVersion); + addFile(APPLE_FINANCIAL_STATEMENT); + + StepVerifier.create(client.createVectorStoreFileBatch(vectorStore.getId(), + Arrays.asList(fileIds.get(0), fileIds.get(1)), + new VectorStoreStaticChunkingStrategyRequest( + new VectorStoreStaticChunkingStrategyOptions(101, 50)))) + .assertNext(vectorStoreFileBatch -> assertVectorStoreFileBatch(vectorStoreFileBatch, 2)) + .verifyComplete(); + + StepVerifier.create(client.createVectorStoreFileBatch(vectorStore.getId(), + Arrays.asList(fileIds.get(0), fileIds.get(1)), + new VectorStoreAutoChunkingStrategyRequest())) + .verifyErrorSatisfies(error -> assertInstanceOf(HttpResponseException.class, error)); } @ParameterizedTest(name = DISPLAY_NAME_WITH_ARGUMENTS) diff --git a/sdk/openai/azure-ai-openai-assistants/src/test/java/com/azure/ai/openai/assistants/AzureVectorStoreSyncTests.java b/sdk/openai/azure-ai-openai-assistants/src/test/java/com/azure/ai/openai/assistants/AzureVectorStoreSyncTests.java index b104b3b3f9f5..8f78965e0e32 100644 --- a/sdk/openai/azure-ai-openai-assistants/src/test/java/com/azure/ai/openai/assistants/AzureVectorStoreSyncTests.java +++ b/sdk/openai/azure-ai-openai-assistants/src/test/java/com/azure/ai/openai/assistants/AzureVectorStoreSyncTests.java @@ -5,12 +5,17 @@ import com.azure.ai.openai.assistants.models.PageableList; import com.azure.ai.openai.assistants.models.VectorStore; +import com.azure.ai.openai.assistants.models.VectorStoreAutoChunkingStrategyRequest; +import com.azure.ai.openai.assistants.models.VectorStoreExpirationPolicy; import com.azure.ai.openai.assistants.models.VectorStoreFile; import com.azure.ai.openai.assistants.models.VectorStoreFileBatch; import com.azure.ai.openai.assistants.models.VectorStoreFileBatchStatus; import com.azure.ai.openai.assistants.models.VectorStoreFileDeletionStatus; import com.azure.ai.openai.assistants.models.VectorStoreFileStatus; import com.azure.ai.openai.assistants.models.VectorStoreOptions; +import com.azure.ai.openai.assistants.models.VectorStoreStaticChunkingStrategyOptions; +import com.azure.ai.openai.assistants.models.VectorStoreStaticChunkingStrategyRequest; +import com.azure.core.exception.HttpResponseException; import com.azure.core.http.HttpClient; import com.azure.core.util.logging.ClientLogger; import org.junit.jupiter.api.Disabled; @@ -23,12 +28,14 @@ import static com.azure.ai.openai.assistants.TestUtils.DISPLAY_NAME_WITH_ARGUMENTS; import static com.azure.ai.openai.assistants.models.FilePurpose.ASSISTANTS; +import static com.azure.ai.openai.assistants.models.VectorStoreExpirationPolicyAnchor.LAST_ACTIVE_AT; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertThrows; import static org.junit.jupiter.api.Assertions.assertTrue; -public class AzureVectorStoreSyncTests extends AssistantsClientTestBase { +public class AzureVectorStoreSyncTests extends VectorStoreTestBase { private static final ClientLogger LOGGER = new ClientLogger(AzureVectorStoreSyncTests.class); private AssistantsClient client; @@ -37,16 +44,19 @@ public class AzureVectorStoreSyncTests extends AssistantsClientTestBase { protected void beforeTest(HttpClient httpClient, AssistantsServiceVersion serviceVersion) { client = getAssistantsClient(httpClient, serviceVersion); - fileIds.add(uploadFile(client, "20210203_alphabet_10K.pdf", ASSISTANTS)); + addFile(ALPHABET_FINANCIAL_STATEMENT); VectorStoreOptions vectorStoreOptions = new VectorStoreOptions() - .setName("Financial Statements") - .setFileIds(fileIds); + .setName("Financial Statements") + .setExpiresAfter(new VectorStoreExpirationPolicy(LAST_ACTIVE_AT, 1)); vectorStore = client.createVectorStore(vectorStoreOptions); - assertNotNull(vectorStore); assertNotNull(vectorStore.getId()); } + private void addFile(String fileId) { + fileIds.add(uploadFile(client, fileId, ASSISTANTS)); + } + @Override protected void afterTest() { LOGGER.info("Cleaning up created resources."); @@ -102,11 +112,47 @@ public void listVectorStore(HttpClient httpClient, AssistantsServiceVersion serv @MethodSource("com.azure.ai.openai.assistants.TestUtils#getTestParameters") public void createVectorStoreFile(HttpClient httpClient, AssistantsServiceVersion serviceVersion) { beforeTest(httpClient, serviceVersion); + VectorStoreFile vectorStoreFile = client.createVectorStoreFile(vectorStore.getId(), fileIds.get(0)); + assertVectorStoreFile(vectorStoreFile); + } - String storeId = vectorStore.getId(); - VectorStoreFile vectorStoreFile = client.createVectorStoreFile(storeId, fileIds.get(0)); - assertNotNull(vectorStoreFile); - assertNotNull(vectorStoreFile.getId()); + @ParameterizedTest(name = DISPLAY_NAME_WITH_ARGUMENTS) + @MethodSource("com.azure.ai.openai.assistants.TestUtils#getTestParameters") + public void createVectorStoreFileWithAutoChunkingStrategy(HttpClient httpClient, AssistantsServiceVersion serviceVersion) { + beforeTest(httpClient, serviceVersion); + VectorStoreFile vectorStoreFile = client.createVectorStoreFile(vectorStore.getId(), fileIds.get(0), + new VectorStoreAutoChunkingStrategyRequest()); + assertVectorStoreFile(vectorStoreFile); + } + + @ParameterizedTest(name = DISPLAY_NAME_WITH_ARGUMENTS) + @MethodSource("com.azure.ai.openai.assistants.TestUtils#getTestParameters") + public void createVectorStoreFileWithStaticChunkingStrategy(HttpClient httpClient, AssistantsServiceVersion serviceVersion) { + beforeTest(httpClient, serviceVersion); + int maxChunkSizeTokens = 101; + int chunkOverlapTokens = 50; + VectorStoreFile vectorStoreFile = client.createVectorStoreFile(vectorStore.getId(), fileIds.get(0), + new VectorStoreStaticChunkingStrategyRequest( + new VectorStoreStaticChunkingStrategyOptions(maxChunkSizeTokens, chunkOverlapTokens)) + ); + + assertVectorStoreFile(vectorStoreFile); + assertStaticChunkingStrategy(vectorStoreFile, maxChunkSizeTokens, chunkOverlapTokens); + } + + @ParameterizedTest(name = DISPLAY_NAME_WITH_ARGUMENTS) + @MethodSource("com.azure.ai.openai.assistants.TestUtils#getTestParameters") + public void throwExceptionWhenOverrideExistChunkStrategy(HttpClient httpClient, AssistantsServiceVersion serviceVersion) { + beforeTest(httpClient, serviceVersion); + VectorStoreFile vectorStoreFile = client.createVectorStoreFile(vectorStore.getId(), fileIds.get(0), + new VectorStoreAutoChunkingStrategyRequest()); + + assertVectorStoreFile(vectorStoreFile); + + assertThrows(HttpResponseException.class, () -> client.createVectorStoreFile(vectorStore.getId(), fileIds.get(0), + new VectorStoreStaticChunkingStrategyRequest( + new VectorStoreStaticChunkingStrategyOptions(101, 50)) + )); } @ParameterizedTest(name = DISPLAY_NAME_WITH_ARGUMENTS) @@ -156,10 +202,11 @@ public void listVectorStoreFiles(HttpClient httpClient, AssistantsServiceVersion @MethodSource("com.azure.ai.openai.assistants.TestUtils#getTestParameters") public void deleteVectorStoreFile(HttpClient httpClient, AssistantsServiceVersion serviceVersion) { beforeTest(httpClient, serviceVersion); - String storeId = vectorStore.getId(); String fileId = fileIds.get(0); - + // Create Vector Store File + VectorStoreFile vectorStoreFile = client.createVectorStoreFile(storeId, fileId); + assertVectorStoreFile(vectorStoreFile); // Delete Vector Store File VectorStoreFileDeletionStatus deletionStatus = client.deleteVectorStoreFile(storeId, fileId); assertTrue(deletionStatus.isDeleted()); @@ -171,15 +218,52 @@ public void deleteVectorStoreFile(HttpClient httpClient, AssistantsServiceVersio @MethodSource("com.azure.ai.openai.assistants.TestUtils#getTestParameters") public void createVectorStoreFileBatch(HttpClient httpClient, AssistantsServiceVersion serviceVersion) { beforeTest(httpClient, serviceVersion); + addFile(APPLE_FINANCIAL_STATEMENT); + VectorStoreFileBatch vectorStoreFileBatch = client.createVectorStoreFileBatch(vectorStore.getId(), + Arrays.asList(fileIds.get(0), fileIds.get(1))); + assertVectorStoreFileBatch(vectorStoreFileBatch, 2); + } + + @ParameterizedTest(name = DISPLAY_NAME_WITH_ARGUMENTS) + @MethodSource("com.azure.ai.openai.assistants.TestUtils#getTestParameters") + public void createVectorStoreFileBatchWithAutoChunkingStrategy(HttpClient httpClient, AssistantsServiceVersion serviceVersion) { + beforeTest(httpClient, serviceVersion); + addFile(APPLE_FINANCIAL_STATEMENT); + VectorStoreFileBatch vectorStoreFileBatch = client.createVectorStoreFileBatch(vectorStore.getId(), + Arrays.asList(fileIds.get(0), fileIds.get(1)), + new VectorStoreAutoChunkingStrategyRequest()); + assertVectorStoreFileBatch(vectorStoreFileBatch, 2); + } + + @ParameterizedTest(name = DISPLAY_NAME_WITH_ARGUMENTS) + @MethodSource("com.azure.ai.openai.assistants.TestUtils#getTestParameters") + public void createVectorStoreFileBatchWithStaticChunkingStrategy(HttpClient httpClient, AssistantsServiceVersion serviceVersion) { + beforeTest(httpClient, serviceVersion); + addFile(APPLE_FINANCIAL_STATEMENT); + VectorStoreFileBatch vectorStoreFileBatch = client.createVectorStoreFileBatch(vectorStore.getId(), + Arrays.asList(fileIds.get(0), fileIds.get(1)), + new VectorStoreStaticChunkingStrategyRequest( + new VectorStoreStaticChunkingStrategyOptions(101, 50))); + assertVectorStoreFileBatch(vectorStoreFileBatch, 2); + } + + @ParameterizedTest(name = DISPLAY_NAME_WITH_ARGUMENTS) + @MethodSource("com.azure.ai.openai.assistants.TestUtils#getTestParameters") + public void throwExceptionWhenOverrideExistChunkStrategyInBatch(HttpClient httpClient, AssistantsServiceVersion serviceVersion) { + beforeTest(httpClient, serviceVersion); + addFile(APPLE_FINANCIAL_STATEMENT); + + VectorStoreFileBatch vectorStoreFileBatch = client.createVectorStoreFileBatch(vectorStore.getId(), + Arrays.asList(fileIds.get(0), fileIds.get(1)), + new VectorStoreStaticChunkingStrategyRequest( + new VectorStoreStaticChunkingStrategyOptions(101, 50))); - String storeId = vectorStore.getId(); - String fileId = fileIds.get(0); - String fileId2 = uploadFile(client, "20220924_aapl_10k.pdf", ASSISTANTS); - fileIds.add(fileId2); - VectorStoreFileBatch vectorStoreFileBatch = client.createVectorStoreFileBatch(storeId, Arrays.asList(fileId, fileId2)); assertNotNull(vectorStoreFileBatch); - assertNotNull(vectorStoreFileBatch.getId()); - assertEquals(2, vectorStoreFileBatch.getFileCounts().getTotal()); + + assertThrows(HttpResponseException.class, () -> client.createVectorStoreFileBatch(vectorStore.getId(), + Arrays.asList(fileIds.get(0), fileIds.get(1)), + new VectorStoreAutoChunkingStrategyRequest() + )); } @ParameterizedTest(name = DISPLAY_NAME_WITH_ARGUMENTS) diff --git a/sdk/openai/azure-ai-openai-assistants/src/test/java/com/azure/ai/openai/assistants/FileSearchAsyncTest.java b/sdk/openai/azure-ai-openai-assistants/src/test/java/com/azure/ai/openai/assistants/FileSearchAsyncTest.java index 176961001b62..2c610471e49d 100644 --- a/sdk/openai/azure-ai-openai-assistants/src/test/java/com/azure/ai/openai/assistants/FileSearchAsyncTest.java +++ b/sdk/openai/azure-ai-openai-assistants/src/test/java/com/azure/ai/openai/assistants/FileSearchAsyncTest.java @@ -19,6 +19,7 @@ import com.azure.ai.openai.assistants.models.ThreadMessageOptions; import com.azure.ai.openai.assistants.models.ThreadRun; import com.azure.ai.openai.assistants.implementation.AsyncUtils; +import com.azure.core.exception.HttpResponseException; import com.azure.core.http.HttpClient; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.MethodSource; @@ -31,10 +32,11 @@ import static com.azure.ai.openai.assistants.TestUtils.DISPLAY_NAME_WITH_ARGUMENTS; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertInstanceOf; import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.junit.jupiter.api.Assertions.assertTrue; -public class FileSearchAsyncTest extends AssistantsClientTestBase { +public class FileSearchAsyncTest extends FileSearchTestBase { AssistantsAsyncClient client; @@ -53,7 +55,10 @@ public void basicFileSearch(HttpClient httpClient, AssistantsServiceVersion serv createToolResourcesOptions.setFileSearch( new CreateFileSearchToolResourceOptions( new CreateFileSearchToolResourceVectorStoreOptionsList( - Arrays.asList(new CreateFileSearchToolResourceVectorStoreOptions(Arrays.asList(openAIFile.getId())))))); + Arrays.asList(new CreateFileSearchToolResourceVectorStoreOptions( + Arrays.asList(openAIFile.getId()), + null + ))))); assistantCreationOptions.setToolResources(createToolResourcesOptions); cleanUp.setFile(openAIFile); return client.createAssistant(assistantCreationOptions).zipWith(Mono.just(cleanUp)); @@ -120,4 +125,36 @@ public void basicFileSearch(HttpClient httpClient, AssistantsServiceVersion serv .verifyComplete(); }); } + + @ParameterizedTest(name = DISPLAY_NAME_WITH_ARGUMENTS) + @MethodSource("com.azure.ai.openai.assistants.TestUtils#getTestParameters") + public void fileSearchWithMaxNumberResult(HttpClient httpClient, AssistantsServiceVersion serviceVersion) { + client = getAssistantsAsyncClient(httpClient); + + fileSearchWithMaxNumberResultRunner((fileDetails, assistantCreationOptions) -> { + // Upload file + StepVerifier.create(client.uploadFile(fileDetails, FilePurpose.ASSISTANTS) + .flatMap(openAIFile -> { + // Create assistant + AsyncUtils cleanUp = new AsyncUtils(); + CreateToolResourcesOptions createToolResourcesOptions = new CreateToolResourcesOptions(); + createToolResourcesOptions.setFileSearch( + new CreateFileSearchToolResourceOptions( + new CreateFileSearchToolResourceVectorStoreOptionsList( + Arrays.asList(new CreateFileSearchToolResourceVectorStoreOptions( + Arrays.asList(openAIFile.getId()), + null + )) + ) + ) + ); + assistantCreationOptions.setToolResources(createToolResourcesOptions); + + cleanUp.setFile(openAIFile); + return client.createAssistant(assistantCreationOptions) + .zipWith(Mono.just(cleanUp)); + }) + ).verifyErrorSatisfies(error -> assertInstanceOf(HttpResponseException.class, error)); + }); + } } diff --git a/sdk/openai/azure-ai-openai-assistants/src/test/java/com/azure/ai/openai/assistants/FileSearchSyncTest.java b/sdk/openai/azure-ai-openai-assistants/src/test/java/com/azure/ai/openai/assistants/FileSearchSyncTest.java index 3af04468b770..f9675d097097 100644 --- a/sdk/openai/azure-ai-openai-assistants/src/test/java/com/azure/ai/openai/assistants/FileSearchSyncTest.java +++ b/sdk/openai/azure-ai-openai-assistants/src/test/java/com/azure/ai/openai/assistants/FileSearchSyncTest.java @@ -19,6 +19,7 @@ import com.azure.ai.openai.assistants.models.ThreadMessage; import com.azure.ai.openai.assistants.models.ThreadMessageOptions; import com.azure.ai.openai.assistants.models.ThreadRun; +import com.azure.core.exception.HttpResponseException; import com.azure.core.http.HttpClient; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.MethodSource; @@ -29,9 +30,10 @@ import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertThrows; import static org.junit.jupiter.api.Assertions.assertTrue; -public class FileSearchSyncTest extends AssistantsClientTestBase { +public class FileSearchSyncTest extends FileSearchTestBase { AssistantsClient client; @@ -49,7 +51,10 @@ public void basicFileSearch(HttpClient httpClient, AssistantsServiceVersion serv createToolResourcesOptions.setFileSearch( new CreateFileSearchToolResourceOptions( new CreateFileSearchToolResourceVectorStoreOptionsList( - Arrays.asList(new CreateFileSearchToolResourceVectorStoreOptions(Arrays.asList(openAIFile.getId())))))); + Arrays.asList(new CreateFileSearchToolResourceVectorStoreOptions( + Arrays.asList(openAIFile.getId()), + null + ))))); assistantCreationOptions.setToolResources(createToolResourcesOptions); Assistant assistant = client.createAssistant(assistantCreationOptions); @@ -95,5 +100,37 @@ public void basicFileSearch(HttpClient httpClient, AssistantsServiceVersion serv }); } + @ParameterizedTest(name = DISPLAY_NAME_WITH_ARGUMENTS) + @MethodSource("com.azure.ai.openai.assistants.TestUtils#getTestParameters") + public void fileSearchWithMaxNumberResult(HttpClient httpClient, AssistantsServiceVersion serviceVersion) { + client = getAssistantsClient(httpClient); + + fileSearchWithMaxNumberResultRunner((fileDetails, assistantCreationOptions) -> { + // Upload file for assistant + OpenAIFile openAIFile = client.uploadFile(fileDetails, FilePurpose.ASSISTANTS); + + // Create assistant + CreateToolResourcesOptions createToolResourcesOptions = new CreateToolResourcesOptions(); + createToolResourcesOptions.setFileSearch( + new CreateFileSearchToolResourceOptions( + new CreateFileSearchToolResourceVectorStoreOptionsList( + Arrays.asList( + new CreateFileSearchToolResourceVectorStoreOptions( + Arrays.asList(openAIFile.getId()), + null) + ) + ) + ) + ); + assistantCreationOptions.setToolResources(createToolResourcesOptions); + + assertThrows(HttpResponseException.class, () -> { + Assistant assistant = client.createAssistant(assistantCreationOptions); + client.deleteAssistant(assistant.getId()); + }); + // cleanup + client.deleteFile(openAIFile.getId()); + }); + } } diff --git a/sdk/openai/azure-ai-openai-assistants/src/test/java/com/azure/ai/openai/assistants/FileSearchTestBase.java b/sdk/openai/azure-ai-openai-assistants/src/test/java/com/azure/ai/openai/assistants/FileSearchTestBase.java new file mode 100644 index 000000000000..6c63f8cb414a --- /dev/null +++ b/sdk/openai/azure-ai-openai-assistants/src/test/java/com/azure/ai/openai/assistants/FileSearchTestBase.java @@ -0,0 +1,49 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +package com.azure.ai.openai.assistants; + +import com.azure.ai.openai.assistants.models.AssistantCreationOptions; +import com.azure.ai.openai.assistants.models.FileDetails; +import com.azure.ai.openai.assistants.models.FileSearchToolDefinition; +import com.azure.ai.openai.assistants.models.FileSearchToolDefinitionDetails; +import com.azure.core.http.HttpClient; +import com.azure.core.util.BinaryData; + +import java.util.Arrays; +import java.util.function.BiConsumer; + +public abstract class FileSearchTestBase extends AssistantsClientTestBase { + private static final String JAVA_SDK_TESTS_ASSISTANTS_TXT = "java_sdk_tests_assistants.txt"; + public abstract void basicFileSearch(HttpClient httpClient, AssistantsServiceVersion serviceVersion); + public abstract void fileSearchWithMaxNumberResult(HttpClient httpClient, AssistantsServiceVersion serviceVersion); + + void createRetrievalRunner(BiConsumer testRunner) { + FileDetails fileDetails = new FileDetails( + BinaryData.fromFile(openResourceFile(JAVA_SDK_TESTS_ASSISTANTS_TXT)), + JAVA_SDK_TESTS_ASSISTANTS_TXT); + + AssistantCreationOptions assistantOptions = new AssistantCreationOptions(GPT_4_1106_PREVIEW) + .setName("Java SDK Retrieval Sample") + .setInstructions("You are a helpful assistant that can help fetch data from files you know about.") + .setTools(Arrays.asList(new FileSearchToolDefinition())); + + testRunner.accept(fileDetails, assistantOptions); + } + + void fileSearchWithMaxNumberResultRunner(BiConsumer testRunner) { + FileDetails fileDetails = new FileDetails( + BinaryData.fromFile(openResourceFile(JAVA_SDK_TESTS_ASSISTANTS_TXT)), + JAVA_SDK_TESTS_ASSISTANTS_TXT); + + AssistantCreationOptions assistantOptions = new AssistantCreationOptions(GPT_4_1106_PREVIEW) + .setName("Java SDK Retrieval Sample") + .setInstructions("You are a helpful assistant that can help fetch data from files you know about.") + .setTools(Arrays.asList( + new FileSearchToolDefinition().setFileSearch( + new FileSearchToolDefinitionDetails().setMaxNumResults(0) + ))); + + testRunner.accept(fileDetails, assistantOptions); + } +} diff --git a/sdk/openai/azure-ai-openai-assistants/src/test/java/com/azure/ai/openai/assistants/VectorStoreAsyncTests.java b/sdk/openai/azure-ai-openai-assistants/src/test/java/com/azure/ai/openai/assistants/VectorStoreAsyncTests.java index 24b5e2db774d..dfe29106391b 100644 --- a/sdk/openai/azure-ai-openai-assistants/src/test/java/com/azure/ai/openai/assistants/VectorStoreAsyncTests.java +++ b/sdk/openai/azure-ai-openai-assistants/src/test/java/com/azure/ai/openai/assistants/VectorStoreAsyncTests.java @@ -4,10 +4,14 @@ package com.azure.ai.openai.assistants; import com.azure.ai.openai.assistants.models.VectorStore; +import com.azure.ai.openai.assistants.models.VectorStoreAutoChunkingStrategyRequest; import com.azure.ai.openai.assistants.models.VectorStoreExpirationPolicy; import com.azure.ai.openai.assistants.models.VectorStoreFile; import com.azure.ai.openai.assistants.models.VectorStoreFileBatch; import com.azure.ai.openai.assistants.models.VectorStoreOptions; +import com.azure.ai.openai.assistants.models.VectorStoreStaticChunkingStrategyOptions; +import com.azure.ai.openai.assistants.models.VectorStoreStaticChunkingStrategyRequest; +import com.azure.core.exception.HttpResponseException; import com.azure.core.http.HttpClient; import com.azure.core.util.logging.ClientLogger; import org.junit.jupiter.params.ParameterizedTest; @@ -23,10 +27,11 @@ import static com.azure.ai.openai.assistants.models.VectorStoreExpirationPolicyAnchor.LAST_ACTIVE_AT; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertInstanceOf; import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.junit.jupiter.api.Assertions.assertTrue; -public class VectorStoreAsyncTests extends AssistantsClientTestBase { +public class VectorStoreAsyncTests extends VectorStoreTestBase { private static final ClientLogger LOGGER = new ClientLogger(VectorStoreSyncTests.class); private AssistantsAsyncClient client; @@ -34,12 +39,10 @@ public class VectorStoreAsyncTests extends AssistantsClientTestBase { private List fileIds = new ArrayList<>(); protected void beforeTest(HttpClient httpClient) { client = getAssistantsAsyncClient(httpClient); - fileIds.add(uploadFileAsync(client, "20210203_alphabet_10K.pdf", ASSISTANTS)); + addFile(ALPHABET_FINANCIAL_STATEMENT); VectorStoreOptions vectorStoreOptions = new VectorStoreOptions() .setName("Financial Statements") - .setExpiresAfter(new VectorStoreExpirationPolicy(LAST_ACTIVE_AT, 1)) - .setFileIds(fileIds); - + .setExpiresAfter(new VectorStoreExpirationPolicy(LAST_ACTIVE_AT, 1)); StepVerifier.create(client.createVectorStore(vectorStoreOptions)) .assertNext(vectorStore -> { this.vectorStore = vectorStore; @@ -49,6 +52,10 @@ protected void beforeTest(HttpClient httpClient) { .verifyComplete(); } + private void addFile(String fileId) { + fileIds.add(uploadFileAsync(client, fileId, ASSISTANTS)); + } + @Override protected void afterTest() { LOGGER.info("Cleaning up created resources."); @@ -111,15 +118,51 @@ public void listVectorStore(HttpClient httpClient, AssistantsServiceVersion serv @MethodSource("com.azure.ai.openai.assistants.TestUtils#getTestParameters") public void createVectorStoreFile(HttpClient httpClient, AssistantsServiceVersion serviceVersion) { beforeTest(httpClient); - String storeId = vectorStore.getId(); - StepVerifier.create(client.createVectorStoreFile(storeId, fileIds.get(0))) - .assertNext(vectorStoreFile -> { - assertNotNull(vectorStoreFile); - assertNotNull(vectorStoreFile.getId()); - }) + StepVerifier.create(client.createVectorStoreFile(vectorStore.getId(), fileIds.get(0))) + .assertNext(this::assertVectorStoreFile) .verifyComplete(); } + @ParameterizedTest(name = DISPLAY_NAME_WITH_ARGUMENTS) + @MethodSource("com.azure.ai.openai.assistants.TestUtils#getTestParameters") + public void createVectorStoreFileWithAutoChunkingStrategy(HttpClient httpClient, AssistantsServiceVersion serviceVersion) { + beforeTest(httpClient); + StepVerifier.create(client.createVectorStoreFile(vectorStore.getId(), fileIds.get(0), + new VectorStoreAutoChunkingStrategyRequest())) + .assertNext(this::assertVectorStoreFile) + .verifyComplete(); + } + + @ParameterizedTest(name = DISPLAY_NAME_WITH_ARGUMENTS) + @MethodSource("com.azure.ai.openai.assistants.TestUtils#getTestParameters") + public void createVectorStoreFileWithStaticChunkingStrategy(HttpClient httpClient, AssistantsServiceVersion serviceVersion) { + beforeTest(httpClient); + int maxChunkSizeTokens = 101; + int chunkOverlapTokens = 50; + StepVerifier.create(client.createVectorStoreFile(vectorStore.getId(), fileIds.get(0), + new VectorStoreStaticChunkingStrategyRequest( + new VectorStoreStaticChunkingStrategyOptions(maxChunkSizeTokens, chunkOverlapTokens)))) + .assertNext(vectorStoreFile -> { + assertVectorStoreFile(vectorStoreFile); + assertStaticChunkingStrategy(vectorStoreFile, maxChunkSizeTokens, chunkOverlapTokens); + }) + .verifyComplete(); + } + + @ParameterizedTest(name = DISPLAY_NAME_WITH_ARGUMENTS) + @MethodSource("com.azure.ai.openai.assistants.TestUtils#getTestParameters") + public void throwExceptionWhenOverrideExistChunkStrategy(HttpClient httpClient, AssistantsServiceVersion serviceVersion) { + beforeTest(httpClient); + StepVerifier.create(client.createVectorStoreFile(vectorStore.getId(), fileIds.get(0), + new VectorStoreAutoChunkingStrategyRequest())) + .assertNext(this::assertVectorStoreFile) + .verifyComplete(); + StepVerifier.create(client.createVectorStoreFile(vectorStore.getId(), fileIds.get(0), + new VectorStoreStaticChunkingStrategyRequest( + new VectorStoreStaticChunkingStrategyOptions(101, 50)))) + .verifyErrorSatisfies(error -> assertInstanceOf(HttpResponseException.class, error)); + } + @ParameterizedTest(name = DISPLAY_NAME_WITH_ARGUMENTS) @MethodSource("com.azure.ai.openai.assistants.TestUtils#getTestParameters") public void getVectorStoreFile(HttpClient httpClient, AssistantsServiceVersion serviceVersion) { @@ -170,6 +213,10 @@ public void deleteVectorStoreFile(HttpClient httpClient, AssistantsServiceVersio beforeTest(httpClient); String storeId = vectorStore.getId(); String fileId = fileIds.get(0); + // Create Vector Store File + StepVerifier.create(client.createVectorStoreFile(vectorStore.getId(), fileIds.get(0))) + .assertNext(this::assertVectorStoreFile) + .verifyComplete(); // Delete Vector Store File StepVerifier.create(client.deleteVectorStoreFile(storeId, fileId)) .assertNext(deletionStatus -> { @@ -184,20 +231,57 @@ public void deleteVectorStoreFile(HttpClient httpClient, AssistantsServiceVersio @MethodSource("com.azure.ai.openai.assistants.TestUtils#getTestParameters") public void createVectorStoreFileBatch(HttpClient httpClient, AssistantsServiceVersion serviceVersion) { beforeTest(httpClient); - String storeId = vectorStore.getId(); - String fileId = fileIds.get(0); - String fileId2 = uploadFileAsync(client, "20220924_aapl_10k.pdf", ASSISTANTS); - fileIds.add(fileId2); - - StepVerifier.create(client.createVectorStoreFileBatch(storeId, Arrays.asList(fileId, fileId2))) - .assertNext(vectorStoreFileBatch -> { - assertNotNull(vectorStoreFileBatch); - assertNotNull(vectorStoreFileBatch.getId()); - assertEquals(2, vectorStoreFileBatch.getFileCounts().getTotal()); - }) + addFile(APPLE_FINANCIAL_STATEMENT); + StepVerifier.create(client.createVectorStoreFileBatch(vectorStore.getId(), + Arrays.asList(fileIds.get(0), fileIds.get(1)))) + .assertNext(vectorStoreFileBatch -> assertVectorStoreFileBatch(vectorStoreFileBatch, 2)) .verifyComplete(); } + @ParameterizedTest(name = DISPLAY_NAME_WITH_ARGUMENTS) + @MethodSource("com.azure.ai.openai.assistants.TestUtils#getTestParameters") + public void createVectorStoreFileBatchWithAutoChunkingStrategy(HttpClient httpClient, AssistantsServiceVersion serviceVersion) { + beforeTest(httpClient); + addFile(APPLE_FINANCIAL_STATEMENT); + StepVerifier.create(client.createVectorStoreFileBatch(vectorStore.getId(), + Arrays.asList(fileIds.get(0), fileIds.get(1)), + new VectorStoreAutoChunkingStrategyRequest())) + .assertNext(vectorStoreFileBatch -> assertVectorStoreFileBatch(vectorStoreFileBatch, 2)) + .verifyComplete(); + } + + @ParameterizedTest(name = DISPLAY_NAME_WITH_ARGUMENTS) + @MethodSource("com.azure.ai.openai.assistants.TestUtils#getTestParameters") + public void createVectorStoreFileBatchWithStaticChunkingStrategy(HttpClient httpClient, AssistantsServiceVersion serviceVersion) { + beforeTest(httpClient); + addFile(APPLE_FINANCIAL_STATEMENT); + StepVerifier.create(client.createVectorStoreFileBatch(vectorStore.getId(), + Arrays.asList(fileIds.get(0), fileIds.get(1)), + new VectorStoreStaticChunkingStrategyRequest( + new VectorStoreStaticChunkingStrategyOptions(101, 50)))) + .assertNext(vectorStoreFileBatch -> assertVectorStoreFileBatch(vectorStoreFileBatch, 2)) + .verifyComplete(); + } + + @ParameterizedTest(name = DISPLAY_NAME_WITH_ARGUMENTS) + @MethodSource("com.azure.ai.openai.assistants.TestUtils#getTestParameters") + public void throwExceptionWhenOverrideExistChunkStrategyInBatch(HttpClient httpClient, AssistantsServiceVersion serviceVersion) { + beforeTest(httpClient); + addFile(APPLE_FINANCIAL_STATEMENT); + + StepVerifier.create(client.createVectorStoreFileBatch(vectorStore.getId(), + Arrays.asList(fileIds.get(0), fileIds.get(1)), + new VectorStoreStaticChunkingStrategyRequest( + new VectorStoreStaticChunkingStrategyOptions(101, 50)))) + .assertNext(vectorStoreFileBatch -> assertVectorStoreFileBatch(vectorStoreFileBatch, 2)) + .verifyComplete(); + + StepVerifier.create(client.createVectorStoreFileBatch(vectorStore.getId(), + Arrays.asList(fileIds.get(0), fileIds.get(1)), + new VectorStoreAutoChunkingStrategyRequest())) + .verifyErrorSatisfies(error -> assertInstanceOf(HttpResponseException.class, error)); + } + @ParameterizedTest(name = DISPLAY_NAME_WITH_ARGUMENTS) @MethodSource("com.azure.ai.openai.assistants.TestUtils#getTestParameters") public void getVectorStoreFileBatch(HttpClient httpClient, AssistantsServiceVersion serviceVersion) { diff --git a/sdk/openai/azure-ai-openai-assistants/src/test/java/com/azure/ai/openai/assistants/VectorStoreSyncTests.java b/sdk/openai/azure-ai-openai-assistants/src/test/java/com/azure/ai/openai/assistants/VectorStoreSyncTests.java index 53509a3e1b66..6f117aa0e552 100644 --- a/sdk/openai/azure-ai-openai-assistants/src/test/java/com/azure/ai/openai/assistants/VectorStoreSyncTests.java +++ b/sdk/openai/azure-ai-openai-assistants/src/test/java/com/azure/ai/openai/assistants/VectorStoreSyncTests.java @@ -5,6 +5,7 @@ import com.azure.ai.openai.assistants.models.PageableList; import com.azure.ai.openai.assistants.models.VectorStore; +import com.azure.ai.openai.assistants.models.VectorStoreAutoChunkingStrategyRequest; import com.azure.ai.openai.assistants.models.VectorStoreExpirationPolicy; import com.azure.ai.openai.assistants.models.VectorStoreFile; import com.azure.ai.openai.assistants.models.VectorStoreFileBatch; @@ -12,6 +13,9 @@ import com.azure.ai.openai.assistants.models.VectorStoreFileDeletionStatus; import com.azure.ai.openai.assistants.models.VectorStoreFileStatus; import com.azure.ai.openai.assistants.models.VectorStoreOptions; +import com.azure.ai.openai.assistants.models.VectorStoreStaticChunkingStrategyOptions; +import com.azure.ai.openai.assistants.models.VectorStoreStaticChunkingStrategyRequest; +import com.azure.core.exception.HttpResponseException; import com.azure.core.http.HttpClient; import com.azure.core.util.logging.ClientLogger; import org.junit.jupiter.params.ParameterizedTest; @@ -27,9 +31,10 @@ import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertThrows; import static org.junit.jupiter.api.Assertions.assertTrue; -public class VectorStoreSyncTests extends AssistantsClientTestBase { +public class VectorStoreSyncTests extends VectorStoreTestBase { private static final ClientLogger LOGGER = new ClientLogger(VectorStoreSyncTests.class); private AssistantsClient client; @@ -38,17 +43,19 @@ public class VectorStoreSyncTests extends AssistantsClientTestBase { protected void beforeTest(HttpClient httpClient) { client = getAssistantsClient(httpClient); - fileIds.add(uploadFile(client, "20210203_alphabet_10K.pdf", ASSISTANTS)); + addFile(ALPHABET_FINANCIAL_STATEMENT); VectorStoreOptions vectorStoreOptions = new VectorStoreOptions() .setName("Financial Statements") - .setExpiresAfter(new VectorStoreExpirationPolicy(LAST_ACTIVE_AT, 1)) - .setFileIds(fileIds); + .setExpiresAfter(new VectorStoreExpirationPolicy(LAST_ACTIVE_AT, 1)); vectorStore = client.createVectorStore(vectorStoreOptions); - assertNotNull(vectorStore); assertNotNull(vectorStore.getId()); } + private void addFile(String fileId) { + fileIds.add(uploadFile(client, fileId, ASSISTANTS)); + } + @Override protected void afterTest() { LOGGER.info("Cleaning up created resources."); @@ -102,10 +109,47 @@ public void listVectorStore(HttpClient httpClient, AssistantsServiceVersion serv @MethodSource("com.azure.ai.openai.assistants.TestUtils#getTestParameters") public void createVectorStoreFile(HttpClient httpClient, AssistantsServiceVersion serviceVersion) { beforeTest(httpClient); - String storeId = vectorStore.getId(); - VectorStoreFile vectorStoreFile = client.createVectorStoreFile(storeId, fileIds.get(0)); - assertNotNull(vectorStoreFile); - assertNotNull(vectorStoreFile.getId()); + VectorStoreFile vectorStoreFile = client.createVectorStoreFile(vectorStore.getId(), fileIds.get(0)); + assertVectorStoreFile(vectorStoreFile); + } + + @ParameterizedTest(name = DISPLAY_NAME_WITH_ARGUMENTS) + @MethodSource("com.azure.ai.openai.assistants.TestUtils#getTestParameters") + public void createVectorStoreFileWithAutoChunkingStrategy(HttpClient httpClient, AssistantsServiceVersion serviceVersion) { + beforeTest(httpClient); + VectorStoreFile vectorStoreFile = client.createVectorStoreFile(vectorStore.getId(), fileIds.get(0), + new VectorStoreAutoChunkingStrategyRequest()); + assertVectorStoreFile(vectorStoreFile); + } + + @ParameterizedTest(name = DISPLAY_NAME_WITH_ARGUMENTS) + @MethodSource("com.azure.ai.openai.assistants.TestUtils#getTestParameters") + public void createVectorStoreFileWithStaticChunkingStrategy(HttpClient httpClient, AssistantsServiceVersion serviceVersion) { + beforeTest(httpClient); + int maxChunkSizeTokens = 101; + int chunkOverlapTokens = 50; + VectorStoreFile vectorStoreFile = client.createVectorStoreFile(vectorStore.getId(), fileIds.get(0), + new VectorStoreStaticChunkingStrategyRequest( + new VectorStoreStaticChunkingStrategyOptions(maxChunkSizeTokens, chunkOverlapTokens)) + ); + + assertVectorStoreFile(vectorStoreFile); + assertStaticChunkingStrategy(vectorStoreFile, maxChunkSizeTokens, chunkOverlapTokens); + } + + @ParameterizedTest(name = DISPLAY_NAME_WITH_ARGUMENTS) + @MethodSource("com.azure.ai.openai.assistants.TestUtils#getTestParameters") + public void throwExceptionWhenOverrideExistChunkStrategy(HttpClient httpClient, AssistantsServiceVersion serviceVersion) { + beforeTest(httpClient); + VectorStoreFile vectorStoreFile = client.createVectorStoreFile(vectorStore.getId(), fileIds.get(0), + new VectorStoreAutoChunkingStrategyRequest()); + + assertVectorStoreFile(vectorStoreFile); + + assertThrows(HttpResponseException.class, () -> client.createVectorStoreFile(vectorStore.getId(), fileIds.get(0), + new VectorStoreStaticChunkingStrategyRequest( + new VectorStoreStaticChunkingStrategyOptions(101, 50)) + )); } @ParameterizedTest(name = DISPLAY_NAME_WITH_ARGUMENTS) @@ -156,7 +200,9 @@ public void deleteVectorStoreFile(HttpClient httpClient, AssistantsServiceVersio beforeTest(httpClient); String storeId = vectorStore.getId(); String fileId = fileIds.get(0); - + // Create Vector Store File + VectorStoreFile vectorStoreFile = client.createVectorStoreFile(storeId, fileId); + assertVectorStoreFile(vectorStoreFile); // Delete Vector Store File VectorStoreFileDeletionStatus deletionStatus = client.deleteVectorStoreFile(storeId, fileId); assertTrue(deletionStatus.isDeleted()); @@ -168,14 +214,52 @@ public void deleteVectorStoreFile(HttpClient httpClient, AssistantsServiceVersio @MethodSource("com.azure.ai.openai.assistants.TestUtils#getTestParameters") public void createVectorStoreFileBatch(HttpClient httpClient, AssistantsServiceVersion serviceVersion) { beforeTest(httpClient); - String storeId = vectorStore.getId(); - String fileId = fileIds.get(0); - String fileId2 = uploadFile(client, "20220924_aapl_10k.pdf", ASSISTANTS); - fileIds.add(fileId2); - VectorStoreFileBatch vectorStoreFileBatch = client.createVectorStoreFileBatch(storeId, Arrays.asList(fileId, fileId2)); + addFile(APPLE_FINANCIAL_STATEMENT); + VectorStoreFileBatch vectorStoreFileBatch = client.createVectorStoreFileBatch(vectorStore.getId(), + Arrays.asList(fileIds.get(0), fileIds.get(1))); + assertVectorStoreFileBatch(vectorStoreFileBatch, 2); + } + + @ParameterizedTest(name = DISPLAY_NAME_WITH_ARGUMENTS) + @MethodSource("com.azure.ai.openai.assistants.TestUtils#getTestParameters") + public void createVectorStoreFileBatchWithAutoChunkingStrategy(HttpClient httpClient, AssistantsServiceVersion serviceVersion) { + beforeTest(httpClient); + addFile(APPLE_FINANCIAL_STATEMENT); + VectorStoreFileBatch vectorStoreFileBatch = client.createVectorStoreFileBatch(vectorStore.getId(), + Arrays.asList(fileIds.get(0), fileIds.get(1)), + new VectorStoreAutoChunkingStrategyRequest()); + assertVectorStoreFileBatch(vectorStoreFileBatch, 2); + } + + @ParameterizedTest(name = DISPLAY_NAME_WITH_ARGUMENTS) + @MethodSource("com.azure.ai.openai.assistants.TestUtils#getTestParameters") + public void createVectorStoreFileBatchWithStaticChunkingStrategy(HttpClient httpClient, AssistantsServiceVersion serviceVersion) { + beforeTest(httpClient); + addFile(APPLE_FINANCIAL_STATEMENT); + VectorStoreFileBatch vectorStoreFileBatch = client.createVectorStoreFileBatch(vectorStore.getId(), + Arrays.asList(fileIds.get(0), fileIds.get(1)), + new VectorStoreStaticChunkingStrategyRequest( + new VectorStoreStaticChunkingStrategyOptions(101, 50))); + assertVectorStoreFileBatch(vectorStoreFileBatch, 2); + } + + @ParameterizedTest(name = DISPLAY_NAME_WITH_ARGUMENTS) + @MethodSource("com.azure.ai.openai.assistants.TestUtils#getTestParameters") + public void throwExceptionWhenOverrideExistChunkStrategyInBatch(HttpClient httpClient, AssistantsServiceVersion serviceVersion) { + beforeTest(httpClient); + addFile(APPLE_FINANCIAL_STATEMENT); + + VectorStoreFileBatch vectorStoreFileBatch = client.createVectorStoreFileBatch(vectorStore.getId(), + Arrays.asList(fileIds.get(0), fileIds.get(1)), + new VectorStoreStaticChunkingStrategyRequest( + new VectorStoreStaticChunkingStrategyOptions(101, 50))); + assertNotNull(vectorStoreFileBatch); - assertNotNull(vectorStoreFileBatch.getId()); - assertEquals(2, vectorStoreFileBatch.getFileCounts().getTotal()); + + assertThrows(HttpResponseException.class, () -> client.createVectorStoreFileBatch(vectorStore.getId(), + Arrays.asList(fileIds.get(0), fileIds.get(1)), + new VectorStoreAutoChunkingStrategyRequest() + )); } @ParameterizedTest(name = DISPLAY_NAME_WITH_ARGUMENTS) diff --git a/sdk/openai/azure-ai-openai-assistants/src/test/java/com/azure/ai/openai/assistants/VectorStoreTestBase.java b/sdk/openai/azure-ai-openai-assistants/src/test/java/com/azure/ai/openai/assistants/VectorStoreTestBase.java new file mode 100644 index 000000000000..85a8e953f2f1 --- /dev/null +++ b/sdk/openai/azure-ai-openai-assistants/src/test/java/com/azure/ai/openai/assistants/VectorStoreTestBase.java @@ -0,0 +1,57 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +package com.azure.ai.openai.assistants; + +import com.azure.ai.openai.assistants.models.VectorStoreFile; +import com.azure.ai.openai.assistants.models.VectorStoreFileBatch; +import com.azure.ai.openai.assistants.models.VectorStoreStaticChunkingStrategyOptions; +import com.azure.ai.openai.assistants.models.VectorStoreStaticChunkingStrategyResponse; +import com.azure.core.http.HttpClient; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; + +public abstract class VectorStoreTestBase extends AssistantsClientTestBase { + static final String APPLE_FINANCIAL_STATEMENT = "20220924_aapl_10k.pdf"; + static final String ALPHABET_FINANCIAL_STATEMENT = "20210203_alphabet_10K.pdf"; + + public abstract void updateVectorStoreName(HttpClient httpClient, AssistantsServiceVersion serviceVersion); + public abstract void getVectorStore(HttpClient httpClient, AssistantsServiceVersion serviceVersion); + public abstract void listVectorStore(HttpClient httpClient, AssistantsServiceVersion serviceVersion); + public abstract void createVectorStoreFile(HttpClient httpClient, AssistantsServiceVersion serviceVersion); + public abstract void createVectorStoreFileWithAutoChunkingStrategy(HttpClient httpClient, AssistantsServiceVersion serviceVersion); + public abstract void createVectorStoreFileWithStaticChunkingStrategy(HttpClient httpClient, AssistantsServiceVersion serviceVersion); + public abstract void throwExceptionWhenOverrideExistChunkStrategy(HttpClient httpClient, AssistantsServiceVersion serviceVersion); + public abstract void getVectorStoreFile(HttpClient httpClient, AssistantsServiceVersion serviceVersion); + public abstract void listVectorStoreFiles(HttpClient httpClient, AssistantsServiceVersion serviceVersion); + public abstract void deleteVectorStoreFile(HttpClient httpClient, AssistantsServiceVersion serviceVersion); + public abstract void createVectorStoreFileBatch(HttpClient httpClient, AssistantsServiceVersion serviceVersion); + public abstract void createVectorStoreFileBatchWithAutoChunkingStrategy(HttpClient httpClient, AssistantsServiceVersion serviceVersion); + public abstract void createVectorStoreFileBatchWithStaticChunkingStrategy(HttpClient httpClient, AssistantsServiceVersion serviceVersion); + public abstract void throwExceptionWhenOverrideExistChunkStrategyInBatch(HttpClient httpClient, AssistantsServiceVersion serviceVersion); + public abstract void getVectorStoreFileBatch(HttpClient httpClient, AssistantsServiceVersion serviceVersion); + public abstract void listVectorStoreFilesBatch(HttpClient httpClient, AssistantsServiceVersion serviceVersion); + public abstract void cancelVectorStoreFileBatch(HttpClient httpClient, AssistantsServiceVersion serviceVersion); + + + void assertVectorStoreFile(VectorStoreFile vectorStoreFile) { + assertNotNull(vectorStoreFile); + assertNotNull(vectorStoreFile.getId()); + } + + void assertVectorStoreFileBatch(VectorStoreFileBatch vectorStoreFileBatch, int fileCounts) { + assertNotNull(vectorStoreFileBatch); + assertNotNull(vectorStoreFileBatch.getId()); + assertEquals(fileCounts, vectorStoreFileBatch.getFileCounts().getTotal()); + } + + void assertStaticChunkingStrategy(VectorStoreFile vectorStoreFile, int maxChunkSizeTokens, int chunkOverlapTokens) { + VectorStoreStaticChunkingStrategyResponse chunkingStrategy = (VectorStoreStaticChunkingStrategyResponse) + vectorStoreFile.getChunkingStrategy(); + VectorStoreStaticChunkingStrategyOptions staticProperty = chunkingStrategy.getStaticProperty(); + assertNotNull(staticProperty); + assertEquals(maxChunkSizeTokens, staticProperty.getMaxChunkSizeTokens()); + assertEquals(chunkOverlapTokens, staticProperty.getChunkOverlapTokens()); + } +}