<?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: Lu Han</title>
    <description>The latest articles on DEV Community by Lu Han (@feuyeux).</description>
    <link>https://dev.to/feuyeux</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%2F388119%2F3c7aafe9-3209-4dc5-9c18-b6afc9d0e86a.jpeg</url>
      <title>DEV Community: Lu Han</title>
      <link>https://dev.to/feuyeux</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/feuyeux"/>
    <language>en</language>
    <item>
      <title>A Harnessed LLM Agent Is More Than Four Circles</title>
      <dc:creator>Lu Han</dc:creator>
      <pubDate>Sat, 14 Nov 2026 08:07:51 +0000</pubDate>
      <link>https://dev.to/feuyeux/a-harnessed-llm-agent-is-more-than-four-circles-135c</link>
      <guid>https://dev.to/feuyeux/a-harnessed-llm-agent-is-more-than-four-circles-135c</guid>
      <description>&lt;h2&gt;
  
  
  Why a Runtime-Centric Architecture Is a Stronger Model for Agent Engineering
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;A reply to &lt;a href="https://x.com/GauriTripa94282/status/2121177650165411998" rel="noopener noreferrer"&gt;The Harness Behind Reliable LLM Agents&lt;/a&gt;, the post that introduced the diagram &lt;em&gt;A Harnessed LLM Agent&lt;/em&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The diagram &lt;em&gt;A Harnessed LLM Agent&lt;/em&gt; makes an important point: a capable agent is more than an LLM connected to a collection of tools. It needs reusable skills, memory, interaction protocols, execution controls, and mechanisms for evaluating its behavior.&lt;/p&gt;

&lt;p&gt;That is a useful conceptual overview. But a conceptual overview is not automatically a sound reference architecture.&lt;/p&gt;

&lt;p&gt;The diagram presents four ideas—&lt;strong&gt;Skills, Harness, Memory, and Protocols&lt;/strong&gt;—as its main categories. The problem is that these ideas describe different architectural dimensions. Skills describe capabilities; Memory describes retained information; Protocols define interaction contracts; and Harness concerns execution and control. They are related, but they are not equivalent building blocks.&lt;/p&gt;

&lt;p&gt;My argument is not that the four categories are wrong or unimportant. It is that listing them as four top-level categories obscures the relationships that make an agent work. For engineering purposes, a &lt;strong&gt;Runtime-Centric Agent Architecture&lt;/strong&gt; is a more coherent starting point: the runtime coordinates the model, capabilities, state, protocols, and environment within a controlled execution lifecycle.&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%2Fwpxf6ajh29krtvfdlcql.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%2Fwpxf6ajh29krtvfdlcql.png" alt=" " width="800" height="784"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  1. The Four Categories Do Not Belong to the Same Architectural Level
&lt;/h2&gt;

&lt;p&gt;The original diagram groups four concepts that are useful to distinguish:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Concept&lt;/th&gt;
&lt;th&gt;What it describes&lt;/th&gt;
&lt;th&gt;The question it answers&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Skills&lt;/td&gt;
&lt;td&gt;Reusable capabilities and procedures&lt;/td&gt;
&lt;td&gt;What can the agent do?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Harness&lt;/td&gt;
&lt;td&gt;Execution and control mechanisms&lt;/td&gt;
&lt;td&gt;How is the agent run and managed?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Memory&lt;/td&gt;
&lt;td&gt;Retained information and knowledge&lt;/td&gt;
&lt;td&gt;What does the agent remember?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Protocols&lt;/td&gt;
&lt;td&gt;Communication contracts&lt;/td&gt;
&lt;td&gt;How does the agent interact with users, other agents, and tools?&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;These are different dimensions, not four interchangeable subsystems.&lt;/p&gt;

&lt;p&gt;Consider a coding agent asked to fix a bug. A skill may describe how to investigate a failure and modify code. Memory may provide repository conventions and relevant past findings. A protocol may define how the agent requests a tool operation. The runtime decides when to invoke the model, which action to dispatch, whether that action is allowed, how to capture its result, and whether the task should continue.&lt;/p&gt;

&lt;p&gt;The distinction matters because the four concepts do not have symmetrical responsibilities. A skill does not own the task lifecycle. A protocol does not execute an operation merely by defining message formats and interaction rules. Memory does not decide which information is authoritative for the current task. The runtime coordinates these mechanisms as part of one execution process.&lt;/p&gt;

&lt;p&gt;A useful architecture should make those relationships explicit rather than flatten them into a list of neighboring concepts.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Harness Should Be Understood as the Agent Runtime
&lt;/h2&gt;

&lt;p&gt;The diagram presents the Harness as a collection of components around an agent: sandbox provisioning, sub-agent orchestration, observability, compression, evaluation, and approval loops. That arrangement is reasonable. However, Harness should mean more than a collection of utilities grouped around an agent.&lt;/p&gt;

&lt;p&gt;It is better understood as the &lt;strong&gt;runtime and control infrastructure that manages the agent's execution lifecycle&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The model provides inference: it interprets context and proposes decisions or actions. The runtime turns those proposals into managed execution. It validates proposed actions, applies policy, dispatches operations, collects observations, updates state, and determines what happens next.&lt;/p&gt;

&lt;p&gt;For example, when a model proposes a shell command, the runtime may need to:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Validate the proposed tool call and its arguments.&lt;/li&gt;
&lt;li&gt;Check whether the agent is authorized to perform the operation.&lt;/li&gt;
&lt;li&gt;Select an appropriate execution environment, including a sandbox where needed.&lt;/li&gt;
&lt;li&gt;Execute the operation and capture its output.&lt;/li&gt;
&lt;li&gt;Associate the result with the correct task and execution step.&lt;/li&gt;
&lt;li&gt;Evaluate the result against the current step and the overall objective.&lt;/li&gt;
&lt;li&gt;Continue, retry, request approval, or terminate the task.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The model can propose an action, but it should not be the ultimate authority on whether that action is permitted or whether it actually succeeded. Those guarantees belong to the runtime and the systems around it.&lt;/p&gt;

