diff --git a/app/src/main/java/com/example/cuida/services/Ollama.java b/app/src/main/java/com/example/cuida/services/Ollama.java index e69de29..25145f2 100644 --- a/app/src/main/java/com/example/cuida/services/Ollama.java +++ b/app/src/main/java/com/example/cuida/services/Ollama.java @@ -0,0 +1,82 @@ +package com.example.cuida.services; + +import android.os.Handler; +import android.os.Looper; + +import org.json.JSONObject; + +import java.io.IOException; + +import okhttp3.Call; +import okhttp3.Callback; +import okhttp3.MediaType; +import okhttp3.OkHttpClient; +import okhttp3.Request; +import okhttp3.RequestBody; +import okhttp3.Response; + +public class OllamaService { + // Definir o modelo especificado + private static final String MODEL_NAME = "gemma4:e2b"; + // O endpoint padrão do Ollama para geração de texto é /api/generate + private static final String API_URL = "https://apichat.epvc.pt/api/generate"; + + private final OkHttpClient client; + private final Handler mainHandler; + + public OllamaService() { + this.client = new OkHttpClient(); + this.mainHandler = new Handler(Looper.getMainLooper()); + } + + public interface OllamaCallback { + void onSuccess(String result); + void onError(Throwable t); + } + + public void fazerPergunta(String promptUtilizador, OllamaCallback callback) { + try { + // Construção do JSON no formato esperado pelo Ollama + JSONObject jsonBody = new JSONObject(); + jsonBody.put("model", MODEL_NAME); + jsonBody.put("prompt", promptUtilizador); + jsonBody.put("stream", false); // "false" garante que a resposta vem numa única string JSON + + RequestBody body = RequestBody.create(jsonBody.toString(), MediaType.parse("application/json; charset=utf-8")); + Request request = new Request.Builder() + .url(API_URL) + .post(body) + .build(); + + client.newCall(request).enqueue(new Callback() { + @Override + public void onFailure(Call call, IOException e) { + mainHandler.post(() -> callback.onError(e)); + } + + @Override + public void onResponse(Call call, Response response) throws IOException { + if (response.isSuccessful()) { + try { + String responseBody = response.body().string(); + JSONObject jsonObject = new JSONObject(responseBody); + + // O Ollama devolve o texto final diretamente no campo "response" + String textResult = jsonObject.getString("response"); + + mainHandler.post(() -> callback.onSuccess(textResult)); + } catch (Exception e) { + mainHandler.post(() -> callback.onError(new Exception("Erro ao ler resposta da IA", e))); + } + } else { + String errorBody = response.body() != null ? response.body().string() : "Erro desconhecido"; + mainHandler.post(() -> callback.onError(new Exception("Erro da API HTTP " + response.code() + ": " + errorBody))); + } + } + }); + + } catch (Exception e) { + mainHandler.post(() -> callback.onError(e)); + } + } +} \ No newline at end of file