The @composable-model-graph/core package defines the primitive layer. It has
no dependencies and no domain vocabulary.
Transform + Trace + Evaluation + Feedback
A named, typed step.
interface Transform<I, O> {
id: string;
name: string;
description?: string;
run(input: I, context: RunContext): O | Promise<O>;
}Every transform execution is recorded:
interface TraceStep {
transformId: string;
transformName: string;
input: unknown;
output: unknown;
startedAt: number;
finishedAt: number;
durationMs: number;
}Scores an output against an optional target into an EvaluationResult:
type EvaluationStatus = "pass" | "fail" | "partial" | "unknown";
interface EvaluationResult {
status: EvaluationStatus;
score?: number;
error?: number;
messages?: string[];
evidence?: Evidence[];
}Maps a completed run to a FeedbackAction:
type FeedbackActionKind = "accept" | "retry" | "adjust" | "reject" | "custom";
interface FeedbackAction {
kind: FeedbackActionKind;
reason?: string;
signal?: unknown;
}The complete, inspectable record of one run:
interface GraphRun<I, O> {
input: I;
output: O;
trace: TraceStep[];
evaluation?: EvaluationResult;
feedback?: FeedbackAction;
}createModelGraph(...).run(input, options?):
- Runs each transform in order, threading output → input.
- Records every intermediate state as a
TraceStep. - Evaluates the final output if an evaluator is present.
- Resolves a feedback action if a feedback resolver is present.
v1 is linear: there is no branching.
import {
createTransform,
createEvaluator,
createFeedbackResolver,
createModelGraph,
} from "@composable-model-graph/core";See Example 01 — Core Pipeline:
" Hello Model Graph "
→ trim
→ lowercase
→ split words
→ ["hello", "model", "graph"]