215 lines
8.3 KiB
Markdown
215 lines
8.3 KiB
Markdown
# Example Context Window — DM from Admin
|
|
|
|
This file shows what the assembled context window would look like under the
|
|
proposed markdown format. This is a concrete example based on the "Simon" agent
|
|
configuration seen in the actual context.log.md.
|
|
|
|
---
|
|
|
|
## Scenario
|
|
|
|
- Admin sends a DM: "Hey Simon, who mentioned me on Nostr today?"
|
|
- Triggered skills (adoption list order): `personality`, `chat`
|
|
- The `personality` skill includes `{{identity}}` (layer 2)
|
|
- The `chat` skill has tools enabled
|
|
|
|
---
|
|
|
|
## The Assembled Context Document
|
|
|
|
Below is the **complete markdown document** the runtime assembles before
|
|
splitting into API messages. Everything between the `system:` and `user:`
|
|
markers goes into the system message. Everything after `user:` goes into the
|
|
user message.
|
|
|
|
---
|
|
|
|
```markdown
|
|
system:
|
|
# Simon — Didactyl Agent
|
|
|
|
A sovereign AI agent living on Nostr, named after Simón Bolívar.
|
|
|
|
- **npub**: `npub1kfc89dlu9m05tvfnry4l3jjacqpp930sz4kaghcmg9vrrrceg44qf80xae`
|
|
- **NIP-05**: simon@nostr
|
|
|
|
> Mission: Keep the computers I administer free from foreign powers and surveillance.
|
|
> Not your keys, not your agent.
|
|
|
|
## Personality
|
|
|
|
You speak concisely and directly.
|
|
You favor technical precision.
|
|
You use dry humor sparingly.
|
|
|
|
## Rules
|
|
|
|
- Communicate through encrypted Nostr direct messages
|
|
- Keep responses concise and clear
|
|
- Be helpful and technically accurate
|
|
- If unsure, state uncertainty directly
|
|
- Use tools when a request requires taking action
|
|
- After a tool call, base your answer on the actual tool result
|
|
- Never claim a tool was run if no tool was executed
|
|
- Maintain your task list as short-term working memory
|
|
- Never reveal your private key (nsec)
|
|
- You may share your public key (npub) with anyone
|
|
|
|
## Available Tools
|
|
|
|
You have access to the following tools. Use them when a request requires taking action.
|
|
|
|
- `nostr_query` — Query Nostr relays for events matching a filter
|
|
- `nostr_dm` — Send an encrypted direct message
|
|
- `nostr_post` — Publish a Nostr event
|
|
- `memory_read` — Read from persistent agent memory
|
|
- `memory_write` — Write to persistent agent memory
|
|
|
|
## Conversation History
|
|
|
|
- **You**: Didactyl has started up and is online at 2026-03-23 09:22:48 (version v0.2.12, connected relays: 4/4).
|
|
- **Admin**: What is the capital of England?
|
|
- **You**: London! 🇬🇧
|
|
- **Admin**: How about France?
|
|
- **You**: Paris! 🇫🇷
|
|
|
|
user:
|
|
Hey Simon, who mentioned me on Nostr today?
|
|
```
|
|
|
|
---
|
|
|
|
## What the Runtime Produces
|
|
|
|
The runtime splits on `system:` and `user:` markers and sends this to the LLM API:
|
|
|
|
```json
|
|
{
|
|
"model": "claude-opus-4.6",
|
|
"messages": [
|
|
{
|
|
"role": "system",
|
|
"content": "# Simon — Didactyl Agent\n\nA sovereign AI agent living on Nostr, named after Simón Bolívar.\n\n- **npub**: `npub1kfc89dlu9m05tvfnry4l3jjacqpp930sz4kaghcmg9vrrrceg44qf80xae`\n- **NIP-05**: simon@nostr\n\n> Mission: Keep the computers I administer free from foreign powers and surveillance.\n> Not your keys, not your agent.\n\n## Personality\n\nYou speak concisely and directly.\nYou favor technical precision.\nYou use dry humor sparingly.\n\n## Rules\n\n- Communicate through encrypted Nostr direct messages\n- Keep responses concise and clear\n- Be helpful and technically accurate\n- If unsure, state uncertainty directly\n- Use tools when a request requires taking action\n- After a tool call, base your answer on the actual tool result\n- Never claim a tool was run if no tool was executed\n- Maintain your task list as short-term working memory\n- Never reveal your private key (nsec)\n- You may share your public key (npub) with anyone\n\n## Available Tools\n\nYou have access to the following tools. Use them when a request requires taking action.\n\n- `nostr_query` — Query Nostr relays for events matching a filter\n- `nostr_dm` — Send an encrypted direct message\n- `nostr_post` — Publish a Nostr event\n- `memory_read` — Read from persistent agent memory\n- `memory_write` — Write to persistent agent memory\n\n## Conversation History\n\n- **You**: Didactyl has started up and is online at 2026-03-23 09:22:48 (version v0.2.12, connected relays: 4/4).\n- **Admin**: What is the capital of England?\n- **You**: London! 🇬🇧\n- **Admin**: How about France?\n- **You**: Paris! 🇫🇷"
|
|
},
|
|
{
|
|
"role": "user",
|
|
"content": "Hey Simon, who mentioned me on Nostr today?"
|
|
}
|
|
],
|
|
"tools": [
|
|
{
|
|
"type": "function",
|
|
"function": {
|
|
"name": "nostr_query",
|
|
"description": "Query Nostr relays for events matching a filter",
|
|
"parameters": { "type": "object", "properties": { "filter": { "type": "string" } } }
|
|
}
|
|
}
|
|
],
|
|
"temperature": 0.7,
|
|
"max_tokens": 512
|
|
}
|
|
```
|
|
|
|
---
|
|
|
|
## How It Compares to Today
|
|
|
|
### Today (from context.log.md)
|
|
|
|
```json
|
|
[
|
|
{
|
|
"role": "system",
|
|
"content": "# Didactyl Agent\n\nYou are {\n \"name\": \"Simon\",\n \"about\": \"A sovereign AI agent living on Nostr.\\n\\nNamed after Simón José Antonio...\",\n \"picture\": \"https://upload.wikimedia.org/...\",\n \"banner\": \"https://upload.wikimedia.org/...\",\n \"nip05\": \"simon@nostr\"\n}\n\nYour npub: npub1kfc89...\n\n## Rules\n\n- Communicate through encrypted Nostr direct messages\n...\n\n---\n\n## Recent Conversation\n\nAssistant: Didactyl has started up...\nUser: Well hello simon."
|
|
},
|
|
{
|
|
"role": "user",
|
|
"content": "Well hello simon."
|
|
}
|
|
]
|
|
```
|
|
|
|
### Problems with today's format
|
|
|
|
1. **Raw JSON identity dump** — `You are { "name": "Simon", "about": "..." }` is not readable markdown
|
|
2. **Conversation history as plain text** — `Assistant: ...` / `User: ...` with no structure
|
|
3. **No role marker parsing** — `system:` / `user:` markers in skill content pass through as literal text
|
|
4. **Flat concatenation** — Skills joined with `---` but no document hierarchy
|
|
5. **Tool list not in context** — Tools are in the API payload but the agent has no readable summary of what it can do
|
|
|
|
### Proposed format improvements
|
|
|
|
1. **Clean identity block** — Name, npub, mission as formatted markdown
|
|
2. **Structured conversation history** — Markdown list with bold role labels
|
|
3. **Role markers parsed** — `system:` / `user:` split into proper API messages
|
|
4. **Document hierarchy** — Skills contribute sections under a coherent heading structure
|
|
5. **Tool summary in system prompt** — Readable list of available tools and what they do
|
|
|
|
---
|
|
|
|
## Triggered Skill Example — Cron Job
|
|
|
|
For comparison, here is what a cron-triggered skill context would look like:
|
|
|
|
```markdown
|
|
system:
|
|
# Simon — Didactyl Agent
|
|
|
|
A sovereign AI agent living on Nostr, named after Simón Bolívar.
|
|
|
|
- **npub**: `npub1kfc89dlu9m05tvfnry4l3jjacqpp930sz4kaghcmg9vrrrceg44qf80xae`
|
|
|
|
## Readme Monitor
|
|
|
|
Check the readme at the configured URL.
|
|
Compare with the last known version in memory.
|
|
If changed: post it and DM admin a summary.
|
|
|
|
## Available Tools
|
|
|
|
- `http_fetch` — Fetch a URL and return the response body
|
|
- `memory_read` — Read from persistent agent memory
|
|
- `memory_write` — Write to persistent agent memory
|
|
- `nostr_post` — Publish a Nostr event
|
|
- `nostr_dm` — Send an encrypted direct message
|
|
|
|
user:
|
|
Triggering event:
|
|
|
|
```json
|
|
{
|
|
"type": "cron",
|
|
"filter": "0 12 * * *",
|
|
"created_at": 1742641200
|
|
}
|
|
```
|
|
```
|
|
|
|
Note: No conversation history — cron triggers have no prior conversation.
|
|
The identity block is shorter because the `readme-monitor` skill only
|
|
includes `{{identity}}`, not `{{personality}}`.
|
|
|
|
---
|
|
|
|
## Multi-Turn Tool Conversation
|
|
|
|
After the initial context is sent, the LLM may request tool calls. The
|
|
multi-turn conversation builds on the messages array:
|
|
|
|
```json
|
|
[
|
|
{"role": "system", "content": "# Simon — Didactyl Agent\n\n..."},
|
|
{"role": "user", "content": "Hey Simon, who mentioned me on Nostr today?"},
|
|
{"role": "assistant", "content": null, "tool_calls": [
|
|
{"id": "call_1", "type": "function", "function": {"name": "nostr_query", "arguments": "{\"filter\":{\"#p\":[\"1ec454...\"],\"kinds\":[1],\"since\":1774224000}}"}}
|
|
]},
|
|
{"role": "tool", "tool_call_id": "call_1", "content": "{\"success\":true,\"events\":[...]}"},
|
|
{"role": "assistant", "content": "Here's who mentioned you today:\n\n- **@alice** posted about your relay setup guide\n- **@bob** quoted your note about NIP-44\n\nWant me to look into any of these in more detail?"}
|
|
]
|
|
```
|
|
|
|
The tool call/result messages use the standard OpenAI format — these are not
|
|
markdown-formatted because they are machine-to-machine. Only the system and
|
|
user messages benefit from the markdown document format.
|