在这里插入图片描述

你用WorkBuddy已经很顺手了,但有没有想过:能不能把WorkBuddy的能力集成到你自己的应用里?能不能用代码批量管理技能、创建任务?答案就藏在WorkBuddy API里。这是一个被大多数用户忽略,但对开发者来说价值巨大的功能。本文将深度拆解WorkBuddy的API体系,带你打开「AI能力编程」的大门。

一、WorkBuddy API的本质——不只是「接口」

1.1 什么是WorkBuddy API?

WorkBuddy API是WorkBuddy提供的编程接口,让你可以用代码(而非手动操作UI)来:

  • 管理技能和专家
  • 创建和执行任务
  • 查询历史记录和统计数据
  • 集成到第三方系统

类比来说,WorkBuddy API就像给WorkBuddy装了一个「编程遥控器」。你不再需要手动点击界面,而是可以用代码批量控制、自动化操作、集成到其他系统。

1.2 API vs UI:两种交互方式的对比

维度 UI操作 API调用
适用场景 单次、手动、探索性操作 批量、自动化、系统集成
效率 低(需要手动点击) 高(代码批量执行)
可复用性 低(每次都要手动) 高(脚本可重复运行)
学习成本 低(点点鼠标) 中(需要懂编程)
适用人群 普通用户 开发者、运维、数据分析师
示例 手动创建一个技能 用脚本批量导入100个技能

核心区别:UI是「手动挡」,API是「自动挡」。

1.3 WorkBuddy API的架构设计

WorkBuddy API采用RESTful风格设计,遵循以下原则:

客户端(你的代码)
    ↓ HTTP请求(JSON格式)
WorkBuddy API服务器
    ↓ 处理请求
返回JSON响应

关键设计特征

  1. 无状态:每个请求都包含完整信息,服务器不保存会话
  2. 资源导向:API围绕「资源」(如技能、任务、专家)设计
  3. 统一接口:使用标准的HTTP方法(GET/POST/PUT/DELETE)
  4. JSON格式:请求和响应都使用JSON,易于解析

二、API架构深度拆解——四大核心模块

2.1 模块1:认证与授权

所有API调用都需要认证,WorkBuddy支持两种认证方式:

方式1:API Key认证(推荐)
# 在请求头中添加API Key
curl -H "Authorization: Bearer YOUR_API_KEY" \
     https://api.workbuddy.ai/v1/skills

获取API Key的步骤

  1. 登录WorkBuddy网页版
  2. 进入「设置」→「开发者选项」→「API Key管理」
  3. 点击「生成新Key」,设置权限和过期时间
  4. 复制Key并妥善保存(只显示一次)
方式2:OAuth 2.0认证(企业级)

适用于需要代表用户操作第三方应用的场景:

# OAuth 2.0认证流程(伪代码)
from workbuddy import WorkBuddyOAuth

# 1. 重定向用户到授权页面
auth_url = WorkBuddyOAuth.get_auth_url(
    client_id="YOUR_CLIENT_ID",
    redirect_uri="https://your-app.com/callback",
    scope=["skills:read", "tasks:write"]
)

# 2. 用户授权后,回调你的服务器,携带code
code = request.args.get("code")

# 3. 用code换取access_token
token = WorkBuddyOAuth.exchange_code(code)

# 4. 用access_token调用API
headers = {"Authorization": f"Bearer {token['access_token']}"}

权限范围(Scope)

Scope 说明 示例操作
skills:read 读取技能信息 列出所有技能
skills:write 创建/修改技能 创建新技能
tasks:read 读取任务信息 查看任务执行历史
tasks:write 创建/修改任务 提交新任务
experts:read 读取专家信息 列出所有专家
experts:write 创建/修改专家 创建新专家

2.2 模块2:技能管理API

这是最常用的API模块,让你可以用代码管理技能。

核心接口列表:
接口 方法 路径 功能
列出技能 GET /v1/skills 获取技能列表
获取技能详情 GET /v1/skills/{skill_id} 获取单个技能详情
创建技能 POST /v1/skills 创建新技能
更新技能 PUT /v1/skills/{skill_id} 更新技能信息
删除技能 DELETE /v1/skills/{skill_id} 删除技能
导出技能 GET /v1/skills/{skill_id}/export 导出技能包
导入技能 POST /v1/skills/import 导入技能包
实战示例1:列出所有技能
import requests

API_BASE = "https://api.workbuddy.ai/v1"
API_KEY = "YOUR_API_KEY"

