AI assistant (talk to outsend)
Describe what you want in plain language; the assistant composes a validated, ready-to-launch pipeline. Free daily allowance to start, then your own key (BYOK), with automatic model fallback on Anthropic.
The AI assistant turns a plain-language request ("scrape the email of 1000 plumbers in Brittany") into a validated pipeline, ready to launch. It never launches anything itself: it fills the pipeline editor and you click Launch (which re-checks the EF cost gate).
It lives behind the AI button in the pipeline editor and is exposed as POST /api/ai/agent.
How it works (multi-layer)
you (plain language)
│
▼
┌─────────────────────┐
│ LLM planner │ picks ONE tool (see below), using a system prompt
│ (free or your key) │ + tool catalog generated from the module registry
└─────────┬───────────┘
│ propose_pipeline
▼
┌─────────────────────┐
│ deterministic │ normalize → capability gate → pipeline validity
│ validator (server) │ → zone resolution → EF estimate
└─────────┬───────────┘
│ valid?
┌────┴─────┐
yes no ──► error fed back to the LLM, model escalates a rung, retry
│
▼
pipeline loaded in the editor → you click Launch (EF re-gated)
The LLM only ever acts through four tools — it never returns free-form JSON:
| Tool | When |
|---|---|
propose_pipeline |
it can build the pipeline (the server validates it) |
ask_clarification |
one question, only when a required piece is genuinely missing (no business, or no zone) |
cannot_fulfill |
the request targets a module that is coming_soon / alpha / on_demand, or is truly impossible |
report_issue |
a real bug or missing/contradictory doc → lands in the admin AI reports tab |
The validator is the safety net: whatever the model proposes, the server re-checks structure, module compatibility, zone resolution (in the selected country), capability status, and EF cost. An invalid proposal is never launchable.
What the assistant does (and doesn't)
- Linear pipelines only (alpha). The assistant builds a single straight chain of blocks — no parallel branches (fan-out) during the alpha (parallel scraping isn't supported yet). It's enforced both in the prompt and in the server validator. Parallel branches are planned for later to speed large runs.
- Minimal by design. It adds only the blocks your request needs — it won't bolt on enrichments (tech stack, socials, reviews) you didn't ask for.
- Volume = stop at the source. When you give a number, the assistant sets a
stop_aton the scrape: it stops once it has that many businesses (it never scrapes a whole region then trims to keep a few). Everything scraped is then enriched to the end — nothing is wasted. It briefly estimates the usable yield (only businesses with a website yield an email, so a share won't). No number on a broad scope → it offers clickable volume suggestions instead of a silent cap. The cost estimate reflects thestop_at, so wanting ~500 never costs like scraping 100k. - Per-step explanation. Each block comes with one short line saying why it's there and what it adds — so you understand the pipeline at a glance, not a wall of text.
Models & automatic fallback
Anthropic (Claude) — automatic escalation ladder. The default starts on the cheapest capable model and climbs one rung automatically on each validation failure:
Haiku 4.5 → Sonnet 4.6 → Opus 4.8
(default) (1st fallback) (2nd fallback)
- A request is first tried on Haiku (the cheapest rung). If the validator rejects the result, the assistant automatically retries on Sonnet, then Opus. Most requests succeed on the first rung; only the harder ones climb.
- If you force a specific Claude model, the ladder starts at that rung and still climbs to Opus.
- Fable is never used by the assistant.
Other providers (OpenAI-compatible BYOK). The assistant uses the model you selected, with no cross-provider escalation (a single rung). The provider's own routing/fallback, if any, applies — outsend does not switch you to another vendor.
This means the "model fallback is automatic for Claude", while for other providers you stay on your chosen model.
Free trial, then BYOK
You can use the assistant straight away, without any API key. New accounts get a free daily allowance of AI messages (chat and assistant combined) running on outsend's own key — enough to build your first searches on day one. The remaining count is shown above the input.
Once the allowance is used up for the day, the assistant asks you to add your own API key (Bring Your Own Key) — then there is no message limit at all: you pay your provider directly, and only your own AI spending caps apply. See BYOK.
| Free allowance | Your own key (BYOK) | |
|---|---|---|
| Who pays | outsend | you, your provider directly |
| Limit | N messages/day, resets at midnight UTC | none (only your own spending caps) |
| Model | fixed (a fast, cheap one) | any model your key can reach |
Your key is stored encrypted, and every LLM call — free allowance or BYOK — is metered and bounded server-side. Because the cheapest model is tried first and the loop is bounded (it abandons gracefully after exhausting the ladder), cost per request stays low.
Your first search, already written
On a brand-new account, the assistant pre-fills the input with a search drafted from your access request — the trades you said you wanted to reach, in the area you mentioned. Read it, adjust anything, and press Send.
It is only a suggestion in a text box: nothing runs until you send it, and nothing is collected on your behalf. You remain in control of what gets searched, and when.
Capability-aware (honest refusals)
The tool catalog only contains active, pipelinable modules, generated live from the module registry. If you ask for something a module covers but that is not yet shipped, the assistant returns cannot_fulfill with the exact status — e.g. LinkedIn or SEO data → coming_soon, sending campaigns → on_demand, frozen financial module → alpha. If no module can do it by any means (opening hours, follower counts, non–Google-Maps sources, individuals), it returns impossible and suggests the closest available alternative.
Import requests
When you reference an existing list ("import my list", "here are some URLs", "my previous scrape"), the assistant proposes an import node with the right source (paste / url / from_job) — a skeleton. You drop your actual data into the import block in the editor, then launch. The skeleton is accepted at proposal time; the launch step requires the real data.
Future-proof
The assistant is driven by the module registry: its tools, capabilities, and refusals are generated from PIPELINE_NODES. Adding a new pipelinable module makes it automatically available to the assistant — no AI code changes. (See the product checklist: a clear config_schema label and an optional ai_hint line per module are all that's needed.)
Privacy
The assistant only sees your request text and the module catalog — never your scraped data or contacts.