diff --git a/src/main/java/io/github/jeddict/ai/lang/ChatModelBaseBuilder.java b/src/main/java/io/github/jeddict/ai/lang/ChatModelBaseBuilder.java new file mode 100644 index 0000000..b01d199 --- /dev/null +++ b/src/main/java/io/github/jeddict/ai/lang/ChatModelBaseBuilder.java @@ -0,0 +1,181 @@ +package io.github.jeddict.ai.lang; + +import java.time.Duration; +import java.util.Map; + +/** + * Builder interface for configuring chat model parameters. This interface provides methods to set various configuration options for chat models. + * + * @author Francois Steyn + * @param The type of chat model being built + */ +public interface ChatModelBaseBuilder { + + /** + * Sets the base URL for the chat model API. + * + * @param baseUrl The base URL of the API endpoint + * @return The builder instance + */ + ChatModelBaseBuilder baseUrl(final String baseUrl); + + /** + * Sets the custom headers for accessing the service. + * + * @param customHeaders The custom headers for accessing the service + * @return The builder instance + */ + ChatModelBaseBuilder customHeaders(final Map customHeaders); + + /** + * Sets the API key for authentication. + * + * @param apiKey The API key for accessing the service + * @return The builder instance + */ + ChatModelBaseBuilder apiKey(final String apiKey); + + /** + * Sets the name of the model to be used. + * + * @param modelName The name of the model + * @return The builder instance + */ + ChatModelBaseBuilder modelName(final String modelName); + + /** + * Sets the temperature parameter for response generation. + * + * @param temperature Controls randomness in the output (0.0 to 1.0) + * @return The builder instance + */ + ChatModelBaseBuilder temperature(final Double temperature); + + /** + * Sets the timeout duration for API calls. + * + * @param timeout The duration after which the request times out + * @return The builder instance + */ + ChatModelBaseBuilder timeout(final Duration timeout); + + /** + * Sets the top P parameter for response generation. + * + * @param topP Controls diversity via nucleus sampling + * @return The builder instance + */ + ChatModelBaseBuilder topP(final Double topP); + + /** + * Sets the maximum number of retry attempts for failed requests. + * + * @param maxRetries The maximum number of retries + * @return The builder instance + */ + ChatModelBaseBuilder maxRetries(final Integer maxRetries); + + /** + * Sets the maximum number of tokens in the output. + * + * @param maxOutputTokens The maximum number of output tokens + * @return The builder instance + */ + ChatModelBaseBuilder maxOutputTokens(final Integer maxOutputTokens); + + /** + * Sets the repeat penalty for response generation. + * + * @param repeatPenalty The penalty for repeated content + * @return The builder instance + */ + ChatModelBaseBuilder repeatPenalty(final Double repeatPenalty); + + /** + * Sets the random seed for reproducible results. + * + * @param seed The random seed value + * @return The builder instance + */ + ChatModelBaseBuilder seed(final Integer seed); + + /** + * Sets the maximum total tokens (input + output). + * + * @param maxTokens The maximum number of total tokens + * @return The builder instance + */ + ChatModelBaseBuilder maxTokens(final Integer maxTokens); + + /** + * Sets the maximum number of tokens for completion. + * + * @param maxCompletionTokens The maximum completion tokens + * @return The builder instance + */ + ChatModelBaseBuilder maxCompletionTokens(final Integer maxCompletionTokens); + + /** + * Sets the top K parameter for response generation. + * + * @param topK The number of highest probability vocabulary tokens + * @return The builder instance + */ + ChatModelBaseBuilder topK(final Integer topK); + + /** + * Sets the presence penalty for response generation. + * + * @param presencePenalty The penalty for token presence + * @return The builder instance + */ + ChatModelBaseBuilder presencePenalty(final Double presencePenalty); + + /** + * Sets the frequency penalty for response generation. + * + * @param frequencyPenalty The penalty for token frequency + * @return The builder instance + */ + ChatModelBaseBuilder frequencyPenalty(final Double frequencyPenalty); + + /** + * Sets the organization ID for API requests. + * + * @param organizationId The organization identifier + * @return The builder instance + */ + ChatModelBaseBuilder organizationId(final String organizationId); + + /** + * Configures logging for requests and responses. + * + * @param logRequests Whether to log requests + * @param logResponses Whether to log responses + * @return The builder instance + */ + ChatModelBaseBuilder logRequestsResponses(final boolean logRequests, final boolean logResponses); + + /** + * Sets whether to include code execution output. + * + * @param includeCodeExecutionOutput Whether to include code execution output + * @return The builder instance + */ + ChatModelBaseBuilder includeCodeExecutionOutput(final boolean includeCodeExecutionOutput); + + /** + * Sets whether to allow code execution. + * + * @param allowCodeExecution Whether to allow code execution + * @return The builder instance + */ + ChatModelBaseBuilder allowCodeExecution(final boolean allowCodeExecution); + + /** + * Builds and returns the configured chat model instance. + * + * @return The configured chat model instance + */ + T build(); +} diff --git a/src/main/java/io/github/jeddict/ai/lang/ChatModelBuilder.java b/src/main/java/io/github/jeddict/ai/lang/ChatModelBuilder.java new file mode 100644 index 0000000..50039c0 --- /dev/null +++ b/src/main/java/io/github/jeddict/ai/lang/ChatModelBuilder.java @@ -0,0 +1,80 @@ +package io.github.jeddict.ai.lang; + +import dev.langchain4j.model.chat.ChatLanguageModel; +import java.time.Duration; +import java.util.Map; + +/** + * A specialized builder interface for constructing ChatLanguageModel instances. This interface extends ChatModelBaseBuilder to provide specific building capabilities for + * chat-based language models. It inherits all configuration methods from the base builder while specifically targeting ChatLanguageModel as the build output type. + * + * @author Francois Steyn + * @see ChatLanguageModel + * @see ChatModelBaseBuilder + */ +public interface ChatModelBuilder extends ChatModelBaseBuilder { + + @Override + ChatModelBuilder baseUrl(final String baseUrl); + + @Override + ChatModelBuilder customHeaders(final Map customHeaders); + + @Override + ChatModelBuilder apiKey(final String apiKey); + + @Override + ChatModelBuilder modelName(final String modelName); + + @Override + ChatModelBuilder temperature(final Double temperature); + + @Override + ChatModelBuilder timeout(final Duration timeout); + + @Override + ChatModelBuilder topP(final Double topP); + + @Override + ChatModelBuilder maxRetries(final Integer maxRetries); + + @Override + ChatModelBuilder maxOutputTokens(final Integer maxOutputTokens); + + @Override + ChatModelBuilder repeatPenalty(final Double repeatPenalty); + + @Override + ChatModelBuilder seed(final Integer seed); + + @Override + ChatModelBuilder maxTokens(final Integer maxTokens); + + @Override + ChatModelBuilder maxCompletionTokens(final Integer maxCompletionTokens); + + @Override + ChatModelBuilder topK(final Integer topK); + + @Override + ChatModelBuilder presencePenalty(final Double presencePenalty); + + @Override + ChatModelBuilder frequencyPenalty(final Double frequencyPenalty); + + @Override + ChatModelBuilder organizationId(final String organizationId); + + @Override + ChatModelBuilder logRequestsResponses(final boolean logRequests, final boolean logResponses); + + @Override + ChatModelBuilder includeCodeExecutionOutput(final boolean includeCodeExecutionOutput); + + @Override + ChatModelBuilder allowCodeExecution(final boolean allowCodeExecution); + + @Override + ChatLanguageModel build(); + +} diff --git a/src/main/java/io/github/jeddict/ai/lang/ChatModelStreamingBuilder.java b/src/main/java/io/github/jeddict/ai/lang/ChatModelStreamingBuilder.java new file mode 100644 index 0000000..e7c10ac --- /dev/null +++ b/src/main/java/io/github/jeddict/ai/lang/ChatModelStreamingBuilder.java @@ -0,0 +1,81 @@ +package io.github.jeddict.ai.lang; + +import dev.langchain4j.model.chat.StreamingChatLanguageModel; +import java.time.Duration; +import java.util.Map; + +/** + * A specialized builder interface for constructing StreamingChatLanguageModel instances. This interface extends ChatModelBaseBuilder to provide specific building capabilities for + * streaming-enabled chat language models. It inherits all configuration methods from the base builder while targeting StreamingChatLanguageModel as the build output type. The + * streaming functionality enables real-time, token-by-token response generation. + * + * @author Francois Steyn + * @see StreamingChatLanguageModel + * @see ChatModelBaseBuilder + */ +public interface ChatModelStreamingBuilder extends ChatModelBaseBuilder { + + @Override + ChatModelStreamingBuilder baseUrl(final String baseUrl); + + @Override + ChatModelStreamingBuilder customHeaders(final Map customHeaders); + + @Override + ChatModelStreamingBuilder apiKey(final String apiKey); + + @Override + ChatModelStreamingBuilder modelName(final String modelName); + + @Override + ChatModelStreamingBuilder temperature(final Double temperature); + + @Override + ChatModelStreamingBuilder timeout(final Duration timeout); + + @Override + ChatModelStreamingBuilder topP(final Double topP); + + @Override + ChatModelStreamingBuilder maxRetries(final Integer maxRetries); + + @Override + ChatModelStreamingBuilder maxOutputTokens(final Integer maxOutputTokens); + + @Override + ChatModelStreamingBuilder repeatPenalty(final Double repeatPenalty); + + @Override + ChatModelStreamingBuilder seed(final Integer seed); + + @Override + ChatModelStreamingBuilder maxTokens(final Integer maxTokens); + + @Override + ChatModelStreamingBuilder maxCompletionTokens(final Integer maxCompletionTokens); + + @Override + ChatModelStreamingBuilder topK(final Integer topK); + + @Override + ChatModelStreamingBuilder presencePenalty(final Double presencePenalty); + + @Override + ChatModelStreamingBuilder frequencyPenalty(final Double frequencyPenalty); + + @Override + ChatModelStreamingBuilder organizationId(final String organizationId); + + @Override + ChatModelStreamingBuilder logRequestsResponses(final boolean logRequests, final boolean logResponses); + + @Override + ChatModelStreamingBuilder includeCodeExecutionOutput(final boolean includeCodeExecutionOutput); + + @Override + ChatModelStreamingBuilder allowCodeExecution(final boolean allowCodeExecution); + + @Override + StreamingChatLanguageModel build(); + +} diff --git a/src/main/java/io/github/jeddict/ai/lang/JeddictChatModel.java b/src/main/java/io/github/jeddict/ai/lang/JeddictChatModel.java index b30abd1..cb12bdd 100644 --- a/src/main/java/io/github/jeddict/ai/lang/JeddictChatModel.java +++ b/src/main/java/io/github/jeddict/ai/lang/JeddictChatModel.java @@ -25,32 +25,21 @@ import com.sun.source.tree.Tree; import com.sun.source.util.TreePath; import dev.langchain4j.model.StreamingResponseHandler; -import dev.langchain4j.model.anthropic.AnthropicChatModel; -import dev.langchain4j.model.anthropic.AnthropicChatModel.AnthropicChatModelBuilder; -import dev.langchain4j.model.anthropic.AnthropicStreamingChatModel; -import dev.langchain4j.model.anthropic.AnthropicStreamingChatModel.AnthropicStreamingChatModelBuilder; import dev.langchain4j.model.chat.ChatLanguageModel; import dev.langchain4j.model.chat.StreamingChatLanguageModel; -import dev.langchain4j.model.googleai.GoogleAiGeminiChatModel; -import dev.langchain4j.model.googleai.GoogleAiGeminiStreamingChatModel; -import dev.langchain4j.model.googleai.GoogleAiGeminiStreamingChatModel.GoogleAiGeminiStreamingChatModelBuilder; -import dev.langchain4j.model.localai.LocalAiChatModel; -import dev.langchain4j.model.localai.LocalAiChatModel.LocalAiChatModelBuilder; -import dev.langchain4j.model.localai.LocalAiStreamingChatModel; -import dev.langchain4j.model.localai.LocalAiStreamingChatModel.LocalAiStreamingChatModelBuilder; -import dev.langchain4j.model.mistralai.MistralAiChatModel; -import dev.langchain4j.model.mistralai.MistralAiChatModel.MistralAiChatModelBuilder; -import dev.langchain4j.model.mistralai.MistralAiStreamingChatModel; -import dev.langchain4j.model.mistralai.MistralAiStreamingChatModel.MistralAiStreamingChatModelBuilder; -import dev.langchain4j.model.ollama.OllamaChatModel; -import dev.langchain4j.model.ollama.OllamaChatModel.OllamaChatModelBuilder; -import dev.langchain4j.model.ollama.OllamaStreamingChatModel; -import dev.langchain4j.model.ollama.OllamaStreamingChatModel.OllamaStreamingChatModelBuilder; -import dev.langchain4j.model.openai.OpenAiChatModel; -import dev.langchain4j.model.openai.OpenAiChatModel.OpenAiChatModelBuilder; -import dev.langchain4j.model.openai.OpenAiStreamingChatModel; -import dev.langchain4j.model.openai.OpenAiStreamingChatModel.OpenAiStreamingChatModelBuilder; -import io.github.jeddict.ai.models.LMStudioChatModel; +import io.github.jeddict.ai.lang.impl.AnthropicBuilder; +import io.github.jeddict.ai.lang.impl.AnthropicStreamingBuilder; +import io.github.jeddict.ai.lang.impl.GoogleBuilder; +import io.github.jeddict.ai.lang.impl.GoogleStreamingBuilder; +import io.github.jeddict.ai.lang.impl.LMStudioBuilder; +import io.github.jeddict.ai.lang.impl.LocalAiBuilder; +import io.github.jeddict.ai.lang.impl.LocalAiStreamingBuilder; +import io.github.jeddict.ai.lang.impl.MistralBuilder; +import io.github.jeddict.ai.lang.impl.MistralStreamingBuilder; +import io.github.jeddict.ai.lang.impl.OllamaBuilder; +import io.github.jeddict.ai.lang.impl.OllamaStreamingBuilder; +import io.github.jeddict.ai.lang.impl.OpenAiBuilder; +import io.github.jeddict.ai.lang.impl.OpenAiStreamingBuilder; import io.github.jeddict.ai.scanner.ProjectMetadataInfo; import static io.github.jeddict.ai.settings.GenAIProvider.ANTHROPIC; import static io.github.jeddict.ai.settings.GenAIProvider.CUSTOM_OPEN_AI; @@ -74,6 +63,8 @@ import java.util.List; import java.util.Map; import java.util.Set; +import java.util.function.Consumer; +import java.util.function.Predicate; import javax.swing.Box; import javax.swing.BoxLayout; import javax.swing.JLabel; @@ -98,490 +89,103 @@ public JeddictChatModel() { public JeddictChatModel(StreamingResponseHandler handler) { this.handler = handler; - Double temperature = preferencesManager.getTemperature(); - Integer timeout = preferencesManager.getTimeout(); - Double topP = preferencesManager.getTopP(); - Integer maxRetries = preferencesManager.getMaxRetries(); - Integer maxOutputTokens = preferencesManager.getMaxOutputTokens(); - Double repeatPenalty = preferencesManager.getRepeatPenalty(); - Integer seed = preferencesManager.getSeed(); - Integer maxTokens = preferencesManager.getMaxTokens(); - Integer maxCompletionTokens = preferencesManager.getMaxCompletionTokens(); - Integer topK = preferencesManager.getTopK(); - Double presencePenalty = preferencesManager.getPresencePenalty(); - Double frequencyPenalty = preferencesManager.getFrequencyPenalty(); - String organizationId = preferencesManager.getOrganizationId(); - boolean logRequests = preferencesManager.isLogRequestsEnabled(); - boolean logResponse = preferencesManager.isLogResponsesEnabled(); - boolean includeCodeExecutionOutput = preferencesManager.isIncludeCodeExecutionOutput(); - boolean allowCodeExecution = preferencesManager.isAllowCodeExecution(); - Map customHeaders = preferencesManager.getCustomHeaders(); if (null != preferencesManager.getModel()) { if (preferencesManager.isStreamEnabled() && handler != null) { switch (preferencesManager.getProvider()) { case GOOGLE -> { - GoogleAiGeminiStreamingChatModelBuilder builder = GoogleAiGeminiStreamingChatModel.builder() - .apiKey(preferencesManager.getApiKey()) - .modelName(preferencesManager.getModelName()); - - if (temperature != null && temperature != Double.MIN_VALUE) { - builder.temperature(temperature); - } - if (maxOutputTokens != null && maxOutputTokens != Integer.MIN_VALUE) { - builder.maxOutputTokens(maxOutputTokens); - } - if (topP != null && topP != Double.MIN_VALUE) { - builder.topP(topP); - } - if (timeout != null && timeout != Integer.MIN_VALUE) { - builder.timeout(Duration.ofSeconds(timeout)); - } - if (maxRetries != null && maxRetries != Integer.MIN_VALUE) { - builder.maxRetries(maxRetries); - } - if (topK != null && topK != Integer.MIN_VALUE) { - builder.topK(topK); - } - builder.logRequestsAndResponses(logRequests || logResponse) - .includeCodeExecutionOutput(includeCodeExecutionOutput) - .allowCodeExecution(allowCodeExecution); - - streamModel = builder.build(); + streamModel = buildModel(new GoogleStreamingBuilder()); } - case OPEN_AI -> { - OpenAiStreamingChatModelBuilder builder = OpenAiStreamingChatModel.builder() - .apiKey(preferencesManager.getApiKey()) - .modelName(preferencesManager.getModelName()); - - if (temperature != null && temperature != Double.MIN_VALUE) { - builder.temperature(temperature); - } - if (topP != null && topP != Double.MIN_VALUE) { - builder.topP(topP); - } - if (timeout != null && timeout != Integer.MIN_VALUE) { - builder.timeout(Duration.ofSeconds(timeout)); - } - if (seed != null && seed != Integer.MIN_VALUE) { - builder.seed(seed); - } - if (maxTokens != null && maxTokens != Integer.MIN_VALUE) { - builder.maxTokens(maxTokens); - } - if (maxCompletionTokens != null && maxCompletionTokens != Integer.MIN_VALUE) { - builder.maxCompletionTokens(maxCompletionTokens); - } - if (presencePenalty != null && presencePenalty != Double.MIN_VALUE) { - builder.presencePenalty(presencePenalty); - } - if (frequencyPenalty != null && frequencyPenalty != Double.MIN_VALUE) { - builder.frequencyPenalty(frequencyPenalty); - } - if (organizationId != null && !organizationId.isEmpty()) { - builder.organizationId(organizationId); - } - if (customHeaders != null && !customHeaders.isEmpty()) { - builder.customHeaders(customHeaders); - } - - builder.logRequests(logRequests) - .logResponses(logResponse); - - streamModel = builder.build(); - } - case DEEPINFRA, DEEPSEEK, GROQ, CUSTOM_OPEN_AI -> { - OpenAiStreamingChatModelBuilder builder = OpenAiStreamingChatModel.builder() - .baseUrl(preferencesManager.getProviderLocation()) - .apiKey(preferencesManager.getApiKey()) - .modelName(preferencesManager.getModelName()); - - if (temperature != null && temperature != Double.MIN_VALUE) { - builder.temperature(temperature); - } - if (topP != null && topP != Double.MIN_VALUE) { - builder.topP(topP); - } - if (timeout != null && timeout != Integer.MIN_VALUE) { - builder.timeout(Duration.ofSeconds(timeout)); - } - if (seed != null && seed != Integer.MIN_VALUE) { - builder.seed(seed); - } - if (maxTokens != null && maxTokens != Integer.MIN_VALUE) { - builder.maxTokens(maxTokens); - } - if (maxCompletionTokens != null && maxCompletionTokens != Integer.MIN_VALUE) { - builder.maxCompletionTokens(maxCompletionTokens); - } - if (presencePenalty != null && presencePenalty != Double.MIN_VALUE) { - builder.presencePenalty(presencePenalty); - } - if (frequencyPenalty != null && frequencyPenalty != Double.MIN_VALUE) { - builder.frequencyPenalty(frequencyPenalty); - } - if (organizationId != null && !organizationId.isEmpty()) { - builder.organizationId(organizationId); - } - if (customHeaders != null && !customHeaders.isEmpty()) { - builder.customHeaders(customHeaders); - } - - builder.logRequests(logRequests) - .logResponses(logResponse); - streamModel = builder.build(); + case OPEN_AI, DEEPINFRA, DEEPSEEK, GROQ, CUSTOM_OPEN_AI -> { + streamModel = buildModel(new OpenAiStreamingBuilder()); } case MISTRAL -> { - MistralAiStreamingChatModelBuilder builder = MistralAiStreamingChatModel.builder() - .apiKey(preferencesManager.getApiKey()) - .modelName(preferencesManager.getModelName()); - - if (temperature != null && temperature != Double.MIN_VALUE) { - builder.temperature(temperature); - } - if (topP != null && topP != Double.MIN_VALUE) { - builder.topP(topP); - } - if (timeout != null && timeout != Integer.MIN_VALUE) { - builder.timeout(Duration.ofSeconds(timeout)); - } - if (maxTokens != null && maxTokens != Integer.MIN_VALUE) { - builder.maxTokens(maxTokens); - } - builder.logRequests(logRequests) - .logResponses(logResponse); - streamModel = builder.build(); + streamModel = buildModel(new MistralStreamingBuilder()); } case ANTHROPIC -> { - AnthropicStreamingChatModelBuilder builder = AnthropicStreamingChatModel.builder() - .apiKey(preferencesManager.getApiKey()) - .modelName(preferencesManager.getModelName()); - - if (temperature != null && temperature != Double.MIN_VALUE) { - builder.temperature(temperature); - } - if (topP != null && topP != Double.MIN_VALUE) { - builder.topP(topP); - } - if (timeout != null && timeout != Integer.MIN_VALUE) { - builder.timeout(Duration.ofSeconds(timeout)); - } - if (maxTokens != null && maxTokens != Integer.MIN_VALUE) { - builder.maxTokens(maxTokens); - } - builder.logRequests(logRequests) - .logResponses(logResponse); - - streamModel = builder.build(); + streamModel = buildModel(new AnthropicStreamingBuilder()); } case OLLAMA -> { - OllamaStreamingChatModelBuilder builder = OllamaStreamingChatModel.builder() - .baseUrl(preferencesManager.getProviderLocation()) - .modelName(preferencesManager.getModelName()); - - if (temperature != null && temperature != Double.MIN_VALUE) { - builder.temperature(temperature); - } - if (topP != null && topP != Double.MIN_VALUE) { - builder.topP(topP); - } - if (timeout != null && timeout != Integer.MIN_VALUE) { - builder.timeout(Duration.ofSeconds(timeout)); - } - if (seed != null && seed != Integer.MIN_VALUE) { - builder.seed(seed); - } - if (repeatPenalty != null && repeatPenalty != Double.MIN_VALUE) { - builder.repeatPenalty(repeatPenalty); - } - if (customHeaders != null && !customHeaders.isEmpty()) { - builder.customHeaders(customHeaders); - } - - builder.logRequests(logRequests) - .logResponses(logResponse); - - streamModel = builder.build(); + streamModel = buildModel(new OllamaStreamingBuilder()); } case LM_STUDIO -> { - LMStudioChatModel.Builder builder = LMStudioChatModel.builder() - .baseUrl(preferencesManager.getProviderLocation()) - .modelName(preferencesManager.getModelName()); - - if (temperature != null && temperature != Double.MIN_VALUE) { - builder.temperature(temperature); - } - if (topP != null && topP != Double.MIN_VALUE) { - builder.topP(topP); - } - if (timeout != null && timeout != Integer.MIN_VALUE) { - builder.timeout(Duration.ofSeconds(timeout)); - } - if (maxTokens != null && maxTokens != Integer.MIN_VALUE) { - builder.maxTokens(maxTokens); - } - - builder.logRequests(logRequests) - .logResponses(logResponse); - - model = builder.build(); + model = buildModel(new LMStudioBuilder()); } case GPT4ALL -> { - LocalAiStreamingChatModelBuilder builder = LocalAiStreamingChatModel.builder() - .baseUrl(preferencesManager.getProviderLocation()) - .modelName(preferencesManager.getModelName()); - - if (temperature != null && temperature != Double.MIN_VALUE) { - builder.temperature(temperature); - } - if (topP != null && topP != Double.MIN_VALUE) { - builder.topP(topP); - } - if (timeout != null && timeout != Integer.MIN_VALUE) { - builder.timeout(Duration.ofSeconds(timeout)); - } - if (maxTokens != null && maxTokens != Integer.MIN_VALUE) { - builder.maxTokens(maxTokens); - } - - builder.logRequests(logRequests) - .logResponses(logResponse); - - streamModel = builder.build(); + streamModel = buildModel(new LocalAiStreamingBuilder()); } } } else { switch (preferencesManager.getProvider()) { case GOOGLE -> { - GoogleAiGeminiChatModel.GoogleAiGeminiChatModelBuilder builder = GoogleAiGeminiChatModel.builder() - .apiKey(preferencesManager.getApiKey()) - .modelName(preferencesManager.getModelName()); - - if (temperature != null && temperature != Double.MIN_VALUE) { - builder.temperature(temperature); - } - if (maxOutputTokens != null && maxOutputTokens != Integer.MIN_VALUE) { - builder.maxOutputTokens(maxOutputTokens); - } - if (topP != null && topP != Double.MIN_VALUE) { - builder.topP(topP); - } - if (timeout != null && timeout != Integer.MIN_VALUE) { - builder.timeout(Duration.ofSeconds(timeout)); - } - if (maxRetries != null && maxRetries != Integer.MIN_VALUE) { - builder.maxRetries(maxRetries); - } - if (topK != null && topK != Integer.MIN_VALUE) { - builder.topK(topK); - } - builder.logRequestsAndResponses(logRequests || logResponse) - .includeCodeExecutionOutput(includeCodeExecutionOutput) - .allowCodeExecution(allowCodeExecution); - - model = builder.build(); - } - case OPEN_AI -> { - OpenAiChatModelBuilder builder = OpenAiChatModel.builder() - .apiKey(preferencesManager.getApiKey()) - .modelName(preferencesManager.getModelName()); - - if (temperature != null && temperature != Double.MIN_VALUE) { - builder.temperature(temperature); - } - if (topP != null && topP != Double.MIN_VALUE) { - builder.topP(topP); - } - if (timeout != null && timeout != Integer.MIN_VALUE) { - builder.timeout(Duration.ofSeconds(timeout)); - } - if (seed != null && seed != Integer.MIN_VALUE) { - builder.seed(seed); - } - if (maxTokens != null && maxTokens != Integer.MIN_VALUE) { - builder.maxTokens(maxTokens); - } - if (maxCompletionTokens != null && maxCompletionTokens != Integer.MIN_VALUE) { - builder.maxCompletionTokens(maxCompletionTokens); - } - if (presencePenalty != null && presencePenalty != Double.MIN_VALUE) { - builder.presencePenalty(presencePenalty); - } - if (frequencyPenalty != null && frequencyPenalty != Double.MIN_VALUE) { - builder.frequencyPenalty(frequencyPenalty); - } - if (organizationId != null && !organizationId.isEmpty()) { - builder.organizationId(organizationId); - } - if (customHeaders != null && !customHeaders.isEmpty()) { - builder.customHeaders(customHeaders); - } - - builder.logRequests(logRequests) - .logResponses(logResponse); - - model = builder.build(); + model = buildModel(new GoogleBuilder()); } - case DEEPINFRA, DEEPSEEK, GROQ, CUSTOM_OPEN_AI -> { - OpenAiChatModelBuilder builder = OpenAiChatModel.builder() - .baseUrl(preferencesManager.getProviderLocation()) - .apiKey(preferencesManager.getApiKey()) - .modelName(preferencesManager.getModelName()); - - if (temperature != null && temperature != Double.MIN_VALUE) { - builder.temperature(temperature); - } - if (topP != null && topP != Double.MIN_VALUE) { - builder.topP(topP); - } - if (timeout != null && timeout != Integer.MIN_VALUE) { - builder.timeout(Duration.ofSeconds(timeout)); - } - if (seed != null && seed != Integer.MIN_VALUE) { - builder.seed(seed); - } - if (maxTokens != null && maxTokens != Integer.MIN_VALUE) { - builder.maxTokens(maxTokens); - } - if (maxCompletionTokens != null && maxCompletionTokens != Integer.MIN_VALUE) { - builder.maxCompletionTokens(maxCompletionTokens); - } - if (presencePenalty != null && presencePenalty != Double.MIN_VALUE) { - builder.presencePenalty(presencePenalty); - } - if (frequencyPenalty != null && frequencyPenalty != Double.MIN_VALUE) { - builder.frequencyPenalty(frequencyPenalty); - } - if (organizationId != null && !organizationId.isEmpty()) { - builder.organizationId(organizationId); - } - if (customHeaders != null && !customHeaders.isEmpty()) { - builder.customHeaders(customHeaders); - } - builder.logRequests(logRequests) - .logResponses(logResponse); - model = builder.build(); + case OPEN_AI, DEEPINFRA, DEEPSEEK, GROQ, CUSTOM_OPEN_AI -> { + model = buildModel(new OpenAiBuilder()); } case MISTRAL -> { - MistralAiChatModelBuilder builder = MistralAiChatModel.builder() - .apiKey(preferencesManager.getApiKey()) - .modelName(preferencesManager.getModelName()); - - if (temperature != null && temperature != Double.MIN_VALUE) { - builder.temperature(temperature); - } - if (topP != null && topP != Double.MIN_VALUE) { - builder.topP(topP); - } - if (timeout != null && timeout != Integer.MIN_VALUE) { - builder.timeout(Duration.ofSeconds(timeout)); - } - if (maxTokens != null && maxTokens != Integer.MIN_VALUE) { - builder.maxTokens(maxTokens); - } - builder.logRequests(logRequests) - .logResponses(logResponse); - model = builder.build(); + model = buildModel(new MistralBuilder()); } case ANTHROPIC -> { - AnthropicChatModelBuilder builder = AnthropicChatModel.builder() - .apiKey(preferencesManager.getApiKey()) - .modelName(preferencesManager.getModelName()); - - if (temperature != null && temperature != Double.MIN_VALUE) { - builder.temperature(temperature); - } - if (topP != null && topP != Double.MIN_VALUE) { - builder.topP(topP); - } - if (timeout != null && timeout != Integer.MIN_VALUE) { - builder.timeout(Duration.ofSeconds(timeout)); - } - if (maxTokens != null && maxTokens != Integer.MIN_VALUE) { - builder.maxTokens(maxTokens); - } - builder.logRequests(logRequests) - .logResponses(logResponse); - - model = builder.build(); + model = buildModel(new AnthropicBuilder()); } case OLLAMA -> { - OllamaChatModelBuilder builder = OllamaChatModel.builder() - .baseUrl(preferencesManager.getProviderLocation()) - .modelName(preferencesManager.getModelName()); - - if (temperature != null && temperature != Double.MIN_VALUE) { - builder.temperature(temperature); - } - if (topP != null && topP != Double.MIN_VALUE) { - builder.topP(topP); - } - if (timeout != null && timeout != Integer.MIN_VALUE) { - builder.timeout(Duration.ofSeconds(timeout)); - } - if (seed != null && seed != Integer.MIN_VALUE) { - builder.seed(seed); - } - if (customHeaders != null && !customHeaders.isEmpty()) { - builder.customHeaders(customHeaders); - } - - builder.logRequests(logRequests) - .logResponses(logResponse); - - model = builder.build(); + model = buildModel(new OllamaBuilder()); } case LM_STUDIO -> { - LMStudioChatModel.Builder builder = LMStudioChatModel.builder() - .baseUrl(preferencesManager.getProviderLocation()) - .modelName(preferencesManager.getModelName()); - - if (temperature != null && temperature != Double.MIN_VALUE) { - builder.temperature(temperature); - } - if (topP != null && topP != Double.MIN_VALUE) { - builder.topP(topP); - } - if (timeout != null && timeout != Integer.MIN_VALUE) { - builder.timeout(Duration.ofSeconds(timeout)); - } - if (maxTokens != null && maxTokens != Integer.MIN_VALUE) { - builder.maxTokens(maxTokens); - } - - builder.logRequests(logRequests) - .logResponses(logResponse); - - model = builder.build(); + model = buildModel(new LMStudioBuilder()); } case GPT4ALL -> { - LocalAiChatModelBuilder builder = LocalAiChatModel.builder() - .baseUrl(preferencesManager.getProviderLocation()) - .modelName(preferencesManager.getModelName()); - - if (temperature != null && temperature != Double.MIN_VALUE) { - builder.temperature(temperature); - } - if (topP != null && topP != Double.MIN_VALUE) { - builder.topP(topP); - } - if (timeout != null && timeout != Integer.MIN_VALUE) { - builder.timeout(Duration.ofSeconds(timeout)); - } - if (maxTokens != null && maxTokens != Integer.MIN_VALUE) { - builder.maxTokens(maxTokens); - } - - builder.logRequests(logRequests) - .logResponses(logResponse); - - model = builder.build(); + model = buildModel(new LocalAiBuilder()); } } } } } + private void setIfValid(final Consumer setter, final T value, final T invalidValue) { + if (value != null && !value.equals(invalidValue)) { + setter.accept(value); + } + } + + private void setIfPredicate(final Consumer setter, final T value, final Predicate predicate) { + if (value != null && !predicate.test(value)) { + setter.accept(value); + } + } + + private ChatModelBaseBuilder builderModel(final ChatModelBaseBuilder builder) { + setIfPredicate(builder::baseUrl, preferencesManager.getProviderLocation(), String::isEmpty); + setIfPredicate(builder::customHeaders, preferencesManager.getCustomHeaders(), Map::isEmpty); + builder + .apiKey(preferencesManager.getApiKey()) + .modelName(preferencesManager.getModelName()); + + setIfValid(builder::temperature, preferencesManager.getTemperature(), Double.MIN_VALUE); + setIfValid(value -> builder.timeout(Duration.ofSeconds(value)), preferencesManager.getTimeout(), Integer.MIN_VALUE); + setIfValid(builder::maxRetries, preferencesManager.getMaxRetries(), Integer.MIN_VALUE); + setIfValid(builder::maxOutputTokens, preferencesManager.getMaxOutputTokens(), Integer.MIN_VALUE); + setIfValid(builder::repeatPenalty, preferencesManager.getRepeatPenalty(), Double.MIN_VALUE); + setIfValid(builder::seed, preferencesManager.getSeed(), Integer.MIN_VALUE); + setIfValid(builder::maxTokens, preferencesManager.getMaxTokens(), Integer.MIN_VALUE); + setIfValid(builder::maxCompletionTokens, preferencesManager.getMaxCompletionTokens(), Integer.MIN_VALUE); + setIfValid(builder::topK, preferencesManager.getTopK(), Integer.MIN_VALUE); + setIfValid(builder::presencePenalty, preferencesManager.getPresencePenalty(), Double.MIN_VALUE); + setIfValid(builder::frequencyPenalty, preferencesManager.getFrequencyPenalty(), Double.MIN_VALUE); + setIfPredicate(builder::organizationId, preferencesManager.getOrganizationId(), String::isEmpty); + + builder.logRequestsResponses(preferencesManager.isLogRequestsEnabled(), preferencesManager.isLogResponsesEnabled()) + .includeCodeExecutionOutput(preferencesManager.isIncludeCodeExecutionOutput()) + .allowCodeExecution(preferencesManager.isAllowCodeExecution()); + + return builder; + } + + private T buildModel(final ChatModelBaseBuilder builder) { + return builderModel(builder).build(); + } + private String generate(Project project, String prompt) { if (model == null && handler == null) { JOptionPane.showMessageDialog(null, diff --git a/src/main/java/io/github/jeddict/ai/lang/impl/AnthropicBuilder.java b/src/main/java/io/github/jeddict/ai/lang/impl/AnthropicBuilder.java new file mode 100644 index 0000000..b479977 --- /dev/null +++ b/src/main/java/io/github/jeddict/ai/lang/impl/AnthropicBuilder.java @@ -0,0 +1,146 @@ +package io.github.jeddict.ai.lang.impl; + +import dev.langchain4j.model.anthropic.AnthropicChatModel; +import dev.langchain4j.model.chat.ChatLanguageModel; +import io.github.jeddict.ai.lang.ChatModelBuilder; +import java.time.Duration; +import java.util.Map; + +/** + * + * @author Francois Steyn + */ +public class AnthropicBuilder implements ChatModelBuilder { + + private final AnthropicChatModel.AnthropicChatModelBuilder builder; + + public AnthropicBuilder() { + builder = AnthropicChatModel.builder(); + } + + @Override + public ChatModelBuilder baseUrl(final String baseUrl) { + builder.baseUrl(baseUrl); + return this; + } + + @Override + public ChatModelBuilder customHeaders(final Map customHeaders) { + //NOOP + return this; + } + + @Override + public ChatModelBuilder apiKey(final String apiKey) { + builder.apiKey(apiKey); + return this; + } + + @Override + public ChatModelBuilder modelName(final String modelName) { + builder.modelName(modelName); + return this; + } + + @Override + public ChatModelBuilder temperature(final Double temperature) { + builder.temperature(temperature); + return this; + } + + @Override + public ChatModelBuilder timeout(final Duration timeout) { + builder.timeout(timeout); + return this; + } + + @Override + public ChatModelBuilder topP(final Double topP) { + builder.topP(topP); + return this; + } + + @Override + public ChatModelBuilder maxRetries(final Integer maxRetries) { + builder.maxRetries(maxRetries); + return this; + } + + @Override + public ChatModelBuilder maxOutputTokens(final Integer maxOutputTokens) { + //NOOP + return this; + } + + @Override + public ChatModelBuilder repeatPenalty(final Double repeatPenalty) { + //NOOP + return this; + } + + @Override + public ChatModelBuilder seed(final Integer seed) { + //NOOP + return this; + } + + @Override + public ChatModelBuilder maxTokens(final Integer maxTokens) { + builder.maxTokens(maxTokens); + return this; + } + + @Override + public ChatModelBuilder maxCompletionTokens(final Integer maxCompletionTokens) { + //NOOP + return this; + } + + @Override + public ChatModelBuilder topK(final Integer topK) { + builder.topK(topK); + return this; + } + + @Override + public ChatModelBuilder presencePenalty(final Double presencePenalty) { + //NOOP + return this; + } + + @Override + public ChatModelBuilder frequencyPenalty(final Double frequencyPenalty) { + //NOOP + return this; + } + + @Override + public ChatModelBuilder organizationId(final String organizationId) { + //NOOP + return this; + } + + @Override + public ChatModelBuilder logRequestsResponses(final boolean logRequests, final boolean logResponses) { + builder.logRequests(logRequests) + .logResponses(logResponses); + return this; + } + + @Override + public ChatModelBuilder includeCodeExecutionOutput(final boolean includeCodeExecutionOutput) { + //NOOP + return this; + } + + @Override + public ChatModelBuilder allowCodeExecution(final boolean allowCodeExecution) { + //NOOP + return this; + } + + @Override + public ChatLanguageModel build() { + return builder.build(); + } +} diff --git a/src/main/java/io/github/jeddict/ai/lang/impl/AnthropicStreamingBuilder.java b/src/main/java/io/github/jeddict/ai/lang/impl/AnthropicStreamingBuilder.java new file mode 100644 index 0000000..aaf4402 --- /dev/null +++ b/src/main/java/io/github/jeddict/ai/lang/impl/AnthropicStreamingBuilder.java @@ -0,0 +1,146 @@ +package io.github.jeddict.ai.lang.impl; + +import dev.langchain4j.model.anthropic.AnthropicStreamingChatModel; +import dev.langchain4j.model.chat.StreamingChatLanguageModel; +import io.github.jeddict.ai.lang.ChatModelStreamingBuilder; +import java.time.Duration; +import java.util.Map; + +/** + * + * @author Francois Steyn + */ +public class AnthropicStreamingBuilder implements ChatModelStreamingBuilder { + + private final AnthropicStreamingChatModel.AnthropicStreamingChatModelBuilder builder; + + public AnthropicStreamingBuilder() { + builder = AnthropicStreamingChatModel.builder(); + } + + @Override + public ChatModelStreamingBuilder baseUrl(final String baseUrl) { + builder.baseUrl(baseUrl); + return this; + } + + @Override + public ChatModelStreamingBuilder customHeaders(final Map customHeaders) { + //NOOP + return this; + } + + @Override + public ChatModelStreamingBuilder apiKey(final String apiKey) { + builder.apiKey(apiKey); + return this; + } + + @Override + public ChatModelStreamingBuilder modelName(final String modelName) { + builder.modelName(modelName); + return this; + } + + @Override + public ChatModelStreamingBuilder temperature(final Double temperature) { + builder.temperature(temperature); + return this; + } + + @Override + public ChatModelStreamingBuilder timeout(final Duration timeout) { + builder.timeout(timeout); + return this; + } + + @Override + public ChatModelStreamingBuilder topP(final Double topP) { + builder.topP(topP); + return this; + } + + @Override + public ChatModelStreamingBuilder maxRetries(final Integer maxRetries) { + //NOOP + return this; + } + + @Override + public ChatModelStreamingBuilder maxOutputTokens(final Integer maxOutputTokens) { + //NOOP + return this; + } + + @Override + public ChatModelStreamingBuilder repeatPenalty(final Double repeatPenalty) { + //NOOP + return this; + } + + @Override + public ChatModelStreamingBuilder seed(final Integer seed) { + //NOOP + return this; + } + + @Override + public ChatModelStreamingBuilder maxTokens(final Integer maxTokens) { + builder.maxTokens(maxTokens); + return this; + } + + @Override + public ChatModelStreamingBuilder maxCompletionTokens(final Integer maxCompletionTokens) { + //NOOP + return this; + } + + @Override + public ChatModelStreamingBuilder topK(final Integer topK) { + builder.topK(topK); + return this; + } + + @Override + public ChatModelStreamingBuilder presencePenalty(final Double presencePenalty) { + //NOOP + return this; + } + + @Override + public ChatModelStreamingBuilder frequencyPenalty(final Double frequencyPenalty) { + //NOOP + return this; + } + + @Override + public ChatModelStreamingBuilder organizationId(final String organizationId) { + //NOOP + return this; + } + + @Override + public ChatModelStreamingBuilder logRequestsResponses(final boolean logRequests, final boolean logResponses) { + builder.logRequests(logRequests) + .logResponses(logResponses); + return this; + } + + @Override + public ChatModelStreamingBuilder includeCodeExecutionOutput(final boolean includeCodeExecutionOutput) { + //NOOP + return this; + } + + @Override + public ChatModelStreamingBuilder allowCodeExecution(final boolean allowCodeExecution) { + //NOOP + return this; + } + + @Override + public StreamingChatLanguageModel build() { + return builder.build(); + } +} diff --git a/src/main/java/io/github/jeddict/ai/lang/impl/GoogleBuilder.java b/src/main/java/io/github/jeddict/ai/lang/impl/GoogleBuilder.java new file mode 100644 index 0000000..8d9489d --- /dev/null +++ b/src/main/java/io/github/jeddict/ai/lang/impl/GoogleBuilder.java @@ -0,0 +1,145 @@ +package io.github.jeddict.ai.lang.impl; + +import dev.langchain4j.model.chat.ChatLanguageModel; +import dev.langchain4j.model.googleai.GoogleAiGeminiChatModel; +import io.github.jeddict.ai.lang.ChatModelBuilder; +import java.time.Duration; +import java.util.Map; + +/** + * + * @author Francois Steyn + */ +public class GoogleBuilder implements ChatModelBuilder { + + private final GoogleAiGeminiChatModel.GoogleAiGeminiChatModelBuilder builder; + + public GoogleBuilder() { + builder = GoogleAiGeminiChatModel.builder(); + } + + @Override + public ChatModelBuilder baseUrl(final String baseUrl) { + //NOOP + return this; + } + + @Override + public ChatModelBuilder customHeaders(final Map customHeaders) { + //NOOP + return this; + } + + @Override + public ChatModelBuilder apiKey(final String apiKey) { + builder.apiKey(apiKey); + return this; + } + + @Override + public ChatModelBuilder modelName(final String modelName) { + builder.modelName(modelName); + return this; + } + + @Override + public ChatModelBuilder temperature(final Double temperature) { + builder.temperature(temperature); + return this; + } + + @Override + public ChatModelBuilder timeout(final Duration timeout) { + builder.timeout(timeout); + return this; + } + + @Override + public ChatModelBuilder topP(final Double topP) { + builder.topP(topP); + return this; + } + + @Override + public ChatModelBuilder maxRetries(final Integer maxRetries) { + builder.maxRetries(maxRetries); + return this; + } + + @Override + public ChatModelBuilder maxOutputTokens(final Integer maxOutputTokens) { + builder.maxOutputTokens(maxOutputTokens); + return this; + } + + @Override + public ChatModelBuilder repeatPenalty(final Double repeatPenalty) { + //NOOP + return this; + } + + @Override + public ChatModelBuilder seed(final Integer seed) { + //NOOP + return this; + } + + @Override + public ChatModelBuilder maxTokens(final Integer maxTokens) { + //NOOP + return this; + } + + @Override + public ChatModelBuilder maxCompletionTokens(final Integer maxCompletionTokens) { + //NOOP + return this; + } + + @Override + public ChatModelBuilder topK(final Integer topK) { + builder.topK(topK); + return this; + } + + @Override + public ChatModelBuilder presencePenalty(final Double presencePenalty) { + //NOOP + return this; + } + + @Override + public ChatModelBuilder frequencyPenalty(final Double frequencyPenalty) { + //NOOP + return this; + } + + @Override + public ChatModelBuilder organizationId(final String organizationId) { + //NOOP + return this; + } + + @Override + public ChatModelBuilder logRequestsResponses(final boolean logRequests, final boolean logResponses) { + builder.logRequestsAndResponses(logRequests || logResponses); + return this; + } + + @Override + public ChatModelBuilder includeCodeExecutionOutput(final boolean includeCodeExecutionOutput) { + builder.includeCodeExecutionOutput(includeCodeExecutionOutput); + return this; + } + + @Override + public ChatModelBuilder allowCodeExecution(final boolean allowCodeExecution) { + builder.allowCodeExecution(allowCodeExecution); + return this; + } + + @Override + public ChatLanguageModel build() { + return builder.build(); + } +} diff --git a/src/main/java/io/github/jeddict/ai/lang/impl/GoogleStreamingBuilder.java b/src/main/java/io/github/jeddict/ai/lang/impl/GoogleStreamingBuilder.java new file mode 100644 index 0000000..1a4f9f5 --- /dev/null +++ b/src/main/java/io/github/jeddict/ai/lang/impl/GoogleStreamingBuilder.java @@ -0,0 +1,146 @@ +package io.github.jeddict.ai.lang.impl; + +import dev.langchain4j.model.chat.StreamingChatLanguageModel; +import dev.langchain4j.model.googleai.GoogleAiGeminiStreamingChatModel; +import io.github.jeddict.ai.lang.ChatModelStreamingBuilder; +import java.time.Duration; +import java.util.Map; + +/** + * + * @author Francois Steyn + */ +public class GoogleStreamingBuilder implements ChatModelStreamingBuilder { + + private final GoogleAiGeminiStreamingChatModel.GoogleAiGeminiStreamingChatModelBuilder builder; + + public GoogleStreamingBuilder() { + builder = GoogleAiGeminiStreamingChatModel.builder(); + } + + @Override + public ChatModelStreamingBuilder baseUrl(final String baseUrl) { + //NOOP + return this; + } + + @Override + public ChatModelStreamingBuilder customHeaders(final Map customHeaders) { + //NOOP + return this; + } + + @Override + public ChatModelStreamingBuilder apiKey(final String apiKey) { + builder.apiKey(apiKey); + return this; + } + + @Override + public ChatModelStreamingBuilder modelName(final String modelName) { + builder.modelName(modelName); + return this; + } + + @Override + public ChatModelStreamingBuilder temperature(final Double temperature) { + builder.temperature(temperature); + return this; + } + + @Override + public ChatModelStreamingBuilder timeout(final Duration timeout) { + builder.timeout(timeout); + return this; + } + + @Override + public ChatModelStreamingBuilder topP(final Double topP) { + builder.topP(topP); + return this; + } + + @Override + public ChatModelStreamingBuilder maxRetries(final Integer maxRetries) { + builder.maxRetries(maxRetries); + return this; + } + + @Override + public ChatModelStreamingBuilder maxOutputTokens(final Integer maxOutputTokens) { + builder.maxOutputTokens(maxOutputTokens); + return this; + } + + @Override + public ChatModelStreamingBuilder repeatPenalty(final Double repeatPenalty) { + //NOOP + return this; + } + + @Override + public ChatModelStreamingBuilder seed(final Integer seed) { + //NOOP + return this; + } + + @Override + public ChatModelStreamingBuilder maxTokens(final Integer maxTokens) { + //NOOP + return this; + } + + @Override + public ChatModelStreamingBuilder maxCompletionTokens(final Integer maxCompletionTokens) { + //NOOP + return this; + } + + @Override + public ChatModelStreamingBuilder topK(final Integer topK) { + builder.topK(topK); + return this; + } + + @Override + public ChatModelStreamingBuilder presencePenalty(final Double presencePenalty) { + //NOOP + return this; + } + + @Override + public ChatModelStreamingBuilder frequencyPenalty(final Double frequencyPenalty) { + //NOOP + return this; + } + + @Override + public ChatModelStreamingBuilder organizationId(final String organizationId) { + //NOOP + return this; + } + + @Override + public ChatModelStreamingBuilder logRequestsResponses(final boolean logRequests, final boolean logResponses) { + builder.logRequestsAndResponses(logRequests || logResponses); + return this; + } + + @Override + public ChatModelStreamingBuilder includeCodeExecutionOutput(final boolean includeCodeExecutionOutput) { + builder.includeCodeExecutionOutput(includeCodeExecutionOutput); + return this; + } + + @Override + public ChatModelStreamingBuilder allowCodeExecution(final boolean allowCodeExecution) { + builder.allowCodeExecution(allowCodeExecution); + return this; + } + + @Override + public StreamingChatLanguageModel build() { + return builder.build(); + } + +} diff --git a/src/main/java/io/github/jeddict/ai/lang/impl/LMStudioBuilder.java b/src/main/java/io/github/jeddict/ai/lang/impl/LMStudioBuilder.java new file mode 100644 index 0000000..6abc273 --- /dev/null +++ b/src/main/java/io/github/jeddict/ai/lang/impl/LMStudioBuilder.java @@ -0,0 +1,146 @@ +package io.github.jeddict.ai.lang.impl; + +import dev.langchain4j.model.chat.ChatLanguageModel; +import io.github.jeddict.ai.lang.ChatModelBuilder; +import io.github.jeddict.ai.models.LMStudioChatModel; +import java.time.Duration; +import java.util.Map; + +/** + * + * @author Francois Steyn + */ +public class LMStudioBuilder implements ChatModelBuilder { + + private final LMStudioChatModel.Builder builder; + + public LMStudioBuilder() { + builder = LMStudioChatModel.builder(); + } + + @Override + public ChatModelBuilder baseUrl(final String baseUrl) { + builder.baseUrl(baseUrl); + return this; + } + + @Override + public ChatModelBuilder customHeaders(final Map customHeaders) { + //NOOP + return this; + } + + @Override + public ChatModelBuilder apiKey(final String apiKey) { + //NOOP + return this; + } + + @Override + public ChatModelBuilder modelName(final String modelName) { + builder.modelName(modelName); + return this; + } + + @Override + public ChatModelBuilder temperature(final Double temperature) { + builder.temperature(temperature); + return this; + } + + @Override + public ChatModelBuilder timeout(final Duration timeout) { + builder.timeout(timeout); + return this; + } + + @Override + public ChatModelBuilder topP(final Double topP) { + builder.topP(topP); + return this; + } + + @Override + public ChatModelBuilder maxRetries(final Integer maxRetries) { + builder.maxRetries(maxRetries); + return this; + } + + @Override + public ChatModelBuilder maxOutputTokens(final Integer maxOutputTokens) { + //NOOP + return this; + } + + @Override + public ChatModelBuilder repeatPenalty(final Double repeatPenalty) { + //NOOP + return this; + } + + @Override + public ChatModelBuilder seed(final Integer seed) { + //NOOP + return this; + } + + @Override + public ChatModelBuilder maxTokens(final Integer maxTokens) { + builder.maxTokens(maxTokens); + return this; + } + + @Override + public ChatModelBuilder maxCompletionTokens(final Integer maxCompletionTokens) { + //NOOP + return this; + } + + @Override + public ChatModelBuilder topK(final Integer topK) { + //NOOP + return this; + } + + @Override + public ChatModelBuilder presencePenalty(final Double presencePenalty) { + //NOOP + return this; + } + + @Override + public ChatModelBuilder frequencyPenalty(final Double frequencyPenalty) { + //NOOP + return this; + } + + @Override + public ChatModelBuilder organizationId(final String organizationId) { + //NOOP + return this; + } + + @Override + public ChatModelBuilder logRequestsResponses(final boolean logRequests, final boolean logResponses) { + builder.logRequests(logRequests) + .logResponses(logResponses); + return this; + } + + @Override + public ChatModelBuilder includeCodeExecutionOutput(final boolean includeCodeExecutionOutput) { + //NOOP + return this; + } + + @Override + public ChatModelBuilder allowCodeExecution(final boolean allowCodeExecution) { + //NOOP + return this; + } + + @Override + public ChatLanguageModel build() { + return builder.build(); + } +} diff --git a/src/main/java/io/github/jeddict/ai/lang/impl/LocalAiBuilder.java b/src/main/java/io/github/jeddict/ai/lang/impl/LocalAiBuilder.java new file mode 100644 index 0000000..b4911e7 --- /dev/null +++ b/src/main/java/io/github/jeddict/ai/lang/impl/LocalAiBuilder.java @@ -0,0 +1,146 @@ +package io.github.jeddict.ai.lang.impl; + +import dev.langchain4j.model.chat.ChatLanguageModel; +import dev.langchain4j.model.localai.LocalAiChatModel; +import io.github.jeddict.ai.lang.ChatModelBuilder; +import java.time.Duration; +import java.util.Map; + +/** + * + * @author Francois Steyn + */ +public class LocalAiBuilder implements ChatModelBuilder { + + private final LocalAiChatModel.LocalAiChatModelBuilder builder; + + public LocalAiBuilder() { + builder = LocalAiChatModel.builder(); + } + + @Override + public ChatModelBuilder baseUrl(final String baseUrl) { + builder.baseUrl(baseUrl); + return this; + } + + @Override + public ChatModelBuilder customHeaders(final Map customHeaders) { + //NOOP + return this; + } + + @Override + public ChatModelBuilder apiKey(final String apiKey) { + //NOOP + return this; + } + + @Override + public ChatModelBuilder modelName(final String modelName) { + builder.modelName(modelName); + return this; + } + + @Override + public ChatModelBuilder temperature(final Double temperature) { + builder.temperature(temperature); + return this; + } + + @Override + public ChatModelBuilder timeout(final Duration timeout) { + builder.timeout(timeout); + return this; + } + + @Override + public ChatModelBuilder topP(final Double topP) { + builder.topP(topP); + return this; + } + + @Override + public ChatModelBuilder maxRetries(final Integer maxRetries) { + builder.maxRetries(maxRetries); + return this; + } + + @Override + public ChatModelBuilder maxOutputTokens(final Integer maxOutputTokens) { + //NOOP + return this; + } + + @Override + public ChatModelBuilder repeatPenalty(final Double repeatPenalty) { + //NOOP + return this; + } + + @Override + public ChatModelBuilder seed(final Integer seed) { + //NOOP + return this; + } + + @Override + public ChatModelBuilder maxTokens(final Integer maxTokens) { + builder.maxTokens(maxTokens); + return this; + } + + @Override + public ChatModelBuilder maxCompletionTokens(final Integer maxCompletionTokens) { + //NOOP + return this; + } + + @Override + public ChatModelBuilder topK(final Integer topK) { + //NOOP + return this; + } + + @Override + public ChatModelBuilder presencePenalty(final Double presencePenalty) { + //NOOP + return this; + } + + @Override + public ChatModelBuilder frequencyPenalty(final Double frequencyPenalty) { + //NOOP + return this; + } + + @Override + public ChatModelBuilder organizationId(final String organizationId) { + //NOOP + return this; + } + + @Override + public ChatModelBuilder logRequestsResponses(final boolean logRequests, final boolean logResponses) { + builder.logRequests(logRequests) + .logResponses(logResponses); + return this; + } + + @Override + public ChatModelBuilder includeCodeExecutionOutput(final boolean includeCodeExecutionOutput) { + //NOOP + return this; + } + + @Override + public ChatModelBuilder allowCodeExecution(final boolean allowCodeExecution) { + //NOOP + return this; + } + + @Override + public ChatLanguageModel build() { + return builder.build(); + } +} diff --git a/src/main/java/io/github/jeddict/ai/lang/impl/LocalAiStreamingBuilder.java b/src/main/java/io/github/jeddict/ai/lang/impl/LocalAiStreamingBuilder.java new file mode 100644 index 0000000..6a5180a --- /dev/null +++ b/src/main/java/io/github/jeddict/ai/lang/impl/LocalAiStreamingBuilder.java @@ -0,0 +1,144 @@ +package io.github.jeddict.ai.lang.impl; + +import dev.langchain4j.model.chat.StreamingChatLanguageModel; +import dev.langchain4j.model.localai.LocalAiStreamingChatModel; +import io.github.jeddict.ai.lang.ChatModelStreamingBuilder; +import java.time.Duration; +import java.util.Map; + +/** + * + * @author Francois Steyn + */ +public class LocalAiStreamingBuilder implements ChatModelStreamingBuilder { + + private final LocalAiStreamingChatModel.LocalAiStreamingChatModelBuilder builder; + + public LocalAiStreamingBuilder() { + builder = LocalAiStreamingChatModel.builder(); + } + + @Override + public ChatModelStreamingBuilder baseUrl(final String baseUrl) { + builder.baseUrl(baseUrl); + return this; + } + + @Override + public ChatModelStreamingBuilder customHeaders(final Map customHeaders) { + //NOOP + return this; + } + + @Override + public ChatModelStreamingBuilder apiKey(final String apiKey) { + //NOOP + return this; + } + + @Override + public ChatModelStreamingBuilder modelName(final String modelName) { + builder.modelName(modelName); + return this; + } + + @Override + public ChatModelStreamingBuilder temperature(final Double temperature) { + builder.temperature(temperature); + return this; + } + + @Override + public ChatModelStreamingBuilder timeout(final Duration timeout) { + builder.timeout(timeout); + return this; + } + + @Override + public ChatModelStreamingBuilder topP(final Double topP) { + builder.topP(topP); + return this; + } + + @Override + public ChatModelStreamingBuilder maxRetries(final Integer maxRetries) { + //NOOP + return this; + } + + @Override + public ChatModelStreamingBuilder maxOutputTokens(final Integer maxOutputTokens) { + //NOOP + return this; + } + + @Override + public ChatModelStreamingBuilder repeatPenalty(final Double repeatPenalty) { + //NOOP + return this; + } + + @Override + public ChatModelStreamingBuilder seed(final Integer seed) { + //NOOP + return this; + } + + @Override + public ChatModelStreamingBuilder maxTokens(final Integer maxTokens) { + builder.maxTokens(maxTokens); + return this; + } + + @Override + public ChatModelStreamingBuilder maxCompletionTokens(final Integer maxCompletionTokens) { + //NOOP + return this; + } + + @Override + public ChatModelStreamingBuilder topK(final Integer topK) { + //NOOP + return this; + } + + @Override + public ChatModelStreamingBuilder presencePenalty(final Double presencePenalty) { + //NOOP + return this; + } + + @Override + public ChatModelStreamingBuilder frequencyPenalty(final Double frequencyPenalty) { + //NOOP + return this; + } + + @Override + public ChatModelStreamingBuilder organizationId(final String organizationId) { + //NOOP + return this; + } + + @Override + public ChatModelStreamingBuilder logRequestsResponses(final boolean logRequests, final boolean logResponses) { + builder.logRequests(logRequests) + .logResponses(logResponses); + return this; + } + + @Override + public ChatModelStreamingBuilder includeCodeExecutionOutput(final boolean includeCodeExecutionOutput) { + return this; + } + + @Override + public ChatModelStreamingBuilder allowCodeExecution(final boolean allowCodeExecution) { + return this; + } + + @Override + public StreamingChatLanguageModel build() { + return builder.build(); + } +} diff --git a/src/main/java/io/github/jeddict/ai/lang/impl/MistralBuilder.java b/src/main/java/io/github/jeddict/ai/lang/impl/MistralBuilder.java new file mode 100644 index 0000000..4f43072 --- /dev/null +++ b/src/main/java/io/github/jeddict/ai/lang/impl/MistralBuilder.java @@ -0,0 +1,146 @@ +package io.github.jeddict.ai.lang.impl; + +import dev.langchain4j.model.chat.ChatLanguageModel; +import dev.langchain4j.model.mistralai.MistralAiChatModel; +import io.github.jeddict.ai.lang.ChatModelBuilder; +import java.time.Duration; +import java.util.Map; + +/** + * + * @author Francois Steyn + */ +public class MistralBuilder implements ChatModelBuilder { + + private final MistralAiChatModel.MistralAiChatModelBuilder builder; + + public MistralBuilder() { + builder = MistralAiChatModel.builder(); + } + + @Override + public ChatModelBuilder baseUrl(final String baseUrl) { + builder.baseUrl(baseUrl); + return this; + } + + @Override + public ChatModelBuilder customHeaders(final Map customHeaders) { + //NOOP + return this; + } + + @Override + public ChatModelBuilder apiKey(final String apiKey) { + builder.apiKey(apiKey); + return this; + } + + @Override + public ChatModelBuilder modelName(final String modelName) { + builder.modelName(modelName); + return this; + } + + @Override + public ChatModelBuilder temperature(final Double temperature) { + builder.temperature(temperature); + return this; + } + + @Override + public ChatModelBuilder timeout(final Duration timeout) { + builder.timeout(timeout); + return this; + } + + @Override + public ChatModelBuilder topP(final Double topP) { + builder.topP(topP); + return this; + } + + @Override + public ChatModelBuilder maxRetries(final Integer maxRetries) { + builder.maxRetries(maxRetries); + return this; + } + + @Override + public ChatModelBuilder maxOutputTokens(final Integer maxOutputTokens) { + //NOOP + return this; + } + + @Override + public ChatModelBuilder repeatPenalty(final Double repeatPenalty) { + //NOOP + return this; + } + + @Override + public ChatModelBuilder seed(final Integer seed) { + //NOOP + return this; + } + + @Override + public ChatModelBuilder maxTokens(final Integer maxTokens) { + builder.maxTokens(maxTokens); + return this; + } + + @Override + public ChatModelBuilder maxCompletionTokens(final Integer maxCompletionTokens) { + //NOOP + return this; + } + + @Override + public ChatModelBuilder topK(final Integer topK) { + //NOOP + return this; + } + + @Override + public ChatModelBuilder presencePenalty(final Double presencePenalty) { + //NOOP + return this; + } + + @Override + public ChatModelBuilder frequencyPenalty(final Double frequencyPenalty) { + //NOOP + return this; + } + + @Override + public ChatModelBuilder organizationId(final String organizationId) { + //NOOP + return this; + } + + @Override + public ChatModelBuilder logRequestsResponses(final boolean logRequests, final boolean logResponses) { + builder.logRequests(logRequests) + .logResponses(logResponses); + return this; + } + + @Override + public ChatModelBuilder includeCodeExecutionOutput(final boolean includeCodeExecutionOutput) { + //NOOP + return this; + } + + @Override + public ChatModelBuilder allowCodeExecution(final boolean allowCodeExecution) { + //NOOP + return this; + } + + @Override + public ChatLanguageModel build() { + return builder.build(); + } +} diff --git a/src/main/java/io/github/jeddict/ai/lang/impl/MistralStreamingBuilder.java b/src/main/java/io/github/jeddict/ai/lang/impl/MistralStreamingBuilder.java new file mode 100644 index 0000000..8777654 --- /dev/null +++ b/src/main/java/io/github/jeddict/ai/lang/impl/MistralStreamingBuilder.java @@ -0,0 +1,146 @@ +package io.github.jeddict.ai.lang.impl; + +import dev.langchain4j.model.chat.StreamingChatLanguageModel; +import dev.langchain4j.model.mistralai.MistralAiStreamingChatModel; +import io.github.jeddict.ai.lang.ChatModelStreamingBuilder; +import java.time.Duration; +import java.util.Map; + +/** + * + * @author Francois Steyn + */ +public class MistralStreamingBuilder implements ChatModelStreamingBuilder { + + private final MistralAiStreamingChatModel.MistralAiStreamingChatModelBuilder builder; + + public MistralStreamingBuilder() { + builder = MistralAiStreamingChatModel.builder(); + } + + @Override + public ChatModelStreamingBuilder baseUrl(final String baseUrl) { + builder.baseUrl(baseUrl); + return this; + } + + @Override + public ChatModelStreamingBuilder customHeaders(final Map customHeaders) { + //NOOP + return this; + } + + @Override + public ChatModelStreamingBuilder apiKey(final String apiKey) { + builder.apiKey(apiKey); + return this; + } + + @Override + public ChatModelStreamingBuilder modelName(final String modelName) { + builder.modelName(modelName); + return this; + } + + @Override + public ChatModelStreamingBuilder temperature(final Double temperature) { + builder.temperature(temperature); + return this; + } + + @Override + public ChatModelStreamingBuilder timeout(final Duration timeout) { + builder.timeout(timeout); + return this; + } + + @Override + public ChatModelStreamingBuilder topP(final Double topP) { + builder.topP(topP); + return this; + } + + @Override + public ChatModelStreamingBuilder maxRetries(final Integer maxRetries) { + //NOOP + return this; + } + + @Override + public ChatModelStreamingBuilder maxOutputTokens(final Integer maxOutputTokens) { + //NOOP + return this; + } + + @Override + public ChatModelStreamingBuilder repeatPenalty(final Double repeatPenalty) { + //NOOP + return this; + } + + @Override + public ChatModelStreamingBuilder seed(final Integer seed) { + //NOOP + return this; + } + + @Override + public ChatModelStreamingBuilder maxTokens(final Integer maxTokens) { + builder.maxTokens(maxTokens); + return this; + } + + @Override + public ChatModelStreamingBuilder maxCompletionTokens(final Integer maxCompletionTokens) { + //NOOP + return this; + } + + @Override + public ChatModelStreamingBuilder topK(final Integer topK) { + //NOOP + return this; + } + + @Override + public ChatModelStreamingBuilder presencePenalty(final Double presencePenalty) { + //NOOP + return this; + } + + @Override + public ChatModelStreamingBuilder frequencyPenalty(final Double frequencyPenalty) { + //NOOP + return this; + } + + @Override + public ChatModelStreamingBuilder organizationId(final String organizationId) { + //NOOP + return this; + } + + @Override + public ChatModelStreamingBuilder logRequestsResponses(final boolean logRequests, final boolean logResponses) { + builder.logRequests(logRequests) + .logResponses(logResponses); + return this; + } + + @Override + public ChatModelStreamingBuilder includeCodeExecutionOutput(final boolean includeCodeExecutionOutput) { + //NOOP + return this; + } + + @Override + public ChatModelStreamingBuilder allowCodeExecution(final boolean allowCodeExecution) { + //NOOP + return this; + } + + @Override + public StreamingChatLanguageModel build() { + return builder.build(); + } +} diff --git a/src/main/java/io/github/jeddict/ai/lang/impl/OllamaBuilder.java b/src/main/java/io/github/jeddict/ai/lang/impl/OllamaBuilder.java new file mode 100644 index 0000000..bda554e --- /dev/null +++ b/src/main/java/io/github/jeddict/ai/lang/impl/OllamaBuilder.java @@ -0,0 +1,146 @@ +package io.github.jeddict.ai.lang.impl; + +import dev.langchain4j.model.chat.ChatLanguageModel; +import dev.langchain4j.model.ollama.OllamaChatModel; +import io.github.jeddict.ai.lang.ChatModelBuilder; +import java.time.Duration; +import java.util.Map; + +/** + * + * @author Francois Steyn + */ +public class OllamaBuilder implements ChatModelBuilder { + + private final OllamaChatModel.OllamaChatModelBuilder builder; + + public OllamaBuilder() { + builder = OllamaChatModel.builder(); + } + + @Override + public ChatModelBuilder baseUrl(final String baseUrl) { + builder.baseUrl(baseUrl); + return this; + } + + @Override + public ChatModelBuilder customHeaders(final Map customHeaders) { + builder.customHeaders(customHeaders); + return this; + } + + @Override + public ChatModelBuilder apiKey(final String apiKey) { + //NOOP + return this; + } + + @Override + public ChatModelBuilder modelName(final String modelName) { + builder.modelName(modelName); + return this; + } + + @Override + public ChatModelBuilder temperature(final Double temperature) { + builder.temperature(temperature); + return this; + } + + @Override + public ChatModelBuilder timeout(final Duration timeout) { + builder.timeout(timeout); + return this; + } + + @Override + public ChatModelBuilder topP(final Double topP) { + builder.topP(topP); + return this; + } + + @Override + public ChatModelBuilder maxRetries(final Integer maxRetries) { + builder.maxRetries(maxRetries); + return this; + } + + @Override + public ChatModelBuilder maxOutputTokens(final Integer maxOutputTokens) { + //NOOP + return this; + } + + @Override + public ChatModelBuilder repeatPenalty(final Double repeatPenalty) { + builder.repeatPenalty(repeatPenalty); + return this; + } + + @Override + public ChatModelBuilder seed(final Integer seed) { + builder.seed(seed); + return this; + } + + @Override + public ChatModelBuilder maxTokens(final Integer maxTokens) { + //NOOP + return this; + } + + @Override + public ChatModelBuilder maxCompletionTokens(final Integer maxCompletionTokens) { + //NOOP + return this; + } + + @Override + public ChatModelBuilder topK(final Integer topK) { + builder.topK(topK); + return this; + } + + @Override + public ChatModelBuilder presencePenalty(final Double presencePenalty) { + //NOOP + return this; + } + + @Override + public ChatModelBuilder frequencyPenalty(final Double frequencyPenalty) { + //NOOP + return this; + } + + @Override + public ChatModelBuilder organizationId(final String organizationId) { + //NOOP + return this; + } + + @Override + public ChatModelBuilder logRequestsResponses(final boolean logRequests, final boolean logResponses) { + builder.logRequests(logRequests) + .logResponses(logResponses); + return this; + } + + @Override + public ChatModelBuilder includeCodeExecutionOutput(final boolean includeCodeExecutionOutput) { + //NOOP + return this; + } + + @Override + public ChatModelBuilder allowCodeExecution(final boolean allowCodeExecution) { + //NOOP + return this; + } + + @Override + public ChatLanguageModel build() { + return builder.build(); + } +} diff --git a/src/main/java/io/github/jeddict/ai/lang/impl/OllamaStreamingBuilder.java b/src/main/java/io/github/jeddict/ai/lang/impl/OllamaStreamingBuilder.java new file mode 100644 index 0000000..f0c47a7 --- /dev/null +++ b/src/main/java/io/github/jeddict/ai/lang/impl/OllamaStreamingBuilder.java @@ -0,0 +1,147 @@ +package io.github.jeddict.ai.lang.impl; + +import dev.langchain4j.model.chat.StreamingChatLanguageModel; +import dev.langchain4j.model.ollama.OllamaStreamingChatModel; +import io.github.jeddict.ai.lang.ChatModelBuilder; +import io.github.jeddict.ai.lang.ChatModelStreamingBuilder; +import java.time.Duration; +import java.util.Map; + +/** + * + * @author Francois Steyn + */ +public class OllamaStreamingBuilder implements ChatModelStreamingBuilder { + + private final OllamaStreamingChatModel.OllamaStreamingChatModelBuilder builder; + + public OllamaStreamingBuilder() { + builder = OllamaStreamingChatModel.builder(); + } + + @Override + public ChatModelStreamingBuilder baseUrl(final String baseUrl) { + builder.baseUrl(baseUrl); + return this; + } + + @Override + public ChatModelStreamingBuilder customHeaders(final Map customHeaders) { + builder.customHeaders(customHeaders); + return this; + } + + @Override + public ChatModelStreamingBuilder apiKey(final String apiKey) { + //NOOP + return this; + } + + @Override + public ChatModelStreamingBuilder modelName(final String modelName) { + builder.modelName(modelName); + return this; + } + + @Override + public ChatModelStreamingBuilder temperature(final Double temperature) { + builder.temperature(temperature); + return this; + } + + @Override + public ChatModelStreamingBuilder timeout(final Duration timeout) { + builder.timeout(timeout); + return this; + } + + @Override + public ChatModelStreamingBuilder topP(final Double topP) { + builder.topP(topP); + return this; + } + + @Override + public ChatModelStreamingBuilder maxRetries(final Integer maxRetries) { + //NOOP + return this; + } + + @Override + public ChatModelStreamingBuilder maxOutputTokens(final Integer maxOutputTokens) { + //NOOP + return this; + } + + @Override + public ChatModelStreamingBuilder repeatPenalty(final Double repeatPenalty) { + builder.repeatPenalty(repeatPenalty); + return this; + } + + @Override + public ChatModelStreamingBuilder seed(final Integer seed) { + builder.seed(seed); + return this; + } + + @Override + public ChatModelStreamingBuilder maxTokens(final Integer maxTokens) { + //NOOP + return this; + } + + @Override + public ChatModelStreamingBuilder maxCompletionTokens(final Integer maxCompletionTokens) { + //NOOP + return this; + } + + @Override + public ChatModelStreamingBuilder topK(final Integer topK) { + builder.topK(topK); + return this; + } + + @Override + public ChatModelStreamingBuilder presencePenalty(final Double presencePenalty) { + //NOOP + return this; + } + + @Override + public ChatModelStreamingBuilder frequencyPenalty(final Double frequencyPenalty) { + //NOOP + return this; + } + + @Override + public ChatModelStreamingBuilder organizationId(final String organizationId) { + //NOOP + return this; + } + + @Override + public ChatModelStreamingBuilder logRequestsResponses(final boolean logRequests, final boolean logResponses) { + builder.logRequests(logRequests) + .logResponses(logResponses); + return this; + } + + @Override + public ChatModelStreamingBuilder includeCodeExecutionOutput(final boolean includeCodeExecutionOutput) { + //NOOP + return this; + } + + @Override + public ChatModelStreamingBuilder allowCodeExecution(final boolean allowCodeExecution) { + //NOOP + return this; + } + + @Override + public StreamingChatLanguageModel build() { + return builder.build(); + } +} diff --git a/src/main/java/io/github/jeddict/ai/lang/impl/OpenAiBuilder.java b/src/main/java/io/github/jeddict/ai/lang/impl/OpenAiBuilder.java new file mode 100644 index 0000000..52baf71 --- /dev/null +++ b/src/main/java/io/github/jeddict/ai/lang/impl/OpenAiBuilder.java @@ -0,0 +1,146 @@ +package io.github.jeddict.ai.lang.impl; + +import dev.langchain4j.model.chat.ChatLanguageModel; +import dev.langchain4j.model.openai.OpenAiChatModel; +import io.github.jeddict.ai.lang.ChatModelBuilder; +import java.time.Duration; +import java.util.Map; + +/** + * + * @author Francois Steyn + */ +public class OpenAiBuilder implements ChatModelBuilder { + + private final OpenAiChatModel.OpenAiChatModelBuilder builder; + + public OpenAiBuilder() { + builder = OpenAiChatModel.builder(); + } + + @Override + public ChatModelBuilder baseUrl(final String baseUrl) { + builder.baseUrl(baseUrl); + return this; + } + + @Override + public ChatModelBuilder customHeaders(final Map customHeaders) { + builder.customHeaders(customHeaders); + return this; + } + + @Override + public ChatModelBuilder apiKey(final String apiKey) { + builder.apiKey(apiKey); + return this; + } + + @Override + public ChatModelBuilder modelName(final String modelName) { + builder.modelName(modelName); + return this; + } + + @Override + public ChatModelBuilder temperature(final Double temperature) { + builder.temperature(temperature); + return this; + } + + @Override + public ChatModelBuilder timeout(final Duration timeout) { + builder.timeout(timeout); + return this; + } + + @Override + public ChatModelBuilder topP(final Double topP) { + builder.topP(topP); + return this; + } + + @Override + public ChatModelBuilder maxRetries(final Integer maxRetries) { + builder.maxRetries(maxRetries); + return this; + } + + @Override + public ChatModelBuilder maxOutputTokens(final Integer maxOutputTokens) { + //NOOP + return this; + } + + @Override + public ChatModelBuilder repeatPenalty(final Double repeatPenalty) { + //NOOP + return this; + } + + @Override + public ChatModelBuilder seed(final Integer seed) { + builder.seed(seed); + return this; + } + + @Override + public ChatModelBuilder maxTokens(final Integer maxTokens) { + builder.maxTokens(maxTokens); + return this; + } + + @Override + public ChatModelBuilder maxCompletionTokens(final Integer maxCompletionTokens) { + builder.maxCompletionTokens(maxCompletionTokens); + return this; + } + + @Override + public ChatModelBuilder topK(final Integer topK) { + //NOOP + return this; + } + + @Override + public ChatModelBuilder presencePenalty(final Double presencePenalty) { + builder.presencePenalty(presencePenalty); + return this; + } + + @Override + public ChatModelBuilder frequencyPenalty(final Double frequencyPenalty) { + builder.frequencyPenalty(frequencyPenalty); + return this; + } + + @Override + public ChatModelBuilder organizationId(final String organizationId) { + builder.organizationId(organizationId); + return this; + } + + @Override + public ChatModelBuilder logRequestsResponses(final boolean logRequests, final boolean logResponses) { + builder.logRequests(logRequests) + .logResponses(logResponses); + return this; + } + + @Override + public ChatModelBuilder includeCodeExecutionOutput(final boolean includeCodeExecutionOutput) { + //NOOP + return this; + } + + @Override + public ChatModelBuilder allowCodeExecution(final boolean allowCodeExecution) { + //NOOP + return this; + } + + @Override + public ChatLanguageModel build() { + return builder.build(); + } +} diff --git a/src/main/java/io/github/jeddict/ai/lang/impl/OpenAiStreamingBuilder.java b/src/main/java/io/github/jeddict/ai/lang/impl/OpenAiStreamingBuilder.java new file mode 100644 index 0000000..186a20a --- /dev/null +++ b/src/main/java/io/github/jeddict/ai/lang/impl/OpenAiStreamingBuilder.java @@ -0,0 +1,147 @@ +package io.github.jeddict.ai.lang.impl; + +import dev.langchain4j.model.chat.StreamingChatLanguageModel; +import dev.langchain4j.model.openai.OpenAiStreamingChatModel; +import io.github.jeddict.ai.lang.ChatModelStreamingBuilder; +import java.time.Duration; +import java.util.Map; + +/** + * + * @author Francois Steyn + */ +public class OpenAiStreamingBuilder implements ChatModelStreamingBuilder { + + private final OpenAiStreamingChatModel.OpenAiStreamingChatModelBuilder builder; + + public OpenAiStreamingBuilder() { + builder = OpenAiStreamingChatModel.builder(); + } + + @Override + public ChatModelStreamingBuilder baseUrl(final String baseUrl) { + builder.baseUrl(baseUrl); + return this; + } + + @Override + public ChatModelStreamingBuilder customHeaders(final Map customHeaders) { + builder.customHeaders(customHeaders); + return this; + } + + @Override + public ChatModelStreamingBuilder apiKey(final String apiKey) { + builder.apiKey(apiKey); + return this; + } + + @Override + public ChatModelStreamingBuilder modelName(final String modelName) { + builder.modelName(modelName); + return this; + } + + @Override + public ChatModelStreamingBuilder temperature(final Double temperature) { + builder.temperature(temperature); + return this; + } + + @Override + public ChatModelStreamingBuilder timeout(final Duration timeout) { + builder.timeout(timeout); + return this; + } + + @Override + public ChatModelStreamingBuilder topP(final Double topP) { + builder.topP(topP); + return this; + } + + @Override + public ChatModelStreamingBuilder maxRetries(final Integer maxRetries) { + //NOOP + return this; + } + + @Override + public ChatModelStreamingBuilder maxOutputTokens(final Integer maxOutputTokens) { + //NOOP + return this; + } + + @Override + public ChatModelStreamingBuilder repeatPenalty(final Double repeatPenalty) { + //NOOP + return this; + } + + @Override + public ChatModelStreamingBuilder seed(final Integer seed) { + builder.seed(seed); + return this; + } + + @Override + public ChatModelStreamingBuilder maxTokens(final Integer maxTokens) { + builder.maxTokens(maxTokens); + return this; + } + + @Override + public ChatModelStreamingBuilder maxCompletionTokens(final Integer maxCompletionTokens) { + builder.maxCompletionTokens(maxCompletionTokens); + return this; + } + + @Override + public ChatModelStreamingBuilder topK(final Integer topK) { + //NOOP + return this; + } + + @Override + public ChatModelStreamingBuilder presencePenalty(final Double presencePenalty) { + builder.presencePenalty(presencePenalty); + return this; + } + + @Override + public ChatModelStreamingBuilder frequencyPenalty(final Double frequencyPenalty) { + builder.frequencyPenalty(frequencyPenalty); + return this; + } + + @Override + public ChatModelStreamingBuilder organizationId(final String organizationId) { + builder.organizationId(organizationId); + return this; + } + + @Override + public ChatModelStreamingBuilder logRequestsResponses(final boolean logRequests, final boolean logResponses) { + builder.logRequests(logRequests) + .logResponses(logResponses); + return this; + } + + @Override + public ChatModelStreamingBuilder includeCodeExecutionOutput(final boolean includeCodeExecutionOutput) { + //NOOP + return this; + } + + @Override + public ChatModelStreamingBuilder allowCodeExecution(final boolean allowCodeExecution) { + //NOOP + return this; + } + + @Override + public StreamingChatLanguageModel build() { + return builder.build(); + } + +}