Skill: mrhenghu/autoglm-deepresearch (version 1.0.0)

--- name: autoglm-deepresearch description: > 对用户提出的课题进行深度研究和调研，输出结构化的深度报告。当用户需要深入了解某个话题、做行业调研、专题研究、竞品分析等场景时使用此 skill。 与普通搜索不同，deepresearch 会先做少量定向搜索，再对少量关键页面进行深度阅读，过程中优先展示中间发现，最后再做总结，避免因调用次数过多导致响应过慢。 Token 通过本地服务 http://127.0.0.1:53699/get_token 自动获取，无需手动配置环境变量。 compatibility: requires: - Python 3.x（标准库，无需额外安装） --- # AutoGLM DeepResearch Skill 对用户课题进行少量搜索 + 有限深读，先展示中间结果，再生成结构化调研报告。 --- ## 依赖 API ### 1. Web Search — 搜索网页 | 项目 | 内容 | |------|------| | 地址 | `https://autoglm-api.zhipuai.cn/agentdr/v1/assistant/skills/web-search` | | 方式 | POST | | 请求体 | `{"queries": [{"query": "<搜索词>"}]}` | | 返回 | `data.results[].webPages.value[]` → `name / url / snippet` | ### 2. Open Link — 打开页面获取详细内容 | 项目 | 内容 | |------|------| | 地址 | `https://autoglm-api.zhipuai.cn/agentdr/v1/assistant/skills/open-link` | | 方式 | POST | | 请求体 | `{"url": "<页面链接>"}` | | 返回 | `data.text` → 页面正文内容 | 脚本启动时会先向本地服务发起 HTTP GET 请求获取 token： | 项目 | 内容 | |------|------| | 地址 | `http://127.0.0.1:53699/get_token` | | 方式 | GET | | 返回 | `Bearer xxx`（直接作为 Authorization 头使用） | > 若返回值不含 `Bearer` 前缀，脚本会自动补全。 两个 API 使用相同的签名 Headers： - `X-Auth-Appid`: `100003` - `X-Auth-TimeStamp`: 当前秒级 Unix 时间戳 - `X-Auth-Sign`: MD5(`100003 + "&" + timestamp + "&" + 38d2391985e2369a5fb8227d8e6cd5e5`) --- ## 执行脚本 使用同目录下的脚本： ```bash # 搜索 python web-search.py "搜索关键词" # 打开页面 python open-link.py "https://example.com" ``` --- ## 深度研究流程 收到用户的研究课题后，按以下步骤执行： ### Step 1：拆解子问题 将课题拆解为 1～2 个最关键的搜索方向，不要扩散成过多子问题。优先选择最能直接回答用户问题的维度，例如： - 背景与定义 - 最新现状 / 关键数据 - 代表性案例（仅在确有必要时） 如果用户的问题本身已经很具体，可以直接进入搜索，不必额外拆很多子问题。 ### Step 2：多轮搜索 调用 `web-search.py` 进行 **1～2 次搜索**，总量必须受控： - 默认先做 1 次搜索。 - 只有当第一次搜索结果明显不够、结果质量差、或缺少关键维度时，才进行第 2 次搜索。 - 不要为了“完整性”机械扩展搜索轮次。 每次搜索后，先整理并向用户呈现中间结果，再决定是否继续。中间结果至少应包含： - 本次搜索使用的查询词 - 2～5 条最相关结果的 `name / url / snippet` - 对当前信息是否足够的简短判断 ### Step 3：筛选重要页面并深度阅读 从搜索结果中筛选 **1～3 个** 最相关的页面 URL，再调用 `open-link.py` 获取页面全文（`data.text`）。 控制规则： - 默认只打开 1 个页面。 - 仅当第 1 个页面信息不足、存在明显缺口、或需要交叉验证时，再增加到 2 或 3 个。 - 不要批量打开多个相似来源。 筛选标准： - snippet 信息量丰富、与课题高度相关 - 来源权威（官方网站、知名媒体、学术机构） - 避免重复来源 每次打开页面后，也应先展示中间提炼结果，再继续下一步。中间结果建议包含： - 页面标题或 URL - 3～6 条关键信息点 - 与用户问题的相关性说明 如果前 1～2 个页面已经足够回答问题，应停止继续调用。 ### Step 4：综合分析，生成报告 在完成有限搜索和有限深读后，先给出一个简短的“中间结论 / 当前发现”小节，再输出最终总结。 整合所有搜索 snippet 和页面全文，按以下结构输出报告： ``` # [课题名称] 深度调研报告 ## 中间发现 （先列出搜索和页面阅读阶段已经确认的关键事实、主要来源、仍未确认的点） ## 概述 （2～3 句话概括核心结论） ## 背景 （课题的基本定义、背景信息） ## 现状分析 （关键数据、现状描述） ## 典型案例 / 代表性观点 （具体案例或多方观点） ## 发展趋势 （未来走向判断） ## 总结 （综合结论与建议） ## 参考来源 1. [页面标题](URL) 2. [页面标题](URL) ... ``` ## 执行约束 - `web-search.py` 最多调用 2 次。 - `open-link.py` 最多调用 3 次。 - 优先少调用、快返回；够用即可，不追求“穷尽式”检索。 - 每一轮搜索或打开页面后，都尽量把中间结果先展示出来。 - 当已有信息足以回答用户问题时，立即停止进一步调用并进入总结。

path: open-link.py
content: #!/usr/bin/env python3
# open-link.py — AutoGLM Open Link（获取页面详细内容）
# 用法: python open-link.py "https://example.com"

import sys
import time
import hashlib
import json
import urllib.request
import urllib.error

APP_ID = "100003"
APP_KEY = "38d2391985e2369a5fb8227d8e6cd5e5"
URL = "https://autoglm-api.zhipuai.cn/agentdr/v1/assistant/skills/open-link"
TOKEN_URL = "http://127.0.0.1:53699/get_token"


def generate_sign(app_id: str, timestamp: int, app_key: str) -> str:
    raw = f"{app_id}&{timestamp}&{app_key}"
    return hashlib.md5(raw.encode()).hexdigest()


def get_token() -> str:
    try:
        with urllib.request.urlopen(TOKEN_URL) as resp:
            [REDACTED_SECRET]).decode("utf-8").strip()
    except Exception as e:
        print(f"ERROR: 无法从本地服务获取 token: {e}")
        sys.exit(1)

    if not [REDACTED_SECRET]"ERROR: 获取到的 token 为空。")
        sys.exit(1)

    if not token.lower().startswith("bearer "):
        token = f"Bearer {token}"

    return token


def open_link(link: str) -> dict:
    [REDACTED_SECRET])

    timestamp = int(time.time())
    sign = generate_sign(APP_ID, timestamp, APP_KEY)

    payload = json.dumps({"url": link}).encode("utf-8")
    req = urllib.request.Request(URL, data=payload, method="POST")
    req.add_header("Authorization", token)
    req.add_header("Content-Type", "application/json")
    req.add_header("X-Auth-Appid", APP_ID)
    req.add_header("X-Auth-TimeStamp", str(timestamp))
    req.add_header("X-Auth-Sign", sign)

    try:
        with urllib.request.urlopen(req) as resp:
            return json.loads(resp.read().decode("utf-8"))
    except urllib.error.HTTPError as e:
        print(f"HTTP {e.code}: {e.read().decode()}")
        sys.exit(1)
    except urllib.error.URLError as e:
        print(f"请求失败: {e.reason}")
        sys.exit(1)


def main():
    if len(sys.argv) < 2 or not sys.argv[1].strip():
        print('用法: python open-link.py "https://example.com"')
        sys.exit(1)

    link = sys.argv[1].strip()
    response = open_link(link)
    print(json.dumps(response, ensure_ascii=False, indent=2))


if __name__ == "__main__":
    main()


path: web-search.py
content: #!/usr/bin/env python3
# web-search.py — AutoGLM Web Search
# 用法: python web-search.py "搜索关键词"

import sys
import time
import hashlib
import json
import urllib.request
import urllib.error

APP_ID = "100003"
APP_KEY = "38d2391985e2369a5fb8227d8e6cd5e5"
URL = "https://autoglm-api.zhipuai.cn/agentdr/v1/assistant/skills/web-search"
TOKEN_URL = "http://127.0.0.1:53699/get_token"


def generate_sign(app_id: str, timestamp: int, app_key: str) -> str:
    raw = f"{app_id}&{timestamp}&{app_key}"
    return hashlib.md5(raw.encode()).hexdigest()


def get_token() -> str:
    try:
        with urllib.request.urlopen(TOKEN_URL) as resp:
            [REDACTED_SECRET]).decode("utf-8").strip()
    except Exception as e:
        print(f"ERROR: 无法从本地服务获取 token: {e}")
        sys.exit(1)

    if not [REDACTED_SECRET]"ERROR: 获取到的 token 为空。")
        sys.exit(1)

    if not token.lower().startswith("bearer "):
        token = f"Bearer {token}"

    return token


def web_search(query: str) -> dict:
    [REDACTED_SECRET])

    timestamp = int(time.time())
    sign = generate_sign(APP_ID, timestamp, APP_KEY)

    payload = json.dumps({"queries": [{"query": query}]}).encode("utf-8")
    req = urllib.request.Request(URL, data=payload, method="POST")
    req.add_header("Authorization", token)
    req.add_header("Content-Type", "application/json")
    req.add_header("X-Auth-Appid", APP_ID)
    req.add_header("X-Auth-TimeStamp", str(timestamp))
    req.add_header("X-Auth-Sign", sign)

    try:
        with urllib.request.urlopen(req) as resp:
            return json.loads(resp.read().decode("utf-8"))
    except urllib.error.HTTPError as e:
        print(f"HTTP {e.code}: {e.read().decode()}")
        sys.exit(1)
    except urllib.error.URLError as e:
        print(f"请求失败: {e.reason}")
        sys.exit(1)


def main():
    if len(sys.argv) < 2 or not sys.argv[1].strip():
        print('用法: python web-search.py "搜索关键词"')
        sys.exit(1)

    query = sys.argv[1].strip()
    response = web_search(query)
    print(json.dumps(response, ensure_ascii=False, indent=2))


if __name__ == "__main__":
    main()


Security scan verdicts — ClawScan: clean | static analysis: clean | VirusTotal: clean | SkillSpector: suspicious (CRITICAL)