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
skillsSkillsClientSkill catalog + instances (BYOK & Skills)
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 (BYOK & Skills)
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
redTeamRedTeamClientAdversarial probes against a deployed release (Red Teaming)
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 (Spend Guard)

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