// This file is auto-generated by alef — DO NOT EDIT.
// alef:hash:4e15143f4af1ae8bafbdb1506ef057da924484c66a19483966333558ad437e75
// To regenerate: alef generate
// To verify freshness: alef verify --exit-code
// Issues & docs: https://github.com/kreuzberg-dev/alef
package dev.kreuzberg;

import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import com.fasterxml.jackson.databind.annotation.JsonPOJOBuilder;
import org.jspecify.annotations.Nullable;

/**
 * Configuration for an LLM provider/model via liter-llm.
 *
 * Each feature (VLM OCR, VLM embeddings, structured extraction) carries
 * its own {@code LlmConfig}, allowing different providers per feature.
 */
@JsonInclude(JsonInclude.Include.NON_ABSENT)
@JsonDeserialize(builder = LlmConfig.Builder.class)
public record LlmConfig(
    /**
     * Provider/model string using liter-llm routing format.
     *
     * Examples: {@code "openai/gpt-4o"}, {@code "anthropic/claude-sonnet-4-20250514"},
     * {@code "groq/llama-3.1-70b-versatile"}.
     */
    @JsonProperty("model") String model,
    /**
     * API key for the provider. When {@code None}, liter-llm falls back to
     * the provider's standard environment variable (e.g., {@code OPENAI_API_KEY}).
     */
    @Nullable @JsonProperty("api_key") String apiKey,
    /**
     * Custom base URL override for the provider endpoint.
     */
    @Nullable @JsonProperty("base_url") String baseUrl,
    /**
     * Request timeout in seconds (default: 60).
     */
    @Nullable @JsonProperty("timeout_secs") Long timeoutSecs,
    /**
     * Maximum retry attempts (default: 3).
     */
    @Nullable @JsonProperty("max_retries") Integer maxRetries,
    /**
     * Sampling temperature for generation tasks.
     */
    @Nullable @JsonProperty("temperature") Double temperature,
    /**
     * Maximum tokens to generate.
     */
    @Nullable @JsonProperty("max_tokens") Long maxTokens
) {
    public static Builder builder() {
        return new Builder();
    }

    // CPD-OFF
    @JsonPOJOBuilder(withPrefix = "with", buildMethodName = "build")
    public static final class Builder {

private String model = "";
        @JsonProperty("api_key")
private String apiKey = null;
        @JsonProperty("base_url")
private String baseUrl = null;
        @JsonProperty("timeout_secs")
private Long timeoutSecs = null;
        @JsonProperty("max_retries")
private Integer maxRetries = null;
private Double temperature = null;
        @JsonProperty("max_tokens")
private Long maxTokens = null;

        /** Sets the model field. */
        @JsonProperty("model")
        public Builder withModel(final String value) {
            this.model = value;
            return this;
        }

        /** Sets the apiKey field. */
        @JsonProperty("api_key")
        public Builder withApiKey(final @Nullable String value) {
            this.apiKey = value;
            return this;
        }

        /** Sets the baseUrl field. */
        @JsonProperty("base_url")
        public Builder withBaseUrl(final @Nullable String value) {
            this.baseUrl = value;
            return this;
        }

        /** Sets the timeoutSecs field. */
        @JsonProperty("timeout_secs")
        public Builder withTimeoutSecs(final @Nullable Long value) {
            this.timeoutSecs = value;
            return this;
        }

        /** Sets the maxRetries field. */
        @JsonProperty("max_retries")
        public Builder withMaxRetries(final @Nullable Integer value) {
            this.maxRetries = value;
            return this;
        }

        /** Sets the temperature field. */
        @JsonProperty("temperature")
        public Builder withTemperature(final @Nullable Double value) {
            this.temperature = value;
            return this;
        }

        /** Sets the maxTokens field. */
        @JsonProperty("max_tokens")
        public Builder withMaxTokens(final @Nullable Long value) {
            this.maxTokens = value;
            return this;
        }

        /** Builds the LlmConfig instance. */
        public LlmConfig build() {
            return new LlmConfig(
                model,
                apiKey,
                baseUrl,
                timeoutSecs,
                maxRetries,
                temperature,
                maxTokens
            );
        }
    }
    // CPD-ON
}
