WardrikCore.Keys behaviour (wardrik_core v0.1.0-rc.1)

Copy Markdown

Gives your code the API keys it calls services with, such as a model provider's or a search API's.

defmodule MyApp.Keys do
  @behaviour WardrikCore.Keys

  @impl true
  def fetch(name, principal, _opts), do: MyApp.Vault.key(principal, name)
end

Give it to an agent as keys: {MyApp.Keys, opts}. Keys are fetched by name, for the agent's WardrikCore.Principal, so an org can bring its own. A capability or middleware fetches what it needs:

with {:ok, key} <- WardrikCore.Keys.fetch(context, "BRAVE_API_KEY") do
  Brave.search(key, query)
end

Model calls

Every model call fetches its provider's key by the name ReqLLM gives it, such as ANTHROPIC_API_KEY, and passes it to that call only. If there's no keys module, or it has no such key, ReqLLM finds one in its config or the environment.

Keys and credentials

Keys are for the code you install. A tool that acts for a person uses their credentials instead, from WardrikCore.Credentials. That way nothing an agent's owner configures can read your keys.

Keys are never kept in the context, so they're never saved or emitted.

Summary

Callbacks

Returns the key name for principal, or :error if there's none.

Functions

Fetches the key name for the agent's principal. Returns :error if there's none.

Returns the name of the key model's provider takes, or nil.

Returns [api_key: key] for model's provider, or [] if there's no key.

Callbacks

fetch(name, arg2, opts)

@callback fetch(name :: String.t(), WardrikCore.Principal.t() | nil, opts :: term()) ::
  {:ok, String.t()} | :error

Returns the key name for principal, or :error if there's none.

Functions

fetch(context, name)

@spec fetch(WardrikCore.Context.t(), String.t()) :: {:ok, String.t()} | :error

Fetches the key name for the agent's principal. Returns :error if there's none.

key_name(spec)

@spec key_name(LLMDB.Model.t() | String.t()) :: String.t() | nil

Returns the name of the key model's provider takes, or nil.

WardrikCore.Keys.key_name("zai:glm-5.1")
#=> "ZAI_API_KEY"

model_options(context, model)

@spec model_options(WardrikCore.Context.t(), LLMDB.Model.t() | String.t()) ::
  keyword()

Returns [api_key: key] for model's provider, or [] if there's no key.