kagi_ex

kagi_ex is a typed Elixir client for Kagi Search, Summarizer, and Maps.

Docs: https://hexdocs.pm/kagi_ex

It builds Req requests and sends them through cloaked_req.

Installation

def deps do
[
{:kagi_ex, "~> 0.1.0"}
]
end

Authentication

Kagi requires a session token. Put it in application config:

config :kagi_ex,
session_token: System.fetch_env!("KAGI_SESSION_TOKEN")

Usage

{:ok, results} =
Kagi.search("elixir req http client",
lens: :programming,
limit: 5
)
Enum.map(results.results, & &1.url)

Configuration

Set :req_options in application config when you need to override the default Req request options.

Search Options

Kagi.search/2 and Kagi.search/3 accept:

Summarizer Options

Kagi.summarize/2 and Kagi.summarize/3 accept:

Maps

{:ok, output} =
Kagi.maps("coffee zurich",
ll: "47.3769,8.5417",
zoom: 13,
sort: :rating
)
Enum.map(output.results, & &1.name)

Kagi.maps/2 and Kagi.maps/3 accept:

Sorting and the limit apply client-side to the parsed response.

Returned Types

Search returns {:ok, %Kagi.Search{results: [...], related: [...]}}, where each result is a %Kagi.SearchResult{url: ..., title: ..., snippet: ...}.

Summarizer returns {:ok, %Kagi.Summary{summary: markdown}}.

Maps returns {:ok, %Kagi.Maps{results: [%Kagi.MapsResult{}]}}. Each Kagi.MapsResult carries name, address, coordinates (%Kagi.MapsResult.Coordinates{latitude:, longitude:}), plus optional phone, url, source, id, rating, review_count, price, distance, hours_now, types, links, and images.

Failures return {:error, %Kagi.Error{reason: reason, message: message}}.

Development Checks

Run deterministic local checks:

task check

Run opt-in live Kagi checks with a real session token:

export KAGI_SESSION_TOKEN="..."
task test:live