๐ฌ 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.
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.