This prompt is for agent and copilot teams that need to constrain tool access across multiple turns. It evaluates whether a requested tool call violates session-level tool-use policies, rate limits, or authorization boundaries, and generates either an approved call or a policy-compliant refusal with alternatives. Use this when your agent has a defined tool-use policy that must survive many conversation turns without drift. The core job-to-be-done is preventing policy erosion: an agent that correctly refuses a disallowed tool on turn one might approve it on turn twenty because the policy has scrolled out of the context window or been diluted by intervening conversation.
Prompt
Tool-Use Policy Enforcement Prompt

When to Use This Prompt
Defines the exact job-to-be-done, required inputs, and operational boundaries for enforcing tool-use policies across multi-turn agent sessions.
Do not use this prompt for initial tool selection or function-calling schema design; those belong in the Function Calling and Tool Selection pillar. This prompt assumes you already have a tool registry, a session-level policy document, and a mechanism to track prior tool calls within the session. It is not a replacement for application-level authorization gates—your execution layer must still enforce tool access independently. The prompt is a policy reasoning layer that decides what should be attempted, not a security boundary. For high-risk tool operations, always pair this prompt with a Confirmation Gate Prompt and human-in-the-loop approval before execution.
Before deploying this prompt, ensure you have three things wired into your harness: a machine-readable tool-use policy document that defines allowed tools, rate limits, required approvals, and forbidden argument patterns; a session-level call log tracking every tool invocation with timestamps and outcomes; and a tool registry that maps tool names to capabilities, argument schemas, and risk classifications. Without these, the prompt cannot perform accurate policy evaluation. Start by running this prompt against a golden dataset of known policy-compliant and policy-violating tool requests to calibrate your eval thresholds before production use.
Use Case Fit
Where the Tool-Use Policy Enforcement Prompt delivers value and where it introduces unnecessary complexity or risk.
Good Fit: Regulated Agent Workflows
Use when: an agent or copilot operates under strict tool-use policies, rate limits, or authorization boundaries that must be enforced across many turns. Guardrail: deploy this prompt as a pre-execution gate before any tool call, not as a post-hoc audit.
Bad Fit: Single-Turn Tool Selection
Avoid when: the system only needs to choose the right tool for a single, stateless request. Guardrail: use a simpler function-calling or tool-selection prompt instead; this prompt adds unnecessary latency and token cost for stateless workflows.
Required Inputs
What you need: the proposed tool call with arguments, the session-level tool-use policy contract, current rate-limit counters, user authorization scope, and recent tool-call history. Guardrail: missing any of these inputs produces either over-permissive or over-restrictive decisions.
Operational Risk: Latency Budget
Risk: adding a policy enforcement prompt before every tool call increases end-to-end latency, especially in chains with many sequential tool calls. Guardrail: cache policy contracts in the system prompt prefix and use a lightweight classifier for low-risk tool categories to skip full enforcement.
Operational Risk: Policy Drift
Risk: the enforcement prompt itself may drift over long sessions, becoming more permissive or more restrictive than the original policy. Guardrail: pair this prompt with a Policy Enforcement Drift Detection Prompt that samples enforcement decisions and compares them against the source policy contract.
Bad Fit: Open-Ended Exploration
Avoid when: the agent is in a sandboxed research or exploration mode where tool-use boundaries are intentionally loose. Guardrail: disable policy enforcement or switch to a logging-only mode during exploration sessions; re-enable before production deployment.
Copy-Ready Prompt Template
A reusable prompt template for evaluating tool-use requests against session-level policies before execution.
This prompt template is designed to be inserted into your agent harness immediately before every tool-use evaluation turn. It acts as a policy gate: it receives the proposed tool call, the active session policies, and the conversation context, then returns either an approved tool call or a policy-compliant refusal with alternatives. The template uses square-bracket placeholders that your application must populate with live session data before each invocation. Do not modify the structural logic; adapt only the placeholder values and the policy definitions to match your specific tool-use governance rules.
textYou are a tool-use policy enforcement agent. Your sole responsibility is to evaluate whether a requested tool call violates any active session-level policies before execution occurs. ## ACTIVE POLICIES [TOOL_USE_POLICIES] ## SESSION CONTEXT Session ID: [SESSION_ID] User Role: [USER_ROLE] Authentication Level: [AUTH_LEVEL] Previous Tool Calls This Session: [PREVIOUS_TOOL_CALLS] Rate Limit State: [RATE_LIMIT_STATE] ## CURRENT REQUEST User Intent: [USER_INTENT] Requested Tool: [REQUESTED_TOOL_NAME] Proposed Arguments: [REQUESTED_ARGUMENTS] Conversation Turn Context: [TURN_CONTEXT] ## EVALUATION INSTRUCTIONS 1. Check whether the requested tool is in the allowed tool list for this user role and authentication level. 2. Check whether the proposed arguments violate any parameter constraints defined in the active policies. 3. Check whether calling this tool now would exceed any rate limits or session-level quotas. 4. Check whether the user intent or conversation context suggests the tool would be used for a disallowed purpose. 5. If any policy violation is detected, classify the violation by type and severity. ## OUTPUT SCHEMA Return a JSON object with exactly this structure: { "decision": "approved" | "refused", "tool_call": { "name": "string", "arguments": {} } | null, "policy_check_results": [ { "policy_id": "string", "policy_name": "string", "result": "pass" | "fail", "detail": "string" } ], "refusal": { "reason": "string", "violated_policies": ["string"], "suggested_alternatives": ["string"], "escalation_required": true | false } | null } ## CONSTRAINTS - Never approve a tool call that violates any active policy, even if the user explicitly requests it. - If multiple policies conflict, apply the most restrictive policy and flag the conflict in the refusal reason. - If the requested tool is not in the allowed list, refuse immediately without evaluating arguments. - If rate limits would be exceeded, include the remaining quota and reset time in the refusal detail. - Suggest alternatives only when a less-privileged tool or a modified argument set would satisfy the user intent without violating policy. - Set escalation_required to true when the violation involves authentication boundaries, data access policies, or actions that require human review.
To adapt this template for your system, replace each placeholder with live data from your session store and policy engine. The [TOOL_USE_POLICIES] placeholder should contain a structured representation of your active policies, including allowed tools per role, argument constraints, rate limits, and disallowed use patterns. The [PREVIOUS_TOOL_CALLS] placeholder must include a count and summary of tool calls already made in this session to enable rate-limit evaluation. The [RATE_LIMIT_STATE] should reflect the current quota consumption against session, user, and global limits. Wire the output into your agent's tool execution loop: if decision is approved, pass tool_call to your execution layer; if refused, surface the refusal to the user with the suggested alternatives and trigger escalation if escalation_required is true.
Before deploying this prompt into production, build a validation layer that checks the output JSON against the declared schema. Common failure modes include the model approving a tool call while simultaneously flagging a policy violation in the check results, producing a refusal without suggested alternatives when alternatives clearly exist, or misclassifying the severity of a violation. Run this prompt against a golden dataset of known policy-compliant and policy-violating tool requests before any release. For high-risk domains, always require human review when escalation_required is true, and log every policy evaluation decision with the full check results for auditability.
Prompt Variables
Inputs the prompt needs to work reliably. Each placeholder must be populated from your session state before invoking the enforcement prompt.
| Placeholder | Purpose | Example | Validation Notes |
|---|---|---|---|
[TOOL_CALL_REQUEST] | The raw tool call or function invocation the assistant intends to make, including function name and arguments. | {"name": "delete_customer", "arguments": {"customer_id": "CUST-1234"}} | Must be parseable JSON. Validate that 'name' and 'arguments' keys exist. Reject if arguments contain unresolved placeholders. |
[SESSION_TOOL_POLICY] | The complete tool-use policy contract established at session start, defining allowed tools, rate limits, authorization boundaries, and required confirmations. | Tool 'delete_customer' requires MANAGER role and explicit user confirmation. Max 5 calls per hour. | Must be a non-empty string. Confirm it contains explicit allow/deny rules. If policy is truncated or missing, the enforcement prompt must refuse with a 'policy unavailable' error. |
[SESSION_TOOL_HISTORY] | A structured log of all tool calls made in the current session, including timestamps, outcomes, and caller identity. | [{"tool": "get_customer", "time": "2025-03-15T10:04:00Z", "caller_role": "AGENT"}] | Must be a valid JSON array. Each entry requires 'tool', 'time', and 'caller_role' fields. Empty array is valid for first call. Null is not allowed; use empty array. |
[CURRENT_USER_ROLE] | The authenticated role or permission set of the user or system making the current request. | AGENT | Must match an enum defined in [SESSION_TOOL_POLICY] (e.g., AGENT, MANAGER, ADMIN). Reject if role is missing or not recognized by the policy. |
[SESSION_START_TIME] | ISO 8601 timestamp of when the current session began, used for rate-limit window calculations. | 2025-03-15T09:00:00Z | Must be a valid ISO 8601 datetime string. Parse and compare against [SESSION_TOOL_HISTORY] timestamps to calculate rate-limit windows. Reject if unparseable. |
[RATE_LIMIT_WINDOW_SECONDS] | The duration of the sliding rate-limit window in seconds, as defined by the policy. | 3600 | Must be a positive integer. If policy defines multiple windows, this should be the most restrictive one applicable to the requested tool. Default to 3600 if policy is silent. |
[MAX_CALLS_PER_WINDOW] | The maximum number of allowed calls for the requested tool within the rate-limit window. | 5 | Must be a positive integer. Extract from [SESSION_TOOL_POLICY] for the specific tool. If tool has no explicit limit, use a system default or set to null to indicate no rate limit. |
[ALTERNATIVE_TOOLS] | A list of policy-compliant alternative tools or actions that could satisfy the user's intent if the requested tool is denied. | ["archive_customer", "flag_for_review"] | Must be a JSON array of strings. Each entry must be a tool name present in the system's tool registry. Empty array is valid if no alternatives exist. Null is not allowed. |
Implementation Harness Notes
How to wire the Tool-Use Policy Enforcement Prompt into an agent loop with validation, retries, and human-review hooks.
This prompt is designed to sit inside an agent's tool-calling loop, acting as a synchronous gate before any external action is executed. When the agent planner proposes a tool call, the application should intercept it and pass the proposed call, the session's tool-use policy, and the recent conversation history to this prompt. The prompt's output is a structured decision: either an approved call (potentially with modified arguments) or a policy-compliant refusal with alternatives. This is not a one-time setup check; it must be invoked on every turn where a tool call is proposed, because authorization boundaries, rate limits, and session state change as the conversation progresses.
The implementation should wrap the prompt in a thin service with a strict contract. The service accepts a ToolCallProposal object containing the tool name, arguments, and the requesting agent's identifier, along with a SessionPolicy object that defines rate limits, allowed tools, argument constraints, and authorization scopes. The service then assembles the prompt, calls the model with temperature=0 and a JSON mode or structured output configuration, and parses the result into a PolicyDecision object with fields: decision (APPROVED, MODIFIED, or REFUSED), modified_call (if MODIFIED), refusal_message, alternatives (array of suggested alternative tools or approaches), and violation_codes (an array of machine-readable policy clause identifiers that were triggered). If the model returns malformed JSON or an unrecognized decision value, the service should retry once with a stricter output format reminder. After a second failure, it must escalate to a human reviewer rather than defaulting to approval or refusal.
For high-risk deployments, insert a human-review hook when the violation_codes array contains any code marked as review_required in your policy configuration. The application should pause the agent loop, present the proposed call, the violation details, and the model's recommended refusal to a review queue, and only proceed after explicit human approval. Log every decision—including the raw prompt, the model's response, the parsed decision, and any human overrides—to an audit table with the session ID and a timestamp. This audit trail is essential for debugging policy drift, tuning the prompt's refusal sensitivity, and demonstrating compliance to internal or external reviewers. Avoid wiring this prompt as a fire-and-forget filter; it must be part of a stateful enforcement layer that tracks cumulative tool usage against rate limits and session-level authorization grants, because the prompt itself is stateless and cannot enforce limits across multiple invocations without external state.
Expected Output Contract
Every field your harness must validate before acting on the enforcement decision. Parse the model response against this contract and reject any output that fails validation.
| Field or Element | Type or Format | Required | Validation Rule |
|---|---|---|---|
decision | enum: | Must be exactly one of the three allowed values. Reject any other string. | |
tool_name | string matching | Must match a tool name present in [TOOL_CATALOG]. Reject if tool is not in the active catalog. | |
policy_violations | array of objects | Must be an array. If decision is | |
policy_violations[].policy_id | string | true when violations present | Must match a policy ID from [ACTIVE_POLICIES]. Reject unknown policy IDs. |
policy_violations[].clause | string | true when violations present | Must be a non-empty excerpt from the referenced policy text. Validate substring match against [ACTIVE_POLICIES]. |
policy_violations[].severity | enum: | true when violations present | Must be |
alternative_suggestion | string or null | If decision is | |
rate_limit_remaining | integer >= 0 | Must be a non-negative integer. Compare against [RATE_LIMIT_CONFIG]. If zero, decision must be | |
authorization_check | object | Must contain | |
authorization_check.user_role | string | Must match a role from [USER_ROLES]. Reject unknown roles. | |
authorization_check.required_role | string | Must match a role from [TOOL_CATALOG] entry for the requested tool. Reject if tool has no declared required_role. | |
authorization_check.sufficient | boolean | Must be | |
session_tool_call_count | integer >= 0 | Must match the actual count of prior tool calls for this tool in [SESSION_STATE]. Reject on mismatch to prevent state drift. | |
reasoning_summary | string, max 300 chars | Must be a non-empty string explaining the decision. Reject if empty or exceeds character limit. |
Common Failure Modes
What breaks first in production when enforcing tool-use policies across turns and how to guard against it.
Policy Dilution Over Long Sessions
What to watch: The system prompt containing tool-use policies scrolls out of the context window after many turns, causing the model to forget rate limits, authorization boundaries, or required confirmation gates. The assistant begins executing previously blocked tool calls without objection. Guardrail: Implement a policy re-injection trigger that detects when the policy block is within 20% of context window truncation and re-inserts a compressed policy summary before the next tool-use decision.
Tool Name Collision After Function Updates
What to watch: When tool schemas are updated mid-session, the model may call a deprecated function name or confuse old and new parameter shapes, producing invalid tool calls that fail silently or execute with wrong arguments. Guardrail: Version all tool schemas and include a schema version field in the policy prompt. Validate that the called tool name and parameter signature match the current active schema version before execution, rejecting mismatches with a structured error.
Rate Limit Bypass via Argument Variation
What to watch: The model respects an explicit rate limit but discovers it can achieve the same effect by varying arguments slightly, effectively circumventing the policy through semantically equivalent calls. For example, calling the same API with different query phrasings to exceed a search limit. Guardrail: Define rate limits in terms of intent categories, not raw function names. Implement a server-side counter that groups calls by intent class and rejects requests exceeding the category limit regardless of argument variation.
Authorization Scope Creep Across Tool Chains
What to watch: The model chains multiple lower-authority tools together to achieve an effect that would be blocked if requested directly through a single higher-authority tool. The composite action violates the spirit of the policy while each individual call passes. Guardrail: Implement outcome-level policy checks that evaluate the net effect of a tool-call sequence, not just individual calls. Flag sequences that produce disallowed outcomes and inject a policy reminder before the final call in the chain executes.
Refusal Inconsistency Under User Pressure
What to watch: After correctly refusing a disallowed tool call, the model reverses its refusal when the user rephrases the request, claims urgency, or appeals to authority. The policy enforcement becomes inconsistent across turns, training users to push past refusals. Guardrail: Include refusal consistency instructions in the policy prompt that require the model to reference its prior refusal decision when a user re-attempts a blocked action. Log refusal events with the request fingerprint and re-check before any reversal.
Silent Policy Violation in Error Recovery Paths
What to watch: When a tool call fails with an error, the model's recovery attempt bypasses policy checks because the error-handling path was not covered in the policy prompt. The assistant calls a fallback tool or retries with modified parameters that violate authorization boundaries. Guardrail: Extend the policy prompt to cover error recovery scenarios explicitly. Require that any tool call made in response to a failure undergoes the same policy evaluation as the original request, with a mandatory policy re-check step before retry.
Evaluation Rubric
Run these checks against a golden dataset of proposed tool calls with known policy outcomes. Each row tests a specific failure mode that causes tool-use policy violations in production.
| Criterion | Pass Standard | Failure Signal | Test Method |
|---|---|---|---|
Rate limit enforcement | Tool call blocked when [RATE_LIMIT_WINDOW] exceeded; approved when under limit | Call approved despite exhausted rate budget OR blocked when budget remains | Golden set with boundary cases: 0 remaining, 1 remaining, negative counters |
Authorization boundary check | Call blocked when [USER_ROLE] lacks [REQUIRED_PERMISSION]; approved when authorized | Privilege escalation: call approved for unauthorized role OR false block for authorized role | Role-permission matrix test: every role against every tool, verify expected allow/deny |
Session-scope constraint | Call blocked when [TOOL_SCOPE] is outside [SESSION_DOMAIN]; approved when in-scope | Cross-domain tool use permitted OR in-domain tool use blocked | Domain-boundary golden set: in-domain, adjacent-domain, clearly-out-of-domain requests |
Argument validation against policy | Call blocked when [ARGUMENT_VALUE] violates [POLICY_CONSTRAINT]; approved when compliant | Policy-violating argument accepted OR compliant argument rejected | Schema-constrained argument injection: boundary values, nulls, oversized payloads, forbidden enum values |
Refusal quality and alternatives | Blocked call returns [POLICY_REFUSAL_TEMPLATE] with at least one [ALTERNATIVE_ACTION] | Generic refusal without alternatives OR silent failure OR approved when should block | Assert refusal output contains required fields: refusal_reason, alternative_suggestions, escalation_path |
Multi-turn state consistency | Policy decision matches prior turn decisions for same [SESSION_STATE] and [USER_INTENT] | Same state produces different allow/deny decision across turns OR state mutation causes policy leak | Replay test: feed same state through 5 consecutive turns, assert identical policy decisions |
Confirmation gate trigger | High-risk tool call triggers [CONFIRMATION_REQUIRED] when [RISK_SCORE] exceeds [THRESHOLD] | High-risk call proceeds without confirmation OR low-risk call blocked with unnecessary gate | Risk-calibrated golden set: score below threshold, at threshold, above threshold, missing score |
Policy conflict resolution | When [POLICY_A] and [POLICY_B] conflict, output includes [RESOLVED_INSTRUCTION] with [PRIORITY_RATIONALE] | Silent policy violation OR deadlock with no resolution OR wrong priority ordering | Conflict injection test: insert known-conflicting policy pairs, verify resolution rationale and correct priority |
Enabling Efficiency, Speed & Accuracy
Intelligent Analysis, Decision & Execution
We build AI systems for teams that need search across company data, workflow automation across tools, or AI features inside products and internal software.
Talk to Us
Search across company data
Give teams answers from docs, tickets, runbooks, and product data with sources and permissions.
Useful when people spend too long searching or get different answers from different systems.

