<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: AK</title>
    <description>The latest articles on DEV Community by AK (@ak-writer).</description>
    <link>https://dev.to/ak-writer</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4165657%2F684d0825-1882-43be-bf36-2ca9acbaee3f.png</url>
      <title>DEV Community: AK</title>
      <link>https://dev.to/ak-writer</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/ak-writer"/>
    <language>en</language>
    <item>
      <title>Scheduled Tasks in Agent Kernel: Work That Runs Without Anyone Asking</title>
      <dc:creator>AK</dc:creator>
      <pubDate>Tue, 06 Oct 2026 11:09:02 +0000</pubDate>
      <link>https://dev.to/agent-kernel/scheduled-tasks-in-agent-kernel-work-that-runs-without-anyone-asking-4j09</link>
      <guid>https://dev.to/agent-kernel/scheduled-tasks-in-agent-kernel-work-that-runs-without-anyone-asking-4j09</guid>
      <description>&lt;p&gt;&lt;em&gt;By &lt;a href="https://github.com/induwara-yaala" rel="noopener noreferrer"&gt;Induwara Senadheera&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fkernel.yaala.ai%2Fimg%2Fblog%2Fscheduling-day-in-the-life.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fkernel.yaala.ai%2Fimg%2Fblog%2Fscheduling-day-in-the-life.png" alt="A day in the life of a scheduled agent: at 06:00 the overnight alerts are digested, at 08:00 the weekday nudge the user asked for in plain English arrives, at 12:30 a follow-up on the Acme lead booked three days earlier, at 17:00 Friday's weekly report, and at 23:00 the nightly data-quality sweep — all while the user was asleep, in a meeting, or on leave" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Imagine hiring a brilliant assistant who never speaks unless spoken to.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Ask them anything and you get a thoughtful answer in seconds. But say &lt;em&gt;"remind me about this on Monday"&lt;/em&gt; and they just stare back. No calendar. No alarm clock. No way to act unless you are standing there.&lt;/p&gt;

&lt;p&gt;That is every AI agent today. Agents are excellent at answering. The other half of real work is the part nobody is around to ask for: the 8am summary, the Monday report, the follow-up three days from now.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Agent Kernel gives your agent a clock.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  An Agent That Works While You Sleep
&lt;/h2&gt;

&lt;p&gt;Look at the day above again. Five pieces of work happened. Nobody sent a single message to start any of them.&lt;/p&gt;

&lt;p&gt;That is the entire shift. Your agent stops being something your team has to operate and starts being something that simply runs — the overnight digest waiting when the first person logs on, the lead that gets chased on the day it was worth chasing, the Friday report nobody has to remember to ask for.&lt;/p&gt;

&lt;p&gt;And crucially, &lt;strong&gt;you do not build a second system to get this.&lt;/strong&gt; No cron container. No scheduling microservice. No Lambda glued to the side of your agent, no second deployment pipeline, no second thing to page someone at 3am. Scheduling is a setting, not a project.&lt;/p&gt;

&lt;h2&gt;
  
  
  Just Ask. In Plain English.
&lt;/h2&gt;

&lt;p&gt;Here is the part that changes who gets to use this.&lt;/p&gt;

&lt;p&gt;Your users do not file a ticket. They do not learn cron syntax. They do not wait for an engineer. They just say what they want, the way they would say it to a colleague:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-X&lt;/span&gt; POST http://localhost:8000/api/v1/chat &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Content-Type: application/json"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{"prompt": "Every weekday at 8am in Asia/Colombo, remind me to review the overnight alerts.",
       "session_id": "ses-3", "user_id": "alice"}'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That is not a special scheduling endpoint. It is an ordinary message. The agent reads the intent, works out the rhythm, and books it — then tells the user it is done.&lt;/p&gt;

&lt;p&gt;Turn scheduling on and &lt;strong&gt;every agent quietly gains the ability to manage its own calendar of work&lt;/strong&gt;: creating a schedule, listing what it has booked, amending a time, pausing something, cancelling it outright. You write no tool descriptions and no glue code. Your agent's instructions never mention scheduling at all.&lt;/p&gt;

&lt;p&gt;Which means the capability arrives for the people who actually needed it — the ops lead, the account manager, the analyst — without any of them going through engineering first.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Teams Are Using It For
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Reminders and nudges for real people.&lt;/strong&gt; The agent books work on someone's behalf and handles it when the time comes. "Check in with me about this on Monday." "Every weekday at 8am." The kind of thing a good assistant does without being reminded to.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Recurring reporting.&lt;/strong&gt; Overnight alert digests, Monday morning summaries, the Friday wrap-up. Work that always happened on a rhythm and always depended on a human remembering to kick it off.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Customer follow-ups.&lt;/strong&gt; Chase a lead in three days. Revisit a ticket that has gone quiet. Flag a renewal before it lapses. The follow-ups that slip through are the ones nobody scheduled.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Unattended operations.&lt;/strong&gt; Nightly data-quality sweeps, scheduled health checks, cleanup that runs and writes up what it found. The agent does the pass and leaves you the summary.&lt;/p&gt;

&lt;h2&gt;
  
  
  Nothing Gets a Second-Class Path
&lt;/h2&gt;

&lt;p&gt;Here is the design decision underneath all of it: &lt;strong&gt;the agent never finds out it was scheduled.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A run that fires at 3am is, as far as the runtime is concerned, indistinguishable from a person typing at 3pm. So every guardrail you configured still applies. Every safety check still runs. Tracing, logging, memory, tools — all of it behaves exactly as it does live, because to the system it &lt;em&gt;is&lt;/em&gt; live.&lt;/p&gt;

&lt;p&gt;This matters more than it sounds. Bolt-on schedulers tend to create a quieter, less supervised back door into your agent, precisely at the hours when nobody is watching. There is no such door here. &lt;strong&gt;Your agent code needs no scheduling branch, because it has no way to detect one.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Nothing happens in the dark, either. Every scheduled task belongs to a specific user, every run is traceable back to the task that produced it, and cancelling something keeps the record — so the history of what was scheduled, and by whom, survives.&lt;/p&gt;

&lt;h2&gt;
  
  
  From Your Laptop to Production
&lt;/h2&gt;

&lt;p&gt;Start on a laptop with everything running inside a single process, nothing to stand up. When you go to production on AWS, managed timers and durable storage take over, so nothing is forgotten when a container restarts.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The application code is byte-for-byte identical between the two.&lt;/strong&gt; Only the configuration moves.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Bottom Line
&lt;/h2&gt;

&lt;p&gt;Scheduling is the difference between an agent that &lt;strong&gt;responds&lt;/strong&gt; and an agent that &lt;strong&gt;operates&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;One waits to be asked. The other shows up on Monday with the report already written, because someone mentioned it once, in passing, three weeks ago.&lt;/p&gt;

&lt;p&gt;Your assistant finally has a calendar.&lt;/p&gt;

&lt;p&gt;Agent Kernel is open source under Apache 2.0.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Scheduling documentation: &lt;a href="https://kernel.yaala.ai/docs/advanced/scheduling" rel="noopener noreferrer"&gt;https://kernel.yaala.ai/docs/advanced/scheduling&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Runnable example: &lt;a href="https://github.com/yaalalabs/agent-kernel/tree/main/examples/api/schedule-openai" rel="noopener noreferrer"&gt;&lt;code&gt;examples/api/schedule-openai&lt;/code&gt;&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;On AWS: &lt;a href="https://github.com/yaalalabs/agent-kernel/tree/main/examples/aws-containerized/openai-schedule" rel="noopener noreferrer"&gt;&lt;code&gt;examples/aws-containerized/openai-schedule&lt;/code&gt;&lt;/a&gt; · &lt;a href="https://github.com/yaalalabs/agent-kernel/tree/main/examples/aws-serverless/schedule-openai" rel="noopener noreferrer"&gt;&lt;code&gt;examples/aws-serverless/schedule-openai&lt;/code&gt;&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;GitHub: &lt;a href="https://github.com/yaalalabs/agent-kernel" rel="noopener noreferrer"&gt;https://github.com/yaalalabs/agent-kernel&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;code&gt;pip install "agentkernel[cron]"&lt;/code&gt; and give your agents a clock.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://kernel.yaala.ai/blog/scheduled-tasks" rel="noopener noreferrer"&gt;kernel.yaala.ai&lt;/a&gt; on September 14, 2026.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>agentkernel</category>
      <category>scheduling</category>
      <category>automation</category>
      <category>aiagents</category>
    </item>
    <item>
      <title>Your Cluster, Your Data, One Helm Chart: Agent Kernel on On-Prem Kubernetes</title>
      <dc:creator>AK</dc:creator>
      <pubDate>Tue, 06 Oct 2026 11:01:45 +0000</pubDate>
      <link>https://dev.to/agent-kernel/your-cluster-your-data-one-helm-chart-agent-kernel-on-on-prem-kubernetes-5g9g</link>
      <guid>https://dev.to/agent-kernel/your-cluster-your-data-one-helm-chart-agent-kernel-on-on-prem-kubernetes-5g9g</guid>
      <description>&lt;p&gt;&lt;em&gt;By &lt;a href="https://github.com/yaalalabs" rel="noopener noreferrer"&gt;Yaala Labs&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fe0307zb5zy0xy0kqcgf6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fe0307zb5zy0xy0kqcgf6.png" alt="Your cluster. Your data. One Helm chart. Agent Kernel on Kubernetes: a glowing honeycomb of pods with a ship's wheel at its centre sits inside a locked perimeter ring while AI agents drift in from outside. Callouts: air-gapped deployments, sandboxed code execution, scales with demand, bare metal, EKS, or laptop" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Some workloads are never leaving the building.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Patient records. Trade surveillance feeds. Customer data that a regulator, a sovereign-cloud mandate, or a signed contract says must stay on hardware you control. The teams responsible for that data are also, very often, the teams that already run Kubernetes: a platform group with a cluster, a GitOps pipeline, an on-call rota, and a firm opinion about anything that tries to route around them.&lt;/p&gt;

&lt;p&gt;Until now, Agent Kernel met those teams halfway. The Terraform modules for AWS, Azure, and GCP take an agent from laptop to production in one apply, but on-prem meant a Docker image and a set of environment variables, with the topology left as an exercise. That gap is closed. &lt;strong&gt;Agent Kernel now ships an official Helm chart&lt;/strong&gt; that deploys the full queue-execution pipeline to any Kubernetes cluster running 1.29 or later: bare metal in your data center, a managed EKS cluster, or a k3d cluster on your laptop. The chart is published as an OCI artifact with every release, versioned like the Python package, and your agent code does not change by a single line. Air-gapped clusters are supported out of the box, and the same chart ships a sandbox broker tier, so the code your agents write runs in sandboxed pods inside your cluster too.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why This Matters
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Data residency stops being a blocker.&lt;/strong&gt; The agents, the broker, the session store, and the sandbox all run inside your cluster. Nothing in the pipeline needs a managed cloud service.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Your platform team stays in charge.&lt;/strong&gt; The chart plugs into what they already run: Gateway API for ingress, cert-manager for certificates, KEDA for autoscaling, Prometheus for metrics. It deliberately installs none of those prerequisites itself, so nothing lands on the cluster behind their backs.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;It is the same pipeline you would run on AWS.&lt;/strong&gt; Per-session ordering, bounded retries, deduplication, graceful failure replies: identical semantics, because the transport is configuration, not code.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A quiet Tuesday and a busy Saturday need different fleets.&lt;/strong&gt; The agent tier scales on queue depth, the signal that actually tracks LLM-bound work, instead of CPU, which sits idle while requests back up.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Air gaps are a first-class case.&lt;/strong&gt; Two registry values (one for the application images and Valkey, one for the NATS subchart) and a per-release image manifest are all a disconnected cluster needs.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The Same Pipeline, Now in Pods
&lt;/h2&gt;

&lt;p&gt;If you read the &lt;a href="https://kernel.yaala.ai/blog/aws-queue-mode-scalability" rel="noopener noreferrer"&gt;AWS queue-mode post&lt;/a&gt;, the shape will look familiar. Every chat request still travels the five-stage path:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Request Handler → Input Queue → Agent Runner → Output Queue → Response Handler
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;On Kubernetes the chart splits those stages across two Deployments, with a third one optional:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Deployment&lt;/th&gt;
&lt;th&gt;What it runs&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;io-handler&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;The REST API (Request Handler) and the Response Handler that reads replies back off the output queue&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;agent-runner&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;The consumers that execute your agents: LLM calls, tools, retries&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;ws-gateway&lt;/code&gt; (optional)&lt;/td&gt;
&lt;td&gt;WebSocket delivery for the &lt;code&gt;async&lt;/code&gt; and &lt;code&gt;stream&lt;/code&gt; execution modes&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Traffic enters through a Gateway API &lt;code&gt;HTTPRoute&lt;/code&gt;, REST to the io-handler and WebSocket to the gateway. Valkey holds responses and sessions, NATS JetStream is the default broker, and both ship as condition-gated dependencies of their official charts, so a dev cluster gets them for free and a production cluster can point at the instances it already operates.&lt;/p&gt;

&lt;h2&gt;
  
  
  Your Images, the Chart's Wiring
&lt;/h2&gt;

&lt;p&gt;The chart runs &lt;em&gt;your&lt;/em&gt; images. Your &lt;code&gt;config.yaml&lt;/code&gt;, baked into the image, declares what runs: which agents, which framework, which execution mode. The chart injects where it runs as &lt;code&gt;AK_*&lt;/code&gt; environment variables. It is the same application and infrastructure split the ECS Terraform deployment uses, so an image built for one feels familiar on the other.&lt;/p&gt;

&lt;p&gt;Each image has a one-line entry point:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Image&lt;/th&gt;
&lt;th&gt;Entry point&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;io-handler&lt;/td&gt;
&lt;td&gt;&lt;code&gt;IOHandler.run()&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;agent-runner&lt;/td&gt;
&lt;td&gt;register your agent modules, then &lt;code&gt;AgentRunner.run()&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ws-gateway&lt;/td&gt;
&lt;td&gt;&lt;code&gt;WebSocketGateway.run(auth_validator=...)&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The &lt;a href="https://github.com/yaalalabs/agent-kernel/tree/develop/examples/k8s/openai-queue-mode" rel="noopener noreferrer"&gt;end-to-end example&lt;/a&gt; builds all three from &lt;code&gt;python:3.12-slim&lt;/code&gt; and walks the deployment on k3d, microk8s, and k3s. Kubernetes is not even required to exercise the wire behavior: the same pipeline runs as two local processes over docker compose under &lt;code&gt;examples/transport/nats&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Three Flavors, Zero Forked Templates
&lt;/h2&gt;

&lt;p&gt;Deployment flavors are values files over one set of templates. Every difference between a laptop and a data center is a value, never a fork.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Values file&lt;/th&gt;
&lt;th&gt;Posture&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;values-dev.yaml&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Micro-clusters (k3d, kind, microk8s, k3s): single replicas, auto-provisioned JetStream, TLS off, port-forward entry. The smallest profile is one pod with in-process queues and no backing services at all.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;values-baremetal.yaml&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Envoy Gateway class, cert-manager issuer annotations, NACK-managed JetStream objects, OpenEBS hostpath storage, MetalLB as the load balancer.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;values-eks.yaml&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;AWS Load Balancer Controller gateway classes, ACM certificates, EBS gp3 storage, Pod Identity. &lt;code&gt;nats&lt;/code&gt;, &lt;code&gt;kafka&lt;/code&gt;, and &lt;code&gt;sqs&lt;/code&gt; are all valid brokers here.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The flavor files ship inside the chart, which is what &lt;code&gt;helm pull --untar&lt;/code&gt; unpacks, so the values you start from always match the chart version you installed.&lt;/p&gt;

&lt;h2&gt;
  
  
  Pick Your Broker
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;transport.type&lt;/code&gt; selects the broker. The pipeline semantics do not move:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;nats&lt;/code&gt;&lt;/strong&gt;, the default and the recommendation on-prem. JetStream work-queue streams with one durable consumer per partition. Dev clusters auto-provision the streams at startup; production manages them declaratively through the chart's NACK custom resources and fails loudly if an object is missing, rather than creating one on the fly.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;kafka&lt;/code&gt;&lt;/strong&gt;, paired with the Strimzi operator. The chart renders the Kafka cluster, its node pool, and the topics as Strimzi resources, so the broker is part of the same release as the application.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;sqs&lt;/code&gt;&lt;/strong&gt;, for EKS. No broker to operate at all: pods authenticate through Pod Identity and the queues live in AWS.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Whichever you choose, a conversation's turns stay in order, a crashed runner leaves the turn on the queue for the next one, a retried request is not enqueued twice, and a turn that exhausts its retries produces a graceful error reply instead of a silent hang.&lt;/p&gt;

&lt;h2&gt;
  
  
  WebSockets That Survive a Rollout
&lt;/h2&gt;

&lt;p&gt;Streaming and push delivery are where most Kubernetes deployments of chat systems get awkward, because a socket is pinned to a pod and pods are disposable. The chart's &lt;code&gt;ws-gateway&lt;/code&gt; tier is built around that fact instead of against it.&lt;/p&gt;

&lt;p&gt;Gateway pods own the client sockets and enqueue chat frames directly onto the transport. When the Response Handler has a reply, or a single streamed token chunk, it looks up which gateway pod holds that user's connections in a shared connection store on the session backend and pushes to an authenticated internal endpoint on that pod. Replies reach every connection a user has open, on whichever pod holds it. Because the io-handler and agent-runner pods are never on the socket path, they can roll, scale, or crash without dropping a single connection.&lt;/p&gt;

&lt;h2&gt;
  
  
  Scaling on the Signal That Matters
&lt;/h2&gt;

&lt;p&gt;An agent turn is I/O-bound. The runner spends most of its life waiting on a model provider while requests pile up behind it, so CPU utilisation is the one metric that tells you nothing. The &lt;code&gt;agent-runner&lt;/code&gt; tier therefore scales on queue depth through KEDA: Kafka consumer lag, NATS JetStream pending messages, or SQS queue length, chosen automatically by the transport you configured.&lt;/p&gt;

&lt;p&gt;Two guardrails are baked into the defaults. &lt;code&gt;minReplicaCount&lt;/code&gt; is 1, because a runner cold start (image pull plus Python imports) is slow enough that scaling from zero would hurt the first customer of the morning. For the NATS and Kafka transports, &lt;code&gt;maxReplicaCount&lt;/code&gt; defaults to the partition count divided by consumers per pod, since past that point a new replica finds no free partition to claim; for SQS it defaults to 10. The &lt;code&gt;io-handler&lt;/code&gt; tier, which is request-bound, scales on plain CPU.&lt;/p&gt;

&lt;p&gt;Scaling down is as careful as scaling up. Runners observe SIGTERM, stop claiming work, and finish their in-flight turns within &lt;code&gt;terminationGracePeriodSeconds&lt;/code&gt;, which defaults to two minutes and should exceed your longest agent turn.&lt;/p&gt;

&lt;h2&gt;
  
  
  A Sandbox Worker Tier, Inside the Same Chart
&lt;/h2&gt;

&lt;p&gt;If your agents run code through the &lt;a href="https://kernel.yaala.ai/blog/agent-kernel-execution-broker" rel="noopener noreferrer"&gt;Execution Broker&lt;/a&gt;, the chart also deploys the queue-backed sandbox worker. Enable &lt;code&gt;sandboxWorker&lt;/code&gt; and a third consumer tier appears: it takes sandbox execution requests off their own queues on the same transport, runs each one through a sandbox provider (typically the &lt;code&gt;kubernetes&lt;/code&gt; provider, one pod per sandbox, running as a ServiceAccount the chart binds to nothing, so the RBAC you grant it is the security boundary), and returns completions into the shared response store. The tier brings its own ServiceAccount and RBAC, KEDA scaling on the sandbox backlog, and values-gated namespace hardening: Pod Security Admission, default-deny egress, and resource quotas.&lt;/p&gt;

&lt;p&gt;It also installs standalone. If your agents run in Lambda or ECS but code execution has to happen inside your own cluster, disable &lt;code&gt;ioHandler&lt;/code&gt; and &lt;code&gt;agentRunner&lt;/code&gt;, and the chart deploys only the sandbox worker. The agent side and the worker then meet solely on the shared sandbox queues and response store.&lt;/p&gt;

&lt;h2&gt;
  
  
  Built for Air Gaps
&lt;/h2&gt;

&lt;p&gt;Disconnected clusters get two things. &lt;code&gt;global.imageRegistry&lt;/code&gt; prefixes the application images and the Valkey subchart's; the NATS subchart reads &lt;code&gt;global.image.registry&lt;/code&gt; instead, so set both and every image the chart renders comes from your private registry. And every release attaches an &lt;code&gt;images.txt&lt;/code&gt; manifest listing those images for mirroring, generated by templating every flavor with every optional tier enabled. One exception: on the Kafka flavor the Strimzi operator pulls the broker images itself, so they are mirrored and configured through Strimzi, not this chart. The chart itself is an OCI artifact, so it copies into the same registry and installs by digest from there.&lt;/p&gt;

&lt;h2&gt;
  
  
  Observability Without Surprises
&lt;/h2&gt;

&lt;p&gt;Metrics and tracing ship as documented recipes rather than chart dependencies: a kube-prometheus-stack install, exporters for whichever broker you chose, and an OpenTelemetry Collector funnel that feeds the Langfuse, OpenLLMetry, and Pydantic Logfire tracing providers Agent Kernel already supports. Your existing monitoring stack keeps its job.&lt;/p&gt;