headers = {
    "Authorization": f"Bearer {API_KEY}",
    "Content-Type": "application/json"
}

# 列出所有技能
response = requests.get(f"{API_BASE}/skills", headers=headers)
skills = response.json()

for skill in skills['data']:
    print(f"ID: {skill['id']}, 名称: {skill['name']}, 版本: {skill['version']}")

响应示例

{
  "code": 0,
  "data": [
    {
      "id": "skill_12345",
      "name": "github-manager",
      "display_name": "GitHub仓库管理",
      "version": "1.0.0",
      "created_at": "2026-01-15T10:30:00Z",
      "updated_at": "2026-01-16T08:20:00Z"
    }
  ],
  "total": 1,
  "page": 1,
  "page_size": 20
}
实战示例2:创建新技能
import requests

API_BASE = "https://api.workbuddy.ai/v1"
API_KEY = "YOUR_API_KEY"

headers = {
    "Authorization": f"Bearer {API_KEY}",
    "Content-Type": "application/json"
}

# 创建新技能
new_skill = {
    "name": "daily-quote",
    "display_name": "每日一句",
    "description": "每天推送一句励志名言",
    "version": "1.0.0",
    "triggers": ["每日一句", "今日名言", "给我一句励志的话"]
}

response = requests.post(
    f"{API_BASE}/skills",
    headers=headers,
    json=new_skill
)

if response.status_code == 201:
    print("技能创建成功!")
    print(f"技能ID: {response.json()['data']['id']}")
else:
    print(f"创建失败:{response.json()['message']}")

2.3 模块3:任务管理API

让你可以用代码创建、查询、控制任务执行

核心接口列表:
接口 方法 路径 功能
列出任务 GET /v1/tasks 获取任务列表
创建任务 POST /v1/tasks 创建新任务
获取任务详情 GET /v1/tasks/{task_id} 获取任务详情
取消任务 POST /v1/tasks/{task_id}/cancel 取消正在执行的任务
获取任务日志 GET /v1/tasks/{task_id}/logs 获取任务执行日志
实战示例:批量创建任务
import requests

API_BASE = "https://api.workbuddy.ai/v1"
API_KEY = "YOUR_API_KEY"

headers = {
    "Authorization": f"Bearer {API_KEY}",
    "Content-Type": "application/json"
}

# 批量创建任务
tasks = [
    {"skill_id": "skill_12345", "input": {"repo_name": "project-a"}},
    {"skill_id": "skill_12345", "input": {"repo_name": "project-b"}},
    {"skill_id": "skill_12345", "input": {"repo_name": "project-c"}}
]

for task in tasks:
    response = requests.post(
        f"{API_BASE}/tasks",
        headers=headers,
        json=task
    )
    
    if response.status_code == 201:
        task_id = response.json()['data']['id']
        print(f"任务创建成功!ID: {task_id}")
    else:
        print(f"任务创建失败:{response.json()['message']}")

2.4 模块4:Webhook与事件通知

让你的应用实时接收WorkBuddy的事件通知

支持的 events:
事件类型 触发时机 典型用途
skill.created 技能创建成功 同步到备份系统
skill.updated 技能更新 触发CI/CD流程
task.completed 任务执行完成 发送通知、处理结果
task.failed 任务执行失败 告警、自动重试
expert.activated 专家被激活 日志记录
配置Webhook:
import requests

API_BASE = "https://api.workbuddy.ai/v1"
API_KEY = "YOUR_API_KEY"

headers = {
    "Authorization": f"Bearer {API_KEY}",
    "Content-Type": "application/json"
}

# 配置Webhook
webhook_config = {
    "url": "https://your-app.com/webhook",
    "events": ["task.completed", "task.failed"],
    "secret": "YOUR_WEBHOOK_SECRET"  # 用于验证签名
}

response = requests.post(
    f"{API_BASE}/webhooks",
    headers=headers,
    json=webhook_config
)

print("Webhook配置成功!" if response.status_code == 201 else "配置失败")
接收Webhook请求:
from flask import Flask, request
import hmac
import hashlib

app = Flask(__name__)
WEBHOOK_SECRET = "YOUR_WEBHOOK_SECRET"

