How to Implement Continuous Evolution for AI Agents from Runtime Data
You implement continuous evolution by closing a feedback loop where runtime execution traces are verified, aggregated into an evolution plan, and automatically applied to update the agent's knowledge base, system prompts, and tool definitions.
The bojieli/ai-agent-book repository demonstrates a production-ready architecture for self-improving AI agents. The system treats every task execution as a learning opportunity, converting raw trajectories into tangible improvements without requiring full model retraining.
The Three-Pillar Architecture for Continuous Evolution
The continuous-evolution system rests on three tightly coupled components that operate across the chapter8/ directory:
1. Runtime Data Collector
Gathers execution traces including tool calls, tool results, and user feedback. The implementation spans chapter8/trajectory-verifier/ (containing verifier.py and llm_judge) and chapter8/gaia-experience/ (containing knowledge_base.py and the experience agent).
2. Evaluation & Learning Signal Generator
Transforms raw traces into continuous reward scores and decides what artifacts to persist. This logic lives in chapter8/self-evolution-eval/harness.py.
3. Continuous-Evolution Engine
Updates the agent's knowledge base, system prompts, tools, and optional model parameters. The core implementation is in chapter8/self-modifying-agent/evolution.py, orchestrated through demo.py.
Step-by-Step Data Flow from Runtime to Evolution
The closed loop operates across five distinct stages, moving from raw execution to deployed improvements:
1. Execution and Trajectory Logging
While the agent runs, every interaction (prompt → LLM → tool call → tool response) is logged as a JSON trajectory. The logging logic resides in generic agent wrappers.
2. Verification with Continuous Rewards
After task completion, the trajectory verifier (verifier.py) checks correctness and extracts a continuous reward score between 0 and 1. This scalar value replaces binary PASS/FAIL signals, providing granular quality metrics for the evolution harness.
3. Aggregation by the Evolution Harness
chapter8/self-evolution-eval/harness.py consumes verified trajectories, grouping them by skill, tool, or domain. It computes aggregated statistics including average reward, failure patterns, and tool-usage frequency.
4. Decision Making
The harness decides what to evolve based on the aggregated data:
- Knowledge: New facts are inserted into the vector store via
knowledge_base.py. - Instructions: Recurring patterns become reusable system-prompt snippets appended to the agent's template.
- Tools: New or refined tool definitions are written to
base_tools.py. - Parameters: Optional fine-tuning triggers (e.g.,
train_sft_trl.py) for model parameter updates.
5. Application and Deployment
The evolution engine (evolution.py) reads the decision payload from evolution_plan.yaml, generates diff-style change descriptions, and writes updated artifacts back to the repository. Subsequent runs automatically pick up these changes, enabling continuous improvement without restarting the core service.
Implementing the Evolution Loop: Code Examples
Running the Self-Modifying Agent
Execute tasks while logging trajectories for later evolution:
# demo.py
from self_modifying_agent.agent import Agent
agent = Agent(
system_prompt_path="system_prompt.txt",
tool_registry="self-evolving-tools/base_tools.py"
)
# Execute task; trajectory automatically logged to sample_trajectories.json
result = agent.run_task("Summarize the latest AI research papers.")
print(result)
Verifying Trajectories with Continuous Rewards
Generate granular quality signals instead of binary pass/fail:
# verifier.py usage
from trajectory_verifier.verifier import Verifier
verifier = Verifier()
reward = verifier.evaluate("sample_trajectories.json")
print(f"Continuous reward: {reward:.2f}") # Output: 0.0 to 1.0
Generating Evolution Plans
Aggregate verified trajectories into a structured improvement plan:
# harness.py API
from self_evolution_eval.harness import Harness
h = Harness()
plan = h.create_plan("sample_trajectories.json")
h.save_plan(plan, "evolution_plan.yaml")
The resulting YAML specifies actions such as add_knowledge, update_prompt, or refine_tool.
Applying the Evolution Plan
Update agent artifacts automatically from the command line:
python chapter8/self-modifying-agent/evolution.py \
--plan evolution_plan.yaml
This command patches:
knowledge_base.pywith new factssystem_prompt.txtwith additional instructionsbase_tools.pywith refined tool definitions
Key Implementation Details from the Source Code
Separation of Concerns
The generation LLM handles high-level reasoning while a lightweight "apply" model (or deterministic diff-merger) manages textual patching. This mirrors the cursor approach described in Chapter 5, preventing the main agent from being distracted by implementation details.
Feedback-Controlled Loop
The reward-shaping mechanism penalizes excessively verbose responses, ensuring evolution favors concise, correct behavior. This is implemented in the trajectory verifier's scoring logic.
Modular Plugin Discovery
New tools, knowledge stores, and evaluation rubrics can be dropped into self-evolving-tools/ or self-evolution-eval/ directories without touching the core engine. The system discovers them at startup via importlib scanning.
Continuous-Time Thinking
The orchestrator can inject new observations into ongoing LLM decode streams while waiting for tool responses, allowing the agent to "think" continuously during execution lulls.
Summary
- Runtime data collection happens automatically via agent wrappers that log every interaction as JSON trajectories.
- Continuous reward scores (0–1) from
verifier.pyprovide granular quality signals superior to binary pass/fail metrics. - Evolution plans generated by
harness.pyspecify exactly which artifacts to update: knowledge, prompts, tools, or parameters. - Automatic application via
evolution.pycloses the loop, deploying improvements without manual intervention or full retraining. - Modular architecture allows components to be swapped via directory-based plugin discovery using standard Python import mechanisms.
Frequently Asked Questions
What is the difference between continuous reward scores and binary evaluation?
Binary evaluation marks a trajectory as simply pass or fail, discarding nuanced information about partial success. The verifier.py implementation in bojieli/ai-agent-book returns a continuous reward score between 0 and 1, allowing the harness.py aggregator to distinguish between barely passing executions and exemplary runs. This granularity enables more sophisticated evolution decisions, such as only promoting high-reward patterns to the knowledge base.
How does the evolution engine modify system prompts without breaking the agent?
The evolution.py engine generates diff-style change descriptions and uses a dedicated "apply" model (or deterministic merge logic) to safely patch text files. Rather than rewriting entire prompts, it appends new snippets or modifies specific sections based on the evolution_plan.yaml directives. This surgical approach prevents corruption of base instructions while allowing incremental refinement of agent behavior based on runtime data patterns.
Can the continuous evolution loop run fully automatically?
Yes. The repository provides an end-to-end pipeline: demo.py executes tasks and logs data, verifier.py scores trajectories, harness.py generates plans, and evolution.py applies changes. In production deployments, these can be orchestrated as a scheduled or event-driven workflow where successful task completion automatically triggers verification and potential evolution, creating a self-improving agent that requires no manual intervention for routine updates.
What types of runtime data are most valuable for triggering evolution?
The system prioritizes trajectories with high information gain: novel tool usage patterns, unexpected failure modes, and user corrections. The harness.py module specifically looks for recurring patterns across multiple executions and statistical outliers in the continuous reward distribution. Single successful executions provide limited signal, but aggregated patterns across similar task types indicate systemic improvements worth persisting to the knowledge base or prompt templates.
Have a question about this repo?
These articles cover the highlights, but your codebase questions are specific. Give your agent direct access to the source. Share this with your agent to get started:
curl -s "https://instagit.com/install.md" Maintain an open-source project? Get it listed too →