The OpenAI Assistants API is the easy onramp: an HTTP service holds the assistant, the thread, the run, and your tools. The price is lock-in. Your agent state lives in OpenAI's database, your tools are JSON Schema definitions you have to host yourself anyway, and the model list is just OpenAI. Digitorn keeps the assistant pattern and gives it back to you.
Two reasons. One, the Assistants API only runs on OpenAI models, so switching to a cheaper or better model from another lab means a rewrite. Two, your assistant config and your tool implementations live in two different places, the API and your server. Digitorn collapses both into a single YAML file you own.
Every OpenAI Assistants API primitive maps to a Digitorn equivalent. Where the mapping is not 1-to-1, the notes call out what changed.
Real apps in both stacks. The Digitorn version is what you would commit to a repo, no scaffolding hidden offscreen.
1import OpenAI from "openai";2const client = new OpenAI();34const assistant = await client.beta.assistants.create({5 name: "Support copilot",6 model: "gpt-4o-mini",7 instructions: "Answer using the docs. Cite the file.",8 tools: [9 { type: "file_search" },10 {11 type: "function",12 function: {13 name: "open_ticket",14 description: "Open a support ticket",15 parameters: {16 type: "object",17 properties: {18 subject: { type: "string" },19 severity: { type: "string", enum: ["low","high"] },20 },21 required: ["subject", "severity"],22 },23 },24 },25 ],26});2728// You still have to host /open_ticket on your server,29// poll runs, handle requires_action, and write file uploads.1schema_version: 223app:4 app_id: support-copilot5 name: "Support copilot"6 version: "1.0.0"78runtime:9 mode: conversation10 entry_agent: helper1112modules:13 rag: {}14 http: {}1516agents:17 - id: helper18 modules: [{rag: [query]}, {http: [request]}]19 brain:20 provider: openai21 model: gpt-4o-mini22 credential: openai_main23 system_prompt: |24 Answer using rag.query results. Cite the file.25 To open a ticket, call http.request with method POST to {{env.TICKET_URL}}.Same assistant, no thread bookkeeping, no run polling, no separate function-host. The custom tool is just an http.request call configured by URL. Switching the model to a different provider is a one-line change.
Subtle differences that look the same on paper and break on first run. Read these before you start porting.
OpenAI's File Search hides the vector store. In Digitorn the rag module runs against your own knowledge base. Better control, but you're responsible for what goes into it.
The Assistants API uses run polling with requires_action handoffs. Digitorn streams every event, no polling logic to maintain.
Assistants accepts files via the API. Digitorn relies on the filesystem module - you upload through whichever channel fronts the agent, then the agent reads the file directly.
# 1. install runtime
curl -sSL https://digitorn.ai/install | sh
# 2. save the YAML above as app.yaml in a new folder
mkdir from-openai-assistants
# 3. install and chat
digitorn install ./from-openai-assistants
digitorn chat from-openai-assistantsEngineering notes from the Digitorn team. No marketing, no launch announcements, no "10 prompts that will change your life". Just the things we write that we'd want to read.