@app.route('/webhook', methods=['POST'])
def handle_webhook():
    # 1. 验证签名
    signature = request.headers.get('X-WorkBuddy-Signature')
    expected = hmac.new(
        WEBHOOK_SECRET.encode(),
        request.data,
        hashlib.sha256
    ).hexdigest()
    
    if not hmac.compare_digest(signature, expected):
        return "Invalid signature", 401
    
    # 2. 处理事件
    event = request.json
    event_type = event['type']
    
    if event_type == 'task.completed':
        task_id = event['data']['task_id']
        result = event['data']['result']
        print(f"任务 {task_id} 完成!结果:{result}")
        # 这里可以写你的业务逻辑
        
    elif event_type == 'task.failed':
        task_id = event['data']['task_id']
        error = event['data']['error']
        print(f"任务 {task_id} 失败!错误:{error}")
        # 这里可以发送告警
        
    return "OK", 200

if __name__ == '__main__':
    app.run(port=5000)

三、实战案例——3个典型应用场景

3.1 案例1:自动化技能备份系统

需求:每天自动备份所有技能到私有Git仓库

解决方案

import requests
import json
from datetime import datetime

API_BASE = "https://api.workbuddy.ai/v1"
API_KEY = "YOUR_API_KEY"

headers = {
    "Authorization": f"Bearer {API_KEY}",
    "Content-Type": "application/json"
}

# 1. 获取所有技能
response = requests.get(f"{API_BASE}/skills", headers=headers)
skills = response.json()['data']

# 2. 导出每个技能
backup_data = []
for skill in skills:
    skill_id = skill['id']
    export_response = requests.get(
        f"{API_BASE}/skills/{skill_id}/export",
        headers=headers
    )
    backup_data.append({
        "skill": skill,
        "package": export_response.json()['data']
    })

# 3. 保存到本地(或上传到Git)
timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
filename = f"workbuddy_backup_{timestamp}.json"

with open(filename, 'w') as f:
    json.dump(backup_data, f, indent=2)

print(f"备份完成!文件:{filename}")

定时执行:配合cron或WorkBuddy自动化系统,每天凌晨2点执行

3.2 案例2:技能市场爬虫

需求:从技能市场API获取所有公开技能,分析热门趋势

解决方案

import requests
import pandas as pd

API_BASE = "https://api.workbuddy.ai/v1"
API_KEY = "YOUR_API_KEY"

headers = {
    "Authorization": f"Bearer {API_KEY}",
    "Content-Type": "application/json"
}

# 1. 分页获取所有公开技能
all_skills = []
page = 1

while True:
    response = requests.get(
        f"{API_BASE}/market/skills",
        headers=headers,
        params={"page": page, "page_size": 100, "public": True}
    )
    
    data = response.json()['data']
    all_skills.extend(data['skills'])
    
    if len(all_skills) >= data['total']:
        break
    page += 1

# 2. 数据分析
df = pd.DataFrame(all_skills)

# 最受欢迎的技能(按安装量排序)
top_skills = df.sort_values('install_count', ascending=False).head(10)

print("=== 最受欢迎的10个技能 ===")
for idx, row in top_skills.iterrows():
    print(f"{row['name']}: {row['install_count']} 次安装")

# 3. 保存结果
top_skills.to_csv("top_skills.csv", index=False)
print("分析结果已保存到 top_skills.csv")

3.3 案例3:与Slack集成的任务通知系统

需求:当WorkBuddy任务完成时,自动发送通知到Slack

解决方案

import requests
from flask import Flask, request

API_BASE = "https://api.workbuddy.ai/v1"
API_KEY = "YOUR_API_KEY"
SLACK_WEBHOOK_URL = "https://hooks.slack.com/services/YOUR/WEBHOOK/URL"

app = Flask(__name__)

@app.route('/workbuddy-webhook', methods=['POST'])
def handle_webhook():
    event = request.json
    
    if event['type'] == 'task.completed':
        task_id = event['data']['task_id']
        result = event['data']['result']
        
        # 发送Slack通知
        slack_message = {
            "text": f"✅ WorkBuddy任务完成!\n任务ID: {task_id}\n结果: {result}"
        }
        
        requests.post(SLACK_WEBHOOK_URL, json=slack_message)
        
    return "OK", 200

if __name__ == '__main__':
    app.run(port=5000)

配置WorkBuddy Webhook

# 设置Webhook指向你的服务器
webhook_config = {
    "url": "https://your-server.com/workbuddy-webhook",
    "events": ["task.completed"]
}

requests.post(f"{API_BASE}/webhooks", headers=headers, json=webhook_config)

四、API设计心法——从WorkBuddy学习最佳实践

从WorkBuddy API的设计中,我们可以总结出以下API设计原则:

4.1 一致性原则

所有接口遵循统一的规范

