Library Tool Families
Every wizard-built or promote-built Strongly agent ships with seven
canonical Library tool families auto-registered at boot. The agent
calls them like any other function-calling tool; the platform handles
auth, scope, retry, and multi-tenant isolation through the shared
library_client.
The seven families
| Family | Tool prefix | What it covers | REST surface |
|---|---|---|---|
| memory | memory_* | Facts, observations, decisions. Hybrid semantic + text search. | /api/v1/memory |
| rules | rule_* | Hard constraints (must / must-not / should). | /api/v1/rules |
| skills | skill_* | Reusable instruction packs (markdown). | /api/v1/skills |
| tasks | task_* | One-off and recurring agent work. Cron-driven heartbeat closes via task_complete. | /api/v1/tasks |
| prompts | prompt_* | Read / author / look up Library prompts. | /api/v1/prompts |
| artifacts | artifact_* | Persisted deliverables (reports, dashboards, plans). | /api/v1/artifacts |
| preferences | preference_* | Long-running user preferences (timezone, tone, sign-off). | /api/v1/preferences |
Brain-config knobs
The brain workflow's top-level builtInTools config (or the same
field on the function-calling node) controls which families register:
{
"builtInTools": {
"disabled": ["artifacts"],
"allowedFamilies": null
}
}
disabled— list of family names to skip even when otherwise allowed. Unknown names are silently ignored at runtime; the promote-workflow validator warns at edit time.allowedFamilies— when present, a positive allow-list. Anything not listed is skipped, even if it's not indisabled. Use this to build a maximally-locked-down agent (e.g. read-only research bot with["memory", "skills", "prompts"]).
Disabling a family at config time and re-enabling later requires a redeploy of the agent pod.
Tool definitions
Every tool registers with an OpenAI-function-calling-compatible JSON
Schema. The full definition is available at runtime via GET /tools
on the agent pod. Inline summary below.
memory
memory_create(content, kind?, summary?, tags?, category?, importance?)— store.memory_search(query, limit?)— hybrid semantic + text.memory_list(limit?, offset?, kind?, tags?)— browse.memory_get(memory_id)— fetch one.memory_update(memory_id, { content?, summary?, tags?, … })— update in place.memory_delete(memory_id).
rules
rule_create(description, content, category, severity, enforcement_mode?).rule_list(limit?, category?, enabled_only?).rule_get(rule_id)/rule_update(rule_id, …)/rule_delete(rule_id).
skills
skill_create / skill_list / skill_get / skill_update /
skill_delete — Library-resident reusable instruction packs.
tasks
task_create(description, cron?, recurrence?, priority?, due_at?).task_list(status?, limit?, offset?).task_get(task_id)/task_complete(task_id, result?)/task_skip_next/task_end_recurrence/task_delete.
prompts
prompt_get(prompt_id)— read full content.prompt_list(type?, limit?, offset?).prompt_create(name, content, type?, description?, tags?).prompt_update(prompt_id, …).
artifacts
artifact_save(title, artifact_type, content, content_type, summary?, tags?).artifact_list(artifact_type?, limit?, offset?).artifact_get(artifact_id, with_download_url?).artifact_share(artifact_id, user_id)/artifact_delete.
preferences
preference_set(key, value, source?, description?).preference_get(key)/preference_list(source?, limit?, offset?)/preference_forget(key).
Result envelope
Every tool returns a JSON string with one of two envelopes:
{ "success": true, "data": <result> }
{
"success": false,
"error": {
"code": "<error code>",
"status": <HTTP status>,
"message": "<reason>",
"details": <optional structured details>
}
}
Tools NEVER raise — the agent loop always sees a JSON envelope and decides whether to retry, surface the error, or continue.
Auth + multi-tenancy
The library_client injects three headers on every request:
Authorization: Bearer <STRONGLY_OWNER_TOKEN>— agent identity.X-Strongly-App-Id: <STRONGLY_APP_ID>— per-agent isolation when the agent was deployed via an app.X-Agent-Workflow-Id: <WORKFLOW_ID>— the brain workflow id.
The platform's existing scope filter uses these to pin reads and writes to the calling agent's tenant.
Retry policy
- Idempotent verbs (GET, PUT, DELETE) — retry up to 3 times on connection errors and HTTP 502/503/504 with full-jitter exponential backoff (base 0.5 s, cap 8 s).
- Non-idempotent verbs (POST, PATCH) — retry only on connection errors. Never retry a 5xx that may have committed a write.
- 4xx is always raised — the caller decides what to surface.
See also
- Agents API
- Sessions API
- User-facing concept: Personality and Operating Prompt