skills/beam/beam-tools/create-beam-agent/SKILL.md
Create a Beam AI agent from a YAML description by generating a JSON spec and deploying it via the complete graph API. Load when user says "create beam agent", "deploy beam agent", "build a beam agent", "create agent from yaml", or provides a YAML agent spec and wants it deployed to Beam.
npx skillsauth add beam-ai-team/beam-next-skills create-beam-agentInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Deploy a Beam agent from a YAML description using scripts/create_agent_from_prompt.py.
The skill translates the YAML into a typed JSON spec and calls the Beam complete graph API.
Before creating or deploying an agent, show the target workspace, agent name, graph/node count, integrations or external tools used, spec file path or summarized spec, dry-run result when available, and expected side effects. Require explicit user approval in the current turn. Drafting, validating, and dry-running the local spec do not require approval.
BEAM_API_KEY and BEAM_WORKSPACE_ID set in .envrequests Python package installed (pip3 install requests)scripts/create_agent_from_prompt.py (in project root)Entry node is always bare — no toolConfiguration, no params, no prompt. Objective = "Entry Node". If the YAML marks a processing node as is_entry: true, create a separate bare entry node and connect it to that processing node.
toolFunctionName is auto-generated by the script as GPTAction_Custom_{CamelCaseName} from the tool_name. Never set it manually in the spec.
Linked params use linked_node + linked_param in the spec (not linked_node_id as YAML may use). linked_node = the key of the source node in the spec.
Spec node keys = snake-case IDs matching the YAML id fields. The script generates all UUIDs — never put UUIDs in the spec.
on_error: "CONTINUE" only for non-critical nodes (e.g. Slack notifications). All others use "STOP".
{
"agentName": "string",
"agentDescription": "string",
"personality": "string",
"restrictions": "string",
"prompts": ["example prompt 1", "example prompt 2"],
"nodes": [
{
"key": "entry",
"objective": "Entry Node",
"is_entry": true,
"x": 250, "y": 0,
"edges": [{ "target": "first-processing-node", "name": "", "condition": "" }]
},
{
"key": "node-key",
"name": "Tool Display Name",
"objective": "What this node does",
"is_entry": false,
"x": 250, "y": 200,
"model": "BEDROCK_CLAUDE_SONNET_4",
"tool_name": "Tool Display Name",
"tool_description": "One-line description",
"prompt": "Full LLM instruction prompt",
"on_error": "STOP",
"enable_retry": false,
"retry_count": 1,
"retry_wait_ms": 1000,
"fallback_models": null,
"evaluation_criteria": [],
"input_params": [
{
"name": "param_name",
"description": "what this param is",
"type": "string|object|number|boolean",
"is_array": false,
"fill_type": "static|linked|user_fill|ai_fill",
"static_value": null,
"linked_node": null,
"linked_param": null,
"output_example": null,
"required": true,
"position": 0
}
],
"output_params": [
{
"name": "param_name",
"description": "what this output contains",
"type": "string|object|number|boolean",
"is_array": false,
"output_example": null,
"position": 0
}
],
"edges": [
{ "target": "next-node-key", "name": "Edge label", "condition": "" }
]
}
]
}
y=0, processing nodes at y=200, x increases by 300 per step| Value | When to use |
|---|---|
| static | Fixed hardcoded value — set static_value |
| linked | Flows from a parent node's output — set linked_node + linked_param |
| user_fill | User provides at runtime (first processing node inputs) |
| ai_fill | AI extracts from conversation context automatically |
BEDROCK_CLAUDE_SONNET_4 — default, fast, most tasksBEDROCK_CLAUDE_OPUS_4_5 — complex generation/reasoning"condition": """condition": "sum is odd" / "condition": "status is approved" etc.Read the YAML agent spec and extract:
name, description, personality, restrictions, promptsid (→ key), objective, x/y, on_error, retry settings, tool.*, edgesname, description, type, fill_type, static_value, linked_node_id (→ linked_node), linked_param, required, position, is_arrayname, description, type, is_array, positionApply the rules:
is_entry: false on all processing nodes (even if YAML said is_entry: true)linked_node_id → spec linked_node (uses the key / YAML id value)Write the spec JSON to /tmp/beam_agent_spec.json.
python3 scripts/create_agent_from_prompt.py --spec-file /tmp/beam_agent_spec.json --dry-run 2>&1 | head -30
Verify the node summary output looks correct (node names, input/output counts, linked params).
python3 scripts/create_agent_from_prompt.py --spec-file /tmp/beam_agent_spec.json
Report the Agent ID and Draft Graph ID to the user.
Given YAML with nodes: extract → transform → generate-report → notify
Spec nodes:
entry (bare, y=0) → extract-yardi-data (y=200, x=250) → transform-validate (y=200, x=550) → generate-report (y=200, x=850) → notify-team (y=200, x=1150)
| Error | Cause | Fix |
|---|---|---|
| Linked param 'node.param' not found | linked_node or linked_param typo | Check the source node's key and output param name match exactly |
| API Error 400 | Malformed payload | Run --dry-run, inspect JSON for missing fields |
| API Error 401 | Bad API key | Check BEAM_API_KEY in .env |
| Agent created but nodes empty | Wrong toolFunctionName prefix | Script auto-handles — ensure tool_name is set on every non-entry node |
create_agent_from_prompt.py
Usage:
python3 scripts/create_agent_from_prompt.py --spec-file FILE
python3 scripts/create_agent_from_prompt.py --spec-file FILE --dry-run
echo '<json>' | python3 scripts/create_agent_from_prompt.py
What it does:
- Pre-generates UUIDs for all nodes, tool configs, output params
- Resolves linked params by UUID lookup
- Builds originalTool block (required by API)
- POSTs to /agent-graphs/complete (draft status)
- Returns Agent ID, Draft Graph ID, Active Graph ID
tools
Build a Palantir-shape, PDF-native use-case proposal document for a sophisticated enterprise account: research-grounded use cases (each with description, challenge, impact, value), an operating-graph ontology page, a recommended PoC with a week-by-week plan, and a closing page that asks for one decision. Load when a client asks us to 'propose high-impact use cases', requests a use-case presentation/catalog for a function (finance, HR, ops), or when a technical evaluation team will review candidates to pick a PoC. NOT for single-account cold outreach (use prospect-brief), full process diagnostics (use operating-diagnostic), or priced proposals (use proposal-creation).
development
Convert Beam Figma slide designs into high-fidelity, editable HTML presentation decks. Use when Codex is asked to audit Figma slides, extract slide templates, rebuild Beam slides as HTML decks, decide whether Figma imagery should be exported or rebuilt in HTML/CSS, create Beam/Prism-compatible deck templates, or improve fidelity of existing Beam HTML slide rebuilds.
development
Use the Beam AI reusable slide library: individual HTML slide templates extracted from Beam Figma rebuilds, kept separate from deck themes and full deck templates. Load when the user asks for a slide library, specific Beam slide patterns, reusable Figma-inspired slides, Prism slide-library items, or slide-level HTML templates.
development
Use Beam AI deck and report design packs, HTML templates, and curated examples to create sales decks, customer intro decks, RPO decks, and DIN A4 use-case proposal reports. Load when the user asks for Beam-branded presentation templates, Prism-compatible deck templates, Beam report templates, customer intro decks, commercial proposals, or reusable HTML deck/report examples.