Skip to content

@uservane/vercel-ai

Agent-native capture for chat UIs built on the Vercel AI SDK. Headless AgentController plus React <UserVaneProvider> / <InlineFeedback />. Reuses @uservane/browser for bootstrap, show-decision, and submit.

Terminal window
npm install @uservane/vercel-ai
# peers: react >= 18; ai >= 3 (optional peer)
ExportRole
UserVaneProviderInit controller, optional identity, default InlineFeedback
useUserVane()resolveTask, bind, isTaskOpen, identify, survey, dismiss, complete, noteUserTurn, active, controller
InlineFeedbackInline ask UI (0 CLS, dismiss-on-next-action)
AgentControllerHeadless controller class
UserVaneErrorBoundaryError boundary
Correlation helpersexplicitCorrelationSource, emptyCorrelationSource, …
  • apiKey (publishable)
  • apiBase, debug
  • nonBlocking (default false: blocking-capable, task open until resolveTask)
  • surveySlug default for resolve / mechanical triggers
  • userId, traits
  • correlationSource (prefer bind for production linked path)
  • renderInline (default true)
MethodRole
init / identifyPublishable-key setup and respondent identity
resolveTask(opts?)Mark task resolved; run show-decision
isTaskOpen()Open-task bar query
bind(binding)Install server-minted { surveyId, showToken, sessionId }
unbind(surveyId?)Clear binding(s)
complete / dismissSubmit or dismiss active ask
survey(slug)Imperative trigger
noteUserTurnRe-open task after resolve in blocking mode; advances afterTurn when nonBlocking
afterTurn / onSessionEndMechanical triggers (nonBlocking only)
setHeadlessContractRequired pair isTaskOpen + onDismiss when headlessMode
import { mintFeedbackToken } from "@uservane/vercel-ai/server";
const { tokens, suppression, issuedAt } = await mintFeedbackToken({
secretKey: process.env.USERVANE_SECRET_KEY!,
respondentId: "u_123",
sessionId: "sess_abc",
surveyId: "surv_post_task", // optional
taskType: "refund", // optional, untrusted display metadata
});
  • Calls POST /v1/sdk/tokens with the secret key.
  • Never import @uservane/vercel-ai/server from client code.
  1. Server: same sessionId as Langfuse attributes → mintFeedbackToken
  2. Client: bind({ surveyId, showToken, sessionId })
  3. Client: resolveTask() at true outcome → InlineFeedback / headless complete
  4. Optional server: @uservane/langfuse-push

Agent quickstart · TypeDoc client · TypeDoc server