Back to portfolio
detail
00 Problem · goal · constraints

Teams were expected to build AI agents. Shipping one still took weeks.

Contact-center operations span many internal services and complex configuration. Teams were encouraged to build agents, but each team still had to solve the same platform work before it could ship one.

System
Customer routing depended on configuration spread across thousands of expert collections and many internal services.
Problem
A starter kit created a beginning, not a production-ready agent.
Goal
Let teams add useful internal agents without rebuilding the runtime around them.
Result
More than 20 domain agents running through one gateway.
Framing · goals and non-goals
The goal was to remove the repeated engineering between an agent idea and a production workflow.
problem
Operational complexity
many services, APIs, and ownership boundaries

Even experienced teams could struggle to understand how the contact-center configuration fit together.

goal
Make agents fast to add
domain behavior over shared infrastructure

Teams should focus on instructions and API tools while the gateway handles the common runtime.

constraint
Internal workflows first
safe actions inside a large enterprise

Customer-facing agents introduced a different security and review surface. This project focused on internal users.

detail
01 The first agent

The project began with the Routing Configuration Agent.

Operators configured which support experiences a customer could see across chat, phone, and video. The work involved many forms and CRUD operations across internal APIs.

The first product A conversational copilot could read the application state, call the same APIs, and update the interface. One request replaced a long sequence of form changes.
safe configuration workflow
read
current stateretrieve the existing configuration
plan
proposed changesvalidate inputs and identify no-ops
confirm
operator approvalnothing changes before confirmation
execute
apply and reportcall the APIs and return the result
Business context
This was an operations agent, not a customer support chatbot.

The agent helped internal teams set up routing experiences before customers arrived. It combined product knowledge with API access so operators could describe the outcome they wanted instead of finding and completing each configuration form.

Why it was a good first use case The workflow had repeated steps, clear system state, and existing APIs. The agent could reduce interface work without replacing the systems that owned the data.
detail
02 The turning point

Building a second agent revealed the shared interfaces every team would need.

first agent
Routing Configuration Agent

Bring conversational configuration to the first UI page.

local need
second agent
Expert Configuration Agent

Apply the same agent pattern to a second UI page.

pattern appears
generic gateway
Extract the contract

Make the third agent an onboarding task instead of another platform build.

a few days
adoption
20+ agents

Teams add narrow or broad agents behind the same runtime.

organic growth
Gateway decision
The gateway reduced a new agent from weeks of platform work to 1–2 days.
PathWhat teams had to doResult
Build from scratchCreate a repo and service, add infrastructure, pass security reviewWeeks of work
Existing agent platformsSet up and operate an MCP server, then learn the platformHard to onboard
Agent GatewayWrite Markdown and select pre-integrated toolsAgent in 1–2 days
The product insight Remove infrastructure from the team's critical path. Let the gateway own the runtime while each team owns its domain behavior.
detail
03 Solution architecture

The gateway standardized the agent harness while teams controlled what their domain-specific agents did.

Web · Slack · MCP
services · CLI
Gateway
identity + state
Domain agent
selected by request
Shared adapters
and streaming
Tool policy
and audit
Internal APIs
GitHub · Slack
Architecture decision Domain behavior varied by team. Identity, state, authorization, streaming, and audit stayed consistent across every agent.
Onboarding contract
Teams supplied the domain behavior. The gateway supplied everything around it.

A team could add a narrow two-tool agent or a broad agent spanning dozens of operations. Both received the same interfaces, runtime behavior, and safety controls.

shared interfaces
Web, Slack, services, CLI, and MCP
multiple entry points out of the box

Each agent could be reached through ChatKit, Slack, service calls, a coding-agent workflow, or MCP.

shared runtime
Identity, state, and controls
streaming, authorization, and audit

Teams did not have to rebuild the production runtime around every new agent.

team owned
Domain behavior
instructions, tools, and access boundaries

Teams defined what their agent knew and could do while keeping ownership of their domain.