&lt;p&gt;A concise definition is therefore:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Definition.&lt;/strong&gt; Harness is the runtime and control infrastructure around an LLM. It manages the agent's lifecycle: assembling context, orchestrating actions, dispatching operations, transitioning state, processing feedback, enforcing policy, evaluating results, and supporting recovery.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The runtime coordinates these responsibilities; it does not own every policy or quality function it relies on. This definition also clarifies that Harness is not necessarily one deployable service or one monolithic process. It is a logical responsibility that may be implemented by several cooperating components.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. The Execution Loop Is the Missing Architectural Center
&lt;/h2&gt;

&lt;p&gt;The most important property of an agent is not that it contains several categories of components. It is that it can pursue an objective through repeated cycles of decision, action, and observation.&lt;/p&gt;

&lt;p&gt;A simplified execution loop looks like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;                 User Goal / Trigger
                         |
                         v
                 Context Assembly
            Inputs: Skills + Memory + Task State
                  + Relevant Policy
                         |
                         v
                  Model Inference
              Reasoning / Decision
                         |
                         v
             Policy &amp;amp; Authorization Check
                         |
                         v
                   Action Dispatch
                Tools / Skills / Agents
                         |
                         v
                   Environment
                         |
                         v
              Observation and Evaluation
                         |
                         v
                State and Context Update
                         |
                         +-----------&amp;gt; Next inference

                  Or: Complete / Escalate
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The runtime manages this loop.&lt;/p&gt;

&lt;p&gt;This makes the difference between a one-shot model interaction and an agent system clearer:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;One-shot interaction:
Input -&amp;gt; Model -&amp;gt; Response (or one tool call)

Managed agent execution:
Goal -&amp;gt; Context -&amp;gt; Inference -&amp;gt; Action -&amp;gt; Observation
     -&amp;gt; Evaluation -&amp;gt; State Update -&amp;gt; Next Decision -&amp;gt; ...
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The first produces a response or a single action; the second manages a task over time.&lt;/p&gt;

&lt;p&gt;This is why planning, tool dispatch, evaluation, checkpointing, cancellation, retries, and recovery should be understood as parts of the runtime's execution responsibilities—not merely as a collection of optional features around a model.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Memory, State, and Context Are Different Things
&lt;/h2&gt;

&lt;p&gt;The original diagram identifies Working Context, Episodic Experience, Semantic Knowledge, and Personalized Memory—roughly, working context, episodic memory, semantic knowledge, and user profile. These are useful ideas, but they mix different classification criteria.&lt;/p&gt;

&lt;p&gt;Working Context is primarily about what is assembled for a particular inference step. Episodic and semantic memory describe types of retained information. A user profile describes information from the perspective of a particular user. These categories can overlap: a user's preference, for example, may be stored as a semantic fact and also appear in a user profile.&lt;/p&gt;

&lt;p&gt;A more precise design separates operational state from persistent memory—and distinguishes both from context.&lt;/p&gt;

&lt;h3&gt;
  
  
  Operational state
&lt;/h3&gt;

&lt;p&gt;Operational state represents what is happening in the current execution:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Task status and objective&lt;/li&gt;
&lt;li&gt;Current plan and completed steps&lt;/li&gt;
&lt;li&gt;Pending actions and tool calls&lt;/li&gt;
&lt;li&gt;Intermediate results&lt;/li&gt;
&lt;li&gt;Sub-agent assignments and results&lt;/li&gt;
&lt;li&gt;Approval status&lt;/li&gt;
&lt;li&gt;Checkpoints needed for resumption&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This state is part of the execution record. It must remain authoritative even when the model's context is shortened or reconstructed.&lt;/p&gt;

&lt;h3&gt;
  
  
  Persistent memory
&lt;/h3&gt;

&lt;p&gt;Persistent memory contains information that may be useful beyond the current execution:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Examples&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Episodic&lt;/td&gt;
&lt;td&gt;Previous tasks, events, outcomes, and feedback&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Semantic&lt;/td&gt;
&lt;td&gt;Facts, concepts, entities, and relationships&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Procedural&lt;/td&gt;
&lt;td&gt;Methods, strategies, and learned ways of performing tasks&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Profile&lt;/td&gt;
&lt;td&gt;User preferences, project conventions, and organizational context&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;A second distinction matters as much: state versus context. Operational state is the underlying record of the execution. Context is the selected information assembled for a particular model call. Context can be compressed or reconstructed; omitting a fact from the prompt must not delete it from state.&lt;/p&gt;

&lt;p&gt;Skills and procedural memory are related but should not be conflated. Procedural memory retains knowledge about how to perform a task. A skill is an engineered, reusable package—instructions, resources, constraints, and sometimes executable logic—that exposes a procedure through an interface the runtime can invoke.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Protocols Define Contracts; They Do Not Provide Execution by Themselves
&lt;/h2&gt;

&lt;p&gt;The diagram groups Agent–User, Agent–Agent, and Agent–Tools under Protocols. This is a reasonable way to classify interaction patterns, but it can blur the boundary between communication and execution.&lt;/p&gt;

&lt;p&gt;A protocol fixes message formats and interaction rules, but it leaves authorization, dispatch, and result correlation unspecified.&lt;/p&gt;

&lt;p&gt;A tool interaction, for example, may involve several distinct responsibilities:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Model
  -&amp;gt; Tool-calling contract
  -&amp;gt; Tool dispatcher
  -&amp;gt; Authorization and policy checks
  -&amp;gt; Tool runtime
  -&amp;gt; External environment
  -&amp;gt; Result capture and correlation
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The protocol defines the contract. The dispatcher routes the request. Authorization determines whether the operation is allowed. The tool runtime performs the operation. The environment produces the actual effects.&lt;/p&gt;

&lt;p&gt;The same distinction applies to agent-to-agent collaboration. A communication protocol can standardize message exchange or task descriptions, but it does not automatically solve delegation, scheduling, ownership, timeout management, conflict resolution, or result verification. Those are runtime concerns.&lt;/p&gt;

&lt;p&gt;In short: &lt;strong&gt;protocols define how components communicate; the runtime determines how those interactions participate in an executable workflow.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  6. The Environment Deserves an Explicit Place
&lt;/h2&gt;

&lt;p&gt;An agent does not act in an abstract space made only of prompts, memory, and tools. It acts in an environment: filesystems, browsers, databases, APIs, shells, development environments, and external services.&lt;/p&gt;