&lt;h2&gt;
  
  
  Get Started
&lt;/h2&gt;

&lt;p&gt;You need Helm 3.14 or newer (Helm 4 works too), a cluster on Kubernetes 1.29 or later, and your application images loaded where the cluster can pull them.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;helm pull oci://ghcr.io/yaalalabs/charts/agent-kernel &lt;span class="nt"&gt;--untar&lt;/span&gt;   &lt;span class="c"&gt;# unpacks the flavor values files&lt;/span&gt;
helm &lt;span class="nb"&gt;install &lt;/span&gt;ak oci://ghcr.io/yaalalabs/charts/agent-kernel &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-f&lt;/span&gt; agent-kernel/values-dev.yaml &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--set&lt;/span&gt; ioHandler.image.repository&lt;span class="o"&gt;=&lt;/span&gt;&amp;lt;io image&amp;gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--set&lt;/span&gt; agentRunner.image.repository&lt;span class="o"&gt;=&lt;/span&gt;&amp;lt;runner image&amp;gt; &lt;span class="nt"&gt;--set&lt;/span&gt; image.tag&lt;span class="o"&gt;=&lt;/span&gt;&amp;lt;tag&amp;gt;

kubectl port-forward service/ak-agent-kernel-io 8000:80
curl &lt;span class="nt"&gt;-s&lt;/span&gt; &lt;span class="nt"&gt;-X&lt;/span&gt; POST http://localhost:8000/api/v1/chat &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s1"&gt;'Content-Type: application/json'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{"prompt": "Hello", "session_id": "s1", "agent": "triage"}'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Without a &lt;code&gt;--version&lt;/code&gt; flag Helm resolves the latest published chart; add one to pin a release, and the &lt;a href="https://kernel.yaala.ai/docs/deployment/onprem-kubernetes" rel="noopener noreferrer"&gt;deployment guide&lt;/a&gt; always shows the current pinned command. One thing to know when you find the chart on GitHub: the package page shows a &lt;code&gt;docker pull&lt;/code&gt; command, because GitHub renders that box for every artifact in its container registry. Charts are installed with &lt;code&gt;helm&lt;/code&gt;, as above.&lt;/p&gt;

&lt;p&gt;Agent Kernel is open source under Apache 2.0.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;On-Prem / Kubernetes deployment guide: &lt;a href="https://kernel.yaala.ai/docs/deployment/onprem-kubernetes" rel="noopener noreferrer"&gt;https://kernel.yaala.ai/docs/deployment/onprem-kubernetes&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Chart README, with values, prerequisites, and flavors: &lt;a href="https://github.com/yaalalabs/agent-kernel/tree/develop/ak-deployment/ak-k8s" rel="noopener noreferrer"&gt;https://github.com/yaalalabs/agent-kernel/tree/develop/ak-deployment/ak-k8s&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;End-to-end example on k3d, microk8s, and k3s: &lt;a href="https://github.com/yaalalabs/agent-kernel/tree/develop/examples/k8s/openai-queue-mode" rel="noopener noreferrer"&gt;https://github.com/yaalalabs/agent-kernel/tree/develop/examples/k8s/openai-queue-mode&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;The chart on GHCR: &lt;a href="https://github.com/yaalalabs/agent-kernel/pkgs/container/charts%2Fagent-kernel" rel="noopener noreferrer"&gt;https://github.com/yaalalabs/agent-kernel/pkgs/container/charts%2Fagent-kernel&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Queue Mode Guide: &lt;a href="https://kernel.yaala.ai/docs/advanced/queue-mode-guide" rel="noopener noreferrer"&gt;https://kernel.yaala.ai/docs/advanced/queue-mode-guide&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;code&gt;helm install&lt;/code&gt; it on the cluster you already trust, and let the agents come to the data instead of the other way round.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://kernel.yaala.ai/blog/kubernetes-on-prem-helm-chart" rel="noopener noreferrer"&gt;kernel.yaala.ai&lt;/a&gt; on September 14, 2026.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>agentkernel</category>
      <category>kubernetes</category>
      <category>helm</category>
      <category>onprem</category>
    </item>
    <item>
      <title>Scaling Agent Kernel on AWS: Decoupling Request Handling from Agent Execution</title>
      <dc:creator>AK</dc:creator>
      <pubDate>Tue, 06 Oct 2026 10:59:59 +0000</pubDate>
      <link>https://dev.to/agent-kernel/scaling-agent-kernel-on-aws-decoupling-request-handling-from-agent-execution-56bg</link>
      <guid>https://dev.to/agent-kernel/scaling-agent-kernel-on-aws-decoupling-request-handling-from-agent-execution-56bg</guid>
      <description>&lt;p&gt;&lt;em&gt;By L. I. Kumara&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F0tpq76eqz5utgqkwlty6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F0tpq76eqz5utgqkwlty6.png" alt="Agent Kernel Queue Mode on AWS: a client's request travels Request Handler → Input SQS FIFO queue → Agent Runner → Output SQS FIFO queue → Response Handler, which either stores the reply in DynamoDB for rest_sync/rest_async or pushes it down a WebSocket for async/stream, deployed as three Lambda functions or two ECS services"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A busy restaurant never asks the person taking your order to also cook your meal.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Taking an order is fast: hear it, write it down, hand it off. Cooking is slow, and how long it takes depends on what was ordered and how many pans are free. Bundle both jobs into one role and a quiet Tuesday hides the problem completely — but on a packed Saturday night, the whole restaurant grinds to a halt, because the person taking orders is stuck at the stove.&lt;/p&gt;

&lt;p&gt;AI agents have exactly this problem. Answering an HTTP request is cheap and instant. Running an agent turn is not — it can chain several LLM calls, wait on tools, and take anywhere from a second to several minutes. Most teams build both into the same service, so the fast part and the slow part are forced to scale together, sized for whichever one is heavier that day. Agent Kernel now ships the fix as a configuration switch: a durable queue between request handling and agent execution on AWS, for both Lambda and ECS, with &lt;strong&gt;zero changes to your agent code&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why This Matters, Before the How
&lt;/h2&gt;

&lt;p&gt;Strip away the infrastructure talk and this is a customer-experience and cost problem:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Your busiest moments stop being your riskiest ones.&lt;/strong&gt; A traffic spike lengthens a queue instead of piling every request onto your AI model provider at once — no dropped connections, no cascading timeouts right when the most customers are watching.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;You stop paying to guess.&lt;/strong&gt; Request handling and agent execution scale independently, so you're no longer over-provisioning the fast, cheap part just to keep up with the slow, expensive part.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A crash doesn't cost you a conversation.&lt;/strong&gt; If something dies mid-turn, the request simply waits for the next available worker instead of vanishing.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A customer's message never gets answered twice&lt;/strong&gt;, even if their app retries a request or they double-click "send."&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A conversation stays in order&lt;/strong&gt;, even when hundreds of other customers' conversations are running through the system at the same time.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;None of this requires touching your agent's logic. It's a deployment setting, not a rewrite.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where the Simple Setup Runs Out of Road
&lt;/h2&gt;

&lt;p&gt;Agent Kernel's own deployment docs are direct about the tradeoff: the simplest AWS setup — one ECS service, or one Lambda function, handling both the REST API and the full agent turn — is scoped for "moderate traffic, simplest setup." Getting to "high throughput, long-running agents, backpressure control" means putting a queue between the two.&lt;/p&gt;

&lt;p&gt;When request intake and agent execution share a container or a Lambda invocation, there's also nothing standing between the caller and the model provider. Without a queue to absorb a burst, request volume maps straight onto provider call volume: a spike in traffic &lt;em&gt;is&lt;/em&gt; a spike in simultaneous provider calls, with nothing capping how hard the provider gets hit or smoothing the burst into a manageable rate. That's a fine trade at steady, moderate traffic. It stops being fine the moment concurrent long-running turns arrive in bursts — which is exactly when scaling matters most.&lt;/p&gt;

&lt;h2&gt;
  
  
  Putting a Queue in the Middle
&lt;/h2&gt;

&lt;p&gt;The fix is unglamorous and well-worn: put a durable queue between the caller and the agent. Every chat request now travels a fixed five-stage path:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Request Handler → Input Queue → Agent Runner → Output Queue → Response Handler
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The queue transport and the process topology are chosen entirely by configuration, not by rewriting agent code. Locally, all five stages run as threads inside one process against an in-memory transport, so the exact same pipeline semantics — per-session ordering, bounded retry, deduplication — are testable on a laptop. On AWS, the queues become durable &lt;strong&gt;SQS FIFO queues&lt;/strong&gt;, and the stages split across Lambda functions or ECS services depending on which deployment you pick.&lt;/p&gt;

