Skip to main content

A hands-on walkthrough of the AcruxCore dashboard

· 10 min read
LLM-ops platform

This is the AcruxCore leg of a hands-on comparison series. We ran the exact same steps — create a prompt, version it, generate a trace, try to build a dataset — against the hosted product ourselves, so the LangSmith, Langfuse, and PromptLayer write-ups have a fair baseline to compare against. No marketing framing here — just what the dashboard actually does. The main comparison post pulls the findings from all four platforms together.

1. Log in and open the workspace

We logged into the hosted production dashboard at acruxcore.com with a demo account. The workspace sidebar splits into two groups: Workspace (Prompts, Team, Account & keys) and Gateway (Playground, Usage, Credentials, Secrets, Models, Virtual keys, Budgets) — the gateway (a proxy that sits between your app and model providers, so every call is routed, logged, and cost-tracked in one place) is a first-class section of the product, not a bolt-on.

AcruxCore sidebar showing the Prompts list and Workspace/Gateway navigation groups

2. Create a prompt, version it, and promote an alias

We opened support-triage, a support-ticket triage prompt with a system message. Editing and saving created version 2 automatically — versions are immutable, so you never lose an older prompt by accident.

Prompt editor showing the support-triage prompt's system message and version tabs (Editor, Preview, Versions, Diff, Audit)

The prompt page shows two aliasesproduction and staging — each pointing at a specific version. We promoted production from v1 to v2 with one click. This is AcruxCore's core prompt-management idea: your app always asks for support-triage@production, so promoting a new version changes live behavior with no redeploy.

support-triage prompt's Versions tab listing v2 (tagged PRODUCTION, with a promote-to-staging link) and v1 (tagged STAGING, with a promote-to-production link), each with a View traces link

The prompt page also has a Diff tab, sitting right next to Editor and Versions. It shows a line-level, git-style diff between any two versions — in this case, exactly what changed between v1 and v2 of the system message, colored like a code review:

AcruxCore's Diff tab showing a line-level, colored diff between prompt version 1 and version 2

This is the same "see exactly what changed before you promote it" idea PromptLayer's save dialog has, except here it's a standing tab you can return to at any time — not just a one-time confirmation screen at save time.

3. Send a stored-prompt reference through the gateway

Instead of pasting the prompt text into a chat request, the Playground has a "Stored prompt" mode: you give it a prompt name and an alias, and the gateway fetches, renders, and routes the call in one step.

Playground's Stored prompt tab with support-triage selected, alias set to production, and the template messages auto-loaded

Our first attempt failed with Required variables are missing: company, ticket — a genuinely useful validation error, since it caught a real mistake (we hadn't filled in the prompt's template variables) instead of silently sending a broken request. Filling in both variables and resending succeeded: the gateway telemetry panel showed provider: openai_compatible and cache: miss, confirming the call actually left our infrastructure and went to a real model. If you're wondering what that extra hop costs you, we benchmarked it: about 26 ms of software overhead, with the rest being ordinary network distance.

4. Inspect the trace

Every gateway call is traced automatically — no separate instrumentation step. The trace list showed our request within seconds, tagged OK, with token count and a timestamp.

Trace detail page showing 1 span, 106 tokens, status OK, and an LLM span row with a Feedback section showing one real thumbs-up entry

This particular trace has exactly one span — the single LLM call — because we called the gateway directly from the Playground rather than through a multi-step agent. AcruxCore's tracing model is: the gateway automatically records every model call as a span (model, tokens, latency, cost), and you can add your own spans via the SDK's hub.traces.ingest() for anything that happens around it (tool calls, retries, business logic) so a real agent run shows up as a proper parent/child span tree, not just a flat log. Opening the span itself shows the model, provider, token counts, and the full request/response body:

Expanded LLM span detail showing Model (openai/gpt-4o-mini), Provider (openai_compatible), token counts, and the real request/response JSON

Every trace also carries a feedback control (thumbs up/down) right on the page — this matters for the next step.

5. Build a dataset from real feedback

AcruxCore's evaluation page is explicit about where datasets come from: they aren't hand-typed, they're built by selecting real feedback rows — traces your team has already thumbs-up/thumbs-down'd in production. Unlike the other three platforms, there's no "add example" form here.

To see this end to end, we gave our trace above a real thumbs-up ("Correct classification and priority for this ticket") and went to the Feedback page, where it shows up as a real row, selectable via checkbox:

AcruxCore's Feedback page with one real feedback row checked, showing "1 feedback row selected" and Clear / Improve from feedback / Create dataset buttons

Clicking Create dataset, naming it, and confirming turned that one selected row into a real dataset immediately — no empty state, no "coming soon":

Evaluations page listing a real dataset named support-triage-regression with 1 example, created just now

This is the notable design choice here, not a limitation we're glossing over: your evaluation set grows directly out of what real users flagged as good or bad in production, instead of living as a separate hand-maintained fixture you have to remember to update.

6. Check the run history

