# Getting started

This guide takes you from zero to a running ExAthena call in under five minutes.

## Install

```bash
mix igniter.install ex_athena
```

The installer:

- Adds `{:ex_athena, "~> 0.1"}` to your deps.
- Writes `config :ex_athena, default_provider: :ollama` (and per-provider defaults) to `config/config.exs`.
- Is idempotent — re-running preserves whatever you've already configured.

Alternatively, add the dep manually:

```elixir
def deps do
  [
    {:ex_athena, "~> 0.1"},
    {:claude_code, "~> 0.36"}  # only needed for the :claude provider
  ]
end
```

…then run `mix ex_athena.install` once to wire up defaults.

## Pick a provider

### Ollama (local, free)

```bash
ollama pull llama3.1
ollama serve
```

```elixir
config :ex_athena, default_provider: :ollama
config :ex_athena, :ollama, base_url: "http://localhost:11434", model: "llama3.1"
```

### OpenAI / OpenAI-compatible

```elixir
config :ex_athena, default_provider: :openai_compatible
config :ex_athena, :openai_compatible,
  base_url: "https://api.openai.com/v1",
  api_key: System.get_env("OPENAI_API_KEY"),
  model: "gpt-4o-mini"
```

Swap `base_url` for any OpenAI-compatible endpoint (OpenRouter, LM Studio, Groq, Together, vLLM, llama.cpp in server mode).

### Anthropic Claude

```elixir
config :ex_athena, default_provider: :claude
config :ex_athena, :claude,
  api_key: System.get_env("ANTHROPIC_API_KEY"),
  model: "claude-opus-4-5"
```

## Make a call

```elixir
{:ok, response} = ExAthena.query("What is 2+2?")
IO.puts(response.text)
```

`response` is an `%ExAthena.Response{}` with:

- `:text` — concatenated assistant text
- `:tool_calls` — any tool calls the model wants the runtime to execute (empty in Phase 1)
- `:finish_reason` — `:stop | :length | :tool_calls | :content_filter | :error`
- `:usage` — token accounting when the provider reports it
- `:model`, `:provider`, `:raw`

## Stream the response

```elixir
ExAthena.stream("Explain quantum computing in plain English", fn event ->
  case event.type do
    :text_delta -> IO.write(event.data)
    :stop -> IO.puts("\n[done]")
    _ -> :ok
  end
end)
```

The callback runs on every delta — keep it fast. If you need to do expensive
work per-delta, hand off to a `Task`.

## Next steps

- [Providers](providers.md) — full config surface for each provider.
- [Tool calls](tool_calls.md) — native vs text-tagged protocols.
- Phase 2 ships: `ExAthena.Tool`, `ExAthena.Loop`, `ExAthena.Session`,
  `ExAthena.extract_structured/2`.
