--- name: ollama_chat kind: function lang: kt domain: infra version: "1.0.0" purity: impure signature: "fun ollamaChat(messages: List>, model: String = \"llama3.1:8b\", baseUrl: String = \"http://localhost:11434\", temperature: Double = 0.7, maxTokens: Int = 1024): OllamaChatResponse" description: "Envía una solicitud de chat completion a un servidor Ollama local. Retorna el contenido generado junto a métricas de duración y tokens evaluados." tags: [ollama, llm, chat, inference, http, android, kotlin] uses_functions: [] uses_types: [] returns: [] returns_optional: false error_type: "error_go_core" imports: - "org.json.JSONObject" - "org.json.JSONArray" - "java.net.HttpURLConnection" - "java.net.URL" tested: false tests: [] test_file_path: "" file_path: "kotlin/functions/infra/ollama_chat.kt" params: - name: messages desc: "Lista de mapas role/content en formato OpenAI/Ollama. Ej: [{\"role\":\"user\",\"content\":\"Hola\"}]." - name: model desc: "Tag del modelo Ollama a usar. Por defecto 'llama3.1:8b'." - name: baseUrl desc: "URL base del servidor Ollama. Por defecto 'http://localhost:11434'." - name: temperature desc: "Temperatura de muestreo entre 0.0 (determinista) y 1.0 (creativo). Por defecto 0.7." - name: maxTokens desc: "Número máximo de tokens a generar. Por defecto 1024." output: "OllamaChatResponse con content (texto generado), model (nombre del modelo), totalDurationMs (duración total en milisegundos) y evalCount (tokens evaluados)." --- ## Ejemplo ```kotlin val messages = listOf( mapOf("role" to "system", "content" to "Eres un asistente útil."), mapOf("role" to "user", "content" to "¿Cuál es la capital de Francia?") ) val response = ollamaChat( messages = messages, model = "llama3.1:8b", temperature = 0.3 ) println(response.content) // "La capital de Francia es París." println(response.totalDurationMs) // 1234 println(response.evalCount) // 42 ``` ## Notas Usa `java.net.HttpURLConnection` y `org.json.JSONObject` del Android SDK — sin dependencias externas adicionales. Timeout de 60 segundos tanto en conexión como en lectura. La respuesta de Ollama incluye `total_duration` en nanosegundos; se convierte a milisegundos dividiendo entre 1_000_000. Si Ollama no está corriendo lanza `RuntimeException("Ollama no está corriendo en $baseUrl")`. Si el servidor responde con un código HTTP distinto de 200, lanza `RuntimeException` con el código y el cuerpo del error. El campo `stream` se fija a `false` para recibir la respuesta completa en una sola llamada. ``` ---