规范 WorkBuddy API的做法 好处
URL格式 /v1/{资源}/{id}/{子资源} 易于预测和记忆
HTTP方法 GET=查询,POST=创建,PUT=更新,DELETE=删除 符合RESTful规范
响应格式 统一使用{code, data, message} 客户端易于解析
错误码 使用标准HTTP状态码 + 业务错误码 便于错误处理

示例对比

不一致的API设计

GET /getSkills (获取技能列表)
POST /createSkill (创建技能)
GET /task/info (获取任务信息)  # 有的用复数,有的用单数

一致的API设计

GET /v1/skills (获取技能列表)
POST /v1/skills (创建技能)
GET /v1/tasks/{id} (获取任务信息)

4.2 版本控制原则

API必须版本化,避免破坏现有客户端。

WorkBuddy的做法:

  • URL中包含版本号:/v1/skills
  • 重大变更时升级主版本:/v2/skills
  • 旧版本继续维护一段时间,给客户端升级时间

版本控制策略

变更类型 版本号变化 示例
新增字段(向后兼容) 次版本号+1 v1.0 → v1.1
修改逻辑(向后兼容) 次版本号+1 v1.1 → v1.2
删除/修改字段(不兼容) 主版本号+1 v1 → v2

4.3 分页原则

列表接口必须支持分页,避免一次返回过多数据。

WorkBuddy的分页设计:

{
  "code": 0,
  "data": [...],
  "total": 156,     // 总记录数
  "page": 1,        // 当前页码
  "page_size": 20,  // 每页数量
  "total_pages": 8   // 总页数
}

客户端分页代码

def get_all_skills():
    all_skills = []
    page = 1
    
    while True:
        response = requests.get(
            f"{API_BASE}/skills",
            headers=headers,
            params={"page": page, "page_size": 100}
        )
        
        data = response.json()['data']
        all_skills.extend(data['skills'])
        
        if page >= data['total_pages']:
            break
        page += 1
    
    return all_skills

4.4 错误处理原则

错误信息要清晰、可操作

WorkBuddy的错误响应格式:

{
  "code": 40001,
  "message": "技能名称已存在",
  "details": {
    "field": "name",
    "value": "github-manager",
    "suggestion": "请更换技能名称,或先删除已存在的同名技能"
  }
}

错误码设计

错误码范围 含义 示例
400xx 客户端错误(参数错误、权限不足) 40001=参数错误
500xx 服务器错误 50001=内部错误
600xx 业务错误(业务逻辑问题) 60001=技能不存在

4.5 性能优化原则

API要快速响应,WorkBuddy采用了以下优化策略:

  1. 支持字段过滤?fields=id,name,version 只返回需要的字段
  2. 支持预处理?include=author,skills 一并返回关联数据,减少请求次数
  3. 使用缓存:对不常变化的数据使用CDN缓存
  4. 限流保护X-RateLimit-LimitX-RateLimit-Remaining 响应头

示例

# 糟糕的做法:需要3次请求
user = requests.get(f"{API_BASE}/users/123").json()
skills = requests.get(f"{API_BASE}/users/123/skills").json()
tasks = requests.get(f"{API_BASE}/users/123/tasks").json()

# 优秀的做法:1次请求获取所有数据
response = requests.get(
    f"{API_BASE}/users/123",
    params={"include": "skills,tasks"}
).json()

五、避坑指南

5.1 坑1:API Key泄露

现象:有人用你的API Key恶意调用,产生高额费用

原因:API Key硬编码在代码中,或提交到公开Git仓库

解决

  1. 使用环境变量存储API Key
  2. 添加 .gitignore 排除配置文件
  3. 定期轮换API Key

正确做法

# ❌ 错误:硬编码
API_KEY = "wb_live_1234567890"

# ✅ 正确:使用环境变量
import os
API_KEY = os.environ.get("WORKBUDDY_API_KEY")

5.2 坑2:没有重试机制

现象:偶尔出现网络超时,导致任务失败

原因:没有实现重试逻辑

解决:使用指数退避算法重试

import time
import requests
from requests.adapters import HTTPAdapter
from requests.packages.urllib3.util.retry import Retry

# 配置重试策略
retry_strategy = Retry(
    total=3,  # 最多重试3次
    backoff_factor=1,  # 退避因子
    status_forcelist=[429, 500, 502, 503, 504]  # 这些状态码才重试
)

adapter = HTTPAdapter(max_retries=retry_strategy)
http = requests.Session()
http.mount("https://", adapter)

response = http.get(f"{API_BASE}/skills", headers=headers)

5.3 坑3:没有速率限制处理

