Agentic Platform Engineering: AI Agents as the Self-Service Layer in 2026
Internal developer portals promised self-service infrastructure through forms and templates. The next iteration replaces the form with a conversational agent that understands intent, applies platform guardrails, and provisions correctly — closing the gap between what developers ask for and what golden paths actually need.
Platform engineering's core promise — developers self-serve infrastructure without filing a ticket to the platform team — has always had a gap between the promise and reality: a Backstage form with 15 fields still requires the developer to know which options are correct for their use case. An agent that understands "I need a Postgres database for a service that'll get moderate write traffic and needs point-in-time recovery" and translates that into the right golden-path template with the right settings is the next iteration of that self-service layer.
From Forms to Conversational Provisioning
Traditional IDP self-service:
Developer opens Backstage form → fills in 12 fields, half of which
they're not sure about → submits → platform team's template applies
defaults for whatever the developer left ambiguous
Agentic self-service:
Developer describes intent in natural language → agent asks
clarifying questions where genuinely ambiguous → agent selects
the correct golden-path template and fills parameters →
generates a PR against the platform's IaC repo for review
The agent doesn't bypass platform guardrails — it still generates a PR that goes through the same review/approval flow a manually-filled form would. The difference is translating fuzzy developer intent into the correct structured request, instead of making the developer guess which of 12 form fields matter for their case.
Intent-to-Template Translation
import anthropic
import json
client = anthropic.Anthropic()
TRANSLATE_PROMPT = """A developer wants to provision infrastructure. Translate
their request into a specific platform golden-path template and parameters.
Developer request: "{request}"
Available golden-path templates and when to use them:
{template_catalog}
Platform guardrails that must be respected (non-negotiable defaults):
{platform_guardrails}
Determine:
1. Which template matches this request
2. What parameters to fill, based on what the developer said
3. What is genuinely ambiguous and needs a clarifying question before proceeding
(don't guess at things that materially affect cost or reliability)
Respond with ONLY valid JSON:
{{"template": "...", "parameters": {{}}, "clarifying_questions": [...],
"ready_to_generate": true/false}}"""
def translate_request(request: str, template_catalog: dict, guardrails: dict) -> dict:
response = client.messages.create(
model="claude-sonnet-5",
max_tokens=1000,
messages=[{
"role": "user",
"content": TRANSLATE_PROMPT.format(
request=request, template_catalog=template_catalog, platform_guardrails=guardrails
)
}]
)
text = response.content[0].text.strip()
if text.startswith("```"):
text = text.split("```")[1].replace("json", "", 1).strip()
return json.loads(text)Example Conversation
Developer: "I need a Postgres database for the new inventory service,
moderate write traffic, need to be able to restore to any point in the
last week if something goes wrong"
Agent: Matched template: postgres-managed-rds (not postgres-dev-lightweight,
based on "moderate write traffic" and the durability requirement)
Parameters filled:
- instance_class: db.r6g.large (moderate traffic tier per platform sizing guide)
- backup_retention_period: 7 (matches "restore to any point in the last week")
- multi_az: true (platform guardrail: required for any prod database per policy)
Clarifying question: "Is this for production or staging? This affects the
multi_az setting and estimated monthly cost (~$340/mo prod vs ~$85/mo staging)."
Developer: "production"
Agent generates PR against platform-infra repo:
templates/postgres-managed-rds/inventory-service.yaml
Ready for platform team review — matches golden path, no guardrail exceptions needed.
Where Guardrails Stay Non-Negotiable
PLATFORM_GUARDRAILS = {
"production_databases": {"multi_az": "required", "backup_retention_min_days": 7},
"public_endpoints": {"requires_waf": True, "requires_security_review": True},
"cost_ceiling_needs_approval": 500, # monthly $ threshold requiring explicit sign-off
}
def enforce_guardrails(generated_config: dict, guardrails: dict) -> dict:
"""The agent proposes, but hard platform policy always overrides
what a developer's natural-language request implied."""
if generated_config.get("environment") == "production":
generated_config["multi_az"] = True # Non-negotiable, regardless of what was asked
generated_config["backup_retention_period"] = max(
generated_config.get("backup_retention_period", 0),
guardrails["production_databases"]["backup_retention_min_days"]
)
if estimate_monthly_cost(generated_config) > guardrails["cost_ceiling_needs_approval"]:
generated_config["requires_manual_approval"] = True
return generated_configWhy This Still Generates a PR, Not a Direct Apply
The self-service promise isn't "skip review entirely" — it's "skip the tedious part of figuring out which template and settings apply to my specific situation." The agent's output is a pull request against the platform's infrastructure-as-code repository, going through the exact same CI checks, cost estimation, and platform team review as a manually-authored one. What changes is the developer experience getting there: a natural-language conversation instead of parsing a 15-field form and guessing at unfamiliar options, with the platform team's guardrails enforced identically either way.
Where This Genuinely Helps vs Where It's Just a Nicer Form
- Genuine improvement: developers who don't know the platform's specific terminology or sizing conventions get correctly routed without needing to read internal docs first — this is a real reduction in platform team support burden
- Marginal improvement: for developers who already know exactly which template and settings they want, a well-designed form isn't meaningfully slower than a conversation — the agent's value is concentrated in the ambiguous, "I'm not sure what I need" cases
More platform engineering content? Read our Internal developer platforms replace DevOps teams and Backstage vs Port vs Cortex IDP comparison.
Today I Fixed
Short real fixes from production — posted daily
Stay ahead of the curve
Get the latest DevOps, Kubernetes, AWS, and AI/ML guides delivered straight to your inbox. No spam — just practical engineering content.
Related Articles
Agentic DevOps: How AI Agents Will Autonomously Manage Infrastructure in 2026
AI agents that detect incidents, diagnose root causes, execute remediation, and write postmortems without human intervention are already running in production. Here is what agentic DevOps looks like and where it is heading.
Build an AI Kubernetes Cluster Migration Assistant with Claude API
Migrating workloads between Kubernetes clusters — a version upgrade via blue-green, a cloud provider switch, a region move — means translating manifests, checking for provider-specific dependencies, and sequencing the cutover safely. Build an assistant that plans this with Claude API.
Build an AI Kubernetes Upgrade Impact Analyzer with Claude API
Before upgrading a Kubernetes cluster version, know exactly what breaks. Build a tool that cross-references your live manifests, Helm charts, and CRDs against the target version's deprecation and removal list using Claude API, before you touch production.