Packages
nous
0.15.3
0.17.0
0.16.6
0.16.5
0.16.4
0.16.3
0.16.2
0.16.1
0.16.0
0.15.8
0.15.7
0.15.6
0.15.5
0.15.4
0.15.3
0.15.2
0.15.1
0.15.0
0.14.3
0.14.2
0.14.1
0.14.0
0.13.3
0.13.2
0.13.1
0.13.0
0.12.17
0.12.16
0.12.15
0.12.14
0.12.13
0.12.12
0.12.11
0.12.9
0.12.7
0.12.6
0.12.5
0.12.3
0.12.2
0.12.0
0.11.3
0.11.0
0.10.1
0.10.0
0.9.0
0.8.1
0.8.0
0.7.2
0.7.1
0.7.0
0.5.0
AI agent framework for Elixir with multi-provider LLM support
Current section
Files
Jump to
Current section
Files
lib/nous/http/backend.ex
defmodule Nous.HTTP.Backend do
@moduledoc """
Behaviour for non-streaming HTTP backends.
Implemented by `Nous.HTTP.Backend.Req` (default) and
`Nous.HTTP.Backend.Hackney`. Selection is per-call via `:backend`,
per-environment via `NOUS_HTTP_BACKEND`, or per-app via
`config :nous, :http_backend, MyBackend`. See
`Nous.Providers.HTTP.post/4` for the resolution order and
`docs/benchmarks/http_backend.md` for performance characteristics.
Custom backends just need to implement `c:post/4` and return one of:
`{:ok, decoded_body}` for 2xx, `{:error, %{status: status, body: body}}`
for 4xx/5xx, or `{:error, term()}` for transport / decode failures.
Streaming requests do NOT go through this behaviour — those always
use hackney's `:async, :once` mode for backpressure (see
`Nous.Providers.HTTP.stream/4`).
"""
@doc """
Issue a POST request with a JSON body and return the decoded JSON response.
## Options
* `:timeout` — receive timeout in milliseconds (default: 60_000)
Backends MAY accept additional options; unknown options should be ignored.
"""
@callback post(
url :: String.t(),
body :: map(),
headers :: [{String.t(), String.t()}],
opts :: keyword()
) :: {:ok, map() | binary()} | {:error, term()}
end