RomiconEZ/agentiq-platform

GitHub: RomiconEZ/agentiq-platform

一个基于Docker Compose的LLM编排平台,提供多代理路由、负载均衡与全链路可观测的安全可控网关。

Stars: 4 | Forks: 0

# 🤖 A2A Agent 平台 **具备 LLM 负载均衡、监控、防护机制和授权的 Agent 平台。** A2A Agent Platform 是一个用于编排 LLM 请求的平台,支持多家提供商、智能负载均衡、Agent 注册表、guardrails 系统以及完整的 observability 技术栈。 ## 📑 目录 - [功能](#-возможности) - [架构](#-архитектура) - [Docker 容器](#-docker-контейнеры) - [快速开始](#-быстрый-старт) - [Web 界面](#-веб-интерфейсы) - [配置](#%EF%B8%8F-конфигурация) - [使用示例](#-примеры-использования) - [负载均衡策略](#-стратегии-балансировки) - [测试](#-тестирование) - [文档](#-документация) - [项目结构](#-структура-проекта) - [许可证](#-лицензия) ## 🚀 功能 ### LLM 编排 - **Chat Completions** — 通过 `/api/v1/llm/chat/completions` 端点与 LLM 交互的统一 API - **4 个 mock 提供商**:OpenAI GPT-4、Anthropic Claude、Google Gemini、OpenAI GPT-4 Replica — 全部通过 LiteLLM 路由到本地 LLM - **Streaming (SSE)** — 通过 Server-Sent Events 进行 LLM 响应的流式传输 - **4 种负载均衡策略**:Round Robin、Weighted Round Robin、Latency-Based、Health-Aware(默认) ### 注册表 - **A2A Agent Registry** — Agent 的注册、调用、更新和删除 - **2 个内置 Agent**:Summarizer (端口 8001) 和 Code Reviewer (端口 8002) - **Dynamic LLM Provider Registry** — 针对提供商的 CRUD 操作,包含价格、限制和优先级 ### 安全 - **基于 Token 的身份验证** — HMAC-SHA256、client_id/client_secret、scopes、TTL - **Guardrails**:检测 prompt injection(12 种模式)、检测机密泄露(9 种模式)、输入长度控制 ### Observability - **Prometheus** — 收集指标 - **Grafana** — 3 个预配置的 dashboard(LLM Monitoring、Traffic Distribution、System Overview) - **OpenTelemetry** — 分布式 tracing - **Langfuse** — LLM 调用 tracing - **MLFlow** — 实验追踪 - **Loki + Promtail** — 日志聚合,支持自动发现 Docker 容器 ### 基础设施 - **Redis** — 响应缓存 - **Nginx** — 针对流式传输优化的 reverse proxy - **Health-check 端点** — 组件状态监控 - **完全容器化** — 所有组件均使用 Docker Compose ## 🏗 架构 ``` flowchart TB Client([Клиент]) subgraph internal["Docker Network: internal"] Nginx["Nginx
Reverse Proxy
:80"] subgraph backend["FastAPI Backend :8000"] MW["Middleware
Metrics → Auth → Cache"] API["API Layer
/health /metrics
/api/v1/llm /auth
/providers /agents"] GR["Guardrails
Filter"] BM["Balancer Manager
RR / WRR / Latency / Health-Aware"] PR["Provider Registry"] P1["openai-gpt4
weight=3"] P2["anthropic-claude
weight=2"] P3["google-gemini
weight=1"] P4["openai-gpt4-replica
weight=1"] end Redis["Redis Cache"] subgraph agents["A2A Агенты"] SA["Summarizer
:8001"] CR["Code Reviewer
:8002"] end subgraph monitoring["Мониторинг"] Prom["Prometheus :9090"] Graf["Grafana :3001"] MLF["MLFlow :5001"] LF["Langfuse :3000"] Loki["Loki :3100"] PT["Promtail"] end LFDB["Langfuse DB
PostgreSQL"] end subgraph llmshared["Docker Network: llm-shared"] LiteLLM["LiteLLM Gateway
:4000"] LLMDB["LiteLLM DB
PostgreSQL"] end LLM["Локальная / Облачная LLM"] Client --> Nginx Nginx --> MW MW --> API API --> GR GR --> BM BM --> PR PR --> P1 & P2 & P3 & P4 P1 & P2 & P3 & P4 --> LiteLLM LiteLLM --> LLM LiteLLM --> LLMDB API --> Redis SA & CR --> API backend --> Prom Prom --> Graf Loki --> Graf PT --> Loki LF --> LFDB backend --> MLF backend --> LF ``` ### 核心原则 - **统一入口点** — 所有请求均通过 Nginx(端口 80) - **网络隔离** — 内部网络 `internal` 和用于与 LiteLLM 通信的共享网络 `llm-shared` - **插件化架构** — 通过注册表添加提供商和 Agent - **透明监控** — 每个请求在所有层级均被追踪 ## 🐳 Docker 容器 ### 主平台 (`docker-compose.yml`) | 容器 | 描述 | 端口 | 镜像 / 技术 | |---|---|---|---| | `backend` | 主平台 (FastAPI) | 8000 (内部,通过 nginx 暴露于 80) | Python / FastAPI | | `nginx` | Reverse proxy,针对流式传输优化 | **80** (外部) | Nginx | | `redis_cache` | 响应缓存 | 6379 (内部) | Redis Alpine | | `summarizer-agent` | 内置 A2A Agent:文本摘要 | 8001 (内部) | Python / FastAPI | | `code-reviewer-agent` | 内置 A2A Agent:代码审查 | 8002 (内部) | Python / FastAPI | | `prometheus` | 收集指标 | **9090** | Prometheus | | `grafana` | Dashboard 和可视化 | **3001** (admin/admin) | Grafana | | `langfuse` | LLM 调用 tracing | **3000** | Langfuse | | `langfuse-db` | Langfuse 的数据库 | 5432 (内部) | PostgreSQL 15 | | `mlflow` | 实验追踪 | **5001** | MLFlow | | `loki` | 日志聚合 | **3100** | Grafana Loki | | `promtail` | 日志收集器 (Docker 自动发现) | — | Grafana Promtail | ### LiteLLM Gateway (`llm-gateway-litellm/docker-compose.yml`) — 独立部署 | 容器 | 描述 | 端口 | |---|---|---| | `litellm` | LLM Gateway — 代理至 LLM | **4000** | | `litellm-db` | LiteLLM 的数据库 | 5432 (内部) | ### Docker 网络 | 网络 | 类型 | 用途 | |---|---|---| | `internal` | bridge | 平台容器的内部通信 | | `llm-shared` | external | 平台与 LiteLLM Gateway 之间的通信 | ## ⚡ 快速开始 ### 前置要求 - [Docker](https://docs.docker.com/get-docker/) ≥ 20.10 - [Docker Compose](https://docs.docker.com/compose/install/) ≥ 2.0 - (用于测试) [Poetry](https://python-poetry.org/docs/#installation) ### 步骤 1. 克隆并配置环境 ``` git clone cd HW_agent_platform cp .env.example .env ``` ### 步骤 2. 创建共享的 Docker 网络 ``` docker network create llm-shared ``` ### 步骤 3. 配置 `.env` 打开 `.env` 文件并指定必要的参数: ``` # LiteLLM Gateway LITELLM_BASE_URL=http://litellm:4000 LITELLM_API_KEY=sk-your-litellm-key LITELLM_MODEL=gpt-4 # значение по умолчанию в коде — local-llm; здесь можно переопределить # Langfuse(可选) LANGFUSE_ENABLED=true LANGFUSE_PUBLIC_KEY=pk-lf-... LANGFUSE_SECRET_KEY=sk-lf-... LANGFUSE_HOST=http://langfuse:3000 ``` ### 步骤 4. 启动 LiteLLM Gateway ``` cd llm-gateway-litellm cp .env.example .env docker compose up -d cd .. ``` ### 步骤 5. 启动平台 ``` docker compose up -d --build ``` ### 步骤 6. 验证运行状态 ``` curl http://localhost:80/health ``` 预期响应: ``` { "status": "healthy", "version": "1.0.0" } ``` ### 步骤 7. 停止 ``` # 停止主平台 docker compose down # 停止 LiteLLM Gateway cd llm-gateway-litellm && docker compose down ``` ## 🌐 Web 界面 平台启动后,可访问以下界面: | 界面 | URL | 描述 | |---|---|---| | **Swagger UI** | [http://localhost:80/docs](http://localhost:80/docs) | 交互式 API 文档 | | **ReDoc** | [http://localhost:80/redoc](http://localhost:80/redoc) | 替代版 API 文档 | | **Grafana** | [http://localhost:3001](http://localhost:3001) | 指标的 dashboard 和可视化 (用户名: `admin` / 密码: `admin`) | | **Prometheus** | [http://localhost:9090](http://localhost:9090) | 指标查询 (PromQL) | | **MLFlow** | [http://localhost:5001](http://localhost:5001) | 实验和模型追踪 | | **Langfuse** | [http://localhost:3000](http://localhost:3000) | LLM 调用 tracing,prompt 分析 | | **Loki** | [http://localhost:3100](http://localhost:3100) | 日志聚合 API (通过 Grafana 使用) | ### Grafana Dashboard Grafana 中预装了 3 个 dashboard: | Dashboard | 显示内容 | |---|---| | **LLM Monitoring** | p50/p95 延迟、各提供商的流量分布、Time To First Token (TTFT) | | **Traffic Distribution** | 各提供商的请求分布 (环形图)、RPS (每秒请求数) | | **System Overview** | CPU、内存、HTTP 请求、Time Per Output Token (TPOT) | ### 实用 PromQL 查询 ``` # 5分钟内 LLM 平均 Latency rate(llm_request_latency_seconds_sum[5m]) / rate(llm_request_latency_seconds_count[5m]) # 各 Provider 的 Latency 第95百分位 histogram_quantile(0.95, sum(rate(llm_request_latency_seconds_bucket[5m])) by (le, provider)) # 各 Provider 的 Request 数量 (RPS) sum(rate(llm_requests_total[1m])) by (provider) # Error 率(错误占总 Request 数的比例) sum(rate(llm_requests_total{status="error"}[5m])) / sum(rate(llm_requests_total[5m])) ``` ## ⚙️ 配置 所有参数均通过 `.env` 文件中的环境变量进行设置。 ### 应用 | 变量 | 描述 | 默认值 | |---|---|---| | `APP_NAME` | 应用名称 | `Agent Platform` | | `APP_VERSION` | 应用版本 | `1.0.0` | | `BACKEND_PORT` | backend 内部端口 | `8000` | | `ENVIRONMENT` | 环境 (`local` / `staging` / `production`) | `local` | ### LiteLLM Gateway | 变量 | 描述 | 默认值 | |---|---|---| | `LITELLM_BASE_URL` | LiteLLM 网关 URL | `http://localhost:4000` | | `LITELLM_API_KEY` | LiteLLM 的 API 密钥 | — | | `LITELLM_MODEL` | 默认 LLM 模型 | `local-llm` | | `LITELLM_TIMEOUT` | 请求超时时间 (秒) | `120` | | `LITELLM_MAX_RETRIES` | 最大重试次数 | `3` | ### Redis | 变量 | 描述 | 默认值 | |---|---|---| | `REDIS_CACHE_HOST` | Redis 主机 | `localhost` | | `REDIS_CACHE_PORT` | Redis 端口 | `6379` | ### Langfuse | 变量 | 描述 | 默认值 | |---|---|---| | `LANGFUSE_ENABLED` | 启用 Langfuse tracing | `true` | | `LANGFUSE_PUBLIC_KEY` | Langfuse 公钥 | — | | `LANGFUSE_SECRET_KEY` | Langfuse 密钥 | — | | `LANGFUSE_HOST` | Langfuse URL | `http://localhost:3000` | ### MLFlow | 变量 | 描述 | 默认值 | |---|---|---| | `MLFLOW_ENABLED` | 启用 MLFlow 追踪 | `true` | | `MLFLOW_TRACKING_URI` | MLFlow 服务器 URI | `http://localhost:5000` | | `MLFLOW_EXPERIMENT_NAME` | 实验名称 | `agent-platform` | ### 授权 | 变量 | 描述 | 默认值 | |---|---|---| | `AUTH_ENABLED` | 启用身份验证 | `false` | | `AUTH_SECRET_KEY` | 用于 HMAC-SHA256 的密钥 | — | | `AUTH_TOKEN_EXPIRE_SECONDS` | Token 有效期 (秒) | `3600` | | `AUTH_ADMIN_CLIENT_ID` | 管理员的 Client ID | `admin` | | `AUTH_ADMIN_CLIENT_SECRET` | 管理员的 Client Secret | — | ### Guardrails | 变量 | 描述 | 默认值 | |---|---|---| | `GUARDRAILS_ENABLED` | 启用防护过滤 | `true` | | `GUARDRAILS_MAX_INPUT_LENGTH` | 最大输入长度 (字符数) | `50000` | ### 监控 | 变量 | 描述 | 默认值 | |---|---|---| | `PROMETHEUS_PORT_EXTERNAL` | Prometheus 外部端口 | `9090` | | `GRAFANA_PORT_EXTERNAL` | Grafana 外部端口 | `3001` | | `GRAFANA_ADMIN_USER` | Grafana 管理员用户名 | `admin` | | `GRAFANA_ADMIN_PASSWORD` | Grafana 管理员密码 | `admin` | ## 📖 使用示例 ### Health Check ``` curl http://localhost:80/health ``` ### 获取提供商列表 ``` curl http://localhost:80/api/v1/providers/ ``` ### 获取授权 Token ``` curl -X POST http://localhost:80/api/v1/auth/token \ -H "Content-Type: application/json" \ -d '{ "client_id": "admin", "client_secret": "your-secret" }' ``` 响应: ``` { "access_token": "eyJ...", "token_type": "bearer", "expires_in": 3600 } ``` ### Chat Completion (普通请求) ``` curl -X POST http://localhost:80/api/v1/llm/chat/completions \ -H "Content-Type: application/json" \ -H "Authorization: Bearer " \ -d '{ "messages": [ {"role": "system", "content": "Ты полезный ассистент."}, {"role": "user", "content": "Объясни, что такое Docker."} ], "model": "gpt-4", "temperature": 0.7, "max_tokens": 500, "stream": false }' ``` 响应: ``` { "content": "Docker — это платформа контейнеризации...", "model": "gpt-4", "provider": "openai-gpt4", "usage": { "prompt_tokens": 25, "completion_tokens": 150, "total_tokens": 175 }, "latency_ms": 1234.5, "ttft_ms": 89.2 } ``` ### Chat Completion (通过 SSE 流式传输) ``` curl -X POST "http://localhost:80/api/v1/llm/chat/completions" \ -H "Content-Type: application/json" \ -H "Authorization: Bearer " \ -d '{ "messages": [ {"role": "user", "content": "Напиши стихотворение о программировании."} ], "model": "gpt-4", "stream": true }' ``` 响应 — SSE 事件流: ``` data: {"content": "В ", "done": false} data: {"content": "мире ", "done": false} data: {"content": "кода ", "done": false} ... data: {"content": "", "done": true} ``` ### 选择负载均衡策略 ``` # Round Robin curl -X POST "http://localhost:80/api/v1/llm/chat/completions?strategy=round_robin" \ -H "Content-Type: application/json" \ -d '{"messages": [{"role": "user", "content": "Привет!"}]}' # Weighted Round Robin curl -X POST "http://localhost:80/api/v1/llm/chat/completions?strategy=weighted_round_robin" \ -H "Content-Type: application/json" \ -d '{"messages": [{"role": "user", "content": "Привет!"}]}' # Latency-Based curl -X POST "http://localhost:80/api/v1/llm/chat/completions?strategy=latency_based" \ -H "Content-Type: application/json" \ -d '{"messages": [{"role": "user", "content": "Привет!"}]}' # Health-Aware(默认) curl -X POST "http://localhost:80/api/v1/llm/chat/completions?strategy=health_aware" \ -H "Content-Type: application/json" \ -d '{"messages": [{"role": "user", "content": "Привет!"}]}' ``` ### 注册提供商 ``` curl -X POST http://localhost:80/api/v1/providers/ \ -H "Content-Type: application/json" \ -H "Authorization: Bearer " \ -d '{ "name": "custom-provider", "display_name": "Custom LLM Provider", "model_name": "custom-model", "url": "http://custom-llm:8080", "price_per_input_token": 0.00003, "price_per_output_token": 0.00006, "max_rpm": 100, "max_tokens_limit": 4096, "priority": 1, "weight": 10, "enabled": true }' ``` ### 注册 Agent ``` curl -X POST http://localhost:80/api/v1/agents/ \ -H "Content-Type: application/json" \ -H "Authorization: Bearer " \ -d '{ "name": "my-agent", "description": "Мой пользовательский агент", "methods": ["summarize", "analyze"], "url": "http://my-agent:9000", "version": "1.0.0", "tags": ["custom", "nlp"] }' ``` ### 调用 Agent ``` # 调用内置的 Summarizer Agent curl -X POST http://localhost:80/api/v1/agents/summarizer/invoke \ -H "Content-Type: application/json" \ -H "Authorization: Bearer " \ -d '{ "input_text": "Длинный текст для суммаризации...", "parameters": {} }' # 调用内置的 Code Reviewer Agent curl -X POST http://localhost:80/api/v1/agents/code-reviewer/invoke \ -H "Content-Type: application/json" \ -H "Authorization: Bearer " \ -d '{ "input_text": "def hello():\n print(\"world\")", "parameters": { "language": "python" } }' ``` Code Reviewer 响应: ``` { "agent_name": "code-reviewer", "result": "Код выглядит корректно. Рекомендации: ...", "model_used": "gpt-4", "provider_used": "openai-gpt4", "metadata": { "code_length": 32, "language": "python" } } ``` ### 更新 Agent ``` curl -X PUT http://localhost:80/api/v1/agents/my-agent \ -H "Content-Type: application/json" \ -H "Authorization: Bearer " \ -d '{ "description": "Обновлённое описание", "methods": ["summarize", "analyze", "translate"], "version": "1.1.0", "tags": ["custom", "nlp", "translation"] }' ``` ### 删除 Agent ``` curl -X DELETE http://localhost:80/api/v1/agents/my-agent \ -H "Authorization: Bearer " ``` ### 获取负载均衡策略列表 ``` curl http://localhost:80/api/v1/llm/strategies ``` 响应: ``` { "strategies": ["round_robin", "weighted_round_robin", "latency_based", "health_aware"], "default": "health_aware" } ``` ## ⚖️ 负载均衡策略 平台支持 4 种在 LLM 提供商之间分配请求的策略。 ### 对比表 | 策略 | 分配方式 | 考虑延迟 | 考虑健康状态 | 复杂度 | 最适合的场景 | |---|---|---|---|---|---| | **Round Robin** | 均匀分配 | ❌ | ❌ | O(1) | 开发/测试,同质化的提供商 | | **Weighted Round Robin** | 按权重 | ❌ | ❌ | O(W) | 力不同的提供商 | | **Latency-Based** | 按延迟 | ✅ | ❌ | O(N) | 速度优化 | | **Health-Aware** | 延迟 + 健康状态 | ✅ | ✅ | O(N) | 生产环境,容错性 | ### Round Robin 最简单的策略 — 请求按轮询方式均匀分配给所有可用的提供商。每个提供商收到相同数量的请求。 ``` Запрос 1 → Provider A Запрос 2 → Provider B Запрос 3 → Provider C Запрос 4 → Provider A (начинаем сначала) ``` ### Weighted Round Robin 为每个提供商分配一个权重 (weight)。权重越大,路由到该提供商的请求就越多。适用于提供商具有不同吞吐量的情况。 ``` Provider A (weight=5): ■■■■■ Provider B (weight=3): ■■■ Provider C (weight=2): ■■ ``` ### Latency-Based 将请求路由到平均延迟最低的提供商。系统会不断更新统计数据并适应当前的性能表现。 ``` Provider A (avg 120ms) ← выбран Provider B (avg 250ms) Provider C (avg 180ms) ``` ### Health-Aware (默认) 结合了延迟和提供商健康状态的考量。自动排除不健康的提供商,并将流量导向最快且最稳定的提供商。**推荐用于生产环境。** ``` Provider A (healthy, avg 120ms) ← выбран Provider B (unhealthy) ← исключён Provider C (healthy, avg 180ms) ``` ### 建议 - **开发和测试** → Round Robin (简单、可预测) - **算力不同的提供商** → Weighted Round Robin (灵活分配) - **速度优化** → Latency-Based (最小延迟) - **生产环境** → Health-Aware (容错性 + 速度) ## 🧪 测试 ### 单元测试 运行所有单元测试: ``` poetry run pytest tests/ -v ``` | 文件 | 测试数量 | 测试内容 | |---|---|---| | `test_balancer.py` | 8 | 全部 4 种负载均衡策略、提供商选择、fallback | | `test_guardrails.py` | 9 | 检测 prompt injection (12 种模式)、机密泄露 (9 种模式)、长度控制 | | `test_auth.py` | 7 | Token 生成和验证、HMAC-SHA256、TTL、scopes、客户端重复 | | `test_agents_registry.py` | 40 | Agent 注册表的全面 CRUD 测试:注册、删除、更新、按 tag/method 搜索、过滤、生命周期 | | `test_providers_registry.py` | 32 | 提供商注册表的全面 CRUD 测试:注册、删除、更新、按模型过滤、健康状态追踪、滑动窗口延迟 | ### 集成测试 运行集成测试 (需要已启动的平台): ``` poetry run pytest tests/integration/ -v ``` | 文件 | 测试内容 | |---|---| | `test_health_api.py` | Health-check 端点 | | `test_auth_api.py` | 通过 API 进行身份验证 | | `test_providers_api.py` | 通过 API 进行提供商的 CRUD | | `test_agents_api.py` | 通过 API 进行 Agent 的 CRUD 和调用 | | `test_llm_api.py` | Chat Completions (普通请求与流式传输) | | `test_metrics_api.py` | Prometheus 指标 | | `test_full_flow.py` | 完整场景:授权 → 请求 → 监控 | ### 压力测试 #### Locust (交互式 UI) ``` locust -f tests/locustfile.py --host=http://localhost:80 ``` 启动后,打开 [http://localhost:8089](http://localhost:8089) 访问 Locust Web 界面。 #### 编程式压力测试 ``` poetry run pytest tests/test_load.py -v ``` ### 代码覆盖率 ``` poetry run pytest tests/ -v --cov=src --cov-report=html ``` 报告将生成在 `htmlcov/` 目录中。在浏览器中打开 `htmlcov/index.html` 查看。 ## 📚 文档 项目中准备了详尽的文档,按复杂度级别划分: | 文档 | 描述 | |---|---| | [`README.md`](README.md) | 项目概述、功能、快速开始、使用示例、配置 | | [`README.dev.md`](README.dev.md) | 开发者指南:本地开发快速开始、运行测试、环境配置 | | [`DOC.md`](DOC.md) | 技术文档:所有 API 端点 (包含 JSON 示例)、平台模块、集成 (LiteLLM、Langfuse、MLFlow、Prometheus、Grafana、Loki、Redis)、访问权限、指标参考、测试说明 | | [`docs/level1.md`](docs/level1.md) | **级别 1** — 最小化原型 (10 分):架构图、提供商和负载均衡器 API、启动说明、测试报告、Round Robin 与 Weighted Round Robin 的对比 | | [`docs/level2.md`](docs/level2.md) | **级别 2** — 注册表与智能路由 (20 分):Agent 注册表、动态提供商注册、Latency-Based 与 Health-Aware 策略、MLFlow/Langfuse、高级指标 (TTFT、TPOT、token、成本) | | [`docs/level3.md`](docs/level3.md) | **级别 3** — 高级平台 (25 分):Guardrails (prompt injection、机密泄露)、token 授权、压力测试 (Locust)、负载均衡器稳定性报告 | | [`docs/TASK.md`](docs/TASK.md) | 初始技术规范 | | [`docs/screenshots.md`](docs/screenshots.md) | 平台运行演示:所有组件的 UI 截图 (Swagger、Grafana、Prometheus、MLFlow、Langfuse、Loki、Locust) | ## 📁 项目结构 ``` HW_agent_platform/ ├── docker-compose.yml # Docker Compose основной платформы ├── Dockerfile # Образ backend-сервиса ├── default.conf # Конфигурация Nginx (оптимизирована для SSE) ├── pyproject.toml # Зависимости Python (Poetry) ├── .env.example # Пример переменных окружения ├── README.md # Документация (этот файл) ├── README.dev.md # Руководство разработчика │ ├── assets/ # Скриншоты UI компонентов платформы │ ├── src/app/ # Исходный код backend │ ├── main.py # Точка входа FastAPI-приложения │ ├── api/ # API-эндпоинты │ │ ├── health.py # Health-check │ │ ├── metrics.py # Prometheus-метрики │ │ ├── auth.py # Аутентификация │ │ ├── llm.py # Chat Completions │ │ ├── providers.py # Реестр провайдеров │ │ └── agents.py # Реестр агентов │ ├── core/ # Ядро приложения │ │ ├── config.py # Конфигурация (Pydantic Settings) │ │ ├── setup.py # Инициализация приложения │ │ ├── logger_setup.py # Настройка логирования │ │ └── exceptions/ # Кастомные исключения │ │ ├── base_exceptions.py # Базовые исключения платформы │ │ └── cache_exceptions.py # Исключения кэширования │ ├── providers/ # LLM-провайдеры │ │ ├── base.py # Базовый класс провайдера │ │ └── registry.py # Реестр провайдеров │ ├── balancer/ # Балансировщик нагрузки │ │ ├── strategies.py # 4 стратегии балансировки │ │ └── manager.py # Менеджер балансировки │ ├── agents/ # A2A-агенты │ │ └── registry.py # Реестр агентов │ ├── auth/ # Авторизация │ │ └── service.py # HMAC-SHA256 token service │ ├── guardrails/ # Защитные механизмы │ │ └── filter.py # Prompt injection, secret leak detection │ ├── observability/ # Стек наблюдаемости │ │ ├── langfuse_client.py # Клиент Langfuse │ │ ├── mlflow_client.py # Клиент MLFlow │ │ ├── otel_setup.py # Настройка OpenTelemetry │ │ └── metrics.py # Prometheus-метрики │ ├── middleware/ # Middleware │ │ ├── auth_middleware.py # Проверка авторизации │ │ ├── metrics_middleware.py # Сбор HTTP-метрик │ │ └── client_cache_middleware.py # Кэширование (Cache-Control) │ ├── schemas/ # Pydantic-схемы │ │ ├── llm.py # Схемы LLM-запросов/ответов │ │ ├── agent.py # Схемы агентов │ │ ├── auth.py # Схемы авторизации │ │ ├── guardrails.py # Схемы guardrails │ │ ├── health.py # Схемы health-check │ │ └── environment.py # Схемы окружения │ └── utils/ # Утилиты │ ├── cache.py # Работа с Redis-кэшем │ └── async_helpers.py # Асинхронные хелперы │ ├── agents/ # Встроенные A2A-агенты │ ├── common/ # Общий код агентов │ │ ├── config.py # Конфигурация │ │ ├── schemas.py # Общие схемы │ │ ├── llm_client.py # Клиент для обращения к LLM │ │ ├── registration.py # Авторегистрация в реестре │ │ └── exceptions.py # Исключения │ ├── summarizer/ # Агент суммаризации │ │ ├── main.py # FastAPI-приложение (порт 8001) │ │ └── service.py # Логика суммаризации │ └── code_reviewer/ # Агент код-ревью │ ├── main.py # FastAPI-приложение (порт 8002) │ └── service.py # Логика ревью кода │ ├── monitoring/ # Конфигурация мониторинга │ ├── prometheus/ │ │ └── prometheus.yml # Конфигурация Prometheus │ ├── grafana/ │ │ ├── dashboards/ # 3 JSON-дашборда │ │ └── provisioning/ # Автопровижининг источников и дашбордов │ ├── loki/ │ │ └── loki-config.yml # Конфигурация Loki │ └── promtail/ │ └── promtail-config.yml # Конфигурация Promtail (Docker discovery) │ ├── tests/ # Тесты │ ├── test_balancer.py # Юнит-тесты балансировщика │ ├── test_guardrails.py # Юнит-тесты guardrails │ ├── test_auth.py # Юнит-тесты авторизации │ ├── test_agents_registry.py # Юнит-тесты реестра агентов │ ├── test_providers_registry.py # Юнит-тесты реестра провайдеров │ ├── test_load.py # Программный нагрузочный тест │ ├── locustfile.py # Сценарий нагрузочного тестирования (Locust) │ └── integration/ # Интеграционные тесты │ ├── test_health_api.py │ ├── test_auth_api.py │ ├── test_providers_api.py │ ├── test_agents_api.py │ ├── test_llm_api.py │ ├── test_metrics_api.py │ └── test_full_flow.py │ └── llm-gateway-litellm/ # LiteLLM Gateway (отдельный деплой) ├── docker-compose.yml ├── config.yaml └── .env.example ``` ## 📄 许可证 本项目基于 [Creative Commons Attribution-ShareAlike 4.0 International (CC BY-SA 4.0)](LICENSE.md) 许可证发布。
标签:A2A协议, AI智能体, API集成, LLM网关, 可观测性, 平台架构, 负载均衡