Merge pull request #170 from modelstudioai/feat/add-websearch-skill

Add bailian-web-search routing skill
This commit is contained in:
Gong Shiqi
2026-08-20 19:07:52 +08:00
committed by GitHub
11 changed files with 157 additions and 13 deletions
+2 -1
View File
@@ -14,6 +14,7 @@ git add \
skills/bailian-finetune/SKILL.md \
skills/bailian-finetune/reference \
skills/bailian-managed-agent/SKILL.md \
skills/bailian-managed-agent/reference
skills/bailian-managed-agent/reference \
skills/bailian-web-search/SKILL.md
vp staged
+1 -1
View File
@@ -35,7 +35,7 @@ packages/core/src/auth/ # apiKey / console credential 解析与落盘
packages/core/src/client/ # HTTP client / endpoints / console gateway
```
Skill / 命令手册随 `skills/bailian-*/``bl skill init` 安装(装齐 registry 中全部 `bailian-*`,含共享协议 `bailian-protocol`)。业务 skill`bailian-cli` / `bailian-gen` / `bailian-finetune` / `bailian-managed-agent`)执行前读 `skills/bailian-protocol/`;不要依赖 frontmatter `companions`(安装器不强制)。`tools/generate-reference.ts`**`packages/cli/src/commands.ts`** 按一级命令归属表分流写入各 `skills/<skill>/reference/`(纳入 git);`tools/sync-skill-metadata.ts``packages/cli/package.json` 同步各 `skills/*/SKILL.md``metadata.version`。两者由根脚本 `pnpm run sync:skill-assets``.vite-hooks/pre-commit` 执行。hub `bailian-cli` 的路由表不复述领域命令明细SKILL 文案 / 安装约定 / hand-off 见 [docs/agents/skill-change.md](docs/agents/skill-change.md)。
Skill / 命令手册随 `skills/bailian-*/``bl skill init` 安装(装齐 registry 中全部 `bailian-*`,含共享协议 `bailian-protocol`)。业务 skill`bailian-cli` / `bailian-gen` / `bailian-finetune` / `bailian-managed-agent` / `bailian-web-search`)执行前读 `skills/bailian-protocol/`;不要依赖 frontmatter `companions`(安装器不强制)。`tools/generate-reference.ts`**`packages/cli/src/commands.ts`** 按一级命令归属表分流写入各 `skills/<skill>/reference/`(纳入 git);`tools/sync-skill-metadata.ts``packages/cli/package.json` 同步各 `skills/*/SKILL.md``metadata.version`。两者由根脚本 `pnpm run sync:skill-assets``.vite-hooks/pre-commit` 执行。hub `bailian-cli` 的路由表不复述领域命令明细SKILL 文案 / 安装约定 / hand-off 见 [docs/agents/skill-change.md](docs/agents/skill-change.md)。
约定:
+5 -5
View File
@@ -23,11 +23,11 @@
bailian-protocol ← 共享协议consent / 鉴权 / 版本 / 错误上报)
▲ 靠 `bl skill init` 与业务 skill 同装;非安装器强制 companions
┌───────┴────────┬────────────────┬──────────────────┐
bailian-gen bailian-finetune bailian-managed-agent
(领域路由表) (领域工作流) IaC 安全闸)
│ │ │
└────────────────┼──────────────────┘
┌───────┴────────┬────────────────┬──────────────────┬───────────────────
bailian-gen bailian-finetune bailian-managed-agent bailian-web-search
(领域路由表) (领域工作流) IaC 安全闸) (搜索路由+兜底)
│ │ │
└────────────────┼──────────────────┴─────────────────────
▼ 软 hand-off按 skill 名)
bailian-clihub
hub 路由表:本职命令 + 领域 hand-off 行
+1 -1
View File
@@ -5,7 +5,7 @@
Agent skill for **Alibaba Cloud Model Studio CLI** (`bl`) resource hub — apps, memory, RAG, usage/quota, MCP, and hub `reference/`.
- Shared protocol: `bailian-protocol` (install via `bl skill init`)
- Soft hand-offs (optional skills): `bailian-gen` · `bailian-finetune` · `bailian-managed-agent`
- Soft hand-offs (optional skills): `bailian-gen` · `bailian-finetune` · `bailian-managed-agent` · `bailian-web-search`
```bash
bl skill init
+1 -1
View File
@@ -5,7 +5,7 @@
**阿里云百炼 CLI**`bl`)的资源管理 Agent 技能 — 应用、记忆、RAG、用量/额度、MCP以及 hub `reference/`
- 共享协议:`bailian-protocol`(通过 `bl skill init` 与整家族同装)
- 软 hand-off可选`bailian-gen` · `bailian-finetune` · `bailian-managed-agent`
- 软 hand-off可选`bailian-gen` · `bailian-finetune` · `bailian-managed-agent` · `bailian-web-search`
```bash
bl skill init
+5 -3
View File
@@ -12,7 +12,7 @@ description: >-
用户点名百炼 / DashScope / `bl`,或继续既有 `bl` 工作流时直接使用。
共享协议consent / 版本预检 / 鉴权 / 错误上报)在 bailian-protocol官方安装 `bl skill init`
家族路由:生图/生视频/配音/语音合成/转写 → bailian-gen精调/微调/训练/数据集 → bailian-finetune
agents.yaml 托管 Agent → bailian-managed-agent。
agents.yaml 托管 Agent → bailian-managed-agent联网搜索的模型路由Token Plan 自带搜索 vs MCP 搜索 + 兜底)→ bailian-web-search
不要用于普通问答、编程、写作、翻译、摘要、泛搜索,或图片理解等宿主自己能做的任务(普通问答、编程、写作、翻译、摘要、泛搜索不触发)。
未命名用量/额度问题:先问用户使用哪个产品,再运行 `bl usage` / `bl quota` 查询。
---
@@ -23,7 +23,7 @@ description: >-
> **Family hub** — This skill owns Bailian resource commands and the hub `reference/` (apps, knowledge, usage, auth, config, …).
> Shared protocol → [`../bailian-protocol/SKILL.md`](../bailian-protocol/SKILL.md) (install the full family with `bl skill init`).
> Soft hand-offs by skill name (Read if installed; else `bl … --help` / prompt `bl skill init`): `bailian-gen` (media) · `bailian-finetune` (training) · `bailian-managed-agent` (agents.yaml IaC).
> Soft hand-offs by skill name (Read if installed; else `bl … --help` / prompt `bl skill init`): `bailian-gen` (media) · `bailian-finetune` (training) · `bailian-managed-agent` (agents.yaml IaC) · `bailian-web-search` (web search routing).
> Do not invoke it for ordinary reasoning, coding, writing, translation, summarization, generic research, or image understanding the host agent can complete directly.
>
> **Install (supported):** `bl skill init`
@@ -40,6 +40,7 @@ Domain skills own their own generated reference trees (soft hand-off — do not
- `bailian-gen``image` / `video` / `speech` / `omni` / `vision` (fallback: `bl image\|video\|speech\|omni\|vision --help`)
- `bailian-finetune``dataset` / `finetune` / `deploy` (fallback: `bl dataset\|finetune\|deploy --help`)
- `bailian-managed-agent``managed-agent` (fallback: `bl managed-agent --help`)
- `bailian-web-search` → web search **routing** (hub still owns `reference/search.md` flags; **must** route via this skill before `bl search web`)
Auto-generated from the CLI source at build time (`pnpm --filter bailian-cli run generate:reference`). Before running an unfamiliar command:
@@ -58,7 +59,6 @@ Use this table only after the decision table in [`bailian-protocol`](../bailian-
| User intent | Command | Notes |
| ------------------------------------------------ | --------------------------------------------- | -------------------------------------------------------------------------------- |
| Explicit Bailian model chat / text execution | `bl text chat` | Default `qwen3.8-max` |
| Search inside a Bailian-scoped workflow | `bl search web` | DashScope MCP search; not for generic web research |
| Bailian agent / workflow | `bl app call` | Needs `--app-id` |
| Find app by name | `bl app list` then `bl app call` | Console auth |
| Bailian app memory CRUD (not host-agent memory) | `bl memory *` | [`reference/memory.md`](reference/memory.md) |
@@ -79,6 +79,7 @@ Use this table only after the decision table in [`bailian-protocol`](../bailian-
| Image / video / speech / omni / vision | → skill `bailian-gen` | Fallback: `bl image\|video\|speech\|omni\|vision --help` |
| Dataset / fine-tune / deploy | → skill `bailian-finetune` | Fallback: `bl dataset\|finetune\|deploy --help` |
| agents.yaml IaC / managed-agent sessions | → skill `bailian-managed-agent` | Fallback: `bl managed-agent --help`; `apply`/`destroy` need `--yes` after `plan` |
| Web search (model-aware routing) | → skill `bailian-web-search` | Token Plan vs MCP path + fallback; fallback: `bl search web --help` |
Flags, usage, and examples: see hub [`reference/`](reference/index.md) or `bl <command> --help` — do not guess flags. Domain command details live in the owning skill's `reference/`.
@@ -117,6 +118,7 @@ schema-export commands.
## Routing reminders
- Image/video/audio generation or editing → skill `bailian-gen` (class 3 consent from `bailian-protocol`). Fine-tuning / datasets / deployments → `bailian-finetune`. agents.yaml IaC → `bailian-managed-agent`. Soft hand-off: Read sibling skill if installed; else `bl … --help` or prompt `bl skill init`. Image understanding the host agent can do → host-first; use `bl vision` / `bl omni` only when the user names a Bailian model or the media (video/audio files) exceeds host capability.
- Web search inside a Bailian workflow → skill `bailian-web-search` (model-aware routing: Token Plan → model-native search; default → `bl search web`; MCP failure → fall back once). Generic web research the host can do stays host-first — do not bounce it through `bl`.
- Answer ordinary reasoning, coding, writing, translation, summarization, and generic research with the host agent's native capabilities; do not bounce them through `bl text chat` or `bl search web`.
- Usage / quota / credits questions that do not name a product → ask which product (Bailian or another AI service) first; run `bl usage` / `bl quota` only after the user picks Bailian or Bailian context is already established.
- "Remember this" and memory requests default to the host agent's own memory; `bl memory *` is only for Bailian app memory resources.
+2
View File
@@ -3,6 +3,8 @@
> Auto-generated from `packages/cli/src/commands.ts`. Do not edit by hand.
> Regenerate: `pnpm --filter bailian-cli run generate:reference`.
> **Agent routing (mandatory):** Before running any `bl search *` command, Read skill `bailian-web-search` if installed and follow its identity-based routing (Token Plan → model-native web search; default → MCP; eligible MCP failures → fall back once). Do **not** call `bl search web` directly from this reference alone — Token Plan keys cannot authorize Bailian MCP search. If that skill is missing, run `bl skill init` or fall back to `bl search web --help` / `bl text chat --help` after checking `bl config show --output json`.
Index: [index.md](index.md)
## Commands in this group
+2 -1
View File
@@ -7,7 +7,7 @@ metadata:
description: >-
阿里云百炼 `bl` 家族共享执行协议consent 确认、版本预检、鉴权/安装、错误上报、本地文件与输出约定)。
不是面向用户意图的业务入口;当任一 bailian-* 业务 skillbailian-cli / bailian-gen /
bailian-finetune / bailian-managed-agent执行前需要公共上下文或用户首次安装/鉴权/`bl` 报错需上报时读取本 skill。
bailian-finetune / bailian-managed-agent / bailian-web-search)执行前需要公共上下文,或用户首次安装/鉴权/`bl` 报错需上报时读取本 skill。
官方安装为整包:`bl skill init`(与业务 skill 同装)。
---
@@ -51,6 +51,7 @@ After approval, treat Bailian as selected for the current task. Do not ask again
| 生图 / 生视频 / 语音 / 图片理解 / 视频理解 / omni / vision | `bailian-gen` | `bl image\|video\|speech\|omni\|vision --help` |
| 精调 / 数据集 / 部署 | `bailian-finetune` | `bl dataset\|finetune\|deploy --help` |
| agents.yaml IaC | `bailian-managed-agent` | `bl managed-agent --help` |
| 联网搜索 / web search模型路由 + 兜底) | `bailian-web-search` | `bl search web --help` |
| 应用 / 知识库 / 用量 / 鉴权配置等资源 | `bailian-cli` | `bl app\|knowledge\|usage\|auth\|config --help` |
**共享协议** vs **软 hand-off**
+120
View File
@@ -0,0 +1,120 @@
---
name: bailian-web-search
metadata:
version: "1.17.0"
requires:
bins: ["bl"]
description: >-
阿里云百炼联网搜索web search入口为联网搜索 / 网页搜索 / 查最新资讯做路径分发。
先识别当前连接身份Token Planprofile `token-plan` 或 base_url host 为
`token-plan.<region>.maas.aliyuncs.com`)→ 模型自带搜索
`bl text chat --api responses --tool '{"type":"web_search"}'`);其他 / 默认 →
Bailian MCP`bl search web`);仅在 MCP 鉴权失败、未开通或传输失败时兜底一次到模型自带搜索。
Token Plan 联网搜索失败、两条路径鉴权混淆的排查也走本技能。
反触发:宿主可完成的 普通问答 / 编程 / 写作 → 不触发;知识库 RAG → bailian-cli
`bl knowledge`);生图/生视频/语音 → bailian-gen精调/训练 → bailian-finetune
agents.yaml → bailian-managed-agent。
共享协议consent / 版本预检 / 鉴权 / 错误上报)在 bailian-protocol官方安装 `bl skill init`
---
# Bailian web search routing (`bailian-web-search`)
**CRITICAL — Before executing, MUST read the shared protocol in [`../bailian-protocol/SKILL.md`](../bailian-protocol/SKILL.md): Provider selection and consent, Version & updates (pre-flight checklist), Setup & auth, and CLI errors: report an issue. If that protocol file is missing, stop and run `bl skill init`; do not guess auth/consent.**
> **Scope:** model-aware routing for web search inside Agent-driven `bl` workflows — this skill owns the routing decision only.
> Command flags / usage / examples: Read skill `bailian-cli` reference if installed; else `bl search web --help` / `bl text chat --help` — do not guess flags.
>
> **Install (supported):** `bl skill init`
Token Plan keys do not authorize Bailian MCP search — never route them to `bl search web`.
## Routing workflow
### Step 1 — Identify the active model identity
Run (no auth needed):
```bash
bl config show --output json
```
Treat the connection as **Token Plan** when **either** condition holds — this mirrors the CLI's own endpoint detection (`usesTokenPlanEndpoint`), so routing stays consistent with command behavior:
- `config` (active profile name) is `token-plan`, **or**
- the hostname of `base_url` matches `token-plan.<region>.maas.aliyuncs.com` (e.g. `https://token-plan.cn-beijing.maas.aliyuncs.com`).
Do not rely on the profile name alone: users can create additional Token Plan profiles under custom names, and only the Base URL host check catches those. Anything else → **default** identity.
### Step 2 — Route by identity
| Condition | Route | Notes |
| ------------------------- | ------------------------------- | --------------------------------------------------- |
| Token Plan model identity | Model-native path | Preferred — the only path Token Plan keys authorize |
| Any other model / default | MCP path | Default for regular DashScope API keys |
| MCP path (eligible fail) | Model-native path, exactly once | Fallback — only for the failure classes below |
**User override:** if the user names a specific path or command, follow it **except** under Token Plan identity: do not call `bl search web` even if the user asks for MCP — explain that Token Plan keys cannot authorize Bailian MCP search, then use the model-native path (or ask once whether to switch profile / key).
### Model-native path (Token Plan preferred / fallback target)
```bash
bl text chat --api responses --tool '{"type":"web_search"}' --message "搜索近期的阿里云新闻"
```
- The Responses API enables native web search via the tool definition `{"type":"web_search"}`.
- Requires a model with native web search support (Qwen3.7+). **Do not hardcode `--model`:** omit it so the CLI uses `default_text_model` / built-in default; only pass `--model` when the user named one.
- Write `--message` in the user's language; the reply language follows the prompt (see `bailian-protocol` → Respond in the user's language).
- Flags / usage: Read skill `bailian-cli` if installed, else `bl text chat --help`.
### MCP path (default)
```bash
bl search web --query "阿里云百炼最新功能"
```
- Requires the WebSearch MCP to be activated for the current key; on the not-activated error the CLI appends an activation hint with the marketplace URL — relay it to the user.
- Flags / usage: Read skill `bailian-cli` if installed, else `bl search web --help`.
### Fallback (MCP → model-native, exactly once)
**Do not** fall back on every non-zero exit. Fall back **only** when `bl search web` fails for one of these classes (match stderr / message):
- **auth / permission** — key not valid for the MCP service (e.g. Token Plan key misrouted by identity detection),
- **MCP not activated** — `MCP request failed: 404` with `未开通` / `MCP不存在` / `MCP_IS_INVALID` (CLI may append an activation hint),
- **MCP transport** — 405 / Streamable-HTTP unsupported, or clear network / timeout / DNS failures reaching the MCP endpoint.
**Do not fall back** for: missing `--query` / USAGE errors, rate limits, content-policy / business errors from a successful MCP session, or empty-but-successful result sets. Report those verbatim and stop (or ask the user); do not burn a Responses call.
Fallback discipline:
1. Re-issue the same query via the model-native path (omit `--model` unless the user named one).
2. If the fallback succeeds, tell the user the MCP path failed and — when the not-activated hint appeared — that activating the WebSearch MCP restores the default path.
3. If the fallback also fails, stop and report both errors verbatim; follow the issue-reporting flow in `bailian-protocol` (ask once). Never loop retries.
## Quick examples
```bash
# Step 1: identify the active model identity
bl config show --output json
# Token Plan identity → model-native web search (no --model unless user named one)
bl text chat --api responses --tool '{"type":"web_search"}' --message "搜索近期的阿里云新闻"
# Default identity → Bailian MCP search
bl search web --query "阿里云百炼最新功能"
# Eligible MCP failure → fall back once (same rule: no hardcoded --model)
bl text chat --api responses --tool '{"type":"web_search"}' --message "阿里云百炼最新功能"
```
## Routing reminders
- Generic web research the host can do, ordinary Q&A, coding, writing → host-first; do not invoke `bl` (class 1 in `bailian-protocol`). Route only when the user names Bailian / DashScope / `bl` or continues an existing `bl` workflow (class 4).
- Knowledge-base / RAG over Bailian corpora → hub skill `bailian-cli` (`bl knowledge`), not this skill.
- Summarize search results in the user's language; on the model-native path the CLI injects no default language — if a fixed language is required, pass `--system` in that language (do not hardcode 简体中文).
- Other Bailian workflows (apps / usage / config) → hub skill `bailian-cli`; media generation → `bailian-gen`; fine-tuning → `bailian-finetune`; agents.yaml → `bailian-managed-agent`. Soft hand-off by skill name: Read if installed, else `bl … --help` or prompt `bl skill init`.
## references
- [bailian-protocol](../bailian-protocol/SKILL.md) — shared protocol (install via `bl skill init`)
- skill `bailian-cli` — hub command reference for `bl search web` / `bl text chat` (soft hand-off; fallback: `--help`)
+17
View File
@@ -60,6 +60,21 @@ const GENERATED_BANNER =
"> Auto-generated from `packages/cli/src/commands.ts`. Do not edit by hand.\n" +
"> Regenerate: `pnpm --filter bailian-cli run generate:reference`.";
/**
* Optional agent-facing notice injected at the top of a group's reference file.
* Used when the hub owns the command docs but a domain skill owns the routing
* decision (e.g. web search must go through bailian-web-search first).
*/
const GROUP_AGENT_NOTICE: Readonly<Record<string, string>> = {
search:
"> **Agent routing (mandatory):** Before running any `bl search *` command, " +
"Read skill `bailian-web-search` if installed and follow its identity-based routing " +
"(Token Plan → model-native web search; default → MCP; eligible MCP failures → fall back once). " +
"Do **not** call `bl search web` directly from this reference alone — Token Plan keys cannot " +
"authorize Bailian MCP search. If that skill is missing, run `bl skill init` or fall back to " +
"`bl search web --help` / `bl text chat --help` after checking `bl config show --output json`.",
};
const AUTH_LABELS = {
apiKey: "API Key",
console: "Console",
@@ -177,11 +192,13 @@ function ownerSkillForGroup(group: string): string {
}
function buildGroupFile(group: string, groupEntries: [string, AnyCommand][]): string {
const agentNotice = GROUP_AGENT_NOTICE[group];
const lines: string[] = [
`# \`bl ${group}\` commands`,
"",
GENERATED_BANNER,
"",
...(agentNotice ? [agentNotice, ""] : []),
`Index: [index.md](index.md)`,
"",
"## Commands in this group",
+1
View File
@@ -69,6 +69,7 @@ export async function runCheck(options = {}) {
"skills/bailian-gen/SKILL.md",
"skills/bailian-finetune/SKILL.md",
"skills/bailian-managed-agent/SKILL.md",
"skills/bailian-web-search/SKILL.md",
]),
"skills/bailian-cli/reference/",
"skills/bailian-gen/reference/",