{"id":"417b63b7-7743-428f-8985-1846a6c3fcf2","slug":"tanso","kind":"skill","name":"tanso","summary":"Agent-friendly AI Search CLI for Chinese web signals, powered by Bocha, Zhihu, and Volcengine Ark.","owner":"geekjourneyx","repoUrl":"https://github.com/geekjourneyx/tanso","license":"MIT","licenseTier":"permissive","trust":"community","stars":19,"match":null,"fewStars":false,"format":"skill","createdAt":null,"addedAt":"2026-10-14T05:56:17.733Z","logoUrl":"https://avatars.githubusercontent.com/u/24422856?u=4e2cae90fdc8fa45e3067cbc56b862300f40765a&v=4","linkOnly":false,"collection":null,"skillPath":null,"categories":["search"],"tags":["bocha","cli","developer-tools","go","json-output","volcengine","web-search","zhihu"],"runtime":"node","local":true,"cloudCapable":false,"cloudCapability":"unknown","cloudReadyOnPlatform":false,"needsApiKey":false,"reviewed":false,"syncedAt":"2026-10-14T08:26:11.489Z","sample":false,"url":"https://conduits.dev/tools/tanso","language":"Go","transports":["stdio"],"install":{"npm":"@geekjourneyx/tanso"},"requirements":{"env":[],"upstreamMayCharge":false},"tools":null,"readme":"<div align=\"center\">\n\n# Tanso\n\n**Search Chinese web sources from one Go CLI.**\n\n<img src=\"assets/banner.webp\" alt=\"Tanso - Chinese web sources from one Go CLI\" width=\"100%\">\n\n[![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg)](./LICENSE)\n[![Go](https://img.shields.io/badge/Go-1.23+-00ADD8.svg)](./go.mod)\n\n</div>\n\nTanso queries Bocha, Volcengine Ark, and Zhihu through provider APIs, then returns normalized terminal output or automation-safe JSON. The name comes from the feel of \"探索 / 探索する\": Tanso explores Chinese internet signals for developers, AI agents, and research workflows without scraping, browser sessions, or hidden side effects.\n\n## Install\n\nRecommended:\n\n```bash\nnpm install -g @geekjourneyx/tanso\ntanso version\n```\n\nThe npm package installs the matching GitHub Release binary for your platform and verifies it against `SHA256SUMS`.\n\nAlternative Go install:\n\n```bash\ngo install github.com/geekjourneyx/tanso/cmd/tanso@v2.0.2\n```\n\nPrebuilt binaries and checksums are available on the [GitHub Releases](https://github.com/geekjourneyx/tanso/releases) page.\n\nFrom a local checkout:\n\n```bash\nmake build\n./tanso version\n```\n\n## Configure\n\nInitialize the default config file:\n\n```bash\ntanso config init\ntanso config path\n```\n\nThis creates a config file at Tanso's stable user config path:\n\n| Platform | Default path |\n| --- | --- |\n| macOS/Linux | `~/.config/tanso/config.yaml` |\n| Windows | `%USERPROFILE%\\.config\\tanso\\config.yaml` |\n\nIf `XDG_CONFIG_HOME` is set, Tanso uses `$XDG_CONFIG_HOME/tanso/config.yaml`.\n\nRun `tanso config path` for the exact path on your machine.\n\nEdit that file and set the credentials for the providers you want to use:\n\n| Provider | Environment variables |\n| --- | --- |\n| Bocha | `BOCHA_API_KEY` |\n| Volcengine Ark | `ARK_API_KEY` or `VOLCENGINE_API_KEY` |\n| Zhihu | `ZHIHU_ACCESS_SECRET` or `ZHIHU_API_KEY` |\n\nThe config file uses the same provider fields:\n\n```yaml\nbocha:\n  api_key: \"\"\n\nvolcengine:\n  api_key: \"\"\n  model: doubao-seed-2-0-lite-260215\n\nzhihu:\n  access_secret: \"\"\n```\n\nConfiguration path resolution is:\n\n1. `--config`\n2. `TANSO_CONFIG`\n3. `$XDG_CONFIG_HOME/tanso/config.yaml`, when `XDG_CONFIG_HOME` is set\n4. `~/.config/tanso/config.yaml`\n\nConfiguration value precedence is:\n\n1. Provider environment variables\n2. Config file values\n3. Built-in defaults\n\nInspect the merged config without leaking secrets:\n\n```bash\ntanso config show --json\n```\n\n`tanso sources --json` is an inventory endpoint. Its `configured` field only means\nlocal credential material is present after config/env resolution; it is not a live\nauthentication check. Use a real source query to verify whether credentials work.\n\nBefore publishing a release, verify version alignment across `package.json`, `Makefile`, `CHANGELOG.md`, and the release tag:\n\n```bash\nmake version-check\nmake release-check\n```\n\n## Quick Start\n\n```bash\ntanso version\ntanso --help\ntanso sources --json\ntanso skills list --json\ntanso skills read tanso --json\n\ntanso \"AI Agent 商业化\" --json\ntanso all \"AI Agent 商业化\" --json\ntanso \"AI Agent 商业化\" --source bocha_web --source zhihu_search --json\nBOCHA_API_KEY=... tanso bocha \"AI Agent 商业化\" --json\nBOCHA_API_KEY=... tanso bocha \"微信 AI Agent\" --json\nARK_API_KEY=... tanso volc \"瑞幸咖啡 2026 门店数是否可信\" --json\nZHIHU_ACCESS_SECRET=... tanso zhihu \"AI 搜索\" --json\nZHIHU_ACCESS_SECRET=... tanso zhihu web \"ChatGPT 桌面版\" --json\nZHIHU_ACCESS_SECRET=... tanso zhihu hot --json\n```\n\nHuman output defaults to a table. Use `--json` for scripts, agents, CI, and downstream tools. Use `tanso --help` or `tanso <command> --help` to inspect the installed CLI surface.\n\n## Agent Skill\n\nRecommended Agent Skills install:\n\n```bash\nnpx skills add geekjourneyx/tanso\n```\n\nTanso also ships the same Agent SOP with the CLI package so agents can read instructions that match the executable on `PATH`:\n\n```bash\ntanso skills list --json\ntanso skills read tanso\ntanso skills read tanso --json\n```\n\n`skills read` defaults to raw Markdown for direct agent context. With `--json`, the same content is returned in the `content` field with version metadata. Use this when you need to verify the SOP bundled with the installed CLI.\n\n## Output\n\nRetrieval commands return a stable envelope. A successful JSON response looks like this:\n\n```json\n{\n  \"version\": \"2.0.2\",\n  \"query\": {\n    \"text\": \"AI Agent 商业化\",\n    \"mode\": \"search\",\n    \"sources\": [\"bocha_web\"],\n    \"limit\": 10\n  },\n  \"status\": \"ok\",\n  \"results\": [\n    {\n      \"source\": \"bocha_web\",\n      \"title\": \"Example result title\",\n      \"url\": \"https://example.com/article\",\n      \"snippet\": \"A normalized summary from the provider response.\"\n    }\n  ],\n  \"source_status\": [\n    {\n      \"source\": \"bocha_web\",\n      \"status\": \"ok\",\n      \"results\": 1,\n      \"effective_limit\": 10,\n      \"duration_ms\": 842,\n      \"error\": null\n    }\n  ],\n  \"errors\": []\n}\n```\n\nExit codes are part of the public contract:\n\n| Code | Meaning |\n| --- | --- |\n| `0` | Success |\n| `1` | Partial success |\n| `2` | Invalid argument |\n| `3` | Config error |\n| `4` | Credential missing |\n| `5` | Source error |\n| `6` | Timeout |\n| `7` | No results |\n| `9` | Internal error |\n\n## Sources\n\n| Source ID | Command | Provider | Capability |\n| --- | --- | --- | --- |\n| `bocha_web` | `tanso bocha` | Bocha | Web search |\n| `volcengine_answer` | `tanso volc` | Volcengine Ark | Web-grounded answer |\n| `zhihu_search` | `tanso zhihu` | Zhihu | In-site search |\n| `zhihu_web` | `tanso zhihu web` | Zhihu | Global web search |\n| `zhihu_hot` | `tanso zhihu hot` | Zhihu | Hotlist |\n\nZhihu global search supports provider-specific filters:\n\n```bash\ntanso zhihu web \"ChatGPT 桌面版\" \\\n  --filter 'host==\"example.com\"' \\\n  --search-db realtime \\\n  --json\n```\n\n`--filter` and `--search-db` are only valid for `tanso zhihu web`.\n\n## Automation Contract\n\nTanso keeps the automation contract narrow and predictable:\n\n- stdout is reserved for results.\n- stderr is reserved for diagnostics.\n- JSON output keeps source IDs, source status, error codes, and exit codes stable.\n- Provider behavior stays behind typed Go adapters.\n- Built-in timeout defaults to `45s`; override it with `--timeout` when a workflow needs a different budget.\n\n## Development\n\n```bash\nmake build\nmake test\nmake lint\nmake release-check\n```\n\nThe normal test suite does not require real provider credentials. Real API smoke checks are separate:\n\n```bash\nmake smoke-bocha\nmake smoke-volcengine\nmake smoke-zhihu\n```\n\n## Non-Goals\n\nTanso v1.0.0 intentionally does not implement browser scraping, cache, reranking, plugin runtime, MCP, stdin query input, Bocha image search, or Zhihu direct answer. Those boundaries keep the CLI small, testable, and stable.\n\n## License\n\n[MIT](./LICENSE)\n\n## Author\n\n- Website: [jieni.ai](https://jieni.ai)\n- GitHub: [@geekjourneyx](https://github.com/geekjourneyx)\n- X: [@seekjourney](https://x.com/seekjourney)\n- WeChat Official Account: 极客杰尼\n"}