Loading AgentsKit ecosystem navigation…
AgentsKit Chat

Hosted and self-hosted Ask backend

Production Ask handler for grounded semantic answers — one protocol, host-owned adapters.

View canonical Markdown

Hosted and self-hosted Ask backend

createAskServiceHandler is the production boundary for semantic questions that the deterministic plane cannot answer. One public protocol in every deployment; all authority is derived server-side.

Chat does not reimplement embeddings, vector search, or model transport. Those stay on AgentsKit — RAG, providers/adapters, and memory.

How a question is answered

Loading diagram...
  1. Exact / known questions hit the local deterministic artifact (no model).
  2. Misses escalate to the trusted Ask handler.
  3. Host injects auth, site policy, retriever, generator, rate limits, and storage.

Shared production factory

code
import { createAskServiceHandler } from '@agentskit/chat/server'

export const ask = createAskServiceHandler({
  authenticate: (request, signal) => auth.verify(request, signal),
  resolveSite: (identity, signal) => siteRegistry.resolve(identity.siteId, signal),
  resolveSubjectId: identity => identity.subjectId,
  retrievers: {
    local: { retrieve: input => localRag.retrieve(input) },
    federated: { retrieve: input => federatedRag.retrieve(input) },
  },
  generator: providerGenerator,
  sessionStore: durableCasStore,
  rateLimit: input => limiter.consume(input.site.siteId, input.subjectId, input.signal),
  onMetric: metric => telemetry.record(metric),
})

Adapters come from AgentsKit providers: currently 25 native adapters spanning 140+ catalog providers and 5k+ models — Chat does not reimplement them.

Hosted route (Next.js)

code
// app/api/ask/route.ts
import { createAskServiceHandler } from '@agentskit/chat/server'

const handler = createAskServiceHandler({ /* host adapters above */ })

export const POST = (request: Request) => handler(request)

Self-hosted / edge

The same handler works wherever Web Request/Response exist (Hono, Workers, Node 18+). Keep secrets and policy on the server — never in the client shell.

Client shell (docs assistant pattern)

code
import { defineChat, createAskAdapter, createDeterministicAnswerAdapter } from '@agentskit/chat'
import { AgentChat } from '@agentskit/chat/react'

const ask = createAskAdapter({ endpoint: '/api/ask', corpus: 'public', persona: 'guide' })
const adapter = createDeterministicAnswerAdapter({
  artifact: verifiedKnowledge,
  fallbackMode: 'backend',
  fallback: ask,
})

export const docsChat = defineChat({
  id: 'docs',
  chat: { adapter },
})

export const DocsAssistant = () => (
  <AgentChat definition={docsChat} placeholder="Ask about the product…" />
)

Live on this site: the floating Ask the docs button uses this stack.

Security invariants

RuleWhy
Auth before body parseUntrusted JSON never runs unauthenticated
Site policy server-sideClient corpus/persona are equality hints only
Citations requiredSuccessful answers include ≥1 safe citation
Host owns rate limitsFramework does not ship multi-tenant infra