@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.
Install
Section titled “Install”npm install @uservane/vercel-ai# peers: react >= 18; ai >= 3 (optional peer)Client exports
Section titled “Client exports”| Export | Role |
|---|---|
UserVaneProvider | Init controller, optional identity, default InlineFeedback |
useUserVane() | resolveTask, bind, isTaskOpen, identify, survey, dismiss, complete, noteUserTurn, active, controller |
InlineFeedback | Inline ask UI (0 CLS, dismiss-on-next-action) |
AgentController | Headless controller class |
UserVaneErrorBoundary | Error boundary |
| Correlation helpers | explicitCorrelationSource, emptyCorrelationSource, … |
Provider props (selected)
Section titled “Provider props (selected)”apiKey(publishable)apiBase,debugnonBlocking(defaultfalse: blocking-capable, task open untilresolveTask)surveySlugdefault for resolve / mechanical triggersuserId,traitscorrelationSource(preferbindfor production linked path)renderInline(defaulttrue)
Controller methods (selected)
Section titled “Controller methods (selected)”| Method | Role |
|---|---|
init / identify | Publishable-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 / dismiss | Submit or dismiss active ask |
survey(slug) | Imperative trigger |
noteUserTurn | Re-open task after resolve in blocking mode; advances afterTurn when nonBlocking |
afterTurn / onSessionEnd | Mechanical triggers (nonBlocking only) |
setHeadlessContract | Required pair isTaskOpen + onDismiss when headlessMode |
Server: mintFeedbackToken
Section titled “Server: mintFeedbackToken”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/tokenswith the secret key. - Never import
@uservane/vercel-ai/serverfrom client code.
Linked path (summary)
Section titled “Linked path (summary)”- Server: same
sessionIdas Langfuse attributes →mintFeedbackToken - Client:
bind({ surveyId, showToken, sessionId }) - Client:
resolveTask()at true outcome →InlineFeedback/ headless complete - Optional server:
@uservane/langfuse-push