Agent Studio

Draw agents, their tools, skills and helper agents as a flowchart, test them, and take the JSON into your code.

The Agent Studio is a tab in each console project that has the Agent Platform on. Each card on its board is an agent, a tool or a skill, and each arrow is a setting on the agent it starts from:

ArrowSetsAt run time
agent → tooltool_bindingsThe agent can call that service: search Knowledge, crawl a site, query a data source.
agent → skillskill_bindingsThe agent loads those instructions with load_skill when a task needs them.
agent → agentsubagent_bindingsThe first agent hands work to the second with its task tool and uses the answer.

One agent is marked Entry: the one the test chat talks to, and the one your code runs. The others are its helpers. Each agent picks the model it runs on; the list shows every model the platform has a key for.

The platform decides nothing on the arrows' behalf: an agent chooses which tool, skill or helper to use from its instructions and their descriptions. So write descriptions for the agent that reads them, and say in the instructions when to use what.

Test it

Test chat runs the agent you pick, drafts included, and the board lights up each agent, tool and skill as it's called. Each step in the reply opens to show what was sent and what came back.

Delegation has limits set by the platform: helpers can delegate on to their own helpers up to a depth (2 by default), and a run can hand off at most 5 times. An arrow past the depth limit is drawn dashed.

Use it in your code

Export gives two kinds of JSON.

One agent

Exactly the body agents.create takes. Its subagent and skill ids belong to the project, so use it with that project's key:

agent.json
{
  "name": "Support triage",
  "description": "Sorts incoming tickets and drafts first replies.",
  "system_prompt": "You triage support tickets for Acme. Ask the Billing agent about invoices.",
  "model_profile": "openweights:glm-5.3-flash",
  "tool_bindings": ["knowledge"],
  "subagent_bindings": ["4f1c…"],
  "skill_bindings": ["9a2e…"],
  "subagent_discovery": false,
  "skill_discovery": false
}
from aice_agent_platform import load_spec

agent = client.agents.create(load_spec("agent.json"))
client.agents.publish(agent["id"])

Every agent you build in the Studio already exists in the project, so you can also skip this and run it by the id shown in the Studio and on Get code.

The whole board

A bundle: every agent and skill on the board, linked by a readable ref instead of an id, so it can be recreated in any organization (staging to production, say). import_bundle creates the skills, then the agents from the last helper up to the entry agent, links them and publishes them:

board.json
{
  "format": "aice.agent-bundle/v1",
  "entry": "support-triage",
  "skills": [{ "ref": "refund-policy", "name": "Refund policy", "description": "…", "content": "…" }],
  "agents": [
    { "ref": "support-triage", "name": "Support triage", "subagent_bindings": ["billing"], "skill_bindings": ["refund-policy"], "…": "…" },
    { "ref": "billing", "name": "Billing", "tool_bindings": ["knowledge"], "…": "…" }
  ]
}
result = client.agents.import_bundle("board.json")
agent_id = result["entry_agent_id"]

A binding that isn't a ref in the bundle is kept as it is, so a bundle can point at agents or skills that already exist where it's imported.

Run it

thread = client.threads.create()
for chunk in client.runs.stream(
    thread["thread_id"],
    "agent_platform",
    input={"messages": [{"role": "user", "content": "My invoice is wrong"}]},
    config={"configurable": {"agent_id": agent_id}},
    stream_mode="messages-tuple",
):
    print(chunk.event, chunk.data)

See Streaming for reading the chunks, and Management API for every field and call.

On this page