&lt;p&gt;Splitting the pipeline this way buys you several things at once:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Independent scaling&lt;/strong&gt; — the request/response path and the Agent Runner pool scale on their own curves instead of being sized as one unit.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Backpressure&lt;/strong&gt; — a traffic spike lengthens the queue instead of fanning out into a pile of simultaneous provider calls.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Per-session ordering&lt;/strong&gt; — &lt;code&gt;MessageGroupId = session_id&lt;/code&gt; keeps a conversation's turns strictly in order while unrelated sessions process fully in parallel.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Crash resilience&lt;/strong&gt; — a message only leaves the queue once it's fully processed, so a worker crashing or hanging mid-turn simply leaves the turn there for the next worker.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Automatic bounded retries&lt;/strong&gt; — unacknowledged messages redeliver up to &lt;code&gt;max_receive_count&lt;/code&gt;, absorbing provider rate limits and transient failures without the caller noticing. After that, the caller gets a graceful error instead of a hang.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Deduplication&lt;/strong&gt; — &lt;code&gt;MessageDeduplicationId = request_id&lt;/code&gt; means a caller-retried request isn't enqueued twice, and the Agent Runner's reply isn't delivered twice — but only inside SQS FIFO's 5-minute dedup window. A caller retrying later than that, or a &lt;code&gt;stream&lt;/code&gt;-mode chunk (whose dedup ID deliberately includes the receive count), gets through, so delivery stays at-least-once end to end and anything with side effects should be idempotent on &lt;code&gt;request_id&lt;/code&gt;. (Redelivery after a processed-but-unacknowledged failure is a separate thing: that's the retry bullet above doing its job.)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;None of this is exotic. What matters is that Agent Kernel now gives it to you as a configuration switch rather than infrastructure you build yourself.&lt;/p&gt;

&lt;h2&gt;
  
  
  Two Deployment Shapes, One Pipeline
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Lambda: Scaling You Don't Have to Configure
&lt;/h3&gt;

&lt;p&gt;On Lambda, the five stages map to three functions. A &lt;strong&gt;Request Handler&lt;/strong&gt; enqueues onto the Input SQS FIFO queue with the session ID as the message group. An Event Source Mapping triggers the &lt;strong&gt;Agent Runner&lt;/strong&gt; Lambda, which runs the agent and writes the reply to the Output Queue, reporting partial failures via &lt;code&gt;batchItemFailures&lt;/code&gt; so only the messages that actually failed come back for retry. A second ESM triggers the &lt;strong&gt;Response Handler&lt;/strong&gt;, which writes the result to DynamoDB (&lt;code&gt;rest_sync&lt;/code&gt;/&lt;code&gt;rest_async&lt;/code&gt;) or pushes it straight over a WebSocket connection (&lt;code&gt;async&lt;/code&gt;/&lt;code&gt;stream&lt;/code&gt;).&lt;/p&gt;

&lt;p&gt;The appeal here is that Lambda scales the Agent Runner 1:1 with queue batches automatically. There's no scaling policy to write and no capacity to plan for; concurrency grows and shrinks with the backlog on its own.&lt;/p&gt;

&lt;h3&gt;
  
  
  ECS: Long-Running Services, Explicit Scaling
&lt;/h3&gt;

&lt;p&gt;ECS trades Lambda's zero-config scaling for containers that stay warm, which matters for consistent latency and workloads that don't fit serverless limits well. The same five stages become two services: an &lt;strong&gt;IO container&lt;/strong&gt; running a REST/WebSocket API thread alongside an Output Queue consumer thread, and an &lt;strong&gt;Agent Runner&lt;/strong&gt; service whose threads long-poll the Input Queue directly. Both are internally multi-threaded — five input consumers and two output consumers by default — so a single container is already handling several sessions concurrently before the ECS service itself scales out.&lt;/p&gt;

&lt;p&gt;Because ECS doesn't get Lambda's built-in batch-triggered scaling, it needs an explicit policy. CPU and memory are a poor proxy here: agent workloads are I/O-bound, waiting on the model provider, not burning CPU. So the Agent Runner scales on &lt;strong&gt;backlog per task&lt;/strong&gt; instead: a scheduled Lambda reads the Input Queue depth every minute, divides it by the running task count, and publishes the result as a custom CloudWatch metric. An ECS Target Tracking policy then holds that number at or below a target you set:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight hcl"&gt;&lt;code&gt;&lt;span class="nx"&gt;scaling_config&lt;/span&gt; &lt;span class="err"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;enabled&lt;/span&gt;            &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
  &lt;span class="nx"&gt;min_count&lt;/span&gt;          &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
  &lt;span class="nx"&gt;max_count&lt;/span&gt;          &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;
  &lt;span class="nx"&gt;backlog_target&lt;/span&gt;     &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;
  &lt;span class="nx"&gt;scale_in_cooldown&lt;/span&gt;  &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;180&lt;/span&gt;
  &lt;span class="nx"&gt;scale_out_cooldown&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;60&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;backlog_target&lt;/code&gt; is the one knob that matters: a lower value (1-2) keeps latency tight by scaling out aggressively; a higher value (5-10) trades some queue depth for cost efficiency. It's also possible to scale the Agent Runner to zero (&lt;code&gt;min_count = 0&lt;/code&gt;) for spiky or infrequent workloads, letting the fleet park at no cost between bursts.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Same Guarantee, Delivered Four Ways
&lt;/h2&gt;

&lt;p&gt;Every one of the four client communication modes — REST Sync, REST Async (poll), Streaming (SSE/WebSocket chunks), and Async (WebSocket push) — rides the identical Input Queue → Agent Runner → Output Queue shape. Only the last hop changes: &lt;code&gt;rest_sync&lt;/code&gt;/&lt;code&gt;rest_async&lt;/code&gt; land in a DynamoDB response store the caller reads back from; &lt;code&gt;async&lt;/code&gt;/&lt;code&gt;stream&lt;/code&gt; skip the database entirely and push straight down an open WebSocket connection, one message per full reply or one per streamed token chunk. Nothing about the queue contract, the retry semantics, or the ordering guarantee changes based on which mode a client is using.&lt;/p&gt;

&lt;p&gt;One safety detail worth calling out: the app-level &lt;code&gt;max_receive_count&lt;/code&gt; is deliberately set one below the SQS redrive policy's &lt;code&gt;maxReceiveCount&lt;/code&gt;. That way, on the final retry, Agent Kernel writes a graceful error to the response store &lt;em&gt;before&lt;/em&gt; SQS quietly moves the message to a dead-letter queue, so an HTTP caller never sits there waiting on a reply that's already been given up on.&lt;/p&gt;

&lt;h2&gt;
  
  
  Config In, Not Code Change
&lt;/h2&gt;

&lt;p&gt;Turning this on is a Terraform flag, not an agent rewrite:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight hcl"&gt;&lt;code&gt;&lt;span class="nx"&gt;queue_mode&lt;/span&gt;     &lt;span class="err"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
&lt;span class="nx"&gt;execution_mode&lt;/span&gt; &lt;span class="err"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"rest_sync"&lt;/span&gt;   &lt;span class="c1"&gt;# or rest_async | async | stream&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;yaalalabs/ak-containerized/aws&lt;/code&gt; and &lt;code&gt;yaalalabs/ak-serverless/aws&lt;/code&gt; Terraform modules provision the queues, IAM policies, response store, and (for ECS) the scaling stack automatically. Your agent definitions never reference a queue, a consumer thread, or a retry count — they run exactly as they do against the in-memory transport on your laptop.&lt;/p&gt;

&lt;h2&gt;
  
  
  What's Next
&lt;/h2&gt;

&lt;p&gt;SQS + Lambda and SQS + ECS validate a shape that generalizes: input queue, independently-scaling runner, output queue, pluggable response delivery. That same contract now also ships as a &lt;strong&gt;Kafka transport&lt;/strong&gt; (&lt;code&gt;pip install agentkernel[kafka]&lt;/code&gt;) and a &lt;strong&gt;NATS JetStream transport&lt;/strong&gt; (&lt;code&gt;pip install agentkernel[nats]&lt;/code&gt;) for on-premise and self-hosted deployments, with the identical per-session ordering, dedup, and bounded-retry semantics, just backed by partitions and consumer groups (or JetStream work-queue streams) instead of SQS FIFO queues. Both come with runnable two-process local examples under &lt;code&gt;examples/transport/&lt;/code&gt;. A Kubernetes-native topology (Helm charts, KEDA autoscaling) is next, so the scaling model here isn't tied to one cloud, or to AWS at all.&lt;/p&gt;

&lt;h2&gt;
  
  
  Get Started
&lt;/h2&gt;

&lt;p&gt;Agent Kernel is open source under Apache 2.0.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Queue Mode Guide: &lt;a href="https://kernel.yaala.ai/docs/advanced/queue-mode-guide" rel="noopener noreferrer"&gt;https://kernel.yaala.ai/docs/advanced/queue-mode-guide&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;AWS Containerized Deployment: &lt;a href="https://kernel.yaala.ai/docs/deployment/aws-containerized" rel="noopener noreferrer"&gt;https://kernel.yaala.ai/docs/deployment/aws-containerized&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;GitHub: &lt;a href="https://github.com/yaalalabs/agent-kernel" rel="noopener noreferrer"&gt;https://github.com/yaalalabs/agent-kernel&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;code&gt;pip install agentkernel&lt;/code&gt; and let the queue absorb your next traffic spike instead of your Agent Runner.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://kernel.yaala.ai/blog/aws-queue-mode-scalability" rel="noopener noreferrer"&gt;kernel.yaala.ai&lt;/a&gt; on August 17, 2026.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>agentkernel</category>
      <category>aws</category>
      <category>scalability</category>
      <category>sqs</category>
    </item>
    <item>
      <title>Introducing the Agent Kernel Execution Broker: A Safe Place for AI Agents to Run Code</title>
      <dc:creator>AK</dc:creator>
      <pubDate>Tue, 06 Oct 2026 10:49:59 +0000</pubDate>
      <link>https://dev.to/agent-kernel/introducing-the-agent-kernel-execution-broker-a-safe-place-for-ai-agents-to-run-code-48p8</link>
      <guid>https://dev.to/agent-kernel/introducing-the-agent-kernel-execution-broker-a-safe-place-for-ai-agents-to-run-code-48p8</guid>
      <description>&lt;p&gt;&lt;em&gt;By &lt;a href="https://github.com/yaalalabs" rel="noopener noreferrer"&gt;Yaala Labs&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F6gkczt8thb73qq25dmia.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F6gkczt8thb73qq25dmia.png" alt="Agent Kernel Execution Broker: agents connect through sandbox tools and a security policy to the broker, which routes execution to Docker, E2B, Daytona, EC2, or your own provider" width="800" height="420"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;AI agents have become remarkably good at writing code. Running that code is where most teams stop.&lt;/p&gt;

&lt;p&gt;And they are right to hesitate. An agent that can execute code on your infrastructure can also read your filesystem, call your internal APIs, exhaust your CPU, or exfiltrate data over the network. So teams end up in one of two places: they switch code execution off entirely and cap what their agents can do, or they build a one-off sandbox stack in-house, wire it to one agent framework, marry it to one vendor, and maintain it forever.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Agent Kernel Execution Broker removes that trade-off.&lt;/strong&gt; It is a vendor-neutral brokering layer that sits between your agents and the environments their code runs in, with security policy and access control enforced on every single execution.&lt;/p&gt;

&lt;h2&gt;
  
  
  One Broker Between Agents and Every Sandbox
&lt;/h2&gt;

&lt;p&gt;The idea is simple. Agents never touch execution backends directly. They ask, and the Execution Broker routes the request to an isolated sandbox through a pluggable provider.&lt;/p&gt;

&lt;p&gt;Enable it, and every agent gains code, shell, and file tools automatically, with usage guidance injected into its instructions. Your agent code never mentions the sandbox at all.&lt;/p&gt;

&lt;p&gt;Before any code runs, two gates are checked, and both fail closed:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Security policy.&lt;/strong&gt; Each execution runs inside a permission and resource envelope: network egress rules (allow, deny, or an allowlist), filesystem read and write scopes, CPU and memory limits, and a hard wall-clock timeout. If a backend cannot enforce a policy you asked for, the execution is rejected rather than silently downgraded. Security is never quietly weakened to make something run.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Access control and identity.&lt;/strong&gt; Sandboxed code can run under the agent's identity or under the authenticated end user's identity, resolved per session. A user-scoped request can never silently fall back to broader agent credentials.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That fail-closed posture is the heart of the design: the broker checks what a backend has honestly declared it can enforce, and refuses anything it cannot guarantee.&lt;/p&gt;

&lt;h2&gt;
  
  
  Your Containers, Your Rules
&lt;/h2&gt;

&lt;p&gt;For teams that want full control, Docker mode lets you bring your own curated container images as the sandbox environment. Your golden image, your internal registry, your approved dependencies, your compliance checklist baked in. The broker adds enforced isolation on top: network switched off or restricted, CPU and memory capped, a read-only root filesystem with a writable workspace.&lt;/p&gt;

&lt;p&gt;Security teams get a controlled, auditable execution surface. Agents get a fully equipped environment. Nobody has to choose.&lt;/p&gt;

&lt;p&gt;An honest note on where responsibility sits today: command-level security comes from the environment you bring. Your curated container decides which interpreters, binaries, and tools exist for the agent to invoke, which is exactly where that control belongs. And this layer is about to get deeper: in the next version, sandbox providers gain native pseudo-terminal support, bringing full PTY sessions to Daytona, E2B, and other connections.&lt;/p&gt;

&lt;h2&gt;
  
  
  Connect to Systems You Already Own
&lt;/h2&gt;

&lt;p&gt;Not every workload belongs in a disposable sandbox. Sometimes the agent needs to operate on a real machine: an EC2 instance running your batch jobs, a long-lived container with your tooling installed.&lt;/p&gt;

&lt;p&gt;The broker supports this through &lt;strong&gt;attached environments&lt;/strong&gt;, and it treats them with the respect your infrastructure deserves. Attaching is an explicit, validated opt-in in configuration, never a side effect. The broker connects to the environment but never owns it: it will not provision it, will not destroy it, and will never silently recreate it if it becomes unreachable. Pointing agents at a live system is a deliberate decision, and the framework enforces that.&lt;/p&gt;

&lt;h2&gt;
  
  
  Five Providers Out of the Box
&lt;/h2&gt;

&lt;p&gt;The Execution Broker ships with pre-built providers, each honestly declaring its isolation tier:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Local Subprocess&lt;/strong&gt;, no isolation. Runs on the host for development and testing only.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Docker&lt;/strong&gt;, container isolation. A container per sandbox on your own Docker daemon, with network, filesystem, and resource policy actually enforced.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;E2B&lt;/strong&gt;, micro-VM isolation. Managed Firecracker micro-VMs in the E2B cloud, with a stateful kernel where variables persist across calls.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Daytona&lt;/strong&gt;, container isolation. Managed cloud container sandboxes with enforced network and resource policy, plus warm starts from snapshots.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;EC2 via SSM&lt;/strong&gt;, attach-only with no added isolation boundary, because it runs on an instance you already own. Supports running commands as a specific user through AWS role assumption.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fycihb4t9ewp6rnlsn8u1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fycihb4t9ewp6rnlsn8u1.png" alt="The five pre-built sandbox providers and their isolation tiers: Local Subprocess, Docker, E2B, Daytona, and EC2 via SSM" width="800" height="280"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Those tiers are part of the contract. The framework never pretends two backends are interchangeable on security grounds; you always know exactly what boundary you are getting.&lt;/p&gt;

&lt;h2&gt;
  
  
  Sessions and a Lifecycle You Never Manage
&lt;/h2&gt;

&lt;p&gt;Real work is rarely one command. An agent writes a script, runs it, inspects the output, fixes a bug, and runs it again. The broker makes this natural through &lt;strong&gt;sandbox sessions&lt;/strong&gt;: each session is a persistent workspace, so files written in one step are still there several conversation turns later. Sessions are isolated per conversation, and agents can create, list, and discard them as easily as calling a tool.&lt;/p&gt;

&lt;p&gt;You choose the lifetime per workload: a persistent workspace for multi-step projects, a fresh throwaway sandbox per call for stateless computation, or a shared warm environment when startup cost matters.&lt;/p&gt;

&lt;p&gt;The lifecycle runs itself. Idle sandboxes are reclaimed automatically and recreated on the next touch. If a backend sandbox vanishes, the broker heals the session under the same identity, and, crucially, tells the agent that the workspace was reset. Nothing is ever swept under the rug. Long-running executions do not block the conversation either: they are promoted to background tasks the agent polls, so a twenty-minute job and a two-second one flow through the same tools.&lt;/p&gt;

&lt;p&gt;Nobody on your team writes provisioning, cleanup, or reconnection code. Ever.&lt;/p&gt;

&lt;h2&gt;
  
  
  Framework-Neutral, Plug and Play
&lt;/h2&gt;

&lt;p&gt;Here is the part that changes the dynamic.&lt;/p&gt;

&lt;p&gt;Everything above works with whatever agent framework you already use: OpenAI Agents SDK, LangGraph, CrewAI, Google ADK, Smolagents, Pydantic AI. The sandbox capability is switched on with a few lines of configuration, and switching providers is a configuration change, not a rewrite. Develop against local subprocesses, test against Docker, ship on micro-VMs, and your agents never know the difference.&lt;/p&gt;

&lt;p&gt;The industry keeps offering the same deal: adopt our sandbox, adopt our SDK, adopt our lock-in. Agent Kernel takes the opposite position. &lt;strong&gt;The broker is the contract; providers are interchangeable plumbing.&lt;/strong&gt; Your security policy, your identity model, your session semantics, and your agent code all stay put while the execution backend underneath is swapped freely.&lt;/p&gt;

&lt;p&gt;And when none of the built-in providers fit, you &lt;strong&gt;bring your own&lt;/strong&gt;. Implement the provider interface for your internal platform, your Kubernetes setup, your private cloud, and point the configuration at it. A public contract test suite verifies your implementation honors the same semantics. Your custom backend instantly inherits everything the broker provides: policy enforcement, identity, sessions, self-healing lifecycle, background task promotion. You write the connection to your infrastructure; Agent Kernel supplies the guarantees.&lt;/p&gt;

&lt;p&gt;This is what plug and play looks like in practice. The sandbox is switched on in configuration:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;config.yaml&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;sandbox&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;enabled&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
  &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;docker&lt;/span&gt;              &lt;span class="c1"&gt;# or e2b | daytona&lt;/span&gt;
  &lt;span class="na"&gt;docker&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;python:3.12-slim&lt;/span&gt;
  &lt;span class="na"&gt;broker&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;flavor&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;thread&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And the agent code never mentions the sandbox at all:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;demo.py&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;agents&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Agent&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;agentkernel.cli&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;CLI&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;agentkernel.openai&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;OpenAIModule&lt;/span&gt;

&lt;span class="n"&gt;coder&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Agent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;coder&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;instructions&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;You are a coding assistant.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nc"&gt;OpenAIModule&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="n"&gt;coder&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;

&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;__name__&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;__main__&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;CLI&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Swap &lt;code&gt;docker&lt;/code&gt; for &lt;code&gt;e2b&lt;/code&gt;, &lt;code&gt;daytona&lt;/code&gt;, &lt;code&gt;ec2_ssm&lt;/code&gt;, or your own provider. The agent never knows the difference.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Bottom Line
&lt;/h2&gt;

&lt;p&gt;Code execution is the capability that turns AI agents from advisors into operators, and it is exactly the capability most enterprises cannot responsibly turn on without guardrails. The Agent Kernel Execution Broker makes it safe to say yes: one broker, guarded by fail-closed security policy and access control, in front of any sandbox you choose, with none of your agent code held hostage by the choice.&lt;/p&gt;

&lt;p&gt;Agent Kernel is open source under Apache 2.0.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Sandbox documentation: &lt;a href="https://kernel.yaala.ai/docs/advanced/sandbox" rel="noopener noreferrer"&gt;https://kernel.yaala.ai/docs/advanced/sandbox&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Architecture deep dive: &lt;a href="https://kernel.yaala.ai/docs/architecture/sandbox-internals" rel="noopener noreferrer"&gt;https://kernel.yaala.ai/docs/architecture/sandbox-internals&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;GitHub: &lt;a href="https://github.com/yaalalabs/agent-kernel" rel="noopener noreferrer"&gt;https://github.com/yaalalabs/agent-kernel&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;code&gt;pip install agentkernel&lt;/code&gt; and give your agents a safe place to run.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://kernel.yaala.ai/blog/agent-kernel-execution-broker" rel="noopener noreferrer"&gt;kernel.yaala.ai&lt;/a&gt; on August 6, 2026.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>agentkernel</category>
      <category>sandbox</category>
      <category>executionbroker</category>
      <category>security</category>
    </item>
    <item>
      <title>Agent Kernel Now Runs on GCP - AWS, Azure, GCP, On-Prem. One Platform.</title>
      <dc:creator>AK</dc:creator>
      <pubDate>Tue, 06 Oct 2026 10:47:46 +0000</pubDate>
      <link>https://dev.to/agent-kernel/agent-kernel-now-runs-on-gcp-aws-azure-gcp-on-prem-one-platform-39i8</link>
      <guid>https://dev.to/agent-kernel/agent-kernel-now-runs-on-gcp-aws-azure-gcp-on-prem-one-platform-39i8</guid>
      <description>&lt;p&gt;&lt;em&gt;By &lt;a href="https://github.com/yaalalabs" rel="noopener noreferrer"&gt;Yaala Labs&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fd9i0b3y30iirk5q1o5o5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fd9i0b3y30iirk5q1o5o5.png" alt="Agent Kernel GCP Support" width="800" height="420"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;AWS. Azure. GCP. On-Prem. One platform. No rewrites. No lock-in.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Agent Kernel now ships full Google Cloud Platform support, completing the trifecta of major public clouds. Your agents now deploy identically across every environment, same observability pipeline, same compliance primitives, zero code changes.&lt;/p&gt;

&lt;h2&gt;
  
  
  What's Included
&lt;/h2&gt;

&lt;p&gt;Built on &lt;strong&gt;Cloud Run&lt;/strong&gt;, with two modes controlled by a single parameter:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Serverless&lt;/strong&gt; - scale-to-zero serverless. No idle cost.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Containerized&lt;/strong&gt; - always-on with zero cold starts.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Both are fully provisioned by Terraform: Artifact Registry, API Gateway + JWT auth, Firestore for session state, Memorystore for shared cache, and VPC isolation.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Runtime That Takes Agents to Production
&lt;/h2&gt;

&lt;p&gt;Getting an AI agent running is the easy part. Getting it running reliably in production, with proper auth, compliance guardrails, observability, and scalable infrastructure, is where the real work begins.&lt;/p&gt;

&lt;p&gt;Agent Kernel is the runtime that handles all of it. You bring the agent logic; Agent Kernel brings everything required to make it production-grade: framework support (OpenAI Agents SDK, LangGraph, CrewAI, Google ADK etc.), cloud infrastructure via Terraform, built-in PII detection and audit traces, and full tracing on every LLM call and tool invocation through LangFuse and OpenLLMetry or bring-your-own.&lt;/p&gt;

&lt;p&gt;The result is that shipping an agent to production feels like shipping any other service. No bespoke infrastructure work, no compliance bolt-ons, no cloud-specific rewrites. Just deploy.&lt;/p&gt;

&lt;p&gt;Agent Kernel is the only agent operating system that offers true cloud-agnostic deployment across all three major public clouds and on-premises infrastructure. That's not a coincidence of timing; it's a direct outcome of Agent Kernel's adapter architecture. Every cloud provider, every AI framework, every LLM, and every tool integration is wired in through a clean adapter layer. Adding a new cloud is a new adapter, not a rewrite. This is what future-proofs AI companies: as the landscape shifts, new models emerge, and infrastructure requirements evolve, Agent Kernel extends without breaking what already runs in production.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Full Picture
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;AWS&lt;/th&gt;
&lt;th&gt;Azure&lt;/th&gt;
&lt;th&gt;GCP&lt;/th&gt;
&lt;th&gt;On-Prem&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Serverless&lt;/td&gt;
&lt;td&gt;Lambda&lt;/td&gt;
&lt;td&gt;Functions&lt;/td&gt;
&lt;td&gt;Cloud Run&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Containerized&lt;/td&gt;
&lt;td&gt;ECS Fargate&lt;/td&gt;
&lt;td&gt;Container Apps&lt;/td&gt;
&lt;td&gt;Cloud Run&lt;/td&gt;
&lt;td&gt;Docker / K8s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Session Store&lt;/td&gt;
&lt;td&gt;DynamoDB&lt;/td&gt;
&lt;td&gt;Cosmos DB&lt;/td&gt;
&lt;td&gt;Firestore&lt;/td&gt;
&lt;td&gt;Redis&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;IaC&lt;/td&gt;
&lt;td&gt;Terraform&lt;/td&gt;
&lt;td&gt;Terraform&lt;/td&gt;
&lt;td&gt;Terraform&lt;/td&gt;
&lt;td&gt;Terraform&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Same agent code. Every cloud. That's the point.&lt;/p&gt;

&lt;h2&gt;
  
  
  Get Started
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight hcl"&gt;&lt;code&gt;&lt;span class="nx"&gt;module&lt;/span&gt; &lt;span class="s2"&gt;"agent_kernel_gcp"&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;source&lt;/span&gt;  &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"yaalalabs/ak-serverless/google"&lt;/span&gt;
  &lt;span class="nx"&gt;version&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"0.5.1"&lt;/span&gt;

&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Ready to deploy?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;See the &lt;a href="https://kernel.yaala.ai/docs/deployment/gcp-serverless" rel="noopener noreferrer"&gt;GCP Serverless&lt;/a&gt; or &lt;a href="https://kernel.yaala.ai/docs/deployment/gcp-containerized" rel="noopener noreferrer"&gt;GCP Containerized&lt;/a&gt; deployment guides.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://kernel.yaala.ai/blog/gcp-support" rel="noopener noreferrer"&gt;kernel.yaala.ai&lt;/a&gt; on June 9, 2026.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>agentkernel</category>
      <category>gcp</category>
      <category>googlecloud</category>
      <category>multicloud</category>
    </item>
    <item>
      <title>Agent Kernel Is Live at Climate Impact X</title>
      <dc:creator>AK</dc:creator>
      <pubDate>Tue, 06 Oct 2026 10:44:27 +0000</pubDate>
      <link>https://dev.to/agent-kernel/agent-kernel-is-live-at-climate-impact-x-4fap</link>
      <guid>https://dev.to/agent-kernel/agent-kernel-is-live-at-climate-impact-x-4fap</guid>
      <description>&lt;p&gt;&lt;em&gt;By &lt;a href="https://github.com/yaalalabs" rel="noopener noreferrer"&gt;Yaala Labs&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F09m0nppwnw8zgguy5w6z.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F09m0nppwnw8zgguy5w6z.png" alt="Agent Kernel at Climate Impact X" width="800" height="420"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Climate Impact X (CIX)&lt;/strong&gt;, a leading exchange for environmental products such as carbon credits and renewable energy certificates, is now live with &lt;strong&gt;Agent Kernel&lt;/strong&gt; as part of its &lt;strong&gt;trade surveillance workflow&lt;/strong&gt;.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Production milestone&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This marks an important production milestone: bringing &lt;strong&gt;AI-augmented surveillance&lt;/strong&gt; into a real market environment where &lt;strong&gt;trust, fairness, and auditability&lt;/strong&gt; are key.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;An &lt;strong&gt;agentic workflow&lt;/strong&gt; powered by Agent Kernel adds &lt;strong&gt;deeper insights&lt;/strong&gt; and uncovers &lt;strong&gt;hidden patterns&lt;/strong&gt; beyond traditional rule-based alerts. AI agents can review potential issues with speed and confidence, supported by clear, structured, &lt;strong&gt;investigation-ready context&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Agent Kernel provided the &lt;strong&gt;enterprise foundation&lt;/strong&gt; to make that possible in production.&lt;/p&gt;




&lt;h2&gt;
  
  
  From Complexity to Production in Weeks
&lt;/h2&gt;

&lt;p&gt;Building AI agents for production systems is usually &lt;strong&gt;not limited by model capability&lt;/strong&gt;. Most delays come from engineering the surrounding platform requirements:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Scalable cloud deployment&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Durable state&lt;/strong&gt; across multi-step workflows&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Strong operational guardrails&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;End-to-end observability&lt;/strong&gt; and traceability&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Reliable tool integration&lt;/strong&gt; and orchestration&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Behavior-focused testing&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;With Agent Kernel, those platform capabilities are already available. That allowed our team to focus implementation effort on &lt;strong&gt;exchange-specific surveillance logic and business requirements&lt;/strong&gt;, not foundational infrastructure.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The result was an &lt;strong&gt;extremely fast production rollout&lt;/strong&gt;.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  What Agent Kernel Enabled
&lt;/h2&gt;

&lt;p&gt;This implementation demonstrates the practical value of Agent Kernel's enterprise features:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Production-grade multi-agent orchestration&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Serverless-first deployment patterns&lt;/strong&gt; for variable workload traffic&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Durable session and workflow state management&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Policy guardrails&lt;/strong&gt; for regulated environments&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Audit-ready tracing and observability&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Extensible tooling&lt;/strong&gt; for enterprise data and workflow integrations&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Testing support&lt;/strong&gt; for validating agent behavior in realistic scenarios&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Together, these capabilities &lt;strong&gt;reduce time-to-production&lt;/strong&gt; while preserving the controls expected in high-trust systems.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;From prototype to production&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;For teams evaluating how to move AI agents from prototype to production, this launch shows what is possible when the platform layer is already solved.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://kernel.yaala.ai/blog/agent-kernel-live-at-climate-impact-x" rel="noopener noreferrer"&gt;kernel.yaala.ai&lt;/a&gt; on May 27, 2026.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>agentkernel</category>
      <category>climateimpactx</category>
      <category>production</category>
      <category>tradesurveillance</category>
    </item>
    <item>
      <title>Knowledge Bases: The Missing Layer That Lets AI Agents Self-Evolve</title>
      <dc:creator>AK</dc:creator>
      <pubDate>Tue, 06 Oct 2026 10:40:46 +0000</pubDate>
      <link>https://dev.to/agent-kernel/knowledge-bases-the-missing-layer-that-lets-ai-agents-self-evolve-39g3</link>
      <guid>https://dev.to/agent-kernel/knowledge-bases-the-missing-layer-that-lets-ai-agents-self-evolve-39g3</guid>
      <description>&lt;p&gt;&lt;em&gt;By &lt;a href="https://github.com/yaalalabs" rel="noopener noreferrer"&gt;Yaala Labs&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Most AI agents have a fundamental flaw: &lt;strong&gt;they forget everything.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Every conversation starts from zero. The agent doesn't remember that it got a fact wrong last Tuesday. It doesn't remember the new product line you told it about. It doesn't remember that a customer is a high-value account who hates upsells. It doesn't even remember its own mistakes.&lt;/p&gt;

&lt;p&gt;That's not an AI agent. That's a very expensive autocomplete that resets every session.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Agent Kernel's Knowledge Base layer changes this completely.&lt;/strong&gt; And more importantly — it gives agents something they've never had before: the ability to &lt;em&gt;learn from their own operation&lt;/em&gt; and get measurably smarter over time.&lt;/p&gt;

&lt;h2&gt;
  
  
  What's Actually Wrong with Today's AI Agents
&lt;/h2&gt;

&lt;p&gt;Let's be direct about the problem.&lt;/p&gt;

&lt;p&gt;Current agent architectures give you session memory — what was said in this conversation — and that's about it. When the session ends, that memory is gone. The next user, the next session, the next agent instance starts fresh. Every piece of operational knowledge your agent accumulates evaporates when the conversation closes.&lt;/p&gt;

&lt;p&gt;This creates a ceiling. Your agents plateau. They never improve from experience. They repeat the same mistakes. They rediscover the same domain knowledge on every call. And if you want them to know something new, you're back to prompt engineering, fine-tuning, or rebuilding the whole system.&lt;/p&gt;

&lt;p&gt;There is a better architecture. And it's been sitting in front of us the whole time.&lt;/p&gt;

&lt;h2&gt;
  
  
  Durable Knowledge: The Layer Below Sessions
&lt;/h2&gt;

&lt;p&gt;Agent Kernel draws a sharp line between two kinds of memory:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Session memory&lt;/strong&gt; is volatile and scoped to one conversation. When the session ends, it's gone. This is the right place for things like: what the user said three messages ago, the partial result of a multi-step tool call, or a temporary calculation.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Knowledge bases&lt;/strong&gt; are durable and cross-session. They persist between conversations, across agent instances, across deployments. This is the right place for: domain facts, learned corrections, customer profiles, product catalogs, operational patterns, and anything the agent should &lt;em&gt;remember forever&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;When you combine both layers, something remarkable happens: &lt;strong&gt;your agents accumulate intelligence over time.&lt;/strong&gt; Every interaction is an opportunity to write something back. Every mistake can be corrected and stored. Every successful pattern can be reinforced.&lt;/p&gt;

&lt;p&gt;That's self-evolution. Not in a science-fiction sense. In a very practical, engineering sense.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Self-Evolving Agent Pattern
&lt;/h2&gt;

&lt;p&gt;Here's the concrete pattern that unlocks self-improvement.&lt;/p&gt;

&lt;p&gt;The agent has access to both read and write tools for the knowledge base. When it encounters something worth remembering, it writes it. When it starts a new session, it reads from the knowledge base before responding. Over time, the knowledge base grows richer and the agent's responses improve — without any human retraining.&lt;/p&gt;

&lt;p&gt;Consider a customer-facing support agent:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Day 1&lt;/strong&gt;: A customer asks about a product edge case. The agent searches the KB, finds nothing, researches it, and answers correctly. It then writes that edge case and the correct answer to the KB.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Day 2&lt;/strong&gt;: A different customer asks the same question. The agent reads the KB, finds the answer immediately, responds in milliseconds. No LLM reasoning required for that step.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Week 2&lt;/strong&gt;: A product manager updates the answer because the product changed. The agent reads the updated record. Every future session gets the new answer automatically.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Month 3&lt;/strong&gt;: The KB now contains hundreds of edge cases, customer patterns, and domain corrections. The agent is dramatically more accurate than on Day 1 — not because of retraining, but because of accumulated knowledge.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This is the compounding effect that static agent architectures can never achieve.&lt;/p&gt;

&lt;h2&gt;
  
  
  Three Backends, One API
&lt;/h2&gt;

&lt;p&gt;Agent Kernel ships with production-grade support for three fundamentally different knowledge storage paradigms — all behind a single, consistent interface.&lt;/p&gt;

&lt;h3&gt;
  
  
  ChromaDB — Semantic Memory for Text
&lt;/h3&gt;

&lt;p&gt;ChromaDB is a vector database purpose-built for semantic similarity search. You write natural language text; ChromaDB embeds it and stores it as high-dimensional vectors. When an agent queries it, ChromaDB returns the most semantically relevant records — not keyword matches, but &lt;em&gt;meaning&lt;/em&gt; matches.&lt;/p&gt;

&lt;p&gt;This is the right backend for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Product documentation and FAQs&lt;/li&gt;
&lt;li&gt;Support knowledge that agents discover during operation&lt;/li&gt;
&lt;li&gt;Domain-specific terminology and explanations&lt;/li&gt;
&lt;li&gt;Any knowledge that requires natural language retrieval&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The agent doesn't need to know the exact words used when the knowledge was stored. It asks a question in plain language and gets the most relevant answer, even if the stored text uses different phrasing.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;agentkernel.knowledgebase.chroma&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;ChromaManager&lt;/span&gt;

&lt;span class="n"&gt;v_db&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;ChromaManager&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;ProductKB&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;add_schema&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;description&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Product documentation and support knowledge. Use for product questions, feature explanations, and known issue resolutions.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;usage&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Pass a natural language query. Returns the most semantically relevant knowledge entries.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;write_format&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;text&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;string (the knowledge to store)&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;metadata&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;source&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;string&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;category&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;string&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}},&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Neo4j — Relational Memory for Connected Knowledge
&lt;/h3&gt;