&lt;p&gt;It is useful to separate the concepts involved:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Concept&lt;/th&gt;
&lt;th&gt;Responsibility&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Skill&lt;/td&gt;
&lt;td&gt;Packages a reusable procedure or capability&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Tool&lt;/td&gt;
&lt;td&gt;Exposes an operation that can be invoked&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Protocol&lt;/td&gt;
&lt;td&gt;Defines the interaction contract&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Runtime&lt;/td&gt;
&lt;td&gt;Coordinates and controls execution&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Environment&lt;/td&gt;
&lt;td&gt;Hosts resources and produces observable effects&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;For example, a browser tool is an interface for interacting with a browser environment. A database connector exposes operations against a database; it is not the database itself. A sandbox is an execution environment that the runtime may provision, not a skill. The original diagram shows sandbox provisioning as a harness utility, but it does not give the sandboxed environment an explicit place.&lt;/p&gt;

&lt;p&gt;Making the environment explicit improves reasoning about isolation, permissions, side effects, reproducibility, and recovery.&lt;/p&gt;

&lt;h2&gt;
  
  
  7. Governance Is Cross-Cutting
&lt;/h2&gt;

&lt;p&gt;The original diagram includes normative constraints under Skills and an approval loop within Harness. Both are relevant, but neither is a sufficient home for governance. A skill can declare task-specific constraints, and the runtime can enforce them; system-wide policy, however, must remain authoritative independently of any individual skill or model-generated guidance.&lt;/p&gt;

&lt;p&gt;Security, identity, authorization, policy, audit, and human approval affect multiple stages of execution:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Which skills may be loaded?&lt;/li&gt;
&lt;li&gt;Which memories may be retrieved?&lt;/li&gt;
&lt;li&gt;Which models and endpoints may be used?&lt;/li&gt;
&lt;li&gt;Which tools may be invoked?&lt;/li&gt;
&lt;li&gt;Which resources may be read or modified?&lt;/li&gt;
&lt;li&gt;Which actions require human approval?&lt;/li&gt;
&lt;li&gt;Which outputs may be returned or persisted?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Governance is therefore best represented as a cross-cutting responsibility. The runtime provides enforcement points, while policy ownership, identity, audit, and organizational controls may be implemented in separate services or infrastructure.&lt;/p&gt;

&lt;h2&gt;
  
  
  8. A Runtime-Centric Reference Architecture
&lt;/h2&gt;

&lt;p&gt;These distinctions lead to a more coherent architecture. The following decomposition organizes the system by responsibility rather than treating every concept as a peer component.&lt;/p&gt;

&lt;p&gt;The proposed architecture still has four outer domains—skills, memory, environment, and protocols. The difference is that they are arranged around a runtime rather than presented as four equivalent categories.&lt;/p&gt;

&lt;h3&gt;
  
  
  8.1 Interaction layer
&lt;/h3&gt;

&lt;p&gt;Defines interfaces, communication contracts, and event sources:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;User interaction&lt;/li&gt;
&lt;li&gt;Agent-to-agent communication&lt;/li&gt;
&lt;li&gt;Tool interaction protocols&lt;/li&gt;
&lt;li&gt;Events and external triggers&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  8.2 Agent runtime / Harness
&lt;/h3&gt;

&lt;p&gt;Coordinates the execution lifecycle:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Goal intake and task initialization&lt;/li&gt;
&lt;li&gt;Scheduling and plan execution&lt;/li&gt;
&lt;li&gt;Context assembly&lt;/li&gt;
&lt;li&gt;Tool dispatch&lt;/li&gt;
&lt;li&gt;Sub-agent coordination&lt;/li&gt;
&lt;li&gt;State transition management&lt;/li&gt;
&lt;li&gt;Feedback processing&lt;/li&gt;
&lt;li&gt;Timeouts, cancellation, retries, and idempotency&lt;/li&gt;
&lt;li&gt;Checkpointing and resumption&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  8.3 Cognitive layer
&lt;/h3&gt;

&lt;p&gt;Provides reasoning and decision functions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;LLM inference&lt;/li&gt;
&lt;li&gt;Reasoning&lt;/li&gt;
&lt;li&gt;Decision-making&lt;/li&gt;
&lt;li&gt;Task decomposition and plan generation&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  8.4 Capability layer
&lt;/h3&gt;

&lt;p&gt;Provides reusable and executable capabilities:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Skills&lt;/li&gt;
&lt;li&gt;Tools&lt;/li&gt;
&lt;li&gt;Sub-agents&lt;/li&gt;
&lt;li&gt;Retrieval&lt;/li&gt;
&lt;li&gt;Code execution&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  8.5 State and memory layer
&lt;/h3&gt;

&lt;p&gt;Provides durable state and reusable information:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Durable operational state&lt;/li&gt;
&lt;li&gt;Episodic memory&lt;/li&gt;
&lt;li&gt;Semantic knowledge&lt;/li&gt;
&lt;li&gt;Procedural memory&lt;/li&gt;
&lt;li&gt;User and project profiles&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The runtime owns state transitions; this layer owns the durable record those transitions operate on.&lt;/p&gt;

&lt;h3&gt;
  
  
  8.6 Environment layer
&lt;/h3&gt;

&lt;p&gt;Provides the resources and systems with which the agent interacts:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Filesystem&lt;/li&gt;
&lt;li&gt;Browser&lt;/li&gt;
&lt;li&gt;Databases&lt;/li&gt;
&lt;li&gt;Network and APIs&lt;/li&gt;
&lt;li&gt;Compute and sandbox infrastructure&lt;/li&gt;
&lt;li&gt;External services&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Cross-cutting governance and quality
&lt;/h3&gt;

&lt;p&gt;Applies across the architecture:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Security and identity&lt;/li&gt;
&lt;li&gt;Access control&lt;/li&gt;
&lt;li&gt;Policy and compliance&lt;/li&gt;
&lt;li&gt;Human approval&lt;/li&gt;
&lt;li&gt;Observability and audit&lt;/li&gt;
&lt;li&gt;Evaluation and quality assurance&lt;/li&gt;
&lt;li&gt;Reliability and recovery policy&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These functions set policy, standards, and audit requirements; the runtime implements the corresponding mechanisms. The layers are logical, not a mandate to deploy a separate service for each one. A small agent may implement several responsibilities in one process. A larger platform may distribute them across services. The purpose of the decomposition is to make ownership, interfaces, and invariants explicit—not to prescribe a deployment topology.&lt;/p&gt;

&lt;h2&gt;
  
  
  9. Why This Model Is More Useful for Engineering
