From 9af03668253fc7f40dc9f9f46863132c0746d6cd Mon Sep 17 00:00:00 2001 From: raulraja Date: Fri, 17 May 2024 12:43:31 +0200 Subject: [PATCH] Support assistants v2 (only function calls tested which is our most immediate need) (file search and code interpreter untested) --- .../xef/llm/assistants/Assistant.kt | 51 +++++++++++++----- .../xef/llm/assistants/AssistantRequest.kt | 9 ++-- .../xef/llm/assistants/AssistantThread.kt | 52 ++++++++++++------- .../functional/xef/llm/assistants/RunDelta.kt | 7 ++- .../xef/evaluator/models/ModelsPricing.kt | 9 ++++ .../xef/assistants/AssistantStreaming.kt | 7 ++- .../xebia/functional/xef/assistants/DSL.kt | 2 +- .../xef/assistants/LoadFromYamlConfig.kt | 11 ++-- .../xef/assistants/ToolsWithDescriptions.kt | 7 --- .../functional/xef/dsl/chat/SealedClasses.kt | 2 +- .../OpenTelemetryAssistantState.kt | 10 ++-- ...AssistantRequestToolResourcesFileSearch.kt | 9 ++++ ...ateThreadRequestToolResourcesFileSearch.kt | 9 ++++ .../generator/.openapi-generator-ignore | 4 +- .../openai/generator/KMMGeneratorConfig.java | 2 +- 15 files changed, 133 insertions(+), 58 deletions(-) create mode 100644 openai-client/client/src/commonMain/kotlin/com/xebia/functional/openai/generated/model/CreateAssistantRequestToolResourcesFileSearch.kt create mode 100644 openai-client/client/src/commonMain/kotlin/com/xebia/functional/openai/generated/model/CreateThreadRequestToolResourcesFileSearch.kt diff --git a/core/src/commonMain/kotlin/com/xebia/functional/xef/llm/assistants/Assistant.kt b/core/src/commonMain/kotlin/com/xebia/functional/xef/llm/assistants/Assistant.kt index 48053d436..0c12198d1 100644 --- a/core/src/commonMain/kotlin/com/xebia/functional/xef/llm/assistants/Assistant.kt +++ b/core/src/commonMain/kotlin/com/xebia/functional/xef/llm/assistants/Assistant.kt @@ -74,12 +74,12 @@ class Assistant( @Serializable data class ToolOutput(val schema: JsonObject, val result: JsonElement) suspend operator fun invoke( - model: String, + model: CreateAssistantRequestModel, name: String? = null, description: String? = null, instructions: String? = null, tools: List = arrayListOf(), - fileIds: List = arrayListOf(), + toolResources: CreateAssistantRequestToolResources? = null, metadata: JsonObject? = null, toolsConfig: List> = emptyList(), config: Config = Config(), @@ -92,7 +92,7 @@ class Assistant( description = description, instructions = instructions, tools = tools, - fileIds = fileIds, + toolResources = toolResources, metadata = metadata ), toolsConfig, @@ -117,10 +117,23 @@ class Assistant( assistantsApi: Assistants = OpenAI(config, logRequests = true).assistants, ): Assistant { val parsed = Yaml.Default.decodeYamlMapFromString(request) + val fileIds = parsed["file_ids"]?.let { (it as List<*>).map { it.toString() } } + val vectorStoreIds = parsed["vector_store_ids"]?.let { (it as List<*>).map { it.toString() } } + val toolResourcesRequest = + CreateAssistantRequestToolResources( + codeInterpreter = + fileIds?.let { CreateAssistantRequestToolResourcesCodeInterpreter(fileIds = it) }, + fileSearch = + vectorStoreIds?.let { + CreateAssistantRequestToolResourcesFileSearch(vectorStoreIds = it) + } + ) val assistantRequest = AssistantRequest( assistantId = parsed["assistant_id"]?.literalContentOrNull, - model = parsed["model"]?.literalContentOrNull ?: error("model is required"), + model = + parsed["model"]?.literalContentOrNull?.let { CreateAssistantRequestModel.Custom(it) } + ?: error("model is required"), name = parsed["name"]?.literalContentOrNull, description = parsed["description"]?.literalContentOrNull, instructions = @@ -164,8 +177,7 @@ class Assistant( } } }, - fileIds = - parsed["file_ids"]?.let { (it as List<*>).map { it.toString() } } ?: emptyList(), + toolResources = toolResourcesRequest, ) return if (assistantRequest.assistantId != null) { val assistant = @@ -178,12 +190,24 @@ class Assistant( assistant.modify( ModifyAssistantRequest( - model = assistantRequest.model, + model = assistantRequest.model.value, name = assistantRequest.name, description = assistantRequest.description, instructions = assistantRequest.instructions, tools = assistantTools(assistantRequest), - fileIds = assistantRequest.fileIds, + toolResources = + assistantRequest.toolResources?.let { + ModifyAssistantRequestToolResources( + codeInterpreter = + it.codeInterpreter?.let { + ModifyAssistantRequestToolResourcesCodeInterpreter(fileIds = it.fileIds) + }, + fileSearch = + ModifyAssistantRequestToolResourcesFileSearch( + vectorStoreIds = it.fileSearch?.vectorStoreIds + ) + ) + }, metadata = null // assistantRequest.metadata ) ) @@ -196,8 +220,11 @@ class Assistant( description = assistantRequest.description, instructions = assistantRequest.instructions, tools = assistantTools(assistantRequest), - fileIds = assistantRequest.fileIds, - metadata = null // assistantRequest.metadata + toolResources = assistantRequest.toolResources, + metadata = + assistantRequest.metadata + ?.map { (k, v) -> k to JsonPrimitive(v) } + ?.let { JsonObject(it.toMap()) } ), toolsConfig = toolsConfig, config = config, @@ -215,8 +242,8 @@ class Assistant( AssistantToolsCode(type = AssistantToolsCode.Type.code_interpreter) ) is AssistantTool.Retrieval -> - AssistantObjectToolsInner.CaseAssistantToolsRetrieval( - AssistantToolsRetrieval(type = AssistantToolsRetrieval.Type.retrieval) + AssistantObjectToolsInner.CaseAssistantToolsFileSearch( + AssistantToolsFileSearch(type = AssistantToolsFileSearch.Type.file_search) ) is AssistantTool.Function -> AssistantObjectToolsInner.CaseAssistantToolsFunction( diff --git a/core/src/commonMain/kotlin/com/xebia/functional/xef/llm/assistants/AssistantRequest.kt b/core/src/commonMain/kotlin/com/xebia/functional/xef/llm/assistants/AssistantRequest.kt index c3d666aa8..16d50f0b4 100644 --- a/core/src/commonMain/kotlin/com/xebia/functional/xef/llm/assistants/AssistantRequest.kt +++ b/core/src/commonMain/kotlin/com/xebia/functional/xef/llm/assistants/AssistantRequest.kt @@ -1,5 +1,7 @@ package com.xebia.functional.xef.llm.assistants +import com.xebia.functional.openai.generated.model.CreateAssistantRequestModel +import com.xebia.functional.openai.generated.model.CreateAssistantRequestToolResources import kotlinx.serialization.Required import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable @@ -7,7 +9,7 @@ import kotlinx.serialization.Serializable @Serializable data class AssistantRequest( @SerialName(value = "assistant_id") val assistantId: String? = null, - @SerialName(value = "model") @Required val model: String, + @SerialName(value = "model") @Required val model: CreateAssistantRequestModel, /* The name of the assistant. The maximum length is 256 characters. */ @SerialName(value = "name") val name: String? = null, @@ -20,9 +22,8 @@ data class AssistantRequest( /* A list of tool enabled on the assistant. There can be a maximum of 128 tools per assistant. Tools can be of types `code_interpreter`, `retrieval`, or `function`. */ @SerialName(value = "tools") val tools: List? = arrayListOf(), - - /* A list of [file](/docs/api-reference/files) IDs attached to this assistant. There can be a maximum of 20 files attached to the assistant. Files are ordered by their creation date in ascending order. */ - @SerialName(value = "file_ids") val fileIds: List? = arrayListOf(), + @SerialName(value = "tool_resources") + val toolResources: CreateAssistantRequestToolResources? = null, /* 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. */ @SerialName(value = "metadata") val metadata: Map? = null diff --git a/core/src/commonMain/kotlin/com/xebia/functional/xef/llm/assistants/AssistantThread.kt b/core/src/commonMain/kotlin/com/xebia/functional/xef/llm/assistants/AssistantThread.kt index 9f6851d49..37b442da9 100644 --- a/core/src/commonMain/kotlin/com/xebia/functional/xef/llm/assistants/AssistantThread.kt +++ b/core/src/commonMain/kotlin/com/xebia/functional/xef/llm/assistants/AssistantThread.kt @@ -32,13 +32,18 @@ class AssistantThread( request = CreateMessageRequest( role = CreateMessageRequest.Role.user, - content = message.content, - fileIds = message.fileIds + content = CreateMessageRequestContent.CaseString(message.content), + attachments = message.fileIds.map { MessageObjectAttachmentsInner(fileId = it) } ), ) suspend fun createMessage(content: String): MessageObject = - createMessage(CreateMessageRequest(role = CreateMessageRequest.Role.user, content = content)) + createMessage( + CreateMessageRequest( + role = CreateMessageRequest.Role.user, + content = CreateMessageRequestContent.CaseString(content) + ) + ) suspend fun createMessage(request: CreateMessageRequest): MessageObject = api.createMessage(threadId, request, configure = ::defaultConfig) @@ -144,6 +149,7 @@ class AssistantThread( RunObject.Status.failed -> RunDelta.RunFailed(run) RunObject.Status.completed -> RunDelta.RunCompleted(run) RunObject.Status.expired -> RunDelta.RunExpired(run) + RunObject.Status.incomplete -> RunDelta.RunIncomplete(run) } flowCollector.emit(finalEvent) run @@ -206,9 +212,9 @@ class AssistantThread( companion object { - /** Support for OpenAI-Beta: assistants=v1 */ + /** Support for OpenAI-Beta: assistants=v2 */ fun defaultConfig(httpRequestBuilder: HttpRequestBuilder): Unit { - httpRequestBuilder.header("OpenAI-Beta", "assistants=v1") + httpRequestBuilder.header("OpenAI-Beta", "assistants=v2") } @JvmName("createWithMessagesAndFiles") @@ -225,14 +231,15 @@ class AssistantThread( .createThread( createThreadRequest = CreateThreadRequest( - messages.map { - CreateMessageRequest( - role = CreateMessageRequest.Role.user, - content = it.content, - fileIds = it.fileIds - ) - }, - metadata + messages = + messages.map { + CreateMessageRequest( + role = CreateMessageRequest.Role.user, + content = CreateMessageRequestContent.CaseString(it.content), + attachments = it.fileIds.map { MessageObjectAttachmentsInner(fileId = it) } + ) + }, + metadata = metadata ), configure = ::defaultConfig ) @@ -255,10 +262,14 @@ class AssistantThread( .createThread( createThreadRequest = CreateThreadRequest( - messages.map { - CreateMessageRequest(role = CreateMessageRequest.Role.user, content = it) - }, - metadata + messages = + messages.map { + CreateMessageRequest( + role = CreateMessageRequest.Role.user, + content = CreateMessageRequestContent.CaseString(it) + ) + }, + metadata = metadata ), configure = ::defaultConfig ) @@ -277,7 +288,12 @@ class AssistantThread( api: Assistants = OpenAI(config).assistants ): AssistantThread = AssistantThread( - api.createThread(CreateThreadRequest(messages, metadata), configure = ::defaultConfig).id, + api + .createThread( + CreateThreadRequest(messages = messages, metadata = metadata), + configure = ::defaultConfig + ) + .id, metric, config, api diff --git a/core/src/commonMain/kotlin/com/xebia/functional/xef/llm/assistants/RunDelta.kt b/core/src/commonMain/kotlin/com/xebia/functional/xef/llm/assistants/RunDelta.kt index 24315c5cb..fec396e02 100644 --- a/core/src/commonMain/kotlin/com/xebia/functional/xef/llm/assistants/RunDelta.kt +++ b/core/src/commonMain/kotlin/com/xebia/functional/xef/llm/assistants/RunDelta.kt @@ -46,6 +46,9 @@ sealed interface RunDelta { /** [RunDeltaEvent.thread_run_expired] */ @JvmInline @Serializable value class RunExpired(val run: RunObject) : RunDelta + /** [RunDeltaEvent.thread_run_incomplete] */ + @JvmInline @Serializable value class RunIncomplete(val run: RunObject) : RunDelta + /** [RunDeltaEvent.thread_run_step_created] */ @JvmInline @Serializable value class RunStepCreated(val runStep: RunStepObject) : RunDelta @@ -246,8 +249,8 @@ sealed interface RunDelta { val function = it.value.function "Function: ${function.name}(${function.arguments})" } - is RunStepDetailsToolCallsObjectToolCallsInner.CaseRunStepDetailsToolCallsRetrievalObject -> { - val retrieval = it.value.retrieval + is RunStepDetailsToolCallsObjectToolCallsInner.CaseRunStepDetailsToolCallsFileSearchObject -> { + val retrieval = it.value.fileSearch "Retrieval: $retrieval" } } diff --git a/evaluator/src/main/kotlin/com/xebia/functional/xef/evaluator/models/ModelsPricing.kt b/evaluator/src/main/kotlin/com/xebia/functional/xef/evaluator/models/ModelsPricing.kt index 124148c84..49919f4bf 100644 --- a/evaluator/src/main/kotlin/com/xebia/functional/xef/evaluator/models/ModelsPricing.kt +++ b/evaluator/src/main/kotlin/com/xebia/functional/xef/evaluator/models/ModelsPricing.kt @@ -15,6 +15,15 @@ data class ModelsPricing( // The pricing for the models was updated the May 2st, 2024 // Be sure to update the pricing for each model + // GPT-4o Input token price: $5.00, Output token price: $15.00 per 1M Tokens. + val gpt4o = + ModelsPricing( + modelName = "gpt-4o", + currency = "USD", + input = ModelsPricingItem(5.0, oneMillion), + output = ModelsPricingItem(15.0, oneMillion) + ) + val gpt4Turbo = ModelsPricing( modelName = "gpt-4-turbo", diff --git a/examples/src/main/kotlin/com/xebia/functional/xef/assistants/AssistantStreaming.kt b/examples/src/main/kotlin/com/xebia/functional/xef/assistants/AssistantStreaming.kt index a5dc63842..86a47af65 100644 --- a/examples/src/main/kotlin/com/xebia/functional/xef/assistants/AssistantStreaming.kt +++ b/examples/src/main/kotlin/com/xebia/functional/xef/assistants/AssistantStreaming.kt @@ -1,6 +1,7 @@ package com.xebia.functional.xef.assistants import com.xebia.functional.openai.generated.model.CreateRunRequest +import com.xebia.functional.xef.Config import com.xebia.functional.xef.OpenAI import com.xebia.functional.xef.llm.assistants.Assistant import com.xebia.functional.xef.llm.assistants.AssistantThread @@ -14,10 +15,12 @@ suspend fun main() { val assistant = Assistant( - assistantId = "asst_UxczzpJkysC0l424ood87DAk", + assistantId = "asst_BwQvmWIbGUMDvCuXOtAFH8B6", toolsConfig = listOf(Tool.toolOf(SumTool())) ) - val thread = AssistantThread(api = OpenAI().assistants, metric = metric) + val config = Config(org = null) + val api = OpenAI(config = config, logRequests = true).assistants + val thread = AssistantThread(api = api, metric = metric) println("Welcome to the Math tutor, ask me anything about math:") val userInput = "What is 1+1, explain all the steps and tools you used to solve it." thread.createMessage(userInput) diff --git a/examples/src/main/kotlin/com/xebia/functional/xef/assistants/DSL.kt b/examples/src/main/kotlin/com/xebia/functional/xef/assistants/DSL.kt index ff00ac381..dbeed2ef6 100644 --- a/examples/src/main/kotlin/com/xebia/functional/xef/assistants/DSL.kt +++ b/examples/src/main/kotlin/com/xebia/functional/xef/assistants/DSL.kt @@ -47,7 +47,7 @@ suspend fun main() { val assistant = Assistant( - assistantId = "asst_UxczzpJkysC0l424ood87DAk", + assistantId = "asst_BwQvmWIbGUMDvCuXOtAFH8B6", toolsConfig = listOf(Tool.toolOf(SumTool())) ) val thread = AssistantThread(api = OpenAI(logRequests = false).assistants, metric = metric) diff --git a/examples/src/main/kotlin/com/xebia/functional/xef/assistants/LoadFromYamlConfig.kt b/examples/src/main/kotlin/com/xebia/functional/xef/assistants/LoadFromYamlConfig.kt index 94921fbcb..505d8472b 100644 --- a/examples/src/main/kotlin/com/xebia/functional/xef/assistants/LoadFromYamlConfig.kt +++ b/examples/src/main/kotlin/com/xebia/functional/xef/assistants/LoadFromYamlConfig.kt @@ -12,13 +12,14 @@ suspend fun main() { // FilesApi.PurposeCreateFile.assistants // ) // .body() - val fileId = "file-q77cZu6e6sC2TsYbUs8UX5Dj" + // val fileId = "file-q77cZu6e6sC2TsYbUs8UX5Dj" // remove assistant id to create a new one + // assistant_id: "asst_ImCKap37lLHBqV1awa0kzjZ3" // language=yaml val yamlConfig = """ - assistant_id: "asst_ImCKap37lLHBqV1awa0kzjZ3" - model: "gpt-4-1106-preview" + + model: "gpt-4o" name: "My Custom Test Assistant" description: "A versatile AI assistant capable of conversational and informational tasks." instructions: "This assistant is designed to provide informative and engaging conversations, answer queries, and execute code when necessary." @@ -27,8 +28,6 @@ suspend fun main() { - type: "retrieval" - type: "function" name: "SumTool" - file_ids: - - "$fileId" metadata: version: "1.0" created_by: "OpenAI" @@ -42,6 +41,6 @@ suspend fun main() { val assistantInfo = assistant.get() println("assistant: $assistantInfo") val thread = AssistantThread() - thread.createMessage(MessageWithFiles("What does this file say?", listOf(fileId))) + thread.createMessage(MessageWithFiles("What is 1 + 1? Use SumTool", emptyList())) thread.run(assistant).collect(RunDelta::printEvent) } diff --git a/examples/src/main/kotlin/com/xebia/functional/xef/assistants/ToolsWithDescriptions.kt b/examples/src/main/kotlin/com/xebia/functional/xef/assistants/ToolsWithDescriptions.kt index cb9a573e0..58ee18402 100644 --- a/examples/src/main/kotlin/com/xebia/functional/xef/assistants/ToolsWithDescriptions.kt +++ b/examples/src/main/kotlin/com/xebia/functional/xef/assistants/ToolsWithDescriptions.kt @@ -1,9 +1,6 @@ package com.xebia.functional.xef.assistants import com.xebia.functional.xef.conversation.Description -import com.xebia.functional.xef.llm.assistants.Assistant -import com.xebia.functional.xef.llm.assistants.AssistantThread -import com.xebia.functional.xef.llm.assistants.RunDelta import com.xebia.functional.xef.llm.assistants.Tool import kotlinx.serialization.Serializable @@ -30,7 +27,3 @@ suspend fun main() { val toolConfig = Tool.toolOf(SumToolWithDescription()).functionObject println(toolConfig.parameters) } - -private suspend fun runAssistantAndDisplayResults(thread: AssistantThread, assistant: Assistant) { - thread.run(assistant).collect(RunDelta::printEvent) -} diff --git a/examples/src/main/kotlin/com/xebia/functional/xef/dsl/chat/SealedClasses.kt b/examples/src/main/kotlin/com/xebia/functional/xef/dsl/chat/SealedClasses.kt index b9383f99c..f942ed9e5 100644 --- a/examples/src/main/kotlin/com/xebia/functional/xef/dsl/chat/SealedClasses.kt +++ b/examples/src/main/kotlin/com/xebia/functional/xef/dsl/chat/SealedClasses.kt @@ -14,6 +14,6 @@ sealed class Response { } suspend fun main() { - val response = AI("Capital of France?") + val response = AI("What is the capital of France?") println(response) // City(name=Paris) } diff --git a/integrations/opentelemetry/src/main/kotlin/com/xebia/functional/xef/opentelemetry/OpenTelemetryAssistantState.kt b/integrations/opentelemetry/src/main/kotlin/com/xebia/functional/xef/opentelemetry/OpenTelemetryAssistantState.kt index ad2d09f36..787e0a871 100644 --- a/integrations/opentelemetry/src/main/kotlin/com/xebia/functional/xef/opentelemetry/OpenTelemetryAssistantState.kt +++ b/integrations/opentelemetry/src/main/kotlin/com/xebia/functional/xef/opentelemetry/OpenTelemetryAssistantState.kt @@ -115,7 +115,7 @@ class OpenTelemetryAssistantState(private val tracer: Tracer) { when (it) { is RunStepDetailsToolCallsObjectToolCallsInner.CaseRunStepDetailsToolCallsCodeObject -> it.value.type.name is RunStepDetailsToolCallsObjectToolCallsInner.CaseRunStepDetailsToolCallsFunctionObject -> it.value.function.name ?: "" - is RunStepDetailsToolCallsObjectToolCallsInner.CaseRunStepDetailsToolCallsRetrievalObject -> it.value.type.name + is RunStepDetailsToolCallsObjectToolCallsInner.CaseRunStepDetailsToolCallsFileSearchObject -> it.value.type.name } }}: ${output.status.name}" ) @@ -167,7 +167,6 @@ class OpenTelemetryAssistantState(private val tracer: Tracer) { private fun RunObject.setParameters(span: Span) { span.setAttribute("openai.assistant.model", model) - if (fileIds.isNotEmpty()) span.setAttribute("openai.assistant.fileIds", fileIds.joinToString()) span.setAttribute("openai.assistant.tools.count", tools.count().toString()) span.setAttribute("openai.assistant.thread.id", threadId) span.setAttribute("openai.assistant.assistant.id", assistantId) @@ -215,7 +214,7 @@ class OpenTelemetryAssistantState(private val tracer: Tracer) { toolCall.value.function.arguments ?: "" ) } - is RunStepDetailsToolCallsObjectToolCallsInner.CaseRunStepDetailsToolCallsRetrievalObject -> { + is RunStepDetailsToolCallsObjectToolCallsInner.CaseRunStepDetailsToolCallsFileSearchObject -> { span.setAttribute("openai.assistant.toolCalls.$index.type", toolCall.value.type.name) span.setAttribute("openai.assistant.toolCalls.$index.function.name", "retrieval") } @@ -242,6 +241,11 @@ class OpenTelemetryAssistantState(private val tracer: Tracer) { inner.value.text.value ) } + is MessageObjectContentInner.CaseMessageContentImageUrlObject -> + span.setAttribute( + "openai.assistant.messages.${indexOf(it)}.content", + inner.value.imageUrl.url + ) null -> {} } } diff --git a/openai-client/client/src/commonMain/kotlin/com/xebia/functional/openai/generated/model/CreateAssistantRequestToolResourcesFileSearch.kt b/openai-client/client/src/commonMain/kotlin/com/xebia/functional/openai/generated/model/CreateAssistantRequestToolResourcesFileSearch.kt new file mode 100644 index 000000000..ad9af6f21 --- /dev/null +++ b/openai-client/client/src/commonMain/kotlin/com/xebia/functional/openai/generated/model/CreateAssistantRequestToolResourcesFileSearch.kt @@ -0,0 +1,9 @@ +package com.xebia.functional.openai.generated.model + +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +@Serializable +data class CreateAssistantRequestToolResourcesFileSearch( + @SerialName(value = "vector_store_ids") val vectorStoreIds: List +) diff --git a/openai-client/client/src/commonMain/kotlin/com/xebia/functional/openai/generated/model/CreateThreadRequestToolResourcesFileSearch.kt b/openai-client/client/src/commonMain/kotlin/com/xebia/functional/openai/generated/model/CreateThreadRequestToolResourcesFileSearch.kt new file mode 100644 index 000000000..cf348e230 --- /dev/null +++ b/openai-client/client/src/commonMain/kotlin/com/xebia/functional/openai/generated/model/CreateThreadRequestToolResourcesFileSearch.kt @@ -0,0 +1,9 @@ +package com.xebia.functional.openai.generated.model + +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +@Serializable +data class CreateThreadRequestToolResourcesFileSearch( + @SerialName(value = "vector_store_ids") val vectorStoreIds: List +) diff --git a/openai-client/generator/.openapi-generator-ignore b/openai-client/generator/.openapi-generator-ignore index 47c8f224b..dc1bce6c5 100644 --- a/openai-client/generator/.openapi-generator-ignore +++ b/openai-client/generator/.openapi-generator-ignore @@ -4,4 +4,6 @@ **/org/openapitools/** **/proguard-rules.pro **/build.gradle -**/settings.gradle \ No newline at end of file +**/settings.gradle +**/CreateAssistantRequestToolResourcesFileSearch.kt +**/CreateThreadRequestToolResourcesFileSearch.kt diff --git a/openai-client/generator/src/main/java/ai/xef/openai/generator/KMMGeneratorConfig.java b/openai-client/generator/src/main/java/ai/xef/openai/generator/KMMGeneratorConfig.java index 6e732cb7b..2017ec89c 100644 --- a/openai-client/generator/src/main/java/ai/xef/openai/generator/KMMGeneratorConfig.java +++ b/openai-client/generator/src/main/java/ai/xef/openai/generator/KMMGeneratorConfig.java @@ -89,7 +89,7 @@ public KMMGeneratorConfig() { entry("ListRunsResponse", List.of("firstId", "lastId")), entry("ListRunStepsResponse", List.of("firstId", "lastId")), entry("ListThreadsResponse", List.of("firstId", "lastId")), - entry("MessageObject", List.of("metadata")), + entry("MessageObject", List.of("status", "metadata")), entry("MessageObjectContentInner", List.of("imageFile", "text")), entry("RunObject", List.of("expiresAt", "requiredAction")), entry("RunStepDetailsToolCallsCodeObjectCodeInterpreterOutputsInner", List.of("logs", "image")),