diff --git a/examples/src/main/kotlin/assistant/StreamThreadExample.kt b/examples/src/main/kotlin/assistant/StreamThreadExample.kt new file mode 100644 index 0000000..edc0663 --- /dev/null +++ b/examples/src/main/kotlin/assistant/StreamThreadExample.kt @@ -0,0 +1,37 @@ +package assistant + +import com.cjcrafter.openai.chat.tool.CodeInterpreterToolCall +import com.cjcrafter.openai.chat.tool.FunctionToolCall +import com.cjcrafter.openai.chat.tool.RetrievalToolCall +import com.cjcrafter.openai.openAI +import com.cjcrafter.openai.threads.create +import com.cjcrafter.openai.threads.createRunRequest +import com.cjcrafter.openai.threads.message.ImageContent +import com.cjcrafter.openai.threads.message.TextContent +import com.cjcrafter.openai.threads.message.ThreadUser +import com.cjcrafter.openai.threads.runs.CreateRunRequest +import com.cjcrafter.openai.threads.runs.MessageCreationDetails +import com.cjcrafter.openai.threads.runs.ToolCallsDetails +import io.github.cdimascio.dotenv.dotenv + +fun main() { + // To use dotenv, you need to add the "io.github.cdimascio:dotenv-kotlin:version" + // dependency. Then you can add a .env file in your project directory. + val openai = openAI { apiKey(dotenv()["OPENAI_TOKEN"]) } + + // Ask the user to choose an assistant + val assistants = openai.assistants.list() + val assistant = assistants.data.first() + + // We have to create a new thread. We'll save this thread, so we can add + // user messages and get responses later. + val thread = openai.threads.create() + + openai.threads.messages(thread).create { + role(ThreadUser.USER) + content("Hello, world!") + } + openai.threads.runs(thread).stream(createRunRequest { + assistant(assistant) + }) +} diff --git a/src/main/kotlin/com/cjcrafter/openai/threads/runs/CreateRunRequest.kt b/src/main/kotlin/com/cjcrafter/openai/threads/runs/CreateRunRequest.kt index ef60f73..c7834a1 100644 --- a/src/main/kotlin/com/cjcrafter/openai/threads/runs/CreateRunRequest.kt +++ b/src/main/kotlin/com/cjcrafter/openai/threads/runs/CreateRunRequest.kt @@ -21,6 +21,7 @@ data class CreateRunRequest( var instructions: String? = null, var tools: List? = null, var metadata: Map? = null, + var stream: Boolean? = null, ) { /** diff --git a/src/main/kotlin/com/cjcrafter/openai/threads/runs/RunHandler.kt b/src/main/kotlin/com/cjcrafter/openai/threads/runs/RunHandler.kt index 031c5d6..30bf883 100644 --- a/src/main/kotlin/com/cjcrafter/openai/threads/runs/RunHandler.kt +++ b/src/main/kotlin/com/cjcrafter/openai/threads/runs/RunHandler.kt @@ -20,6 +20,9 @@ interface RunHandler { */ fun create(request: CreateRunRequest): Run + // TODO + fun stream(request: CreateRunRequest): Any + /** * Retrieves the updated run object from the given run. * diff --git a/src/main/kotlin/com/cjcrafter/openai/threads/runs/RunHandlerImpl.kt b/src/main/kotlin/com/cjcrafter/openai/threads/runs/RunHandlerImpl.kt index 46fc841..08e213a 100644 --- a/src/main/kotlin/com/cjcrafter/openai/threads/runs/RunHandlerImpl.kt +++ b/src/main/kotlin/com/cjcrafter/openai/threads/runs/RunHandlerImpl.kt @@ -8,10 +8,17 @@ class RunHandlerImpl( override val threadId: String, ): RunHandler { override fun create(request: CreateRunRequest): Run { + request.stream = false val httpRequest = requestHelper.buildRequest(request, endpoint).addHeader("OpenAI-Beta", "assistants=v1").build() return requestHelper.executeRequest(httpRequest, Run::class.java) } + override fun stream(request: CreateRunRequest): Any { + request.stream = true + val httpRequest = requestHelper.buildRequest(request, endpoint).addHeader("OpenAI-Beta", "assistants=v1").build() + return requestHelper.executeRequest(httpRequest) + } + override fun retrieve(id: String): Run { val httpRequest = requestHelper.buildRequestNoBody("$endpoint/$id").addHeader("OpenAI-Beta", "assistants=v1").get().build() return requestHelper.executeRequest(httpRequest, Run::class.java)