detail
04 Hardest challenge

Authorization had to follow every tool call.

Access to an agent did not imply permission to perform every action. The gateway checked the caller, request source, roles, and permissions when a tool executed.

request
User asks

The model can understand and plan the requested work.

agent remains discoverable
tool call
Policy checks

Validate the user and request source against the tool being invoked.

single enforcement point
allowed
Execute + audit

Call the API and record the action against the caller.

bounded action
denied
Explain next step

Return an actionable path to request the right access.

useful failure
Automatic authorization · guided fallback
When automatic authorization failed, the error became a ready-to-send access request.

The gateway first tried to authorize the tool call from its source, the caller's identity, and existing roles. If those checks failed, it returned the exact message and Slack channel needed to resolve the gap.

step 1
Try automatically

Check request source, caller identity, roles, and current permissions.

authorize when possible
step 2
Return a useful error

Tell the user: “Copy and paste this message in this Slack channel.”

request context included
step 3
Tag the Access Review Agent

The prepared message invoked the agent in the designated channel.

guided handoff
step 4
Resolve with the team

The agent worked with the platform team to identify the right permission for the requested action.

human-governed access
Control boundary The gateway first attempted to grant access automatically from the request source, identity, and existing policy. If that failed, the Access Review Agent investigated the request and recommended the appropriate permissions for human approval.
detail
05 Shared sessions

Agent work needed handoffs, not just transcripts.

One person could begin an operational task and let someone else continue it without recreating the investigation. Shared context worked across web, Slack, CLI, and service calls.

private by default
Caller-specific session

The thread key included the context, experience, and caller so normal conversations remained private.

collaborative when requested
Shared context ID

The caller was removed from the thread key so another person could resume the same agent state.

User starts work
in web
Shares the
context ID
Teammate resumes
in Slack or CLI
Catch up, then continue live Joiners could replay prior events and subscribe for new ones. The gateway stored conversation events, not downstream business data.
detail
06 Results

The gateway turned agent building from a project into an onboarding task.

20+
domain-specific agents running through the gateway.
1–2 days
to add an agent that once took weeks of setup.
Thousands
of hours of manual work saved each year.
~90 WAU
weekly active users in the measured window.
The strongest signal Teams kept adding agents and people kept using them. The platform was removing real operational work, not just making agent demos easier.
System map
Many agents and clients shared one harness.
external entry points
Web UIperson-facing client
Slackoperator channel
A2A servicesservice callers
CLI agentslocal skill wrapper
MCP clientstool discovery surface
send requests to gateway
System boundary · AI Agent Gatewayshared harness
Gateway runtimenormalizes requests, resumes state, streams events
identity
thread state
agent router
tool policy
routes work to domain agents
Access Review Agentpermission investigation
Routing Configuration Agentrouting setup workflows
Workforce Supervisor*delegates staffing questions
asks supplyasks skill fit
Capacity Agentsupply and availability
Expert Agentskills and routing fit
Expert Collection Agentcollection operations
* Earlier architecture. Later replaced by skill-based loading.
executes approved tool calls against shared systems
domain services and shared tools
Routing Configuration Serviceread and write routing configuration
Expert Configuration Serviceread and write expert settings
Expert Collection Serviceread and write collection data
GitHubread and write configuration
Slackpost messages and handoffs
detail
07 What I would do differently

Prefer skills over supervisors, and load tools with them.

Today, every agent starts with its full tool catalog. Dynamic skills could load the instructions and associated tools needed for each turn.

current model
Supervisors and upfront tools

Each new domain can add another agent handoff. Every tool is also loaded before the request needs it.

skill-based loading
Instructions and tools on demand

Select the skill needed for the turn, then load only its guidance and associated tools. Leave the rest unloaded.

Why this is better Domain knowledge stays composable. Smaller context and tool surfaces should make behavior easier to inspect, tune, and authorize.
← → advance · detail toggle / space flips detail
1/8