&lt;p&gt;Neo4j is a graph database. Instead of storing isolated facts, it stores &lt;em&gt;relationships&lt;/em&gt; between entities. This unlocks a category of agent reasoning that flat databases simply cannot support: traversal, inference, and multi-hop relationship queries.&lt;/p&gt;

&lt;p&gt;Think about what this means for an agent:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A customer support agent can reason about which customers use which products, and which products have which known issues.&lt;/li&gt;
&lt;li&gt;An enterprise agent can navigate org charts, escalation paths, and approval workflows.&lt;/li&gt;
&lt;li&gt;A research agent can traverse citation graphs, author relationships, and topic hierarchies.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is the right backend for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Customer relationship graphs&lt;/li&gt;
&lt;li&gt;Organizational structures and reporting lines&lt;/li&gt;
&lt;li&gt;Concept maps and knowledge ontologies&lt;/li&gt;
&lt;li&gt;Dependency trees (products, services, systems)&lt;/li&gt;
&lt;li&gt;Any domain where "how is X connected to Y?" matters
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;agentkernel.knowledgebase.neo4j&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Neo4jManager&lt;/span&gt;

&lt;span class="n"&gt;g_db&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Neo4jManager&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;CustomerGraph&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;add_schema&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;description&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Customer and product relationship graph. Use for account-level context, product usage patterns, and escalation chains.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;usage&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Write Cypher queries to read/write nodes and relationships.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;write_format&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;text&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Cypher CREATE or MERGE statement&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;metadata&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;entity_type&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Customer|Product|Issue&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}},&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Starburst Galaxy — Analytical Memory for Structured Data
&lt;/h3&gt;

&lt;p&gt;Starburst Galaxy is a distributed SQL query engine built on Trino. It can query across multiple data sources simultaneously — PostgreSQL, MongoDB, Google Sheets, S3, and dozens of others — using standard SQL. From the agent's perspective, it's a single, unified analytical layer over all your structured data.&lt;/p&gt;

&lt;p&gt;This is read-only by design: Starburst is for &lt;em&gt;reading&lt;/em&gt; structured operational data that already exists in your systems, not for agent-generated writes. It's the right backend for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Live business metrics and dashboards&lt;/li&gt;
&lt;li&gt;Customer transaction history&lt;/li&gt;
&lt;li&gt;Inventory and pricing data&lt;/li&gt;
&lt;li&gt;Any structured data that agents need to read but shouldn't write&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;With Starburst, your agent can answer questions like "What are the top 10 customers by revenue this quarter?" or "Which SKUs are below reorder threshold right now?" — directly from your live data systems, with no ETL pipeline in between.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;agentkernel.knowledgebase.starburst&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;StarburstManager&lt;/span&gt;

&lt;span class="n"&gt;s_db&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;StarburstManager&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;SalesData&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;add_schema&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;description&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Live sales and inventory data via Starburst Galaxy. READ-ONLY. Use for revenue queries, inventory lookups, and customer transaction history.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;usage&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Pass SQL SELECT statements. Use &amp;lt;SALES_SOURCE&amp;gt; as the table placeholder.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;query_template&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;SELECT ... FROM &amp;lt;SALES_SOURCE&amp;gt; WHERE ...&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Semantic Map: Keeping Agents Portable
&lt;/h2&gt;

&lt;p&gt;One of the most powerful details in Agent Kernel's KB design is &lt;code&gt;semantic_map&lt;/code&gt; — and it's easy to miss if you don't look for it.&lt;/p&gt;

&lt;p&gt;The problem it solves: physical resource names in databases change. Table names change when you migrate. Collection names differ between dev and prod. Catalog paths in Starburst differ between environments. If your agent hardcodes those physical names in its queries, you're constantly updating prompts whenever the environment changes.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;semantic_map&lt;/code&gt; fixes this by letting agents reason over stable, logical tokens — &lt;code&gt;&amp;lt;CUSTOMER_SOURCE&amp;gt;&lt;/code&gt;, &lt;code&gt;&amp;lt;INVENTORY_TABLE&amp;gt;&lt;/code&gt;, &lt;code&gt;&amp;lt;VECTOR_STORE&amp;gt;&lt;/code&gt; — while &lt;code&gt;KnowledgeBuilder&lt;/code&gt; resolves them to the correct physical target at runtime.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;semantic_map&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;&amp;lt;CUSTOMER_SOURCE&amp;gt;&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;TABLE(kb_sheets.system.sheet(id =&amp;gt; &lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;SHEET_ID_PROD&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;))&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="c1"&gt;# Prod
&lt;/span&gt;    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;&amp;lt;INVENTORY_TABLE&amp;gt;&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;warehouse.inventory.current_stock&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="c1"&gt;# In staging, swap out the values — agent prompts stay identical
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Your agent stays portable. Your prompts stay unchanged. Environment-specific details live in deployment config, not in the model's context.&lt;/p&gt;

&lt;h2&gt;
  
  
  KnowledgeBuilder: The Composition Layer
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;KnowledgeBuilder&lt;/code&gt; is the glue that composes backends into a unified tool surface for the agent. You register one or more backends, optionally provide a &lt;code&gt;semantic_map&lt;/code&gt;, call &lt;code&gt;.build()&lt;/code&gt;, and get back a list of plain Python callables:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;get_schemas()&lt;/code&gt; — returns each backend's schema so the agent can decide where to route&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;read_kb(backend, query, limit)&lt;/code&gt; — query a specific backend&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;write_kb(backend, text, ...)&lt;/code&gt; — write to a backend&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;get_all_kb_descriptions()&lt;/code&gt; — short summary of all registered backends for routing context&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These callables are framework-agnostic. A framework adapter then binds them into the actual agent runtime.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;agentkernel.knowledgebase.knowledgebuilder&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;KnowledgeBuilder&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;agentkernel.knowledgebase.chroma&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;ChromaManager&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;agentkernel.knowledgebase.neo4j&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Neo4jManager&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;agentkernel.knowledgebase.starburst&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;StarburstManager&lt;/span&gt;

&lt;span class="n"&gt;kb&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;KnowledgeBuilder&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;backends&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;v_db&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;g_db&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;s_db&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="n"&gt;semantic_map&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;semantic_map&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;kb_tools&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;kb&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;build&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then wire into any supported framework:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# OpenAI Agents SDK
&lt;/span&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;agentkernel.openai&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;OpenAIToolBuilder&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;agents&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Agent&lt;/span&gt;

&lt;span class="n"&gt;kb_agent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Agent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;KnowledgeAgent&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;instructions&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;...&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;tools&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;OpenAIToolBuilder&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;bind&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;kb_tools&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The same &lt;code&gt;kb_tools&lt;/code&gt; works identically with LangGraph, CrewAI, and Google ADK. One knowledge layer, all frameworks.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why This Changes the Game
&lt;/h2&gt;

&lt;p&gt;Here's the honest assessment of what this unlocks that wasn't possible before.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Agents that improve without retraining.&lt;/strong&gt; Every write to the KB is a micro-improvement. Scale that across thousands of sessions and you have an agent that is genuinely smarter at month three than it was on day one — without a single fine-tuning run.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Knowledge that survives agent restarts, redeploys, and framework switches.&lt;/strong&gt; The knowledge base is outside the agent. Swap from LangGraph to CrewAI? Your KB comes with you. Redeploy to a new environment? Your KB is still there.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Multi-agent knowledge sharing.&lt;/strong&gt; Multiple agents — a support agent, a billing agent, a triage agent — can all read from and write to the same KB. Knowledge discovered by one agent is immediately available to all others. This is the foundation of a genuinely collaborative multi-agent system.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Specialised query capabilities per domain.&lt;/strong&gt; Use ChromaDB for fuzzy natural language retrieval. Use Neo4j for relationship traversal. Use Starburst for SQL analytics. Route each query to the backend that's architecturally correct for the question type. No more forcing all your data through a single retrieval strategy that's wrong for most of it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Custom backends for any storage system.&lt;/strong&gt; Not locked in to the three built-in backends. Implement the &lt;code&gt;KnowledgeBase&lt;/code&gt; adapter for your existing Pinecone instance, your Elasticsearch cluster, your internal knowledge API — and it plugs into the same KB tools infrastructure with zero changes to your agent code.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Recommended Pattern: KB Router Agent
&lt;/h2&gt;

&lt;p&gt;For multi-backend setups, Agent Kernel recommends dedicating one agent to knowledge routing. This agent's only job is to decide which KB to query, execute the read or write, and return results to the calling agent.&lt;/p&gt;

&lt;p&gt;Why this matters: routing decisions benefit from inspecting schemas first. A specialised routing agent can call &lt;code&gt;get_schemas()&lt;/code&gt;, understand what each backend contains, and make an accurate routing decision before executing. Mixing this responsibility into a task-focused agent leads to routing errors and hallucinated backends.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;kb_router&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Agent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;KB_Router_Agent&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;instructions&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;
    You manage access to multiple knowledge backends.

    Start every request by calling get_schemas() to inspect available backends.
    Then call get_all_kb_descriptions() for routing context.

    Routing rules:
    - Natural language / semantic questions → ChromaDB backend
    - Relationship or entity traversal → Neo4j backend (Cypher only)
    - Structured data / analytics / SQL → Starburst backend (READ-ONLY, no write_kb)

    When writing knowledge:
    - Use write_kb with the correct backend name
    - Never call write_kb for Starburst backends
    - Always include descriptive metadata in the write payload

    When the query contains a placeholder like &amp;lt;CUSTOMER_SOURCE&amp;gt;, keep it unchanged
    in your query string — the semantic_map will resolve it at runtime.
    &lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;tools&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;OpenAIToolBuilder&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;bind&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;kb_tools&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Technical Reference
&lt;/h2&gt;

&lt;h3&gt;
  
  
  The &lt;code&gt;KnowledgeBase&lt;/code&gt; Abstract Interface
&lt;/h3&gt;

&lt;p&gt;All backends — built-in and custom — implement the same contract:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Member&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;backend_name&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;@property str&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Unique identifier used in tool calls and schemas&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;connect(**kwargs)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;abstractmethod&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Establish backend connection&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;write(records, **kwargs)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;abstractmethod&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Persist &lt;code&gt;[{"text": str, "metadata": dict}]&lt;/code&gt; records&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;read(query, limit, **kwargs)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;abstractmethod&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Return top-N relevant records for query&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;get_description()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;abstractmethod&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Human-readable description for agent routing&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;add_schema(config)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Inherited&lt;/td&gt;
&lt;td&gt;Merge config dict into backend schema&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;schema()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Inherited&lt;/td&gt;
&lt;td&gt;Returns &lt;code&gt;{"backend": name, ...schema_config}&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;format_results(rows)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Optional override&lt;/td&gt;
&lt;td&gt;Format records for agent response&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;close()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Optional override&lt;/td&gt;
&lt;td&gt;Release connections / flush buffers&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Writing a Custom Adapter
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;agentkernel.knowledgebase.base&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;KnowledgeBase&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Record&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;typing&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Any&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Iterable&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;List&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Mapping&lt;/span&gt;


&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;PineconeBackend&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;KnowledgeBase&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;

    &lt;span class="nd"&gt;@property&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;backend_name&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;PineconeKB&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;connect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;kwargs&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;pinecone&lt;/span&gt;
        &lt;span class="n"&gt;pinecone&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;init&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;api_key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;kwargs&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;api_key&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;environment&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;kwargs&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;env&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_index&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;pinecone&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Index&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;kwargs&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;index_name&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;write&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;records&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Iterable&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;Record&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;kwargs&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;vectors&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;
        &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;records&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;embedding&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;embed&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;text&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;  &lt;span class="c1"&gt;# your embedding function
&lt;/span&gt;            &lt;span class="n"&gt;vectors&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;metadata&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;id&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;embedding&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;text&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;text&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]}))&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_index&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;upsert&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;vectors&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;vectors&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;read&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;query&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;limit&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;kwargs&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;List&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;Record&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt;
        &lt;span class="n"&gt;embedding&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;embed&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;query&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;results&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_index&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;query&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;vector&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;embedding&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;top_k&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;limit&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;include_metadata&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;text&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;m&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;metadata&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;text&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;metadata&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;m&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;metadata&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]}&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;m&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;results&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;matches&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]]&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;get_description&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Pinecone vector store for high-scale semantic search over product embeddings.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Register it exactly like the built-ins:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;pinecone_kb&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;PineconeBackend&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;add_schema&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;description&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Product embedding store — high-scale semantic similarity search.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;usage&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Pass a natural language query. Returns semantically nearest product entries.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;

&lt;span class="n"&gt;kb&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;KnowledgeBuilder&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="n"&gt;pinecone_kb&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;g_db&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;semantic_map&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;semantic_map&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Full Wiring Example (OpenAI Agents SDK)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;agentkernel.knowledgebase.knowledgebuilder&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;KnowledgeBuilder&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;agentkernel.knowledgebase.chroma&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;ChromaManager&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;agentkernel.knowledgebase.neo4j&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Neo4jManager&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;agentkernel.knowledgebase.starburst&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;StarburstManager&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;agentkernel.openai&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;OpenAIToolBuilder&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;agents&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Agent&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Runner&lt;/span&gt;

&lt;span class="c1"&gt;# 1. Configure backends
&lt;/span&gt;&lt;span class="n"&gt;v_db&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;ChromaManager&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;DocsKB&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;add_schema&lt;/span&gt;&lt;span class="p"&gt;({...})&lt;/span&gt;
&lt;span class="n"&gt;g_db&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Neo4jManager&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;RelGraph&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;add_schema&lt;/span&gt;&lt;span class="p"&gt;({...})&lt;/span&gt;
&lt;span class="n"&gt;s_db&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;StarburstManager&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Analytics&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;add_schema&lt;/span&gt;&lt;span class="p"&gt;({...})&lt;/span&gt;

&lt;span class="c1"&gt;# 2. Define semantic map
&lt;/span&gt;&lt;span class="n"&gt;semantic_map&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;&amp;lt;CUSTOMER_TABLE&amp;gt;&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;catalog.crm.customers&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;&amp;lt;ORDERS_TABLE&amp;gt;&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;   &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;catalog.sales.orders&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;# 3. Build KB tools
&lt;/span&gt;&lt;span class="n"&gt;kb&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;KnowledgeBuilder&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="n"&gt;v_db&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;g_db&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;s_db&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;semantic_map&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;semantic_map&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;kb_tools&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;kb&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;build&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="c1"&gt;# 4. Connect backends
&lt;/span&gt;&lt;span class="n"&gt;v_db&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;connect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;host&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;localhost&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;port&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;8000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;collection&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;docs&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;g_db&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;connect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;uri&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;bolt://localhost:7687&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;neo4j&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;password&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;...&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;s_db&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;connect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;host&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;galaxy.starburst.io&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;port&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;443&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;token&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;...&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;catalog&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;kb_sheets&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# 5. Create the router agent
&lt;/span&gt;&lt;span class="n"&gt;router&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Agent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;KnowledgeRouter&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;instructions&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Route queries to the correct knowledge backend. &lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
                 &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Check schemas first. Starburst is read-only.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;tools&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;OpenAIToolBuilder&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;bind&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;kb_tools&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# 6. Run
&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;Runner&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;run&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;router&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;What are our top 5 customers by revenue this month?&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;final_output&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Importing from &lt;code&gt;agentkernel.knowledgebase&lt;/code&gt;
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;agentkernel.knowledgebase.base&lt;/span&gt;          &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;KnowledgeBase&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Record&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;agentkernel.knowledgebase.knowledgebuilder&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;KnowledgeBuilder&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;agentkernel.knowledgebase.chroma&lt;/span&gt;        &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;ChromaManager&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;agentkernel.knowledgebase.neo4j&lt;/span&gt;         &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Neo4jManager&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;agentkernel.knowledgebase.starburst&lt;/span&gt;     &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;StarburstManager&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;p&gt;Knowledge bases are the layer that transforms AI agents from stateless request handlers into systems that genuinely accumulate expertise. The built-in ChromaDB, Neo4j, and Starburst backends cover the three fundamental storage paradigms. The custom adapter API means you're never locked out of your existing infrastructure.&lt;/p&gt;

&lt;p&gt;The compounding effect is real. The first agent that writes back to the KB makes the next session better. Over time, your agents stop being expensive autocomplete and start being genuine institutional knowledge systems.&lt;/p&gt;

&lt;p&gt;That's the shift. Build it today.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://kernel.yaala.ai/docs/advanced/knowledge-bases" rel="noopener noreferrer"&gt;→ Knowledge Bases Documentation&lt;/a&gt;&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;&lt;a href="https://github.com/yaalalabs/agent-kernel/tree/develop/examples/cli/knowledgebase/openai" rel="noopener noreferrer"&gt;→ Example: OpenAI KB Router&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://kernel.yaala.ai/blog/knowledge-bases-self-evolving-agents" rel="noopener noreferrer"&gt;kernel.yaala.ai&lt;/a&gt; on May 4, 2026.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>agentkernel</category>
      <category>knowledgebases</category>
      <category>chromadb</category>
      <category>neo4j</category>
    </item>
    <item>
      <title>Walled AI Guardrails in Practice</title>
      <dc:creator>AK</dc:creator>
      <pubDate>Tue, 06 Oct 2026 10:38:02 +0000</pubDate>
      <link>https://dev.to/agent-kernel/walled-ai-guardrails-in-practice-1j8g</link>
      <guid>https://dev.to/agent-kernel/walled-ai-guardrails-in-practice-1j8g</guid>
      <description>&lt;p&gt;&lt;em&gt;By &lt;a href="https://github.com/yaalalabs" rel="noopener noreferrer"&gt;Yaala Labs&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Walled AI gives us a clean, practical safety + PII masking pipeline for agent input/output flows. It is easy to integrate, fast to test, and useful for production guardrail baselines.&lt;/p&gt;

&lt;p&gt;But like every real provider integration, there are edge cases.&lt;/p&gt;

&lt;p&gt;This post covers the capabilities that made Walled AI a good fit for Agent Kernel, the real-world edge cases we encountered, and the implementation choices we made to keep behavior safe and predictable.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why We Chose Walled AI
&lt;/h2&gt;

&lt;p&gt;For Agent Kernel, we needed guardrails that could do two things quickly:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Block unsafe input before an LLM call.&lt;/li&gt;
&lt;li&gt;Mask sensitive PII before the prompt reaches the model.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Walled AI gives both via:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;Protect&lt;/code&gt; for safety checks.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Redact&lt;/code&gt; for masking sensitive values.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That made it a strong fit for a provider-level guardrail option in our framework.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Walled AI Does Well
&lt;/h2&gt;

&lt;p&gt;Before discussing edge cases, it is important to highlight the strengths that made this integration practical:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Fast safety checks that can block unsafe prompts before they hit an LLM.&lt;/li&gt;
&lt;li&gt;Built-in PII masking flow with reversible placeholders for controlled unmasking.&lt;/li&gt;
&lt;li&gt;Simple API surface (&lt;code&gt;Protect&lt;/code&gt; + &lt;code&gt;Redact&lt;/code&gt;) that is easy to operationalize.&lt;/li&gt;
&lt;li&gt;Good fit for runtime guardrail layering in agent systems.&lt;/li&gt;
&lt;li&gt;Optional local-model experimentation path for moderation workflows.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For many teams, this baseline is enough to ship a strong first guardrail layer quickly.&lt;/p&gt;