&lt;/h2&gt;

&lt;p&gt;A runtime-centric approach offers several practical advantages.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Model independence.&lt;/strong&gt; Separating inference from runtime orchestration allows the system to change models or inference providers without redesigning task management, tool execution, and recovery.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Explicit failure semantics.&lt;/strong&gt; Timeouts, cancellation, retries, idempotency, checkpointing, and resumption have clear architectural owners. They do not depend on the model remembering what happened.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Reliable state management.&lt;/strong&gt; Operational state remains distinct from retrieved memory and prompt context. Context can be compressed or reconstructed without silently becoming the source of truth.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Composable capabilities.&lt;/strong&gt; Skills and tools can evolve behind stable interfaces while orchestration, authorization, and observability remain consistent—making the system easier to maintain.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Enforceable security boundaries.&lt;/strong&gt; Policy checks can be applied at relevant execution points. A model-generated tool request is a proposal, not proof of authorization.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Scalable multi-agent coordination.&lt;/strong&gt; Delegation, concurrency, ownership, result aggregation, timeout handling, and failure propagation become explicit runtime responsibilities rather than being mistaken for protocol features.&lt;/p&gt;

&lt;h2&gt;
  
  
  10. A Fair Assessment of the Original Diagram
&lt;/h2&gt;

&lt;p&gt;The criticism deserves precision. If the original diagram is intended as an introductory concept map, its four categories are useful: they remind readers that agents need capabilities, memory, execution control, and communication mechanisms.&lt;/p&gt;

&lt;p&gt;The problem arises when the diagram is treated as a reference architecture. Its categories mix different levels of abstraction, the execution loop remains implicit, operational state is absent, Working Context is treated as a kind of memory, and the environment is not given an explicit layer.&lt;/p&gt;

&lt;p&gt;A better architecture does not need to discard the original concepts. It needs to reorganize them around their actual responsibilities and relationships.&lt;/p&gt;

&lt;p&gt;The four concepts still matter:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Skills belong to the capability model.&lt;/li&gt;
&lt;li&gt;Memory belongs to the retained-information model; operational state belongs to the runtime.&lt;/li&gt;
&lt;li&gt;Protocols belong to the interaction model.&lt;/li&gt;
&lt;li&gt;Harness is the runtime and control layer.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;They are all essential, but they do not occupy equivalent architectural positions.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion: Design Around Execution, Not Around a Collection of Components
&lt;/h2&gt;

&lt;p&gt;The original diagram captures an important truth: a production-grade agent is much more than an LLM with tools. But its four-part classification is better understood as a conceptual checklist than as a rigorous system architecture.&lt;/p&gt;

&lt;p&gt;For engineering, the more useful starting point is the execution lifecycle. The runtime coordinates inference, context, capabilities, state, protocols, and the environment. It manages actions and observations, preserves execution state, enforces policy, evaluates results, and supports recovery.&lt;/p&gt;

&lt;p&gt;Memory should distinguish operational state from persistent knowledge. Skills should be treated as reusable capabilities. Protocols should be treated as communication contracts. The environment should be explicit. Governance should cross architectural boundaries.&lt;/p&gt;

&lt;p&gt;The central question is therefore not simply &lt;strong&gt;“What components should an LLM agent have?”&lt;/strong&gt; It is:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;“How do we build a runtime that allows an intelligent system to pursue objectives over time, preserve state correctly, act within defined boundaries, use observations to adjust its behavior, and recover from failure?”&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;That is the harder engineering problem—and the reason a Runtime-Centric Agent Architecture is a stronger foundation for reliable, scalable, and maintainable agent systems.&lt;/p&gt;

</description>
      <category>agents</category>
      <category>architecture</category>
      <category>llm</category>
      <category>systemdesign</category>
    </item>
    <item>
      <title>Dynamic Loading Mechanisms in 10 Popular Programming Languages</title>
      <dc:creator>Lu Han</dc:creator>
      <pubDate>Sat, 07 Jun 2025 17:36:17 +0000</pubDate>
      <link>https://dev.to/feuyeux/dynamic-loading-mechanisms-in-10-popular-programming-languages-415o</link>
      <guid>https://dev.to/feuyeux/dynamic-loading-mechanisms-in-10-popular-programming-languages-415o</guid>
      <description>&lt;p&gt;Dynamic loading is a crucial technique in modern software development. It allows programs to load and use code modules at runtime, rather than having all dependencies fixed at compile time. This enables plugin systems, modular architectures, hot updates, and more.&lt;/p&gt;

&lt;p&gt;In this article, we’ll explore how 10 mainstream programming languages implement dynamic loading, using a simple calculator project as a running example. We’ll cover the core principles, code samples, and best practices for each language.&lt;/p&gt;




&lt;h2&gt;
  
  
  What Is Dynamic Loading?
&lt;/h2&gt;

&lt;p&gt;Dynamic loading refers to loading code modules or libraries at runtime and creating object instances in memory as needed. Unlike static linking, where all dependencies are resolved at compile time, dynamic loading offers:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;🔥 &lt;strong&gt;Hot-swapping&lt;/strong&gt;: Update features without restarting the program&lt;/li&gt;
&lt;li&gt;🎯 &lt;strong&gt;On-demand loading&lt;/strong&gt;: Reduce memory usage and startup time&lt;/li&gt;
&lt;li&gt;🔧 &lt;strong&gt;Plugin architecture&lt;/strong&gt;: Support third-party extensions&lt;/li&gt;
&lt;li&gt;🚀 &lt;strong&gt;Modular design&lt;/strong&gt;: Lower coupling and improve code reuse&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Project Architecture
&lt;/h2&gt;

&lt;p&gt;All examples implement the same interface for a calculator with four basic operations: &lt;code&gt;addFn(a, b)&lt;/code&gt;, &lt;code&gt;subFn(a, b)&lt;/code&gt;, &lt;code&gt;mulFn(a, b)&lt;/code&gt;, and &lt;code&gt;divFn(a, b)&lt;/code&gt; (with zero-division checks).&lt;/p&gt;

&lt;p&gt;The architecture consists of:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Application&lt;/strong&gt;: Calls a unified interface&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Dynamic Loader&lt;/strong&gt;: Manages loading logic&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Implementation Module&lt;/strong&gt;: Provides actual functionality&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  1. Python – &lt;code&gt;importlib&lt;/code&gt; Dynamic Module Import
&lt;/h2&gt;

