// Switch native Anthropic, Gemini and OpenRouter clients with private SecretRefs.
// Configure the three keys through hidden terminal input before running:
//   aner secrets set anthropic
//   aner secrets set gemini
//   aner secrets set openrouter
// Requires a compatible updated native development runtime.
// Checking sends no requests. Running sends three requests and may incur charges.
// Model identifiers are illustrative; choose models available to your accounts.
// For env/dotenv configuration and token semantics, see the companion notebooks.

import aner.llm
import aner.secrets

// Select exactly "stored", "env" or "dotenv". Never place a private key here.
let key_source = "stored"
let env_file = ".env.local" // Or .env, .env.production, .env.development; absolute paths work.
var anthropic_key = secrets.stored("anthropic")
var gemini_key = secrets.stored("gemini")
var openrouter_key = secrets.stored("openrouter")
if key_source == "dotenv" {
    anthropic_key = secrets.dotenv(path: env_file, name: "ANTHROPIC_API_KEY")
    gemini_key = secrets.dotenv(path: env_file, name: "GEMINI_API_KEY")
    openrouter_key = secrets.dotenv(path: env_file, name: "OPENROUTER_API_KEY")
}
if key_source == "env" {
    anthropic_key = secrets.env("ANTHROPIC_API_KEY")
    gemini_key = secrets.env("GEMINI_API_KEY")
    openrouter_key = secrets.env("OPENROUTER_API_KEY")
}

let output_budget = 1024
let messages = List(
    llm.message(role: "user", content: "Explain precisely and concisely in three sentences why preprocessing must be fitted on training data only."))

fn report_tokens(label: String, count: Int64) {
    if count < 0 {
        print(label + ": unavailable")
    } else {
        print(label + ": " + String(count))
    }
}

// One request. Rerunning this cell sends another request.
{
    let model = llm.client(provider: "anthropic", model: "claude-sonnet-5-5",
        key: anthropic_key)
    let answer = model.chat(messages, max_tokens: output_budget)
    print("Provider: " + model.provider())
    print("Requested model: " + model.model())
    print("Answer:")
    print(answer.text())
    print("Returned model: " + answer.model())
    print("Finish reason: " + answer.finish_reason())
    report_tokens("Input tokens", answer.input_tokens())
    report_tokens("Output tokens", answer.output_tokens())
    report_tokens("Total tokens", answer.total_tokens())
}

// One request. Rerunning this cell sends another request.
{
    let model = llm.client(provider: "gemini", model: "gemini-3.7-flash",
        key: gemini_key)
    let answer = model.chat(messages, max_tokens: output_budget)
    print("Provider: " + model.provider())
    print("Requested model: " + model.model())
    print("Answer:")
    print(answer.text())
    print("Returned model: " + answer.model())
    print("Finish reason: " + answer.finish_reason())
    report_tokens("Input tokens", answer.input_tokens())
    report_tokens("Output tokens", answer.output_tokens())
    report_tokens("Total tokens", answer.total_tokens())
}

// One request. Rerunning this cell sends another request.
{
    let model = llm.client(provider: "openrouter", model: "openai/gpt-4.1-mini",
        key: openrouter_key)
    let answer = model.chat(messages, max_tokens: output_budget)
    print("Provider: " + model.provider())
    print("Requested model: " + model.model())
    print("Answer:")
    print(answer.text())
    print("Returned model: " + answer.model())
    print("Finish reason: " + answer.finish_reason())
    report_tokens("Input tokens", answer.input_tokens())
    report_tokens("Output tokens", answer.output_tokens())
    report_tokens("Total tokens", answer.total_tokens())
}
