Skip to main content
Tasks

Ship the logic. Skip the infrastructure.

Write a Python script and Aisle runs it on managed compute, with the schedule, secrets, retries, versions, and audit trail handled for you.

Build, deploy and run deterministic AI workflows in Python.

Complete with integrations, RAG, smarter retries, versioning and more.

Run AI Prompts

In Aisle, prompts are versioned entities with their model settings and revision logs attached. Call any by slug.

python
aisle.ai.run_prompt("classify-inbound", {
    "subject": email["subject"],
    "body": email["body"],
})

Call Integrations

Call integrations like Slack, Telegram, Asana, Jira and more. Each one is namespaced under aisle.integrations.

python
aisle.integrations.slack.create_message(
    channel="#sales-inbound",
    text="New lead from Acme",
)

Search Memory

Search and store agentic memories, or query an on-the-fly RAG database, with a single call.

python
aisle.memories.search(
    "Acme renewal",
    folder="crm-notes",
)

Run in Parallel

Fan a function over a list of items. Concurrency, retries, rate limits, and checkpoints are arguments.

python
aisle.parallel(
    handle, items=new_emails,
    concurrency=5,
    retry=aisle.RetryPolicy(max_attempts=3),
)

Track Revisions

Every save snapshots the script, input schema, and entrypoint together. Restore any from history.

Diff Versions

Compare any two revisions of a task line-by-line. Reviewable like a pull request.

Trigger a task from anywhere.

Run on demand, on a schedule, on an HTTP request, or in response to an event from any connected integration.

Manual / On-demandrun by hand
Schedulecron
APIHTTP endpoint
Bugsnagerror events
GitHubpush, PR, release
Gmailnew email
Google Newsnews topics
Jiraissue, comment
Microsoft Teamschannel message
Outlook Mailnew email
SERPsearch results
Slackmessage, mention
Telegrambot message
Webhookany HTTP POST
See all integrationsalso callable from any task

Distributing a task.

A task can hand its output to a person, return it to the calling system, write it into your knowledge base, or forward it to another service. You can also share the task itself or reuse it as a tool.

Output chat

Output a read-only or interactive chat, seeded with knowledge and a starting message so the recipient can ask follow-ups.

Sharing

Share the task with specific people or your whole organization.

Easier to maintain than a node graph.

A canvas is hard to manage. Changes are onerous and tough to follow. A task moves the problem into code, where logic is easier to reason about, faster to modify, and version tracking is fast and simple.

account-brief.workflow
The account-brief workflow on the Aisle canvas: chat trigger, search deals, set variable, collection loop with summarize tickets and create message, plus a template, X search, condition, and add-to-array sub-branch.
account-brief.py
# Find every open deal at this company.
company = aisle.inputs.get("company")
deals = aisle.integrations.pipedrive.search_deals(
    org_name=company,
)

# For each deal, grab news since the last run.
research = []
for deal in deals:
    news = aisle.ai.gemini_google_search(
        f"{company} news since {aisle.run.last_run_at}"
    )
    if news:
        research.append({"deal": deal, "news": news})

# Hand the lot to a saved prompt to write the brief.
brief = aisle.ai.run_prompt(
    slug="account-brief",
    research=research,
)

aisle.integrations.slack.send_message(
    channel="#revenue",
    text=brief,
)

Write your first task in the editor.

Free plan includes the runtime, integrations, and revision history.

Triage inbound sales emails every 15 minutes.

An example of a complete task: It runs on a schedule, classifies new email with a saved prompt, checks prior context in memory, and posts qualified leads to Slack.

triage-inbound-sales.py
*/15 * * * *
1def handle(email):
2 # Skip emails handled on a previous run (cache persists between runs)
3 if aisle.cache.get(f"seen-{email['id']}"):
4 return
5 
6 classification = aisle.ai.run_prompt("classify-inbound", {
7 "subject": email["subject"],
8 "body": email["body"],
9 })
10 
11 if classification["category"] == "qualified-lead":
12 notes = aisle.memories.search(email["from"], folder="crm-notes")
13 aisle.memories.store(
14 name=email["from"],
15 content=email["body"],
16 folder="crm-notes",
17 )
18 
19 aisle.cache.set(f"seen-{email['id']}", True)
20 
21new_emails = aisle.integrations.gmail.search_messages(
22 query="label:inbox is:unread newer_than:1d",
23 max_results=50,
24)
25 
26aisle.parallel(
27 handle,
28 items=new_emails,
29 concurrency=5,
30 retry=aisle.RetryPolicy(max_attempts=3, initial_backoff_ms=1000),
31)
  1. 1
    No imports

    No `pip install`, no requirements file. It is just the work.

  2. 2
    No credential code

    Gmail connects once on the task. Auth never appears in the script.

  3. 3
    Prompts by slug

    "classify-inbound" lives somewhere a non-engineer can edit.

  4. 4
    Memory in one line

    No vector database, no embedding model to pick.

  5. 5
    Retries as a parameter

    Concurrency, backoff, and rate limits in one place, not a task queue.

Write your first task.

Open the editor, write a script, and run it against your connected accounts.

Start building