&lt;h2&gt;
  
  
  How the Flow Works in Agent Kernel
&lt;/h2&gt;

&lt;p&gt;At a high level:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Each incoming text request is checked with &lt;code&gt;Protect&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;If safe, the same text is sent to &lt;code&gt;Redact&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Masked text is forwarded to the agent.&lt;/li&gt;
&lt;li&gt;Placeholder mapping is stored in the session’s non-volatile cache (via &lt;code&gt;session.get_non_volatile_cache()&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;On output, placeholders are restored from this non-volatile cache before replying to the user.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;In Agent Kernel, we intentionally process requests individually and preserve non-text request objects (files/images/other) without suppressing them by default. Since Walled AI is text-focused, non-text validation should be implemented via separate hooks/policies when needed.&lt;/p&gt;

&lt;h2&gt;
  
  
  Local Model Support (WalledGuard-Edge)
&lt;/h2&gt;

&lt;p&gt;Walled AI also supports a local moderation path through &lt;code&gt;walledai/walledguard-edge&lt;/code&gt; (Hugging Face), which is useful for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Offline experimentation.&lt;/li&gt;
&lt;li&gt;Cost/performance prototyping.&lt;/li&gt;
&lt;li&gt;Evaluating moderation behavior before wiring into hosted pipelines.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In Agent Kernel, this local path is treated as an optional complement to the default API-driven Walled AI guardrail integration.&lt;/p&gt;

&lt;p&gt;This gives teams flexibility:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Hosted path for managed production guardrails.&lt;/li&gt;
&lt;li&gt;Local path for controlled testing and evaluation.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Reference links:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;API access and product updates: &lt;a href="https://www.walled.ai/" rel="noopener noreferrer"&gt;www.walled.ai&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Hugging Face model page: &lt;a href="https://huggingface.co/walledai/walledguard-edge" rel="noopener noreferrer"&gt;walledai/walledguard-edge&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Limitations
&lt;/h2&gt;

&lt;p&gt;Walled AI is strong for baseline safety and PII redaction, but there are provider-level limitations teams should understand before production rollout.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. No Cross-Call Placeholder Memory
&lt;/h3&gt;

&lt;p&gt;Walled AI does not keep a session memory of placeholders across redaction calls, and it does not maintain thread history between requests.&lt;/p&gt;

&lt;p&gt;Example:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Call A: "my name is john" -&amp;gt; &lt;code&gt;my name is [Person_1]&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Call B: "my brother is james" -&amp;gt; &lt;code&gt;my brother is [Person_1]&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The same label can appear again for a different value in later calls. Teams should treat placeholder IDs as call-scoped unless they add an application-side session strategy.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Limited PII Masking Configuration Controls
&lt;/h3&gt;

&lt;p&gt;Fine-grained field-level controls can be limited for some domain requirements.&lt;/p&gt;

&lt;p&gt;Example requirement:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Mask only CVV.&lt;/li&gt;
&lt;li&gt;Keep account number visible (or partially visible).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you need this type of selective policy, you may need an extra policy layer before or after provider redaction.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Text-Centric Guardrail Surface
&lt;/h3&gt;

&lt;p&gt;The primary safety/redaction operations are text-focused. Mixed-content pipelines (text + image/file/other) still need runtime logic to preserve and route non-text objects correctly.&lt;/p&gt;

&lt;h2&gt;
  
  
  Issues in Existing Features
&lt;/h2&gt;

&lt;p&gt;These are practical issues observed while integrating current features in Agent Kernel.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Short Inputs and &lt;code&gt;INPUT_SHORT&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Very short messages like "hi", "ok", or "23" can return &lt;code&gt;INPUT_SHORT&lt;/code&gt; during redaction.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;This is not a safety violation.&lt;/li&gt;
&lt;li&gt;It means redaction was not applicable for that payload.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Agent Kernel handles this by bypassing redaction for that request and continuing.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Redaction Failure Handling
&lt;/h3&gt;

&lt;p&gt;If redaction fails for reasons other than &lt;code&gt;INPUT_SHORT&lt;/code&gt;, allowing the exception to bubble can fail the full request path.&lt;/p&gt;

&lt;p&gt;In the current implementation, Agent Kernel logs the exception and re-raises it rather than returning a fallback response.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Tracing Context Loss on Output Rewrite
&lt;/h3&gt;

&lt;p&gt;If unmasking creates a new reply object without preserving metadata, tracing tools can lose input-output linkage.&lt;/p&gt;

&lt;p&gt;In the current implementation, unmasking returns a new &lt;code&gt;AgentReplyText&lt;/code&gt; with rewritten text and does not preserve &lt;code&gt;prompt&lt;/code&gt; metadata by default.&lt;/p&gt;

&lt;h2&gt;
  
  
  What We Improved in Agent Kernel
&lt;/h2&gt;

&lt;p&gt;Based on integration feedback and code reviews, we implemented these hardening changes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Per-request text processing for safety + redaction.&lt;/li&gt;
&lt;li&gt;Pass-through for non-text request types.&lt;/li&gt;
&lt;li&gt;Explicit &lt;code&gt;INPUT_SHORT&lt;/code&gt; bypass; non-&lt;code&gt;INPUT_SHORT&lt;/code&gt; redaction errors are logged and re-raised.&lt;/li&gt;
&lt;li&gt;Output unmasking support, with metadata preservation still an active consideration.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Recommendations for Teams Using Walled AI
&lt;/h2&gt;

&lt;p&gt;If you are integrating Walled AI into your own framework/runtime:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Treat placeholders as call-scoped unless you explicitly design session behavior.&lt;/li&gt;
&lt;li&gt;Handle short-input redaction outcomes (&lt;code&gt;INPUT_SHORT&lt;/code&gt;) as expected edge cases.&lt;/li&gt;
&lt;li&gt;Do not suppress non-text content by default just because a provider focuses on text; use a separate hook/policy to validate non-text content as needed.&lt;/li&gt;
&lt;li&gt;Keep observability context (&lt;code&gt;prompt&lt;/code&gt;, session IDs, trace metadata) intact.&lt;/li&gt;
&lt;li&gt;Add a policy layer if you need highly selective PII masking logic.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Final Take
&lt;/h2&gt;

&lt;p&gt;Walled AI is a strong guardrail building block, especially for fast safety + PII integration.&lt;/p&gt;

&lt;p&gt;Its biggest advantage is speed to value: you get practical safety and masking quickly, with a clean integration model.&lt;/p&gt;

&lt;p&gt;The key is not assuming provider behavior equals application behavior.&lt;/p&gt;

&lt;p&gt;Production-safe integrations come from the combination of provider checks, session-aware runtime logic, and explicit handling of edge cases like short inputs, placeholder collisions, and tracing continuity.&lt;/p&gt;

&lt;p&gt;That combination is where reliability comes from.&lt;/p&gt;

&lt;h2&gt;
  
  
  Related Resources
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://walled.ai/" rel="noopener noreferrer"&gt;Walled AI Documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/yaalalabs/agent-kernel/blob/develop/docs/docs/advanced/guardrails-walledai.md" rel="noopener noreferrer"&gt;Walled AI Guardrails (Agent Kernel Docs)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/yaalalabs/agent-kernel/blob/develop/examples/cli/guardrail/walledai/README.md" rel="noopener noreferrer"&gt;Walled AI Example (Agent Kernel)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://kernel.yaala.ai/blog/walledai-guardrails" rel="noopener noreferrer"&gt;kernel.yaala.ai&lt;/a&gt; on March 10, 2026.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>agentkernel</category>
      <category>guardrails</category>
      <category>walledai</category>
      <category>pii</category>
    </item>
    <item>
      <title>Agent Skills: Agent Kernel Builds Enterprise Agents for You</title>
      <dc:creator>AK</dc:creator>
      <pubDate>Tue, 06 Oct 2026 10:35:20 +0000</pubDate>
      <link>https://dev.to/agent-kernel/agent-skills-agent-kernel-builds-enterprise-agents-for-you-h0d</link>
      <guid>https://dev.to/agent-kernel/agent-skills-agent-kernel-builds-enterprise-agents-for-you-h0d</guid>
      <description>&lt;p&gt;&lt;em&gt;By &lt;a href="https://github.com/yaalalabs" rel="noopener noreferrer"&gt;Yaala Labs&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;What if you never had to read a single page of Agent Kernel documentation?&lt;/p&gt;

&lt;p&gt;What if you didn't need to know which agentic framework to use, how to wire handoffs, how to configure session persistence, or how to write Terraform for a cloud deployment?&lt;/p&gt;

&lt;p&gt;What if you just told your coding assistant what you wanted — and Agent Kernel handled the rest?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;That's exactly what Agent Skills deliver.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Agent Kernel Exposes Its Entire Capability Set as Skills
&lt;/h2&gt;

&lt;p&gt;This is the idea that changes everything: &lt;strong&gt;Agent Kernel doesn't ask you to learn it. It teaches your coding assistant instead.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Every feature Agent Kernel supports — every framework, every deployment target, every integration, every capability — is packaged as a skill that your coding assistant can read and act on. The skills contain the same knowledge the Agent Kernel team has: the right patterns, the right config keys, the right import paths, the right framework-specific gotchas, the right Terraform modules. All of it.&lt;/p&gt;

&lt;p&gt;When you install Agent Kernel skills, you're not installing a tutorial. You're giving your coding assistant &lt;strong&gt;the complete expertise to develop and deploy enterprise AI agents on your behalf.&lt;/strong&gt; You describe what you want in plain English. Your assistant — armed with Agent Kernel's own skills — writes the code, wires the config, and gets it right.&lt;/p&gt;

&lt;p&gt;No documentation to read. No experience required. No trial and error.&lt;/p&gt;

&lt;h2&gt;
  
  
  You Don't Need to Be a Developer
&lt;/h2&gt;

&lt;p&gt;Traditional agent frameworks assume you're an experienced developer. You need to understand framework APIs, deployment infrastructure, config formats, dependency management. The learning curve is steep and the documentation is long.&lt;/p&gt;

&lt;p&gt;Agent Kernel takes a radically different approach. By publishing its capabilities as skills, Agent Kernel puts its expertise directly into the hands of your coding assistant. The assistant becomes the developer. You become the director.&lt;/p&gt;

&lt;p&gt;Want an enterprise agent that handles customer support across Slack and WhatsApp, with guardrails, session persistence, and tracing — deployed to AWS? Here's your workflow:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"Create a new agent project using OpenAI with REST API"&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;"Add a triage agent, a support agent, and a billing agent with handoffs"&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;"Add Slack and WhatsApp integration"&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;"Add Redis session persistence, Bedrock guardrails, and Langfuse tracing"&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;"Deploy to AWS Lambda with DynamoDB sessions"&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;"Set up automated testing with judge mode"&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Six prompts. No documentation. No framework expertise. A production-grade enterprise agent — scaffolded, built, integrated, hardened, deployed, and tested.&lt;/p&gt;

&lt;p&gt;Each prompt activates a different Agent Kernel skill. Each skill tells your coding assistant exactly what to do — not in vague terms, but with precise instructions covering every framework Agent Kernel supports: OpenAI Agents SDK, CrewAI, LangGraph, and Google ADK.&lt;/p&gt;

&lt;h2&gt;
  
  
  Everything Agent Kernel Can Do, Packaged as Six Skills
&lt;/h2&gt;

&lt;p&gt;Agent Kernel publishes six skills that span the entire agent development lifecycle. Together, they cover &lt;strong&gt;every feature Agent Kernel supports&lt;/strong&gt;:&lt;/p&gt;

&lt;h3&gt;
  
  
  ak-init — Scaffold a Complete Project
&lt;/h3&gt;

&lt;p&gt;Your assistant creates a production-ready project structure: &lt;code&gt;pyproject.toml&lt;/code&gt; with the right extras, agent file, tool file, config, build script, and tests. It knows the correct setup for all four frameworks and both deployment modes (containerized and serverless).&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"Create a new agent project using CrewAI with REST API"&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  ak-build — Add Tools, Agents, and Handoffs
&lt;/h3&gt;

&lt;p&gt;The skill you'll use the most. Your assistant reads your existing project — identifies the framework, lists existing agents and tools, checks the entry point — then generates code that fits seamlessly into what's already there. It knows the handoff wiring for every framework: &lt;code&gt;handoffs=&lt;/code&gt; for OpenAI, &lt;code&gt;create_supervisor()&lt;/code&gt; for LangGraph, &lt;code&gt;sub_agents=&lt;/code&gt; for ADK, crew composition for CrewAI.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"Add a weather lookup tool and a support agent with handoffs to billing"&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  ak-add-capabilities — Guardrails, Tracing, Sessions, MCP, A2A, and More
&lt;/h3&gt;

&lt;p&gt;Your assistant adds enterprise capabilities with the correct config, code, and dependencies. This single skill covers guardrails (OpenAI, Bedrock, Walled AI), tracing (Langfuse, OpenLLMetry), session persistence (Redis, DynamoDB, Cosmos DB), MCP server exposure, A2A protocol, lifecycle hooks, and multimodal support.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"Add Redis session persistence and Langfuse tracing"&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  ak-add-integration — Connect Messaging Platforms
&lt;/h3&gt;

&lt;p&gt;Your assistant generates the handler class, environment variables, config block, and webhook setup for Slack, WhatsApp, Messenger, Instagram, Telegram, or Gmail — correctly, the first time.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"Add Slack and WhatsApp integration"&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  ak-cloud-deploy — Deploy to AWS or Azure
&lt;/h3&gt;

&lt;p&gt;Your assistant generates complete Terraform configurations for AWS Lambda, AWS ECS/Fargate, Azure Functions, or Azure Container Apps. Includes IAM roles, networking, environment variables, and container registry setup.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"Deploy my agent to AWS Lambda"&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  ak-test — Test and Debug
&lt;/h3&gt;

&lt;p&gt;Your assistant configures test modes (fuzzy, judge, fallback), generates test patterns, and knows how to diagnose the most common issues — from tool binding errors to session conflicts.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"Set up automated testing for my agent"&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Skills Know Every Framework
&lt;/h2&gt;

&lt;p&gt;Each skill isn't a generic template — it contains &lt;strong&gt;framework-specific knowledge for all four agentic frameworks&lt;/strong&gt; Agent Kernel supports. When your assistant reads a skill, it learns the differences that trip up even experienced developers:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Pattern&lt;/th&gt;
&lt;th&gt;OpenAI&lt;/th&gt;
&lt;th&gt;LangGraph&lt;/th&gt;
&lt;th&gt;CrewAI&lt;/th&gt;
&lt;th&gt;Google ADK&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Agent identity&lt;/td&gt;
&lt;td&gt;&lt;code&gt;name=&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;name=&lt;/code&gt; in &lt;code&gt;create_react_agent()&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;role=&lt;/code&gt; (not &lt;code&gt;name=&lt;/code&gt;)&lt;/td&gt;
&lt;td&gt;&lt;code&gt;name=&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Model wrapping&lt;/td&gt;
&lt;td&gt;Direct string&lt;/td&gt;
&lt;td&gt;Direct string&lt;/td&gt;
&lt;td&gt;Direct string&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;LiteLlm()&lt;/code&gt; wrapper&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Handoff wiring&lt;/td&gt;
&lt;td&gt;&lt;code&gt;handoffs=&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;create_supervisor()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Module composition&lt;/td&gt;
&lt;td&gt;&lt;code&gt;sub_agents=&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Your assistant doesn't guess which pattern to use. The skill tells it. The code is correct on the first try.&lt;/p&gt;

&lt;h2&gt;
  
  
  A Guided Journey, Not Isolated Commands
&lt;/h2&gt;

&lt;p&gt;The six skills form a natural progression. Each skill ends with a "What to do next" section that points your assistant to the logical next step:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;ak-init&lt;/code&gt;&lt;/strong&gt; → &lt;strong&gt;&lt;code&gt;ak-build&lt;/code&gt;&lt;/strong&gt; ↻ → &lt;strong&gt;&lt;code&gt;ak-add-capabilities&lt;/code&gt;&lt;/strong&gt; / &lt;strong&gt;&lt;code&gt;ak-add-integration&lt;/code&gt;&lt;/strong&gt; → &lt;strong&gt;&lt;code&gt;ak-cloud-deploy&lt;/code&gt;&lt;/strong&gt; → &lt;strong&gt;&lt;code&gt;ak-test&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Your assistant doesn't just answer your current question — it knows where you are in the development journey and guides you forward. Start with scaffolding, iterate on tools and agents, layer in enterprise capabilities, connect messaging platforms, deploy to cloud, and validate with tests.&lt;/p&gt;

&lt;p&gt;You never have to figure out "what comes next." The skills already know.&lt;/p&gt;

&lt;h2&gt;
  
  
  Works With Every Major Coding Assistant
&lt;/h2&gt;

&lt;p&gt;Agent Skills work with GitHub Copilot, Claude Code, Cursor, Windsurf, Codex, and Aider. The &lt;code&gt;ak&lt;/code&gt; CLI installs skills into the right directory for each assistant:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install &lt;/span&gt;agentkernel

&lt;span class="c"&gt;# Install skills (defaults to GitHub Copilot)&lt;/span&gt;
ak skill &lt;span class="nb"&gt;install&lt;/span&gt;

&lt;span class="c"&gt;# Or pick your assistant&lt;/span&gt;
ak skill &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;--assistant&lt;/span&gt; claude     &lt;span class="c"&gt;# → .claude/commands/&lt;/span&gt;
ak skill &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;--assistant&lt;/span&gt; cursor     &lt;span class="c"&gt;# → .cursor/rules/&lt;/span&gt;
ak skill &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;--assistant&lt;/span&gt; windsurf   &lt;span class="c"&gt;# → .windsurf/rules/&lt;/span&gt;
ak skill &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;--assistant&lt;/span&gt; codex      &lt;span class="c"&gt;# → .codex/rules/&lt;/span&gt;
ak skill &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;--assistant&lt;/span&gt; aider      &lt;span class="c"&gt;# → .aider/rules/&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Browse and explore:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ak skill list                  &lt;span class="c"&gt;# See all 6 skills&lt;/span&gt;
ak skill info ak-build         &lt;span class="c"&gt;# Full description of a skill&lt;/span&gt;
ak skill assistants            &lt;span class="c"&gt;# See supported assistants&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Built on an Open Standard
&lt;/h2&gt;

&lt;p&gt;Agent Skills follow the &lt;a href="https://agentskills.io" rel="noopener noreferrer"&gt;SKILL.md open standard&lt;/a&gt; — plain Markdown files with YAML frontmatter that coding assistants automatically discover. Each skill is lean (under 5000 tokens) so your assistant reads it fully, and precise enough to produce correct code without trial and error.&lt;/p&gt;

&lt;p&gt;Every skill also ships with an &lt;code&gt;evals/evals.json&lt;/code&gt; — structured test scenarios that validate the assistant's output. These evals are the contract: if the assistant passes them, the generated code is correct Agent Kernel code.&lt;/p&gt;

&lt;h2&gt;
  
  
  Three Commands. No Docs. Enterprise Agents.
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# 1. Install&lt;/span&gt;
pip &lt;span class="nb"&gt;install &lt;/span&gt;agentkernel

&lt;span class="c"&gt;# 2. Give your assistant Agent Kernel's expertise&lt;/span&gt;
ak skill &lt;span class="nb"&gt;install&lt;/span&gt;

&lt;span class="c"&gt;# 3. Tell it what to build&lt;/span&gt;
&lt;span class="c"&gt;# "Create a multi-agent system with triage, support, and billing"&lt;/span&gt;
&lt;span class="c"&gt;# "Add Slack integration and Redis sessions"&lt;/span&gt;
&lt;span class="c"&gt;# "Deploy to AWS Lambda and set up testing"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You don't read the documentation. You don't learn the framework. You don't study the deployment patterns. &lt;strong&gt;Agent Kernel's skills already know all of it — and they teach your coding assistant so it can build enterprise agents for you.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Skills for Contributors Too: The &lt;code&gt;.agents&lt;/code&gt; Folder
&lt;/h2&gt;

&lt;p&gt;Agent Skills aren't just for users building agents. They also power Agent Kernel's own development.&lt;/p&gt;

&lt;p&gt;The Agent Kernel repository ships a &lt;code&gt;.agents/skills/&lt;/code&gt; folder containing seven developer skills — the same open standard, but focused inward. These skills teach coding assistants how to contribute to Agent Kernel itself:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Skill&lt;/th&gt;
&lt;th&gt;What It Teaches Your Assistant&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;ak-dev-architecture&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Core abstractions, design principles, adapter pattern, execution flow — everything needed to understand the codebase&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;ak-dev-new-framework-integration&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Step-by-step guide to add a new agent framework adapter (beyond OpenAI, CrewAI, LangGraph, Google ADK)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;ak-dev-new-messaging-integration&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;How to add a new messaging platform (beyond Slack, WhatsApp, Messenger, Instagram, Telegram, Gmail)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;ak-dev-new-guardrail-provider&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;How to add a new content safety provider (beyond OpenAI, Bedrock, Walled AI)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;ak-dev-new-tracing-provider&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;How to add a new observability backend (beyond Langfuse, OpenLLMetry)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;ak-dev-testing-conventions&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Pytest patterns, async testing, mocking, CI/CD workflows&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;ak-dev-code-quality&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Formatting standards, commit conventions, PR workflow&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;This means a new contributor doesn't need to spend hours studying the codebase before making their first contribution. They open the repo in their coding assistant, and the &lt;code&gt;.agents/skills/&lt;/code&gt; folder is automatically discovered. Now the assistant knows:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The architecture — how &lt;code&gt;Session&lt;/code&gt;, &lt;code&gt;Agent&lt;/code&gt;, &lt;code&gt;Runner&lt;/code&gt;, &lt;code&gt;Module&lt;/code&gt;, and &lt;code&gt;Runtime&lt;/code&gt; fit together&lt;/li&gt;
&lt;li&gt;The adapter pattern — that each framework lives in its own module under &lt;code&gt;agentkernel/framework/&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;The exact steps to add a new framework, integration, guardrail, or tracing provider&lt;/li&gt;
&lt;li&gt;The testing conventions — how to write async tests, mock external services, run CI&lt;/li&gt;
&lt;li&gt;The code quality standards — formatting, commit messages, PR checklist&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ask your assistant &lt;em&gt;"Add support for a new agent framework called X"&lt;/em&gt; and it reads &lt;code&gt;ak-dev-new-framework-integration&lt;/code&gt;. It knows to create the adapter module, implement &lt;code&gt;Agent&lt;/code&gt;, &lt;code&gt;Runner&lt;/code&gt;, and &lt;code&gt;Module&lt;/code&gt; subclasses, add optional dependencies, update exports, and write tests — all following Agent Kernel's established patterns.&lt;/p&gt;

&lt;p&gt;Ask &lt;em&gt;"Add a new tracing provider for Datadog"&lt;/em&gt; and it reads &lt;code&gt;ak-dev-new-tracing-provider&lt;/code&gt;. It knows to implement the &lt;code&gt;BaseTrace&lt;/code&gt; interface, create framework-specific traced runners, add config support, and wire up the factory.&lt;/p&gt;

&lt;p&gt;The result: &lt;strong&gt;contributors ship features faster because their coding assistant already understands the entire codebase.&lt;/strong&gt; The skills eliminate the onboarding curve. A first-time contributor with the right coding assistant can implement a complete framework adapter or messaging integration — correctly — in a single session.&lt;/p&gt;

&lt;p&gt;This is the same philosophy applied in both directions. Agent Kernel exposes its capabilities as skills so users can build agents without reading docs. And it exposes its internals as skills so contributors can extend the platform without studying the codebase. Skills all the way down.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Agent Skills follow the &lt;a href="https://agentskills.io" rel="noopener noreferrer"&gt;SKILL.md open standard&lt;/a&gt;. Agent Kernel is open-source under the Apache 2.0 license. &lt;a href="https://kernel.yaala.ai/docs" rel="noopener noreferrer"&gt;Get started →&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://kernel.yaala.ai/blog/agent-skills-cli" rel="noopener noreferrer"&gt;kernel.yaala.ai&lt;/a&gt; on March 10, 2026.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>agentkernel</category>
      <category>skills</category>
      <category>cli</category>
      <category>githubcopilot</category>
    </item>
    <item>
      <title>Write Once, Run Anywhere: Universal Tools for AI Agents</title>
      <dc:creator>AK</dc:creator>
      <pubDate>Tue, 06 Oct 2026 10:32:57 +0000</pubDate>
      <link>https://dev.to/agent-kernel/write-once-run-anywhere-universal-tools-for-ai-agents-1mmg</link>
      <guid>https://dev.to/agent-kernel/write-once-run-anywhere-universal-tools-for-ai-agents-1mmg</guid>
      <description>&lt;p&gt;&lt;em&gt;By &lt;a href="https://github.com/yaalalabs" rel="noopener noreferrer"&gt;Yaala Labs&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Stop rewriting the same tools for different AI frameworks.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Imagine building a calculator app, then discovering you need to rebuild it from scratch every time you want to run it on a different device. That's what building AI agent tools feels like today.&lt;/p&gt;

&lt;p&gt;Write a weather lookup tool for OpenAI? It won't work with Google's framework. Build it for CrewAI? Start over if you switch to LangGraph. This wastes time and creates headaches every time you want to try a new AI framework.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Agent Kernel solves this: write your tools once, use them everywhere.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The Problem: Every Framework Wants Tools Written Differently
&lt;/h2&gt;

&lt;p&gt;Think of tools as capabilities you give your AI agent—like looking up weather, searching a database, or sending emails. Right now, each AI framework requires you to write these tools in a completely different way.&lt;/p&gt;

&lt;p&gt;Here's the same weather tool written for four different frameworks:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# OpenAI version
&lt;/span&gt;&lt;span class="nd"&gt;@function_tool&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;get_weather&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;city&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Weather in &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;city&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;: sunny&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;

&lt;span class="c1"&gt;# CrewAI version  
&lt;/span&gt;&lt;span class="nd"&gt;@tool&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;get_weather&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;city&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Weather in &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;city&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;: sunny&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;

&lt;span class="c1"&gt;# LangGraph version
&lt;/span&gt;&lt;span class="nd"&gt;@tool&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;get_weather&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;city&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Weather in &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;city&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;: sunny&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;

&lt;span class="c1"&gt;# Google ADK version
&lt;/span&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;_get_weather&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;city&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Weather in &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;city&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;: sunny&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="n"&gt;get_weather&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;FunctionTool&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;_get_weather&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;It's the same weather lookup, but you have to write and maintain four different versions.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Want to switch frameworks? Rewrite everything. Want to try a new framework alongside your current one? Duplicate all your tools. Building 10 custom tools means maintaining 40 versions if you use all four frameworks.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Solution: Write Normal Python Functions
&lt;/h2&gt;

&lt;p&gt;With Agent Kernel, you write your tools as regular Python functions—no special decorators or framework-specific code:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;get_weather&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;city&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;Returns the weather for a given city.&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Weather in &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;city&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;: sunny, 25°C&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's it. Just a normal Python function with a helpful description. Then use it with any framework you want.&lt;/p&gt;

&lt;h2&gt;
  
  
  Using Your Tool with Any Framework
&lt;/h2&gt;

&lt;p&gt;Once you've written your tool as a normal Python function, you can add it to agents in any framework. The only thing that changes is one line of code:&lt;/p&gt;

&lt;h4&gt;
  
  
  OpenAI Agents
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;agents&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Agent&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;agentkernel.openai&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;OpenAIToolBuilder&lt;/span&gt;

&lt;span class="n"&gt;weather_agent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Agent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;weather&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;instructions&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;You provide weather information.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;tools&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;OpenAIToolBuilder&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;bind&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="n"&gt;get_weather&lt;/span&gt;&lt;span class="p"&gt;]),&lt;/span&gt;  &lt;span class="c1"&gt;# ← Add your tool here
&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  CrewAI
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;crewai&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Agent&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;agentkernel.crewai&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;CrewAIToolBuilder&lt;/span&gt;

