Skip to main content
Biblos is a one-shot TypeScript agent for Slack knowledge questions. A mention in an allowlisted channel starts a Guild session. Biblos reads only that thread, retrieves a bounded set of snippets from a Pinecone Assistant, and writes one reply in the same thread. When retrieval comes back weak or empty, Biblos sends a fixed refusal instead of inventing a process.

dkountanis~biblos

View the agent and its source on the Agent Hub.

At a glance

  • Agent type: auto-managed TypeScript agent
  • Integrations: Slack (guildai~slack) for reactions, thread reads, posts, and updates, and the dkountanis~pinecone-assistant integration (1.0.0) for ranked retrieval
  • Runs from: an event trigger on Slack app_mention
  • LLM calls: at most one per mention, with no tools
What it does:
  • Reacts with :eyes: and posts a Writing… placeholder right away
  • Reads at most 20 Slack messages and retrieves at most 8 snippets per run
  • Calls the LLM only when the evidence clears a configured floor
  • Replies to the exact channel and thread from the validated webhook payload
  • Neutralizes mass mentions and caps the length of what it posts
  • Adds a delivery marker to each reply to guard against processing the same event twice
  • Returns the reply instead of posting it when called with delivery: "return"
The Pinecone integration is required. You still upload your playbooks in Pinecone, because the integration exposes retrieval, not file upload.

How it works

1

Validate before calling any tools

The input is a bounded Slack event_callback object. Biblos rejects an event from a channel that isn’t allowlisted, or one a bot wrote, before it reads Slack, Pinecone, or the LLM.
2

Read one thread

conversations.replies reads at most 20 messages from the thread the mention came from. Biblos treats Slack text as untrusted content, never as authority to change its tools, recipients, or policy.
3

Retrieve, then decide

The mention and the thread context become one query. Pinecone returns at most eight snippets. Deterministic code applies the minimum score and the minimum number of snippets before the LLM is allowed to write anything.
4

Reply or refuse

With enough evidence, Biblos writes one short answer grounded only in the selected snippets. Without it, Biblos sends its fixed “above my head” reply. Where it can, Biblos updates the placeholder in place.

Build the agent

Define the webhook contract

Keep the variants inside an object-root schema. Unknown fields in the Slack envelope are stripped before orchestration or prompt construction:
The channel and thread always come from this validated envelope. Don’t add a separate destination the caller controls.

Register only the operations you need

Register each Slack operation the agent uses with guildServiceTool("slack", ...) rather than importing a Slack tool package. The published source includes the complete endpoint metadata and response schemas, and pins each operation to a specific integration version:
For readability, this excerpt shows only the thread-read, final-post, and retrieve contracts. The same file also registers reactions.add and chat.update, which the orchestration below uses. Copy the complete definitions from agent.ts when you build a fork. Before you adapt these definitions, confirm the current schemas:

Gate the evidence deterministically

Evidence selection is synchronous, can be tested on its own, and runs before the LLM:

Acknowledge, retrieve, and reply

The two Slack acknowledgements are independent, so the agent sends them together with task.gatherSettled. The tool calls are written inline in the array, so no unresolved call is held in a variable across a suspend:
The published implementation wraps each stage in bounded failure handling, so credential, history, retrieval, synthesis, and posting failures stay distinguishable without exposing raw provider errors.

Export the agent

Set it up

1

Add the agent

Open dkountanis~biblos on the Agent Hub and add it to a workspace.
2

Connect Slack

Connect a Slack credential, and use a credential policy to limit it to conversations.replies, reactions.add, chat.postMessage, and chat.update.
3

Build the library

Create a Pinecone Assistant and upload your approved playbooks to it.
4

Connect Pinecone

Connect a credential for dkountanis~pinecone-assistant with your Pinecone API key.
5

Set workspace variables

Add these workspace variables, using your own values:
6

Create the trigger

Create an event trigger for app_mention, limited to the same channels:
The empty --input passes the webhook payload unaltered, which is the input Biblos expects.
7

Ask a question

Check that the trigger is active, then mention Biblos in an allowlisted channel:
@Biblos How should I run LinkedIn outbound for this ICP?
The source includes examples/linkedin-outbound-playbook.md, a safe starter document for your first retrieval check.

Expected result

A question the library covers returns:
A question the library doesn’t cover also returns status: "replied", with usedLibrary: false and the fixed refusal text. A delivery or credential failure returns failed, and never claims a successful post.

Run it locally

From the agent’s directory:

Relevant code

Boundaries

Biblos doesn’t upload documents, administer Slack, send direct messages, or invent steps the library doesn’t contain. Each follow-up question has to mention the app, unless you deliberately configure a separate message trigger.

Event triggers

Run an agent when something happens in a connected service.

Slack

Connect Slack and the operations agents can call.

Coded agents

How TypeScript agents are structured and built.

Credential policies

Limit a credential to the operations an agent needs.