💬 Conversation-first
History is automatic and structural — every message, in order, content-addressed. You never hand-roll a reducer to thread state through calls.
🧩 Multimodal artifacts
text, image, pdf, audio, embedding, and more — routing a video into a model that only accepts [text, image] is a compile error, not a runtime 400.
⚖️ Built-in judges
judge returns a typed, exhaustively-matched Verdict — Pass, Fail(reason), Score(value), Escalate — not a hand-written grading prompt glued to string matching.
🔁 Traces & replay
Every run produces a complete, replayable trace — resume a conversation from any point, with model calls memoized instead of re-invoked.
👀 What it looks like
A complete, runnable conversation: translate, have a judge check fluency, retry once on failure, escalate to a human if the judge can't decide.
translate.ulx
judge Fluency(subject: text) -> Verdict {
rubric: """Is this an accurate, fluent translation of the source?
Answer Pass, Fail(reason), or Escalate if you cannot tell."""
}
conversation Translate(source: text, target_lang: text) -> text {
system: """You are a professional translator."""
user: """Translate to {target_lang}: {source}"""
assistant -> draft: text
match judge Fluency(draft) {
Pass => draft
Fail(reason) => retry(2) {
user: """Rejected: {reason}. Try again."""
assistant -> draft
} else escalate(human_approval, reason: reason)
Escalate => escalate(human_approval, reason: "judge could not decide")
Score(_) => draft
}
}
Try it yourself in the live playground — no install needed — or see the full examples gallery for eleven more.
🎬 See it run
ulx run translate.ulx Translate --provider anthropic — the judge can't decide, so it escalates to a human instead of guessing. It suspends, a reviewer runs ulx approve, and the same run resumes to completion.
bash
$ ulx run translate.ulx Translate --arg source=hello --arg target_lang=fr --provider anthropic
🧭 system: You are a professional translator.
🧑 user: Translate to fr: hello
🤖 assistant: Bonjour
⚖️ judge Fluency: Escalate
🙋 escalate human_approval: judge could not decide (suspended)
suspended: waiting on `human_approval` — judge could not decide
run id7f2c9a1e4b0d6f83
statussuspended
capabilitieschat, judge, escalate
provideranthropic — chat (claude-haiku-4-5), judge (claude-sonnet-4-5)
resume with: ulx approve 7f2c9a1e4b0d6f83 --value <text> (or: ulx deny 7f2c9a1e4b0d6f83)
$ ulx approve 7f2c9a1e4b0d6f83 --value "Bonjour"
🙋 escalate human_approval: judge could not decide => Bonjour
Bonjour
run id7f2c9a1e4b0d6f83
statusok
capabilitieschat, judge, escalate
provideranthropic — chat (claude-haiku-4-5), judge (claude-sonnet-4-5)
$