&lt;p&gt;Python uses the &lt;code&gt;importlib&lt;/code&gt; module for dynamic loading. It can import modules and instantiate classes 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="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;importlib&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;DynamicCalculatorLoader&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;load_calculator&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;calculator_type&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;module&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;importlib&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;import_module&lt;/span&gt;&lt;span class="p"&gt;(&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;calculator_&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;calculator_type&lt;/span&gt;&lt;span class="si"&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;calculator_class&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;getattr&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;module&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;calculator_type&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;capitalize&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;Calculator&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="nf"&gt;calculator_class&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;Highlights&lt;/strong&gt;: No compilation needed, module cache via &lt;code&gt;sys.modules&lt;/code&gt;, dynamic typing.&lt;/p&gt;




&lt;h2&gt;
  
  
  2. Java – Reflection and ClassLoader
&lt;/h2&gt;

&lt;p&gt;Java leverages reflection and class loaders to load classes dynamically, even from external JARs.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nc"&gt;URLClassLoader&lt;/span&gt; &lt;span class="n"&gt;classLoader&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;URLClassLoader&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="no"&gt;URL&lt;/span&gt;&lt;span class="o"&gt;[]{&lt;/span&gt;&lt;span class="n"&gt;jarUrl&lt;/span&gt;&lt;span class="o"&gt;});&lt;/span&gt;
&lt;span class="nc"&gt;Class&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;?&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;clazz&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;classLoader&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;loadClass&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"com.example.Calculator"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;span class="nc"&gt;Calculator&lt;/span&gt; &lt;span class="n"&gt;calculator&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Calculator&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="n"&gt;clazz&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getDeclaredConstructor&lt;/span&gt;&lt;span class="o"&gt;().&lt;/span&gt;&lt;span class="na"&gt;newInstance&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Highlights&lt;/strong&gt;: Bytecode loading, security sandbox, runtime inspection.&lt;/p&gt;




&lt;h2&gt;
  
  
  3. Rust – Dynamic Library Loading (&lt;code&gt;libloading&lt;/code&gt;)
&lt;/h2&gt;

&lt;p&gt;Rust uses the &lt;code&gt;libloading&lt;/code&gt; crate to load dynamic libraries (&lt;code&gt;.so&lt;/code&gt;, &lt;code&gt;.dll&lt;/code&gt;, &lt;code&gt;.dylib&lt;/code&gt;) and call functions via C ABI.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;lib&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nn"&gt;Library&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;new&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"libcalc.dylib"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;?&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;func&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Symbol&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="k"&gt;unsafe&lt;/span&gt; &lt;span class="k"&gt;extern&lt;/span&gt; &lt;span class="k"&gt;fn&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="k"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;i32&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;lib&lt;/span&gt;&lt;span class="nf"&gt;.get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;b"addFn"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&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;Highlights&lt;/strong&gt;: Zero-cost abstractions, memory safety, system-level performance.&lt;/p&gt;




&lt;h2&gt;
  
  
  4. C++ – System Dynamic Library APIs
&lt;/h2&gt;

