> ## Documentation Index
> Fetch the complete documentation index at: https://phaseo.app/docs/llms.txt
> Use this file to discover all available pages before exploring further.

> ## Agent Instructions
> Phaseo Gateway base URL: https://api.phaseo.app/v1. Send `Authorization: Bearer $PHASEO_API_KEY` with every request.
> Model IDs look like `provider/model`, for example `openai/gpt-6-astra`. Do not guess IDs: list them with `GET /v1/models` or check https://phaseo.app/models. `phaseo/free` routes to an available free model and needs no wallet balance.
> For new text integrations prefer `POST /v1/responses`. `POST /v1/chat/completions` (OpenAI format) and `POST /v1/messages` (Anthropic format) suit existing code.
> The full API contract is https://phaseo.app/docs/openapi/v1/openapi.yaml. Official SDKs: `@phaseo/sdk` (TypeScript) and `phaseo` (Python), plus Go, C#, PHP, Ruby and Rust.
> Search these docs over MCP at https://phaseo.app/docs/mcp, and install Phaseo skills with `npx skills add https://phaseo.app/docs`. If a page is wrong or out of date, report it with the MCP `submit_feedback` tool.
> Manage Phaseo accounts with the `phaseo` CLI (`npm install -g @phaseo/cli`, then `phaseo login` or `phaseo login --device-code`), the `/v1` Management API or the MCP server at `https://mcp.phaseo.app/mcp?access=manage`. Do not send users to the dashboard for account tasks. A person is still needed for sign-up, approving a sign-in, paying the first top-up on the checkout link that `phaseo credits add` returns when no card is saved, confirming each saved-card top-up from the emailed link, and account security (password, MFA, passkeys). Create API keys with `phaseo keys create --name <name> --json`; never guess one. Credit top-ups need `phaseo login --scopes billing:write` first. Task map: https://phaseo.app/docs/v1/developers/manage-from-an-agent.md.

# Slack Agent

> Add the Phaseo agent to Slack so your team can ask it questions, answered by the model you choose.

> [!NOTE]
>
> The Slack agent is rolling out to workspaces gradually. If **Settings → Slack** doesn't appear in your settings yet, it isn't available to your workspace yet.

The Phaseo agent answers questions in Slack. Mention it in a channel or send it a direct message, and it replies in the thread, streaming the answer as it writes. It uses the model you choose in Phaseo, can search the web and read web pages, and can tell linked members about your workspace's Phaseo spend, credits, API key usage and models. It can also post charts and images it makes, read images and PDFs you share with it, and search your Slack workspace for you.

Owners and admins add it from **Settings → Slack**, choose who can use it and set its limits. You pay a monthly price for the people who used it, and model tokens are billed like any other gateway request.

## Before you start

