Behaviour implemented by every LLM provider.
@type message() :: %{role: atom(), content: String.t()}
@type response() :: {:reply, String.t()} | {:tool_call, tool_call()}
@type tool_call() :: %{id: String.t(), name: atom(), arguments: map()}
@callback chat( [message()], keyword() ) :: response()