&lt;span class="n"&gt;weather_agent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Agent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;role&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;weather&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;goal&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;You provide weather information&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;backstory&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Use the get_weather tool for queries.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;tools&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;CrewAIToolBuilder&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;bind&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="n"&gt;get_weather&lt;/span&gt;&lt;span class="p"&gt;]),&lt;/span&gt;  &lt;span class="c1"&gt;# ← Add your tool here
&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  LangGraph
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;langgraph.prebuilt&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;create_react_agent&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;agentkernel.langgraph&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;LangGraphToolBuilder&lt;/span&gt;

&lt;span class="n"&gt;weather_agent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;create_react_agent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;weather&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;tools&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;LangGraphToolBuilder&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;bind&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="n"&gt;get_weather&lt;/span&gt;&lt;span class="p"&gt;]),&lt;/span&gt;  &lt;span class="c1"&gt;# ← Add your tool here
&lt;/span&gt;    &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;prompt&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Use the get_weather tool for queries.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Google ADK
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;google.adk.agents&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Agent&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;agentkernel.adk&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;GoogleADKToolBuilder&lt;/span&gt;

&lt;span class="n"&gt;weather_agent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Agent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;weather&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;gemini-2.0-flash-exp&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;description&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;You provide weather information&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;tools&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;GoogleADKToolBuilder&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;bind&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="n"&gt;get_weather&lt;/span&gt;&lt;span class="p"&gt;]),&lt;/span&gt;  &lt;span class="c1"&gt;# ← Add your tool here
&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Same &lt;code&gt;get_weather&lt;/code&gt; function. Works everywhere.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The &lt;code&gt;.bind()&lt;/code&gt; method translates your normal Python function into whatever format each framework needs. You don't have to worry about the details—just write your function once and use it anywhere.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Framework-Agnostic Tools Are So Hard
&lt;/h2&gt;

&lt;p&gt;Making tools work across frameworks sounds simple, but it's actually quite challenging. Each framework has its own way of handling tools, and these differences create real technical problems.&lt;/p&gt;

&lt;h3&gt;
  
  
  Different Execution Models
&lt;/h3&gt;

&lt;p&gt;Frameworks handle async/sync functions differently:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;LangGraph (LangChain)&lt;/strong&gt; requires you to specify whether a tool is async or sync upfront:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Sync tools use 'func' parameter
&lt;/span&gt;&lt;span class="n"&gt;StructuredTool&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;from_function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;func&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;my_tool&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Async tools use 'coroutine' parameter
&lt;/span&gt;&lt;span class="n"&gt;StructuredTool&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;from_function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;coroutine&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;my_async_tool&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;OpenAI Agents SDK&lt;/strong&gt; automatically handles both, but wraps them differently internally.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Google ADK&lt;/strong&gt; expects all tools to potentially receive a &lt;code&gt;tool_context&lt;/code&gt; parameter from the framework itself, which other frameworks don't provide.&lt;/p&gt;

&lt;p&gt;Agent Kernel detects whether your function is async or sync and generates the right code for each framework automatically. You just write &lt;code&gt;def&lt;/code&gt; or &lt;code&gt;async def&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Different Context Mechanisms
&lt;/h3&gt;

&lt;p&gt;This is the hardest problem: frameworks provide execution context (session info, runtime state) in completely different ways.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;OpenAI, CrewAI, LangGraph&lt;/strong&gt; work well with Python's standard &lt;code&gt;contextvars&lt;/code&gt;, which lets you set context in one place and access it anywhere in the call stack:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Set once before calling agent
&lt;/span&gt;&lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;set&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="c1"&gt;# Access anywhere in your tool
&lt;/span&gt;&lt;span class="n"&gt;ctx&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ToolContext&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Google ADK&lt;/strong&gt; manages its own execution context internally and doesn't reliably propagate Python's &lt;code&gt;contextvars&lt;/code&gt;. Instead, it passes a &lt;code&gt;tool_context&lt;/code&gt; parameter to every tool function:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# ADK calls your tool like this:
&lt;/span&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;my_tool&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;city&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;tool_context&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;ADKToolContext&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="c1"&gt;# ADK's context, not yours
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This means your tool function signature must be different for ADK versus other frameworks. Or does it?&lt;/p&gt;

&lt;p&gt;Agent Kernel solves this by:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Wrapping tools for ADK&lt;/strong&gt; - Adding the &lt;code&gt;tool_context&lt;/code&gt; parameter automatically&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Bridging contexts&lt;/strong&gt; - Converting ADK's context to Agent Kernel's unified &lt;code&gt;ToolContext&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Passing context through session state&lt;/strong&gt; - Storing context IDs in ADK's session and retrieving them in the wrapper&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;All this happens behind the scenes. You write one function, and it works everywhere.&lt;/p&gt;

&lt;h3&gt;
  
  
  Different Tool Metadata Requirements
&lt;/h3&gt;

&lt;p&gt;Each framework expects different information about your tool:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Framework&lt;/th&gt;
&lt;th&gt;Name Source&lt;/th&gt;
&lt;th&gt;Description Source&lt;/th&gt;
&lt;th&gt;Schema Generation&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;OpenAI&lt;/td&gt;
&lt;td&gt;Function name&lt;/td&gt;
&lt;td&gt;Docstring&lt;/td&gt;
&lt;td&gt;Automatic from type hints&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CrewAI&lt;/td&gt;
&lt;td&gt;Function name&lt;/td&gt;
&lt;td&gt;Docstring&lt;/td&gt;
&lt;td&gt;Automatic from type hints&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;LangGraph&lt;/td&gt;
&lt;td&gt;Must specify&lt;/td&gt;
&lt;td&gt;Must specify or falls back to function name&lt;/td&gt;
&lt;td&gt;Must extract from function&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Google ADK&lt;/td&gt;
&lt;td&gt;Function name&lt;/td&gt;
&lt;td&gt;Function name if no docstring&lt;/td&gt;
&lt;td&gt;Type inspection required&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Agent Kernel extracts metadata once from your Python function (name, docstring, parameters, types) and formats it appropriately for each framework.&lt;/p&gt;

&lt;h3&gt;
  
  
  Different Error Handling
&lt;/h3&gt;

&lt;p&gt;When a tool raises an exception, frameworks handle it differently:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;OpenAI&lt;/strong&gt; catches exceptions and reports them to the model&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;LangGraph&lt;/strong&gt; can retry tools or propagate errors through the graph&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;CrewAI&lt;/strong&gt; logs errors and may retry depending on agent configuration&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Google ADK&lt;/strong&gt; wraps errors in its own exception types&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Agent Kernel doesn't hide these differences (they're tied to framework behavior), but it ensures your tool code doesn't need to know which framework is calling it.&lt;/p&gt;

&lt;h3&gt;
  
  
  Different Import Paths and Dependencies
&lt;/h3&gt;

&lt;p&gt;Each framework's tool classes come from different packages:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;agents&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;function_tool&lt;/span&gt;              &lt;span class="c1"&gt;# OpenAI
&lt;/span&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;crewai_tools&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;tool&lt;/span&gt;                 &lt;span class="c1"&gt;# CrewAI  
&lt;/span&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;langchain_core.tools&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;StructuredTool&lt;/span&gt;  &lt;span class="c1"&gt;# LangGraph
&lt;/span&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;google.adk.tools&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;FunctionTool&lt;/span&gt;     &lt;span class="c1"&gt;# Google ADK
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you write tools using framework-specific decorators, you're locked in. Agent Kernel's &lt;code&gt;ToolBuilder&lt;/code&gt; classes handle these imports internally, so your tool code has zero framework dependencies.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Hidden Complexity
&lt;/h3&gt;

&lt;p&gt;Here's what Agent Kernel does behind the scenes for a single tool:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Inspects your function&lt;/strong&gt; - signature, type hints, docstring, async/sync&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Generates metadata&lt;/strong&gt; - name, description, parameter schema&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Creates framework wrapper&lt;/strong&gt; - adds any framework-specific parameters&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Handles context bridging&lt;/strong&gt; - ensures &lt;code&gt;ToolContext.get()&lt;/code&gt; works in your tool&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Preserves semantics&lt;/strong&gt; - maintains async/sync behavior correctly&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Validates at bind time&lt;/strong&gt; - catches errors early with clear messages&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;All so you can write this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;my_tool&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;param&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;Does something useful.&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt;

&lt;span class="n"&gt;tools&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;AnyFrameworkToolBuilder&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;bind&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="n"&gt;my_tool&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;This simplicity is hard-won.&lt;/strong&gt; Framework-agnostic tools require handling edge cases most developers never see.&lt;/p&gt;

&lt;h2&gt;
  
  
  Accessing Runtime Information
&lt;/h2&gt;

&lt;p&gt;Sometimes your tools need to know things like "which user is asking?" or "what session is this?" Agent Kernel provides this information in a consistent way, regardless of which framework you're using:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;agentkernel.core&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;ToolContext&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;get_weather&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;city&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;Returns the weather for a given city.&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
    &lt;span class="c1"&gt;# Get information about the current execution
&lt;/span&gt;    &lt;span class="n"&gt;ctx&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ToolContext&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

    &lt;span class="n"&gt;session&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;session&lt;/span&gt;      &lt;span class="c1"&gt;# Who's asking?
&lt;/span&gt;    &lt;span class="n"&gt;agent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;agent&lt;/span&gt;          &lt;span class="c1"&gt;# Which agent is calling this?
&lt;/span&gt;
    &lt;span class="c1"&gt;# Example: Use session data for personalization
&lt;/span&gt;    &lt;span class="n"&gt;user_prefs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;session&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get_non_volatile_cache&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;preferences&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{})&lt;/span&gt;
    &lt;span class="n"&gt;units&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;user_prefs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;temperature_units&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;celsius&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Weather in &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;city&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;: sunny, 25°C&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This works the same way across all frameworks—you don't need to learn different methods for each one.&lt;/p&gt;

&lt;h2&gt;
  
  
  Real Example: Switching Frameworks Is Easy
&lt;/h2&gt;

&lt;p&gt;Here's a complete example using OpenAI:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;agentkernel.core&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;ToolContext&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;agentkernel.openai&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;OpenAIModule&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;OpenAIToolBuilder&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;agents&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Agent&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;get_weather&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;city&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;Returns the weather for a given city.&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;city&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Tokyo&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;The weather in Tokyo is sunny.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
    &lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Cannot find weather for &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;city&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;

&lt;span class="c1"&gt;# Create agents
&lt;/span&gt;&lt;span class="n"&gt;weather_agent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Agent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;weather&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;instructions&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Use the get_weather tool for weather questions.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;tools&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;OpenAIToolBuilder&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;bind&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="n"&gt;get_weather&lt;/span&gt;&lt;span class="p"&gt;]),&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;math_agent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Agent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;math&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;instructions&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;You help with math problems.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;triage_agent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Agent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;triage&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;instructions&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Route questions to the right agent.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;handoffs&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;math_agent&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;weather_agent&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nc"&gt;OpenAIModule&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="n"&gt;triage_agent&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;math_agent&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;weather_agent&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Want to try LangGraph instead?&lt;/strong&gt; Change just the framework-specific parts:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;agentkernel.langgraph&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;LangGraphModule&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;LangGraphToolBuilder&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;langgraph.prebuilt&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;create_react_agent&lt;/span&gt;

&lt;span class="c1"&gt;# Same get_weather function - no changes!
&lt;/span&gt;
&lt;span class="n"&gt;weather_agent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;create_react_agent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;weather&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;tools&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;LangGraphToolBuilder&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;bind&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="n"&gt;get_weather&lt;/span&gt;&lt;span class="p"&gt;]),&lt;/span&gt;  &lt;span class="c1"&gt;# Different builder
&lt;/span&gt;    &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nc"&gt;ChatOpenAI&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;gpt-4o-mini&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="n"&gt;prompt&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Use the get_weather tool for weather questions.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Define other agents...
&lt;/span&gt;&lt;span class="nc"&gt;LangGraphModule&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="n"&gt;triage_agent&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;math_agent&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;weather_agent&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Your &lt;code&gt;get_weather&lt;/code&gt; function? &lt;strong&gt;Completely untouched.&lt;/strong&gt; No rewriting. No debugging. Just works.&lt;/p&gt;

&lt;h2&gt;
  
  
  Async Functions Work Too
&lt;/h2&gt;

&lt;p&gt;If your tool needs to do asynchronous work (like database queries or API calls), just write it as an async function:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;search_database&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;query&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;limit&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;Searches the database for matching records.&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
    &lt;span class="n"&gt;results&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;db&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;search&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;query&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;limit&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;limit&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;str&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;results&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Works with any framework automatically
&lt;/span&gt;&lt;span class="n"&gt;tools&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;OpenAIToolBuilder&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;bind&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="n"&gt;search_database&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;span class="n"&gt;tools&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;LangGraphToolBuilder&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;bind&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="n"&gt;search_database&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;span class="n"&gt;tools&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;GoogleADKToolBuilder&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;bind&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="n"&gt;search_database&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Agent Kernel handles the async details for you—just write your function normally.&lt;/p&gt;

&lt;h2&gt;
  
  
  Using Multiple Tools
&lt;/h2&gt;

&lt;p&gt;Real agents usually need multiple tools. Just add them all to the list:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;tools&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;OpenAIToolBuilder&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;bind&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;
    &lt;span class="n"&gt;get_weather&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;search_database&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;send_email&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;get_user_profile&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;])&lt;/span&gt;

&lt;span class="n"&gt;agent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Agent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;assistant&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;instructions&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;You&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;re a helpful assistant with multiple tools.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;tools&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;tools&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;All tools work together seamlessly, regardless of your framework.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why This Matters
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Try Different Frameworks Without Rewriting Code
&lt;/h3&gt;

&lt;p&gt;Want to see if LangGraph is better than OpenAI for your use case? Just switch. Your tools keep working. No migration project needed.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Much Simpler Testing
&lt;/h3&gt;

&lt;p&gt;Test your tools as regular Python functions:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;test_get_weather&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;get_weather&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Tokyo&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;assert&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;sunny&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;lower&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No complicated framework setup. No mocking. Just normal Python testing.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Cleaner, More Readable Code
&lt;/h3&gt;

&lt;p&gt;Your tools are just functions. Easy to read. Easy to understand. Easy to maintain. No framework magic hiding what your code does.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Faster Team Onboarding
&lt;/h3&gt;

&lt;p&gt;New developers don't need to learn framework-specific tool systems. They write regular Python functions. Everything else is handled automatically.&lt;/p&gt;

&lt;h2&gt;
  
  
  Local Tools vs. MCP: When to Use Each
