Skip to content

Server SDK Overview

Copy page

The @divinci-ai/server package provides a Node.js SDK for server-side operations against the Divinci platform.

  • Workspace, release, and RAG management
  • Group, permission, and API key administration
  • Arena experiments and arena presets
  • Audio transcripts, fine-tuning, training-data, and QA pipelines
  • x402 payment handling for premium tools
  • Meta-harness orchestration loops
  • Full TypeScript support
Terminal window
npm install @divinci-ai/server
import { DivinciServer } from "@divinci-ai/server";
const divinci = new DivinciServer({
apiKey: process.env.DIVINCI_API_KEY,
});
// List workspaces
const workspaces = await divinci.workspaces.list();
OptionTypeRequiredDescription
apiKeystringYes*Your secret API key (*or accessToken)
accessTokenstringNoOAuth access token, alternative to apiKey
defaultWorkspaceIdstringNoDefault workspace for calls that accept one
baseUrlstringNoOverride API base URL (default https://api.divinci.app)
timeoutnumberNoRequest timeout in ms (default 30000)
maxRetriesnumberNoRetries for transient failures (default 3)
x402X402ConfigNoPayment wallet + autopay config (x402)
debugbooleanNoVerbose logging

Set or read the default workspace at runtime with divinci.setDefaultWorkspaceId(id) and divinci.getDefaultWorkspaceId().

The DivinciServer instance exposes lazy-instantiated resource clients as properties:

PropertyClientPurpose
workspacesWorkspaceClientCreate, list, update, delete workspaces
releasesReleaseClientManage releases and deployments
termsTermsClientRelease Terms of Service versions and acceptance
skillsSkillsClientRelease skills and the skill catalog
aiChatsAiChatsClientAI chat threads
mcpServersMcpServersClientExternal MCP servers attached as assistant tools
ragRagClientCollections, documents, chunks, search
apiKeysApiKeyClientCreate, list, rotate, delete workspace API keys
byokBYOKClientBring-your-own-key provider credentials
arenaArenaClientA/B test variants and routing (presets via arena.presets)
transcriptsTranscriptClientConversation histories and messages
audioAudioClientAudio upload, transcripts, RAG generation
fineTuneFineTuneClientFine-tuning jobs
configConfigClientWorkspace title, description, settings
trainingDataTrainingDataClientSynthetic training data from RAG
qaQAClientQA suites, runs, scorers
x402X402ClientPayment receipts and wallet utilities
groupsGroupClientUser group CRUD + invites
permissionsPermissionClientGrant / revoke permissions on users, groups, and the logged-in / anonymous principals
metaHarnessMetaHarnessClientLong-running orchestration loops, iterations, and proposals
notificationsNotificationClientNotification feed, channels, triggers, flaggers (observability)
analyticsAnalyticsClientProduct analytics (observability)
metricsMetricsClientPipeline telemetry + alert configs (observability)
usageUsageClientAPI-key usage reporting (observability)
feedbackFeedbackClientMessage feedback read + stats (observability)
spendGuardSpendGuardClientBudget checks, spend recording, daily summaries, alerts

All clients are lazily constructed on first access — instantiating DivinciServer does not open connections or allocate per-client resources.

Manage user groups within a workspace and their memberships.

const { groups } = await divinci.groups.list();
const { group } = await divinci.groups.create({ name: "Engineering" });
await divinci.groups.update(group.id, { name: "Platform Engineering" });
await divinci.groups.invite(group.id, "user@example.com");
await divinci.groups.removeMember(group.id, "user_abc123");
await divinci.groups.removeInvite(group.id, "stale@example.com");
await divinci.groups.delete(group.id);
MethodDescription
list()List groups in the active workspace
get(groupId)Fetch a single group
create(options)Create a new group
update(groupId, options)Rename / update a group
delete(groupId)Delete a group
invite(groupId, email)Invite a user by email
removeMember(groupId, userId)Remove an existing member
removeInvite(groupId, email)Cancel a pending invite

Grant and revoke permissions on workspace resources. Principals can be specific users, groups, every authenticated user (loggedIn), or anonymous visitors.

// What can the current caller do here?
const { permissions } = await divinci.permissions.getMine();
// Inspect the full permission document
const { permissions: doc, validPermissions } = await divinci.permissions.get();
// Grant a permission to a user by email
await divinci.permissions.grantToUser("editor@acme.com", ["rag.write"]);
// Revoke from a user (by id or email)
await divinci.permissions.revokeFromUser({ email: "former@acme.com" });
// Grant a permission to a group
await divinci.permissions.grantToGroup("engineering", ["release.publish"]);
await divinci.permissions.revokeFromGroup("engineering");
// Set what every logged-in / anonymous user can do
await divinci.permissions.setLoggedIn(["chat.send"]);
await divinci.permissions.setAnonymous([]); // lock anonymous access entirely
MethodDescription
get()Full permission document plus the list of valid permission strings
getMine()Permissions the current caller effectively has
grantToUser(email, perms)Add permissions to a user
revokeFromUser({ userId? | email? })Remove all permissions from a user
grantToGroup(slug, perms)Add permissions to a group
revokeFromGroup(slug)Remove all permissions from a group
setLoggedIn(perms)Replace the logged-in principal’s permission set
setAnonymous(perms)Replace the anonymous principal’s permission set

Orchestration: metaHarnessMetaHarnessClient

Section titled “Orchestration: metaHarness — MetaHarnessClient”

Drive long-running orchestration loops that propose and apply changes iteratively. Useful for autonomous QA / arena / style-pattern improvement cycles. Three sub-clients:

// Loop control
const loop = await divinci.metaHarness.loop.get();
await divinci.metaHarness.loop.update({ /* loop config */ });
await divinci.metaHarness.loop.iterate(); // advance one step
await divinci.metaHarness.loop.pause();
await divinci.metaHarness.loop.resume();
await divinci.metaHarness.loop.cancel();
// Iteration history
const iterations = await divinci.metaHarness.iterations.list({ limit: 20 });
const iteration = await divinci.metaHarness.iterations.get("iter_abc");
// Proposals produced by iterations
const proposals = await divinci.metaHarness.proposals.list({ status: "pending" });
await divinci.metaHarness.proposals.accept("prop_xyz");
await divinci.metaHarness.proposals.reject("prop_xyz", { reason: "off-policy" });
Sub-clientMethods
metaHarness.loopget, update, iterate, pause, resume, cancel
metaHarness.iterationslist, get
metaHarness.proposalslist, accept, reject