{"id":51144201,"url":"https://github.com/hidemi-k/a2a-ceos-core","last_synced_at":"2026-06-26T01:30:44.945Z","repository":{"id":366258641,"uuid":"1230957912","full_name":"hidemi-k/a2a-ceos-core","owner":"hidemi-k","description":"A2A-based network automation platform for Arista cEOS. Operates NETCONF / eAPI / eAPI Config / ANTA / XDP from a single natural-language command, with a safe Dry-run → diff → approval → ANTA Post-Check workflow.","archived":false,"fork":false,"pushed_at":"2026-06-21T01:01:07.000Z","size":1139,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-06-26T01:30:35.707Z","etag":null,"topics":["a2a","agent-framework","arista-networks","azure","containerlab","eapi","netconf","nicegui","rag","xdp"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/hidemi-k.png","metadata":{"files":{"readme":"README.ja.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-05-06T13:39:57.000Z","updated_at":"2026-06-21T01:01:11.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/hidemi-k/a2a-ceos-core","commit_stats":null,"previous_names":["hidemi-k/a2a-ceos-core"],"tags_count":3,"template":false,"template_full_name":null,"purl":"pkg:github/hidemi-k/a2a-ceos-core","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hidemi-k%2Fa2a-ceos-core","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hidemi-k%2Fa2a-ceos-core/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hidemi-k%2Fa2a-ceos-core/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hidemi-k%2Fa2a-ceos-core/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/hidemi-k","download_url":"https://codeload.github.com/hidemi-k/a2a-ceos-core/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hidemi-k%2Fa2a-ceos-core/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34799570,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-25T02:00:05.521Z","response_time":101,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["a2a","agent-framework","arista-networks","azure","containerlab","eapi","netconf","nicegui","rag","xdp"],"created_at":"2026-06-26T01:30:36.307Z","updated_at":"2026-06-26T01:30:44.860Z","avatar_url":"https://github.com/hidemi-k.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"🇯🇵 日本語 | 📘 [English](README.md)\n\n## 🔥 このプロジェクトが特別な理由（Why it matters）\n\n- **NETCONF / eAPI / eAPI Config / ANTA / XDP を A2A で統合し、Arista cEOS を自然言語 1 文で安全に操作できる OSS**\n- **Junos の commit check 相当の diff 機能を cEOS で再現**——Dry-run → diff → 承認 → NETCONF / eAPI Config デプロイ → ANTA Post-Check の完全自動化\n- **スナップショット差分 RAG によるマルチエージェント障害診断**——正常時との差分を根拠に 5 専門エージェントが連携して診断レポートを生成\n- A2A プロトコルでエージェントを統合。Groq → Azure OpenAI の自動フォールバックで本番稼働を保証\n- XDP/eBPF を AI 制御化（Human-in-the-loop）——既存 C/Go 資産を無改修で AI 統合\n- Containerlab（cEOS 4.36.0F）で実機検証済み。\n\n---\n\n## 概要\n\n| | |\n|---|---|\n| **統合** | NETCONF / eAPI / eAPI Config / ANTA / XDP を A2A で統合し、自然言語 1 文で操作 |\n| **安全** | Dry-run → +/- diff → 人間承認 → NETCONF / eAPI Config デプロイ → ANTA 自動 Post-Check |\n| **診断** | スナップショット差分 RAG → 5 専門エージェント連携による障害診断（Self-Correction 付き） |\n| **実証** | Containerlab（cEOS 4.36.0F）で実機検証済み。XDP セキュリティデモあり |\n| **AI** | A2A Hub が LLM で分類 → 専門エージェント（NETCONF / eAPI / eAPI Config / XDP / ANTA / Diagnose）に委譲 |\n| **Microsoft** | Azure Container Apps + Azure VM + Azure OpenAI + Microsoft Agent Framework |\n\n---\n\n## デモ動画\n\n📹 **Demo 動画** (2分45秒)\n\n[![Demo Video](https://img.youtube.com/vi/i8RYp8l2jbk/sddefault.jpg)](https://www.youtube.com/watch?v=i8RYp8l2jbk)\n\n---\n\n## ✨ 主な機能\n\n- 🔄 **自然言語 → NETCONF XML → Dry-run → diff → 承認 → デプロイ**（Junos 相当の事前 diff を cEOS で再現）\n- 🔍 **eAPI + RAG による高速 show / 状態参照**（自然言語クエリ → 適切な show コマンドを自動選択）\n- 🛠️ **eAPI Config（NETCONF 非対応領域の設定変更）** — VXLAN/EVPN・BGP network/redistribute など OpenConfig 非対応領域を eAPI configure session で補完。2 層の安全ガード + Phase1 dry-run / Phase2 commit の 2 段階フロー\n- 🔎 **スナップショット差分 RAG 障害診断** — 正常時 eAPI 出力を保存し、障害時に Unified Diff を LLM コンテキストに注入。5 専門エージェント（フロー判断 / L2 / L3 / 整合性チェック / レポート）が連携し Self-Correction で矛盾を自動検出\n- ✅ **ANTA 自動 Post-Check**（デプロイ後 ~340ms / 11 tests で副作用ゼロを自動確認）\n- 🛡️ **XDP/eBPF の AI 制御**（Human-in-the-loop — AI が提案、人間が承認して XDP ルール適用）\n- ⚡ **Groq → Azure OpenAI の自動フォールバック**（全サーバで共通。1 ファイルで LLM を差し替え可能）\n\n---\n\n## アーキテクチャ\n\n```\n┌─────────────────────────────────────────────────────┐\n│            Azure Container Apps                      │\n│  ┌────────────────────────────────────────────────┐  │\n│  │  app_a2a.py (NiceGUI Web UI / port:8080)       │  │\n│  │  ・自然言語入力 → REST POST /execute           │  │\n│  │  ・Dry-run → Diff 確認 → 承認デプロイ          │  │\n│  │  ・ANTA Verify / Diagnose / Security タブ      │  │\n│  │  ・多言語対応（日本語 / 英語）                  │  │\n│  └────────────────────┬───────────────────────────┘  │\n└───────────────────────│─────────────────────────────┘\n                        │ HTTP\n┌───────────────────────▼─────────────────────────────┐\n│                   Azure VM                           │\n│                                                      │\n│  ┌─────────────────────────────────────────────┐    │\n│  │  task_decompose_a2a_server.py  :8000         │    │\n│  │  A2A Hub / LLM ルーター                      │    │\n│  │  write  → :8001  / read      → :8002         │    │\n│  │  security → :8003 / verify   → :8004         │    │\n│  │  eapi_config → :8006（VXLAN/EVPN・BGP CLI） │    │\n│  └────┬──────────┬──────────┬──────────┬───┬───┘    │\n│       │          │          │          │   │         │\n│  ┌────▼──┐  ┌────▼──┐  ┌───▼───┐  ┌───▼─┐ │        │\n│  │:8001  │  │:8002  │  │:8003  │  │:8004│ │        │\n│  │NETCONF│  │eAPI   │  │XDP    │  │ANTA │ │        │\n│  │RAG    │  │Show + │  │Firewall│  │Verify│ │        │\n│  │(設定) │  │Diff   │  │(eBPF) │  │(検証)│ │        │\n│  └───┬───┘  └───┬───┘  └───┬───┘  └──┬──┘ │        │\n│      │          │          │         │    │         │\n│  ┌───▼──────────▼──┐  ┌────▼─────────▼──┐ │        │\n│  │  Arista cEOS    │  │ Go IPS REST API  │ │        │\n│  │  (NETCONF/eAPI) │  │ :8080 (eBPF/XDP) │ │        │\n│  └─────────────────┘  └─────────────────┘ │        │\n│                                            │        │\n│  ┌─────────────┐  ┌──────────────────────┐ │        │\n│  │:8005        │  │:8006                 │◀┘        │\n│  │Diagnose     │  │eAPI Config           │          │\n│  │(5 agents)   │  │(VXLAN/EVPN・BGP CLI)  │          │\n│  └──────┬──────┘  └──────────┬───────────┘          │\n│         │                    │                      │\n│  ┌──────▼────────────────────▼──┐                   │\n│  │  Arista cEOS (eAPI / HTTPS)  │                   │\n│  └──────────────────────────────┘                   │\n└─────────────────────────────────────────────────────┘\n```\n\n\u003e **通信経路の補足**\n\u003e - Security タブのリアルタイム表示（Top Traffic・Drop List・QoS List）は A2A Hub を経由せず、Web UI から Go IPS（:8080）へ直接 GET します。\n\u003e - Diagnose タブは A2A Hub を経由せず、Web UI から Diagnose Agent（:8005）へ直接 A2A リクエストを送ります。\n\u003e - Verify タブの Before Snapshot・Post-Check ボタンは A2A Hub を経由せず、Web UI から ANTA Agent（:8004）へ直接 A2A リクエストを送ります（Chat からの `verify` キーワードクエリは Hub 経由）。\n\u003e - チャット入力からのセキュリティ操作・VXLAN/EVPN 設定変更・BGP network/redistribute は Hub → 各エージェントの順に処理されます。\n\n### Azure 構成\n\n| コンポーネント | Azure サービス | 役割 |\n|---|---|---|\n| Web UI | Azure Container Apps | NiceGUI フロントエンド (port:8088) |\n| A2A Hub | Azure VM | LLM ルーター + REST API (port:8000) |\n| NETCONF Agent | Azure VM | 設定変更・RAG (port:8001) |\n| eAPI Agent | Azure VM | 状態参照 + Diff エンジン (port:8002) |\n| XDP Agent | Azure VM | セキュリティ制御 (port:8003) |\n| ANTA Agent | Azure VM | 事後検証 (port:8004) |\n| Diagnose Agent | Azure VM | 障害診断（5 専門エージェント連携）(port:8005) |\n| eAPI Config Agent | Azure VM | VXLAN/EVPN・BGP network/redistribute など NETCONF 非対応領域の設定変更（eAPI configure session）(port:8006) |\n| Go IPS | Azure VM | eBPF/XDP REST API (port:8080)。`-iface eth2` で ceos1 の eth2 に XDP/eBPF をアタッチ |\n| LLM Primary | Groq | llama-3.3-70b-versatile（高速推論） |\n| LLM Fallback | Azure OpenAI | gpt-4.1-mini（プライベートエンドポイント） |\n| エージェント基盤 | **Microsoft Agent Framework** | NETCONF Agent の LLM クライアント層 ＋ Diagnose Agent の 5 専門エージェント構築基盤（合計 6 Agent インスタンス） |\n\n---\n\n## A2A Hub のルーティングフロー\n\n```\n自然言語クエリ\n      │\n      ▼\n┌─────────────────────────────────────────────────┐\n│    classify_query()                              │\n│                                                 │\n│  ⓪ VXLAN/EVPN × 設定変更（参照動詞なし）？    │\n│     → \"eapi_config\" ──────────────────────────▶ eAPI Config Agent :8006\n│                                                 │\n│     VXLAN/EVPN × 参照動詞あり？               │\n│     → \"read\"   ───────────────────────────────▶ eAPI Agent :8002\n│                                                 │\n│     BGP network / redistribute / advertise？    │\n│     → \"eapi_config\" ──────────────────────────▶ eAPI Config Agent :8006\n│                                                 │\n│  ① VERIFY_KEYWORDS に一致？                    │\n│     → \"verify\"  ──────────────────────────────▶ ANTA Agent :8004\n│                                                 │\n│  ② SECURITY_REQUIRED に一致？                  │\n│     → \"security\" ─────────────────────────────▶ XDP Agent  :8003\n│                                                 │\n│  ③ READ_KEYWORDS のみ？                        │\n│     → \"read\"   ────────────────────────────────▶ eAPI Agent :8002\n│                                                 │\n│  ④ WRITE_KEYWORDS のみ？                       │\n│     → \"write\"  ────────────────────────────────▶ NETCONF Agent :8001\n│                                                 │\n│  ④ 参照 + 変更の混在（mixed）？               │\n│     → 参照のみ実行 ＋ 警告バブル表示          │\n│                                                 │\n│  ⑤ 判定不能 → LLM フォールバック              │\n└─────────────────────────────────────────────────┘\n\n※ Diagnose Agent（:8005）は Hub を経由せず Web UI から直接呼び出します。\n※ Verify タブ（Before Snapshot / Post-Check）も Hub を経由せず Web UI から ANTA Agent（:8004）へ直接呼び出します。Chat からの `verify` キーワードクエリのみ Hub 経由です。\n```\n\n---\n\n## ファイル構成\n\n| ファイル | 役割 |\n|----------|------|\n| `app_a2a.py` | NiceGUI Web UI（フロントエンド）|\n| `task_decompose_a2a_server.py` | A2A Hub / LLM ルーター（port:8000）|\n| `arista_netconf_rag_a2a_server.py` | NETCONF Agent / RAG（port:8001）|\n| `arista_eapi_show_a2a_server.py` | eAPI Agent / Diff エンジン（port:8002）|\n| `xdp_a2a_server.py` | XDP Agent / セキュリティ制御（port:8003）|\n| `arista_anta_verify_a2a_server.py` | ANTA Agent / 事後検証（port:8004）|\n| `diagnose_a2a_server.py` | Diagnose Agent / 障害診断（port:8005）|\n| `arista_eapi_config_a2a_server.py` | eAPI Config Agent / VXLAN/EVPN・BGP network/redistribute など NETCONF 非対応領域の設定変更（port:8006）|\n| `snapshot_manager.py` | スナップショット管理（Diagnose Agent 用）|\n| `diff_engine.py` | 差分抽出エンジン（Diagnose Agent 用）|\n| `llm_factory.py` | LLM 共通ファクトリ（Groq Primary / Azure OpenAI Fallback）|\n| `i18n.py` | 多言語対応（日本語 / 英語）|\n| `config.ini.example` | 設定ファイルのサンプル |\n| `.env.example` | 環境変数のサンプル |\n\n---\n\n## セットアップ\n\n### 必要要件\n\n- Python 3.11+\n- Arista cEOS（Containerlab 推奨）\n- Azure VM / Azure Container Apps\n- Groq API キー（または Azure OpenAI エンドポイント）\n\n### インストール\n\n```bash\ngit clone https://github.com/hidemi-k/a2a-ceos-core.git\ncd a2a-ceos-core\npip install -r requirements.txt\n```\n\n\u003e **Note**\n\u003e `a2a-sdk` と `agent-framework` のバージョンは `requirements.txt` を参照してください。\n\n### 設定\n\n```bash\n# 環境変数\ncp .env.example .env\n# エディタで .env を編集（API キー、デバイス IP 等を設定）\n\n# 設定ファイル\ncp config.ini.example config.ini\n# エディタで config.ini を編集\n```\n\n### 起動\n\n```bash\n# A2A エージェント群を起動（Azure VM 上で実行）\npython task_decompose_a2a_server.py \u0026       # A2A Hub        :8000\npython arista_netconf_rag_a2a_server.py \u0026   # NETCONF Agent  :8001\npython arista_eapi_show_a2a_server.py \u0026     # eAPI Agent     :8002\npython xdp_a2a_server.py \u0026                 # XDP Agent      :8003\npython arista_anta_verify_a2a_server.py \u0026   # ANTA Agent     :8004\npython diagnose_a2a_server.py \u0026             # Diagnose Agent :8005\npython arista_eapi_config_a2a_server.py \u0026   # eAPI Config    :8006\n\n# Web UI を起動（Azure Container Apps 上で実行）\npython app_a2a.py\n```\n\n---\n\n## 検証環境：Containerlab ネットワーキングラボ\n\n```\nAzure VM (172.20.100.0/24 — clab-mgmt)\n│\n├── ceos1  (Arista cEOS 4.36.0F)   172.20.100.31\n│     ├── eth1 ─── 10.0.20.3/24 ──── linux1:eth1 (10.0.20.150)  FRRouting BGP\n│     └── eth2 ─── 10.0.3.3/24  ──── kali1:eth2  (10.0.3.150)   Kali Linux（攻撃元）\n│                                      ↑ Go IPS が eth2 に XDP/eBPF をアタッチ（-iface eth2）\n│\n├── linux1 (Alpine + FRRouting)     172.20.100.3\n│     BGP AS 65002 — neighbor 10.0.20.3 (ceos1 AS 65001)\n│\n└── kali1  (Kali Linux カスタム)    172.20.100.150\n      XDP セキュリティデモの攻撃元として使用\n```\n\n`clab deploy` 1 コマンドで 3 ノードが起動し、cEOS の eAPI（HTTPS/443）・NETCONF（SSH/830）・gNMI（:6030、Arista 独自デフォルト。IANA 標準は 9339）がすべて利用可能になります。\n\n---\n\n## なぜ NETCONF/OpenConfig を採用したか\n\n設定変更のインタフェースとして CLI・eAPI・pyeapi・NETCONF・RESTCONF を比較した結果、本プロジェクトでは **NETCONF（OpenConfig）** を採用しています。\n\n| 比較項目 | CLI 文字列 | eAPI JSON | **NETCONF / OpenConfig（採用）** |\n|---|---|---|---|\n| LLM との親和性 | ❌ 低（非構造化） | ⚠️ 中 | ✅ **高（YANG スキーマが豊富）** |\n| 投入前検証 | なし | フィールド名照合 | **スキーマ検証（型・必須・enum）** |\n| 冪等性 | △ コマンド依存 | ✅ | **✅ operation 属性で制御** |\n| 事前 diff | なし | なし | **✅ configure session で再現** |\n| マルチベンダー展開 | ❌ | ❌ Arista 専用 | **✅ Juniper/Cisco 対応が容易** |\n\neAPI は Arista 専用 API のためマルチベンダー展開が困難ですが、NETCONF は標準プロトコルのため Juniper/Cisco への拡張が容易です。また YANG スキーマに基づく XML は断片的な CLI コマンドより LLM の生成精度が高く、`edit-config` の冪等性により重複設定を自動スキップできます。将来の Juniper 対応は、`a2a-junos-read`・`a2a-junos-write` のように必要な機能だけをマイクロサービスとして追加する方針で進めます。A2A Hub のルーティングロジックを変えるだけで、新しいエージェントを既存フローに組み込めます。\n\n---\n\n## 技術スタック\n\n| カテゴリ | 技術 |\n|---------|------|\n| A2A Protocol | google/a2a-sdk (Python) |\n| エージェント基盤 | **Microsoft Agent Framework**（`agent_framework_openai`） |\n| LLM (Primary) | Groq llama-3.3-70b-versatile |\n| LLM (Fallback) | Azure OpenAI gpt-4.1-mini |\n| RAG | FAISS + LangChain（BAAI/bge-large-en-v1.5） |\n| NETCONF | ncclient + OpenConfig |\n| eAPI | pyeapi (HTTPS) |\n| Network Testing | ANTA (Arista Network Test Automation) |\n| Security | XDP/eBPF + Go IPS REST API |\n| Web Framework | FastAPI + Starlette + NiceGUI |\n| Container | Azure Container Apps |\n| VM | Azure Virtual Machines |\n| Lab 環境 | Containerlab + Arista cEOS 4.36.0F |\n| 多言語 | i18n.py（日本語 / 英語） |\n| OSS 構成 | Azure インフラおよび LLM API 以外はすべて OSS・無償ツールで構成 |\n\n---\n\n## 🧠 技術的な詳細\n\n\u003cdetails\u003e\n\u003csummary\u003eクリックして展開\u003c/summary\u003e\n\n### eAPI 3段階ハイブリッド・パース方式\n\n頻出コマンドは構造化パーサーで即時整形し、未対応コマンドは段階的にフォールバックします。\n\n```\n① structured パース（show vlan / show ip bgp summary 等）\n       ↓ None の場合\n② encoding=\"text\" で CLI テキストを再取得 → LLM 整形（12000字）\n       ↓ text 非対応コマンドの場合\n③ JSON LLM パース（8000字制限・最終手段）\n```\n\n`show ip bgp neighbors` のように JSON が大きいコマンド（~50KB）は ② の text フォーマットで取得することで制限を回避します。サーバログの `parse_method` フィールド（`\"structured\"` / `\"text+llm\"` / `\"json+llm(fallback)\"`）でパスの追跡が可能です。\n\n### Arista cEOS の BGP neighbor 削除制約（実機確認済み）\n\n`nc:operation=\"delete\"` on `\u003cneighbor\u003e` は cEOS では動作しません（`data does not exist` エラー）。正しい削除方法は `\u003cneighbors\u003e` レベルで `nc:operation=\"replace\"` を使い、**残したい neighbor を全列挙**する方式です。\n\n```xml\n\u003c!-- ❌ 動作しない --\u003e\n\u003cneighbor nc:operation=\"delete\"\u003e\n  \u003cneighbor-address\u003e10.0.20.153\u003c/neighbor-address\u003e\n\u003c/neighbor\u003e\n\n\u003c!-- ✅ 正しい方法 --\u003e\n\u003cneighbors nc:operation=\"replace\"\u003e\n  \u003cneighbor\u003e\u003cneighbor-address\u003e10.0.20.150\u003c/neighbor-address\u003e...\u003c/neighbor\u003e\n  \u003c!-- 削除したい neighbor はここに含めない --\u003e\n\u003c/neighbors\u003e\n```\n\n本システムでは NETCONF Agent に BGP 削除専用ロジックを実装し、現在の neighbor 一覧を自動取得して replace XML を生成します。\n\n### AI 変更要約（diff の自然言語翻訳）\n\nEOS が計算した +/- diff を LLM が自然言語に翻訳します。diff の計算は EOS がすでに行っており、LLM は「翻訳」のみを担います。入力サイズは数行〜数十行と小さく、コンテキスト超過の心配がありません。\n\n操作タイプに応じて 3 パターンで処理します。\n\n- **① VLAN / Interface**（session diff あり）: EOS の +/- diff → LLM が日本語に翻訳\n- **② BGP 削除**（`nc:operation=\"replace\"` 方式）: 専用ロジックが確定情報から直接生成（LLM 不使用）  \n  ※ XML を LLM に渡すと replace の構造を「追加」と誤解するため\n- **③ BGP 追加 / その他**（session diff スキップ）: 生成 XML → LLM が意図を読み取る\n\nAI 変更要約は UI の Diff タブに表示され、+/- diff が取れない操作でも承認前に変更内容を確認できます。\n\n### ハイブリッド・トランザクション方式（diff 再現の仕組み）\n\n```\n① NETCONF Agent : RAG で XML 生成\n② eAPI Agent   : _cmds_from_xml() で XML → EOS CLI コマンド列に変換\n                  → configure session に CLI コマンドを投入\n                  → show session-config diffs  ← +/- diff を取得（EOS が計算）\n                  → abort（session 破棄、実機には傷なし）\n  ※ cEOS の configure session は CLI コマンドしか受け付けないため、\n     XML → CLI 変換をアプリ側で実装。VLAN・Interface は変換対応済み、\n     BGP は session diff をスキップし AI 変更要約で補完。\n③ Hub           : UI へ「生成 XML」＋「+/- diff」＋「AI 変更要約」を返す\n④ オペレーター  : Diff タブで \"+ hostname new-sw1\" 形式と AI 要約を確認\n⑤ 承認 → NETCONF: 検証済み XML を edit-config で投入\n⑥ 反映確認      : get_config audit\n⑦ ANTA Post-Check  : 副作用ゼロを自動検証（Before Snapshot と比較）\n```\n\n### RAG 知識ソース\n\n| RAG | 知識ソース | 用途 |\n|-----|-----------|------|\n| NETCONF 用 | OpenConfig YANG + Arista YANG + gNMI capabilities（128 + 146 モデル）+ 実機検証済み XML テンプレート | XML 設定テンプレートの生成 |\n| eAPI 用 | `eapi_documentation.json`（2,051 コマンド） | show コマンドの選択・フィールド解釈 |\n\nNETCONF 用 RAG には YANG モデルだけでなく、**実機検証で確認した動作確認済み XML テンプレート**を第4の知識ソースとして追加しています。「YANG モデル上は正しいが実機では動かない」ケース（BGP 削除の replace 方式など）を LLM が回避できます。\n\n### Microsoft Agent Framework\n\nNETCONF Agent と Diagnose Agent の 2 サーバで `agent_framework_openai.OpenAIChatCompletionClient` を採用。Groq と Azure OpenAI を同一インタフェースで抽象化し、障害時に自動フォールバックします。合計 6 つの Agent インスタンスを Microsoft Agent Framework で構築しています（NETCONF Agent: 1、Diagnose Agent: 5）。\n\n```python\nfrom agent_framework import Agent\nfrom agent_framework_openai import OpenAIChatCompletionClient\n\nclient = OpenAIChatCompletionClient(\n    model    = GROQ_MODEL,\n    api_key  = _GROQ_KEY,\n    base_url = GROQ_BASE_URL,\n)\n# v1.7.0: client が第1位置引数に変更\nagent = Agent(client, name=\"AgentName\", instructions=\"...\")\n```\n\n### eAPI configure session 上限問題への対処（eAPI Config Agent）\n\ndry-run 後にセッションが残存すると `configure session` の上限に達します。Phase1 では `show session-config diffs` 取得直後に `abort` でセッションを即時破棄します。Phase2（commit）ではタイムスタンプ付きの新規セッション名（`eapi_config_YYYYMMDD_HHMMSS`）を生成し、Phase1 のセッション名を再利用しません。\n\n```\nPhase1（dry-run）: configure session → show diffs → abort  ← セッション即時破棄\nPhase2（commit）: 新規セッション名で configure session → commit\n```\n\n### スナップショット差分 RAG（Diagnose Agent）\n\n正常時の eAPI 出力を JSON ファイルとして保存（`snapshot_manager.py`）し、障害時に `difflib` で Unified Diff を生成して LLM コンテキストに注入（`diff_engine.py`）します。ベクトル DB なし・追加ライブラリなし（Python 標準ライブラリのみ）で実装しています。\n\n5 専門エージェント（フロー判断 / L2 分析 / L3 分析 / 整合性チェック / 診断レポート）が連携し、整合性チェックエージェントが矛盾を検出すると L3 エージェントが自動的に再分析します（Self-Correction）。\n\n\u003c/details\u003e\n\n---\n\n## 参考リンク\n\n**エージェント・プロトコル**\n- [A2A Protocol (Google)](https://github.com/google/A2A)\n- [Microsoft Agent Framework](https://github.com/microsoft/agent-framework)\n\n**検証環境**\n- [Containerlab — cEOS](https://containerlab.dev/manual/kinds/ceos/)\n- [gnmic — gNMI CLI Client](https://gnmic.openconfig.net/)\n\n**ネットワーク自動化**\n- [Arista eAPI Python Library (pyeapi)](https://github.com/arista-eosplus/pyeapi)\n- [ANTA — Arista Network Test Automation](https://anta.arista.com/)\n- [ncclient — NETCONF Python Client](https://ncclient.readthedocs.io/)\n\n**RAG 知識ソース（YANG モデル）**\n- [aristanetworks/yang — Arista YANG Models](https://github.com/aristanetworks/yang)\n- [openconfig/public — OpenConfig YANG Models](https://github.com/openconfig/public)\n\n**セキュリティ**\n- [XDP IPS (ips-maf)](https://github.com/hidemi-k/maf-ebpf-sase/tree/main/ips-maf)\n\n**RAG 埋め込みモデル**\n- [BAAI/bge-large-en-v1.5](https://huggingface.co/BAAI/bge-large-en-v1.5)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fhidemi-k%2Fa2a-ceos-core","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fhidemi-k%2Fa2a-ceos-core","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fhidemi-k%2Fa2a-ceos-core/lists"}