@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.
Files changed (83) hide show
  1. package/CHANGELOG.md +60 -41
  2. package/README.zh-CN.md +137 -167
  3. package/config/gateway.yaml +78 -0
  4. package/dist/src/adapters/base.d.ts +22 -0
  5. package/dist/src/adapters/base.js +10 -0
  6. package/dist/src/adapters/claude-code.d.ts +22 -0
  7. package/dist/src/adapters/claude-code.js +112 -0
  8. package/dist/src/adapters/openclaw.d.ts +22 -0
  9. package/dist/src/adapters/openclaw.js +110 -0
  10. package/dist/src/adapters/process.d.ts +28 -0
  11. package/dist/src/adapters/process.js +121 -0
  12. package/dist/src/cli/connect.d.ts +26 -0
  13. package/dist/src/cli/connect.js +544 -0
  14. package/dist/src/cli/setup.d.ts +2 -0
  15. package/dist/src/cli/setup.js +97 -0
  16. package/dist/src/cli.d.ts +2 -0
  17. package/dist/src/cli.js +410 -0
  18. package/dist/src/core/agent-registry.d.ts +48 -0
  19. package/dist/src/core/agent-registry.js +295 -0
  20. package/dist/src/core/config.d.ts +59 -0
  21. package/dist/src/core/config.js +101 -0
  22. package/dist/src/core/context-manager.d.ts +52 -0
  23. package/dist/src/core/context-manager.js +165 -0
  24. package/dist/src/core/event-bus.d.ts +35 -0
  25. package/dist/src/core/event-bus.js +62 -0
  26. package/dist/src/core/logger.d.ts +14 -0
  27. package/dist/src/core/logger.js +57 -0
  28. package/dist/src/core/metrics.d.ts +87 -0
  29. package/dist/src/core/metrics.js +167 -0
  30. package/dist/src/core/router.d.ts +46 -0
  31. package/dist/src/core/router.js +90 -0
  32. package/dist/src/core/task-manager.d.ts +41 -0
  33. package/dist/src/core/task-manager.js +197 -0
  34. package/dist/src/core/vector-store.d.ts +37 -0
  35. package/dist/src/core/vector-store.js +175 -0
  36. package/dist/src/index.d.ts +1 -0
  37. package/dist/src/index.js +105 -0
  38. package/dist/src/model-gateway/circuit-breaker.d.ts +21 -0
  39. package/dist/src/model-gateway/circuit-breaker.js +86 -0
  40. package/dist/src/model-gateway/health.d.ts +12 -0
  41. package/dist/src/model-gateway/health.js +80 -0
  42. package/dist/src/model-gateway/providers.d.ts +4 -0
  43. package/dist/src/model-gateway/providers.js +113 -0
  44. package/dist/src/model-gateway/quota.d.ts +4 -0
  45. package/dist/src/model-gateway/quota.js +107 -0
  46. package/dist/src/model-gateway/rate-limit.d.ts +12 -0
  47. package/dist/src/model-gateway/rate-limit.js +51 -0
  48. package/dist/src/model-gateway/retry.d.ts +14 -0
  49. package/dist/src/model-gateway/retry.js +48 -0
  50. package/dist/src/model-gateway/router.d.ts +4 -0
  51. package/dist/src/model-gateway/router.js +79 -0
  52. package/dist/src/model-gateway/routes.d.ts +2 -0
  53. package/dist/src/model-gateway/routes.js +172 -0
  54. package/dist/src/model-gateway/types.d.ts +47 -0
  55. package/dist/src/model-gateway/types.js +1 -0
  56. package/dist/src/routes/api.d.ts +2 -0
  57. package/dist/src/routes/api.js +128 -0
  58. package/dist/src/routes/websocket.d.ts +2 -0
  59. package/dist/src/routes/websocket.js +64 -0
  60. package/dist/src/types/index.d.ts +71 -0
  61. package/dist/src/types/index.js +1 -0
  62. package/dist/tests/core/context-manager.test.d.ts +1 -0
  63. package/dist/tests/core/context-manager.test.js +35 -0
  64. package/dist/tests/core/router.test.d.ts +1 -0
  65. package/dist/tests/core/router.test.js +79 -0
  66. package/dist/tests/model-gateway/circuit-breaker.test.d.ts +1 -0
  67. package/dist/tests/model-gateway/circuit-breaker.test.js +84 -0
  68. package/dist/tests/model-gateway/providers.test.d.ts +1 -0
  69. package/dist/tests/model-gateway/providers.test.js +80 -0
  70. package/dist/tests/model-gateway/quota.test.d.ts +1 -0
  71. package/dist/tests/model-gateway/quota.test.js +60 -0
  72. package/dist/tests/model-gateway/rate-limit.test.d.ts +1 -0
  73. package/dist/tests/model-gateway/rate-limit.test.js +42 -0
  74. package/dist/tests/model-gateway/retry.test.d.ts +1 -0
  75. package/dist/tests/model-gateway/retry.test.js +47 -0
  76. package/dist/tests/model-gateway/router.test.d.ts +1 -0
  77. package/dist/tests/model-gateway/router.test.js +108 -0
  78. package/dist/tests/model-gateway/routes.test.d.ts +1 -0
  79. package/dist/tests/model-gateway/routes.test.js +83 -0
  80. package/docs/api.md +187 -460
  81. package/docs/architecture.md +138 -0
  82. package/docs/configuration.md +188 -0
  83. 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.2",
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": {