[{"data":1,"prerenderedAt":1049},["ShallowReactive",2],{"navigation_docs":3,"-customization":139,"-customization-surround":1044},[4,8,12,16,20,24,28,32,59,63,117,121,135],{"title":5,"path":6,"stem":7},"Introduction","\u002Fintroduction","1.introduction",{"title":9,"path":10,"stem":11},"Memory","\u002Fmemory","10.memory",{"title":13,"path":14,"stem":15},"Customization","\u002Fcustomization","11.customization",{"title":17,"path":18,"stem":19},"Deployment","\u002Fdeployment","12.deployment",{"title":21,"path":22,"stem":23},"Reference","\u002Freference","13.reference",{"title":25,"path":26,"stem":27},"Quickstart","\u002Fquickstart","2.quickstart",{"title":29,"path":30,"stem":31},"Installation","\u002Finstallation","3.installation",{"title":33,"icon":34,"path":35,"stem":36,"children":37,"page":58},"Connectors","i-lucide-cable","\u002Fconnectors","4.connectors",[38,42,46,50,54],{"title":39,"path":40,"stem":41},"Telegram","\u002Fconnectors\u002Ftelegram","4.connectors\u002F1.telegram",{"title":43,"path":44,"stem":45},"Slack","\u002Fconnectors\u002Fslack","4.connectors\u002F2.slack",{"title":47,"path":48,"stem":49},"Email","\u002Fconnectors\u002Femail","4.connectors\u002F3.email",{"title":51,"path":52,"stem":53},"API","\u002Fconnectors\u002Fapi","4.connectors\u002F4.api",{"title":55,"path":56,"stem":57},"Terminal","\u002Fconnectors\u002Fterminal","4.connectors\u002F5.terminal",false,{"title":60,"path":61,"stem":62},"Attachments","\u002Fattachments","5.attachments",{"title":64,"icon":65,"path":66,"stem":67,"children":68,"page":58},"Tools","i-lucide-wrench","\u002Ftools","6.tools",[69,73,77,81,85,89,93,97,101,105,109,113],{"title":70,"path":71,"stem":72},"File Manager","\u002Ftools\u002Ffile-manager","6.tools\u002F1.file-manager",{"title":74,"path":75,"stem":76},"Text-to-Speech","\u002Ftools\u002Ftext-to-speech","6.tools\u002F10.text-to-speech",{"title":78,"path":79,"stem":80},"Confirmations","\u002Ftools\u002Fconfirmations","6.tools\u002F11.confirmations",{"title":82,"path":83,"stem":84},"Adding Custom Tools","\u002Ftools\u002Fadding-custom-tools","6.tools\u002F12.adding-custom-tools",{"title":86,"path":87,"stem":88},"Image Manager","\u002Ftools\u002Fimage-manager","6.tools\u002F2.image-manager",{"title":90,"path":91,"stem":92},"Web Request","\u002Ftools\u002Fweb-request","6.tools\u002F3.web-request",{"title":94,"path":95,"stem":96},"Reminders","\u002Ftools\u002Freminders","6.tools\u002F4.reminders",{"title":98,"path":99,"stem":100},"Heartbeats","\u002Ftools\u002Fheartbeats","6.tools\u002F5.heartbeats",{"title":102,"path":103,"stem":104},"Email Manager","\u002Ftools\u002Femail-manager","6.tools\u002F6.email-manager",{"title":106,"path":107,"stem":108},"Calendar","\u002Ftools\u002Fcalendar","6.tools\u002F7.calendar",{"title":110,"path":111,"stem":112},"Read Database","\u002Ftools\u002Fread-database","6.tools\u002F8.read-database",{"title":114,"path":115,"stem":116},"Headless Browser","\u002Ftools\u002Fbrowser","6.tools\u002F9.browser",{"title":118,"path":119,"stem":120},"Tinker","\u002Ftinker","7.tinker",{"title":122,"icon":123,"path":124,"stem":125,"children":126,"page":58},"Skills","i-lucide-sparkles","\u002Fskills","8.skills",[127,131],{"title":128,"path":129,"stem":130},"Overview","\u002Fskills\u002Foverview","8.skills\u002F1.overview",{"title":132,"path":133,"stem":134},"Adding Custom Skills","\u002Fskills\u002Fadding-custom-skills","8.skills\u002F2.adding-custom-skills",{"title":136,"path":137,"stem":138},"Personas","\u002Fpersonas","9.personas",{"id":140,"title":13,"body":141,"description":1038,"extension":1039,"links":1040,"meta":1041,"navigation":676,"path":14,"seo":1042,"stem":15,"__hash__":1043},"docs\u002F11.customization.md",{"type":142,"value":143,"toc":1017},"minimark",[144,148,152,164,168,181,197,204,209,216,223,247,250,271,275,282,285,303,306,310,316,338,345,349,352,360,366,369,373,380,387,398,402,405,414,421,424,511,518,521,525,528,537,548,559,563,571,580,591,595,602,613,616,634,637,644,659,730,749,753,765,868,872,879,911,914,918,927,973,976,980,1010,1013],[145,146,5],"h2",{"id":147},"introduction",[149,150,151],"p",{},"This page is your toolbox for bending Laraclaw without writing tools. We'll cover picking a model, controlling how often the agent can be pinged, logging every prompt for an audit trail, allowlisting disks, wiring deterministic shortcuts, and listening to agent events.",[149,153,154,155,159,160,163],{},"If you're after a custom ",[156,157,158],"em",{},"tool"," (a new capability for the agent to call), head over to ",[161,162,82],"a",{"href":83},".",[145,165,167],{"id":166},"choosing-an-ai-provider","Choosing an AI Provider",[149,169,170,171,180],{},"Laraclaw is provider-agnostic. We delegate model selection to ",[161,172,176],{"href":173,"rel":174},"https:\u002F\u002Fgithub.com\u002Flaravel\u002Fai",[175],"nofollow",[177,178,179],"code",{},"laravel\u002Fai",", which means whichever driver you have credentials for, you can use:",[182,183,188],"pre",{"className":184,"code":185,"language":186,"meta":187,"style":187},"language-env shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","AI_DEFAULT=anthropic\n","env","",[177,189,190],{"__ignoreMap":187},[191,192,195],"span",{"class":193,"line":194},"line",1,[191,196,185],{},[149,198,199,200,203],{},"The setup wizard handles this for you — ",[177,201,202],{},"php artisan laraclaw:setup-agent"," asks which provider you want and prompts for the API key. Pretty simple, right?",[205,206,208],"h3",{"id":207},"prompt-caching-anthropic-and-openai","Prompt Caching (Anthropic and OpenAI)",[149,210,211,212,215],{},"System prompts in Laraclaw are not small: the default prompt, the persona overlay, the tool definitions, and the current time all get sent on ",[156,213,214],{},"every"," turn. That adds up fast.",[149,217,218,219,222],{},"The good news is the ",[177,220,221],{},"ChatBotAgent"," opts into native prompt caching when the provider supports it:",[224,225,226,238],"ul",{},[227,228,229,233,234,237],"li",{},[230,231,232],"strong",{},"Anthropic"," — sends ",[177,235,236],{},"cache_control: { type: 'ephemeral' }"," on the system prompt. Repeat calls within the cache TTL pay roughly 10% of the tokens for the cached portion.",[227,239,240,233,243,246],{},[230,241,242],{},"OpenAI",[177,244,245],{},"prompt_cache_key: 'laraclaw-chatbot'"," so OpenAI routes repeat calls to the same cache shard.",[149,248,249],{},"There's nothing to configure. If you switch to a provider that doesn't support caching, it falls back to a normal call path — no error, just full-price tokens.",[251,252,253],"blockquote",{},[149,254,255,258,259,262,263,266,267,270],{},[191,256,257],{},"!TIP","\nIf you've added a custom agent and want the same caching behavior, implement ",[177,260,261],{},"Laravel\\Ai\\Contracts\\HasProviderOptions"," and return the right options per ",[177,264,265],{},"Lab"," enum. Look at ",[177,268,269],{},"Laraclaw\\Agents\\ChatBotAgent::providerOptions()"," for a working example.",[205,272,274],{"id":273},"choosing-a-model","Choosing a Model",[149,276,277,278,281],{},"Tool-calling is the dimension that matters most. Every connector relies on the model deciding ",[156,279,280],{},"when"," to call a tool, and weaker models will either skip tools that should fire, hallucinate parameters, or get stuck in loops.",[149,283,284],{},"As a baseline, the most reliable picks at the time of writing are:",[224,286,287,292,297],{},[227,288,289,291],{},[230,290,232],{}," Claude Sonnet (latest) — strongest tool-calling, plus prompt caching cuts repeat-call cost.",[227,293,294,296],{},[230,295,242],{}," GPT-4-class models with function calling enabled.",[227,298,299,302],{},[230,300,301],{},"Local models"," via Ollama or similar — fine for the terminal connector and quick experiments, but expect more failed tool calls.",[149,304,305],{},"The smaller and cheaper the model, the more often you'll see it ignore the system prompt or fumble a tool's JSON schema. If a connector feels flaky, switch to a larger model before blaming the package.",[205,307,309],{"id":308},"cost","Cost",[149,311,312,313,315],{},"Laraclaw doesn't bill anything itself — your AI cost is whatever your ",[177,314,179],{}," provider charges, multiplied by token volume. Two things drive that volume:",[224,317,318,324],{},[227,319,320,323],{},[230,321,322],{},"System prompt size."," The base prompt + persona overlay + tool definitions are sent on every turn. With prompt caching enabled (Anthropic and OpenAI), the cached portion is nearly free on repeat calls; other providers pay full price every time.",[227,325,326,329,330,333,334,337],{},[230,327,328],{},"Memory retrieval."," When the agent calls ",[177,331,332],{},"MemoryManager",", retrieved chunks are appended to the context. The default ",[177,335,336],{},"LARACLAW_MEMORY_MAX_RESULTS=5"," is conservative; raising it raises tokens per call linearly.",[149,339,340,341,344],{},"There's no usage telemetry built in. If you need a number, enable ",[177,342,343],{},"LARACLAW_LOG_AGENT_REQUESTS"," and read token counts off your provider's dashboard.",[145,346,348],{"id":347},"the-agent-folder","The Agent Folder",[149,350,351],{},"Everything that shapes how the agent thinks lives in one folder at your project root, written in Markdown rather than code:",[182,353,358],{"className":354,"code":356,"language":357},[355],"language-text","laraclaw\u002F\n  instructions.md        # base system prompt, always on\n  personas\u002F\n    default.md           # voice and tone, applied automatically\n    ops.md\n  skills\u002F\n    greeting\u002F\n      SKILL.md           # loaded only when relevant\n    release-notes\u002F\n      SKILL.md\n      reference.md       # companion files ride along\n","text",[177,359,356],{"__ignoreMap":187},[149,361,362,365],{},[177,363,364],{},"vendor:publish --tag=laraclaw"," writes the starting point. Every file is optional: delete the lot and the agent falls back to the prompt baked into the package.",[149,367,368],{},"Because it is all plain text at a known path, a change to your agent's behavior shows up as a reviewable diff instead of a config value nobody remembers setting.",[145,370,372],{"id":371},"customizing-the-system-prompt","Customizing the System Prompt",[149,374,375,376,379],{},"The base system prompt lives at ",[177,377,378],{},"laraclaw\u002Finstructions.md",". Edit it to change the agent's default behavior across all conversations.",[149,381,382,383,386],{},"Laraclaw appends the current date, timezone, and the sender's name for you, so there is no need to mention them in the file. To keep the prompt somewhere else, point ",[177,384,385],{},"LARACLAW_INSTRUCTIONS_PATH"," at it.",[251,388,389],{},[149,390,391,393,394,397],{},[191,392,257],{},"\nFor per-conversation tweaks, use ",[161,395,396],{"href":137},"personas"," instead. They get appended to the base prompt without overwriting it — much more flexible than editing the default.",[145,399,401],{"id":400},"rate-limiting","Rate Limiting",[149,403,404],{},"You probably don't want a runaway script (or a chatty group) flooding your AI provider with hundreds of calls. Each connector route enforces a rate limit so no single conversation can do that:",[182,406,408],{"className":184,"code":407,"language":186,"meta":187,"style":187},"LARACLAW_WEBHOOK_RATE_LIMIT=20\n",[177,409,410],{"__ignoreMap":187},[191,411,412],{"class":193,"line":194},[191,413,407],{},[149,415,416,417,420],{},"The value is the number of inbound messages allowed per minute. The default is 20. Set it to ",[177,418,419],{},"0"," to disable rate limiting entirely.",[149,422,423],{},"Limits are scoped per connector and keyed differently for each:",[425,426,427,443],"table",{},[428,429,430],"thead",{},[431,432,433,437,440],"tr",{},[434,435,436],"th",{},"Connector",[434,438,439],{},"Limiter name",[434,441,442],{},"Key",[444,445,446,462,477,492,502],"tbody",{},[431,447,448,451,456],{},[449,450,43],"td",{},[449,452,453],{},[177,454,455],{},"laraclaw-slack",[449,457,458,461],{},[177,459,460],{},"slack:{channelId}:{userId}"," — one bucket per Slack user per channel",[431,463,464,466,471],{},[449,465,39],{},[449,467,468],{},[177,469,470],{},"laraclaw-telegram",[449,472,473,476],{},[177,474,475],{},"telegram:{chatId}"," — one bucket per chat (DM or group)",[431,478,479,481,486],{},[449,480,51],{},[449,482,483],{},[177,484,485],{},"laraclaw-api",[449,487,488,491],{},[177,489,490],{},"api:{tokenAccountId}"," — one bucket per authenticated token",[431,493,494,496,499],{},[449,495,47],{},[449,497,498],{},"(none)",[449,500,501],{},"IMAP polling, no HTTP route to throttle",[431,503,504,506,508],{},[449,505,55],{},[449,507,498],{},[449,509,510],{},"local CLI, no HTTP route to throttle",[149,512,513,514,517],{},"The backend is Laravel's standard ",[177,515,516],{},"Illuminate\\Support\\Facades\\RateLimiter",", which uses your default cache store. If that store is Redis or another shared backend, the limit is enforced consistently across multiple web nodes. If it's the file or array driver, each node has its own bucket.",[149,519,520],{},"Email and the terminal have no rate limit because there is no HTTP route for the throttle middleware to attach to.",[145,522,524],{"id":523},"logging-agent-requests","Logging Agent Requests",[149,526,527],{},"Want to see exactly what the agent is being asked and what it's saying back? Enable request logging:",[182,529,531],{"className":184,"code":530,"language":186,"meta":187,"style":187},"LARACLAW_LOG_AGENT_REQUESTS=true\n",[177,532,533],{"__ignoreMap":187},[191,534,535],{"class":193,"line":194},[191,536,530],{},[149,538,539,540,543,544,547],{},"The ",[177,541,542],{},"LogAgentRequest"," listener subscribes to ",[177,545,546],{},"AgentPrompted"," and writes a structured log entry with the prompt, response, and conversation context to the default Laravel log channel.",[251,549,550],{},[149,551,552,555,556,558],{},[191,553,554],{},"!NOTE","\nEnable this when you're using ",[161,557,118],{"href":119},". It's the closest thing to an audit trail of what the agent has been asked to do.",[145,560,562],{"id":561},"allowed-disks","Allowed Disks",[149,564,539,565,567,568,570],{},[161,566,70],{"href":71}," and ",[161,569,86],{"href":87}," tools can only see disks listed in:",[182,572,574],{"className":184,"code":573,"language":186,"meta":187,"style":187},"LARACLAW_ALLOWED_DISKS=local,public,s3\n",[177,575,576],{"__ignoreMap":187},[191,577,578],{"class":193,"line":194},[191,579,573],{},[149,581,582,583,586,587,590],{},"Disks not in the list are invisible to the agent. The default is ",[177,584,585],{},"local",". Set this carefully — anything in the list is fully readable and writable by any tool that takes a ",[177,588,589],{},"disk"," parameter.",[145,592,594],{"id":593},"custom-commands","Custom Commands",[149,596,597,598,601],{},"Sometimes you don't want the model involved at all. You want a fast, predictable, ",[156,599,600],{},"free"," shortcut that just runs and is done. That's what commands are for.",[149,603,604,605,608,609,612],{},"Laraclaw runs every inbound message through a ",[177,606,607],{},"CommandRegistry"," before passing it to the agent. If a command's trigger matches the message text exactly, the command handles the message and the agent never sees it. The built-in ",[177,610,611],{},"!new"," command resets the current conversation — that's the canonical example.",[149,614,615],{},"Commands are great for:",[224,617,618,625,628,631],{},[227,619,620,621,624],{},"Switching settings (\"",[177,622,623],{},"!verbose","\")",[227,626,627],{},"Fetching cached data",[227,629,630],{},"Dumping debug info",[227,632,633],{},"Anything you don't want a model second-guessing",[149,635,636],{},"Let's see how to write one.",[205,638,539,640,643],{"id":639},"the-command-interface",[177,641,642],{},"Command"," Interface",[149,645,646,647,650,651,654,655,658],{},"Two methods. ",[177,648,649],{},"trigger()"," returns the exact text that activates the command. ",[177,652,653],{},"handle()"," does the work and returns either ",[177,656,657],{},"null"," to halt processing entirely, or a string to continue processing that string through the agent loop.",[182,660,664],{"className":661,"code":662,"language":663,"meta":187,"style":187},"language-php shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","namespace Laraclaw\\Commands;\n\nuse Laraclaw\\DTOs\\IncomingMessage;\nuse Laraclaw\\Models\\Thread;\n\ninterface Command\n{\n    public function trigger(): string;\n\n    public function handle(IncomingMessage $message, Thread $thread): ?string;\n}\n","php",[177,665,666,671,678,684,690,695,701,707,713,718,724],{"__ignoreMap":187},[191,667,668],{"class":193,"line":194},[191,669,670],{},"namespace Laraclaw\\Commands;\n",[191,672,674],{"class":193,"line":673},2,[191,675,677],{"emptyLinePlaceholder":676},true,"\n",[191,679,681],{"class":193,"line":680},3,[191,682,683],{},"use Laraclaw\\DTOs\\IncomingMessage;\n",[191,685,687],{"class":193,"line":686},4,[191,688,689],{},"use Laraclaw\\Models\\Thread;\n",[191,691,693],{"class":193,"line":692},5,[191,694,677],{"emptyLinePlaceholder":676},[191,696,698],{"class":193,"line":697},6,[191,699,700],{},"interface Command\n",[191,702,704],{"class":193,"line":703},7,[191,705,706],{},"{\n",[191,708,710],{"class":193,"line":709},8,[191,711,712],{},"    public function trigger(): string;\n",[191,714,716],{"class":193,"line":715},9,[191,717,677],{"emptyLinePlaceholder":676},[191,719,721],{"class":193,"line":720},10,[191,722,723],{},"    public function handle(IncomingMessage $message, Thread $thread): ?string;\n",[191,725,727],{"class":193,"line":726},11,[191,728,729],{},"}\n",[149,731,732,733,735,736,738,739,738,742,744,745,748],{},"Triggers are matched against the trimmed, lowercased message text. ",[177,734,611],{}," matches ",[177,737,611],{},", ",[177,740,741],{},"!New",[177,743,611],{}," — but not ",[177,746,747],{},"!new yesterday",". Commands are exact-match only; if you need parameters, use a tool or a skill instead.",[205,750,752],{"id":751},"a-worked-example","A Worked Example",[149,754,755,756,758,759,761,762,764],{},"Here's the built-in ",[177,757,611],{}," command. It clears the ",[177,760,179],{}," conversation ID off the thread, posts a confirmation back through whichever connector the message came in on, and returns ",[177,763,657],{}," to stop the message from reaching the agent:",[182,766,768],{"className":661,"code":767,"language":663,"meta":187,"style":187},"namespace Laraclaw\\Commands;\n\nuse Laraclaw\\DTOs\\IncomingMessage;\nuse Laraclaw\\Models\\Thread;\n\nclass NewConversation implements Command\n{\n    public function trigger(): string\n    {\n        return '!new';\n    }\n\n    public function handle(IncomingMessage $message, Thread $thread): ?string\n    {\n        $thread->update(['conversation_id' => null]);\n        $thread->connector()->reply($thread, '✅ Conversation reset.');\n\n        return null;\n    }\n}\n",[177,769,770,774,778,782,786,790,795,799,804,809,814,819,824,830,835,841,847,852,858,863],{"__ignoreMap":187},[191,771,772],{"class":193,"line":194},[191,773,670],{},[191,775,776],{"class":193,"line":673},[191,777,677],{"emptyLinePlaceholder":676},[191,779,780],{"class":193,"line":680},[191,781,683],{},[191,783,784],{"class":193,"line":686},[191,785,689],{},[191,787,788],{"class":193,"line":692},[191,789,677],{"emptyLinePlaceholder":676},[191,791,792],{"class":193,"line":697},[191,793,794],{},"class NewConversation implements Command\n",[191,796,797],{"class":193,"line":703},[191,798,706],{},[191,800,801],{"class":193,"line":709},[191,802,803],{},"    public function trigger(): string\n",[191,805,806],{"class":193,"line":715},[191,807,808],{},"    {\n",[191,810,811],{"class":193,"line":720},[191,812,813],{},"        return '!new';\n",[191,815,816],{"class":193,"line":726},[191,817,818],{},"    }\n",[191,820,822],{"class":193,"line":821},12,[191,823,677],{"emptyLinePlaceholder":676},[191,825,827],{"class":193,"line":826},13,[191,828,829],{},"    public function handle(IncomingMessage $message, Thread $thread): ?string\n",[191,831,833],{"class":193,"line":832},14,[191,834,808],{},[191,836,838],{"class":193,"line":837},15,[191,839,840],{},"        $thread->update(['conversation_id' => null]);\n",[191,842,844],{"class":193,"line":843},16,[191,845,846],{},"        $thread->connector()->reply($thread, '✅ Conversation reset.');\n",[191,848,850],{"class":193,"line":849},17,[191,851,677],{"emptyLinePlaceholder":676},[191,853,855],{"class":193,"line":854},18,[191,856,857],{},"        return null;\n",[191,859,861],{"class":193,"line":860},19,[191,862,818],{},[191,864,866],{"class":193,"line":865},20,[191,867,729],{},[205,869,871],{"id":870},"registering-a-command","Registering a Command",[149,873,874,875,878],{},"From a service provider's ",[177,876,877],{},"boot()"," method:",[182,880,882],{"className":661,"code":881,"language":663,"meta":187,"style":187},"use Laraclaw\\Commands\\CommandRegistry;\n\npublic function boot(): void\n{\n    $this->app->make(CommandRegistry::class)->register(new MyCustomCommand());\n}\n",[177,883,884,889,893,898,902,907],{"__ignoreMap":187},[191,885,886],{"class":193,"line":194},[191,887,888],{},"use Laraclaw\\Commands\\CommandRegistry;\n",[191,890,891],{"class":193,"line":673},[191,892,677],{"emptyLinePlaceholder":676},[191,894,895],{"class":193,"line":680},[191,896,897],{},"public function boot(): void\n",[191,899,900],{"class":193,"line":686},[191,901,706],{},[191,903,904],{"class":193,"line":692},[191,905,906],{},"    $this->app->make(CommandRegistry::class)->register(new MyCustomCommand());\n",[191,908,909],{"class":193,"line":697},[191,910,729],{},[149,912,913],{},"The registry is a singleton, indexed by lowercased trigger. Registering two commands with the same trigger silently replaces the first.",[145,915,917],{"id":916},"hooking-into-agent-events","Hooking Into Agent Events",[149,919,920,921,923,924,926],{},"Laraclaw uses the ",[177,922,546],{}," event from ",[177,925,179],{}," for its memory and logging listeners. You can subscribe your own listener and run code on every agent turn:",[182,928,930],{"className":661,"code":929,"language":663,"meta":187,"style":187},"use Illuminate\\Support\\Facades\\Event;\nuse Laravel\\Ai\\Events\\AgentPrompted;\n\npublic function boot(): void\n{\n    Event::listen(AgentPrompted::class, function (AgentPrompted $event) {\n        \u002F\u002F $event->prompt, $event->response, $event->conversationId\n    });\n}\n",[177,931,932,937,942,946,950,954,959,964,969],{"__ignoreMap":187},[191,933,934],{"class":193,"line":194},[191,935,936],{},"use Illuminate\\Support\\Facades\\Event;\n",[191,938,939],{"class":193,"line":673},[191,940,941],{},"use Laravel\\Ai\\Events\\AgentPrompted;\n",[191,943,944],{"class":193,"line":680},[191,945,677],{"emptyLinePlaceholder":676},[191,947,948],{"class":193,"line":686},[191,949,897],{},[191,951,952],{"class":193,"line":692},[191,953,706],{},[191,955,956],{"class":193,"line":697},[191,957,958],{},"    Event::listen(AgentPrompted::class, function (AgentPrompted $event) {\n",[191,960,961],{"class":193,"line":703},[191,962,963],{},"        \u002F\u002F $event->prompt, $event->response, $event->conversationId\n",[191,965,966],{"class":193,"line":709},[191,967,968],{},"    });\n",[191,970,971],{"class":193,"line":715},[191,972,729],{},[149,974,975],{},"Use it for analytics, custom audit logging, alerting, or piping interesting prompts into a tool of your choice.",[145,977,979],{"id":978},"whats-next","What's Next",[224,981,982,987,996,1001],{},[227,983,984,986],{},[161,985,82],{"href":83}," — give the agent a brand-new capability.",[227,988,989,991,992,995],{},[161,990,136],{"href":137}," — change ",[156,993,994],{},"how"," the agent talks, per-thread.",[227,997,998,1000],{},[161,999,122],{"href":129}," — give the agent reusable procedures.",[227,1002,1003,1005,1006,1009],{},[161,1004,21],{"href":22}," — every ",[177,1007,1008],{},"LARACLAW_*"," variable, in one table.",[149,1011,1012],{},"Until next time!",[1014,1015,1016],"style",{},"html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":187,"searchDepth":673,"depth":673,"links":1018},[1019,1020,1025,1026,1027,1028,1029,1030,1036,1037],{"id":147,"depth":673,"text":5},{"id":166,"depth":673,"text":167,"children":1021},[1022,1023,1024],{"id":207,"depth":680,"text":208},{"id":273,"depth":680,"text":274},{"id":308,"depth":680,"text":309},{"id":347,"depth":673,"text":348},{"id":371,"depth":673,"text":372},{"id":400,"depth":673,"text":401},{"id":523,"depth":673,"text":524},{"id":561,"depth":673,"text":562},{"id":593,"depth":673,"text":594,"children":1031},[1032,1034,1035],{"id":639,"depth":680,"text":1033},"The Command Interface",{"id":751,"depth":680,"text":752},{"id":870,"depth":680,"text":871},{"id":916,"depth":673,"text":917},{"id":978,"depth":673,"text":979},"Bend Laraclaw to your needs without writing a tool — system prompts, rate limiting, logging, custom commands, and event hooks.","md",null,{},{"title":13,"description":1038},"6u8n3lvHyQAPu7Cu0zTP5bC9BkYYxTQS4ybr0JrLgNQ",[1045,1047],{"title":9,"path":10,"stem":11,"description":1046,"children":-1},"Give the agent persistent memory of past conversations and attached documents using RAG.",{"title":17,"path":18,"stem":19,"description":1048,"children":-1},"What you need running in production for Laraclaw to work end-to-end.",1786661906119]