# `LLMProxy.Storage.Adapter`
[🔗](https://github.com/elixir-vibe/llm_proxy/blob/v0.3.1/lib/llm_proxy/storage/adapter.ex#L1)

Behaviour for persistence adapters that back LLMProxy storage operations.

# `add_token`

```elixir
@callback add_token(String.t(), String.t(), String.t(), map()) ::
  {:ok, term()} | {:error, term()}
```

# `check_model_access`

```elixir
@callback check_model_access(term(), String.t()) :: :ok | {:error, String.t()}
```

# `check_quota`

```elixir
@callback check_quota(term()) :: :ok | {:error, String.t()}
```

# `check_service_quota`

```elixir
@callback check_service_quota(term(), String.t()) :: :ok | {:error, String.t()}
```

# `create_key`

```elixir
@callback create_key(String.t(), map()) :: {:ok, term(), String.t()} | {:error, term()}
```

# `delete_key`

```elixir
@callback delete_key(term()) :: {:ok, term()} | {:error, term()}
```

# `find_key`

```elixir
@callback find_key(String.t()) :: term() | nil
```

# `find_trace_by_request_id`

```elixir
@callback find_trace_by_request_id(String.t()) :: term() | nil
```

# `get_cache_ratio_in_window`

```elixir
@callback get_cache_ratio_in_window(String.t(), integer()) :: {float(), integer()}
```

# `get_daily_stats`

```elixir
@callback get_daily_stats(map()) :: [term()]
```

# `get_message_count_in_window`

```elixir
@callback get_message_count_in_window(String.t(), integer()) :: integer()
```

# `get_messages`

```elixir
@callback get_messages(map()) :: [term()]
```

# `get_service_usage_in_window`

```elixir
@callback get_service_usage_in_window(String.t(), String.t(), integer()) :: integer()
```

# `get_stats`

```elixir
@callback get_stats(map()) :: map()
```

# `get_tokens`

```elixir
@callback get_tokens(String.t(), String.t()) :: [term()]
```

# `get_trace`

```elixir
@callback get_trace(term()) :: term() | nil
```

# `get_trace_feedback`

```elixir
@callback get_trace_feedback(integer()) :: [term()]
```

# `get_traces`

```elixir
@callback get_traces(map()) :: [term()]
```

# `get_usage_in_window`

```elixir
@callback get_usage_in_window(String.t(), integer()) :: map()
```

# `list_keys`

```elixir
@callback list_keys(map()) :: [term()]
```

# `list_tokens`

```elixir
@callback list_tokens(map()) :: [term()]
```

# `list_trace_feedback`

```elixir
@callback list_trace_feedback(term()) :: [term()]
```

# `log_message`

```elixir
@callback log_message(map()) :: {:ok, term()} | {:error, term()}
```

# `record_service_usage`

```elixir
@callback record_service_usage(map()) :: {:ok, term()} | {:error, term()}
```

# `record_trace`

```elixir
@callback record_trace(map()) :: {:ok, term()} | {:error, term()}
```

# `record_trace_feedback`

```elixir
@callback record_trace_feedback(map()) :: {:ok, term()} | {:error, term()}
```

# `record_usage`

```elixir
@callback record_usage(map()) :: {:ok, term()} | {:error, term()}
```

# `remove_token`

```elixir
@callback remove_token(term()) :: {:ok, term()} | {:error, term()}
```

# `seed_tokens_from_env`

```elixir
@callback seed_tokens_from_env([map()]) :: :ok | {:error, term()}
```

# `set_content_capture`

```elixir
@callback set_content_capture(term(), boolean()) :: {:ok, term()} | {:error, term()}
```

# `set_key_enabled`

```elixir
@callback set_key_enabled(term(), boolean()) :: {:ok, term()} | {:error, term()}
```

# `set_token_enabled`

```elixir
@callback set_token_enabled(term(), boolean()) :: {:ok, term()} | {:error, term()}
```

# `update_key_models`

```elixir
@callback update_key_models(term(), list() | nil) :: {:ok, term()} | {:error, term()}
```

# `update_key_quota`

```elixir
@callback update_key_quota(term(), map()) :: {:ok, term()} | {:error, term()}
```

# `update_key_usage`

```elixir
@callback update_key_usage(term(), map()) :: term()
```

# `update_message_usage`

```elixir
@callback update_message_usage(term(), map()) :: {:ok, term()} | {:error, term()}
```

# `update_token_oauth`

```elixir
@callback update_token_oauth(term(), map()) :: {:ok, term()} | {:error, term()}
```

# `update_token_proxy`

```elixir
@callback update_token_proxy(term(), String.t() | nil) :: {:ok, term()} | {:error, term()}
```

---

*Consult [api-reference.md](api-reference.md) for complete listing*
