web-access-cli 0.3.0 → 0.4.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/README.md +19 -16
- package/README_CN.md +19 -16
- package/THIRD_PARTY_NOTICES.md +11 -0
- package/dist/cli-output.js +16 -0
- package/dist/cli-output.js.map +1 -1
- package/dist/cli.js +31 -42
- package/dist/cli.js.map +1 -1
- package/dist/config/config.js +84 -7
- package/dist/config/config.js.map +1 -1
- package/dist/config/edit.js +88 -4
- package/dist/config/edit.js.map +1 -1
- package/dist/core/schema.js +15 -0
- package/dist/core/schema.js.map +1 -1
- package/dist/core/types.js +2 -0
- package/dist/core/types.js.map +1 -1
- package/dist/providers/registry.js +3 -0
- package/dist/providers/registry.js.map +1 -1
- package/dist/providers/xai.js +208 -0
- package/dist/providers/xai.js.map +1 -0
- package/dist/version.js +1 -1
- package/package.json +1 -1
- package/schemas/config.schema.json +73 -0
- package/schemas/output.schema.json +104 -0
package/README.md
CHANGED
|
@@ -13,7 +13,7 @@ The CLI is the primary product interface. It is not tied to Pi, Claude Code, Cod
|
|
|
13
13
|
|
|
14
14
|
| Capability | Provider types | Normalized output |
|
|
15
15
|
| --- | --- | --- |
|
|
16
|
-
| `search` | Tavily, Exa, Bocha, Brave, SearXNG, AnySearch, XCrawl, DeepSeek | `rank`, `title`, `url`, `snippet` |
|
|
16
|
+
| `search` | Tavily, Exa, Bocha, Brave, SearXNG, AnySearch, XCrawl, DeepSeek, xAI x_search, xAI web_search | `rank`, `title`, `url`, `snippet` |
|
|
17
17
|
| `extract` | Firecrawl v2, Jina Reader, Exa Contents, AnySearch, XCrawl, HTTP | Markdown `Document` |
|
|
18
18
|
|
|
19
19
|
A provider type describes an implementation, while a provider instance is a configurable instance of that type. One type can have multiple instances, such as `exa_team` and `exa_personal`. A `providers` route is an ordered array of instance IDs that determines which instances are enabled and the initial `auto` order. The CLI stores the learned effective order in the sibling `_providers` field.
|
|
@@ -84,8 +84,8 @@ web-access extract https://example.com/article
|
|
|
84
84
|
web-access extract https://example.com/article --provider http --timeout 30000
|
|
85
85
|
web-access extract https://example.com/article --json
|
|
86
86
|
|
|
87
|
-
web-access providers
|
|
88
|
-
web-access doctor
|
|
87
|
+
web-access providers
|
|
88
|
+
web-access doctor
|
|
89
89
|
|
|
90
90
|
web-access config edit
|
|
91
91
|
web-access --config "/path/to/config.json" config edit
|
|
@@ -96,10 +96,10 @@ The CLI provides the `search` and `extract` capability commands, the `providers`
|
|
|
96
96
|
### Global options
|
|
97
97
|
|
|
98
98
|
- `--config <path>`: Explicitly select a configuration file.
|
|
99
|
-
- `--
|
|
99
|
+
- `--json`: Output a compact schema v2 JSON envelope. Without it, successful commands write human-readable Markdown; all failures always write JSON.
|
|
100
100
|
- `--help`, `--version`: Print standard CLI help or version text.
|
|
101
101
|
|
|
102
|
-
|
|
102
|
+
Successful commands default to Markdown for human readers. `search` writes a YAML front matter block followed by a numbered result list; `extract` writes YAML front matter followed by the normalized Markdown body; `providers`, `doctor`, and `config edit` write a heading followed by pretty-printed JSON data. Add `--json` when a schema v2 envelope is required. Extract `partial` results and all failures, including invalid input and runtime errors, always remain JSON envelopes. Diagnostic messages are never mixed into stdout.
|
|
103
103
|
|
|
104
104
|
## Configuration
|
|
105
105
|
|
|
@@ -107,7 +107,7 @@ Configuration files use strict JSON; unknown fields are rejected. The CLI reads
|
|
|
107
107
|
|
|
108
108
|
The default path on every platform is `~/.config/web-access-cli/config.json`, where `~` is the current user's home directory. The `WEB_ACCESS_CONFIG` environment variable can select another path. The `--config` command-line option takes precedence.
|
|
109
109
|
|
|
110
|
-
`web-access config edit` creates parent directories and a complete default configuration when the file is missing, then opens it with the
|
|
110
|
+
`web-access config edit` creates parent directories and a complete default configuration when the file is missing, then opens it with the command in `VISUAL`, or `EDITOR` when `VISUAL` is empty. The value may contain a quoted executable path and arguments; it is parsed without shell evaluation and the configuration path is appended as a separate argument. An existing file is opened byte-for-byte as-is, even when it is temporarily invalid JSON; it is never overwritten or reformatted. The command waits only for the editor process to start, not for it to close. When neither variable is set, the command returns `open_failed`; a configuration file that was created successfully remains available for manual editing.
|
|
111
111
|
|
|
112
112
|
`config edit` itself never rewrites existing content. After an `auto` capability call succeeds or encounters fallback-eligible failures, the CLI atomically updates `search._providers` or `extract._providers`. If the default configuration does not exist, the first `auto` call that produces a learning result creates the complete default configuration. `_providers` is CLI-managed and cannot enable an instance outside `providers`. Missing, malformed, duplicate, unknown, or membership-mismatched internal entries reset the whole capability to the declared route. Delete `_providers` to restore the user-declared initial order manually.
|
|
113
113
|
|
|
@@ -115,7 +115,7 @@ The complete JSON Schema is available at [schemas/config.schema.json](schemas/co
|
|
|
115
115
|
|
|
116
116
|
```json
|
|
117
117
|
{
|
|
118
|
-
"$schema": "https://unpkg.com/web-access-cli@0.
|
|
118
|
+
"$schema": "https://unpkg.com/web-access-cli@0.4.0/schemas/config.schema.json",
|
|
119
119
|
"providers": [
|
|
120
120
|
{
|
|
121
121
|
"id": "exa_team",
|
|
@@ -139,8 +139,8 @@ The complete JSON Schema is available at [schemas/config.schema.json](schemas/co
|
|
|
139
139
|
"search": {
|
|
140
140
|
"providers": ["searx_local", "exa_team", "brave"],
|
|
141
141
|
"limit": 5,
|
|
142
|
-
"timeoutMs":
|
|
143
|
-
"attemptTimeoutMs":
|
|
142
|
+
"timeoutMs": 120000,
|
|
143
|
+
"attemptTimeoutMs": 60000,
|
|
144
144
|
"maxResponseBytes": 5242880
|
|
145
145
|
},
|
|
146
146
|
"extract": {
|
|
@@ -153,17 +153,19 @@ The complete JSON Schema is available at [schemas/config.schema.json](schemas/co
|
|
|
153
153
|
}
|
|
154
154
|
```
|
|
155
155
|
|
|
156
|
-
The built-in instances are `tavily`, `exa`, `bocha`, `brave`, `searxng`, `firecrawl`, `jina`, `http`, `anysearch`, `xcrawl`, and `
|
|
156
|
+
The built-in instances are `tavily`, `exa`, `bocha`, `brave`, `searxng`, `firecrawl`, `jina`, `http`, `anysearch`, `xcrawl`, `deepseek`, `xai_x_search`, and `xai_web_search`. A configuration entry with the same ID overrides fields on the built-in instance. A custom ID creates another instance of the selected type. An instance is enabled only when it appears in the corresponding `providers` route. Bocha defaults to `https://api.bocha.cn` and requires an API key; AnySearch defaults to `https://api.anysearch.com` and supports anonymous calls; XCrawl defaults to `https://run.xcrawl.com` and requires an API key; DeepSeek defaults to `https://api.deepseek.com/anthropic/v1` and requires an API key.
|
|
157
157
|
|
|
158
158
|
Default routes:
|
|
159
159
|
|
|
160
|
-
- Search: `tavily -> exa -> bocha -> brave -> searxng -> anysearch -> xcrawl -> deepseek`
|
|
160
|
+
- Search: `tavily -> exa -> bocha -> brave -> searxng -> anysearch -> xcrawl -> deepseek -> xai_web_search`
|
|
161
161
|
- Extract: `firecrawl -> jina -> exa -> anysearch -> xcrawl -> http`
|
|
162
162
|
|
|
163
163
|
The default routes include every built-in instance that supports the corresponding capability. Custom instance IDs are merged into the instance list but must still be added to routes explicitly. An omitted route uses the defaults above, while an explicit empty array disables that capability. In `auto` mode, incompletely configured instances are skipped; AnySearch can be called anonymously with its default base URL, while XCrawl and DeepSeek are skipped until their API keys are configured. AnySearch and XCrawl accept `searchFilterMode`: `strict` (default; freshness skips the provider) or `best_effort` (rewrites freshness into a query fragment). Domain constraints are rewritten into the query and strictly re-applied locally. XCrawl Extract always uses synchronous Scrape with Markdown output; Map, Crawl, and asynchronous jobs are outside the current CLI capabilities.
|
|
164
164
|
|
|
165
165
|
DeepSeek Search performs a full Anthropic-compatible Messages model turn with the native `web_search_20250305` server tool, so it can have higher latency and cost than a dedicated search endpoint. It is last in the default route and is reached only after earlier providers are unavailable, return a final non-2xx HTTP response, or otherwise fail recoverably. The adapter accepts URLs only from structured `web_search_tool_result` blocks, joins citation excerpts by URL, and never extracts URLs from model prose. Domain constraints are rewritten into the query and strictly re-applied locally; `freshness` is unsupported and skips DeepSeek with a recoverable error. Redirects are rejected without contacting the `Location` target. Provider-private `encrypted_content` payloads are omitted from `raw` because they are opaque, cannot be displayed or decoded by the CLI, and add no diagnostic value.
|
|
166
166
|
|
|
167
|
+
XAI hosted Search reads an external OAuth JSON file from `XAI_AUTH_JSON` on every call and uses only its `access_token`; an external CLIProxyAPI process owns refresh and write-back. Instance fields `authJson`/`authJsonEnv` and `model`/`modelEnv` override the path and model. `xai_web_search` accepts at most five allow or exclude domains (mutually exclusive); `xai_x_search` rejects `freshness`. Model-backed search can take longer than ordinary API searches; Search defaults allow up to 60 seconds per attempt and 120 seconds total.
|
|
168
|
+
|
|
167
169
|
### Credentials and URLs
|
|
168
170
|
|
|
169
171
|
Environment variables take precedence over plaintext keys in JSON. Built-in instances support these standard variables:
|
|
@@ -181,6 +183,7 @@ Environment variables take precedence over plaintext keys in JSON. Built-in inst
|
|
|
181
183
|
| AnySearch | `ANYSEARCH_API_KEY`, optional | `ANYSEARCH_BASE_URL`, default `https://api.anysearch.com` |
|
|
182
184
|
| XCrawl | `XCRAWL_API_KEY` | `XCRAWL_BASE_URL`, default `https://run.xcrawl.com` |
|
|
183
185
|
| DeepSeek | `DEEPSEEK_API_KEY` | No standard environment variable; default `https://api.deepseek.com/anthropic/v1` |
|
|
186
|
+
| xAI Search | `XAI_AUTH_JSON` | No standard API-key variable; default `https://cli-chat-proxy.grok.com/v1`, model `grok-4.6` |
|
|
184
187
|
|
|
185
188
|
Custom instances use `apiKeyEnv` and `baseUrlEnv` to name their environment variables. Every remote provider can define a `baseUrl` and additional `headers`. The public `api.firecrawl.dev` service requires a key; a self-hosted Firecrawl v2 instance can run without one.
|
|
186
189
|
|
|
@@ -200,7 +203,7 @@ An attempt keeps the provider's original error code, HTTP status, and `retryable
|
|
|
200
203
|
|
|
201
204
|
Selecting an instance explicitly executes it strictly without fallback. If the instance is not in the route, the command returns `provider_disabled`.
|
|
202
205
|
|
|
203
|
-
Default limits are a
|
|
206
|
+
Default limits are a 120-second total timeout and a 60-second per-attempt timeout for Search, and 120 seconds and 45 seconds respectively for Extract. Each response has a hard limit of 5 MiB. `--timeout` overrides only the total timeout for the current command.
|
|
204
207
|
|
|
205
208
|
## Output contract
|
|
206
209
|
|
|
@@ -224,9 +227,9 @@ Capability commands use output schema version 2. Their default envelope is inten
|
|
|
224
227
|
}
|
|
225
228
|
```
|
|
226
229
|
|
|
227
|
-
|
|
230
|
+
With `--json`, capability output contains only `schemaVersion`, `ok`, the final Instance ID and normalized `data`. Failures contain a compact `error` and, when providers were attempted, `attempts` entries with only Instance ID, error code and optional HTTP status. Extract quality failures may include a `partial` document without raw provider data. If the learned order cannot be written, either a success or failure envelope additionally contains `warnings: [{ "code": "provider_order_update_failed", "message": "..." }]` without replacing the primary result. Search and extract input errors use the same compact failure shape.
|
|
228
231
|
|
|
229
|
-
For human-readable
|
|
232
|
+
For human-readable output, extraction starts with YAML front matter and then the provider-normalized Markdown body. Search results use a numbered Markdown list; diagnostics and config edit use a heading plus pretty-printed JSON data. Metadata values use JSON double-quoted scalar encoding and the body is not modified. Existing scripts and other machine consumers should append `--json` explicitly.
|
|
230
233
|
|
|
231
234
|
Example default extract output:
|
|
232
235
|
|
|
@@ -240,13 +243,13 @@ title: "Example title"
|
|
|
240
243
|
# Article content
|
|
241
244
|
```
|
|
242
245
|
|
|
243
|
-
|
|
246
|
+
All success and failure envelopes use schema version 2. Stable schemas are available in [schemas](schemas).
|
|
244
247
|
|
|
245
248
|
Exit codes:
|
|
246
249
|
|
|
247
250
|
- `0`: Success
|
|
248
251
|
- `2`: Invalid input or configuration, or an unknown or disabled provider
|
|
249
|
-
- `1`: Runtime, provider, doctor, or
|
|
252
|
+
- `1`: Runtime, provider, doctor, or editor launch failure
|
|
250
253
|
- `130`: User cancellation
|
|
251
254
|
|
|
252
255
|
`providers` lists each instance's type, capabilities, route status, credential source, and base URL source. Its `searchRoute` and `extractRoute` fields show the effective order for the next `auto` call. `doctor` performs local configuration checks only and does not call remote APIs. If an enabled route contains an unconfigured instance, the command returns `doctor_failed` with exit code `1`.
|
package/README_CN.md
CHANGED
|
@@ -13,7 +13,7 @@ CLI 是主要产品形态,不绑定 Pi、Claude Code、Codex、Cursor、OpenCo
|
|
|
13
13
|
|
|
14
14
|
| 能力 | Provider Type | 统一输出 |
|
|
15
15
|
| --- | --- | --- |
|
|
16
|
-
| `search` | Tavily、Exa、Bocha、Brave、SearXNG、AnySearch、XCrawl、DeepSeek | `rank`、`title`、`url`、`snippet` |
|
|
16
|
+
| `search` | Tavily、Exa、Bocha、Brave、SearXNG、AnySearch、XCrawl、DeepSeek、xAI x_search、xAI web_search | `rank`、`title`、`url`、`snippet` |
|
|
17
17
|
| `extract` | Firecrawl v2、Jina Reader、Exa Contents、AnySearch、XCrawl、HTTP | Markdown `Document` |
|
|
18
18
|
|
|
19
19
|
Provider Type 描述实现类型;Provider Instance 是一份可配置实例。一个 Type 可以有多个 Instance,例如 `exa_team` 和 `exa_personal`。`providers` Route 是有序 Instance ID 数组,决定启用状态和 `auto` 的初始顺序;CLI 会把学习后的实际顺序保存在同级 `_providers`。
|
|
@@ -84,8 +84,8 @@ web-access extract https://example.com/article
|
|
|
84
84
|
web-access extract https://example.com/article --provider http --timeout 30000
|
|
85
85
|
web-access extract https://example.com/article --json
|
|
86
86
|
|
|
87
|
-
web-access providers
|
|
88
|
-
web-access doctor
|
|
87
|
+
web-access providers
|
|
88
|
+
web-access doctor
|
|
89
89
|
|
|
90
90
|
web-access config edit
|
|
91
91
|
web-access --config "/path/to/config.json" config edit
|
|
@@ -96,10 +96,10 @@ CLI 提供 `search`、`extract` 两个能力命令,`providers`、`doctor` 两
|
|
|
96
96
|
### 通用选项
|
|
97
97
|
|
|
98
98
|
- `--config <path>`:显式指定配置文件。
|
|
99
|
-
- `--
|
|
99
|
+
- `--json`:输出紧凑 schema v2 JSON envelope;不指定时,成功命令输出面向人的 Markdown,失败始终输出 JSON。
|
|
100
100
|
- `--help`、`--version`:输出常规 CLI 帮助或版本文本。
|
|
101
101
|
|
|
102
|
-
`
|
|
102
|
+
成功命令默认输出面向人的 Markdown。`search` 输出 YAML front matter 和编号结果列表;`extract` 输出 YAML front matter 和规范化后的 Markdown 正文;`providers`、`doctor` 和 `config edit` 输出标题和格式化 JSON 数据。需要 schema v2 envelope 时显式追加 `--json`。提取失败(包括 `partial`)以及所有失败路径始终输出 JSON envelope。诊断信息不会混入 stdout。
|
|
103
103
|
|
|
104
104
|
## 配置
|
|
105
105
|
|
|
@@ -107,7 +107,7 @@ CLI 提供 `search`、`extract` 两个能力命令,`providers`、`doctor` 两
|
|
|
107
107
|
|
|
108
108
|
所有平台的默认路径均为 `~/.config/web-access-cli/config.json`,其中 `~` 表示当前用户的主目录。环境变量 `WEB_ACCESS_CONFIG` 可以指定其他路径;命令行 `--config` 优先级更高。
|
|
109
109
|
|
|
110
|
-
`web-access config edit`
|
|
110
|
+
`web-access config edit` 会在配置文件缺失时创建父目录和完整默认配置,再优先使用 `VISUAL`、其次使用 `EDITOR` 打开;变量值可以包含带引号的可执行文件路径和参数,解析时不会执行 shell,并将配置路径作为独立的最后一个参数传入。已有文件会原样打开,即使内容暂时不是有效 JSON 也不会被覆盖或格式化。命令只等待编辑器进程启动,不等待编辑器关闭。两个变量都未设置、格式无效或启动失败时返回 `open_failed`;如果配置刚刚创建成功,文件仍会保留以便手动编辑。
|
|
111
111
|
|
|
112
112
|
`config edit` 本身不会改写已有内容;能力命令使用 `auto` 成功或发生可回退失败后,会原子更新 `search._providers` 或 `extract._providers`。默认配置尚不存在时,首次产生学习结果的 `auto` 调用会创建完整默认配置。`_providers` 由 CLI 管理,不会启用 `providers` 之外的 Instance;其内容缺失、格式错误、重复、引用未知 ID 或与 `providers` 成员集合不一致时会整组重置。删除 `_providers` 可以手动恢复用户声明的初始顺序。
|
|
113
113
|
|
|
@@ -115,7 +115,7 @@ CLI 提供 `search`、`extract` 两个能力命令,`providers`、`doctor` 两
|
|
|
115
115
|
|
|
116
116
|
```json
|
|
117
117
|
{
|
|
118
|
-
"$schema": "https://unpkg.com/web-access-cli@0.
|
|
118
|
+
"$schema": "https://unpkg.com/web-access-cli@0.4.0/schemas/config.schema.json",
|
|
119
119
|
"providers": [
|
|
120
120
|
{
|
|
121
121
|
"id": "exa_team",
|
|
@@ -139,8 +139,8 @@ CLI 提供 `search`、`extract` 两个能力命令,`providers`、`doctor` 两
|
|
|
139
139
|
"search": {
|
|
140
140
|
"providers": ["searx_local", "exa_team", "brave"],
|
|
141
141
|
"limit": 5,
|
|
142
|
-
"timeoutMs":
|
|
143
|
-
"attemptTimeoutMs":
|
|
142
|
+
"timeoutMs": 120000,
|
|
143
|
+
"attemptTimeoutMs": 60000,
|
|
144
144
|
"maxResponseBytes": 5242880
|
|
145
145
|
},
|
|
146
146
|
"extract": {
|
|
@@ -153,17 +153,19 @@ CLI 提供 `search`、`extract` 两个能力命令,`providers`、`doctor` 两
|
|
|
153
153
|
}
|
|
154
154
|
```
|
|
155
155
|
|
|
156
|
-
内置 Instance 为 `tavily`、`exa`、`bocha`、`brave`、`searxng`、`firecrawl`、`jina`、`http`、`anysearch`、`xcrawl`、`deepseek`。配置同 ID 时会覆盖内置实例的字段;自定义 ID 可以创建同 Type 的额外实例。只有出现在对应 `providers` Route 中的实例才启用。Bocha 默认 base URL 为 `https://api.bocha.cn`,必须配置 API key;AnySearch 默认 base URL 为 `https://api.anysearch.com`,支持匿名调用;XCrawl 默认 base URL 为 `https://run.xcrawl.com`,必须配置 API key;DeepSeek 默认 base URL 为 `https://api.deepseek.com/anthropic/v1`,必须配置 API key。
|
|
156
|
+
内置 Instance 为 `tavily`、`exa`、`bocha`、`brave`、`searxng`、`firecrawl`、`jina`、`http`、`anysearch`、`xcrawl`、`deepseek`、`xai_x_search`、`xai_web_search`。配置同 ID 时会覆盖内置实例的字段;自定义 ID 可以创建同 Type 的额外实例。只有出现在对应 `providers` Route 中的实例才启用。Bocha 默认 base URL 为 `https://api.bocha.cn`,必须配置 API key;AnySearch 默认 base URL 为 `https://api.anysearch.com`,支持匿名调用;XCrawl 默认 base URL 为 `https://run.xcrawl.com`,必须配置 API key;DeepSeek 默认 base URL 为 `https://api.deepseek.com/anthropic/v1`,必须配置 API key。
|
|
157
157
|
|
|
158
158
|
默认 Route:
|
|
159
159
|
|
|
160
|
-
- Search:`tavily -> exa -> bocha -> brave -> searxng -> anysearch -> xcrawl -> deepseek`
|
|
160
|
+
- Search:`tavily -> exa -> bocha -> brave -> searxng -> anysearch -> xcrawl -> deepseek -> xai_web_search`
|
|
161
161
|
- Extract:`firecrawl -> jina -> exa -> anysearch -> xcrawl -> http`
|
|
162
162
|
|
|
163
163
|
默认 Route 包含支持对应 Capability 的全部内置 Instance。自定义 ID 会合并到 Instance 列表,但仍需显式加入 Route;省略 Route 时使用上述默认值,显式空数组则禁用对应能力。`auto` 会跳过未完成配置的 Instance;AnySearch 使用默认 base URL 时可匿名调用,XCrawl 和 DeepSeek 则在配置 API key 前被跳过。AnySearch 与 XCrawl 可设置 `searchFilterMode`:`strict`(默认,遇到 freshness 时跳过)或 `best_effort`(将日期改写为查询片段)。域名条件会改写查询并在本地再次严格过滤。XCrawl Extract 固定使用同步 Scrape 的 Markdown 输出;Map、Crawl 和异步任务不属于当前 CLI 能力。
|
|
164
164
|
|
|
165
165
|
DeepSeek Search 通过 Anthropic-compatible Messages API 调用原生 `web_search_20250305` server tool,一次搜索是完整模型轮次,因此延迟和成本可能高于专用搜索 endpoint。它位于默认 Route 末尾,仅在前序 Provider 未配置、返回最终非 2xx HTTP 响应或发生其他可恢复失败后触发。Adapter 只接受 `web_search_tool_result` 中的结构化 URL,按 URL 合并 citation 摘要,绝不从模型 prose 中猜测 URL。域名条件会改写查询并在本地再次严格过滤;DeepSeek 不支持 `freshness`,遇到该参数时以可恢复错误跳过;重定向会被严格拒绝,且不会访问 `Location` 目标。Provider 私有的 `encrypted_content` 是 CLI 无法展示或解码的 opaque payload,不具备诊断价值,因此会从 `raw` 中移除。
|
|
166
166
|
|
|
167
|
+
XAI hosted Search 使用 `XAI_AUTH_JSON` 指向外部 OAuth JSON 文件,每次调用只读取 `access_token`,由外部 CLIProxyAPI 负责刷新和回写。可用 `authJson`/`authJsonEnv` 与 `model`/`modelEnv` 为实例覆盖路径和模型。`xai_web_search` 支持最多 5 个 allow 或 exclude 域名(两者不能同时使用);`xai_x_search` 不接受 `freshness`。模型搜索可能需要更长时间;Search 默认单次超时 60 秒、总超时 120 秒。
|
|
168
|
+
|
|
167
169
|
### 凭据和 URL
|
|
168
170
|
|
|
169
171
|
环境变量优先于 JSON 中的明文 key。内置 Instance 支持这些标准变量:
|
|
@@ -181,6 +183,7 @@ DeepSeek Search 通过 Anthropic-compatible Messages API 调用原生 `web_searc
|
|
|
181
183
|
| AnySearch | `ANYSEARCH_API_KEY`,可选 | `ANYSEARCH_BASE_URL`,默认 `https://api.anysearch.com` |
|
|
182
184
|
| XCrawl | `XCRAWL_API_KEY` | `XCRAWL_BASE_URL`,默认 `https://run.xcrawl.com` |
|
|
183
185
|
| DeepSeek | `DEEPSEEK_API_KEY` | 无标准环境变量;默认 `https://api.deepseek.com/anthropic/v1` |
|
|
186
|
+
| xAI Search | `XAI_AUTH_JSON` | 无标准环境变量;默认 `https://cli-chat-proxy.grok.com/v1`,模型 `grok-4.6` |
|
|
184
187
|
|
|
185
188
|
自定义 Instance 使用 `apiKeyEnv` 和 `baseUrlEnv` 指定自己的环境变量。所有远端 Provider 都可以设置 `baseUrl` 和附加 `headers`。公共 `api.firecrawl.dev` 需要 key;自托管 Firecrawl v2 可以不设置 key。
|
|
186
189
|
|
|
@@ -200,7 +203,7 @@ Attempt 会保留 Provider 的原始错误码、HTTP status 和 `retryable` 值
|
|
|
200
203
|
|
|
201
204
|
显式指定 Instance 时严格执行,不触发 fallback。若实例不在 Route 中,返回 `provider_disabled`。
|
|
202
205
|
|
|
203
|
-
默认上限:Search 总超时/单次超时为 60s
|
|
206
|
+
默认上限:Search 总超时/单次超时为 120s/60s,Extract 为 120s/45s;单个响应硬上限为 5 MiB。`--timeout` 只覆盖本次命令的总超时。
|
|
204
207
|
|
|
205
208
|
## 输出契约
|
|
206
209
|
|
|
@@ -224,9 +227,9 @@ Attempt 会保留 Provider 的原始错误码、HTTP status 和 `retryable` 值
|
|
|
224
227
|
}
|
|
225
228
|
```
|
|
226
229
|
|
|
227
|
-
|
|
230
|
+
使用 `--json` 时,能力命令成功只包含 `schemaVersion`、`ok`、最终 Instance ID 和规范化 `data`。失败时包含精简 `error`;实际尝试过 Provider 时,`attempts` 只保留 Instance ID、错误码和可选 HTTP status。提取质量失败可包含不含 raw 的 `partial` 文档。排序无法写回时,成功或失败 envelope 会额外包含 `warnings: [{ "code": "provider_order_update_failed", "message": "..." }]`,但不会覆盖主要结果。搜索和提取输入错误也使用相同的精简失败结构。
|
|
228
231
|
|
|
229
|
-
|
|
232
|
+
面向人的输出中,提取以 YAML front matter 开头、随后是 Provider 规范化的 Markdown 正文;搜索使用编号 Markdown 列表;诊断和配置编辑使用标题加格式化 JSON 数据。元数据值统一使用 JSON 双引号标量编码,正文内容不改写。已有脚本和其他机器消费者应显式追加 `--json`。
|
|
230
233
|
|
|
231
234
|
默认提取输出示例:
|
|
232
235
|
|
|
@@ -240,13 +243,13 @@ title: "Example title"
|
|
|
240
243
|
# Article content
|
|
241
244
|
```
|
|
242
245
|
|
|
243
|
-
|
|
246
|
+
所有成功和失败 envelope 使用 schema version 2。稳定 schema 位于 [schemas](schemas)。
|
|
244
247
|
|
|
245
248
|
退出码:
|
|
246
249
|
|
|
247
250
|
- `0`:成功
|
|
248
251
|
- `2`:输入、配置、未知或未启用 provider
|
|
249
|
-
- `1`:运行时/provider/doctor
|
|
252
|
+
- `1`:运行时/provider/doctor/编辑器启动失败
|
|
250
253
|
- `130`:用户取消
|
|
251
254
|
|
|
252
255
|
`providers` 会列出每个 Instance 的 Type、能力、Route 启用状态、凭据来源和 base URL 来源;`searchRoute` 与 `extractRoute` 是下一次 `auto` 使用的有效顺序。`doctor` 只做本地配置检查,不主动调用远端 API;当已启用 Route 中存在未配置 Instance 时,命令返回 `doctor_failed` 和退出码 `1`。
|
package/THIRD_PARTY_NOTICES.md
CHANGED
|
@@ -46,6 +46,17 @@ DeepSeek Search Provider 的 Anthropic-compatible Messages wire shape、结构
|
|
|
46
46
|
|
|
47
47
|
动态 Settings、Credential Service、Session event、LLM seam 和 Agent 集成代码没有进入本项目。
|
|
48
48
|
|
|
49
|
+
## Grok Build xAI Search
|
|
50
|
+
|
|
51
|
+
The xAI hosted search request and response mapping is derived from the `grok-build` project:
|
|
52
|
+
|
|
53
|
+
- Repository: `https://github.com/xai-org/grok-build`
|
|
54
|
+
- Source revision: `a549186d9d39311f2d3ee4208db62af8c65aa476`
|
|
55
|
+
- Copyright 2023-2026 SpaceXAI
|
|
56
|
+
- License: Apache-2.0
|
|
57
|
+
|
|
58
|
+
The adapted code is limited to the Responses tool wire shape and citation mapping. The full Apache-2.0 license is retained in the upstream repository.
|
|
59
|
+
|
|
49
60
|
## npm 依赖
|
|
50
61
|
|
|
51
62
|
发行包直接使用以下开源组件:
|
package/dist/cli-output.js
CHANGED
|
@@ -15,4 +15,20 @@ export function formatExtractMarkdown(envelope) {
|
|
|
15
15
|
const content = document.content;
|
|
16
16
|
return `${lines.join("\n")}${content.endsWith("\n") ? content : `${content}\n`}`;
|
|
17
17
|
}
|
|
18
|
+
export function formatMarkdown(envelope) {
|
|
19
|
+
if ("provider" in envelope && "document" in envelope.data)
|
|
20
|
+
return formatExtractMarkdown(envelope);
|
|
21
|
+
if ("provider" in envelope && "results" in envelope.data) {
|
|
22
|
+
const e = envelope;
|
|
23
|
+
const body = e.data.results
|
|
24
|
+
.map((result, index) => `${index + 1}. [${result.title}](${result.url})${result.snippet ? `\n ${result.snippet}` : ""}`)
|
|
25
|
+
.join("\n");
|
|
26
|
+
return `---\nprovider: ${JSON.stringify(e.provider)}\n---\n\n${body || "无搜索结果"}\n`;
|
|
27
|
+
}
|
|
28
|
+
if ("command" in envelope && envelope.ok) {
|
|
29
|
+
const e = envelope;
|
|
30
|
+
return `# ${e.command}\n\n${JSON.stringify(e.data, null, 2)}\n`;
|
|
31
|
+
}
|
|
32
|
+
return "";
|
|
33
|
+
}
|
|
18
34
|
//# sourceMappingURL=cli-output.js.map
|
package/dist/cli-output.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli-output.js","sourceRoot":"","sources":["../src/cli-output.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"cli-output.js","sourceRoot":"","sources":["../src/cli-output.ts"],"names":[],"mappings":"AAUA,SAAS,UAAU,CAAC,KAAa;IAChC,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;AAC9B,CAAC;AAED,MAAM,UAAU,qBAAqB,CACpC,QAAgC;IAEhC,MAAM,EAAE,QAAQ,EAAE,GAAG,QAAQ,CAAC,IAAI,CAAC;IACnC,MAAM,KAAK,GAAG;QACb,KAAK;QACL,aAAa,UAAU,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE;QAC5C,QAAQ,UAAU,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE;KACxC,CAAC;IACF,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;IACpC,IAAI,KAAK;QAAE,KAAK,CAAC,IAAI,CAAC,UAAU,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IACrD,KAAK,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;IAC1B,MAAM,OAAO,GAAG,QAAQ,CAAC,OAAO,CAAC;IACjC,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,IAAI,EAAE,CAAC;AAClF,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,QAAwB;IACtD,IAAI,UAAU,IAAI,QAAQ,IAAI,UAAU,IAAI,QAAQ,CAAC,IAAI;QACxD,OAAO,qBAAqB,CAAC,QAAkC,CAAC,CAAC;IAClE,IAAI,UAAU,IAAI,QAAQ,IAAI,SAAS,IAAI,QAAQ,CAAC,IAAI,EAAE,CAAC;QAC1D,MAAM,CAAC,GAAG,QAAiC,CAAC;QAC5C,MAAM,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,OAAO;aACzB,GAAG,CACH,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,CACjB,GAAG,KAAK,GAAG,CAAC,MAAM,MAAM,CAAC,KAAK,KAAK,MAAM,CAAC,GAAG,IAAI,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAClG;aACA,IAAI,CAAC,IAAI,CAAC,CAAC;QACb,OAAO,kBAAkB,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,YAAY,IAAI,IAAI,OAAO,IAAI,CAAC;IACpF,CAAC;IACD,IAAI,SAAS,IAAI,QAAQ,IAAI,QAAQ,CAAC,EAAE,EAAE,CAAC;QAC1C,MAAM,CAAC,GAAG,QAAiE,CAAC;QAC5E,OAAO,KAAK,CAAC,CAAC,OAAO,OAAO,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC;IACjE,CAAC;IACD,OAAO,EAAE,CAAC;AACX,CAAC"}
|
package/dist/cli.js
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
import { realpathSync } from "node:fs";
|
|
3
3
|
import { pathToFileURL } from "node:url";
|
|
4
4
|
import { Command, CommanderError, InvalidArgumentError, Option, } from "commander";
|
|
5
|
-
import {
|
|
5
|
+
import { formatMarkdown } from "./cli-output.js";
|
|
6
6
|
import { loadConfig } from "./config/config.js";
|
|
7
7
|
import { executeConfigEdit } from "./config/edit.js";
|
|
8
8
|
import { createProviderOrderWriter } from "./config/provider-order.js";
|
|
@@ -47,34 +47,15 @@ function exitCode(envelope) {
|
|
|
47
47
|
return 2;
|
|
48
48
|
return 1;
|
|
49
49
|
}
|
|
50
|
-
function writeEnvelope(envelope
|
|
51
|
-
process.stdout.write(`${JSON.stringify(envelope
|
|
50
|
+
function writeEnvelope(envelope) {
|
|
51
|
+
process.stdout.write(`${JSON.stringify(envelope)}\n`);
|
|
52
52
|
}
|
|
53
|
-
function writeOutput(envelope, mode
|
|
54
|
-
if (mode === "markdown" &&
|
|
55
|
-
process.stdout.write(
|
|
53
|
+
function writeOutput(envelope, mode) {
|
|
54
|
+
if (mode === "markdown" && envelope.ok) {
|
|
55
|
+
process.stdout.write(formatMarkdown(envelope));
|
|
56
56
|
return;
|
|
57
57
|
}
|
|
58
|
-
writeEnvelope(envelope
|
|
59
|
-
}
|
|
60
|
-
function isExtractSuccessEnvelope(envelope) {
|
|
61
|
-
return (envelope.ok &&
|
|
62
|
-
"provider" in envelope &&
|
|
63
|
-
typeof envelope.provider === "string" &&
|
|
64
|
-
"data" in envelope &&
|
|
65
|
-
typeof envelope.data === "object" &&
|
|
66
|
-
envelope.data !== null &&
|
|
67
|
-
"document" in envelope.data &&
|
|
68
|
-
typeof envelope.data.document === "object" &&
|
|
69
|
-
envelope.data.document !== null &&
|
|
70
|
-
"sourceUrl" in envelope.data.document &&
|
|
71
|
-
typeof envelope.data.document.sourceUrl === "string" &&
|
|
72
|
-
"title" in envelope.data.document &&
|
|
73
|
-
typeof envelope.data.document.title === "string" &&
|
|
74
|
-
"content" in envelope.data.document &&
|
|
75
|
-
typeof envelope.data.document.content === "string" &&
|
|
76
|
-
"contentType" in envelope.data.document &&
|
|
77
|
-
envelope.data.document.contentType === "text/markdown");
|
|
58
|
+
writeEnvelope(envelope);
|
|
78
59
|
}
|
|
79
60
|
export function createProgram(run, dependencies = {}) {
|
|
80
61
|
const program = new Command();
|
|
@@ -84,7 +65,7 @@ export function createProgram(run, dependencies = {}) {
|
|
|
84
65
|
.description("Agent-neutral 的网页搜索与内容提取 CLI")
|
|
85
66
|
.version(VERSION)
|
|
86
67
|
.option("--config <path>", "指定 JSON 配置文件")
|
|
87
|
-
.option("--
|
|
68
|
+
.option("--json", "输出 JSON envelope", false)
|
|
88
69
|
.showSuggestionAfterError();
|
|
89
70
|
program.configureOutput({ writeErr: () => { }, outputError: () => { } });
|
|
90
71
|
program.exitOverride();
|
|
@@ -102,7 +83,7 @@ export function createProgram(run, dependencies = {}) {
|
|
|
102
83
|
.option("--include-domain <domain>", "仅包含域名,可重复", collect, [])
|
|
103
84
|
.option("--exclude-domain <domain>", "排除域名,可重复", collect, [])
|
|
104
85
|
.option("--timeout <milliseconds>", "总超时毫秒数", integer)
|
|
105
|
-
.option("--
|
|
86
|
+
.option("--json", "输出 JSON envelope", false)
|
|
106
87
|
.action((query, options) => {
|
|
107
88
|
run(async () => {
|
|
108
89
|
const globals = program.opts();
|
|
@@ -123,22 +104,22 @@ export function createProgram(run, dependencies = {}) {
|
|
|
123
104
|
return executeSearch(request, {
|
|
124
105
|
loaded,
|
|
125
106
|
signal: processSignal.signal,
|
|
126
|
-
debug: options.debug,
|
|
127
107
|
persistProviderOrder: createProviderOrderWriter(loaded),
|
|
128
108
|
});
|
|
129
|
-
})
|
|
109
|
+
}, options.json || program.opts().json
|
|
110
|
+
? "json"
|
|
111
|
+
: "markdown");
|
|
130
112
|
});
|
|
131
113
|
program
|
|
132
114
|
.command("extract")
|
|
133
|
-
.description("提取网页正文并转换为 Markdown
|
|
115
|
+
.description("提取网页正文并转换为 Markdown(使用 --json 输出 JSON)")
|
|
134
116
|
.argument("<url>", "HTTP(S) URL")
|
|
135
117
|
.option("-p, --provider <id>", "provider instance id,或 auto", "auto")
|
|
136
118
|
.option("--timeout <milliseconds>", "总超时毫秒数", integer)
|
|
137
119
|
.option("--json", "输出 JSON envelope", false)
|
|
138
|
-
.option("--debug", "输出完整路由和脱敏原始响应", false)
|
|
139
120
|
.action((url, options) => {
|
|
140
121
|
const globals = program.opts();
|
|
141
|
-
const outputMode = options.json ||
|
|
122
|
+
const outputMode = options.json || globals.json ? "json" : "markdown";
|
|
142
123
|
run(async () => {
|
|
143
124
|
const loaded = loadConfig(globals.config);
|
|
144
125
|
const request = {
|
|
@@ -149,7 +130,6 @@ export function createProgram(run, dependencies = {}) {
|
|
|
149
130
|
return executeExtract(request, {
|
|
150
131
|
loaded,
|
|
151
132
|
signal: processSignal.signal,
|
|
152
|
-
debug: options.debug,
|
|
153
133
|
persistProviderOrder: createProviderOrderWriter(loaded),
|
|
154
134
|
});
|
|
155
135
|
}, outputMode);
|
|
@@ -157,18 +137,27 @@ export function createProgram(run, dependencies = {}) {
|
|
|
157
137
|
program
|
|
158
138
|
.command("providers")
|
|
159
139
|
.description("列出 provider instance、route 与配置状态")
|
|
160
|
-
.
|
|
140
|
+
.option("--json", "输出 JSON envelope", false)
|
|
141
|
+
.action((options) => run(() => executeProviders(loadConfig(program.opts().config)), options.json || program.opts().json
|
|
142
|
+
? "json"
|
|
143
|
+
: "markdown"));
|
|
161
144
|
program
|
|
162
145
|
.command("doctor")
|
|
163
146
|
.description("检查本地配置与已启用 provider 的可用性")
|
|
164
|
-
.
|
|
147
|
+
.option("--json", "输出 JSON envelope", false)
|
|
148
|
+
.action((options) => run(() => executeDoctor(loadConfig(program.opts().config)), options.json || program.opts().json
|
|
149
|
+
? "json"
|
|
150
|
+
: "markdown"));
|
|
165
151
|
const config = program.command("config").description("管理配置文件");
|
|
166
152
|
config
|
|
167
153
|
.command("edit")
|
|
168
|
-
.description("
|
|
169
|
-
.
|
|
154
|
+
.description("创建默认配置文件并用 VISUAL 或 EDITOR 打开")
|
|
155
|
+
.option("--json", "输出 JSON envelope", false)
|
|
156
|
+
.action((options) => run(() => runConfigEdit({
|
|
170
157
|
explicitPath: program.opts().config,
|
|
171
|
-
}))
|
|
158
|
+
}), options.json || program.opts().json
|
|
159
|
+
? "json"
|
|
160
|
+
: "markdown"));
|
|
172
161
|
return program;
|
|
173
162
|
}
|
|
174
163
|
function envelopeCommand(args) {
|
|
@@ -191,7 +180,7 @@ async function main() {
|
|
|
191
180
|
});
|
|
192
181
|
if (process.argv.length <= 2) {
|
|
193
182
|
const envelope = errorEnvelope(new WebAccessError("invalid_input", "必须指定命令"));
|
|
194
|
-
writeEnvelope(envelope
|
|
183
|
+
writeEnvelope(envelope);
|
|
195
184
|
process.exitCode = 2;
|
|
196
185
|
return;
|
|
197
186
|
}
|
|
@@ -200,7 +189,7 @@ async function main() {
|
|
|
200
189
|
if (!pending)
|
|
201
190
|
throw new WebAccessError("invalid_input", "必须指定命令");
|
|
202
191
|
const envelope = await pending;
|
|
203
|
-
writeOutput(envelope, pendingOutputMode
|
|
192
|
+
writeOutput(envelope, pendingOutputMode);
|
|
204
193
|
process.exitCode = exitCode(envelope);
|
|
205
194
|
}
|
|
206
195
|
catch (caught) {
|
|
@@ -215,7 +204,7 @@ async function main() {
|
|
|
215
204
|
: caught.message)
|
|
216
205
|
: asWebAccessError(caught);
|
|
217
206
|
const envelope = errorEnvelope(normalized, envelopeCommand(program.args));
|
|
218
|
-
writeEnvelope(envelope
|
|
207
|
+
writeEnvelope(envelope);
|
|
219
208
|
process.exitCode = exitCode(envelope);
|
|
220
209
|
}
|
|
221
210
|
}
|
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EACN,OAAO,EACP,cAAc,EACd,oBAAoB,EACpB,MAAM,GACN,MAAM,WAAW,CAAC;AACnB,OAAO,EAAsB,
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|