Skip to main content

Memory and Reflection

Memory lets an agent carry useful information across runs. Reflection is the small step that decides what is worth saving after a run finishes.

This tutorial builds a simple loop:

  1. Query relevant past lessons.
  2. Answer the current goal using those lessons.
  3. Reflect on the run.
  4. Store one new lesson.
Memory and Reflection tutorial overview

Full source: ../../../tutorials/memory-reflection.as

1. The Complete Program​

Create memory-reflection.as, or open the repository copy at tutorials/memory-reflection.as:

import llm Qwen from "ollama://localhost:11434/qwen3.6"
import memory Lessons from "file://./.agentscript/tutorial-lessons.jsonl"

main agent MemoryReflection {
model Qwen
role "Reflective assistant"
description "Use relevant lessons, answer a goal, then store one new lesson."

main func(input {
goal: string
}) {
past = Lessons.query({
kind: "lesson",
text: input.goal,
limit: 5
})

result = answer(input.goal, past)
lesson = reflect(input.goal, result, past)

Lessons.add({
kind: "lesson",
text: lesson.insight,
goal: input.goal,
ok: result.ok
})

{
result: result,
learned: lesson.insight
}
}

func answer(goal, past) {
use goal as "goal"
use past.summary max 2k as "relevant past lessons"

generate({ input: "Answer the goal using any relevant lessons", max_output: 700 }) -> {
ok: boolean
answer
reason
}
}

func reflect(goal, result, past) {
use goal as "goal"
use result as "current result"
use past.summary max 2k as "past lessons"

generate({ input: "Extract one durable lesson for future runs", max_output: 300 }) -> {
insight
}
}
}

2. Import Memory​

Memory is an explicit runtime capability:

import memory Lessons from "file://./.agentscript/tutorial-lessons.jsonl"

This example uses file memory, which stores JSONL records under .agentscript/. The file is ordinary project data, not prompt context.

3. Query Past Lessons​

The first step searches for relevant lessons:

past = Lessons.query({
kind: "lesson",
text: input.goal,
limit: 5
})

Querying memory returns data to the program. It does not automatically show that data to the model.

4. Choose What the Model Sees​

The answer function explicitly selects the goal and a bounded summary of past lessons:

use goal as "goal"
use past.summary max 2k as "relevant past lessons"

This is the same context rule as before: memory records are ordinary data until you select them with use.

5. Reflect and Store One Lesson​

After answering, the agent asks a smaller reflection question:

lesson = reflect(input.goal, result, past)

Then it stores one durable lesson:

Lessons.add({
kind: "lesson",
text: lesson.insight,
goal: input.goal,
ok: result.ok
})

The important habit is to store compact lessons, not entire transcripts.

6. Run It​

Run with mock model output:

agentscript tutorials/memory-reflection.as --mock --input '{"goal":"Explain explicit context boundaries"}'

Run it twice with the same goal. The second run can query the lesson stored by the first run.

To inspect the flow without real model calls, print the trace:

agentscript tutorials/memory-reflection.as --mock --trace --input '{"goal":"Explain explicit context boundaries"}'

Next​

Memory introduces long-lived state. The next advanced topic is optimization: using use one of and the optimizer toolchain to compare context choices.