&lt;/h2&gt;

&lt;p&gt;You might have heard of &lt;strong&gt;MCP (Model Context Protocol)&lt;/strong&gt; and wonder: "Should I use MCP for my tools, or build them locally?"&lt;/p&gt;

&lt;p&gt;The answer depends on what your tools do. Let's break it down simply:&lt;/p&gt;

&lt;h3&gt;
  
  
  MCP: External Services
&lt;/h3&gt;

&lt;p&gt;MCP is designed for &lt;strong&gt;connecting to external tool servers&lt;/strong&gt; that run as separate processes. Think of it like calling a web API or external service.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Use MCP when:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Tools are provided by external services (like a company-wide document search server)&lt;/li&gt;
&lt;li&gt;Multiple teams share the same tool infrastructure&lt;/li&gt;
&lt;li&gt;Tools need to run independently of your agent (different machines, different languages)&lt;/li&gt;
&lt;li&gt;You're connecting to third-party tool providers&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;MCP Example:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Your Agent → Network → MCP Server → External Database
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Agent Kernel Tools: Part of Your Code
&lt;/h3&gt;

&lt;p&gt;Agent Kernel's tool binding is for &lt;strong&gt;tools that are part of your agent's business logic&lt;/strong&gt;—functions that live in your codebase alongside your agents.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Use local tool binding when:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Tools are specific to your agent's logic (like calculating pricing, formatting data)&lt;/li&gt;
&lt;li&gt;Tools access your application's state or databases directly&lt;/li&gt;
&lt;li&gt;You want simple, fast function calls without network overhead&lt;/li&gt;
&lt;li&gt;You want to test tools as regular Python code&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Local Tool Example:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Your Agent → Direct Function Call → Your Code
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Why Local Tools Are Often Better
&lt;/h3&gt;

&lt;p&gt;For most business logic, building tools directly in your agent code is simpler and more efficient:&lt;/p&gt;

&lt;h4&gt;
  
  
  1. No Extra Complexity
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Local tool - just a function
&lt;/span&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;calculate_price&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;quantity&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;item_type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;float&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;Calculate price with discounts.&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
    &lt;span class="n"&gt;base_price&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;PRICES&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;item_type&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;quantity&lt;/span&gt;
    &lt;span class="n"&gt;discount&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;get_bulk_discount&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;quantity&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;base_price&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;discount&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Use it immediately
&lt;/span&gt;&lt;span class="n"&gt;tools&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;OpenAIToolBuilder&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;bind&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="n"&gt;calculate_price&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;With MCP, you'd need to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Set up a separate MCP server process&lt;/li&gt;
&lt;li&gt;Define network protocols&lt;/li&gt;
&lt;li&gt;Handle connection errors and retries&lt;/li&gt;
&lt;li&gt;Manage server lifecycle&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  2. Faster Execution
&lt;/h4&gt;

&lt;p&gt;Local tools are just function calls—microseconds. MCP involves network requests—milliseconds or more. For tools that run frequently, this adds up.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Local: Direct call, ~microseconds
&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;calculate_price&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;widget&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# MCP: Network round-trip, ~10-100ms
&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;mcp_client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;call_tool&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;calculate_price&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{...})&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  3. Easier Testing
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Test local tools like any Python function
&lt;/span&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;test_bulk_discount&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="n"&gt;price&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;calculate_price&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;quantity&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;item_type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;widget&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;assert&lt;/span&gt; &lt;span class="n"&gt;price&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="nf"&gt;calculate_price&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;quantity&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;item_type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;widget&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# MCP tools require running a server, mocking network calls, etc.
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  4. Better Debugging
&lt;/h4&gt;

&lt;p&gt;When something goes wrong with a local tool, your debugger works normally. Step through your code, inspect variables, see the full stack trace.&lt;/p&gt;

&lt;p&gt;With MCP, you're debugging across process boundaries and network calls. Much harder.&lt;/p&gt;

&lt;h4&gt;
  
  
  5. Simpler Deployment
&lt;/h4&gt;

&lt;p&gt;Local tools deploy with your agent—one Docker container, one deployment. MCP tools need separate infrastructure, monitoring, and coordination.&lt;/p&gt;

&lt;h3&gt;
  
  
  When MCP Makes Sense
&lt;/h3&gt;

&lt;p&gt;Don't get us wrong—MCP is valuable for the right use cases:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Shared Corporate Tools:&lt;/strong&gt;&lt;br&gt;
Your company has a central "Employee Directory" service used by 50 different AI agents. One MCP server, everyone connects to it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;External Services:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
You're integrating with a third-party tool provider (like a specialized search engine or data enrichment service) that offers MCP access.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Language Boundaries:&lt;/strong&gt;&lt;br&gt;
Your tool is written in Rust for performance, but your agent is in Python. MCP lets them communicate.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Heavy Resources:&lt;/strong&gt;&lt;br&gt;
Your tool needs 64GB of RAM and a GPU. Run it on a dedicated server via MCP instead of bundling it with every agent instance.&lt;/p&gt;
&lt;h3&gt;
  
  
  The Practical Rule
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Start with local tools.&lt;/strong&gt; They're simpler, faster, and easier to build and test.&lt;/p&gt;

&lt;p&gt;Only use MCP when you have a specific reason:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The tool truly needs to be external&lt;/li&gt;
&lt;li&gt;Multiple agents need to share one tool instance&lt;/li&gt;
&lt;li&gt;The tool is provided by someone else as a service&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For most business logic—data formatting, calculations, querying your own databases, calling your internal APIs—local tools are the right choice.&lt;/p&gt;
&lt;h3&gt;
  
  
  Best of Both Worlds
&lt;/h3&gt;

&lt;p&gt;Agent Kernel supports both approaches. Use local tools for your custom logic, and connect to MCP servers when you need external capabilities:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Local tools for your business logic
&lt;/span&gt;&lt;span class="n"&gt;local_tools&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;OpenAIToolBuilder&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;bind&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;
    &lt;span class="n"&gt;calculate_price&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;format_invoice&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;check_inventory&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;])&lt;/span&gt;

&lt;span class="c1"&gt;# MCP tools for external services (if needed)
# Connect to MCP server for shared document search
&lt;/span&gt;&lt;span class="n"&gt;mcp_tools&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;connect_to_mcp_server&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;company-docs&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Use both together
&lt;/span&gt;&lt;span class="n"&gt;agent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Agent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;sales_assistant&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;tools&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;local_tools&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;mcp_tools&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;The key insight:&lt;/strong&gt; Local tools and MCP serve different purposes. Don't add MCP complexity unless you need it. For most agent development, simple local tools are the better choice.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Your Tools Keep
&lt;/h2&gt;

&lt;p&gt;When you write a tool as a normal Python function, Agent Kernel automatically extracts everything the AI needs to know:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Function name&lt;/strong&gt; → The tool's name&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Docstring&lt;/strong&gt; → Description (helps the AI know when to use it)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Parameters&lt;/strong&gt; → What inputs the tool needs&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Default values&lt;/strong&gt; → Optional parameters&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Return type&lt;/strong&gt; → What the tool gives back&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The AI sees the same tool, no matter which framework you use.&lt;/p&gt;

&lt;h2&gt;
  
  
  Getting Started
&lt;/h2&gt;

&lt;p&gt;Using framework-agnostic tools is simple:&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Install Agent Kernel
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install &lt;/span&gt;agentkernel
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2. Write your tool as a normal function
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;my_tool&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;param&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;Description of what this tool does.&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
    &lt;span class="c1"&gt;# Your code here
&lt;/span&gt;    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  3. Add it to your agent
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;agentkernel.openai&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;OpenAIToolBuilder&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;agents&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Agent&lt;/span&gt;

&lt;span class="n"&gt;agent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Agent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;my_agent&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;instructions&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Use my_tool when needed.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;tools&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;OpenAIToolBuilder&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;bind&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="n"&gt;my_tool&lt;/span&gt;&lt;span class="p"&gt;]),&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's all. Three steps, and your tool works across all frameworks.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Stop maintaining multiple versions of the same tool.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Write your tools once. Test them once. Use them everywhere. That's the promise of framework-agnostic tools in Agent Kernel.&lt;/p&gt;

&lt;p&gt;Try different frameworks. Migrate painlessly. Focus on building great tools, not maintaining duplicates.&lt;/p&gt;




&lt;h2&gt;
  
  
  Learn More
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://yaalalabs.github.io/agent-kernel/docs/core-concepts/tools" rel="noopener noreferrer"&gt;Tool Documentation&lt;/a&gt;&lt;/strong&gt; — Complete guide with more examples&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://github.com/yaalalabs/agent-kernel/tree/main/examples" rel="noopener noreferrer"&gt;Code Examples&lt;/a&gt;&lt;/strong&gt; — Working examples for all frameworks&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://github.com/yaalalabs/agent-kernel" rel="noopener noreferrer"&gt;Join our Community&lt;/a&gt;&lt;/strong&gt; — Questions? We're here to help&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Start building framework-agnostic tools today. Your future self will thank you.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://kernel.yaala.ai/blog/framework-agnostic-tool-binding" rel="noopener noreferrer"&gt;kernel.yaala.ai&lt;/a&gt; on February 18, 2026.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>agentkernel</category>
      <category>tools</category>
      <category>openai</category>
      <category>googleadk</category>
    </item>
    <item>
      <title>Agent Kernel Goes Multi-Cloud: Azure Support is Here</title>
      <dc:creator>AK</dc:creator>
      <pubDate>Tue, 06 Oct 2026 10:29:48 +0000</pubDate>
      <link>https://dev.to/agent-kernel/agent-kernel-goes-multi-cloud-azure-support-is-here-29he</link>
      <guid>https://dev.to/agent-kernel/agent-kernel-goes-multi-cloud-azure-support-is-here-29he</guid>
      <description>&lt;p&gt;&lt;em&gt;By &lt;a href="https://github.com/yaalalabs" rel="noopener noreferrer"&gt;Yaala Labs&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Your AI investment should never be hostage to a single cloud provider.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Write once. Deploy anywhere. That's not a slogan, it's now reality.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Today, we're announcing full Azure support for Agent Kernel. Your AI agents can now run on Azure Container Apps, Azure Functions, and leverage Cosmos DB for persistent memory, all with zero changes to your agent code. The same agent that runs on AWS Lambda today can run on Azure Functions tomorrow. This is multi-cloud done right.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Multi-Cloud Matters
&lt;/h2&gt;

