@starlink-awaken/agentmesh 1.0.2 → 1.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +60 -41
- package/README.zh-CN.md +137 -167
- package/config/gateway.yaml +78 -0
- package/dist/src/adapters/base.d.ts +22 -0
- package/dist/src/adapters/base.js +10 -0
- package/dist/src/adapters/claude-code.d.ts +22 -0
- package/dist/src/adapters/claude-code.js +112 -0
- package/dist/src/adapters/openclaw.d.ts +22 -0
- package/dist/src/adapters/openclaw.js +110 -0
- package/dist/src/adapters/process.d.ts +28 -0
- package/dist/src/adapters/process.js +121 -0
- package/dist/src/cli/connect.d.ts +26 -0
- package/dist/src/cli/connect.js +544 -0
- package/dist/src/cli/setup.d.ts +2 -0
- package/dist/src/cli/setup.js +97 -0
- package/dist/src/cli.d.ts +2 -0
- package/dist/src/cli.js +410 -0
- package/dist/src/core/agent-registry.d.ts +48 -0
- package/dist/src/core/agent-registry.js +295 -0
- package/dist/src/core/config.d.ts +59 -0
- package/dist/src/core/config.js +101 -0
- package/dist/src/core/context-manager.d.ts +52 -0
- package/dist/src/core/context-manager.js +165 -0
- package/dist/src/core/event-bus.d.ts +35 -0
- package/dist/src/core/event-bus.js +62 -0
- package/dist/src/core/logger.d.ts +14 -0
- package/dist/src/core/logger.js +57 -0
- package/dist/src/core/metrics.d.ts +87 -0
- package/dist/src/core/metrics.js +167 -0
- package/dist/src/core/router.d.ts +46 -0
- package/dist/src/core/router.js +90 -0
- package/dist/src/core/task-manager.d.ts +41 -0
- package/dist/src/core/task-manager.js +197 -0
- package/dist/src/core/vector-store.d.ts +37 -0
- package/dist/src/core/vector-store.js +175 -0
- package/dist/src/index.d.ts +1 -0
- package/dist/src/index.js +105 -0
- package/dist/src/model-gateway/circuit-breaker.d.ts +21 -0
- package/dist/src/model-gateway/circuit-breaker.js +86 -0
- package/dist/src/model-gateway/health.d.ts +12 -0
- package/dist/src/model-gateway/health.js +80 -0
- package/dist/src/model-gateway/providers.d.ts +4 -0
- package/dist/src/model-gateway/providers.js +113 -0
- package/dist/src/model-gateway/quota.d.ts +4 -0
- package/dist/src/model-gateway/quota.js +107 -0
- package/dist/src/model-gateway/rate-limit.d.ts +12 -0
- package/dist/src/model-gateway/rate-limit.js +51 -0
- package/dist/src/model-gateway/retry.d.ts +14 -0
- package/dist/src/model-gateway/retry.js +48 -0
- package/dist/src/model-gateway/router.d.ts +4 -0
- package/dist/src/model-gateway/router.js +79 -0
- package/dist/src/model-gateway/routes.d.ts +2 -0
- package/dist/src/model-gateway/routes.js +172 -0
- package/dist/src/model-gateway/types.d.ts +47 -0
- package/dist/src/model-gateway/types.js +1 -0
- package/dist/src/routes/api.d.ts +2 -0
- package/dist/src/routes/api.js +128 -0
- package/dist/src/routes/websocket.d.ts +2 -0
- package/dist/src/routes/websocket.js +64 -0
- package/dist/src/types/index.d.ts +71 -0
- package/dist/src/types/index.js +1 -0
- package/dist/tests/core/context-manager.test.d.ts +1 -0
- package/dist/tests/core/context-manager.test.js +35 -0
- package/dist/tests/core/router.test.d.ts +1 -0
- package/dist/tests/core/router.test.js +79 -0
- package/dist/tests/model-gateway/circuit-breaker.test.d.ts +1 -0
- package/dist/tests/model-gateway/circuit-breaker.test.js +84 -0
- package/dist/tests/model-gateway/providers.test.d.ts +1 -0
- package/dist/tests/model-gateway/providers.test.js +80 -0
- package/dist/tests/model-gateway/quota.test.d.ts +1 -0
- package/dist/tests/model-gateway/quota.test.js +60 -0
- package/dist/tests/model-gateway/rate-limit.test.d.ts +1 -0
- package/dist/tests/model-gateway/rate-limit.test.js +42 -0
- package/dist/tests/model-gateway/retry.test.d.ts +1 -0
- package/dist/tests/model-gateway/retry.test.js +47 -0
- package/dist/tests/model-gateway/router.test.d.ts +1 -0
- package/dist/tests/model-gateway/router.test.js +108 -0
- package/dist/tests/model-gateway/routes.test.d.ts +1 -0
- package/dist/tests/model-gateway/routes.test.js +83 -0
- package/docs/api.md +187 -460
- package/docs/architecture.md +138 -0
- package/docs/configuration.md +188 -0
- package/package.json +3 -1
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
# Architecture
|
|
2
|
+
|
|
3
|
+
## System Overview
|
|
4
|
+
|
|
5
|
+
```
|
|
6
|
+
┌──────────────────────────────────────────────────────────┐
|
|
7
|
+
│ Tool Consumers │
|
|
8
|
+
│ Codex Desktop Claude Code Gemini CLI Other Tools │
|
|
9
|
+
└────────────┬─────────────────────────────────────────────┘
|
|
10
|
+
│ /v1/chat/completions /v1/responses
|
|
11
|
+
▼
|
|
12
|
+
┌──────────────────────────────────────────────────────────┐
|
|
13
|
+
│ Agent Mesh Gateway :3000 │
|
|
14
|
+
│ │
|
|
15
|
+
│ ┌──────────────────┐ ┌──────────────────────┐ │
|
|
16
|
+
│ │ Model Gateway │ │ Agent Orchestrator │ │
|
|
17
|
+
│ │ ┌──────────────┐ │ │ ┌──────────────────┐ │ │
|
|
18
|
+
│ │ │ Quota Probe │ │ │ │ Agent Registry │ │ │
|
|
19
|
+
│ │ │ (codexbar) │ │ │ │ (25+ adapters) │ │ │
|
|
20
|
+
│ │ └──────┬───────┘ │ │ └────────┬─────────┘ │ │
|
|
21
|
+
│ │ │ │ │ │ │ │
|
|
22
|
+
│ │ ┌──────┴───────┐ │ │ ┌────────┴─────────┐ │ │
|
|
23
|
+
│ │ │ Model Router │ │ │ │ Task Router │ │ │
|
|
24
|
+
│ │ │ (fallback) │ │ │ │ (keyword match) │ │ │
|
|
25
|
+
│ │ └──────┬───────┘ │ │ └────────┬─────────┘ │ │
|
|
26
|
+
│ │ │ │ │ │ │ │
|
|
27
|
+
│ │ ┌──────┴───────┐ │ │ ┌────────┴─────────┐ │ │
|
|
28
|
+
│ │ │Provider Client│ │ │ │ Event Bus │ │ │
|
|
29
|
+
│ │ │(HTTP Stream) │ │ │ │ (Pub/Sub) │ │ │
|
|
30
|
+
│ │ └──────────────┘ │ │ └──────────────────┘ │ │
|
|
31
|
+
│ └──────────────────┘ └──────────────────────┘ │
|
|
32
|
+
│ │
|
|
33
|
+
│ ┌──────────────────────────────────────────────────┐ │
|
|
34
|
+
│ │ Context Manager │ │
|
|
35
|
+
│ │ Shared Spaces File Cache Vector Store (ChromaDB)│ │
|
|
36
|
+
│ └──────────────────────────────────────────────────┘ │
|
|
37
|
+
└──────────┬───────────────────────────────────────────────┘
|
|
38
|
+
│
|
|
39
|
+
┌──────┼──────┬──────────┐
|
|
40
|
+
▼ ▼ ▼ ▼
|
|
41
|
+
DeepSeek OpenAI OpenRouter Ollama
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
## Model Gateway Layer
|
|
45
|
+
|
|
46
|
+
### Quota Probe (`quota.ts`)
|
|
47
|
+
- Calls `codexbar usage --format json --provider all`
|
|
48
|
+
- Caches results for 60 seconds
|
|
49
|
+
- Parses provider-specific quota formats:
|
|
50
|
+
- codex: credits.remaining
|
|
51
|
+
- deepseek: balance in ¥ (from resetDescription)
|
|
52
|
+
- openrouter: openRouterUsage.balance
|
|
53
|
+
- ollama: always available
|
|
54
|
+
|
|
55
|
+
### Model Router (`router.ts`)
|
|
56
|
+
- `resolveProvider(model)`: determines which provider to use
|
|
57
|
+
- Priority: model_routing config → fallback_chain → first available
|
|
58
|
+
- Checks quota availability via `isProviderAvailable()`
|
|
59
|
+
- Checks API key availability via env vars or config
|
|
60
|
+
|
|
61
|
+
### Provider Client (`providers.ts`)
|
|
62
|
+
- `callChatCompletions()`: unified OpenAI-compatible client
|
|
63
|
+
- `callResponsesApi()`: converts Responses API → Chat Completions
|
|
64
|
+
- Extracts messages from `input` array
|
|
65
|
+
- Maps `input_text`/`output_text` content types
|
|
66
|
+
- Preserves tool definitions
|
|
67
|
+
|
|
68
|
+
### Routes (`routes.ts`)
|
|
69
|
+
- `GET /v1/models`: aggregated model list
|
|
70
|
+
- `POST /v1/chat/completions`: proxy with streaming support
|
|
71
|
+
- `POST /v1/responses`: Codex Desktop adapter
|
|
72
|
+
- `GET /model-gateway/health`: quota-aware health check
|
|
73
|
+
- `GET /model-gateway/quota`: full quota details
|
|
74
|
+
|
|
75
|
+
## Agent Orchestration Layer
|
|
76
|
+
|
|
77
|
+
### Agent Registry
|
|
78
|
+
- Manages 25+ agent adapters
|
|
79
|
+
- Capability-based agent discovery
|
|
80
|
+
- Health check monitoring
|
|
81
|
+
|
|
82
|
+
### Task Router
|
|
83
|
+
- Keyword-based task-to-agent routing
|
|
84
|
+
- Priority-based rule matching
|
|
85
|
+
- Broadcast support for multi-agent tasks
|
|
86
|
+
|
|
87
|
+
### Context Manager
|
|
88
|
+
- Shared spaces with file persistence
|
|
89
|
+
- Message history per space
|
|
90
|
+
- Artifact storage
|
|
91
|
+
|
|
92
|
+
## Data Flow
|
|
93
|
+
|
|
94
|
+
### Chat Completions Flow
|
|
95
|
+
```
|
|
96
|
+
1. Client → POST /v1/chat/completions { model, messages }
|
|
97
|
+
2. Router: parse model → check routing config → check quota → select provider
|
|
98
|
+
3. Provider Client: POST to provider API with streaming
|
|
99
|
+
4. Response: SSE stream or JSON → Client
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
### Codex Desktop Flow
|
|
103
|
+
```
|
|
104
|
+
1. Codex Desktop → POST /v1/responses { input: [...], model }
|
|
105
|
+
2. Adapter: convert input items → messages array
|
|
106
|
+
3. Router: resolve provider (same as chat completions)
|
|
107
|
+
4. Provider Client: POST /v1/chat/completions to provider
|
|
108
|
+
5. Adapter: convert chat response → responses format (output items)
|
|
109
|
+
6. Response → Codex Desktop
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
### Quota Refresh Flow
|
|
113
|
+
```
|
|
114
|
+
1. First API call triggers quota probe
|
|
115
|
+
2. codexbar subprocess runs (~10-30s)
|
|
116
|
+
3. Results parsed and cached (60s TTL)
|
|
117
|
+
4. Router uses cached data for decisions
|
|
118
|
+
5. After 60s, next request triggers refresh
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
## Technology Stack
|
|
122
|
+
|
|
123
|
+
- **Runtime**: Bun (>=1.0.0)
|
|
124
|
+
- **Server**: Fastify 5
|
|
125
|
+
- **HTTP Client**: Native Fetch API
|
|
126
|
+
- **Streaming**: Server-Sent Events (SSE)
|
|
127
|
+
- **WebSocket**: Fastify WebSocket plugin
|
|
128
|
+
- **Vector Store**: ChromaDB (optional)
|
|
129
|
+
- **Logging**: Custom structured logger + Pino
|
|
130
|
+
- **Config**: YAML
|
|
131
|
+
|
|
132
|
+
## Design Decisions
|
|
133
|
+
|
|
134
|
+
1. **All providers via OpenAI-compatible API**: Avoids per-provider client complexity
|
|
135
|
+
2. **Quota caching**: codexbar is slow, 60s cache prevents latency spikes
|
|
136
|
+
3. **Streaming passthrough**: Zero-copy SSE forwarding for efficiency
|
|
137
|
+
4. **No additional deps for model gateway**: Uses Bun's built-in Fetch API
|
|
138
|
+
5. **codexbar as quota source**: Already aggregates 30+ providers, no duplicate logic
|
|
@@ -0,0 +1,188 @@
|
|
|
1
|
+
# Configuration Guide
|
|
2
|
+
|
|
3
|
+
## Config File
|
|
4
|
+
|
|
5
|
+
Default location: `config/gateway.yaml`
|
|
6
|
+
|
|
7
|
+
## Full Configuration Reference
|
|
8
|
+
|
|
9
|
+
```yaml
|
|
10
|
+
# Server
|
|
11
|
+
port: 3000
|
|
12
|
+
wsPort: 3001
|
|
13
|
+
host: "0.0.0.0"
|
|
14
|
+
dataDir: "./data"
|
|
15
|
+
logDir: "./logs"
|
|
16
|
+
logLevel: "info" # debug | info | warn | error
|
|
17
|
+
|
|
18
|
+
# =============================================================================
|
|
19
|
+
# Model Gateway
|
|
20
|
+
# =============================================================================
|
|
21
|
+
models:
|
|
22
|
+
default_model: deepseek-chat
|
|
23
|
+
|
|
24
|
+
providers:
|
|
25
|
+
deepseek:
|
|
26
|
+
base_url: https://api.deepseek.com/v1
|
|
27
|
+
api_key_env: DEEPSEEK_API_KEY # 从环境变量读取
|
|
28
|
+
models:
|
|
29
|
+
- deepseek-chat
|
|
30
|
+
- deepseek-reasoner
|
|
31
|
+
- deepseek-v4-pro
|
|
32
|
+
- deepseek-v4-flash
|
|
33
|
+
|
|
34
|
+
openai:
|
|
35
|
+
base_url: https://api.openai.com/v1
|
|
36
|
+
api_key_env: OPENAI_API_KEY
|
|
37
|
+
models:
|
|
38
|
+
- gpt-5.1
|
|
39
|
+
- gpt-5.1-codex
|
|
40
|
+
- o4-mini
|
|
41
|
+
|
|
42
|
+
openrouter:
|
|
43
|
+
base_url: https://openrouter.ai/api/v1
|
|
44
|
+
api_key_env: OPENROUTER_API_KEY
|
|
45
|
+
|
|
46
|
+
ollama:
|
|
47
|
+
base_url: http://127.0.0.1:11434/v1
|
|
48
|
+
api_key: ollama # 直接指定 key
|
|
49
|
+
models:
|
|
50
|
+
- qwen3:14b
|
|
51
|
+
- codestral:22b
|
|
52
|
+
|
|
53
|
+
# Provider 优先级(从高到低)
|
|
54
|
+
fallback_chain:
|
|
55
|
+
- deepseek
|
|
56
|
+
- openrouter
|
|
57
|
+
- ollama
|
|
58
|
+
|
|
59
|
+
# 模型名匹配规则
|
|
60
|
+
model_routing:
|
|
61
|
+
"deepseek": # 匹配包含 "deepseek" 的模型名
|
|
62
|
+
- deepseek
|
|
63
|
+
"gpt-": # GPT 系列优先 openai,配额不够用 deepseek
|
|
64
|
+
- openai
|
|
65
|
+
- deepseek
|
|
66
|
+
"o1": # 推理模型
|
|
67
|
+
- openai
|
|
68
|
+
- deepseek
|
|
69
|
+
"claude": # Claude 通过 OpenRouter
|
|
70
|
+
- openrouter
|
|
71
|
+
|
|
72
|
+
# =============================================================================
|
|
73
|
+
# Agent Configuration
|
|
74
|
+
# =============================================================================
|
|
75
|
+
routing:
|
|
76
|
+
defaultAgent: "claude-code"
|
|
77
|
+
rules:
|
|
78
|
+
- name: code-generation
|
|
79
|
+
keywords: [write code, generate code, 写代码, 生成代码]
|
|
80
|
+
agent: claude-code
|
|
81
|
+
priority: 10
|
|
82
|
+
|
|
83
|
+
- name: code-review
|
|
84
|
+
keywords: [review, code review, 代码审查]
|
|
85
|
+
agent: claude-code
|
|
86
|
+
priority: 15
|
|
87
|
+
|
|
88
|
+
- name: browser-automation
|
|
89
|
+
keywords: [browser, scrape, 浏览器, 爬虫]
|
|
90
|
+
agent: openclaw
|
|
91
|
+
priority: 15
|
|
92
|
+
|
|
93
|
+
- name: multi-agent
|
|
94
|
+
keywords: [collaborate, team, 协作]
|
|
95
|
+
strategy: broadcast
|
|
96
|
+
agents: [claude-code, openclaw]
|
|
97
|
+
priority: 20
|
|
98
|
+
|
|
99
|
+
agents:
|
|
100
|
+
- id: claude-code
|
|
101
|
+
name: Claude Code
|
|
102
|
+
type: claude-code
|
|
103
|
+
capabilities: [code-generation, code-review, debugging, refactoring]
|
|
104
|
+
|
|
105
|
+
- id: openclaw
|
|
106
|
+
name: OpenClaw
|
|
107
|
+
type: openclaw
|
|
108
|
+
capabilities: [browser-automation, web-scraping, ui-testing]
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
## API Key Configuration
|
|
112
|
+
|
|
113
|
+
API Keys can be set in three ways:
|
|
114
|
+
|
|
115
|
+
### 1. `.env` file (recommended)
|
|
116
|
+
```
|
|
117
|
+
DEEPSEEK_API_KEY=sk-xxx
|
|
118
|
+
OPENAI_API_KEY=sk-xxx
|
|
119
|
+
OPENROUTER_API_KEY=sk-xxx
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
### 2. Environment variables
|
|
123
|
+
```bash
|
|
124
|
+
export DEEPSEEK_API_KEY=sk-xxx
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
### 3. Inline in config (ollama only)
|
|
128
|
+
```yaml
|
|
129
|
+
providers:
|
|
130
|
+
ollama:
|
|
131
|
+
api_key: ollama # local, no real key needed
|
|
132
|
+
```
|
|
133
|
+
|
|
134
|
+
### Key Resolution Order
|
|
135
|
+
1. Inline `api_key` in config
|
|
136
|
+
2. Environment variable via `api_key_env`
|
|
137
|
+
3. Not found → provider skipped
|
|
138
|
+
|
|
139
|
+
## Provider Configuration
|
|
140
|
+
|
|
141
|
+
### Adding a new provider
|
|
142
|
+
|
|
143
|
+
```yaml
|
|
144
|
+
models:
|
|
145
|
+
providers:
|
|
146
|
+
my-provider:
|
|
147
|
+
base_url: https://api.my-provider.com/v1
|
|
148
|
+
api_key_env: MY_PROVIDER_API_KEY
|
|
149
|
+
models: [my-model-v1, my-model-v2]
|
|
150
|
+
|
|
151
|
+
fallback_chain:
|
|
152
|
+
- deepseek
|
|
153
|
+
- my-provider # add to chain
|
|
154
|
+
- ollama
|
|
155
|
+
|
|
156
|
+
model_routing:
|
|
157
|
+
"my-model": # route by model name
|
|
158
|
+
- my-provider
|
|
159
|
+
```
|
|
160
|
+
|
|
161
|
+
### Provider Requirements
|
|
162
|
+
- Must implement OpenAI-compatible `/v1/chat/completions` endpoint
|
|
163
|
+
- Must support Bearer token authentication
|
|
164
|
+
- Optional: supports SSE streaming
|
|
165
|
+
|
|
166
|
+
## Adding a new Agent
|
|
167
|
+
|
|
168
|
+
```yaml
|
|
169
|
+
agents:
|
|
170
|
+
- id: my-agent
|
|
171
|
+
name: My Custom Agent
|
|
172
|
+
type: process
|
|
173
|
+
command: my-agent-cli
|
|
174
|
+
args: ["--interactive"]
|
|
175
|
+
capabilities:
|
|
176
|
+
- my-capability-1
|
|
177
|
+
- my-capability-2
|
|
178
|
+
```
|
|
179
|
+
|
|
180
|
+
## Logging
|
|
181
|
+
|
|
182
|
+
Logs are written to `logs/agentmesh-YYYY-MM-DD.log`.
|
|
183
|
+
|
|
184
|
+
Log levels:
|
|
185
|
+
- `debug` — verbose provider calls, routing decisions
|
|
186
|
+
- `info` — startup, quota refresh, provider selection
|
|
187
|
+
- `warn` — fallback triggered, quota probe failures
|
|
188
|
+
- `error` — provider errors, crashes
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@starlink-awaken/agentmesh",
|
|
3
|
-
"version": "1.0
|
|
3
|
+
"version": "1.2.0",
|
|
4
4
|
"description": "Unified Agent Gateway - Multi-Agent Scheduler and Router",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
@@ -25,6 +25,8 @@
|
|
|
25
25
|
"cli": "bun run src/cli.ts",
|
|
26
26
|
"build": "tsc",
|
|
27
27
|
"test": "bun test",
|
|
28
|
+
"typecheck": "tsc --noEmit",
|
|
29
|
+
"lint": "tsc --noEmit",
|
|
28
30
|
"prepublishOnly": "bun run build"
|
|
29
31
|
},
|
|
30
32
|
"engines": {
|