{
"cells": [
{
"cell_type": "markdown",
"id": "7f3ada9f",
"metadata": {
"papermill": {
"duration": 0.0,
"end_time": "2026-05-28T03:42:57.531445+00:00",
"exception": false,
"start_time": "2026-05-28T03:42:57.531445+00:00",
"status": "completed"
},
"tags": []
},
"source": [
"# 35 · Agent Workflow Memory (AWM) — mine reusable recipes from past traces\n",
"\n",
"> **TL;DR.** After every solved task, extract a high-level **workflow recipe** (3-6 generalisable steps). Store recipes in a vector-indexed library. Future tasks retrieve the most-similar recipe and follow it.\n",
"\n",
"| Property | Value |\n",
"|---|---|\n",
"| Origin | Wang et al., *Agent Workflow Memory* (2024). [arXiv:2409.07429](https://arxiv.org/abs/2409.07429) |\n",
"| Storage | Vector-indexed `arch.workflows` list |\n",
"| Cost | 1 retrieve + 1 answer + 1 extract per task = ~3 calls |\n",
"| Sister to | [Voyager (nb 29)](./29_voyager.ipynb) — skills (code) vs workflows (recipes) |"
]
},
{
"cell_type": "markdown",
"id": "8812cd0c",
"metadata": {
"papermill": {
"duration": 0.015846,
"end_time": "2026-05-28T03:42:57.547291+00:00",
"exception": false,
"start_time": "2026-05-28T03:42:57.531445+00:00",
"status": "completed"
},
"tags": []
},
"source": [
"## 2 · Architecture\n",
"\n",
"```mermaid\n",
"flowchart LR\n",
" A([task]) --> R[RETRIEVE most-similar workflow]\n",
" R --> AN[ANSWER
prompt prepends recipe if found]\n",
" AN --> EX[EXTRACT new workflow
generalised steps]\n",
" EX --> Z([answer])\n",
"\n",
" L[(workflow library
vector-indexed)]\n",
" R <-.search.-> L\n",
" EX -.add.-> L\n",
"\n",
" style R fill:#fff3e0,stroke:#f57c00\n",
" style EX fill:#fce4ec,stroke:#c2185b\n",
" style L fill:#f3e5f5,stroke:#7b1fa2\n",
"```"
]
},
{
"cell_type": "markdown",
"id": "7c538004",
"metadata": {
"papermill": {
"duration": 0.0,
"end_time": "2026-05-28T03:42:57.547291+00:00",
"exception": false,
"start_time": "2026-05-28T03:42:57.547291+00:00",
"status": "completed"
},
"tags": []
},
"source": [
"## 3 · Theory\n",
"\n",
"Voyager (nb 29) stores reusable **code** (skills). AWM stores reusable **strategy** (workflows). Skills are concrete; workflows are abstract. For tasks where a small Python function suffices, use Voyager. For tasks that share *structure* but differ in entities (e.g., \"summarise then categorise\" applies to news articles AND emails), use AWM.\n",
"\n",
"Demo: 3 sequential tasks of similar structure (\"summarise X then categorise it\"). Task 1 extracts a workflow; tasks 2 and 3 retrieve and follow it."
]
},
{
"cell_type": "markdown",
"id": "1a0a7e9c",
"metadata": {
"papermill": {
"duration": 0.0,
"end_time": "2026-05-28T03:42:57.562936+00:00",
"exception": false,
"start_time": "2026-05-28T03:42:57.562936+00:00",
"status": "completed"
},
"tags": []
},
"source": [
"## 4 · Setup"
]
},
{
"cell_type": "code",
"execution_count": 1,
"id": "a9580a4a",
"metadata": {
"execution": {
"iopub.execute_input": "2026-05-28T03:42:57.578577Z",
"iopub.status.busy": "2026-05-28T03:42:57.578577Z",
"iopub.status.idle": "2026-05-28T03:43:00.562325Z",
"shell.execute_reply": "2026-05-28T03:43:00.562325Z"
},
"papermill": {
"duration": 2.989123,
"end_time": "2026-05-28T03:43:00.562325+00:00",
"exception": false,
"start_time": "2026-05-28T03:42:57.573202+00:00",
"status": "completed"
},
"tags": []
},
"outputs": [
{
"data": {
"text/html": [
"
LLM: meta-llama/Llama-3.3-70B-Instruct ────────────────────────────────────────────────────────────────────────────\n", "\n" ], "text/plain": [ "\u001b[1;36mLLM: meta-llama/Llama-\u001b[0m\u001b[1;36m3.3\u001b[0m\u001b[1;36m-70B-Instruct\u001b[0m \u001b[92m────────────────────────────────────────────────────────────────────────────\u001b[0m\n" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "from agentic_architectures import get_llm, enable_langsmith, settings\n", "from agentic_architectures.architectures import AgentWorkflowMemory\n", "from agentic_architectures.ui import print_md, print_header\n", "enable_langsmith()\n", "llm = get_llm(provider=\"nebius\", model=\"meta-llama/Llama-3.3-70B-Instruct\", temperature=0.2)\n", "print_header(f\"LLM: {llm.model}\")" ] }, { "cell_type": "markdown", "id": "b7805dba", "metadata": { "papermill": { "duration": 0.0, "end_time": "2026-05-28T03:43:00.562325+00:00", "exception": false, "start_time": "2026-05-28T03:43:00.562325+00:00", "status": "completed" }, "tags": [] }, "source": [ "## 7 · Build the graph" ] }, { "cell_type": "code", "execution_count": 2, "id": "ef60039e", "metadata": { "execution": { "iopub.execute_input": "2026-05-28T03:43:00.572882Z", "iopub.status.busy": "2026-05-28T03:43:00.572882Z", "iopub.status.idle": "2026-05-28T03:43:03.350394Z", "shell.execute_reply": "2026-05-28T03:43:03.350394Z" }, "papermill": { "duration": 2.788069, "end_time": "2026-05-28T03:43:03.350394+00:00", "exception": false, "start_time": "2026-05-28T03:43:00.562325+00:00", "status": "completed" }, "tags": [] }, "outputs": [ { "data": { "image/png": "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", "text/plain": [ "