现象:频繁调用API,收到429 Too Many Requests错误

原因:没有遵守API的速率限制

解决

  1. 检查响应头的X-RateLimit-*字段
  2. 实现速率限制逻辑
import time
import requests

def api_call_with_rate_limit(url, headers):
    while True:
        response = requests.get(url, headers=headers)
        
        if response.status_code == 429:
            # 获取需要等待的时间
            retry_after = int(response.headers.get('Retry-After', 60))
            print(f"达到速率限制,等待 {retry_after} 秒...")
            time.sleep(retry_after)
            continue
        
        return response

5.4 坑4:Webhook签名未验证

现象:有人伪造Webhook请求,给你的系统注入恶意数据

原因:没有验证Webhook请求的签名

解决:验证X-WorkBuddy-Signature

import hmac
import hashlib

def verify_webhook_signature(request):
    signature = request.headers.get('X-WorkBuddy-Signature')
    secret = "YOUR_WEBHOOK_SECRET"
    
    expected = hmac.new(
        secret.encode(),
        request.data,
        hashlib.sha256
    ).hexdigest()
    
    return hmac.compare_digest(signature, expected)

5.5 坑5:没有API调用日志

现象:API调用出问题,但不知道是哪个环节出错

原因:没有记录API请求和响应

解决:实现API调用日志

import logging
import json
from datetime import datetime

logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)

def api_request(method, url, headers, **kwargs):
    # 记录请求
    logger.info(f"API请求: {method} {url}")
    logger.debug(f"请求头: {headers}")
    logger.debug(f"请求体: {kwargs.get('json')}")
    
    start_time = datetime.now()
    response = requests.request(method, url, headers=headers, **kwargs)
    end_time = datetime.now()
    
    # 记录响应
    logger.info(f"API响应: {response.status_code}, 耗时: {end_time - start_time}")
    logger.debug(f"响应体: {response.text}")
    
    return response

六、总结

本文深度解析了WorkBuddy API体系,带你打开了「AI能力编程」的大门:

  1. WorkBuddy API的本质是「编程遥控器」,让你可以用代码控制WorkBuddy
  2. 四大核心模块:认证与授权、技能管理、任务管理、Webhook通知
  3. 三个实战案例:自动化备份、技能市场分析、Slack集成
  4. API设计心法:一致性、版本控制、分页、错误处理、性能优化
  5. 避坑指南:避免API Key泄露、实现重试机制、处理速率限制

下一步行动

  • 获取你的API Key,尝试调用第一个API
  • 思考你的工作流中,哪些环节可以用API自动化
  • 加入WorkBuddy开发者社区,分享你的API使用经验

WorkBuddy API让AI能力变得可编程、可集成、可扩展。当你掌握了API,WorkBuddy就不再只是一个工具,而是一个可以嵌入你工作流的「AI能力平台」。

专栏导航

本文是「腾讯小龙虾 WorkBuddy 专栏」第 18 篇。

编号 标题 状态
01 初识WorkBuddy!定位、核心优势、功能界面全解析 已发布
02 保姆级安装教程!彻底分清WorkBuddy/CodeBuddy,最新积分活动&会员体系全攻略 已发布
03 技能(Skills)制作全教程!自定义技能编写、导出分享、导入使用一步到位 已发布
04 一文搞懂WorkBuddy的「专家」和「专家团」 已发布
05 深度解析WorkBuddy连接器(Connector) 已发布
06 让AI链接外部生态 已发布
07 把AI训练成你的专属员工——WorkBuddy Skill系统深度解析 已发布
08 从「定时任务」到「数字员工」——WorkBuddy自动化系统深度拆解 已发布
09 AI不止会聊天——WorkBuddy多模态能力深度揭秘 已发布
10 你的AI终于学会「分项目干活」了——WorkBuddy项目功能完全指南 已发布
11 WB项目不是TAPD 已发布
12 技能到底存在哪?——WorkBuddy两级技能存储架构深度解析 已发布
13 WB的「记忆系统」是怎么搭建的 已发布
14 专家不是「换皮」——角色切换、训练机制与自我进化深度拆解 已发布
15 灵感被折叠到「更多」里,真的不重要了吗?——一个「被低估」功能的当下价值与未来演变 已发布
16 三层记忆系统深度拆解——让AI真正「记住」你 已发布
17 一个 AI 不够用?WorkBuddy SubAgent 多智能体协作系统深度拆解 已发布
18 【WorkBuddy专栏18】WorkBuddy API深度解析——打造开发者友好的AI生态 待发布
Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