in prompt/prompt-executor/prompt-executor-clients/prompt-executor-ollama-client/src/commonMain/kotlin/ai/koog/prompt/executor/ollama/client/OllamaClient.kt [272:317]
override fun executeStreaming(
prompt: Prompt,
model: LLModel,
tools: List<ToolDescriptor>
): Flow<StreamFrame> = streamFrameFlow {
require(model.provider == LLMProvider.Ollama) { "Model not supported by Ollama" }
val request = ollamaJson.encodeToString(
OllamaChatRequestDTOSerializer,
OllamaChatRequestDTO(
model = model.id,
messages = prompt.toOllamaChatMessages(model),
options = extractOllamaOptions(prompt, model),
stream = true,
additionalProperties = prompt.params.additionalProperties,
)
)
val response = client.post(DEFAULT_MESSAGE_PATH) {
setBody(request)
}
val channel = response.bodyAsChannel()
while (!channel.isClosedForRead) {
val line = channel.readUTF8Line() ?: break
if (line.isBlank()) continue
try {
val chunk = ollamaJson.decodeFromString<OllamaChatResponseDTO>(line)
chunk.message?.let { message ->
emitAppend(message.content)
message.toolCalls?.forEach { toolCall ->
emitToolCall(
id = null,
name = toolCall.function.name,
content = toolCall.function.arguments.toString()
)
}
}
} catch (_: Exception) {
// Skip malformed JSON lines
continue
}
}
}