* You need to be an owner or admin of the Phaseo workspace, and allowed to add apps to your Slack workspace.
* Open **Chat** once and review your workspace's privacy settings. Phaseo asks for this before the first install.
* Add [credits](https://phaseo.app/settings/credits). The monthly charge and the agent's model tokens are paid from them.

## Add the agent to Slack

**1. Choose how it works**

Open **Settings → Slack**. Under **Add to Slack**, choose the model, who can use the agent, where it can share usage data, and its [limits](#limits). If your workspace has Auto Routing, **Auto** lets Phaseo pick a suitable model for each question; otherwise choose a specific model. You can change all of this later.

**2. Approve it in Slack**

Select **Add to Slack**. Slack shows the permissions the agent asks for. Approve them, and Slack sends you back to **Settings → Slack**, which now shows the installation.

**3. Ask it something**

In Slack, open the agent from your apps and send it a message. To use it in a channel, invite it with `/invite @Phaseo`, then mention it.

Installing creates two things in your Phaseo workspace:

* **An API key for the agent.** Phaseo manages it, so it doesn't appear on the Keys page. The agent's model tokens are billed through it.
* **A guardrail called Slack agent** on that key, which keeps Slack messages out of training (see [Data and privacy](#data-and-privacy)).

A Slack workspace can have the agent from one Phaseo workspace at a time.

## Use the agent in Slack

* **Direct messages:** open the agent from your apps in Slack and write in its **Messages** tab. It answers every message.
* **Channels:** invite the agent to a public or private channel, then mention it, for example `@Phaseo which model should we use to summarise call transcripts?`. It replies in a thread. Mention it again for each follow-up in that thread.

While it answers:

* It reads the newest part of the thread, up to your message, so it can follow the conversation. Slack lets it read 15 messages at a time, and lets Phaseo's app read about once a minute in each Slack workspace.
  * It always sees the thread's first message.
  * In a direct message, it reads the latest messages of your conversation with it.
  * In a channel, it reads the latest messages from the last 30 minutes at most.
  * When more messages were written than it could read, it's told that some are missing.
  * When Slack doesn't let it read the thread just then, it works from its own earlier replies in the thread.
* It answers one message at a time in each thread. Up to 5 more messages wait their turn; after that it asks you to wait for the earlier answers.
* Slack's stop button stops the answer it's working on.
* Each answer ends with the model and what the answer cost in model tokens, such as `Auto → GPT-6 Luna · $0.0031`. With **Auto**, the model it picked follows an arrow, and other models the answer used follow a +. A model's name links to its page on Phaseo, and the cost links to that answer's requests in **Logs**, which members of the Phaseo workspace can open.

## Choosing a model per message

Owners and admins can let people choose the model for a single message. In **Settings → Slack**, under **Model choice**, turn on **Let people choose a model per message** and add up to 10 models from the Phaseo catalogue. If your workspace has Auto Routing, **Include Auto** adds **Auto** to the list. The model under **Agent** still answers every other message.

To choose a model, start the message with `with <model>:` and name an allowed model by its name or ID:

```text theme={null}
@Phaseo with Claude Opus 5.5: check this incident summary for gaps
with openai/gpt-6-luna: draft a reply to this customer
```

* Only the allowed models are matched, ignoring case. The start of a name or ID is enough when only one allowed model has it, so `with claude:` works when one Claude model is on the list. An ID also works without its lab, such as `with gpt-6-luna:`.
* The agent answers that message with that model, without the `with …:` part, and the footer names the model that answered.
* If you name a catalogue model that isn't on the list, or the name fits more than one, the agent replies privately with the models you can choose and doesn't answer. That message isn't counted as an answer. A message that starts with "With …:" but names no model, such as "With regards to the invoice: …", is answered as usual.
* Each answer keeps the same [limits](#limits-on-each-answer), \$0.50 and 12 steps, whichever model answers. The model's tokens are billed at its own price.
* The **Slack agent** guardrail still applies. If no provider of the chosen model meets it, the agent says so instead of answering.

### Asking another model

While model choice is on, the agent can also ask one of the allowed models for a second opinion as it answers, for example when you ask what another model thinks:

```text theme={null}
@Phaseo draft a reply to this customer, then ask Claude Opus 5.5 to check it
```

* The other model only sees what the agent sends it. It doesn't see the Slack thread, and it can't search the web or use tools.
* The agent can ask other models up to 3 times in one answer. Their cost counts toward the same [\$0.50 limit](#limits-on-each-answer), and the agent stops asking when too little is left to finish its answer.
* The footer names every model used, such as `GPT-6 Luna + Claude Opus 5.5 · $0.0123`, and the cost includes them.
* If a model can't be used, for example because none of its providers meets the **Slack agent** guardrail, the agent is told why and answers without it.

### Comparing models

To see how 2 or 3 allowed models answer the same question, start the message with `compare`, the models separated by commas, and a colon:

```text theme={null}
@Phaseo compare GPT-6 Luna, Claude Opus 5.5: what are the risks of moving our database to another region?
compare gpt-6-luna, claude, auto: summarise the EU AI Act in five bullet points
```

* Models are matched like `with <model>:`, only from the allowed list. If a model isn't on the list, a name fits more than one model, you name fewer than 2 or more than 3, or there's no question after the colon, the agent replies privately and doesn't answer. That message isn't counted as an answer. A message that names no model at all, such as `compare the two plans, then pick one: …`, is ordinary text and the agent answers it as usual. While model choice is off, a `compare …:` message that names catalogue models gets a private reply that Compare is off, and isn't counted as an answer.
* Each model gets your question, not the rest of the thread, and can search the web and read web pages. They answer at the same time.
* The reply has a section for each model: its name, linked to its page on Phaseo, what it cost, and its answer. Each model is asked to keep its answer short, and long answers are cut so they all fit in one Slack message.
* If a model fails, its section says why, and the other answers are still shown.
* A comparison counts as one answer. The \[$0.50 limit](#limits-on-each-answer) is split evenly between the models, and the footer names them all and shows the total. The split only decides whether a model is asked: one isn't asked when its share is under $0.02. An answer isn't stopped at its share, so it can cost more; each model's reply is capped in length instead.

### Questions with buttons

When the agent needs you to choose between a few options or approve something before it goes on, it asks in the thread with a button for each option, up to 5. It can also offer **Other…**, which opens a small form for an answer in your own words.

* Only the person it's answering can answer. Anyone else who selects a button gets a private note.
* You can also reply in the thread instead (in a channel, mention the agent). Your reply is taken as your answer.
* Once you answer, the buttons are replaced with your answer and the agent carries on from where it stopped.
* A question waits for up to an hour. After that, the question says it expired and the answer ends there. Ask again when you're ready.
* Slack's stop button also works while it waits.
* While it waits, other people's messages in the thread wait their turn, and they're told privately who it's waiting for.
* One answer can ask up to 3 questions. The whole thing counts as one answer, and the [limits on each answer](#limits-on-each-answer) cover all of it, before and after each question.

### Home tab

Open the agent in Slack and choose **Home** to see how to use it, the model it uses, and whether your Phaseo account is connected. If it isn't, and connecting would help (with **Linked accounts only**, or where usage data is allowed), the tab has the **Connect your Phaseo account** button. Members of the Phaseo workspace who have connected their account also see how many answers the agent has given in the Slack workspace this month (UTC). The tab shows settings and counts only, never messages. It also lists the recurring tasks you set up, with their next run (see [Scheduled tasks](#scheduled-tasks)).

With your own Slack app, the Home tab needs the latest [manifest](#use-your-own-slack-app): `home_tab_enabled` set to `true` and the `app_home_opened` bot event.

## Charts, images and files

The agent can post charts and images in the thread, and read images and PDFs you share with it.

* **Charts:** ask for a chart, for example `@Phaseo chart our spend by week this month`. The agent draws a bar, line or pie chart from the numbers it has and posts it in the thread as an image. Chart text uses Latin and Cyrillic letters; anything else stays in its reply.
* **Images:** ask it to make one, for example `@Phaseo make an icon of a paper plane in blue`. It uses [GPT Image 2](https://phaseo.app/models/openai/gpt-image-2) through the agent's API key, billed like any other request. An image costs a few cents and counts towards the answer's \[$0.50 limit](#limits-on-each-answer), and the answer's footer includes it. One answer makes at most 2 images, and only while at least $0.15 of its limit is left.
* **Files you share:** attach images (PNG, JPEG, GIF or WebP, up to 5 MB each) or PDFs (up to 10 MB) to your message, or to earlier messages in the thread that the agent reads. It reads up to 4 files, 12 MB together, for each answer, newest first. Other file types can't be read yet.

The model has to read images or PDFs too. With **Auto**, the agent sends the files, and answers without them if the model it picks can't read them. With a specific model, the agent tells you when that model can't read the kind of file you shared.

Files you share are downloaded for the answer that reads them and never stored. Charts and images the agent posts are files in your Slack workspace, like any other.

### Update Slack permissions

Charts and images need Slack's `files:write` permission, reading files needs `files:read`, and [searching Slack](#searching-slack) needs `search:read.public` and `search:read.files`. If the agent was added before it could do these, it doesn't have them yet: it tells people an admin needs to update its permissions, and **Settings → Slack** shows **Update Slack permissions**.

1. Select **Update Slack permissions**. Slack shows the permissions the agent asks for.
2. Approve them for the same Slack workspace. Slack sends you back to **Settings → Slack**.

Updating keeps the agent's settings, API key, guardrail and history. With your own Slack app, add the scopes **Settings → Slack** lists to its [manifest](#use-your-own-slack-app) first.

## Searching Slack

The agent can search your Slack workspace for the person asking, and answer with links to the messages and files it used. For example:

```text theme={null}
What did we decide about the launch date?
@Phaseo find the latest incident review in #ops and summarise it
Who has been working on the billing migration this month?
```

* **It searches as you.** It uses Slack's real-time search with the permission Slack gives it for your message, so it finds only what you can see in Slack. It searches public channels only, never private channels, direct messages or group DMs.
* **It links what it uses.** Each message or file it relies on is linked, so you can open it in Slack. When a search finds nothing, it says so.
* **It can narrow a search** to a channel, a person or a date range, and searches up to 4 times for one answer, 10 results at a time.
* **By meaning or by keyword.** Questions in your own words are searched by meaning on Slack plans that include AI search (Business+ and Enterprise+); other plans search by keyword.
* **Only providers that keep no data.** Once an answer has searched Slack, the rest of it, including another model it asks or an image it makes, goes only to AI providers with zero data retention, so what it found never sits in a provider's logs. Web search and reading web pages are also off for the rest of that answer, so nothing it found can leave in a search or a link: ask it to search the web first if you need both.

Choose where it searches under **Slack search** in **Settings → Slack**. The change applies straight away.

| Option | Where it searches |
| - | - |
| **Off** | Nowhere. |
| **Direct messages** (default) | Only in direct messages with the agent, so only the person asking reads what it finds. |
| **Direct messages and channels** | In channels too, when someone mentions it. Everyone in the channel reads the answer, including guests who can't open the channels it found, so choose this only if that's fine for your workspace. |

A few limits come from Slack:

* It searches only when answering someone's message: Slack gives it permission to search with each message that mentions it or is sent to it directly, and the agent keeps that permission only until it has answered.
* Slack doesn't let apps search for guests, and the agent never searches for people from other companies.
* Slack lets each person search about 10 times a minute. When it's busier than that, the agent answers with what it has and says so.
* Slack allows this search only for apps in the Slack Marketplace and for a company's own apps. Phaseo's Slack app can search once its Slack Marketplace listing is approved; until then, the agent says search isn't available. To search now, use [your own Slack app](#use-your-own-slack-app).
* Installations from before search need [updated Slack permissions](#update-slack-permissions).

Search also needs a model that a provider with zero data retention can serve. With **Auto**, the agent can search: after a search, Auto picks only among models with a provider that keeps no data. The agent doesn't search with a model whose providers all keep data, and says so when asked. An admin can choose a model that keeps no data in **Settings → Slack**, or, when people can [choose a model per message](#choosing-a-model-per-message), start a message with `with <model>:` to use one. If the gateway reports after a search that no provider that keeps no data can answer, the agent stops there and says why (other failures, such as a missing provider key, get their usual message); what the answer cost so far still counts.

What it finds is used for that answer only and never stored (see [Data and privacy](#data-and-privacy)). For the same reason, an answer that has searched Slack can't stop to ask you a question, save notes, pins, to-dos or skills, set up a recurring task, or publish a shared page.

## Who can use it

Choose under **Who can use it**:

| Option | Who gets answers |
| - | - |
| **Everyone in Slack** (default) | Anyone in your Slack workspace, within your limits. |
| **Linked accounts only** | Only people who have linked their Slack account to a member of this Phaseo workspace. The agent sends everyone else a link to do it. |

Under **Limits**, **Allow guests** (on by default) lets guests in your Slack workspace use the agent, and **Allow people from other companies** (off by default) lets people from other organisations in shared Slack Connect channels use it. People in other workspaces of the same Enterprise Grid organisation count as your own people. The agent never answers bots or other apps.

### Link a Slack account

The agent sends people who aren't linked a private **Connect your Phaseo account** button:

* With **Linked accounts only**, when they message it. It doesn't answer until they connect.
* With **Everyone in Slack**, when they ask about usage where [usage data](#ask-about-usage) is allowed. It still answers what it can, and sends the button at most once per person in each thread. For a new button, ask in a new thread.

The button works for 15 minutes.

1. Select the button. Phaseo opens in your browser.
2. Sign in with an account that is a member of the Phaseo workspace that installed the agent.
3. Select **Connect account**.

A linked account also lets people ask about usage.

## Ask about usage

Linked members can ask the agent about this Phaseo workspace (anyone else who asks gets the [button to link their account](#link-a-slack-account)):

* requests and spend over a period, by day, week or month, and by model or provider;
* the credit balance, credits held for requests in progress, and credits spent this month;
* requests and spend for each API key;
* models in the Phaseo catalogue.

Dates are in UTC and weeks start on Monday. Choose where the agent may answer these questions under **Usage data**:

| Option | Where linked members can ask |
| - | - |
| **Off** | Nowhere. The agent never shares usage data. |
| **Direct messages** (default) | Only in a direct message with the agent. |
| **Direct messages and chosen channels** | In direct messages, and in the channels listed under **Channel IDs** (up to 100). |

Everyone in a channel can read the agent's answers, so list only channels whose members may see your workspace's spend. A channel's ID is at the bottom of its details in Slack, such as `C0123ABCD`.

## Memory and skills

The agent can remember what your team asks it to, and follow skills: instructions saved for tasks you repeat. Ask it in Slack, for example:

* `@Phaseo remember that deploys freeze on Fridays after 3pm`
* `@Phaseo pin this for everyone: our fiscal year starts on 1 April`
* `@Phaseo add a to-do: send the Q4 budget to finance`, and later `@Phaseo the budget to-do is done`
* `@Phaseo what do you remember about deploys?` or `@Phaseo forget the note about deploys`

It saves three kinds of note, each up to 500 characters and in its own words:

| Kind | What it's for |
| - | - |
| **Note** | Something to remember. The agent looks notes up when they're relevant. |
| **Pin** | Something to keep in mind all the time. The agent sees up to 10 of the conversation's pins and 10 workspace-wide pins with every message. |
| **To-do** | Something to track, which can be marked done. |

A note belongs to the channel or direct message it was saved in, unless someone asks for it to be workspace-wide. In a conversation, the agent sees that conversation's notes and the workspace-wide ones, never another channel's or direct message's. Workspace-wide notes are available to everyone in your organisation the agent answers. People from other companies in shared Slack Connect channels only see and save the notes for the conversation they're in, never workspace-wide ones; they can use saved skills but not save new ones, because skills apply to the whole workspace. A note can be kept until a date, such as `remember until Friday that the office is closed`, and is deleted after it.

The agent only saves a note when someone asks it to remember, pin or track something, or for a lasting fact such as a decision or a deadline. It never copies whole messages or threads.

### Skills

A skill is a name, a one-line description and instructions of up to 4,000 characters for a task your team repeats, such as a weekly report. Ask the agent to save one:

`@Phaseo save a skill called Weekly report: list what shipped this week, then what slipped, then next week's priorities`

With every message, the agent sees the names and descriptions of the 20 most recently changed skills. It loads a skill's instructions when a request matches it, or when someone asks, such as `@Phaseo use the Weekly report skill`. It only saves a skill when someone explicitly asks, and only replaces a skill with the same name when asked to.

### What admins control

* **Let the agent keep notes** (on by default, under **Memory and skills** in **Settings → Slack**) turns notes, pins and to-dos off. While it's off, the agent saves none and sees none, and tells people who ask it to remember something that an admin has turned memory off. Skills keep working. The notes already saved are kept, and owners and admins can still see and delete them; turn it back on and the agent uses them again.
* Each Slack workspace keeps up to 500 notes and 100 skills. When memory is full, the agent says so; delete some to make room.
* Owners and admins see everything the agent has saved under **Memory and skills** in **Settings → Slack**. They can filter notes by kind, delete any note or skill, and edit a skill's name, description and instructions. The workspace activity log records these changes without the text.
* Uninstalling the agent deletes all its notes and skills. Adding it again starts with an empty memory.

## Scheduled tasks

Ask the agent to do something regularly, and it sets up a recurring task in that conversation. For example:

* `@Phaseo every weekday at 9:00, summarise yesterday's news about electric vehicles`
* `@Phaseo every Monday at 8:30, list last week's Phaseo spend by model`
* `@Phaseo on the 1st of every month at 10:00, list the API keys nobody used last month`
* `@Phaseo which recurring tasks are set up here?` or `@Phaseo cancel the Monday spend summary`

The agent confirms what it set up: what it does, where it posts, how often, and when it next runs.

* **How often:** every hour (at the minute you choose), every day, on weekdays (Monday to Friday), once a week on a day you choose, or once a month on a day you choose (in shorter months, on their last day). Never more often than once an hour.
* **When:** at a local time in the Slack time zone of the person who set it up, also when the clocks change.
* **Where:** in the channel or direct message where it was set up. Each run posts a short **Scheduled: …** message there and answers it in the thread. Replies in that thread are ordinary messages to the agent.
* **What runs:** the agent saves the request as a self-contained instruction, so each run works without the conversation it was set up in. Scheduled runs don't ask questions with buttons or search Slack, and can't set up or change recurring tasks.

Each run is an ordinary answer to the person who set it up. The agent checks they can still use it, the run counts as one of their answers for your plan, the **Monthly spending cap** and **Answers per person per hour**, it keeps to the [limits on each answer](#limits-on-each-answer), and it ends with the usual footer.

When a run can't go ahead:

* If the agent has been paused in Phaseo, or a Phaseo bill is unpaid (**Payment due**), the run is skipped and the task carries on: it runs again at its next time once the agent is back on, with nothing to resume. These skipped runs don't count as failures, and **Settings → Slack** shows why the last run was skipped.
* If the person who set it up can no longer use the agent, or the agent can't post in the conversation any more (for example, it was removed from the channel), the run is skipped and the task is paused, with the reason in **Settings → Slack**.
* Any other run that doesn't go through, such as one refused because the **Monthly spending cap** is reached, counts as a failure. After 3 in a row the task is paused, and the agent tells the person who set it up in a direct message.

People can cancel the tasks they set up by asking the agent. Owners and admins of the Phaseo workspace who have [linked their Slack account](#link-a-slack-account) can cancel anyone's. People from other companies in shared Slack Connect channels can see a conversation's tasks but can't set them up. The agent's **Home** tab lists your own tasks.

### Recurring task settings

Owners and admins set these under **Recurring tasks** in **Settings → Slack**:

| Setting | What it does | Default |
| - | - | - |
| **Let people set up recurring tasks** | Turned off, nobody can set one up and none of them run. They're kept, and run again once you turn it back on. | On |
| **Most recurring tasks in this workspace** | From 1 to 100. Lowering it keeps the ones already set up. | 20 |
| **Who can set them up** | **Everyone who can use the agent**, or **Only people who connected their Phaseo account**. | Everyone |

The same section lists every task: what it does, where it posts, how often, its next run, who set it up and what its last run did. You can pause, resume or delete any of them. A resumed task runs at its next time, and its failures count from zero again. Uninstalling the agent deletes all its recurring tasks.

## Shared pages

When an answer is too long or too rich for a Slack message, such as a report, a table or a chart, the agent can publish it as a web page and link it in its reply. Ask for one, for example:

* `@Phaseo make a page comparing our spend by model this month`
* `@Phaseo turn the decisions in this thread into a one-page summary`

A page is one HTML file the agent writes, with text, tables and charts. Pages are static: before keeping a page, Phaseo takes out scripts, links, forms and anything that would load from elsewhere, such as fonts or images from other sites. So a page can't run scripts or send anything anywhere, and web addresses on it are plain text. Pages open on `slack.phaseo.app` in a locked-down sandbox, so a page can't reach your Phaseo or Slack sign-in.

| Who can view a page | How |
| - | - |
| **Anyone with the link** (default) | Anyone who has the link, without signing in. The link is long and random, so it can't be guessed. |
| **People in this Slack workspace** | Members of your Slack workspace, after they sign in with Slack. Guests can view it only while **Allow guests** is on, and people from other companies can't. A sign-in lasts 8 hours. |

The agent uses your admins' default unless someone asks for the other, for example `@Phaseo make it a page only our Slack workspace can see`.

### Page limits

* A page is kept for 30 days by default, then deleted. Admins can choose 7, 30 or 90 days for new pages.
* Each answer can publish up to 3 pages, and each Slack workspace keeps up to 200 pages at a time. A page can be up to 512 KB.
* Publishing is part of the answer: it costs nothing extra, and the model tokens spent writing the page count toward the answer's \$0.50 limit.
* People from other companies in shared Slack Connect channels can't publish pages.
* An answer that has searched Slack can't publish a page, because a page keeps what the agent wrote (see [Searching Slack](#searching-slack)).

### What admins control for pages

Under **Shared pages** in **Settings → Slack**:

* **Let the agent publish pages** (on by default) turns publishing off. Pages already published stay until they expire or you delete them.
* **Keep new pages for** 7, 30 or 90 days.
* **Anyone with the link can view pages** (on by default). Turned off, every page needs a Slack sign-in, including pages already published.
* **New pages are open to** sets the default when both options are available.
* The list shows each page's title, who asked for it, when it was published and when it expires, and how often it was opened. Owners and admins can delete any page, and its link stops working at once. They can open a page when its access lets them: a page for the Slack workspace needs them to sign in with Slack as a member. The workspace activity log records deletions without the title.

**People in this Slack workspace** needs Sign in with Slack for the Slack app the agent uses. Until it's set up, **Settings → Slack** says so, and pages are open to anyone with the link. With your own Slack app, its manifest must include the redirect URL `https://slack.phaseo.app/p/signin`, as Phaseo's manifest does (see [Use your own Slack app](#use-your-own-slack-app)).

## Limits

Owners and admins set these in **Settings → Slack**:

| Setting | What it does | Default |
| - | - | - |
| **Plan** | How many people a month the agent serves: up to 3, 10, 25, 50 or 100, or a number you choose above 100. | Up to 3 people |
| **When a new person would go over the plan** | **Refuse** tells the new person the plan is full. **Move up a plan automatically** lets the plan grow with the people who use the agent, up to **Most people a month**. | **Refuse** |
| **Most people a month** | A hard limit on people in a month, whatever the plan. It can't be lower than the plan. | No limit |
| **Monthly spending cap** | The most the agent's monthly charge can reach. When the next answer would go over it, the agent stops answering until next month. It must at least cover the plan's price. | Set when you install |
| **Answers per person per hour** | Stops one person using up the month. | 60 |
| **Model spend limit a month** | Caps what the agent's API key spends on model tokens each month. | No limit |
| **Allow guests** | Guests in your Slack workspace can use the agent. | On |
| **Allow people from other companies** | People from other organisations in shared Slack Connect channels can use the agent. | Off |

The **Agent** section sets the model and **Instructions**: extra guidance the agent follows in every answer, such as tone or what to focus on, up to 8,000 characters.

### Limits on each answer

Each answer stops after 12 steps or $0.50 of model spend, whichever comes first. A step is one model call and the tools it runs, such as a web search. Other models the agent asks, and the models in a comparison, count toward the same $0.50. When a limit stops an answer, the agent says so, and you can ask it to continue. These limits are the same for every workspace. Images the agent makes count towards the \$0.50 too.

## Pricing

You pay for the number of people who got at least one answer in the month (UTC). A person counts once a month, however many answers they get, and a month nobody uses the agent costs nothing.

| People who used the agent in the month | Price per month |
| - | - |
| 1 to 3 | \$0.99 |
| 4 to 10 | \$2.99 |
| 11 to 25 | \$4.99 |
| 26 to 50 | \$7.99 |
| 51 to 100 | \$14.99 |
| 101 to 1,000 | Rises evenly from $15 to $59, in whole dollars. For example, 200 people is $20 and 500 people is $35. |
| More than 1,000 | $59, or $0.045 per person in whole dollars once that is more (from about 1,300 people). For example, 2,000 people is \$90. |

Each person includes 300 answers a month, shared across the workspace. Answers beyond that cost \$0.25 per 1,000.

For example, if 8 people get 3,000 answers in a month, the price is $2.99 for up to 10 people. They have 2,400 answers included, so the other 600 answers cost $0.15, and the month's charge is \$3.14.

Model tokens aren't part of this price. They're billed through the agent's API key as normal gateway requests, at each model's price, as the agent answers. Limit them with **Model spend limit a month**.

### How you're charged

* The month's charge is taken from your credits in the first hours after the month ends, and never goes above the **Monthly spending cap**.
* **This month** in **Settings → Slack** shows the people, answers and estimated charge so far. Each charge appears under **Past charges** and in your billing transactions as **Slack agent**.
* If your credits can't cover the charge, it waits for credits, and the agent's status becomes **Payment due**. It stops answering until the charge is paid. Phaseo retries every hour, so answers resume within about an hour of adding credits. The amount is set at the first attempt.

## Emails to owners and admins

When the agent turns people away for a reason only an owner or admin can fix, Phaseo emails every owner and admin of the workspace:

| Reason | Email subject | What to do |
| - | - | - |
| The plan is full | Slack agent: someone new was turned away | Choose a bigger plan, or **Move up a plan automatically**. |
| **Most people a month** is reached | Slack agent: people limit reached | Raise or remove **Most people a month**. |
| The **Monthly spending cap** is reached | Slack agent: monthly spending cap reached | Raise the cap, or wait for next month. |
| A charge is unpaid | Slack agent: paused until the charge is paid | Add credits. |

Each email is sent at most once a month for each reason. It names no Slack user and quotes no messages.

Refusals of guests, people from other companies and the hourly limit aren't emailed. The workspace activity log records the first refusal each month for a full plan, **Most people a month** and the **Monthly spending cap**, and the first for each person for guests, people from other companies and the hourly limit. The agent's reply in Slack never says an admin has been told.

## Data and privacy

Slack's API terms don't allow training on Slack data or archiving it, so the agent is set up this way:

* **No message content in Phaseo's logs.** The agent's API key never stores request or response content, in logs, caches or telemetry, whatever your workspace settings. Its requests still appear in your usage and logs without content, with the [request labels](https://phaseo.app/docs/v1/guides/request-labels.md) `app=slack-agent`, `slack_team` and `slack_channel` and the [app title](https://phaseo.app/docs/v1/guides/app-attribution.md) `Phaseo Slack agent`.
* **No providers that train on prompts.** The **Slack agent** [guardrail](https://phaseo.app/docs/v1/cookbook/guardrails-for-api-keys.md) turns off training on paid and free models and prompt publishing, so providers that train on prompts are never used. Providers that keep logs without training on them can answer, and may keep message content in those logs under their own policies; Phaseo's own logs, caches and telemetry still keep no message content.
* **Short working memory.** For each thread, the agent keeps its recent replies, short notes about the tools it used, messages waiting their turn, the IDs (not the text) of the thread's recent messages so it knows where to read from, who it has sent the Connect button, and the questions it asked with their answers. They're deleted 7 days after the thread's last activity.
* **Memory you can see and delete.** The agent keeps the notes, pins, to-dos and skills people ask it to save, in its own words and never as copies of messages, with the Slack ID of the person who asked. They stay until someone deletes them, the date they were kept until passes, or you uninstall the agent. Owners and admins can see and delete them in **Settings → Slack**, and turn notes off there (see [Memory and skills](#memory-and-skills)). People from other companies never see workspace-wide notes.
* **Shared files are read, not kept.** The agent downloads the images and PDFs it reads for an answer and sends them to the model with that answer's requests, under the same rules. It never stores them; only their Slack file IDs and names are kept with the message until the answer ends.
* **Slack search results aren't kept.** What the agent finds when it [searches Slack](#searching-slack) goes to the model with that answer's requests and nowhere else: not in its working memory, its logs or Phaseo's database, not even while it waits for your answer to a question. From an answer's first search on, its requests go only to providers with zero data retention, so the results don't sit in a provider's logs either. For an answer that searched, its working memory keeps only which tools it used and a note that it answered, not what it searched for, what it found or what it wrote. Slack's permission to search for you is kept with your message until the answer ends.
* **Recurring tasks.** For each task, the agent keeps its title and instruction, where it posts, its schedule and time zone, the Slack ID of the person who set it up and how its last run went. They stay until someone cancels or deletes the task, or you uninstall the agent. Owners and admins can see, pause and delete them in **Settings → Slack**.
* **Shared pages until they expire.** A page the agent publishes can include what was said in Slack or what it found, but never Slack search results. Pages are static, so a page can't run scripts or send anything anywhere. Phaseo keeps the page, its title, the Slack ID of the person who asked for it and how often it was opened until it expires (after 7, 30 or 90 days, as your admins chose), an owner or admin deletes it, or you uninstall the agent. Anyone with its link can open it, or only signed-in members of your Slack workspace, as set for the page. Pages never appear in Phaseo's logs.
* **Nothing archived.** Phaseo doesn't archive anything from Slack. The agent's own logs keep Slack IDs and statuses only.
* **Encrypted secrets.** Bot tokens and your Slack app's secrets are stored encrypted and never shown again.

Uninstalling deletes the agent's API key, notes, saved skills and recurring tasks, and removes its guardrail. Its shared pages are deleted too, and their links stop working.

## Use your own Slack app

By default, the agent installs Phaseo's Slack app. To use a Slack app your company owns, for example with your own name and icon, create one from Phaseo's manifest.

**1. Create the app from the manifest**

In Slack's app settings ([api.slack.com/apps](https://api.slack.com/apps)), choose **Create New App**, then **From a manifest**. Pick your Slack workspace and paste the manifest below. You can change `name`, `description`, `long_description` and `display_name`; keep everything else. Slack may say the request URL isn't verified yet. That's expected until step 3.

**2. Save the app in Phaseo**

On the app's **Basic Information** page in Slack, copy its **App ID**, **Client ID**, **Client Secret** and **Signing Secret**. In Phaseo, open **Settings → Slack**, enter them under **Advanced: use your own Slack app**, and select **Save Slack app**.

**3. Point the request URLs at your app**

In Slack, open the app's **App Manifest** page. In both request URLs, replace `YOUR_APP_ID` with the app ID, for example `https://slack.phaseo.app/events/A0123ABCDEF`. Save, and verify the request URL when Slack asks.

**4. Install it**

In **Settings → Slack**, choose **Your Slack app** under **Slack app**, then select **Add to Slack**.

```json manifest.json theme={null}
{
  "_metadata": {
    "major_version": 2,
    "minor_version": 1
  },
  "display_information": {
    "name": "Phaseo",
    "description": "Ask the Phaseo agent questions in Slack, answered by the model your team chooses.",
    "background_color": "#0069a8",
    "long_description": "The Phaseo agent answers questions in Slack. Mention it in a channel or send it a direct message, and it replies in the thread with the model your workspace chose in Phaseo. It can search the web and read web pages, and linked members of your Phaseo workspace can ask about spend, credits, API key usage and models. It can also search your Slack workspace's public channels for the person asking, finding only what they can see (searching by meaning needs a Business+ or Enterprise+ Slack plan). Phaseo's request logs never keep message content, requests never go to providers that train on prompts, and a thread's working memory is deleted 7 days after its last activity. Owners and admins choose who can use it, its limits and its monthly spending cap in Phaseo settings."
  },
  "features": {
    "app_home": {
      "home_tab_enabled": true,
      "messages_tab_enabled": true,
      "messages_tab_read_only_enabled": false
    },
    "bot_user": {
      "display_name": "Phaseo",
      "always_online": true
    },
    "agent_view": {
      "agent_description": "Answers your team's questions with the model your Phaseo workspace chooses. It can search the web, and linked members can ask about Phaseo spend, credits, API key usage and models."
    }
  },
  "oauth_config": {
    "redirect_urls": [
      "https://phaseo.app/api/account/settings/slack/oauth/callback",
      "https://slack.phaseo.app/p/signin"
    ],
    "scopes": {
      "bot": [
        "app_mentions:read",
        "assistant:write",
        "chat:write",
        "im:history",
        "channels:history",
        "groups:history",
        "users:read",
        "files:read",
        "files:write",
        "search:read.public",
        "search:read.files"
      ]
    }
  },
  "settings": {
    "event_subscriptions": {
      "request_url": "https://slack.phaseo.app/events/YOUR_APP_ID",
      "bot_events": [
        "app_mention",
        "message.im",
        "agent_session_stopped",
        "app_uninstalled",
        "tokens_revoked",
        "app_home_opened"
      ]
    },
    "interactivity": {
      "is_enabled": true,
      "request_url": "https://slack.phaseo.app/interactions/YOUR_APP_ID"
    },
    "org_deploy_enabled": true,
    "socket_mode_enabled": false,
    "token_rotation_enabled": false
  }
}
```

| Setting | Value |
| - | - |
| Redirect URL | `https://phaseo.app/api/account/settings/slack/oauth/callback` |
| Event Subscriptions request URL | `https://slack.phaseo.app/events/YOUR_APP_ID` |
| Interactivity request URL | `https://slack.phaseo.app/interactions/YOUR_APP_ID` |
| Bot events | `app_mention`, `message.im`, `agent_session_stopped`, `app_uninstalled`, `tokens_revoked`, `app_home_opened` |

Phaseo asks Slack for exactly these bot token scopes when you install, so the app needs all of them:

| Scope | What it allows |
| - | - |
| `app_mentions:read` | See messages that mention the agent. |
| `assistant:write` | Work as an agent in Slack, with a status and a stop button while it answers. |
| `chat:write` | Post and stream answers. |
| `im:history` | Read direct messages sent to the agent. |
| `channels:history`, `groups:history` | Read the thread it was mentioned in, in public and private channels. |
| `users:read` | Check whether someone is a guest, a bot or from another organisation. |
| `files:read` | Read images and PDFs shared with the agent. |
| `files:write` | Post charts and images in the thread. |
| `search:read.public` | Search public channels for the person asking. |
| `search:read.files` | Include files shared in public channels in those searches. |

A few rules for your own app:

* Keep token rotation off, as in the manifest. Slack can't turn it off again once it's on.
* The manifest uses Slack's agent messaging experience (`agent_view`), the only one Slack offers new apps.
* A Slack app can be connected to one Phaseo workspace, and a Phaseo workspace can save one Slack app.
* While the agent is installed with your app, you can only replace its secrets. To switch to another app, or back to Phaseo's, uninstall first.
* The manifest's second redirect URL, `https://slack.phaseo.app/p/signin`, lets people sign in with Slack to view pages shared with your Slack workspace. If you created your app from an earlier manifest, add it on the app's **App Manifest** page.

## Pause or uninstall

* **Pause answers** in **Settings → Slack** stops every answer until you select **Resume answers**. People who message the agent get a private note that it's paused. Recurring tasks skip the runs that come due while it's paused, then carry on at their next time after you resume answers.
* **Uninstall** stops the agent straight away, deletes its API key, notes, saved skills and recurring tasks, removes its guardrail and removes the app from Slack. If Slack doesn't confirm the removal, Phaseo tells you, and you should remove the app in Slack too. The guardrail stays if you've added it to other keys or members.
* Uninstalling also deletes the agent's shared pages, so their links stop working.
* Removing the app inside Slack, or revoking its bot token, uninstalls it in Phaseo in the same way.

Past charges stay in your billing history. The people who used the agent in the month you uninstall are still charged when that month ends. You can add the agent again at any time.

## Troubleshooting

When the agent can't answer someone, it replies privately in Slack:

| Reply in Slack | Why | Fix |
| - | - | - |
| "The Phaseo agent is paused until this workspace's Phaseo bill is paid." | A past month's charge is waiting for credits (**Payment due**). | Add credits. Answers resume within about an hour. |
| "The Phaseo agent is paused in this Slack workspace." | An admin selected **Pause answers**. | Select **Resume answers**. |
| "…has answered as many people this month as this workspace's plan covers…" | The plan is full and new people are refused. | Choose a bigger plan, or **Move up a plan automatically**. |
| "This workspace has reached its Slack agent limit for the month." | **Most people a month** is reached. | Raise or remove the limit. |
| "…has reached this workspace's monthly spending cap…" | The next answer would go over the **Monthly spending cap**. | Raise the cap, or wait for next month. |
| "You've reached the limit of … answers an hour." | **Answers per person per hour** is reached. | Wait, or raise the limit. |
| "The Phaseo agent isn't available to guests in this workspace." | **Allow guests** is off. | Turn it on, if guests should use the agent. |
| "The Phaseo agent only answers people in this organization." | **Allow people from other companies** is off. | Turn it on, if they should use the agent. |
| "Connect your Phaseo account to use the Phaseo agent here." | Access is **Linked accounts only**. | [Link the Slack account](#link-a-slack-account). |
| "I'm still working through earlier messages in this thread." | 5 messages are already waiting in this thread. | Wait for those answers. |
| "Sorry, I couldn't check your Slack account just now." | Slack didn't answer a lookup. | Try again in a minute. |
| "The model chosen for this agent isn't available to the Slack agent." | The gateway can't use the agent's model with its key: **Auto** without Auto Routing, or no provider of the model meets the **Slack agent** guardrail. | Choose another model in **Settings → Slack**. |
| "…isn't one of the models you can choose here, so I didn't answer." | The message started with `with …:` and named a model that isn't under **Model choice**, or one that fits more than one allowed model. | Use a model from the reply's list, or leave out `with …:`. |
| "The model you chose for this message isn't available to the Slack agent." | The gateway can't use the chosen model with the agent's key, as above. | Ask without `with …:`, or replace the model under **Model choice**. |
| "The model this agent uses can't read the files shared here." | No provider of the agent's model reads the images or PDFs shared. | Ask without the files, or choose a model that reads images in **Settings → Slack**. |
| "I stopped here: after a Slack search, I can only use AI providers that keep no data…" | The answer searched Slack, and no provider of the model with zero data retention could answer. | Choose a model that keeps no data in **Settings → Slack**. If the message started with `with <model>:`, choose a model that keeps no data there, or leave it out to use the agent's model. |
| "…so I didn't compare them." or "Name 2 or 3 different models to compare…" | The message started with `compare …:`, and a model isn't under **Model choice**, a name fits more than one allowed model, or it named fewer than 2 or more than 3 different models. | Use 2 or 3 models from the reply's list. |
| "Comparing models isn't turned on here, so I didn't answer." | The message started with `compare …:` and named catalogue models, but model choice is off. | Ask an owner or admin to turn on **Let people choose a model per message** under **Model choice**, or leave out `compare …:`. |

If the agent doesn't reply at all:

* In a channel, make sure it's a member of the channel, and mention it in each message you want answered.
* It doesn't answer edited messages, bots or other apps.
* With your own Slack app, check that both request URLs end in your app ID, that Slack shows them as verified, and that the app is saved in **Settings → Slack**.

If the install doesn't finish, **Settings → Slack** says why. The most common reasons are a privacy review that hasn't been done yet (open **Chat** once) and a Slack workspace that already has the agent from another Phaseo workspace (uninstall it there first).

If a shared page doesn't open, it may have expired or been deleted: ask the agent for a new one. A page shared with your Slack workspace asks you to sign in with Slack; sign in with that workspace. Guests can open it only while **Allow guests** is on.


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.