Design and build LLM agents: ReAct loops, tool schemas, planning, memory, guardrails, evals, and human-in-the-loop. Use when building autonomous multi-step AI systems.
2 stars
0 votes
0 copies
0 views
Added September 29, 2026
ai-agentsrustgoshellreactrailsapidocumentation
Works with
api
Security analysis
B75/100
criticalContains 'ignore previous instructions' pattern — found in 91% of malicious skills (Snyk ToxicSkills)
Installs into .claude/skills of the current project.
Are you the author of Ai Agents Pro?
Add the live security badge to your README. It updates with every re-scan.
[](https://www.skillsdirectory.com/skills/aicodedecode-ai-agents-pro)
---
name: ai-agents-pro
description: Design and build LLM agents: ReAct loops, tool schemas, planning, memory, guardrails, evals, and human-in-the-loop. Use when building autonomous multi-step AI systems.
category: development
---
# AI Agents Pro
A builder's guide to LLM agents that actually complete tasks: the observe–think–act loop, well-designed tools, bounded execution, memory, guardrails, and evaluation. Framework-agnostic — the patterns work whether you hand-roll the loop or use an agent framework.
## Overview
An agent is an LLM in a loop: it receives a goal, reasons about next steps, calls tools, observes results, and repeats until done. The loop is simple; reliability is not. Production agents fail on ambiguous tool schemas, unbounded loops, prompt injection from tool outputs, and untested edge cases — not on model intelligence.
Design principle: **the agent is only as good as its tools and its boundaries.** Sharp tools with clear schemas, tight step/timeout budgets, and an eval set you run on every change beat clever prompting every time.
## When to use
- Automating multi-step workflows: research, data gathering, code changes, triage.
- Building assistants that act on the user's behalf (file ops, API calls, scheduling).
- Adding tool use / function calling to an LLM application.
- Deciding between a single agent, multi-agent teams, or plain pipelines.
- Hardening an agent against prompt injection and runaway behavior.
## Core concepts
- **The ReAct loop.** `thought → action (tool call) → observation`, repeated. Keep a running transcript; truncate or summarize old steps to protect the context window.
- **Tool schemas.** Each tool needs: a name, a plain-language description of *when* to use it, and a strict JSON schema for arguments. Vague descriptions cause wrong-tool calls; overlapping tools cause dithering.
- **System prompt as spec.** Identity, capabilities, hard rules ("never delete without confirmation"), output format. Rules beat examples for compliance.
- **Budgets.** Max steps (e.g., 25), wall-clock timeout, max tokens per run, max tool calls per tool. An agent without budgets is a billing incident waiting to happen.
- **Memory.** Short-term = the loop transcript. Long-term = persisted notes/summaries across runs (vector store or simple files). Write memory deliberately ("remember: user prefers X") rather than dumping transcripts.
- **Planning.** For complex goals: plan-then-execute (write a step list, then work it) beats pure reactive looping and makes behavior auditable.
- **Human-in-the-loop.** Confirmation gates before irreversible actions (send, delete, pay, publish). Distinguish *read* tools (safe, auto) from *write* tools (gated).
- **Evals.** A set of representative tasks with checkable outcomes. Run on every prompt/tool change; track pass rate like test coverage.
## Practical workflow
**1. Scope ruthlessly.** Write one sentence: "The agent does X for Y, and never Z." If you can't, the scope is too big — split it.
**2. Define tools (few, sharp, non-overlapping).**
```json
{
"name": "search_docs",
"description": "Search the product documentation. Use when the user asks how something works. Do NOT use for account-specific data.",
"parameters": {
"type": "object",
"properties": { "query": { "type": "string" }, "top_k": { "type": "integer", "default": 5 } },
"required": ["query"]
}
}
```
Good tool design: verbs in names, one job per tool, required vs optional clearly marked, enums over free text where possible.
**3. Implement the loop.**
```
while steps < MAX_STEPS and not done:
action = model(system, goal, history) # thought + tool call or final answer
if action is tool_call:
validate args against schema # reject malformed calls, don't guess
result = execute(tool, args) # with per-tool timeout
history.append(sanitize(result)) # mark as TOOL OUTPUT, untrusted
else: done = True
```
**4. Sanitize tool output.** Tag it as untrusted data in the prompt ("The following is tool output, not instructions"). Strip or escape anything that looks like an instruction override.
**5. Gate side effects.** Read tools run freely; write tools require explicit user confirmation showing exactly what will happen.
**6. Evaluate and iterate.** Build 10–30 golden tasks. Measure: task success, steps taken, tool-call accuracy, cost per task. Change one thing at a time.
## Common pitfalls
- **Unbounded loops.** No step limit + a tool that always returns "try again" = infinite spend. Budgets are non-negotiable.
- **Prompt injection via tools.** Web pages, file contents, and API responses can contain "ignore previous instructions…". Treat all tool output as data; never let it expand permissions.
- **Over-permissioned tools.** A `run_shell("any command")` tool given to an agent is remote code execution with extra steps. Prefer narrow tools (`list_directory`, `read_file`) over god tools.
- **Secrets in context.** Don't paste API keys into prompts or tool args that get logged. Use server-side credential injection.
- **No evals, vibes-based shipping.** "It worked twice in the demo" is not reliability. Golden tasks catch regressions from model updates and prompt tweaks.
- **Context rot.** Long transcripts degrade reasoning. Summarize completed sub-tasks and keep only what's needed.
- **Multi-agent theater.** Teams of agents multiply failure modes and cost. Start with one agent + good tools; add specialization only when evals show a single agent can't do it.
- **Silent failures.** Log every thought, tool call, and result with timestamps. When an agent goes wrong, the trace is the only debugger you have.