What is a predicate?

Predicates let you control exactly which tools your Agent sees at runtime. Instead of a fixed list, you write any Python function that returns True or False, and the SDK will only expose the tool when your logic allows it. This unlocks powerful scenarios:

  • Show or hide tools based on internal state (e.g., only after you’ve run a search)
  • React to environment variables, config flags, or user roles
  • Build arbitrarily complex visibility rules to keep your UI clean and context-aware
# This is a helper function for a predicate
def _has_history(self) -> bool:
    """Return True only if we've recorded at least one research result."""
    return len(self.research_history) > 0


# Notice how we pass in the predicate
@truffle.tool(
    description="Display past research history",
    icon="list.bullet.clipboard",
    predicate=_has_history
)
def view_history(self) -> str:
    """Returns a formatted list of past queries & answers."""
    if not self.research_history:
        return "No research history recorded yet."
    lines = [
        f"{i+1}. '{e['query']}' → {e['answer'][:100]}…"
        for i, e in enumerate(self.research_history)
    ]
    return "**Research History**\n\n" + "\n".join(lines)


# Now view_history will only appear when _has_history() returns True

This pattern scales to any condition—feature flags, user permissions, external API health checks, or even time-based rules. Combine predicates with your tools to build flexible, self-aware agents that only surface the right capabilities at the right moment.

Scenarios where you may want predicates

Assume a situation where you have a tree of tools but don’t want the model to overload it’s context