Packages
nous
0.14.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/plugins/input_guard/strategy.ex
defmodule Nous.Plugins.InputGuard.Strategy do
@moduledoc """
Behaviour for input guard detection strategies.
Implement this behaviour to create custom strategies for detecting
malicious or unwanted input. Each strategy receives the user input text,
its own configuration, and the full agent context.
## Creating Your Own Strategy
Here's a complete example of a custom blocklist strategy:
defmodule MyApp.InputGuard.Blocklist do
@behaviour Nous.Plugins.InputGuard.Strategy
alias Nous.Plugins.InputGuard.Result
@impl true
def check(input, config, _ctx) do
blocklist = Keyword.get(config, :words, [])
downcased = String.downcase(input)
case Enum.find(blocklist, &String.contains?(downcased, &1)) do
nil ->
{:ok, %Result{severity: :safe}}
word ->
{:ok, %Result{
severity: :blocked,
reason: "Blocklisted word: \#{word}",
strategy: __MODULE__
}}
end
end
end
Then use it in your agent configuration:
agent = Nous.new("openai:gpt-4",
plugins: [Nous.Plugins.InputGuard]
)
{:ok, result} = Nous.run(agent, "Hello",
deps: %{
input_guard_config: %{
strategies: [
{MyApp.InputGuard.Blocklist, words: ["hack", "exploit"]}
]
}
}
)
"""
alias Nous.Agent.Context
alias Nous.Plugins.InputGuard.Result
@doc """
Check input text for malicious content.
Returns `{:ok, result}` with a `Result` struct indicating the severity,
or `{:error, reason}` if the check itself failed.
## Parameters
* `input` — The user's input text to check
* `config` — Strategy-specific configuration from the `{Module, opts}` tuple
* `ctx` — The full agent context for access to message history, deps, etc.
"""
@callback check(input :: String.t(), config :: keyword(), ctx :: Context.t()) ::
{:ok, Result.t()} | {:error, term()}
end