agentfootprint
Version:
The explainable agent framework — backtrack a wrong answer to the exact context that caused it (evidence, not guesses). Built on footprintjs.
61 lines (60 loc) • 2.46 kB
TypeScript
/**
* formatFacts — render loaded `Fact` entries into a single system
* message for prompt injection.
*
* Reads from scope: `loadedFacts`
* Writes to scope: `formatted` (Message[] — one system message, or empty)
*
* Facts are tiny and semantically distinct from beats/messages, so they
* render as a compact key/value block rather than a narrative paragraph
* or per-entry `<memory>` tags. The default shape:
*
* Known facts about the user:
*
* - user.name: Alice
* - user.email: alice@example.com
* - user.preferences.color: blue
*
* Why one block, not one message per fact?
* LLMs parse key/value lists efficiently; splitting would waste
* tokens on per-message system overhead and break up the list's
* visual grouping.
*
* Why NOT run facts through `pickByBudget`?
* Facts are typically 10-50 items, each a handful of tokens. Picking
* subsets is rarely useful — the user either knows your name or
* they don't. Consumers who *do* want budget-based fact pruning can
* copy-paste this stage and wrap it with a picker.
*/
import type { TypedScope } from 'footprintjs';
import type { MemoryEntry } from '../entry/index.js';
import type { Fact } from './types.js';
import type { FactPipelineState } from './extractFacts.js';
export interface FormatFactsConfig {
/**
* Header prepended to the injected message. Explains to the LLM what
* follows and what it's for. Override if your app has specific
* phrasing guidance.
*/
readonly header?: string;
/** Footer appended after the fact list. Empty by default. */
readonly footer?: string;
/**
* When `true`, appends `(conf 0.xx)` after each fact's value. Off by
* default — confidence is usually noise for the LLM and only useful
* in audit / debug flows.
*/
readonly showConfidence?: boolean;
/**
* Custom per-fact renderer. Receives the entry; returns the block
* string (without the leading `- ` bullet). Use for app-specific
* formatting: custom attribution, hiding category info, etc.
*/
readonly renderFact?: (entry: MemoryEntry<Fact>) => string;
/**
* Inject the message even when `loadedFacts` is empty. Usually
* undesired — an empty list is noise. Off by default.
*/
readonly emitWhenEmpty?: boolean;
}
export declare function formatFacts(config?: FormatFactsConfig): (scope: TypedScope<FactPipelineState>) => Promise<void>;