feat: filled gaps - instructor bio, email capture, free preview, deeper M7, better mock responses, realistic lab data
This commit is contained in:
parent
c378e326b0
commit
dce30b50a3
|
|
@ -1,5 +1,17 @@
|
||||||
This is a test file for Lab 1.7: Your First Agent.
|
This is a sample log file from a production agent system running on 2026-05-15.
|
||||||
It contains sample data for the agent to read and summarize.
|
It contains session traces, tool calls, and timing data.
|
||||||
Line 1: Hello world
|
|
||||||
Line 2: The quick brown fox jumps over the lazy dog
|
Session ID: sess_abc123
|
||||||
Line 3: 42 is the answer to everything
|
Date: 2026-05-15T14:30:00Z
|
||||||
|
Model: claude-sonnet-4-20260501
|
||||||
|
|
||||||
|
[14:30:01] AGENT INITIALIZED — Task: "Analyze the latest deployment log"
|
||||||
|
[14:30:02] TOOL CALL: read_file(path="logs/deploy-2026-05-15.log")
|
||||||
|
[14:30:03] TOOL RESULT: 847 bytes read
|
||||||
|
[14:30:04] TOOL CALL: grep_search(pattern="ERROR|FAIL|CRITICAL")
|
||||||
|
[14:30:05] TOOL RESULT: 3 matches found
|
||||||
|
[14:30:06] TOOL CALL: read_file(path="logs/deploy-2026-05-15.log:42:50")
|
||||||
|
[14:30:07] TOOL RESULT: 9 lines read
|
||||||
|
[14:30:08] ANALYSIS: Found 2 warnings, 1 critical error
|
||||||
|
[14:30:09] FINAL ANSWER: Deployment has a database connection issue
|
||||||
|
[14:30:10] SESSION END — Total time: 9.2s, Total cost: $0.042
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,26 @@
|
||||||
|
{
|
||||||
|
"app_name": "AgentMonitor",
|
||||||
|
"version": "2.4.1",
|
||||||
|
"environment": "production",
|
||||||
|
"features": {
|
||||||
|
"dashboard": true,
|
||||||
|
"alerts": true,
|
||||||
|
"scheduling": false,
|
||||||
|
"multi_tenant": true
|
||||||
|
},
|
||||||
|
"database": {
|
||||||
|
"host": "db-primary-01.example.com",
|
||||||
|
"port": 5432,
|
||||||
|
"pool_size": 20,
|
||||||
|
"timeout_ms": 5000
|
||||||
|
},
|
||||||
|
"api_keys": [
|
||||||
|
{ "service": "openai", "key": "sk-...prod...", "quota": 1000000 },
|
||||||
|
{ "service": "anthropic", "key": "sk-ant-...prod...", "quota": 500000 }
|
||||||
|
],
|
||||||
|
"logging": {
|
||||||
|
"level": "INFO",
|
||||||
|
"format": "json",
|
||||||
|
"sink": "cloudwatch"
|
||||||
|
}
|
||||||
|
}
|
||||||
Binary file not shown.
|
|
@ -133,9 +133,17 @@ def _generate_text_response(prompt: str) -> str:
|
||||||
|
|
||||||
prompt_lower = prompt.lower()
|
prompt_lower = prompt.lower()
|
||||||
|
|
||||||
# File content responses
|
# Agent session log responses
|
||||||
|
if "session" in prompt_lower and ("agent" in prompt_lower or "tool call" in prompt_lower):
|
||||||
|
return "I've analyzed the session log. Here's what I found:\n\n- The agent completed 3 tool calls successfully\n- 1 critical error was detected (database connection timeout)\n- 2 warnings (deprecated API usage)\n- Total session cost: $0.042\n- Recommendation: Check the database connection pool settings"
|
||||||
|
|
||||||
|
# File content responses - extract what the file is about
|
||||||
if "contents of" in prompt_lower:
|
if "contents of" in prompt_lower:
|
||||||
return "Based on the file contents, I can see the document contains sample data. The key information includes test records and example data points. What specific aspect would you like me to analyze?"
|
if "error" in prompt_lower or "FAIL" in prompt_lower:
|
||||||
|
return "I've analyzed the file. It contains session trace data from a production agent deployment. There are signs of a database connection issue that needs investigation."
|
||||||
|
if "deploy" in prompt_lower or "log" in prompt_lower:
|
||||||
|
return "I've reviewed the deployment log. The system ran 3 tool calls successfully with one critical error. The root cause appears to be a database timeout."
|
||||||
|
return "Based on the file contents, I can see it contains sample data with records and configuration details. The key patterns I identified are structured around standard formats."
|
||||||
|
|
||||||
# Search result responses
|
# Search result responses
|
||||||
if "search" in prompt_lower and ("result" in prompt_lower or "found" in prompt_lower):
|
if "search" in prompt_lower and ("result" in prompt_lower or "found" in prompt_lower):
|
||||||
|
|
|
||||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
|
|
@ -1 +1 @@
|
||||||
import{R as p}from"./chunks/theme.DOzU43nI.js";import{v as s,am as i,R as u,w as c,p as l,a as f,C as d,a1 as m,k as h,S as g,l as A,r as v,ac as w,N as C,as as R,ag as y,ab as P,aa as b,u as S}from"./chunks/framework.BPKcPtvA.js";function r(e){if(e.extends){const a=r(e.extends);return{...a,...e,async enhanceApp(t){a.enhanceApp&&await a.enhanceApp(t),e.enhanceApp&&await e.enhanceApp(t)}}}return e}const n=r(p),E=v({name:"VitePressApp",setup(){const{site:e,lang:a,dir:t}=w();return C(()=>{R(()=>{document.documentElement.lang=a.value,document.documentElement.dir=t.value})}),e.value.router.prefetchLinks&&y(),P(),b(),n.setup&&n.setup(),()=>S(n.Layout)}});async function T(){globalThis.__VITEPRESS__=!0;const e=_(),a=D();a.provide(u,e);const t=c(e.route);return a.provide(l,t),a.component("Content",f),a.component("ClientOnly",d),Object.defineProperties(a.config.globalProperties,{$frontmatter:{get(){return t.frontmatter.value}},$params:{get(){return t.page.value.params}}}),n.enhanceApp&&await n.enhanceApp({app:a,router:e,siteData:m}),{app:a,router:e,data:t}}function D(){return A(E)}function _(){let e=s;return h(a=>{let t=g(a),o=null;return t&&(e&&(t=t.replace(/\.js$/,".lean.js")),o=import(t)),s&&(e=!1),o},n.NotFound)}s&&T().then(({app:e,router:a,data:t})=>{a.go().then(()=>{i(a.route,t.site),e.mount("#app")})});export{T as createApp};
|
import{R as p}from"./chunks/theme.C5-KOWho.js";import{v as s,am as i,R as u,w as c,p as l,a as f,C as d,a1 as m,k as h,S as g,l as A,r as v,ac as w,N as C,as as R,ag as y,ab as P,aa as b,u as S}from"./chunks/framework.BPKcPtvA.js";function r(e){if(e.extends){const a=r(e.extends);return{...a,...e,async enhanceApp(t){a.enhanceApp&&await a.enhanceApp(t),e.enhanceApp&&await e.enhanceApp(t)}}}return e}const n=r(p),E=v({name:"VitePressApp",setup(){const{site:e,lang:a,dir:t}=w();return C(()=>{R(()=>{document.documentElement.lang=a.value,document.documentElement.dir=t.value})}),e.value.router.prefetchLinks&&y(),P(),b(),n.setup&&n.setup(),()=>S(n.Layout)}});async function T(){globalThis.__VITEPRESS__=!0;const e=_(),a=D();a.provide(u,e);const t=c(e.route);return a.provide(l,t),a.component("Content",f),a.component("ClientOnly",d),Object.defineProperties(a.config.globalProperties,{$frontmatter:{get(){return t.frontmatter.value}},$params:{get(){return t.page.value.params}}}),n.enhanceApp&&await n.enhanceApp({app:a,router:e,siteData:m}),{app:a,router:e,data:t}}function D(){return A(E)}function _(){let e=s;return h(a=>{let t=g(a),o=null;return t&&(e&&(t=t.replace(/\.js$/,".lean.js")),o=import(t)),s&&(e=!1),o},n.NotFound)}s&&T().then(({app:e,router:a,data:t})=>{a.go().then(()=>{i(a.route,t.site),e.mount("#app")})});export{T as createApp};
|
||||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
|
|
@ -0,0 +1,3 @@
|
||||||
|
import{c as e,Q as a,j as s,m as n}from"./chunks/framework.BPKcPtvA.js";const p=JSON.parse('{"title":"Free Preview: Lesson 1.1 — What Makes an Agent?","description":"","frontmatter":{},"headers":[],"relativePath":"free-preview.md","filePath":"free-preview.md","lastUpdated":null}'),o={name:"free-preview.md"};function i(r,t,d,l,h,c){return a(),s("div",null,[...t[0]||(t[0]=[n(`<h1 id="free-preview-lesson-1-1-—-what-makes-an-agent" tabindex="-1">Free Preview: Lesson 1.1 — What Makes an Agent? <a class="header-anchor" href="#free-preview-lesson-1-1-—-what-makes-an-agent" aria-label="Permalink to "Free Preview: Lesson 1.1 — What Makes an Agent?""></a></h1><p>This is a sample lesson from <strong>Module 1: Foundations</strong> of the FDSA Agentic Engineering Course. Full course includes 65 lessons, 13 labs, and 20 skill kits.</p><hr><h2 id="lesson-1-1-what-makes-an-agent" tabindex="-1">Lesson 1.1: What Makes an Agent? <a class="header-anchor" href="#lesson-1-1-what-makes-an-agent" aria-label="Permalink to "Lesson 1.1: What Makes an Agent?""></a></h2><p><strong>Definition</strong>: An AI agent = LLM + Tools + Loop. Without any one of these three, it's not an agent.</p><div class="language- vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang"></span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span>Agent = LLM (reasoning engine)</span></span>
|
||||||
|
<span class="line"><span> + Tools (capability surface)</span></span>
|
||||||
|
<span class="line"><span> + Loop (autonomous decision cycle)</span></span></code></pre></div><ul><li>A single LLM call with no tools = chatbot</li><li>An LLM with tools but no loop = augmented inference</li><li>Tools + loop + LLM = agent (it can decide what to do next)</li></ul><h3 id="the-three-components" tabindex="-1">The Three Components <a class="header-anchor" href="#the-three-components" aria-label="Permalink to "The Three Components""></a></h3><p><strong>LLM</strong> — The reasoning engine. Given context + available tools, it decides which tool to call and with what parameters. The LLM is NOT the agent — it's the brain of the agent. Different models have different reasoning capabilities, but the core function is the same: given a situation and available actions, decide what to do.</p><p><strong>Tools</strong> — The capability surface. Functions the agent can call: read files, run commands, search the web, query databases, call APIs. Each tool has a name, description, and input schema. The tool surface defines what the agent CAN do — everything outside this surface is something the agent cannot do, no matter how smart the LLM is.</p><p><strong>Loop</strong> — The autonomous decision cycle. Think (LLM decides) → Act (tool executes) → Observe (result comes back) → Repeat. The loop is what makes it autonomous. Without a loop, you have a single decision. With a loop, you have an agent that can work toward a goal across multiple steps.</p><h3 id="why-this-matters" tabindex="-1">Why This Matters <a class="header-anchor" href="#why-this-matters" aria-label="Permalink to "Why This Matters""></a></h3><p>This definition is not academic. Every production agent failure I've seen traces back to one of these three:</p><table tabindex="0"><thead><tr><th>Failure</th><th>Root Cause</th></tr></thead><tbody><tr><td>Agent does something unexpected</td><td>Loop didn't terminate correctly</td></tr><tr><td>Agent can't do the task</td><td>Tools are insufficient for the task</td></tr><tr><td>Agent makes bad decisions</td><td>LLM doesn't have enough context</td></tr><tr><td>Agent costs too much</td><td>Loop runs too many iterations</td></tr></tbody></table><p>If you understand these three components and how they interact, you can debug any agent system. If you don't, you're guessing.</p><hr><h2 id="what-you-ll-learn-in-the-full-course" tabindex="-1">What You'll Learn in the Full Course <a class="header-anchor" href="#what-you-ll-learn-in-the-full-course" aria-label="Permalink to "What You'll Learn in the Full Course""></a></h2><table tabindex="0"><thead><tr><th>Module</th><th>Topic</th><th>Lessons</th><th>Labs</th></tr></thead><tbody><tr><td>M1</td><td>Foundations</td><td>8 lessons</td><td>1 lab</td></tr><tr><td>M2</td><td>Agent Architecture</td><td>7 lessons</td><td>2 labs</td></tr><tr><td>M3</td><td>Safety & Security</td><td>7 lessons</td><td>2 labs</td></tr><tr><td>M4</td><td>Multi-Agent Orchestration</td><td>11 lessons</td><td>2 labs</td></tr><tr><td>M5</td><td>Production Systems</td><td>10 lessons</td><td>2 labs</td></tr><tr><td>M6</td><td>Model Economics</td><td>7 lessons</td><td>2 labs</td></tr><tr><td>M7</td><td>Advanced Patterns</td><td>8 lessons</td><td>2 labs</td></tr><tr><td>M8</td><td>Capstone Project</td><td>—</td><td>Build & deploy</td></tr></tbody></table><p><a href="/buy">Enroll Now — $97</a> · <a href="/modules/curriculum">View Full Curriculum</a></p><p><em>Note: This preview shows approximately 30% of a single lesson. Full lessons include code examples, diagrams, quiz questions, and lab exercises.</em></p>`,20)])])}const g=e(o,[["render",i]]);export{p as __pageData,g as default};
|
||||||
|
|
@ -0,0 +1 @@
|
||||||
|
import{c as e,Q as a,j as s,m as n}from"./chunks/framework.BPKcPtvA.js";const p=JSON.parse('{"title":"Free Preview: Lesson 1.1 — What Makes an Agent?","description":"","frontmatter":{},"headers":[],"relativePath":"free-preview.md","filePath":"free-preview.md","lastUpdated":null}'),o={name:"free-preview.md"};function i(r,t,d,l,h,c){return a(),s("div",null,[...t[0]||(t[0]=[n("",20)])])}const g=e(o,[["render",i]]);export{p as __pageData,g as default};
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
import{c as a,Q as i,j as e,m as t}from"./chunks/framework.BPKcPtvA.js";const c=JSON.parse('{"title":"Module 7: Advanced Topics","description":"","frontmatter":{},"headers":[],"relativePath":"modules/m7-advanced.md","filePath":"modules/m7-advanced.md","lastUpdated":1780488246000}'),n={name:"modules/m7-advanced.md"};function l(p,s,h,r,o,d){return i(),e("div",null,[...s[0]||(s[0]=[t(`<h1 id="module-7-advanced-topics" tabindex="-1">Module 7: Advanced Topics <a class="header-anchor" href="#module-7-advanced-topics" aria-label="Permalink to "Module 7: Advanced Topics""></a></h1><h2 id="lesson-7-1-autoresearch" tabindex="-1">Lesson 7.1: Autoresearch <a class="header-anchor" href="#lesson-7-1-autoresearch" aria-label="Permalink to "Lesson 7.1: Autoresearch""></a></h2><h3 id="the-core-loop" tabindex="-1">The Core Loop <a class="header-anchor" href="#the-core-loop" aria-label="Permalink to "The Core Loop""></a></h3><p>Agents that improve themselves. The experiment loop:</p><div class="language- vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang"></span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span>1. Run: Execute the agent with current configuration</span></span>
|
import{c as a,Q as i,j as e,m as t}from"./chunks/framework.BPKcPtvA.js";const c=JSON.parse('{"title":"Module 7: Advanced Topics","description":"","frontmatter":{},"headers":[],"relativePath":"modules/m7-advanced.md","filePath":"modules/m7-advanced.md","lastUpdated":1780488246000}'),n={name:"modules/m7-advanced.md"};function l(h,s,p,r,o,d){return i(),e("div",null,[...s[0]||(s[0]=[t(`<h1 id="module-7-advanced-topics" tabindex="-1">Module 7: Advanced Topics <a class="header-anchor" href="#module-7-advanced-topics" aria-label="Permalink to "Module 7: Advanced Topics""></a></h1><h2 id="lesson-7-1-autoresearch" tabindex="-1">Lesson 7.1: Autoresearch <a class="header-anchor" href="#lesson-7-1-autoresearch" aria-label="Permalink to "Lesson 7.1: Autoresearch""></a></h2><h3 id="the-core-loop" tabindex="-1">The Core Loop <a class="header-anchor" href="#the-core-loop" aria-label="Permalink to "The Core Loop""></a></h3><p>Agents that improve themselves. The experiment loop:</p><div class="language- vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang"></span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span>1. Run: Execute the agent with current configuration</span></span>
|
||||||
<span class="line"><span>2. Measure: Collect metrics (latency, cost, success rate)</span></span>
|
<span class="line"><span>2. Measure: Collect metrics (latency, cost, success rate)</span></span>
|
||||||
<span class="line"><span>3. Log: Record experiment results to JSONL</span></span>
|
<span class="line"><span>3. Log: Record experiment results to JSONL</span></span>
|
||||||
<span class="line"><span>4. Decide: Keep if improvement, discard if regression</span></span>
|
<span class="line"><span>4. Decide: Keep if improvement, discard if regression</span></span>
|
||||||
|
|
@ -50,4 +50,11 @@ import{c as a,Q as i,j as e,m as t}from"./chunks/framework.BPKcPtvA.js";const c=
|
||||||
<span class="line"></span>
|
<span class="line"></span>
|
||||||
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"># Agent polls for sentinel pattern</span></span>
|
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"># Agent polls for sentinel pattern</span></span>
|
||||||
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">poll</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> logs</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> for</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> "__DONE_abc123"</span></span>
|
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">poll</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> logs</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> for</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> "__DONE_abc123"</span></span>
|
||||||
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"># Extract exit code from sentinel</span></span></code></pre></div><hr><h2 id="lesson-7-6-always-on-agents" tabindex="-1">Lesson 7.6: Always-On Agents <a class="header-anchor" href="#lesson-7-6-always-on-agents" aria-label="Permalink to "Lesson 7.6: Always-On Agents""></a></h2><h3 id="voice-to-command-bridge" tabindex="-1">Voice-to-Command Bridge <a class="header-anchor" href="#voice-to-command-bridge" aria-label="Permalink to "Voice-to-Command Bridge""></a></h3><div class="language- vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang"></span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span>User speaks → STT (faster-whisper) → LLM transcribes to command → Execute → TTS response</span></span></code></pre></div><h3 id="job-server-pattern" tabindex="-1">Job Server Pattern <a class="header-anchor" href="#job-server-pattern" aria-label="Permalink to "Job Server Pattern""></a></h3><div class="language- vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang"></span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span>Submit → Queue → Worker picks up → Claude Code executes → Result stored → Check later</span></span></code></pre></div><h3 id="heartbeat-execution-from-paperclip" tabindex="-1">Heartbeat Execution (from Paperclip) <a class="header-anchor" href="#heartbeat-execution-from-paperclip" aria-label="Permalink to "Heartbeat Execution (from Paperclip)""></a></h3><div class="language- vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang"></span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span>Timer fires → Check for queued work → Wake agent → Agent executes → Agent sleeps</span></span></code></pre></div><p>No continuous running. Agents wake, work, and sleep on a schedule.</p><hr><h2 id="lab-7-7-build-an-autoresearch-loop" tabindex="-1">Lab 7.7: Build an Autoresearch Loop <a class="header-anchor" href="#lab-7-7-build-an-autoresearch-loop" aria-label="Permalink to "Lab 7.7: Build an Autoresearch Loop""></a></h2><p><strong>Objective</strong>: Agent runs experiment, measures result, logs it, decides keep/discard.</p><p><strong>Starter</strong>: <code>course/labs/L7-autoresearch/starter.py</code></p><p><strong>Checkpoints</strong>:</p><ol><li>Run code, measure baseline metric</li><li>Modify code (agent makes change)</li><li>Re-measure, compare, log</li><li>Discard if regression, keep if improvement</li><li>Include integrity guard (code hashing)</li></ol><h2 id="lab-7-8-meta-agent" tabindex="-1">Lab 7.8: Meta-Agent <a class="header-anchor" href="#lab-7-8-meta-agent" aria-label="Permalink to "Lab 7.8: Meta-Agent""></a></h2><p><strong>Objective</strong>: Agent generates a new agent persona from documentation.</p><p><strong>Starter</strong>: <code>course/labs/L7-meta-agent/starter.py</code></p>`,52)])])}const g=a(n,[["render",l]]);export{c as __pageData,g as default};
|
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"># Extract exit code from sentinel</span></span></code></pre></div><hr><h2 id="lesson-7-6-always-on-agents" tabindex="-1">Lesson 7.6: Always-On Agents <a class="header-anchor" href="#lesson-7-6-always-on-agents" aria-label="Permalink to "Lesson 7.6: Always-On Agents""></a></h2><h3 id="voice-to-command-bridge" tabindex="-1">Voice-to-Command Bridge <a class="header-anchor" href="#voice-to-command-bridge" aria-label="Permalink to "Voice-to-Command Bridge""></a></h3><div class="language- vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang"></span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span>User speaks → STT (faster-whisper) → LLM transcribes to command → Execute → TTS response</span></span></code></pre></div><h3 id="job-server-pattern" tabindex="-1">Job Server Pattern <a class="header-anchor" href="#job-server-pattern" aria-label="Permalink to "Job Server Pattern""></a></h3><div class="language- vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang"></span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span>Submit → Queue → Worker picks up → Claude Code executes → Result stored → Check later</span></span></code></pre></div><h3 id="heartbeat-execution-from-paperclip" tabindex="-1">Heartbeat Execution (from Paperclip) <a class="header-anchor" href="#heartbeat-execution-from-paperclip" aria-label="Permalink to "Heartbeat Execution (from Paperclip)""></a></h3><div class="language- vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang"></span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span>Timer fires → Check for queued work → Wake agent → Agent executes → Agent sleeps</span></span></code></pre></div><p>No continuous running. Agents wake, work, and sleep on a schedule.</p><h3 id="scheduling-strategies" tabindex="-1">Scheduling Strategies <a class="header-anchor" href="#scheduling-strategies" aria-label="Permalink to "Scheduling Strategies""></a></h3><table tabindex="0"><thead><tr><th>Strategy</th><th>Pattern</th><th>Use Case</th></tr></thead><tbody><tr><td>Fixed interval</td><td>Every N minutes/hours/days</td><td>Brand monitoring, price tracking</td></tr><tr><td>Event-triggered</td><td>Webhook → wake agent</td><td>CI/CD pipelines, PR reviews</td></tr><tr><td>Predictive</td><td>Learn optimal check times</td><td>Traffic monitoring, anomaly detection</td></tr><tr><td>Cascade</td><td>Agent A finishes → Agent B starts</td><td>Data pipeline, ETL workflows</td></tr></tbody></table><h3 id="openclaw-the-always-on-employee" tabindex="-1">OpenClaw: The Always-On Employee <a class="header-anchor" href="#openclaw-the-always-on-employee" aria-label="Permalink to "OpenClaw: The Always-On Employee""></a></h3><p>OpenClaw is a daemon-style agent that runs as a background service:</p><div class="language-yaml vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">yaml</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"># openclaw-config.yaml</span></span>
|
||||||
|
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;">agent</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">:</span></span>
|
||||||
|
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;"> name</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">"brand-monitor"</span></span>
|
||||||
|
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;"> heartbeat</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">300</span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> # every 5 minutes</span></span>
|
||||||
|
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;"> max_sessions</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">1</span></span>
|
||||||
|
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;"> wake_command</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">"claude -p 'Check brand mentions since last run'"</span></span>
|
||||||
|
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;"> sleep_command</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">"pkill -f 'claude.*brand-monitor'"</span></span>
|
||||||
|
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;"> log_path</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">"/var/log/openclaw/brand-monitor.log"</span></span></code></pre></div><p>It starts, checks for work, executes if needed, then goes back to sleep. No continuous billing, no context window overflow, no runaway loops. This is the pattern for production always-on agents.</p><h3 id="when-not-to-use-always-on" tabindex="-1">When NOT to Use Always-On <a class="header-anchor" href="#when-not-to-use-always-on" aria-label="Permalink to "When NOT to Use Always-On""></a></h3><p>Always-on adds complexity. Before building one, verify you actually need it:</p><ul><li><strong>Batch jobs</strong> → Cron is simpler and cheaper</li><li><strong>Real-time</strong> → Event-driven architectures (webhooks, Kafka) outperform polling agents</li><li><strong>One-off</strong> → Just run the agent once</li></ul><p>Always-on makes sense when you need adaptive scheduling, dynamic task generation, or autonomous decision-making about what to work on next.</p><hr><h2 id="lab-7-7-build-an-autoresearch-loop" tabindex="-1">Lab 7.7: Build an Autoresearch Loop <a class="header-anchor" href="#lab-7-7-build-an-autoresearch-loop" aria-label="Permalink to "Lab 7.7: Build an Autoresearch Loop""></a></h2><p><strong>Objective</strong>: Agent runs experiment, measures result, logs it, decides keep/discard.</p><p><strong>Starter</strong>: <code>course/labs/L7-autoresearch/starter.py</code></p><p><strong>Checkpoints</strong>:</p><ol><li>Run code, measure baseline metric</li><li>Modify code (agent makes change)</li><li>Re-measure, compare, log</li><li>Discard if regression, keep if improvement</li><li>Include integrity guard (code hashing)</li></ol><h2 id="lab-7-8-meta-agent" tabindex="-1">Lab 7.8: Meta-Agent <a class="header-anchor" href="#lab-7-8-meta-agent" aria-label="Permalink to "Lab 7.8: Meta-Agent""></a></h2><p><strong>Objective</strong>: Agent generates a new agent persona from documentation.</p><p><strong>Starter</strong>: <code>course/labs/L7-meta-agent/starter.py</code></p>`,62)])])}const g=a(n,[["render",l]]);export{c as __pageData,g as default};
|
||||||
|
|
@ -1 +1 @@
|
||||||
import{c as a,Q as i,j as e,m as t}from"./chunks/framework.BPKcPtvA.js";const c=JSON.parse('{"title":"Module 7: Advanced Topics","description":"","frontmatter":{},"headers":[],"relativePath":"modules/m7-advanced.md","filePath":"modules/m7-advanced.md","lastUpdated":1780488246000}'),n={name:"modules/m7-advanced.md"};function l(p,s,h,r,o,d){return i(),e("div",null,[...s[0]||(s[0]=[t("",52)])])}const g=a(n,[["render",l]]);export{c as __pageData,g as default};
|
import{c as a,Q as i,j as e,m as t}from"./chunks/framework.BPKcPtvA.js";const c=JSON.parse('{"title":"Module 7: Advanced Topics","description":"","frontmatter":{},"headers":[],"relativePath":"modules/m7-advanced.md","filePath":"modules/m7-advanced.md","lastUpdated":1780488246000}'),n={name:"modules/m7-advanced.md"};function l(h,s,p,r,o,d){return i(),e("div",null,[...s[0]||(s[0]=[t("",62)])])}const g=a(n,[["render",l]]);export{c as __pageData,g as default};
|
||||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
|
|
@ -1 +1 @@
|
||||||
{"404.md":"BiCvjdaY","api-keys.md":"D2Kyj8T3","blog_index.md":"B5nL9faf","blog_posts_cascade-routing.md":"DvBM3TSf","blog_posts_choosing-security-level.md":"BYXRZEDN","blog_posts_mental-models.md":"BRY80gtq","blog_posts_repo-is-spec.md":"BxY1cXc_","blog_posts_security-ladder.md":"DQaqn6Yt","blog_posts_three-x-rule.md":"BHO6bhvz","blog_posts_verifier-pattern.md":"Gha_L_u5","blog_posts_vibe-vs-agentic.md":"7mduPfz1","blog_posts_what-is-an-agent.md":"BU2wUq_Y","blog_posts_why-multi-agent.md":"BVRIN2vH","buy.md":"CbIpCW5Y","certificate.md":"0V0n-TLl","getting-started.md":"Boo_V9xC","index.md":"BNS2TR1g","labs_index.md":"sAzXzfkI","labs_l1-first-agent.md":"BwU9yf-G","labs_l2-context.md":"BexGm8_s","labs_l2-multi-tool.md":"Bj3Mb-oj","labs_l3-verifier.md":"xilrGGap","labs_l3-whitelist-hook.md":"DJtbL66Y","labs_l4-agent-chain.md":"D89P8dwJ","labs_l4-multi-team.md":"DmSK8e2P","labs_l5-cicd.md":"Dz1Jl78z","labs_l5-observability.md":"BDpqVYjT","labs_l6-cost-optimization.md":"CabFK4GB","labs_l6-eval-harness.md":"CBwH6xOR","labs_l7-autoresearch.md":"BYlzPLYo","labs_l7-meta-agent.md":"iTswbOPg","modules_competitive-analysis.md":"BHMHacei","modules_curriculum.md":"D7UeKRfo","modules_debate.md":"DWctKMlA","modules_feynman.md":"DBw5sPBP","modules_field-manual.md":"hmt_NLf1","modules_m1-foundations.md":"DHFyTzWj","modules_m2-architecture.md":"Dp39xggp","modules_m3-safety.md":"CkKCTJdi","modules_m4-orchestration.md":"DFLcAKBv","modules_m5-production.md":"DTkLIrwQ","modules_m6-economics.md":"B6XI2-r7","modules_m7-advanced.md":"Cr3-rEV4","modules_m8-capstone.md":"D1AXKCqv","modules_non-technical.md":"BnvuUCRo","modules_reference-stack.md":"D9FXitvn","modules_software-factory.md":"C5Yf8Zwe","modules_tool-reference.md":"B40mlgZJ","public_certificate_template.md":"Cg1kPB1b","resources.md":"DcUu1NrK","skills.md":"BX3RBeCK","troubleshooting.md":"B6difx2I","verify.md":"Cl5ZMWNd"}
|
{"404.md":"BiCvjdaY","api-keys.md":"D2Kyj8T3","blog_index.md":"B5nL9faf","blog_posts_cascade-routing.md":"DvBM3TSf","blog_posts_choosing-security-level.md":"BYXRZEDN","blog_posts_mental-models.md":"BRY80gtq","blog_posts_repo-is-spec.md":"BxY1cXc_","blog_posts_security-ladder.md":"DQaqn6Yt","blog_posts_three-x-rule.md":"BHO6bhvz","blog_posts_verifier-pattern.md":"Gha_L_u5","blog_posts_vibe-vs-agentic.md":"7mduPfz1","blog_posts_what-is-an-agent.md":"BU2wUq_Y","blog_posts_why-multi-agent.md":"BVRIN2vH","buy.md":"CbIpCW5Y","certificate.md":"0V0n-TLl","free-preview.md":"D4lOIST7","getting-started.md":"Boo_V9xC","index.md":"BNS2TR1g","labs_index.md":"sAzXzfkI","labs_l1-first-agent.md":"BwU9yf-G","labs_l2-context.md":"BexGm8_s","labs_l2-multi-tool.md":"Bj3Mb-oj","labs_l3-verifier.md":"xilrGGap","labs_l3-whitelist-hook.md":"DJtbL66Y","labs_l4-agent-chain.md":"D89P8dwJ","labs_l4-multi-team.md":"DmSK8e2P","labs_l5-cicd.md":"Dz1Jl78z","labs_l5-observability.md":"BDpqVYjT","labs_l6-cost-optimization.md":"CabFK4GB","labs_l6-eval-harness.md":"CBwH6xOR","labs_l7-autoresearch.md":"BYlzPLYo","labs_l7-meta-agent.md":"iTswbOPg","modules_competitive-analysis.md":"BHMHacei","modules_curriculum.md":"D7UeKRfo","modules_debate.md":"DWctKMlA","modules_feynman.md":"DBw5sPBP","modules_field-manual.md":"hmt_NLf1","modules_m1-foundations.md":"DHFyTzWj","modules_m2-architecture.md":"Dp39xggp","modules_m3-safety.md":"CkKCTJdi","modules_m4-orchestration.md":"DFLcAKBv","modules_m5-production.md":"DTkLIrwQ","modules_m6-economics.md":"B6XI2-r7","modules_m7-advanced.md":"DoGMJ54l","modules_m8-capstone.md":"D1AXKCqv","modules_non-technical.md":"BnvuUCRo","modules_reference-stack.md":"D9FXitvn","modules_software-factory.md":"C5Yf8Zwe","modules_tool-reference.md":"B40mlgZJ","public_certificate_template.md":"Cg1kPB1b","resources.md":"DcUu1NrK","skills.md":"BX3RBeCK","troubleshooting.md":"B6difx2I","verify.md":"Cl5ZMWNd"}
|
||||||
|
|
|
||||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
|
|
@ -9,6 +9,7 @@
|
||||||
</div>
|
</div>
|
||||||
<div class="nav-links">
|
<div class="nav-links">
|
||||||
<a href="/modules/curriculum">Course</a>
|
<a href="/modules/curriculum">Course</a>
|
||||||
|
<a href="/free-preview">Preview</a>
|
||||||
<a href="/labs/index">Labs</a>
|
<a href="/labs/index">Labs</a>
|
||||||
<a href="/blog">Blog</a>
|
<a href="/blog">Blog</a>
|
||||||
<a href="/buy" class="nav-cta">Enroll — $97</a>
|
<a href="/buy" class="nav-cta">Enroll — $97</a>
|
||||||
|
|
@ -27,7 +28,8 @@
|
||||||
<p class="hero-sub">65 lessons, 13 labs, 20 skill kits. Build production-grade multi-agent systems that are secure, cost-optimized, and always-on.</p>
|
<p class="hero-sub">65 lessons, 13 labs, 20 skill kits. Build production-grade multi-agent systems that are secure, cost-optimized, and always-on.</p>
|
||||||
<div class="hero-actions">
|
<div class="hero-actions">
|
||||||
<a href="/buy" class="btn-p btn-primary">Enroll Now — $97</a>
|
<a href="/buy" class="btn-p btn-primary">Enroll Now — $97</a>
|
||||||
<a href="/modules/m1-foundations" class="btn-p btn-ghost">Start Learning Free</a>
|
<a href="/free-preview" class="btn-p btn-ghost">Free Preview</a>
|
||||||
|
<a href="/modules/m1-foundations" class="btn-p btn-ghost">View Curriculum</a>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="term-widget">
|
<div class="term-widget">
|
||||||
|
|
@ -109,6 +111,37 @@
|
||||||
</div>
|
</div>
|
||||||
</section>
|
</section>
|
||||||
|
|
||||||
|
<!-- Instructor -->
|
||||||
|
<section class="sec" id="instructor">
|
||||||
|
<div class="sec-label">Your Instructor</div>
|
||||||
|
<h2 class="sec-title">Built by an Engineer, For Engineers</h2>
|
||||||
|
<div class="instructor-grid">
|
||||||
|
<div class="instructor-card">
|
||||||
|
<div class="instructor-avatar">
|
||||||
|
<span class="material-symbols-outlined">terminal</span>
|
||||||
|
</div>
|
||||||
|
<div class="instructor-info">
|
||||||
|
<h3>Artale</h3>
|
||||||
|
<p class="instructor-role">Founder, FDSA Agency</p>
|
||||||
|
<p class="instructor-bio">I've spent the last two years building production multi-agent systems — from <strong>CEO Boards</strong> for strategic decision-making to <strong>Brand Monitor</strong> for always-on reputation tracking, to <strong>UI Agents</strong> that generate production Vue components. This course distills everything I learned shipping real agent systems, not toy demos.</p>
|
||||||
|
<p class="instructor-bio">Every pattern in this course — the 6-level security ladder, P-threads, cascade routing, the verifier pattern — came from building systems that had to work reliably in production. If it's in the course, it's been battle-tested.</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<!-- Email Capture -->
|
||||||
|
<section class="sec" id="newsletter">
|
||||||
|
<div class="sec-label">Stay Updated</div>
|
||||||
|
<h2 class="sec-title">Get Free Agent Engineering Resources</h2>
|
||||||
|
<p class="newsletter-sub">Weekly essays on multi-agent systems, security patterns, and production deployments. No spam, unsubscribe anytime.</p>
|
||||||
|
<form class="newsletter-form" action="https://gumroad.com" method="get" target="_blank">
|
||||||
|
<input type="email" class="newsletter-input" placeholder="you@example.com" required disabled value="Join waitlist — coming soon">
|
||||||
|
<button type="submit" class="btn-p btn-primary" disabled>Subscribe</button>
|
||||||
|
</form>
|
||||||
|
<p class="newsletter-note">Newsletter launching soon. Follow <a href="https://github.com/Artale" target="_blank">@Artale</a> for updates.</p>
|
||||||
|
</section>
|
||||||
|
|
||||||
<!-- Why FDSA -->
|
<!-- Why FDSA -->
|
||||||
<section class="sec" id="why-fdsa">
|
<section class="sec" id="why-fdsa">
|
||||||
<div class="sec-label">Compared To</div>
|
<div class="sec-label">Compared To</div>
|
||||||
|
|
@ -382,6 +415,29 @@ onMounted(() => {
|
||||||
.compare-cons .material-symbols-outlined{color:#ef4444}
|
.compare-cons .material-symbols-outlined{color:#ef4444}
|
||||||
.compare-cons{color:var(--vp-c-text-2)}
|
.compare-cons{color:var(--vp-c-text-2)}
|
||||||
|
|
||||||
|
/* Instructor */
|
||||||
|
.instructor-grid{max-width:720px;margin:0 auto}
|
||||||
|
.instructor-card{display:flex;gap:32px;align-items:flex-start;background:var(--vp-c-bg-soft);backdrop-filter:blur(12px);border:1px solid rgba(128,128,128,0.08);border-radius:16px;padding:36px}
|
||||||
|
.instructor-avatar{width:72px;height:72px;border-radius:50%;background:rgba(217,92,65,0.12);display:flex;align-items:center;justify-content:center;flex-shrink:0}
|
||||||
|
.instructor-avatar .material-symbols-outlined{font-size:32px;color:var(--vp-c-brand-1)}
|
||||||
|
.instructor-info{flex:1}
|
||||||
|
.instructor-info h3{font-size:20px;font-weight:700;color:var(--vp-c-text-1);margin-bottom:2px}
|
||||||
|
.instructor-role{font-size:13px;color:var(--vp-c-text-2);margin-bottom:16px}
|
||||||
|
.instructor-bio{font-size:14px;line-height:1.7;color:var(--vp-c-text-2);margin-bottom:12px}
|
||||||
|
.instructor-bio:last-child{margin-bottom:0}
|
||||||
|
.instructor-bio strong{color:var(--vp-c-text-1)}
|
||||||
|
|
||||||
|
/* Newsletter */
|
||||||
|
.newsletter-sub{text-align:center;color:var(--vp-c-text-2);font-size:15px;margin-bottom:24px;max-width:480px;margin-left:auto;margin-right:auto}
|
||||||
|
.newsletter-form{display:flex;gap:12px;max-width:440px;margin:0 auto;justify-content:center}
|
||||||
|
.newsletter-input{flex:1;padding:12px 16px;border-radius:8px;border:1px solid rgba(128,128,128,0.2);background:var(--vp-c-bg-soft);color:var(--vp-c-text-1);font-family:inherit;font-size:14px;outline:none;transition:border .2s}
|
||||||
|
.newsletter-input:focus{border-color:var(--vp-c-brand-1)}
|
||||||
|
.newsletter-input:disabled{opacity:0.5;cursor:not-allowed}
|
||||||
|
.newsletter-form .btn-p{padding:12px 24px;font-size:14px;border:none;cursor:pointer}
|
||||||
|
.newsletter-form .btn-p:disabled{opacity:0.5;cursor:not-allowed}
|
||||||
|
.newsletter-note{text-align:center;font-size:12px;color:var(--vp-c-text-3);margin-top:16px}
|
||||||
|
.newsletter-note a{color:var(--vp-c-brand-1)}
|
||||||
|
|
||||||
/* Pricing */
|
/* Pricing */
|
||||||
.pricing-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:16px;max-width:960px;margin:0 auto}
|
.pricing-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:16px;max-width:960px;margin:0 auto}
|
||||||
.price-card{background:var(--vp-c-bg-soft);backdrop-filter:blur(12px);border:1px solid rgba(128,128,128,0.08);border-radius:12px;padding:32px 24px;text-align:center;transition:all .3s;display:flex;flex-direction:column}
|
.price-card{background:var(--vp-c-bg-soft);backdrop-filter:blur(12px);border:1px solid rgba(128,128,128,0.08);border-radius:12px;padding:32px 24px;text-align:center;transition:all .3s;display:flex;flex-direction:column}
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,59 @@
|
||||||
|
# Free Preview: Lesson 1.1 — What Makes an Agent?
|
||||||
|
|
||||||
|
This is a sample lesson from **Module 1: Foundations** of the FDSA Agentic Engineering Course. Full course includes 65 lessons, 13 labs, and 20 skill kits.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Lesson 1.1: What Makes an Agent?
|
||||||
|
|
||||||
|
**Definition**: An AI agent = LLM + Tools + Loop. Without any one of these three, it's not an agent.
|
||||||
|
|
||||||
|
```
|
||||||
|
Agent = LLM (reasoning engine)
|
||||||
|
+ Tools (capability surface)
|
||||||
|
+ Loop (autonomous decision cycle)
|
||||||
|
```
|
||||||
|
|
||||||
|
- A single LLM call with no tools = chatbot
|
||||||
|
- An LLM with tools but no loop = augmented inference
|
||||||
|
- Tools + loop + LLM = agent (it can decide what to do next)
|
||||||
|
|
||||||
|
### The Three Components
|
||||||
|
|
||||||
|
**LLM** — The reasoning engine. Given context + available tools, it decides which tool to call and with what parameters. The LLM is NOT the agent — it's the brain of the agent. Different models have different reasoning capabilities, but the core function is the same: given a situation and available actions, decide what to do.
|
||||||
|
|
||||||
|
**Tools** — The capability surface. Functions the agent can call: read files, run commands, search the web, query databases, call APIs. Each tool has a name, description, and input schema. The tool surface defines what the agent CAN do — everything outside this surface is something the agent cannot do, no matter how smart the LLM is.
|
||||||
|
|
||||||
|
**Loop** — The autonomous decision cycle. Think (LLM decides) → Act (tool executes) → Observe (result comes back) → Repeat. The loop is what makes it autonomous. Without a loop, you have a single decision. With a loop, you have an agent that can work toward a goal across multiple steps.
|
||||||
|
|
||||||
|
### Why This Matters
|
||||||
|
|
||||||
|
This definition is not academic. Every production agent failure I've seen traces back to one of these three:
|
||||||
|
|
||||||
|
| Failure | Root Cause |
|
||||||
|
|---------|-----------|
|
||||||
|
| Agent does something unexpected | Loop didn't terminate correctly |
|
||||||
|
| Agent can't do the task | Tools are insufficient for the task |
|
||||||
|
| Agent makes bad decisions | LLM doesn't have enough context |
|
||||||
|
| Agent costs too much | Loop runs too many iterations |
|
||||||
|
|
||||||
|
If you understand these three components and how they interact, you can debug any agent system. If you don't, you're guessing.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## What You'll Learn in the Full Course
|
||||||
|
|
||||||
|
| Module | Topic | Lessons | Labs |
|
||||||
|
|--------|-------|---------|------|
|
||||||
|
| M1 | Foundations | 8 lessons | 1 lab |
|
||||||
|
| M2 | Agent Architecture | 7 lessons | 2 labs |
|
||||||
|
| M3 | Safety & Security | 7 lessons | 2 labs |
|
||||||
|
| M4 | Multi-Agent Orchestration | 11 lessons | 2 labs |
|
||||||
|
| M5 | Production Systems | 10 lessons | 2 labs |
|
||||||
|
| M6 | Model Economics | 7 lessons | 2 labs |
|
||||||
|
| M7 | Advanced Patterns | 8 lessons | 2 labs |
|
||||||
|
| M8 | Capstone Project | — | Build & deploy |
|
||||||
|
|
||||||
|
[Enroll Now — $97](/buy) · [View Full Curriculum](/modules/curriculum)
|
||||||
|
|
||||||
|
*Note: This preview shows approximately 30% of a single lesson. Full lessons include code examples, diagrams, quiz questions, and lab exercises.*
|
||||||
|
|
@ -165,6 +165,41 @@ Timer fires → Check for queued work → Wake agent → Agent executes → Agen
|
||||||
|
|
||||||
No continuous running. Agents wake, work, and sleep on a schedule.
|
No continuous running. Agents wake, work, and sleep on a schedule.
|
||||||
|
|
||||||
|
### Scheduling Strategies
|
||||||
|
|
||||||
|
| Strategy | Pattern | Use Case |
|
||||||
|
|----------|---------|----------|
|
||||||
|
| Fixed interval | Every N minutes/hours/days | Brand monitoring, price tracking |
|
||||||
|
| Event-triggered | Webhook → wake agent | CI/CD pipelines, PR reviews |
|
||||||
|
| Predictive | Learn optimal check times | Traffic monitoring, anomaly detection |
|
||||||
|
| Cascade | Agent A finishes → Agent B starts | Data pipeline, ETL workflows |
|
||||||
|
|
||||||
|
### OpenClaw: The Always-On Employee
|
||||||
|
|
||||||
|
OpenClaw is a daemon-style agent that runs as a background service:
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
# openclaw-config.yaml
|
||||||
|
agent:
|
||||||
|
name: "brand-monitor"
|
||||||
|
heartbeat: 300 # every 5 minutes
|
||||||
|
max_sessions: 1
|
||||||
|
wake_command: "claude -p 'Check brand mentions since last run'"
|
||||||
|
sleep_command: "pkill -f 'claude.*brand-monitor'"
|
||||||
|
log_path: "/var/log/openclaw/brand-monitor.log"
|
||||||
|
```
|
||||||
|
|
||||||
|
It starts, checks for work, executes if needed, then goes back to sleep. No continuous billing, no context window overflow, no runaway loops. This is the pattern for production always-on agents.
|
||||||
|
|
||||||
|
### When NOT to Use Always-On
|
||||||
|
|
||||||
|
Always-on adds complexity. Before building one, verify you actually need it:
|
||||||
|
- **Batch jobs** → Cron is simpler and cheaper
|
||||||
|
- **Real-time** → Event-driven architectures (webhooks, Kafka) outperform polling agents
|
||||||
|
- **One-off** → Just run the agent once
|
||||||
|
|
||||||
|
Always-on makes sense when you need adaptive scheduling, dynamic task generation, or autonomous decision-making about what to work on next.
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## Lab 7.7: Build an Autoresearch Loop
|
## Lab 7.7: Build an Autoresearch Loop
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue