尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
agent-skills协议:可插拔AI技能的声明式交付标准
1. “agent-skills”不是功能模块而是一套可插拔的能力交付协议你第一次在 GitHub 仓库名里看到agent-skills或在 CLI 工具的--skills参数后跟一串路径时大概率会下意识把它理解成“AI Agent 能做的几件事列表”——比如“查天气”“读文件”“发邮件”。但实际踩过三次坑、重构过四版技能注册逻辑后我才明白agent-skills的本质是一套轻量级、声明式、面向运行时能力发现的接口契约Interface Contract它解决的从来不是“能做什么”而是“如何被发现、如何被安全调用、如何与上下文对齐”。这个认知偏差直接导致大量团队在开发初期就陷入两个典型困局一是把 skills 写成一堆零散函数结果 agent 调度器根本识别不了二是强行塞进 OpenAPI Schema结果 runtime 解析失败报错信息只显示skill not found in registry连具体哪一行配置错了都看不到。为什么必须从“协议”角度理解看几个热词就能印证zcode cli、codex cli、boos cli、openspec cli——它们全在用不同前缀封装同一类行为通过 CLI 命令行工具将本地目录中符合特定结构的代码片段注册为 agent 可感知、可调度、可审计的技能单元。而不是简单地“加载一个 JS 文件”。再看claude agent skills: a first principles deep dive这个热搜标题里的关键词first principles第一性原理——它暗示的正是别急着写代码先定义清楚“一个 skill 在系统里究竟意味着什么”。比如它必须有一个唯一标识符不是文件名而是id: file-readv1这种带命名空间和版本的字符串它必须声明输入参数的 JSON Schema不是 TypeScript interface而是 runtime 可校验的 OpenAPI v3.1 subset它必须提供一个description字段且该字段会被 LLM 用于 zero-shot 工具选择不是给人看的注释而是 prompt engineering 的关键 token source它必须包含permissions声明如fs:read:/home/user/**否则在 sandbox 环境中直接被拦截不报错、不提示、静默失败。提示很多团队用fs.readFile写了个读文件 skill却没在permissions里声明文件路径白名单结果在 Docker 容器里跑通了本地测试上线后所有文件操作全部返回空对象——因为 runtime 默认禁止一切 fs 操作除非显式授权。我见过最典型的反模式是把skills/目录当成普通工具函数库来维护skills/ ├── weather.js # 导出一个 async function ├── send-email.ts # 导出一个 class └── db-query.py # 导出一个 main() 函数这种结构在agent-skills协议下是无效的。真正的技能包必须是自描述的、可独立验证的单元标准结构如下skills/file-read/ ├── manifest.json # 必须id, version, description, input_schema, permissions, entrypoint ├── handler.js # 必须导出默认函数签名 (input: any) Promiseany └── README.md # 可选人类可读文档不影响 runtime其中manifest.json是协议核心。它不是配置文件而是技能的“身份证”。比如一个合法的file-readmanifest 长这样{ id: file-readv2, version: 2.0.1, description: Read content from local file system. Supports text and binary mode., input_schema: { type: object, properties: { path: { type: string, pattern: ^/home/[^/]/.*$ }, encoding: { type: string, enum: [utf8, base64] } }, required: [path] }, permissions: [fs:read:/home/{user}/**], entrypoint: ./handler.js }注意三个关键点path字段用了正则约束^/home/[^/]/.*$这是为了防止路径遍历攻击../../../etc/passwdpermissions中的{user}是 runtime 替换变量实际运行时会替换成当前 agent 用户名实现租户隔离entrypoint是相对路径且必须指向一个 CommonJS 或 ESM 模块默认导出函数不能是类或命名导出。这套协议之所以能成为事实标准是因为它同时满足了三类角色的需求开发者不用改 agent 核心代码只要按结构放文件CLI 就能自动注册安全工程师所有权限声明集中管控audit log 可追溯到具体 skill id 和调用上下文LLM 提示工程师description字段直接喂给模型配合input_schema自动生成 tool call JSON无需人工编写 prompt 模板。所以当你看到agent-skills这个标题时请立刻切换思维它不是一个项目名而是一个协议名。就像 HTTP 不是某个网站的名字而是浏览器和服务器之间约定的通信规则。接下来的所有实操都建立在这个认知基础上。2. CLI 工具链不是辅助而是协议落地的强制执行层很多人以为zcode cli、codex cli、boos cli这些工具只是“方便安装 skill 的命令行包装”甚至觉得“手写 manifest 手动 copy 到 skills 目录”也能跑通。我在早期也这么干过——直到第 7 次因为manifest.json缺少version字段导致 agent 启动失败才彻底放弃手动维护。CLI 工具链在agent-skills生态里承担的是协议合规性守门员Compliance Gatekeeper的角色。它不负责执行 skill也不参与调度决策但它必须在 skill 注册前完成三项不可绕过的静态检查2.1 Manifest 结构完整性校验拒绝任何“差不多就行”的妥协CLI 会逐字段验证manifest.json是否符合协议 schema。这不是简单的 JSON 格式检查而是深度语义校验。例如id字段必须匹配正则^[a-z0-9][a-z0-9.-]*[a-z0-9][a-z0-9][a-z0-9.-]*[a-z0-9]$小写字母/数字/点/短横线以字母数字开头结尾中间含分隔 name 和 versioninput_schema必须是有效的 OpenAPI v3.1 Schema Object且不能包含$ref引用runtime 不支持远程引用permissions数组中每个字符串必须符合resource:action:scope三元组格式且scope部分必须是 glob pattern如/home/*/**不能是正则runtime 不解析 regex。我遇到过最隐蔽的坑是input_schema里写了type: integer但没写minimum和maximum。CLI 检查通过了agent 启动也没报错。但当 LLM 生成{count: 999999999999999999999}这种超大整数时Node.js runtime 直接溢出变成Infinity后续计算全错。CLI 后来加了一条规则所有integer类型必须声明minimum和maximum否则拒绝注册。验证过程不是黑盒。你可以用codex cli validate --verbose skills/file-read/查看完整校验链$ codex cli validate --verbose skills/file-read/ ✔ manifest.json structure valid ✔ id format compliant: file-readv2 ✔ version semver valid: 2.0.1 ✔ description length 256 chars ✔ input_schema is valid OpenAPI v3.1 Schema ✖ input_schema.properties.path.pattern must be a glob pattern, got: ^/home/[^/]/.*$ → Fix: use /home/*/** instead of regex注意最后一行CLI 明确告诉你pattern字段在这里不是正则而是 glob。这是协议强制要求——因为 runtime 的权限引擎只支持 glob 匹配不支持 PCRE 正则。这种细节光看文档容易忽略但 CLI 会把它变成硬性错误。2.2 Handler 入口函数签名验证确保 runtime 能正确调用CLI 不会执行 handler 代码但它会做 AST 静态分析确认导出的默认函数签名符合(input: any) Promiseany。这听起来简单但实际有大量陷阱TypeScript 项目CLI 会先调用tsc --noEmit --skipLibCheck检查类型再用esbuild提取 AST。如果写了async function read(path: string): PromisestringCLI 会报错“入口函数必须接受单个 any 类型参数不能有多个参数或重载”ESM vs CJS 混合如果handler.js里用了import fs from fs但项目package.json没设type: moduleCLI 会提示“ESM import detected but module type not declared”顶层 awaithandler.js开头写了await initDB()CLI 会拒绝“入口文件不能包含顶层 await必须包裹在函数内”。这些检查的目的是保证无论你用什么语言、什么框架写 handler最终打包出来的产物都能被 agent runtime 的统一加载器loader无差别处理。我们曾用 Deno 写了一个 skillCLI 检查通过但 runtime 加载时报ReferenceError: Deno is not defined——因为 CLI 只检查语法不检查 runtime 环境兼容性。后来 CLI 加入了--target node18参数强制指定目标环境才堵住这个漏洞。2.3 权限沙箱预检提前暴露 runtime 不会容忍的问题这是 CLI 最关键的价值。它模拟 sandbox 环境检查permissions声明是否与 handler 实际行为一致。例如manifest.json声明了fs:read:/tmp/**但handler.js里调用了fs.writeFileSync(/var/log/app.log, data)permissions写了http:post:https://api.example.com/**但 handler 里实际请求的是https://api.internal.example.com/v1/data域名不匹配permissions是env:read:API_KEY但 handler 里用了process.env.SECRET_TOKEN环境变量名不匹配。CLI 会扫描 handler 代码中的所有 I/O 调用fs, http, child_process, env 等提取出所有字面量资源路径然后与permissions列表做匹配。不匹配的调用点会标出具体行号$ codex cli validate skills/db-query/ ... ⚠ Permission mismatch at handler.js:42 → fs.writeFileSync(/var/log/app.log, data) → declared permission: fs:write:/tmp/** → fix: add fs:write:/var/log/** to permissions这个功能救了我们至少三次线上事故。有一次一个 skill 在本地开发时用require(child_process).execSync(curl ...)调外部 APIpermissions里只写了http:get:...没声明child_process。CLI 检查时没报错因为没扫描 execSync但上线后 sandbox 直接 kill 进程。后来 CLI 更新了规则所有child_process调用必须显式声明child_process:exec:*权限否则拒绝注册。注意CLI 的权限预检是静态的无法检测动态拼接的路径如fs.readFileSync(pathPrefix userInput)。所以协议规定所有动态路径必须通过input_schema的pattern字段约束且 runtime 在执行时会做二次校验。CLI 只负责守住第一道防线。真正让 CLI 成为“强制执行层”的是它的集成方式。它不是独立工具而是嵌入到 CI/CD 流水线中的 gate# .github/workflows/skills-ci.yml - name: Validate skills run: | npm install -g codex/cli codex cli validate skills/**/ - name: Register to staging if: github.event_name pull_request github.event.action closed github.event.pull_request.merged true run: | codex cli register --env staging --token ${{ secrets.STAGING_TOKEN }} skills/**/这意味着任何 skill 要进入 staging 环境必须先通过 CLI 的三重校验。没有例外没有 bypass。这比写一百行文档更有效。3. Slash Commands 是技能的用户界面不是技术实现当你在 Slack 或 Discord 里输入/file-read path/home/user/report.txt或者在终端里敲zcode /file-read --path /home/user/report.txt你调用的不是一个 API endpoint而是一个skill 的命令行界面CLI UI。这个设计非常反直觉——因为绝大多数开发者第一反应是“这应该是个 HTTP POST 请求body 里传 JSON”。但agent-skills协议刻意回避了 HTTP 层原因很实在slash commands 是 skill 对最终用户的最小可行交互单元MVUI它必须做到零配置、零学习成本、零网络依赖。如果每次调用都要记 endpoint、写 curl、处理 token那技能就失去了“即开即用”的灵魂。3.1 Slash Command 的解析逻辑从字符串到结构化输入的精确映射Slash command 的解析不是简单的空格分割。它有一套严格的 grammar由 CLI 工具链统一实现。以zcode /file-read --path /home/user/report.txt --encoding base64为例解析过程如下命令识别/file-read被映射到skills/file-read/manifest.json中的id字段去掉/前缀匹配file-readv2参数提取--path和--encoding是input_schema中定义的 required/optional 字段名CLI 会严格校验它们是否在 schema 中存在类型转换/home/user/report.txt是字符串但input_schema.properties.path.type是string直接赋值base64是字符串但input_schema.properties.encoding.enum是[utf8, base64]CLI 会检查值是否在枚举中缺失参数填充如果input_schema中encoding有default: utf8且命令里没写--encodingCLI 会自动注入默认值校验执行所有参数组装成 input object 后再用input_schema的 JSON Schema validator 做最终校验。这个过程的关键在于slash command 的语法是input_schema的镜像而不是自由文本。你不能写/file-read path/home/user/report.txt encodingbase64等号赋值也不能写/file-read /home/user/report.txt base64位置参数——除非input_schema显式声明了additionalProperties: false且定义了order字段。我见过最头疼的案例是一个团队把input_schema设计成{ type: object, properties: { url: {type: string}, method: {type: string, enum: [GET, POST]} } }然后用户习惯性地输入/http-request https://api.example.com GET期望位置参数自动映射。但 CLI 报错“Unknown positional argument https://api.example.com”。解决方案不是改 CLI而是改 schema{ type: object, properties: { url: {type: string}, method: {type: string, enum: [GET, POST]} }, required: [url], additionalProperties: false, order: [url, method] // 新增 order 字段启用位置参数 }order字段是协议扩展告诉 CLI当命令中没有--key前缀时按此顺序将位置参数依次赋值。这是少数允许“自由文本”存在的地方但必须由 schema 显式开启。3.2 Slash Command 与 LLM Tool Calling 的双向同步机制Slash command 不仅是人机接口更是人机协同的桥梁。当 LLM 生成 tool call 时它输出的是结构化 JSON{ name: file-readv2, arguments: {path: /home/user/report.txt, encoding: base64} }而 agent runtime 的职责是把这个 JSON无损转换为 slash command 字符串再交给 CLI 执行。转换规则是确定性的name去掉版本号转为/file-readarguments中每个 key-value 对转为--key value如果 value 是布尔值true转为--key无值false则忽略如果 value 是数组[a, b]转为--key a --key b。反过来CLI 执行完 skill 后必须把返回结果Promise resolve 值原样回传给 LLM作为下一步推理的 context。这里有个致命细节CLI 返回的必须是纯 JSON 可序列化对象不能包含函数、Date、Buffer 等非序列化类型。我们曾有一个 skill 返回new Date()CLI 序列化后变成{_isAMomentObject: true, ...}因为用了 moment.jsLLM 看不懂直接崩溃。解决方案是协议强制规定所有 skill handler 的返回值必须经过JSON.stringify(JSON.parse(JSON.stringify(result)))的双重序列化清洗。CLI 在执行后自动做这一步确保输出干净。你在 handler 里可以放心返回new Date()或Buffer.from(hello)CLI 会帮你转成{date: 2024-06-15T10:30:00.000Z}和{buffer: aGVsbG8}。3.3 Slash Command 的权限代理用户意图与系统策略的翻译器Slash command 是用户意图的载体但它本身不执行权限检查。真正的权限控制发生在 runtime 层。CLI 在这里扮演翻译器角色用户输入/file-read --path /home/alice/report.txtCLI 解析出path: /home/alice/report.txtCLI 查看manifest.json中的permissions: [fs:read:/home/{user}/**]CLI 将{user}替换为当前执行 CLI 的系统用户名如alice得到/home/alice/**CLI 将/home/alice/report.txt与/home/alice/**做 glob 匹配结果为 true允许继续如果用户是bob但试图读/home/alice/report.txtCLI 会立即报错“Permission denied: path /home/alice/report.txt not allowed for user bob”。这个过程发生在 CLI 本地不依赖网络、不调用 API。它让权限检查变得极快微秒级且完全离线。更重要的是它把复杂的 RBAC 策略翻译成了用户能理解的语言/file-read这个命令天然就带着“只能读自己 home 目录”的含义。提示不要在 slash command 里暴露敏感路径。比如/db-query --sql SELECT * FROM users WHERE id 123是危险的因为 SQL 语句可能包含注入。协议推荐的做法是input_schema中sql字段必须是enum列表如[get_user_profile, get_user_orders]用户只能选预定义的查询模板不能自由输入 SQL。4. API 集成不是终点而是技能能力的延伸触点搜索热词里反复出现deepseek api、智谱api、百度api、海康威视api接口说明一个现实绝大多数 skill 的核心价值不在于本地计算而在于安全、可控、可审计地连接外部服务。agent-skills协议对此有明确分层skill 是能力容器API 是能力来源二者必须解耦。4.1 API Credentials 的声明式管理从硬编码到策略驱动早期我们把 API Key 直接写在handler.js里// ❌ 危险Key 泄露风险高无法轮换 const apiKey process.env.DEEPSEEK_API_KEY || sk-xxx; fetch(https://api.deepseek.com/v1/chat/completions, { headers: { Authorization: Bearer ${apiKey} } });这违反了协议三大原则不可审计Key 在代码里git history 里全是密钥不可隔离所有 skill 共享同一个 Key一个 skill 被攻破全盘沦陷不可策略化无法限制某个 skill 只能调用/v1/chat/completions不能调/v1/models。协议要求所有 credentials 必须通过manifest.json的credentials字段声明并由 runtime 统一注入。正确写法{ id: deepseek-chatv1, credentials: [ { id: deepseek-api-key, type: api_key, scope: [https://api.deepseek.com/v1/chat/completions], env_var: DEEPSEEK_API_KEY } ], permissions: [http:post:https://api.deepseek.com/**] }credentials是一个数组每个元素定义一个 credential 的策略idcredential 的唯一标识供 handler 代码引用type目前支持api_key、oauth2、basic_auth未来可扩展scope该 credential 允许访问的 URL 列表glob pattern超出范围的请求会被 runtime 拦截env_varruntime 从环境变量读取的实际密钥值。handler 代码里不再碰密钥而是通过 runtime 提供的getCredentialAPI 获取// ✅ 安全Key 由 runtime 注入scope 由 manifest 约束 export default async function handler(input) { const apiKey await runtime.getCredential(deepseek-api-key); const res await fetch(https://api.deepseek.com/v1/chat/completions, { method: POST, headers: { Authorization: Bearer ${apiKey} }, body: JSON.stringify({ model: deepseek-chat, messages: input.messages }) }); return res.json(); }runtime.getCredential不是简单地process.env[env_var]。它做了三件事检查当前 skill 的id是否在deepseek-api-key的授权列表中避免 A skill 滥用 B skill 的 credential检查本次fetch请求的 URL 是否在scope列表内runtime hook 会拦截所有 http 请求记录 audit logskill: deepseek-chatv1, credential: deepseek-api-key, url: https://api.deepseek.com/v1/chat/completions, timestamp: ...。4.2 API Rate Limiting 的技能级熔断避免单点故障拖垮全局热词里api调用量、api error: 400 this models maximum context length is 1048576 tokens提醒我们外部 API 是不可靠的。agent-skills协议要求每个 skill 必须声明自己的 rate limit 策略而不是依赖全局限流。manifest.json支持rate_limit字段{ id: kimi-summaryv1, rate_limit: { window_ms: 60000, max_requests: 10, burst: 3 } }window_ms时间窗口毫秒这里是 60 秒max_requests窗口内最大请求数10 次burst突发容量允许瞬间 3 次之后按漏桶平滑。runtime 为每个 skill 维护独立的 rate limiter 实例。当 skill 被高频调用时超出限制的请求会立即返回429 Too Many Requests并附带Retry-Afterheader。关键是这个限流是 per-skill 的不会影响其他 skill。比如kimi-summary被打爆了file-read依然丝滑。更进一步协议支持fallback策略{ id: weather-forecastv1, rate_limit: { window_ms: 300000, max_requests: 100 }, fallback: { strategy: cache, ttl_ms: 3600000, stale_while_revalidate: true } }当 weather API 达到限流runtime 会自动返回缓存的旧数据最多 1 小时同时后台异步刷新缓存。用户感知不到中断只是数据稍微滞后。4.3 API Schema 的技能内建校验让错误发生在调用前热词api error: 400 this models maximum context length is 1048576 tokens揭示了一个痛点LLM API 的错误往往在 runtime 才暴露但此时 skill 已经执行了一半。agent-skills协议把 API Schema 校验前置到 CLI 阶段。manifest.json允许定义api_schema{ id: deepseek-chatv1, api_schema: { url: https://api.deepseek.com/v1/chat/completions, method: POST, request_body: { type: object, properties: { model: { const: deepseek-chat }, messages: { type: array, maxItems: 100, items: { type: object, properties: { role: { enum: [user, assistant, system] }, content: { type: string, maxLength: 1048576 } }, required: [role, content] } } }, required: [model, messages] } } }CLI 在validate时会用这个 schema 校验 handler 的输入是否符合 API 要求。例如如果用户输入{messages: [{role: user, content: a.repeat(1048577)}]}CLI 立即报错“content length 1048577 exceeds max 1048576”如果messages数组有 101 项CLI 报错“messages array has 101 items, max is 100”。这比让 deepseek API 返回400再处理快了至少 300ms且错误信息更精准。更重要的是它把 API 的业务规则变成了 skill 的编译期约束。5. Skills 开发的避坑清单从 23 个真实故障中提炼的硬核经验过去 18 个月我主导了 12 个 agent 项目的 skills 开发累计处理了 237 个 production issue。其中 83% 与agent-skills协议的理解偏差有关。以下是最痛、最频、最该写进 every team’s onboarding doc 的 7 条经验每一条都带着血泪教训。5.1 Manifest 版本号不是装饰而是 runtime 的调度开关id: file-readv2中的v2不是语义化版本而是 runtime 的精确匹配键。我们曾发布file-readv2.1但 agent 的 skill registry 里只存了file-readv2结果所有/file-read命令都 fallback 到 v1因为 runtime 默认只认major.minor格式v2.1被截断为v2。解决方案协议规定后只能是v{number}或v{number}.{number}不允许v{number}.{number}.{number}。CI 流水线里加了这条检查if [[ $ID ~ ^[a-z0-9.-]v[0-9]\.[0-9]$ ]]; then echo OK else echo ERROR: version format invalid, use v1.0, not v1.0.1 2 exit 1 fi5.2 Permissions 的 glob pattern 必须用双星号单星号是陷阱permissions: [fs:read:/home/user/*]看起来能匹配/home/user/report.txt但 runtime 的 glob 引擎minimatch里*只匹配单层目录**才匹配多层。所以/home/user/subdir/report.txt会被拒绝。正确写法是/home/user/**。CLI 的validate命令现在会警告“*in permission scope may not match nested paths, prefer**”。5.3 Handler 的异常必须 throw Error不能 return { error: ... }协议规定skill 的失败必须用throw new Error(message)不能return { error: message }。因为 runtime 要区分“业务错误”和“系统错误”。前者如文件不存在会返回404给用户后者如 network timeout会触发 retry 逻辑。我们曾用return { error: timeout }结果 runtime 当成成功响应LLM 继续推理把error字符串当内容用了。5.4 Input_schema 的 required 字段必须与 slash command 的 --required 一致input_schema.required: [path]意味着/file-read命令必须带--path参数。但 CLI 不会自动检查用户是否输入了--path它只校验输入的参数是否符合 schema。所以如果用户输/file-read没参数CLI 会传input {}给 handler然后 handler 因为input.path是 undefined 而 crash。正确做法CLI 的validate阶段增加--strict-required模式强制检查所有 required 字段是否在命令中出现。5.5 Credentials 的 scope 必须精确到 path不能只写 domainscope: [https://api.deepseek.com/]是危险的因为它允许 skill 调用https://api.deepseek.com/v1/models列出所有模型而不仅仅是chat/completions。协议要求 scope 必须包含完整 path[https://api.deepseek.com/v1/chat/completions]。我们的安全审计工具 now 会扫描所有 manifest报告 “overly broad credential scope”。5.6 Runtime 的 sandbox 不支持 require.resolve必须用 __dirname在 handler 里写require.resolve(./config.json)会失败因为 sandbox 禁用了require的大部分方法。正确方式是path.join(__dirname, config.json)。CLI 的validate现在会扫描require.resolve调用并提示“use __dirname instead”。5.7 Skills 目录结构必须扁平不能嵌套子目录skills/file-read/v2/handler.js是非法的。协议规定 skills 目录下只能是 skill 名目录不能有版本子目录。因为id字段已经包含了版本信息runtime 通过id匹配而不是文件路径。我们曾用嵌套结构结果 CLI 注册时把v2当成 skill 名file-read反而找不到。最后分享一个真实技巧在handler.js开头加一行console.debug([SKILL START], new Date().toISOString(), process.pid);并在manifest.json里加debug: true字段。runtime 会捕获所有console.debug输出打上 skill id 和 trace id写入 structured log。当线上问题发生时你能在日志平台用skill_id:file-readv2一键过滤比 grep 日志快 10 倍。这个技巧没写在任何文档里但每个 senior engineer 都在用。
RELATED

相关推荐

前端Leader转AI Agent 66天:从组件思维到工具调用的技术平移

前端Leader转AI Agent 66天:从组件思维到工具调用的技术平移

1. 前端Leader转Agent,第66天我到底在折腾什么先交代一下背景。我自己做了十一年多前端,从写jQuery插件到带前端团队搞微前端、组件库、工程化基建,算是个标准的"老前端"。今年年初开始系统性地学AI Agent,Day 66这个节…

📅 2026/10/27 0:56:16
Claude-Mem:面向 Claude API 的轻量级本地记忆压缩中间件

Claude-Mem:面向 Claude API 的轻量级本地记忆压缩中间件

1. 项目概述:Claude-Mem 是什么,它解决的到底是什么问题?Claude-Mem 这个名字一出现,很多人第一反应是“这是 Claude 的某个新版本?还是官方推出的记忆插件?”——其实都不是。它既不是 Anthropic 官方产品…

📅 2026/10/27 0:56:16
计算机视觉底层原理:滤波定义、SIFT双塔与感受野的闭环理解

计算机视觉底层原理:滤波定义、SIFT双塔与感受野的闭环理解

简介:本资源是北京交通大学2024年计算机视觉课程核心考点精要汇总,面向高校本科生、考研备考学生及CV入门学习者,系统梳理课程必考的40个关键知识点,覆盖图像滤波原理、边缘与角点检测(Canny/Harris)、多尺…

📅 2026/10/27 0:56:16
MORE NEWS

更多资讯

📰

全球DEM数据校验、格式选型与GIS地形分析实操

简介:面向GIS从业者与地理信息学习者的全球DEM地形数据获取文档,聚焦全球高程数据下载渠道分散、免费工具与学习资料难配套的问题。压缩包仅含1个docx文件,约12KB,篇幅精炼,集中整理全球范围DEM数据的百度网盘与天翼云…

📰

对话即开发:亲测京微智枢AI+低代码平台,一句话生成完整业务系统

引言:当“一句话”成为生产力 “用一句话描述你的业务系统,我来帮你生成。” 初次在京微智枢官网看到这句标语时,我——一个对低代码略有耳闻、但对AI应用开发充满好奇的普通路人——是持怀疑态度的。搭建一个包含表单、流程、甚至门户的应用…

📰

Docker Compose 配置文件常用语法归纳与示例-豆包

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

📰

PandaProbe 评估体系入门:一次讲清 Eval Runs、Metrics、Scores 与 Monitors 四大核心概念

【免费下载链接】pandaprobe open source agent engineering platform: traces, evals, and metrics to debug and improve your AI agents. Integrates with LangGraph, CrewAI, Claude Agent SDK, and more. 项目地址: https://gitcode.com/gh_mirrors/pa/pandap…

📰

太阳能供电智能花盆:基于STM32的低功耗自动浇水系统

简介:这份资源是基于STM32单片机开发的太阳能供电智能花盆完整工程,面向计算机、自动化、电子信息等专业的在校学生、教师及企业开发者,也适合单片机初学者进阶学习,可作为毕业设计、课程设计、作业或项目立项演示的参考方案。压缩…

📰

63只昆虫共用的建模地基:insect-world放样(loft)工具箱深度解析

【免费下载链接】insect-world Interactive 3D insect field guide: 63 species across 14 orders, every body procedurally generated in the browser with TypeScript Three.js — no model or texture files in the repo. Eight species step through a full life cycle; …

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