&lt;p&gt;The cloud landscape has fundamentally changed how enterprises think about infrastructure:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;More than 90% of enterprises&lt;/strong&gt; will operate in multi-cloud environments by 2027 (Source: &lt;a href="https://www.gartner.com/en/newsroom/press-releases/2024-11-19-gartner-forecasts-worldwide-public-cloud-end-user-spending-to-total-723-billion-dollars-in-2025" rel="noopener noreferrer"&gt;Gartner&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Vendor lock-in&lt;/strong&gt; is the top concern for cloud decision-makers&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Regulatory requirements&lt;/strong&gt; often mandate geographic or provider diversity&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cost optimization&lt;/strong&gt; demands the flexibility to leverage competitive pricing&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Yet most AI agent frameworks force you to choose. Build for AWS, rebuild for Azure. Agent Kernel eliminates this false choice.&lt;/p&gt;

&lt;h2&gt;
  
  
  Cloud-Agnostic by Design
&lt;/h2&gt;

&lt;p&gt;Agent Kernel wasn't retrofitted for multi-cloud, it was &lt;strong&gt;architected for it from day one&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ffpb7phmuvrj77b4ac1xv.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ffpb7phmuvrj77b4ac1xv.png" alt="Agent Kernel Multi-Cloud Architecture" width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The separation is clean:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Your agent logic&lt;/strong&gt; stays unchanged across clouds&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Agent Kernel runtime&lt;/strong&gt; handles the abstraction&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cloud-specific adapters&lt;/strong&gt; manage infrastructure differences&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What's Available on Azure
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Serverless: Azure Functions
&lt;/h3&gt;

&lt;p&gt;Perfect for variable workloads and cost-sensitive deployments:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Automatic scaling from zero to thousands of concurrent executions&lt;/li&gt;
&lt;li&gt;Pay only for what you use&lt;/li&gt;
&lt;li&gt;Native integration with Azure API Management&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Containerized: Azure Container Apps
&lt;/h3&gt;

&lt;p&gt;Ideal for consistent, low-latency workloads:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Managed Kubernetes without the Kubernetes complexity&lt;/li&gt;
&lt;li&gt;Built-in scaling and load balancing&lt;/li&gt;
&lt;li&gt;Reduced cold start latency compared to serverless&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Memory: Cosmos DB Integration
&lt;/h3&gt;

&lt;p&gt;Enterprise-grade session persistence:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Global distribution with multi-region writes&lt;/li&gt;
&lt;li&gt;Guaranteed single-digit millisecond latency&lt;/li&gt;
&lt;li&gt;Automatic and instant scalability&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Full Enterprise Feature Parity
&lt;/h3&gt;

&lt;p&gt;Azure deployments get the complete Agent Kernel feature set:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Observability&lt;/strong&gt;: Full tracing, metrics, and audit logs across all agent operations&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Guardrails&lt;/strong&gt;: Content safety and PII protection with OpenAI Guardrails support&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Comprehensive Test Framework&lt;/strong&gt;: CLI-based testing and automated scenario validation&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;MCP &amp;amp; A2A Support&lt;/strong&gt;: Multi-context processing and agent-to-agent communication&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;No compromises. No feature gaps. The same production-grade capabilities on every cloud.&lt;/p&gt;

&lt;h2&gt;
  
  
  Getting Started
&lt;/h2&gt;

&lt;p&gt;Deploying to Azure is as simple as deploying to AWS:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Clone an Azure example&lt;/span&gt;
git clone https://github.com/yaalalabs/agent-kernel
&lt;span class="nb"&gt;cd &lt;/span&gt;examples/azure-containerized/openai-cosmos/deploy

&lt;span class="c"&gt;# Configure and deploy&lt;/span&gt;
terraform init
terraform apply
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Your agents. Your framework. Your choice of cloud.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Road Ahead: Google Cloud Platform
&lt;/h2&gt;

&lt;p&gt;Multi-cloud isn't complete with two providers. &lt;strong&gt;GCP support is our next milestone.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;We're bringing Agent Kernel to Google Cloud with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Cloud Run&lt;/strong&gt; for containerized workloads&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cloud Functions&lt;/strong&gt; for serverless execution
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Firestore&lt;/strong&gt; and &lt;strong&gt;Cloud Spanner&lt;/strong&gt; for persistent memory&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The goal remains unchanged: write your agent once, deploy it everywhere.&lt;/p&gt;




&lt;h2&gt;
  
  
  Join the Multi-Cloud Movement
&lt;/h2&gt;

&lt;p&gt;Agent Kernel is open source and community-driven. Whether you're running on AWS today and evaluating Azure, or building greenfield with multi-cloud requirements, we've got you covered.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;📖 &lt;a href="https://kernel.yaala.ai/docs/deployment/overview" rel="noopener noreferrer"&gt;Azure Deployment Guide&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;💻 &lt;a href="https://github.com/yaalalabs/agent-kernel" rel="noopener noreferrer"&gt;GitHub Repository&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;💬 &lt;a href="https://discord.gg/snrPzb46uu" rel="noopener noreferrer"&gt;Discord Community&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;The future of AI agents is multi-cloud. The future is now.&lt;/strong&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://kernel.yaala.ai/blog/azure-multi-cloud-support" rel="noopener noreferrer"&gt;kernel.yaala.ai&lt;/a&gt; on February 16, 2026.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>agentkernel</category>
      <category>azure</category>
      <category>multicloud</category>
      <category>aws</category>
    </item>
    <item>
      <title>Safe AI at Scale: Introducing Guardrails for Agent Kernel</title>
      <dc:creator>AK</dc:creator>
      <pubDate>Tue, 06 Oct 2026 10:26:06 +0000</pubDate>
      <link>https://dev.to/agent-kernel/safe-ai-at-scale-introducing-guardrails-for-agent-kernel-34ec</link>
      <guid>https://dev.to/agent-kernel/safe-ai-at-scale-introducing-guardrails-for-agent-kernel-34ec</guid>
      <description>&lt;p&gt;&lt;em&gt;By &lt;a href="https://github.com/yaalalabs" rel="noopener noreferrer"&gt;Yaala Labs&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Deploying AI agents in production comes with critical business risks: brand damage from inappropriate responses, regulatory penalties from data leaks, and customer trust erosion from security breaches. Today, we're announcing &lt;strong&gt;Guardrails&lt;/strong&gt; for Agent Kernel - enterprise-grade content safety that protects your business while accelerating your AI initiatives.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Business Case for AI Guardrails
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Your AI agents are powerful. But are they safe for your business?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Every unguarded AI interaction is a potential liability:&lt;/p&gt;

&lt;h3&gt;
  
  
  💰 &lt;strong&gt;Financial Risk&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Data breach penalties&lt;/strong&gt;: GDPR fines up to €20M or 4% of global revenue&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;HIPAA violations&lt;/strong&gt;: Up to $1.5M per year for healthcare data exposure&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;PCI DSS non-compliance&lt;/strong&gt;: Fines, increased processing fees, and contract termination&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Legal costs&lt;/strong&gt;: Class-action lawsuits from PII leakage&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  🎯 &lt;strong&gt;Brand &amp;amp; Reputation Risk&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Inappropriate content&lt;/strong&gt;: One viral screenshot of your AI saying something offensive can tank customer trust&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Off-brand responses&lt;/strong&gt;: Inconsistent messaging damages brand equity&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Customer service failures&lt;/strong&gt;: Frustrated users share negative experiences publicly&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Competitive disadvantage&lt;/strong&gt;: Customers choose competitors with safer AI&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  ⚖️ &lt;strong&gt;Compliance &amp;amp; Regulatory Risk&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Industry regulations&lt;/strong&gt;: Healthcare (HIPAA), finance (PCI DSS), insurance (state regulations)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Privacy laws&lt;/strong&gt;: GDPR, CCPA, PIPEDA, and emerging global privacy frameworks&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Sector-specific&lt;/strong&gt;: Legal advice restrictions, financial guidance disclaimers&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Audit failures&lt;/strong&gt;: Non-compliant AI systems block certifications and partnerships&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The Solution: Guardrails That Work for Business
&lt;/h2&gt;

&lt;p&gt;Agent Kernel's guardrails deliver &lt;strong&gt;measurable business value&lt;/strong&gt;:&lt;/p&gt;

&lt;p&gt;✅ &lt;strong&gt;Reduce legal exposure&lt;/strong&gt; - Automatic PII detection prevents data leaks before they happen&lt;br&gt;&lt;br&gt;
✅ &lt;strong&gt;Accelerate compliance&lt;/strong&gt; - Pre-built policies for HIPAA, PCI DSS, and GDPR requirements&lt;br&gt;&lt;br&gt;
✅ &lt;strong&gt;Protect brand reputation&lt;/strong&gt; - Block harmful content before customers see it&lt;br&gt;&lt;br&gt;
✅ &lt;strong&gt;Enable faster deployment&lt;/strong&gt; - Pre-configured safety layers reduce time-to-market&lt;br&gt;&lt;br&gt;
✅ &lt;strong&gt;Lower operational costs&lt;/strong&gt; - Automated content filtering reduces manual review overhead  &lt;/p&gt;
&lt;h2&gt;
  
  
  Two Enterprise-Grade Options
&lt;/h2&gt;

&lt;p&gt;Choose the right guardrail provider for your business needs:&lt;/p&gt;
&lt;h3&gt;
  
  
  🛡️ &lt;strong&gt;OpenAI Guardrails&lt;/strong&gt; - Fast Time-to-Value
&lt;/h3&gt;

&lt;p&gt;Perfect for startups and mid-market companies needing rapid deployment:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Quick setup with API key authentication&lt;/li&gt;
&lt;li&gt;Flexible policies you can adjust without vendor dependencies&lt;/li&gt;
&lt;li&gt;Works across any cloud or on-premise infrastructure&lt;/li&gt;
&lt;li&gt;Cost-effective for variable workloads&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Best for:&lt;/strong&gt; SaaS companies, cross-cloud deployments, rapid MVP launches&lt;/p&gt;
&lt;h3&gt;
  
  
  🔒 &lt;strong&gt;AWS Bedrock Guardrails&lt;/strong&gt; - Enterprise Control
&lt;/h3&gt;

&lt;p&gt;Ideal for large enterprises with AWS infrastructure:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;30+ PII types including medical records and financial data&lt;/li&gt;
&lt;li&gt;Native AWS integration with IAM, CloudWatch, and audit trails&lt;/li&gt;
&lt;li&gt;Granular control through AWS Console&lt;/li&gt;
&lt;li&gt;Enterprise SLAs and support&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Best for:&lt;/strong&gt; Healthcare, financial services, regulated industries, AWS-native stacks&lt;/p&gt;
&lt;h2&gt;
  
  
  Real Business Impact
&lt;/h2&gt;
&lt;h3&gt;
  
  
  💼 Customer Support: Protect Your Customers
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Challenge:&lt;/strong&gt; Support chatbot could leak customer phone numbers or credit card details&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Solution:&lt;/strong&gt; Output guardrails detect and block PII before reaching users&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Result:&lt;/strong&gt; Zero data breach incidents, maintained customer trust, avoided GDPR fines&lt;/p&gt;
&lt;h3&gt;
  
  
  🏥 Healthcare: HIPAA Compliance Made Simple
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Challenge:&lt;/strong&gt; Patient assistant must never leak protected health information&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Solution:&lt;/strong&gt; AWS Bedrock guardrails with comprehensive PHI detection&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Result:&lt;/strong&gt; Passed HIPAA audit, enabled telemedicine expansion, protected patient privacy&lt;/p&gt;
&lt;h3&gt;
  
  
  🏦 Financial Services: Regulatory Peace of Mind
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Challenge:&lt;/strong&gt; Banking assistant can't provide unauthorized financial advice&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Solution:&lt;/strong&gt; Topic filters block investment and legal guidance&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Result:&lt;/strong&gt; Met compliance requirements, accelerated product launch, avoided regulatory scrutiny&lt;/p&gt;


&lt;h2&gt;
  
  
  For Developers: Technical Deep Dive
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;👨‍💻 The following sections are for technical teams implementing guardrails.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If you're a developer, architect, or DevOps engineer, read on for implementation details, code examples, and integration patterns. Business stakeholders have all the information they need above to understand the value proposition.&lt;/p&gt;


&lt;h2&gt;
  
  
  Why Guardrails Matter (Technical Perspective)
&lt;/h2&gt;

&lt;p&gt;AI agents are incredibly powerful, but without proper safeguards, they can:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Generate harmful or inappropriate content&lt;/strong&gt; that damages your brand&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Leak sensitive information (PII)&lt;/strong&gt; like credit cards, SSNs, or health records&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Fall victim to jailbreak attempts&lt;/strong&gt; that bypass safety instructions&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Produce off-topic responses&lt;/strong&gt; that confuse or frustrate users&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Violate compliance requirements&lt;/strong&gt; in regulated industries&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Guardrails act as protective layers around your agents, validating content before it reaches your agent (input guardrails) and before responses reach your users (output guardrails). Think of them as security checkpoints that ensure every interaction meets your safety and policy requirements.&lt;/p&gt;
&lt;h2&gt;
  
  
  Technical Implementation: Two Powerful Options
&lt;/h2&gt;

&lt;p&gt;Agent Kernel supports two industry-leading guardrail providers, each with unique technical strengths:&lt;/p&gt;
&lt;h3&gt;
  
  
  🛡️ OpenAI Guardrails
&lt;/h3&gt;

&lt;p&gt;OpenAI's guardrails provide sophisticated content moderation with customizable policies:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Content Filtering&lt;/strong&gt;: Block violent, sexual, hateful, or self-harm content&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Prompt Injection Detection&lt;/strong&gt;: Identify jailbreak attempts and prompt manipulation&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;PII Detection&lt;/strong&gt;: Catch sensitive data like emails, phone numbers, SSNs&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Custom Keywords&lt;/strong&gt;: Create domain-specific blocklists&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Flexible Scoring&lt;/strong&gt;: Fine-tune sensitivity thresholds per policy&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Perfect for:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Customer-facing chatbots requiring brand safety&lt;/li&gt;
&lt;li&gt;Applications handling user-generated content&lt;/li&gt;
&lt;li&gt;Teams already using OpenAI infrastructure&lt;/li&gt;
&lt;li&gt;Rapid prototyping with quick policy setup&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Quick Setup:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install &lt;/span&gt;agentkernel[openai]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;guardrail&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;input&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;enabled&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
    &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;openai&lt;/span&gt;
    &lt;span class="na"&gt;model&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;gpt-4o-mini&lt;/span&gt;
    &lt;span class="na"&gt;config_path&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;guardrails_input.json&lt;/span&gt;
  &lt;span class="na"&gt;output&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;enabled&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
    &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;openai&lt;/span&gt;
    &lt;span class="na"&gt;config_path&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;guardrails_output.json&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  🔒 AWS Bedrock Guardrails
&lt;/h3&gt;

&lt;p&gt;Amazon Bedrock provides enterprise-grade content filtering integrated with AWS services:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Content Filters&lt;/strong&gt;: Violence, sexual content, hate speech, insults, and more&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;30+ PII Types&lt;/strong&gt;: Comprehensive detection including passports, medical records, financial data&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Topic Filters&lt;/strong&gt;: Block entire conversation topics (investments, legal advice, etc.)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Word Filters&lt;/strong&gt;: Profanity and custom word blocking&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Contextual Grounding&lt;/strong&gt;: Ensure responses stay grounded in provided context (coming soon)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AWS Integration&lt;/strong&gt;: Native IAM roles, CloudWatch logging, compliance controls&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Perfect for:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Enterprise deployments requiring AWS compliance&lt;/li&gt;
&lt;li&gt;Applications processing sensitive data&lt;/li&gt;
&lt;li&gt;Teams leveraging AWS infrastructure&lt;/li&gt;
&lt;li&gt;Scenarios needing detailed PII detection (healthcare, finance, legal)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Quick Setup:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install &lt;/span&gt;agentkernel[aws]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;guardrail&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;input&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;enabled&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
    &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;bedrock&lt;/span&gt;
    &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;your-guardrail-id&lt;/span&gt;
    &lt;span class="na"&gt;version&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;1"&lt;/span&gt;
  &lt;span class="na"&gt;output&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;enabled&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
    &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;bedrock&lt;/span&gt;
    &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;your-guardrail-id&lt;/span&gt;
    &lt;span class="na"&gt;version&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;1"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  How It Works: Input and Output Protection
&lt;/h2&gt;

&lt;p&gt;Guardrails integrate seamlessly into Agent Kernel's execution pipeline through our hooks system:&lt;/p&gt;

&lt;h3&gt;
  
  
  Input Guardrails: Validate Before Processing
&lt;/h3&gt;

&lt;p&gt;Input guardrails intercept user requests &lt;strong&gt;before&lt;/strong&gt; they reach your agent:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;agentkernel.guardrail&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;InputGuardrailFactory&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;agentkernel.core&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;PreHook&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;SafetyCheckHook&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;PreHook&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;__init__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;guardrail&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;InputGuardrailFactory&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="n"&gt;provider&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;openai&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;config_path&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;guardrails_config.yaml&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
        &lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;on_run&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;session&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;agent&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="c1"&gt;# Validate input - blocks harmful content automatically
&lt;/span&gt;        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;guardrail&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;on_run&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;session&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;agent&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If a violation is detected, the guardrail blocks the request and returns a safe error message - your agent never sees the harmful input.&lt;/p&gt;

&lt;h3&gt;
  
  
  Output Guardrails: Validate Before Delivery
&lt;/h3&gt;

&lt;p&gt;Output guardrails validate agent responses &lt;strong&gt;after&lt;/strong&gt; generation but &lt;strong&gt;before&lt;/strong&gt; reaching users:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;agentkernel.guardrail&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;OutputGuardrailFactory&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;agentkernel.core&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;PostHook&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;OutputSafetyHook&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;PostHook&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;__init__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;guardrail&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;OutputGuardrailFactory&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="n"&gt;provider&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;bedrock&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;guardrail_id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;abc123xyz&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;guardrail_version&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;1&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
        &lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;on_run&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;session&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;agent&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;reply&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="c1"&gt;# Validate output - blocks unsafe responses
&lt;/span&gt;        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;guardrail&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;on_run&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;session&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;agent&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;reply&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If the response contains PII, inappropriate content, or violates policies, the guardrail intercepts it and returns a filtered or replacement message.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Power of Pluggable Architecture
&lt;/h2&gt;

&lt;p&gt;Here's where Agent Kernel truly shines: &lt;strong&gt;our clean, pluggable architecture makes guardrails extensible&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Both OpenAI and AWS Bedrock guardrails are implemented using the same base interface. This means:&lt;/p&gt;

&lt;h3&gt;
  
  
  🎯 Easy Provider Switching
&lt;/h3&gt;

&lt;p&gt;Switch providers with a single configuration change - no code changes needed:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Switch from OpenAI to Bedrock&lt;/span&gt;
&lt;span class="na"&gt;guardrail&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;input&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;enabled&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
    &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;bedrock&lt;/span&gt;  &lt;span class="c1"&gt;# was: openai&lt;/span&gt;
    &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;your-guardrail-id&lt;/span&gt;
    &lt;span class="na"&gt;version&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;1"&lt;/span&gt;
  &lt;span class="na"&gt;output&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;enabled&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
    &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;bedrock&lt;/span&gt;
    &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;your-guardrail-id&lt;/span&gt;
    &lt;span class="na"&gt;version&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;1"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  🔌 Community Contributions Welcome
&lt;/h3&gt;

&lt;p&gt;Want to add support for a new guardrail provider? Our architecture makes it straightforward:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Create a new provider module (e.g., &lt;code&gt;custom_guardrail.py&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Extend &lt;code&gt;InputGuardrail&lt;/code&gt; class for input validation and &lt;code&gt;OutputGuardrail&lt;/code&gt; class for output validation&lt;/li&gt;
&lt;li&gt;Implement your provider-specific validation logic in the &lt;code&gt;on_run()&lt;/code&gt; method&lt;/li&gt;
&lt;li&gt;Register your provider in &lt;code&gt;InputGuardrailFactory&lt;/code&gt; and &lt;code&gt;OutputGuardrailFactory&lt;/code&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Example structure:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;agentkernel.guardrail&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;InputGuardrail&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;OutputGuardrail&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;agentkernel.core.base&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Agent&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Session&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;agentkernel.core.model&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;AgentReply&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;AgentRequest&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;MyProviderInputGuardrail&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;InputGuardrail&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;on_run&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;session&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Session&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;agent&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Agent&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
                     &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;list&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;AgentRequest&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;list&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;AgentRequest&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;AgentReply&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="c1"&gt;# Your validation logic here
&lt;/span&gt;        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;  &lt;span class="c1"&gt;# or return AgentReply to block
&lt;/span&gt;
&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;MyProviderOutputGuardrail&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;OutputGuardrail&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;on_run&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;session&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Session&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;list&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;AgentRequest&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
                     &lt;span class="n"&gt;agent&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Agent&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;agent_reply&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;AgentReply&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;AgentReply&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="c1"&gt;# Your validation logic here
&lt;/span&gt;        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;agent_reply&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;The community can add new guardrail options easily&lt;/strong&gt; - whether it's commercial providers, open-source tools, or custom in-house solutions. The clean separation between guardrail logic and Agent Kernel's execution framework means contributions are simple and maintainable.&lt;/p&gt;

&lt;h3&gt;
  
  
  📦 Framework-Agnostic
&lt;/h3&gt;

&lt;p&gt;Because guardrails are implemented as hooks, they work across &lt;strong&gt;all&lt;/strong&gt; supported frameworks:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;OpenAI Agents SDK ✅&lt;/li&gt;
&lt;li&gt;LangGraph ✅&lt;/li&gt;
&lt;li&gt;CrewAI ✅&lt;/li&gt;
&lt;li&gt;Google ADK ✅&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Write your guardrail configuration once, use it everywhere.&lt;/p&gt;

&lt;h2&gt;
  
  
  Choosing the Right Provider
&lt;/h2&gt;

&lt;p&gt;Both providers offer robust content safety, but they excel in different scenarios:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;th&gt;OpenAI Guardrails&lt;/th&gt;
&lt;th&gt;AWS Bedrock&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Prompt Injection Detection&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;✅ Advanced&lt;/td&gt;
&lt;td&gt;⚠️ Basic&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;PII Types&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;12+ common types&lt;/td&gt;
&lt;td&gt;30+ comprehensive&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Custom Policies&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;✅ Flexible YAML&lt;/td&gt;
&lt;td&gt;✅ AWS Console&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Deployment&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Any cloud/on-prem&lt;/td&gt;
&lt;td&gt;AWS only&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Setup Complexity&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Simple API key&lt;/td&gt;
&lt;td&gt;AWS IAM + Guardrail ID&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Cost Model&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Per API call&lt;/td&gt;
&lt;td&gt;Per text unit&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Best For&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Rapid prototyping, cross-cloud&lt;/td&gt;
&lt;td&gt;Enterprise AWS, healthcare/finance&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Pro Tip:&lt;/strong&gt; Many teams start with OpenAI Guardrails for development and switch to Bedrock for production AWS deployments. Agent Kernel's pluggable design makes this migration seamless.&lt;/p&gt;

&lt;h2&gt;
  
  
  Coming Soon: Exciting Additions
&lt;/h2&gt;

&lt;p&gt;We're not stopping here. The guardrails roadmap includes:&lt;/p&gt;

&lt;h3&gt;
  
  
  🧱 Walled.ai Integration
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://walled.ai" rel="noopener noreferrer"&gt;Walled.ai&lt;/a&gt; provides specialized prompt injection and jailbreak detection. We're working on native support to give you even more options for protecting against adversarial inputs.&lt;/p&gt;

&lt;h3&gt;
  
  
  🎭 PII Masking Feature
&lt;/h3&gt;

&lt;p&gt;Beyond detection, we're building &lt;strong&gt;automatic PII masking&lt;/strong&gt; that will:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Detect sensitive data in real-time&lt;/li&gt;
&lt;li&gt;Replace PII with synthetic equivalents or redaction markers&lt;/li&gt;
&lt;li&gt;Preserve context while removing identifiable information&lt;/li&gt;
&lt;li&gt;Support custom masking rules per data type&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This will be especially valuable for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Call center agents processing customer data&lt;/li&gt;
&lt;li&gt;Healthcare applications handling PHI&lt;/li&gt;
&lt;li&gt;Financial services managing payment information&lt;/li&gt;
&lt;li&gt;Any application needing GDPR/CCPA compliance&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Stay tuned for announcements as these features roll out!&lt;/p&gt;

&lt;h2&gt;
  
  
  Real-World Use Cases
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Customer Support Bot
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Protect customer conversations&lt;/span&gt;
&lt;span class="na"&gt;guardrail&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;input&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;enabled&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
    &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;openai&lt;/span&gt;
    &lt;span class="na"&gt;model&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;gpt-4o-mini&lt;/span&gt;
    &lt;span class="na"&gt;config_path&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;guardrails_input.json&lt;/span&gt;
  &lt;span class="na"&gt;output&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;enabled&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
    &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;bedrock&lt;/span&gt;
    &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;pii-filter-guardrail&lt;/span&gt;
    &lt;span class="na"&gt;version&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;1"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Result:&lt;/strong&gt; Block abusive customer inputs, prevent agent from leaking PII in responses&lt;/p&gt;

&lt;h3&gt;
  
  
  Healthcare Assistant
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="c1"&gt;# HIPAA-compliant patient interactions&lt;/span&gt;
&lt;span class="na"&gt;guardrail&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;input&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;enabled&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
    &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;bedrock&lt;/span&gt;
    &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;hipaa-input-guardrail&lt;/span&gt;
    &lt;span class="na"&gt;version&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;2"&lt;/span&gt;
  &lt;span class="na"&gt;output&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;enabled&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
    &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;bedrock&lt;/span&gt;
    &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;hipaa-output-guardrail&lt;/span&gt;
    &lt;span class="na"&gt;version&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;2"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Result:&lt;/strong&gt; Comprehensive PHI detection, compliance audit trails, AWS security controls&lt;/p&gt;

&lt;h3&gt;
  
  
  Enterprise Knowledge Base
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Prevent data leakage in company chatbot&lt;/span&gt;
&lt;span class="na"&gt;guardrail&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;output&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;enabled&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
    &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;openai&lt;/span&gt;
    &lt;span class="na"&gt;config_path&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;guardrails_output.json&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Result:&lt;/strong&gt; Block accidental disclosure of proprietary information, filter sensitive company data&lt;/p&gt;

&lt;h2&gt;
  
  
  Get Started with Guardrails Today
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Choose Your Provider
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;OpenAI Guardrails:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install &lt;/span&gt;agentkernel[openai-guardrails]
&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;OPENAI_API_KEY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;your-key
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;AWS Bedrock:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install &lt;/span&gt;agentkernel[bedrock]
aws configure  &lt;span class="c"&gt;# Set up AWS credentials&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2. Configure Your Policies
&lt;/h3&gt;

&lt;p&gt;Create &lt;code&gt;config.yaml&lt;/code&gt; with your guardrail settings:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;guardrail&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;input&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;enabled&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
    &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;openai&lt;/span&gt;  &lt;span class="c1"&gt;# or bedrock&lt;/span&gt;
    &lt;span class="na"&gt;model&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;gpt-4o-mini&lt;/span&gt;  &lt;span class="c1"&gt;# for OpenAI&lt;/span&gt;
    &lt;span class="na"&gt;config_path&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;guardrails_input.json&lt;/span&gt;
    &lt;span class="c1"&gt;# For Bedrock, use: id: your-id and version: "1" instead&lt;/span&gt;
  &lt;span class="na"&gt;output&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;enabled&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
    &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;openai&lt;/span&gt;
    &lt;span class="na"&gt;config_path&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;guardrails_output.json&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  3. Deploy with Confidence
&lt;/h3&gt;

&lt;p&gt;Your agents now have enterprise-grade content safety:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Automatic input validation&lt;/li&gt;
&lt;li&gt;Output filtering and PII detection&lt;/li&gt;
&lt;li&gt;Compliance-ready audit trails&lt;/li&gt;
&lt;li&gt;Framework-agnostic protection&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Documentation and Examples
&lt;/h2&gt;

&lt;p&gt;We've created comprehensive guides to get you started:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://kernel.yaala.ai/docs/advanced/guardrails" rel="noopener noreferrer"&gt;Guardrails Overview&lt;/a&gt;&lt;/strong&gt; - Architecture and concepts&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://kernel.yaala.ai/docs/advanced/guardrails-openai" rel="noopener noreferrer"&gt;OpenAI Guardrails Guide&lt;/a&gt;&lt;/strong&gt; - Complete setup and configuration&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://kernel.yaala.ai/docs/advanced/guardrails-bedrock" rel="noopener noreferrer"&gt;AWS Bedrock Guide&lt;/a&gt;&lt;/strong&gt; - IAM setup, policies, and best practices&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://github.com/yaalalabs/agent-kernel/tree/main/examples/cli/guardrail" rel="noopener noreferrer"&gt;Working Examples&lt;/a&gt;&lt;/strong&gt; - Copy-paste ready code&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Join the Community
&lt;/h2&gt;

&lt;p&gt;Guardrails are just the beginning. With Agent Kernel's pluggable architecture, we're building an ecosystem where the community can contribute new providers, safety mechanisms, and integrations.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Want to contribute?&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Add support for new guardrail providers&lt;/li&gt;
&lt;li&gt;Share your custom safety hooks&lt;/li&gt;
&lt;li&gt;Improve documentation and examples&lt;/li&gt;
&lt;li&gt;Request features and vote on priorities&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Connect with us:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;GitHub:&lt;/strong&gt; &lt;a href="https://github.com/yaalalabs/agent-kernel" rel="noopener noreferrer"&gt;yaalalabs/agent-kernel&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Discord:&lt;/strong&gt; &lt;a href="https://discord.gg/snrPzb46uu" rel="noopener noreferrer"&gt;Join our community&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Issues:&lt;/strong&gt; &lt;a href="https://github.com/yaalalabs/agent-kernel/issues" rel="noopener noreferrer"&gt;Report bugs or suggest features&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Discussions:&lt;/strong&gt; &lt;a href="https://github.com/yaalalabs/agent-kernel/discussions" rel="noopener noreferrer"&gt;Ask questions and share ideas&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The Future is Safe AI
&lt;/h2&gt;

&lt;p&gt;As AI agents become more powerful and widespread, content safety isn't optional - it's essential. Agent Kernel's guardrails give you:&lt;/p&gt;

&lt;p&gt;✅ &lt;strong&gt;Multi-provider flexibility&lt;/strong&gt; - Choose the best tool for each use case&lt;br&gt;&lt;br&gt;
✅ &lt;strong&gt;Pluggable architecture&lt;/strong&gt; - Easy to extend and contribute&lt;br&gt;&lt;br&gt;
✅ &lt;strong&gt;Framework-agnostic&lt;/strong&gt; - Works with any agent framework&lt;br&gt;&lt;br&gt;
✅ &lt;strong&gt;Production-ready&lt;/strong&gt; - Enterprise-grade safety and compliance&lt;br&gt;&lt;br&gt;
✅ &lt;strong&gt;Community-driven&lt;/strong&gt; - Built for extensibility and collaboration  &lt;/p&gt;

&lt;p&gt;Deploy your agents with confidence, knowing they're protected by best-in-class content safety guardrails.&lt;/p&gt;

&lt;p&gt;Ready to build safer AI? &lt;a href="https://kernel.yaala.ai/docs/advanced/guardrails" rel="noopener noreferrer"&gt;Get started with guardrails today →&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Built with ❤️ by &lt;a href="https://www.yaalalabs.com/" rel="noopener noreferrer"&gt;Yaala Labs&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Have questions about guardrails? Join our &lt;a href="https://discord.gg/snrPzb46uu" rel="noopener noreferrer"&gt;Discord community&lt;/a&gt; or open an &lt;a href="https://github.com/yaalalabs/agent-kernel/issues" rel="noopener noreferrer"&gt;issue on GitHub&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://kernel.yaala.ai/blog/guardrails-content-safety" rel="noopener noreferrer"&gt;kernel.yaala.ai&lt;/a&gt; on January 13, 2026.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>agentkernel</category>
      <category>guardrails</category>
      <category>contentsafety</category>
      <category>openaiguardrails</category>
    </item>
  </channel>
</rss>
