defmodule GoogleAI do
@moduledoc """
`GoogleAI` is an Elixir library that provides a community-maintained client for the Google AI API.
"""
alias GoogleAI.Client
@default_api_version "v1beta"
@default_base_url "https://generativelanguage.googleapis.com"
@new_opts_schema NimbleOptions.new!(
api_key: [
type: :string,
required: true,
doc: "The API key for the Google AI APIs."
],
api_version: [
type: {:in, ["v1", "v1beta"]},
default: @default_api_version,
doc:
"The version of the API to use. Certain features are only available in later version."
],
base_url: [
type: :string,
default: @default_base_url,
doc: "The base URL for the Google AI APIs."
]
)
@doc """
Create a new GoogleAI client with the given `opts`.
## Options
#{NimbleOptions.docs(@new_opts_schema)}
## Examples
iex> GoogleAI.client(api_key: "asdfasdf")
%GoogleAI.Client{
req: Req.new(
base_url: "https://generativelanguage.googleapis.com",
params: [key: "asdfasdf"],
path_params: [version: "v1beta"]
)
}
iex> GoogleAI.client(api_key: "asdfasdf", base_url: "https://example.com", api_version: "v1")
%GoogleAI.Client{
req: Req.new(
base_url: "https://example.com",
params: [key: "asdfasdf"],
path_params: [version: "v1"]
)
}
"""
@spec client(opts :: Keyword.t()) :: Client.t()
def client(opts \\ []) do
opts =
opts
|> Keyword.put_new(:api_key, get_api_key())
|> NimbleOptions.validate!(@new_opts_schema)
req =
Req.new(
base_url: opts[:base_url],
params: [key: opts[:api_key]],
path_params: [version: opts[:api_version]]
)
%Client{req: req}
end
@spec get_api_key() :: String.t()
defp get_api_key do
Application.get_env(:google_ai, :api_key)
end
end