ERGO
Embeddable Sage

Put paid Sage turns inside any Ergo app.

The widget is the product surface for the live proof stack: chat, quote, testnet Note verification, receipt links, and full Accord receipt bundles without turning the host app into a payment backend.

Release posture
v0.3.0 published

The v0.3.0 paid widget surface is published on npm via GitHub Actions Trusted Publishing. The canonical Sage host remains a testnet proof, with mainnet wording closed behind audit evidence.

npm install @ergoblockchain/sage-widget
live
Source
v0.3.0

Source is published with payment intent JSON, wallet launcher hooks, React, vanilla, typed API helpers, and smoke checks.

live
npm
published

npm latest is v0.3.0, published through GitHub Actions Trusted Publishing without local OTP prompts or long-lived npm tokens.

live
Receipt
full bundle

The canonical Sage host has a settled post-Blob receipt with Agreement, Verification, and Settlement JSON.

blocked
Mainnet
closed

This is testnet live proof. Mainnet remains blocked by external review and audit-bound script identity.

Payment lifecycle

The widget shows the flow. The receipt API remains the truth.

The host app can own design and wallet UX, while Sage owns the protocol evidence: quote, payment verification, answer stream, public receipt page, and JSON bundle. No article, dashboard, or widget should duplicate receipt facts as a second database.

01

Ask

The host app embeds Sage and sends a normal question or a premium command.

02

Quote

Sage returns a task hash, receiver, reserve, price, expiry, and deadline for a testnet Note.

03

Verify

The user or host wallet creates the Note. The widget submits the Note box id to Sage for verification.

04

Receipt

Sage streams the answer and exposes both public receipt URL and machine-readable receipt bundle.

Live host demo

Try the exact embed flow without hiding the wallet step.

This demo calls the production Sage APIs directly. The host app asks for a quote, the user creates a testnet Note elsewhere, then the host verifies the Note and receives a receipt link. The widget never signs funds.

Testnet only. Mainnet stays audit-gated.
Quote generated

Run a premium-shaped prompt to request a quote.

Payment verified

Paste a Note box id after issuing the testnet Note.

Receipt linked

Full receipt bundle appears after verification.

React paid widget

import { SagePaymentWidget } from "@ergoblockchain/sage-widget/react"

export function PaidSagePanel() {
  return (
    <SagePaymentWidget
      tenant={{ id: "my-ergo-app", label: "My Ergo app" }}
      paymentInstructions={{
        helperText: "Issue the quoted testnet Note, then paste the Note box id.",
        walletLauncherLabel: "Open my testnet wallet",
        walletUrl: "https://www.ergoblockchain.org/build/agent-payments",
      }}
      onQuote={(quote) => console.log("quote", quote.quote)}
      onPaymentIntent={(intent) => console.log("wallet intent", intent)}
      onReceipt={(receipt) => console.log("receipt", receipt.receiptUrl)}
      onReceiptBundle={(bundle) => console.log(bundle.completeness)}
      walletLauncher={async (intent) => {
        // Host-owned wallet flow. Return { ok: true, noteBoxId } when ready.
        console.log(intent.amountErg, intent.receiverAddress, intent.taskHash)
        return { ok: true }
      }}
    />
  )
}

Vanilla mount

import { mountSagePaymentWidget } from "@ergoblockchain/sage-widget/vanilla"

const handle = mountSagePaymentWidget(
  document.getElementById("sage-chat")!,
  {
    tenant: { id: "docs-footer", label: "Docs footer" },
  },
)

await handle.send("/code show me a Fleet SDK example")
console.log(handle.status().receiptBundle?.completeness)

Receipt-first apps

import {
  createSagePaymentIntent,
  fetchSageQuote,
  fetchSageReceipt,
  isFullSageReceiptBundle,
} from "@ergoblockchain/sage-widget"

const question = "/deep explain Accord receipts"
const quoteResponse = await fetchSageQuote({ question })
if (!quoteResponse.quote) throw new Error("No premium quote returned")

const intent = createSagePaymentIntent({
  question,
  quote: quoteResponse.quote,
})

const receipt = await fetchSageReceipt("f8752d10a2ece92fbc88065c3b92b94da621ec65943098f43c9e084deb763d81")

if (isFullSageReceiptBundle(receipt)) {
  console.log(receipt.accord?.agreement_json)
}

Release gate

What changed now that this is the public install path.

1
v0.3.0 adds portable SagePaymentIntent JSON for host-owned wallet flows
2
Published tarball includes root, React, vanilla, type declarations, README, and license
3
Live host demo calls the production Sage quote, verify, chat, and receipt APIs
4
Keep wallet signing outside the widget; host apps own wallet policy and signing
5
Keep mainnet wording closed until external audit evidence exists

Mainnet gate stays closed

The widget deliberately does not sign wallet transactions. It can verify a Note and show receipts for the canonical testnet proof flow, but production/mainnet language still requires external review and audited script identity.

Next product move

This page is now the canonical install doc and live host demo. The next upgrade is a reviewed wallet flow that can issue the Note without weakening the receipt API as the source of truth.

Developer services