Migration Guides
No existing codebase needs to rewrite wholesale to adopt Ulexite. A conversation value satisfies a single, simple execution protocol and Ulexite has an FFI boundary designed in from the start, so the recommended path is always to wrap one conversation at a time, called from your existing host application — not a big-bang port.
The sections below map concepts from popular frameworks onto their Ulexite equivalent.
From LangChain / LangGraph
- LCEL chains map most directly onto Ulexite's imperative statement sequence: a
prompt | model | parserpipeline becomes a message-literal block ending in a typed binding. LangChain'sRunnableuniform-interface idea is the same idea Ulexite generalizes, so this is largely a mechanical translation of pipe stages into sequential statements. RunnableWithMessageHistory+ session-id config collapses entirely: Ulexite's automatic structural message history replaces it outright. Migrating this should delete the wrapper and session-store code, not port it.- LangGraph's
StateGraph/reducers map onto Ulexite's merge-function declarations pluswithblocks for the parallelizable subset of the graph, and onto ordinary imperative control flow for genuinely sequential/conditional nodes. A graph with heavy conditional routing (add_conditional_edges) migrates most naturally tomatchstatements, not a forcedwithblock. - Checkpointers are unnecessary to port — every Ulexite run is checkpointed by default. A team relying on LangGraph's
(thread_id, checkpoint_id)model gets the equivalent for free. - LangSmith evals migrate to
benchmark/judgedeclarations; existing rubric text is largely reusable verbatim inside ajudge's rubric field.
From Semantic Kernel
- Plugins/
KernelFunctions map onto tool adapters; the[KernelFunction]-attribute ceremony collapses to a plain tool declaration with a checked input/output artifact schema. ChatHistorycollapses the same way LangChain's history wrapper does — replaced, not ported, by automatic structural history.- Filters are the one Semantic Kernel concept with a near-1:1 target: they map directly onto Ulexite's
next(context)-style middleware extension point, and porting filter logic is close to mechanical. - Given Semantic Kernel's own maintenance-mode status and its successor's abandonment of the
Kernelobject entirely, teams already mid-migration to Microsoft Agent Framework may find it lower-risk to evaluate Ulexite against Agent Framework directly rather than against legacy Semantic Kernel.
From DSPy
- Signatures map onto a
conversation's typed parameter/return declaration — the cleanest of any migration on this page, since DSPy'sSignatureconcept and Ulexite's typed conversation boundary solve the same problem the same way. - Modules (
Predict,ChainOfThought,ReAct) map onto conversation bodies with the corresponding control-flow shape written out explicitly. AChainOfThought's implicitreasoningfield becomes an explicit intermediate binding; aReActloop becomes awhile/matchloop over tool-call results. - Optimizers aren't reimplemented — Ulexite's standard library wraps the same technique (
optimize.mipro/optimize.bootstrap_demos), and an existing DSPy-compiled prompt artifact can, if desired, seed the corresponding Ulexite conversation's initial few-shot examples rather than being discarded. dspy.Evaluatemaps ontobenchmark/dataset.
From Promptfoo / OpenAI Evals
- A
promptfooconfig.yaml'stestsarray or an OpenAI Evals JSONL dataset maps directly onto adatasetdeclaration — close to a mechanical data-format conversion, not a redesign. llm-rubric/ModelBasedClassifyassertions map ontojudgedeclarations; deterministic assertions (regex,json-schema,is-json) map ontovalidatordeclarations.- The one thing that does not migrate mechanically is control flow buried in Nunjucks templates or an escape-hatch Python/JS grader function — that logic has to be rewritten as ordinary Ulexite statements. That's more or less the point: it's exactly the class of logic that had nowhere legitimate to live in a config-file format.
From LlamaIndex
Workflow's typed-event routing is the closest conceptual match to Ulexite's own step-to-step data flow — a@stepfunction'sEvent -> Eventsignature translates fairly directly to a sequence of typed bindings andmatchbranches.ChatEngine/ChatMemoryBuffercollapse the same way every other framework's bespoke history object does, into automatic structural history.- Retrieval/ingestion pipelines (node parsers, retrievers, rerankers) are the one area where a migration should keep LlamaIndex, not replace it: register it as a
vector_indexcapability provider behind Ulexite'svector/embeddingstandard-library calls, rather than reimplementing years of retrieval-specific engineering.
From OpenAI Agents SDK
- Agents/Handoffs map onto nested conversations — a handoff's model-visible
transfer_to_<agent>tool call becomes an ordinary nestedconversationinvocation, with routing expressed asmatch/ifrather than a special handoff primitive. - Guardrails map onto
validator/judgedeclarations gating amatch. - Sessions collapse into automatic history, as in every other migration path above.
- Tracing — because Ulexite's trace format can export to OpenTelemetry, an existing investment in a tracing backend (Langfuse, Arize, etc.) connected to the Agents SDK's OTel-compatible export can often be pointed at Ulexite's export with minimal reconfiguration.
What never needs to migrate
Retrieval engines, vector databases, and provider SDKs — LlamaIndex's ingestion stack, LiteLLM's provider matrix, an existing Pinecone/Qdrant deployment — aren't replaced. They become provider or tool plugins behind Ulexite's capability interfaces. Reinventing everything outside the conversation-orchestration domain is an explicit non-goal.
For the full design rationale, see §23 of the spec.