diff --git a/.dotnet/CHANGELOG.md b/.dotnet/CHANGELOG.md index d6940c24f..5f98233d4 100644 --- a/.dotnet/CHANGELOG.md +++ b/.dotnet/CHANGELOG.md @@ -15,6 +15,8 @@ ### Bugs Fixed +- Corrected an internal deserialization issue that caused recent updates to Assistants `file_search` to fail when streaming a run. Strongly typed support for `ranking_options` is not included but will arrive soon. (commit_hash) + ### Other Changes - Reverted the removal of the version path parameter "v1" from the default endpoint URL. (commit_hash) diff --git a/.dotnet/src/Generated/Models/InternalBatchRequestOutputResponse.Serialization.cs b/.dotnet/src/Generated/Models/InternalBatchRequestOutputResponse.Serialization.cs index 54280475f..5f48d8090 100644 --- a/.dotnet/src/Generated/Models/InternalBatchRequestOutputResponse.Serialization.cs +++ b/.dotnet/src/Generated/Models/InternalBatchRequestOutputResponse.Serialization.cs @@ -38,7 +38,19 @@ void IJsonModel.Write(Utf8JsonWriter writer, foreach (var item in Body) { writer.WritePropertyName(item.Key); - writer.WriteStringValue(item.Value); + if (item.Value == null) + { + writer.WriteNullValue(); + continue; + } +#if NET6_0_OR_GREATER + writer.WriteRawValue(item.Value); +#else + using (JsonDocument document = JsonDocument.Parse(item.Value)) + { + JsonSerializer.Serialize(writer, document.RootElement); + } +#endif } writer.WriteEndObject(); } @@ -86,7 +98,7 @@ internal static InternalBatchRequestOutputResponse DeserializeInternalBatchReque } int? statusCode = default; string requestId = default; - IReadOnlyDictionary body = default; + IReadOnlyDictionary body = default; IDictionary serializedAdditionalRawData = default; Dictionary rawDataDictionary = new Dictionary(); foreach (var property in element.EnumerateObject()) @@ -111,10 +123,17 @@ internal static InternalBatchRequestOutputResponse DeserializeInternalBatchReque { continue; } - Dictionary dictionary = new Dictionary(); + Dictionary dictionary = new Dictionary(); foreach (var property0 in property.Value.EnumerateObject()) { - dictionary.Add(property0.Name, property0.Value.GetString()); + if (property0.Value.ValueKind == JsonValueKind.Null) + { + dictionary.Add(property0.Name, null); + } + else + { + dictionary.Add(property0.Name, BinaryData.FromString(property0.Value.GetRawText())); + } } body = dictionary; continue; @@ -126,7 +145,7 @@ internal static InternalBatchRequestOutputResponse DeserializeInternalBatchReque } } serializedAdditionalRawData = rawDataDictionary; - return new InternalBatchRequestOutputResponse(statusCode, requestId, body ?? new ChangeTrackingDictionary(), serializedAdditionalRawData); + return new InternalBatchRequestOutputResponse(statusCode, requestId, body ?? new ChangeTrackingDictionary(), serializedAdditionalRawData); } BinaryData IPersistableModel.Write(ModelReaderWriterOptions options) diff --git a/.dotnet/src/Generated/Models/InternalBatchRequestOutputResponse.cs b/.dotnet/src/Generated/Models/InternalBatchRequestOutputResponse.cs index 2919fec21..8435f20dc 100644 --- a/.dotnet/src/Generated/Models/InternalBatchRequestOutputResponse.cs +++ b/.dotnet/src/Generated/Models/InternalBatchRequestOutputResponse.cs @@ -12,10 +12,10 @@ internal partial class InternalBatchRequestOutputResponse internal IDictionary SerializedAdditionalRawData { get; set; } internal InternalBatchRequestOutputResponse() { - Body = new ChangeTrackingDictionary(); + Body = new ChangeTrackingDictionary(); } - internal InternalBatchRequestOutputResponse(int? statusCode, string requestId, IReadOnlyDictionary body, IDictionary serializedAdditionalRawData) + internal InternalBatchRequestOutputResponse(int? statusCode, string requestId, IReadOnlyDictionary body, IDictionary serializedAdditionalRawData) { StatusCode = statusCode; RequestId = requestId; @@ -25,6 +25,6 @@ internal InternalBatchRequestOutputResponse(int? statusCode, string requestId, I public int? StatusCode { get; } public string RequestId { get; } - public IReadOnlyDictionary Body { get; } + public IReadOnlyDictionary Body { get; } } } diff --git a/.dotnet/src/Generated/Models/InternalRunStepDeltaStepDetailsToolCallsFileSearchObject.Serialization.cs b/.dotnet/src/Generated/Models/InternalRunStepDeltaStepDetailsToolCallsFileSearchObject.Serialization.cs index e9dd186c0..78a34b22e 100644 --- a/.dotnet/src/Generated/Models/InternalRunStepDeltaStepDetailsToolCallsFileSearchObject.Serialization.cs +++ b/.dotnet/src/Generated/Models/InternalRunStepDeltaStepDetailsToolCallsFileSearchObject.Serialization.cs @@ -38,7 +38,19 @@ void IJsonModel.Write( foreach (var item in FileSearch) { writer.WritePropertyName(item.Key); - writer.WriteStringValue(item.Value); + if (item.Value == null) + { + writer.WriteNullValue(); + continue; + } +#if NET6_0_OR_GREATER + writer.WriteRawValue(item.Value); +#else + using (JsonDocument document = JsonDocument.Parse(item.Value)) + { + JsonSerializer.Serialize(writer, document.RootElement); + } +#endif } writer.WriteEndObject(); } @@ -91,7 +103,7 @@ internal static InternalRunStepDeltaStepDetailsToolCallsFileSearchObject Deseria } int index = default; string id = default; - IReadOnlyDictionary fileSearch = default; + IReadOnlyDictionary fileSearch = default; string type = default; IDictionary serializedAdditionalRawData = default; Dictionary rawDataDictionary = new Dictionary(); @@ -109,10 +121,17 @@ internal static InternalRunStepDeltaStepDetailsToolCallsFileSearchObject Deseria } if (property.NameEquals("file_search"u8)) { - Dictionary dictionary = new Dictionary(); + Dictionary dictionary = new Dictionary(); foreach (var property0 in property.Value.EnumerateObject()) { - dictionary.Add(property0.Name, property0.Value.GetString()); + if (property0.Value.ValueKind == JsonValueKind.Null) + { + dictionary.Add(property0.Name, null); + } + else + { + dictionary.Add(property0.Name, BinaryData.FromString(property0.Value.GetRawText())); + } } fileSearch = dictionary; continue; diff --git a/.dotnet/src/Generated/Models/InternalRunStepDeltaStepDetailsToolCallsFileSearchObject.cs b/.dotnet/src/Generated/Models/InternalRunStepDeltaStepDetailsToolCallsFileSearchObject.cs index 6fcfc013c..e3db470bb 100644 --- a/.dotnet/src/Generated/Models/InternalRunStepDeltaStepDetailsToolCallsFileSearchObject.cs +++ b/.dotnet/src/Generated/Models/InternalRunStepDeltaStepDetailsToolCallsFileSearchObject.cs @@ -9,7 +9,7 @@ namespace OpenAI.Assistants { internal partial class InternalRunStepDeltaStepDetailsToolCallsFileSearchObject : InternalRunStepDeltaStepDetailsToolCallsObjectToolCallsObject { - internal InternalRunStepDeltaStepDetailsToolCallsFileSearchObject(int index, IReadOnlyDictionary fileSearch) + internal InternalRunStepDeltaStepDetailsToolCallsFileSearchObject(int index, IReadOnlyDictionary fileSearch) { Argument.AssertNotNull(fileSearch, nameof(fileSearch)); @@ -18,7 +18,7 @@ internal InternalRunStepDeltaStepDetailsToolCallsFileSearchObject(int index, IRe FileSearch = fileSearch; } - internal InternalRunStepDeltaStepDetailsToolCallsFileSearchObject(string type, IDictionary serializedAdditionalRawData, int index, string id, IReadOnlyDictionary fileSearch) : base(type, serializedAdditionalRawData) + internal InternalRunStepDeltaStepDetailsToolCallsFileSearchObject(string type, IDictionary serializedAdditionalRawData, int index, string id, IReadOnlyDictionary fileSearch) : base(type, serializedAdditionalRawData) { Index = index; Id = id; @@ -31,6 +31,6 @@ internal InternalRunStepDeltaStepDetailsToolCallsFileSearchObject() public int Index { get; } public string Id { get; } - public IReadOnlyDictionary FileSearch { get; } + public IReadOnlyDictionary FileSearch { get; } } } diff --git a/.dotnet/src/Generated/Models/InternalRunStepFileSearchToolCallDetails.Serialization.cs b/.dotnet/src/Generated/Models/InternalRunStepFileSearchToolCallDetails.Serialization.cs index e89d929f4..34d26af6a 100644 --- a/.dotnet/src/Generated/Models/InternalRunStepFileSearchToolCallDetails.Serialization.cs +++ b/.dotnet/src/Generated/Models/InternalRunStepFileSearchToolCallDetails.Serialization.cs @@ -33,7 +33,19 @@ void IJsonModel.Write(Utf8JsonWriter w foreach (var item in FileSearch) { writer.WritePropertyName(item.Key); - writer.WriteStringValue(item.Value); + if (item.Value == null) + { + writer.WriteNullValue(); + continue; + } +#if NET6_0_OR_GREATER + writer.WriteRawValue(item.Value); +#else + using (JsonDocument document = JsonDocument.Parse(item.Value)) + { + JsonSerializer.Serialize(writer, document.RootElement); + } +#endif } writer.WriteEndObject(); } @@ -85,7 +97,7 @@ internal static InternalRunStepFileSearchToolCallDetails DeserializeInternalRunS return null; } string id = default; - IReadOnlyDictionary fileSearch = default; + IReadOnlyDictionary fileSearch = default; string type = default; IDictionary serializedAdditionalRawData = default; Dictionary rawDataDictionary = new Dictionary(); @@ -98,10 +110,17 @@ internal static InternalRunStepFileSearchToolCallDetails DeserializeInternalRunS } if (property.NameEquals("file_search"u8)) { - Dictionary dictionary = new Dictionary(); + Dictionary dictionary = new Dictionary(); foreach (var property0 in property.Value.EnumerateObject()) { - dictionary.Add(property0.Name, property0.Value.GetString()); + if (property0.Value.ValueKind == JsonValueKind.Null) + { + dictionary.Add(property0.Name, null); + } + else + { + dictionary.Add(property0.Name, BinaryData.FromString(property0.Value.GetRawText())); + } } fileSearch = dictionary; continue; diff --git a/.dotnet/src/Generated/Models/InternalRunStepFileSearchToolCallDetails.cs b/.dotnet/src/Generated/Models/InternalRunStepFileSearchToolCallDetails.cs index 6be9fec00..f1593afd7 100644 --- a/.dotnet/src/Generated/Models/InternalRunStepFileSearchToolCallDetails.cs +++ b/.dotnet/src/Generated/Models/InternalRunStepFileSearchToolCallDetails.cs @@ -9,7 +9,7 @@ namespace OpenAI.Assistants { internal partial class InternalRunStepFileSearchToolCallDetails : RunStepToolCall { - internal InternalRunStepFileSearchToolCallDetails(string id, IReadOnlyDictionary fileSearch) + internal InternalRunStepFileSearchToolCallDetails(string id, IReadOnlyDictionary fileSearch) { Argument.AssertNotNull(id, nameof(id)); Argument.AssertNotNull(fileSearch, nameof(fileSearch)); @@ -19,7 +19,7 @@ internal InternalRunStepFileSearchToolCallDetails(string id, IReadOnlyDictionary FileSearch = fileSearch; } - internal InternalRunStepFileSearchToolCallDetails(string type, IDictionary serializedAdditionalRawData, string id, IReadOnlyDictionary fileSearch) : base(type, serializedAdditionalRawData) + internal InternalRunStepFileSearchToolCallDetails(string type, IDictionary serializedAdditionalRawData, string id, IReadOnlyDictionary fileSearch) : base(type, serializedAdditionalRawData) { Id = id; FileSearch = fileSearch; @@ -30,6 +30,6 @@ internal InternalRunStepFileSearchToolCallDetails() } public string Id { get; } - public IReadOnlyDictionary FileSearch { get; } + public IReadOnlyDictionary FileSearch { get; } } } diff --git a/.dotnet/tests/Assistants/AssistantTests.cs b/.dotnet/tests/Assistants/AssistantTests.cs index 898c4299b..921d436a3 100644 --- a/.dotnet/tests/Assistants/AssistantTests.cs +++ b/.dotnet/tests/Assistants/AssistantTests.cs @@ -1,6 +1,5 @@ using NUnit.Framework; using OpenAI.Assistants; -using OpenAI.Chat; using OpenAI.Files; using OpenAI.VectorStores; using System; @@ -9,7 +8,6 @@ using System.Collections.Generic; using System.Diagnostics; using System.Linq; -using System.Numerics; using System.Threading; using System.Threading.Tasks; using static OpenAI.Tests.TestHelpers; @@ -679,6 +677,67 @@ This file describes the favorite foods of several people. Assert.That(hasCake, Is.True); } + [Test] + public async Task BasicFileSearchStreamingWorks() + { + const string fileContent = """ + The favorite food of several people: + - Summanus Ferdinand: tacos + - Tekakwitha Effie: pizza + - Filip Carola: cake + """; + + const string fileName = "favorite_foods.txt"; + + FileClient fileClient = GetTestClient(TestScenario.Files); + AssistantClient client = GetTestClient(TestScenario.Assistants); + + // First, upload a simple test file. + OpenAIFileInfo testFile = fileClient.UploadFile(BinaryData.FromString(fileContent), fileName, FileUploadPurpose.Assistants); + Validate(testFile); + + // Create an assistant, using the creation helper to make a new vector store. + AssistantCreationOptions assistantCreationOptions = new() + { + Tools = { new FileSearchToolDefinition() }, + ToolResources = new() + { + FileSearch = new() + { + NewVectorStores = { new VectorStoreCreationHelper([testFile.Id]) } + } + } + }; + Assistant assistant = client.CreateAssistant("gpt-4o-mini", assistantCreationOptions); + Validate(assistant); + + Assert.That(assistant.ToolResources?.FileSearch?.VectorStoreIds, Has.Count.EqualTo(1)); + string vectorStoreId = assistant.ToolResources.FileSearch.VectorStoreIds[0]; + _vectorStoreIdsToDelete.Add(vectorStoreId); + + // Create a thread. + ThreadCreationOptions threadCreationOptions = new() + { + InitialMessages = { "Using the files you have available, what's Filip's favorite food?" } + }; + AssistantThread thread = client.CreateThread(threadCreationOptions); + Validate(thread); + + // Create run and stream the results. + AsyncCollectionResult streamingResult = client.CreateRunStreamingAsync(thread.Id, assistant.Id); + string message = string.Empty; + + await foreach (StreamingUpdate update in streamingResult) + { + if (update is MessageContentUpdate contentUpdate) + { + message += $"{contentUpdate.Text}"; + } + } + + Assert.That(message, Does.Contain("cake")); + } + [Test] public async Task Pagination_CanEnumerateAssistants() { diff --git a/.openapi3/openapi3-openai.yaml b/.openapi3/openapi3-openai.yaml index 93bdf855a..601dc0dca 100644 --- a/.openapi3/openapi3-openai.yaml +++ b/.openapi3/openapi3-openai.yaml @@ -2879,8 +2879,7 @@ components: description: An unique identifier for the OpenAI API request. Please include this request ID when contacting support. body: type: object - additionalProperties: - type: string + additionalProperties: {} description: The JSON body of the response x-oaiTypeLabel: map nullable: true @@ -8261,8 +8260,7 @@ components: description: The type of tool call. This is always going to be `file_search` for this type of tool call. file_search: type: object - additionalProperties: - type: string + additionalProperties: {} description: For now, this is always going to be an empty object. x-oaiTypeLabel: map allOf: @@ -8460,8 +8458,7 @@ components: description: The type of tool call. This is always going to be `file_search` for this type of tool call. file_search: type: object - additionalProperties: - type: string + additionalProperties: {} description: For now, this is always going to be an empty object. x-oaiTypeLabel: map allOf: diff --git a/.typespec/assistants/models.tsp b/.typespec/assistants/models.tsp index 9eda287ad..e3e9737ef 100644 --- a/.typespec/assistants/models.tsp +++ b/.typespec/assistants/models.tsp @@ -92,6 +92,7 @@ model CreateAssistantRequest { file_search?: ToolResourcesFileSearch; } | null; + // Tool customization: specialize known metadata string maps /** Set of 16 key-value pairs that can be attached to an object. This can be useful for storing additional information about the object in a structured format. Keys can be a maximum of 64 characters long and values can be a maxium of 512 characters long. */ @extension("x-oaiTypeLabel", "map") metadata?: Record | null; @@ -153,6 +154,7 @@ model ModifyAssistantRequest { file_search?: ToolResourcesFileSearchIdsOnly; } | null; + // Tool customization: specialize known metadata string maps /** Set of 16 key-value pairs that can be attached to an object. This can be useful for storing additional information about the object in a structured format. Keys can be a maximum of 64 characters long and values can be a maxium of 512 characters long. */ @extension("x-oaiTypeLabel", "map") metadata?: Record | null; @@ -291,6 +293,7 @@ model AssistantObject { file_search?: ToolResourcesFileSearchIdsOnly; } | null; + // Tool customization: specialize known metadata string maps /** Set of 16 key-value pairs that can be attached to an object. This can be useful for storing additional information about the object in a structured format. Keys can be a maximum of 64 characters long and values can be a maxium of 512 characters long. */ @extension("x-oaiTypeLabel", "map") metadata: Record | null; diff --git a/.typespec/batch/models.tsp b/.typespec/batch/models.tsp index b2fa2e7fe..a375bb0ca 100644 --- a/.typespec/batch/models.tsp +++ b/.typespec/batch/models.tsp @@ -120,6 +120,7 @@ model Batch { failed: int32; }; + // Tool customization: specialize known metadata string maps /** Set of 16 key-value pairs that can be attached to an object. This can be useful for storing additional information about the object in a structured format. Keys can be a maximum of 64 characters long and values can be a maxium of 512 characters long. */ @extension("x-oaiTypeLabel", "map") metadata?: Record | null; @@ -158,7 +159,7 @@ model BatchRequestOutput { /** The JSON body of the response */ @extension("x-oaiTypeLabel", "map") - body?: Record; + body?: Record; } | null; /** For requests that failed with a non-HTTP error, this will contain more information on the cause of the failure. */ diff --git a/.typespec/messages/models.tsp b/.typespec/messages/models.tsp index d3bfe66e2..8529ca4f0 100644 --- a/.typespec/messages/models.tsp +++ b/.typespec/messages/models.tsp @@ -47,12 +47,14 @@ model CreateMessageRequest { /** A list of files attached to the message, and the tools they should be added to. */ attachments?: CreateMessageRequestAttachments | null; + // Tool customization: specialize known metadata string maps /** Set of 16 key-value pairs that can be attached to an object. This can be useful for storing additional information about the object in a structured format. Keys can be a maximum of 64 characters long and values can be a maxium of 512 characters long. */ @extension("x-oaiTypeLabel", "map") metadata?: Record | null; } model ModifyMessageRequest { + // Tool customization: specialize known metadata string maps /** Set of 16 key-value pairs that can be attached to an object. This can be useful for storing additional information about the object in a structured format. Keys can be a maximum of 64 characters long and values can be a maxium of 512 characters long. */ @extension("x-oaiTypeLabel", "map") metadata?: Record | null; @@ -139,6 +141,7 @@ model MessageObject { /** A list of files attached to the message, and the tools they were added to. */ attachments: MessageObjectAttachments | null; + // Tool customization: specialize known metadata string maps /** Set of 16 key-value pairs that can be attached to an object. This can be useful for storing additional information about the object in a structured format. Keys can be a maximum of 64 characters long and values can be a maxium of 512 characters long. */ @extension("x-oaiTypeLabel", "map") metadata: Record | null; diff --git a/.typespec/runs/models.tsp b/.typespec/runs/models.tsp index 8de731324..7c037e38e 100644 --- a/.typespec/runs/models.tsp +++ b/.typespec/runs/models.tsp @@ -71,6 +71,7 @@ model CreateRunRequest { /** Override the tools the assistant can use for this run. This is useful for modifying the behavior on a per-run basis. */ tools?: CreateRunRequestTools | null; + // Tool customization: specialize known metadata string maps /** Set of 16 key-value pairs that can be attached to an object. This can be useful for storing additional information about the object in a structured format. Keys can be a maximum of 64 characters long and values can be a maxium of 512 characters long. */ @extension("x-oaiTypeLabel", "map") metadata?: Record | null; @@ -113,6 +114,7 @@ model CreateRunRequest { } model ModifyRunRequest { + // Tool customization: specialize known metadata string maps /** Set of 16 key-value pairs that can be attached to an object. This can be useful for storing additional information about the object in a structured format. Keys can be a maximum of 64 characters long and values can be a maxium of 512 characters long. */ @extension("x-oaiTypeLabel", "map") metadata?: Record | null; @@ -177,6 +179,7 @@ model CreateThreadAndRunRequest { file_search?: ToolResourcesFileSearchIdsOnly; } | null; + // Tool customization: specialize known metadata string maps /** Set of 16 key-value pairs that can be attached to an object. This can be useful for storing additional information about the object in a structured format. Keys can be a maximum of 64 characters long and values can be a maxium of 512 characters long. */ @extension("x-oaiTypeLabel", "map") metadata?: Record | null; @@ -352,7 +355,7 @@ model RunStepDetailsToolCallsFileSearchObject /** For now, this is always going to be an empty object. */ @extension("x-oaiTypeLabel", "map") - file_search: Record; + file_search: Record; } // Tool customization: apply custom, common base type to union items @@ -518,6 +521,7 @@ model RunObject { @extension("x-oaiExpandable", true) tools: AssistantToolDefinition[] = #[]; + // Tool customization: specialize known metadata string maps /** Set of 16 key-value pairs that can be attached to an object. This can be useful for storing additional information about the object in a structured format. Keys can be a maximum of 64 characters long and values can be a maxium of 512 characters long. */ @extension("x-oaiTypeLabel", "map") metadata: Record | null; @@ -616,6 +620,7 @@ model RunStepObject { @encode("unixTimestamp", int32) completed_at: utcDateTime | null; + // Tool customization: specialize known metadata string maps /** Set of 16 key-value pairs that can be attached to an object. This can be useful for storing additional information about the object in a structured format. Keys can be a maximum of 64 characters long and values can be a maxium of 512 characters long. */ @extension("x-oaiTypeLabel", "map") metadata: Record | null; @@ -771,7 +776,7 @@ model RunStepDeltaStepDetailsToolCallsFileSearchObject /** For now, this is always going to be an empty object. */ @extension("x-oaiTypeLabel", "map") - file_search: Record; + file_search: Record; } // Tool customization: apply custom, common base type to union items diff --git a/.typespec/threads/models.tsp b/.typespec/threads/models.tsp index aad860a05..71a42144e 100644 --- a/.typespec/threads/models.tsp +++ b/.typespec/threads/models.tsp @@ -30,6 +30,7 @@ model CreateThreadRequest { file_search?: ToolResourcesFileSearch; } | null; + // Tool customization: specialize known metadata string maps /** Set of 16 key-value pairs that can be attached to an object. This can be useful for storing additional information about the object in a structured format. Keys can be a maximum of 64 characters long and values can be a maxium of 512 characters long. */ @extension("x-oaiTypeLabel", "map") metadata?: Record | null; @@ -52,6 +53,7 @@ model ModifyThreadRequest { file_search?: ToolResourcesFileSearchIdsOnly; } | null; + // Tool customization: specialize known metadata string maps /** Set of 16 key-value pairs that can be attached to an object. This can be useful for storing additional information about the object in a structured format. Keys can be a maximum of 64 characters long and values can be a maxium of 512 characters long. */ @extension("x-oaiTypeLabel", "map") metadata?: Record | null; @@ -96,6 +98,7 @@ model ThreadObject { }; } | null; + // Tool customization: specialize known metadata string maps /** Set of 16 key-value pairs that can be attached to an object. This can be useful for storing additional information about the object in a structured format. Keys can be a maximum of 64 characters long and values can be a maxium of 512 characters long. */ @extension("x-oaiTypeLabel", "map") metadata: Record | null; diff --git a/.typespec/vector-stores/models.tsp b/.typespec/vector-stores/models.tsp index c24a9f21f..4d923b2ba 100644 --- a/.typespec/vector-stores/models.tsp +++ b/.typespec/vector-stores/models.tsp @@ -79,6 +79,7 @@ model VectorStoreObject { @encode("unixTimestamp", int32) last_active_at: utcDateTime | null; + // Tool customization: specialize known metadata string maps /** Set of 16 key-value pairs that can be attached to an object. This can be useful for storing additional information about the object in a structured format. Keys can be a maximum of 64 characters long and values can be a maxium of 512 characters long. */ @extension("x-oaiTypeLabel", "map") metadata: Record | null; @@ -102,6 +103,7 @@ model CreateVectorStoreRequest { @extension("x-oaiExpandable", true) chunking_strategy?: AutoChunkingStrategyRequestParam | StaticChunkingStrategyRequestParam; + // Tool customization: specialize known metadata string maps /** Set of 16 key-value pairs that can be attached to an object. This can be useful for storing additional information about the object in a structured format. Keys can be a maximum of 64 characters long and values can be a maxium of 512 characters long. */ @extension("x-oaiTypeLabel", "map") metadata?: Record | null; @@ -113,6 +115,7 @@ model UpdateVectorStoreRequest { expires_after?: VectorStoreExpirationAfter | null; + // Tool customization: specialize known metadata string maps /** Set of 16 key-value pairs that can be attached to an object. This can be useful for storing additional information about the object in a structured format. Keys can be a maximum of 64 characters long and values can be a maxium of 512 characters long. */ @extension("x-oaiTypeLabel", "map") metadata?: Record | null;