&lt;p&gt;C++ uses platform APIs (&lt;code&gt;dlopen/dlsym&lt;/code&gt; on Unix, &lt;code&gt;LoadLibrary/GetProcAddress&lt;/code&gt; on Windows) for dynamic loading.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;&lt;span class="kt"&gt;void&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;handle&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;dlopen&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"libcalculator.so"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;RTLD_LAZY&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="k"&gt;auto&lt;/span&gt; &lt;span class="n"&gt;addFn&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;)(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;&lt;span class="n"&gt;dlsym&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;handle&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"addFn"&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;Highlights&lt;/strong&gt;: Low-level control, cross-platform, high performance.&lt;/p&gt;




&lt;h2&gt;
  
  
  5. C# – Reflection and Assembly Loading
&lt;/h2&gt;

&lt;p&gt;C# uses reflection and &lt;code&gt;Assembly.LoadFrom&lt;/code&gt; to load assemblies and create instances.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="n"&gt;Assembly&lt;/span&gt; &lt;span class="n"&gt;assembly&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Assembly&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;LoadFrom&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Calculator.dll"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="n"&gt;Type&lt;/span&gt; &lt;span class="n"&gt;type&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;assembly&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;GetType&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Calculator.BasicCalculator"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kt"&gt;object&lt;/span&gt; &lt;span class="n"&gt;instance&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Activator&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;CreateInstance&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;type&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;Highlights&lt;/strong&gt;: Managed code, rich metadata, automatic memory management.&lt;/p&gt;




&lt;h2&gt;
  
  
  6. Go – Interfaces and Reflection
&lt;/h2&gt;

&lt;p&gt;Go doesn’t support traditional dynamic libraries, but achieves similar results via interfaces and factory patterns.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="k"&gt;var&lt;/span&gt; &lt;span class="n"&gt;calc&lt;/span&gt; &lt;span class="n"&gt;calculator&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Calculator&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;calculator&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;BasicCalculator&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="n"&gt;calc&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;AddFn&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;b&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;Highlights&lt;/strong&gt;: Static typing, interface-based polymorphism, native concurrency.&lt;/p&gt;




&lt;h2&gt;
  
  
  7. Swift – Protocols and Type System
&lt;/h2&gt;

&lt;p&gt;Swift uses protocols and type casting for dynamic invocation.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight swift"&gt;&lt;code&gt;&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="nv"&gt;calculators&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="kt"&gt;Calculator&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="kt"&gt;BasicCalculator&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="kt"&gt;AdvancedCalculator&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;calc&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="n"&gt;calculators&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;calc&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;addFn&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;b&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;Highlights&lt;/strong&gt;: Protocol-oriented, type safety, performance optimizations.&lt;/p&gt;




&lt;h2&gt;
  
  
  8. TypeScript – Dynamic &lt;code&gt;import()&lt;/code&gt; and Factory Pattern
&lt;/h2&gt;

&lt;p&gt;TypeScript uses ES6 dynamic &lt;code&gt;import()&lt;/code&gt; and factory patterns for module loading.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="kr"&gt;module&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="k"&gt;import&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./calculator&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;calculator&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="kr"&gt;module&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;BasicCalculator&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;Highlights&lt;/strong&gt;: Async loading, type safety, flexible module system.&lt;/p&gt;




&lt;h2&gt;
  
  
  9. Dart – Factory Pattern and Reflection
&lt;/h2&gt;

&lt;p&gt;Dart uses factory constructors and reflection APIs for dynamic instantiation.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight dart"&gt;&lt;code&gt;&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="n"&gt;calculator&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;CalculatorFactory&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'BasicCalculator'&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;Highlights&lt;/strong&gt;: Event loop concurrency, JIT/AOT compilation, cross-platform.&lt;/p&gt;




&lt;h2&gt;
  
  
  10. Kotlin – Reflection API and Factory Pattern
&lt;/h2&gt;

&lt;p&gt;Kotlin uses reflection and factory patterns, similar to Java but with more concise syntax.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight kotlin"&gt;&lt;code&gt;&lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;clazz&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Class&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;forName&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"BasicCalculator"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="n"&gt;kotlin&lt;/span&gt;
&lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;instance&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;clazz&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;createInstance&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nc"&gt;Calculator&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Highlights&lt;/strong&gt;: Java interoperability, null safety, coroutine support.&lt;/p&gt;




&lt;h2&gt;
  
  
  Performance Comparison
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Language&lt;/th&gt;
&lt;th&gt;Load Speed&lt;/th&gt;
&lt;th&gt;Memory&lt;/th&gt;
&lt;th&gt;Type Safety&lt;/th&gt;
&lt;th&gt;Learning Curve&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;C++&lt;/td&gt;
&lt;td&gt;⭐⭐⭐⭐⭐&lt;/td&gt;
&lt;td&gt;⭐⭐⭐⭐⭐&lt;/td&gt;
&lt;td&gt;⭐⭐⭐&lt;/td&gt;
&lt;td&gt;⭐⭐&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Rust&lt;/td&gt;
&lt;td&gt;⭐⭐⭐⭐&lt;/td&gt;
&lt;td&gt;⭐⭐⭐⭐⭐&lt;/td&gt;
&lt;td&gt;⭐⭐⭐⭐⭐&lt;/td&gt;
&lt;td&gt;⭐⭐&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Go&lt;/td&gt;
&lt;td&gt;⭐⭐⭐⭐&lt;/td&gt;
&lt;td&gt;⭐⭐⭐⭐&lt;/td&gt;
&lt;td&gt;⭐⭐⭐⭐&lt;/td&gt;
&lt;td&gt;⭐⭐⭐⭐&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Java&lt;/td&gt;
&lt;td&gt;⭐⭐⭐&lt;/td&gt;
&lt;td&gt;⭐⭐⭐&lt;/td&gt;
&lt;td&gt;⭐⭐⭐⭐&lt;/td&gt;
&lt;td&gt;⭐⭐⭐&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;C#&lt;/td&gt;
&lt;td&gt;⭐⭐⭐&lt;/td&gt;
&lt;td&gt;⭐⭐⭐&lt;/td&gt;
&lt;td&gt;⭐⭐⭐⭐&lt;/td&gt;
&lt;td&gt;⭐⭐⭐&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Kotlin&lt;/td&gt;
&lt;td&gt;⭐⭐⭐&lt;/td&gt;
&lt;td&gt;⭐⭐⭐&lt;/td&gt;
&lt;td&gt;⭐⭐⭐⭐⭐&lt;/td&gt;
&lt;td&gt;⭐⭐⭐&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Swift&lt;/td&gt;
&lt;td&gt;⭐⭐⭐⭐&lt;/td&gt;
&lt;td&gt;⭐⭐⭐⭐&lt;/td&gt;
&lt;td&gt;⭐⭐⭐⭐⭐&lt;/td&gt;
&lt;td&gt;⭐⭐⭐&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;TypeScript&lt;/td&gt;
&lt;td&gt;⭐⭐&lt;/td&gt;
&lt;td&gt;⭐⭐&lt;/td&gt;
&lt;td&gt;⭐⭐⭐⭐&lt;/td&gt;
&lt;td&gt;⭐⭐⭐⭐&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Python&lt;/td&gt;
&lt;td&gt;⭐⭐&lt;/td&gt;
&lt;td&gt;⭐⭐&lt;/td&gt;
&lt;td&gt;⭐⭐&lt;/td&gt;
&lt;td&gt;⭐⭐⭐⭐⭐&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Dart&lt;/td&gt;
&lt;td&gt;⭐⭐⭐&lt;/td&gt;
&lt;td&gt;⭐⭐⭐&lt;/td&gt;
&lt;td&gt;⭐⭐⭐⭐&lt;/td&gt;
&lt;td&gt;⭐⭐⭐⭐&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Best Practices
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Interface Design&lt;/strong&gt;: Define clear contracts.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Error Handling&lt;/strong&gt;: Robust exception management.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Version Compatibility&lt;/strong&gt;: Plan for backward compatibility.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Security&lt;/strong&gt;: Validate module sources.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Performance Monitoring&lt;/strong&gt;: Track load times and memory usage.&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Dynamic loading is vital in modern software architecture. Each language offers unique mechanisms:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Low-level languages&lt;/strong&gt; (C++, Rust): Maximum performance and control&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Managed languages&lt;/strong&gt; (Java, C#): Balance of usability and safety&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Scripting languages&lt;/strong&gt; (Python, JavaScript): Maximum flexibility&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Modern languages&lt;/strong&gt; (Go, Swift, Kotlin): Blend of traditional strengths&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Choose the right approach based on your project’s needs, team expertise, and performance requirements.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;References&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/your-repo/hello-dyn" rel="noopener noreferrer"&gt;Project Source Code&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Official documentation for each language&lt;/li&gt;
&lt;li&gt;Best practices for dynamic loading&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;em&gt;If you found this article helpful, follow for more deep dives into programming language internals and architecture!&lt;/em&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>A2A Protocol with Local LLMs: A Comprehensive Guide for Developers</title>
      <dc:creator>Lu Han</dc:creator>
      <pubDate>Thu, 05 Jun 2025 19:05:58 +0000</pubDate>
      <link>https://dev.to/feuyeux/a2a-protocol-with-local-llms-a-comprehensive-guide-for-developers-6co</link>
      <guid>https://dev.to/feuyeux/a2a-protocol-with-local-llms-a-comprehensive-guide-for-developers-6co</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;The Agent2Agent (A2A) Protocol is an open communication standard that enables AI agents built on different frameworks to communicate and collaborate effectively. While Google’s official examples rely on cloud services like Google AI Studio and Vertex AI, this guide demonstrates how to run the entire A2A ecosystem using local language models through Ollama and LM Studio, making it accessible to developers worldwide, especially those in regions with limited cloud access.&lt;/p&gt;

&lt;p&gt;Today, I'm sharing my journey building a complete &lt;strong&gt;Agent-to-Agent (A2A) ecosystem&lt;/strong&gt; where five different AI frameworks collaborate using local LLMs - no cloud APIs required!&lt;/p&gt;

&lt;h2&gt;
  
  
  🎯 What We're Building
&lt;/h2&gt;

&lt;p&gt;This project demonstrates real cross-agent communication using:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Travel Agent&lt;/strong&gt; (Semantic Kernel) - Orchestrates complex trip planning&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Currency Agent&lt;/strong&gt; (LangGraph) - Provides real-time currency conversion&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;YouTube Agent&lt;/strong&gt; (AG2/AutoGen + MCP) - Extracts video content for research&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Reimbursement Agent&lt;/strong&gt; (Google ADK) - Handles expense workflows with forms&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;File Chat Agent&lt;/strong&gt; (LlamaIndex) - Enables document conversations with file uploads&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;All powered by &lt;strong&gt;local LLMs&lt;/strong&gt; (Ollama/LM Studio) and connected via &lt;strong&gt;A2A JSON-RPC protocol&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.amazonaws.com%2Fuploads%2Farticles%2F0dtb3a7w0qqtycmeon3w.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.amazonaws.com%2Fuploads%2Farticles%2F0dtb3a7w0qqtycmeon3w.png" alt="Image description" width="800" height="920"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  🛠️ Core Technologies
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Local LLM Infrastructure
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Ollama&lt;/strong&gt;: Download from &lt;a href="https://ollama.com" rel="noopener noreferrer"&gt;ollama.com&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;LM Studio&lt;/strong&gt;: Download from &lt;a href="https://lmstudio.ai" rel="noopener noreferrer"&gt;lmstudio.ai&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  AI Frameworks Integration
&lt;/h3&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;Agent&lt;/th&gt;
&lt;th&gt;Purpose&lt;/th&gt;
&lt;th&gt;Port&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;LangGraph&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Currency Agent&lt;/td&gt;
&lt;td&gt;Real-time currency conversion&lt;/td&gt;
&lt;td&gt;10000&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;AG2 (AutoGen)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;YouTube Agent&lt;/td&gt;
&lt;td&gt;Video transcript analysis&lt;/td&gt;
&lt;td&gt;10010&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Google ADK&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Reimbursement Agent&lt;/td&gt;
&lt;td&gt;Expense processing with forms&lt;/td&gt;
&lt;td&gt;10020&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Semantic Kernel&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Travel Agent&lt;/td&gt;
&lt;td&gt;Trip planning orchestration&lt;/td&gt;
&lt;td&gt;10030&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;LlamaIndex&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;File Chat Agent&lt;/td&gt;
&lt;td&gt;Document parsing &amp;amp; Q&amp;amp;A&lt;/td&gt;
&lt;td&gt;10040&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  💻 Quick Start Guide
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Setup Environment
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Create virtual environment&lt;/span&gt;
python &lt;span class="nt"&gt;-m&lt;/span&gt; venv venv
&lt;span class="nb"&gt;source &lt;/span&gt;venv/bin/activate  &lt;span class="c"&gt;# Windows: venv\Scripts\activate&lt;/span&gt;

&lt;span class="c"&gt;# Install dependencies&lt;/span&gt;
pip &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-r&lt;/span&gt; requirements.txt
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2. Start Local LLM Service
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Option 1: Ollama&lt;/span&gt;
ollama serve

&lt;span class="c"&gt;# Option 2: LM Studio&lt;/span&gt;
&lt;span class="c"&gt;# Download and run LM Studio, load your preferred model&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  3. Launch Agents
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Currency Agent (LangGraph)&lt;/span&gt;
./start_remote_agent.sh langgraph &lt;span class="nt"&gt;--host&lt;/span&gt; localhost &lt;span class="nt"&gt;--port&lt;/span&gt; 10000 &lt;span class="nt"&gt;--llm-provider&lt;/span&gt; ollama &lt;span class="nt"&gt;--model-name&lt;/span&gt; qwen2.5:7b

&lt;span class="c"&gt;# YouTube Agent (AG2 + MCP)&lt;/span&gt;
./start_remote_agent.sh ag2 &lt;span class="nt"&gt;--host&lt;/span&gt; localhost &lt;span class="nt"&gt;--port&lt;/span&gt; 10010 &lt;span class="nt"&gt;--llm-provider&lt;/span&gt; ollama &lt;span class="nt"&gt;--model-name&lt;/span&gt; qwen2.5:7b

&lt;span class="c"&gt;# Travel Agent (Semantic Kernel)&lt;/span&gt;
./start_remote_agent.sh semantickernel &lt;span class="nt"&gt;--host&lt;/span&gt; localhost &lt;span class="nt"&gt;--port&lt;/span&gt; 10030 &lt;span class="nt"&gt;--llm-provider&lt;/span&gt; ollama &lt;span class="nt"&gt;--model-name&lt;/span&gt; qwen2.5:7b

&lt;span class="c"&gt;# Reimbursement Agent (Google ADK)&lt;/span&gt;
./start_remote_agent.sh google_adk &lt;span class="nt"&gt;--host&lt;/span&gt; localhost &lt;span class="nt"&gt;--port&lt;/span&gt; 10020 &lt;span class="nt"&gt;--llm-provider&lt;/span&gt; ollama &lt;span class="nt"&gt;--model-name&lt;/span&gt; qwen2.5:7b

&lt;span class="c"&gt;# File Chat Agent (LlamaIndex)&lt;/span&gt;
./start_remote_agent.sh llama_index_file_chat &lt;span class="nt"&gt;--host&lt;/span&gt; localhost &lt;span class="nt"&gt;--port&lt;/span&gt; 10040 &lt;span class="nt"&gt;--llm-provider&lt;/span&gt; ollama &lt;span class="nt"&gt;--model-name&lt;/span&gt; qwen2.5:7b
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  4. Start Host Interface
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Web UI Host&lt;/span&gt;
./start_host_agent.sh
&lt;span class="c"&gt;# Visit http://localhost:12000&lt;/span&gt;

&lt;span class="c"&gt;# Or CLI Host&lt;/span&gt;
./start_cli.sh &lt;span class="nt"&gt;--agent&lt;/span&gt; http://localhost:10000
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  🔧 A2A Protocol Implementation
&lt;/h2&gt;

&lt;p&gt;Each agent exposes a standardized &lt;strong&gt;Agent Card&lt;/strong&gt; via &lt;code&gt;.well-known/agent.json&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Currency Agent"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"description"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Helps with exchange rates for currencies"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"version"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"1.0.0"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"http://localhost:10000/"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"capabilities"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"pushNotifications"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"streaming"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"skills"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"convert_currency"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Currency Exchange Rates Tool"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"description"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Helps with exchange values between various currencies"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"examples"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"What is exchange rate between USD and GBP?"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"tags"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"currency conversion"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"currency exchange"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Communication happens via &lt;strong&gt;JSON-RPC 2.0&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"jsonrpc"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2.0"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"method"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"message/send"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"params"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"sessionId"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"test-session"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"message"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"messageId"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"msg-01"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"role"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"user"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"parts"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"text"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"text"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Convert 100 USD to CNY"&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;}]&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  🎮 Real-World Demo: Multi-Agent Travel Planning
&lt;/h2&gt;