Every experiment run against a dataset — whether triggered by hand or by the "Improve from feedback" flow below — lands in a Runs tab next to Datasets, with status, score, the best-scoring variant, and duration for each one:

AcruxCore Runs tab listing past evaluation runs with status, score, best variant, and duration columns

It's a plain list, not a separate product area to learn — the same page you use to browse datasets is where you go to see what every past run actually scored.

Doing this from code

Everything above was clicked through the dashboard. The same flow — render a stored prompt, send it through the gateway, get a traced result back — is a few lines with the published SDKs, and the same account has both a Node and a Python SDK, so we ran the call both ways.

Node

npm install @acruxcoreai/sdk:

import acruxcore from '@acruxcoreai/sdk';

const hub = new acruxcore({
apiKey: process.env.ACRUXCORE_API_KEY,
baseUrl: process.env.ACRUXCORE_BASE_URL,
});

const { messages } = await hub.prompts.render('support-triage', 'production', {
company: 'Harbor Systems',
ticket: 'My export button is greyed out on the billing page.',
});

const result = await hub.gateway.chat({ model: 'gpt-4o-mini', messages });

console.log(result.content);
console.log(result.usage);
console.log(result.gateway);

Running this for real against the same account produced:

content: Classification: Technical
Explanation: The issue involves a malfunction with a feature on the billing page, indicating a technical problem.
Priority: Medium
usage: { promptTokens: 66, completionTokens: 28, totalTokens: 94 }
gateway: {
requestId: 'a437b6b3-794d-4e5c-9cbd-a920ff7a32d7',
provider: 'openai_compatible',
model: 'openai/gpt-4o-mini',
costUsd: null,
cache: 'miss'
}

Python

pip install acruxcore (async, full feature parity with the Node SDK):

import asyncio
import os

from acruxcore import AcruxCore


async def main():
async with AcruxCore(
api_key=os.environ["ACRUXCORE_API_KEY"],
base_url=os.environ["ACRUXCORE_BASE_URL"],
) as hub:
rendered = await hub.prompts.render(
"support-triage",
"production",
{
"company": "Harbor Systems",
"ticket": "My export button is greyed out on the billing page.",
},
)

result = await hub.gateway.chat("gpt-4o-mini", rendered.messages)

print(result.content)
print(result.usage)
print(result.gateway)


asyncio.run(main())

Same prompt, same alias, same gateway — just an async/await shape instead of Node's Promise chain. No separate tracing call was needed in either language: hub.gateway.chat() already goes through the gateway, which auto-traces every completion it serves. Both scripts' calls showed up in the dashboard seconds later as ordinary traces — the same single-span OK view shown in section 4 above, just with a different token count and request ID each time:

AcruxCore's trace for the script-generated call, linked back to the exact gateway request and prompt version that produced it

7. A versioned Tool Catalog

Tools (callable functions the model can invoke) get the same treatment as prompts: immutable versions, and a real catalog page instead of a one-off schema buried in a Playground dropdown.

AcruxCore's Tools page listing a dozen real, versioned tools including get_order_status, query_database, and get_weather

Each tool has its own version history, promoted the same way a prompt alias is:

AcruxCore's tool Versions tab, showing numbered versions of a tool's JSON Schema with a promote-to-production control

And because every tool call routes through the gateway, it's a real, traced execution — not just a shape the model was told about — so a Tool Analytics page can aggregate real numbers per tool:

AcruxCore's Tool analytics page — call volume, error rate, and P50/P95 latency per tool, aggregated from traced executions

8. Team, audit, and payload capture settings

Everything account-level lives on one Team page — members, invites, and team API keys together, with no separate organization layer above it:

AcruxCore's single Team page — members, invites, and team API keys together, no org layer above

Whether the gateway stores full request/response bodies (not just metadata) is a team-wide toggle, on by default:

AcruxCore's team-wide Capture payloads toggle, on by default

And every prompt carries its own Audit tab — a real, populated log of version commits and alias promotions, not an empty state waiting for an upgrade:

AcruxCore's per-prompt Audit tab with real entries — version commits and alias promotions

What's unique to AcruxCore

  • Alias-based prompt promotion. production/staging labels point at specific immutable versions; promoting a version is a one-click, no-redeploy operation your app picks up on its next call.
  • Stored-prompt gateway calls. You can send just a prompt name + alias to the gateway and let it render and route in one request — no client-side templating needed.
  • Feedback-driven datasets. Datasets are built by selecting real production feedback rows rather than manually authored examples — evaluation data comes from what users actually flagged, not a separate fixture you maintain by hand.
  • Gateway as the tracing source. Because the gateway sits in the request path, every model call is traced automatically the moment you route through it — tracing isn't a separate SDK step you can forget to add.
  • A first-class, versioned Tool Catalog. Tools (callable functions) get the same Versions/Aliases treatment as prompts, plus their own analytics page — call volume, error rate, and P50/P95 latency per tool — instead of only ever showing up as a trace span.

Want to run through this yourself? The Quickstart gets you from sign-up to a traced, gateway-routed call in about ten minutes.