ether-ai-core define los contratos neutrales para capacidades de GenAI en el ecosistema Ether. El código de dominio depende solo de estas interfaces; los adapters (ether-ai-openai, ether-ai-deepseek) los implementan.
Instalación
<dependency>
<groupId>dev.rafex.ether.ai</groupId>
<artifactId>ether-ai-core</artifactId>
<version>8.0.0-SNAPSHOT</version>
</dependency>
Contratos
| Tipo | Rol |
| AiChatModel | Interfaz principal: chat(AiChatRequest) → AiChatResponse |
| AiMessage | Mensaje con rol y contenido; métodos de fábrica system(), user(), assistant() |
| AiMessageRole | Enum de roles (SYSTEM, USER, ASSISTANT) con wireValue() |
| AiChatRequest | Lista de mensajes + modelo + maxTokens |
| AiChatResponse | Texto de respuesta + AiUsage (tokens) |
| AiUsage | promptTokens, completionTokens, totalTokens |
| AiHttpException | Error HTTP: statusCode() + responseBody() |
AiMessage
AiMessage sys = AiMessage.system("Eres un asistente útil.");
AiMessage user = AiMessage.user("¿Qué es la JVM?");
AiMessage asst = AiMessage.assistant("La JVM es la máquina virtual de Java.");
AiChatRequest
AiChatRequest req = AiChatRequest.of("¿Qué es Java?");
AiChatRequest req = new AiChatRequest(
List.of(
AiMessage.system("Responde en español."),
AiMessage.user("¿Qué es el bytecode?")
),
"gpt-4o-mini",
512
);
AiChatModel — uso provider-agnostic
public class SupportAssistant {
private final AiChatModel model;
public SupportAssistant(AiChatModel model) {
this.model = model;
}
public String answer(String question) throws AiHttpException {
var request = new AiChatRequest(
List.of(
AiMessage.system("Eres un agente de soporte técnico."),
AiMessage.user(question)
),
null, 512
);
return model.chat(request).text();
}
}
El adapter concreto se inyecta en el contenedor de dependencias:
AiChatModel model = new OpenAiChatModel(OpenAiConfig.of(System.getenv("OPENAI_API_KEY")));
AiChatModel model = new DeepSeekChatModel(DeepSeekConfig.of(System.getenv("DEEPSEEK_API_KEY")));
var assistant = new SupportAssistant(model);
AiHttpException
try {
AiChatResponse r = model.chat(request);
} catch (AiHttpException e) {
System.err.println("HTTP " + e.statusCode() + ": " + e.responseBody());
}
Más información