&lt;p&gt;Here's where the magic happens! Let's see how agents collaborate:&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;# User request to Travel Agent&lt;/span&gt;
curl &lt;span class="nt"&gt;-X&lt;/span&gt; POST http://localhost:10030 &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;'{
    "jsonrpc": "2.0",
    "id": 1,
    "method": "message/send",
    "params": {
      "message": {
        "role": "user",
        "parts": [{
          "text": "Plan a 7-day Seoul trip with $5000 budget, include currency conversion"
        }]
      }
    }
  }'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;What happens behind the scenes:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Travel Agent&lt;/strong&gt; receives the request&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Automatically calls Currency Agent&lt;/strong&gt; to get USD→KRW exchange rate&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Plans detailed itinerary&lt;/strong&gt; with converted budget&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Returns comprehensive travel plan&lt;/strong&gt; with real currency data&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Response:&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;# 📍 Seoul 7-Day Travel Plan

## 💰 Budget &amp;amp; Exchange Rate
- **Total Budget**: 5000 USD  
- **Current Rate**: 1 USD = 1376.78 KRW
- **Korean Won Budget**: ~6,883,900 KRW

## 🗓️ Detailed Itinerary
### Day 1: Arrival Seoul (Budget: 800,000 KRW)
- **Accommodation**: Myeongdong Hotel (120,000 KRW/night)
- **Transport**: Incheon Airport Express → Myeongdong (9,000 KRW)
- **Dinner**: Myeongdong street food (30,000 KRW)
...
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  🔥 Advanced Features
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. &lt;strong&gt;Multi-Framework Integration&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Each agent uses its native framework:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;LangGraph&lt;/strong&gt;: Graph-based workflow for currency conversion&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Semantic Kernel&lt;/strong&gt;: Plugin architecture for travel planning&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AG2 + MCP&lt;/strong&gt;: Multi-agent collaboration with Model Context Protocol&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Google ADK&lt;/strong&gt;: Form-based workflows for reimbursements&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;LlamaIndex&lt;/strong&gt;: RAG pipeline for document chat&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  2. &lt;strong&gt;Form-Based Interactions&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;The Reimbursement Agent demonstrates complex form workflows:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"status"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"state"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"input-required"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"message"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"parts"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"data"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"form"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"object"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"properties"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
              &lt;/span&gt;&lt;span class="nl"&gt;"date"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"string"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"format"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"date"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
              &lt;/span&gt;&lt;span class="nl"&gt;"amount"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"string"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"format"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"number"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
              &lt;/span&gt;&lt;span class="nl"&gt;"purpose"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"string"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"form_data"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"amount"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"500"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"purpose"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Business trip transportation"&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;}]&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  3. &lt;strong&gt;File Upload &amp;amp; Processing&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;File Chat Agent handles multiple formats:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"parts"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"text"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"text"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Analyze this document"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"file"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"file"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"report.pdf"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"mimeType"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"application/pdf"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"bytes"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"base64-encoded-content"&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  🎯 Key Benefits
