# Run with: mix run examples/openrouter.exs
#
# Real smoke test against OpenRouter. Requires OPENROUTER_API_KEY in your env.
#
# export OPENROUTER_API_KEY=sk-or-...
# mix run examples/openrouter.exs
#
# It exercises the full path: our Message structs -> JSON -> OpenRouter ->
# JSON -> our Response, plus a real tool call handled by the agent loop.
key = System.get_env("OPENROUTER_API_KEY")
unless key do
IO.puts("OPENROUTER_API_KEY not set — skipping live request.")
System.halt(0)
end
alias ExAgent.{Tool}
# A free / very cheap model on OpenRouter. Swap for any slug you have access to.
model =
ExAgent.Models.OpenRouter.new(
model: System.get_env("OPENROUTER_MODEL", "openai/gpt-4o-mini"),
app_title: "exagent smoke test"
)
# A simple function tool so we can see a real tool-call round trip.
weather =
Tool.new(
name: "get_weather",
description: "Get the current weather for a city.",
parameters_json_schema: %{
type: "object",
properties: %{city: %{type: "string", description: "City name"}},
required: ["city"]
},
takes_ctx: false,
# Stand-in for a real weather call.
call: fn %{"city" => city} -> {:ok, "#{city}: 22C, clear"} end
)
agent =
ExAgent.new(
model: model,
instructions: "Be concise. Use tools when asked about the weather.",
tools: [weather],
model_settings: [max_tokens: 200, temperature: 0]
)
prompt = "What's the weather like in Madrid? Then answer in one sentence."
{:ok, result} = ExAgent.run(agent, prompt)
IO.puts("=== OUTPUT ===")
IO.puts(result.output)
IO.puts("\n=== USAGE (real) ===")
IO.inspect(result.usage, label: "usage")
IO.puts("\n=== MESSAGE COUNT ===")
IO.puts(length(result.messages))