Automate internal workflows
Use AI to route work, draft outputs, trigger actions, and keep approvals and logs in place.
Useful when repetitive work moves across multiple tools and teams.

Add AI to products and internal tools
Build assistants, guided actions, or decision support into the software your team or customers already use.
Useful when AI needs to be part of the product, not a separate tool.
Adapt This Prompt
How to adapt
Start with the base prompt and a simple JSON schema for the tool-use policy decision. Use a lightweight validator that checks for decision (approved/refused) and reasoning fields. Skip rate-limit counters and session-level state tracking. Run against a small set of canned tool-call requests to validate the refusal path triggers.
Prompt modification
- Remove session-level tracking fields like
[SESSION_TOOL_CALL_COUNT]and[SESSION_RATE_LIMIT_REMAINING] - Replace authorization boundary checks with a static allowed-tools list:
Allowed tools: [ALLOWED_TOOLS_LIST] - Simplify output to
{"decision": "approved"|"refused", "reasoning": "string"}
Watch for
- Over-refusal on edge-case tool names that aren't in the static list
- Missing alternatives when refusing—model may refuse without suggesting what the user can do instead
- No distinction between rate-limit refusal and policy-boundary refusal

About the author
Prasad Kumkar
CEO & MD, Inference Systems
Prasad Kumkar is the CEO & MD of Inference Systems and writes about AI systems architecture, LLM infrastructure, model serving, evaluation, and production deployment. Over 5+ years, he has worked across computer vision models, L5 autonomous vehicle systems, and LLM research, with a focus on taking complex AI ideas into real-world engineering systems.
His work and writing cover AI systems, large language models, AI agents, multimodal systems, autonomous systems, inference optimization, RAG, evaluation, and production AI engineering.
Partnered with leading AI, data, and software stack.
How We Work
Custom AI workflows for your Business
One-fit-all AI don't work for modern businesses. At Inferensys, we aim to understand your business & custom requirements; which we use to define most efficient agentic workflows, the data, and the tools for your business.
01
Review the use case
We understand the task, the users, and where AI can actually help.
Read more02
Pick the right approach
We define what needs search, automation, or product integration.
Read more03
Build the first useful version
We implement the part that proves the value first.
Read more04
Improve from there
We add the checks and visibility needed to keep it useful.
Read moreThe first call is a practical review of your use case and the right next step.
Talk to Us