manifest.plugins list.
search
Full-text search backed by SQLite’s FTS5 (or Postgres tsvector on Postgres). You configure it on the entity, not as a plugin. A search config creates FTS5 + facet-bitmap shadow tables on schema push. Pylon maintains them on every write.
Declare it with the builder’s .search({...}) (or the search key in the entity options):
Query via
POST /api/search/<Entity>, or the React hook:
facetCounts is the live count per facet value over the current filtered hit set. It is enough to build Algolia-style faceted UIs without Algolia.
LLM proxy
A built-in proxy to LLM providers so your API key stays server-side and clients never see it. Environment variables configure it, not a plugin entry. Two endpoints, both requiring an authenticated session:POST /api/llm/complete— non-streaming completion.POST /api/ai/stream— SSE streaming completion.
ctx.llm.complete(...) / ctx.llm.stream(...) (server-only; the key never reaches the client, and neither is available in queries).
ctx.llm.stream
complete resolves when the model finishes. stream calls your handler for each event as the provider emits it, then resolves with the same assembled response. You can push text to the client while it generates and still branch on stop_reason afterwards:
text_delta {text}, tool_use_start {id, name}, tool_input_delta {partial_json}, and done {stop_reason, usage}. Tool arguments arrive as raw JSON fragments. Concatenate them and parse once at the end.
Same auth gate and same model allowlist as complete: streaming cannot reach a model complete would refuse. Streaming does not extend the call deadline (PYLON_FN_CALL_TIMEOUT, 30s default), so a long agent run must declare timeout: <seconds> on the function.
To reach every client watching rather than only the caller, push the same deltas through ctx.rooms.broadcast. Full walkthrough, including an agent tool loop: Functions → Streaming LLM output.
Env
Model allowlist
Clients may request a specific model on/api/ai/stream only if it’s allowlisted — otherwise the request is rejected with MODEL_NOT_ALLOWED. Set the allowlist via the manifest llm() helper or PYLON_AI_MODELS_ALLOWED:
- API keys stay server-side: browser / native clients never see them.
- Auth-gated: both endpoints require a session.
- Model allowlist: cap which models clients can invoke.
Vector search
Built in as a field type, not a plugin. Declareembedding: field.vector(1536) on an entity, fill it with ctx.llm.embed(texts) (OpenAI or Voyage), and query with ctx.db.vectorSearch(entity, { field, vector, limit, filter }) or POST /api/vector-search/<Entity>. Exact k-NN, cosine by default, both backends. Full guide: Vector Search.
Not yet built in
- MCP server: exposing your entities/functions as Model Context Protocol tools as a manifest plugin is planned, not shipped. The CLI’s
pylon mcp(agent tooling) exists today.