&lt;/h2&gt;

&lt;h3&gt;
  
  
  🔒 &lt;strong&gt;Privacy First&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;100% Local&lt;/strong&gt;: No data sent to cloud APIs&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Your LLMs&lt;/strong&gt;: Use any model you prefer&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Full Control&lt;/strong&gt;: Complete ownership of your AI pipeline&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  🧩 &lt;strong&gt;Framework Flexibility&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Best of Both Worlds&lt;/strong&gt;: Use each framework's strengths&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Easy Integration&lt;/strong&gt;: Standardized A2A protocol&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Modular Design&lt;/strong&gt;: Add/remove agents independently&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  🚀 &lt;strong&gt;Production Ready&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Streaming Support&lt;/strong&gt;: Real-time responses&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Error Handling&lt;/strong&gt;: Robust error recovery&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Monitoring&lt;/strong&gt;: Built-in logging and debugging&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  🔗 Resources &amp;amp; Links
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/google/A2A" rel="noopener noreferrer"&gt;A2A Specification and Documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/google-a2a/a2a-samples" rel="noopener noreferrer"&gt;Agent2Agent (A2A) Samples&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/google/a2a-python" rel="noopener noreferrer"&gt;A2A Python SDK&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  🎉 Conclusion
&lt;/h2&gt;

&lt;p&gt;Building a multi-agent AI ecosystem doesn't have to be complex. With the right architecture and standardized protocols, different AI frameworks can collaborate seamlessly.&lt;/p&gt;

&lt;p&gt;The future of AI is &lt;strong&gt;collaborative&lt;/strong&gt; - where specialized agents work together to solve complex problems. This project shows it's not just possible, but practical with today's tools!&lt;/p&gt;

&lt;p&gt;Enjoy 👇&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/feuyeux/hello-a2a/tree/main/hello-a2a-python" rel="noopener noreferrer"&gt;hello-a2a-python&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
  </channel>
</rss>
