获取智能体工具调用分析数据
curl --request GET \
--url https://server.codeium.com/api/v2alpha/analytics/tools \
--header 'Authorization: Bearer <token>'import requests
url = "https://server.codeium.com/api/v2alpha/analytics/tools"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://server.codeium.com/api/v2alpha/analytics/tools', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://server.codeium.com/api/v2alpha/analytics/tools",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://server.codeium.com/api/v2alpha/analytics/tools"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://server.codeium.com/api/v2alpha/analytics/tools")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://server.codeium.com/api/v2alpha/analytics/tools")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"data": [
{
"user_id": "user_abc123",
"user_email": "alice@example.com",
"tool": "RUN_COMMAND",
"calls": 1842
},
{
"user_id": "user_abc123",
"user_email": "alice@example.com",
"tool": "SEARCH_WEB",
"calls": 57
}
],
"pagination": {
"next_page_cursor": null
},
"metadata": {
"data_freshness": "2026-10-20T02:00:00.000Z",
"query_time_ms": 1104,
"team_id": "team_abc123"
}
}分析 API
获取 Devin 智能体工具调用
统计您的团队在 Devin Desktop 和 Devin CLI 中发起的智能体工具调用(如网页搜索、运行命令)次数,可按工具、用户、模型、IDE 或操作系统分组。
GET
/
api
/
v2alpha
/
analytics
/
tools
获取智能体工具调用分析数据
curl --request GET \
--url https://server.codeium.com/api/v2alpha/analytics/tools \
--header 'Authorization: Bearer <token>'import requests
url = "https://server.codeium.com/api/v2alpha/analytics/tools"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://server.codeium.com/api/v2alpha/analytics/tools', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://server.codeium.com/api/v2alpha/analytics/tools",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://server.codeium.com/api/v2alpha/analytics/tools"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://server.codeium.com/api/v2alpha/analytics/tools")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://server.codeium.com/api/v2alpha/analytics/tools")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"data": [
{
"user_id": "user_abc123",
"user_email": "alice@example.com",
"tool": "RUN_COMMAND",
"calls": 1842
},
{
"user_id": "user_abc123",
"user_email": "alice@example.com",
"tool": "SEARCH_WEB",
"calls": 57
}
],
"pagination": {
"next_page_cursor": null
},
"metadata": {
"data_freshness": "2026-10-20T02:00:00.000Z",
"query_time_ms": 1104,
"team_id": "team_abc123"
}
}这是一个 v2 端点,使用 Bearer 令牌进行身份验证并通过查询参数传参;而 v1 分析 API 则是在请求体中传入服务密钥。详见下方的身份验证。
此端点不适用于实时用量监控。其速率限制较低
(每个团队每小时 10 次请求) ,请用于定期报告和批量导出。
身份验证
此端点使用 Bearer 令牌 进行身份验证。请在Authorization 标头中提供您的令牌:
Authorization: Bearer <your_token>
cascade_tool_usage
数据源不同,此端点支持 Devin 服务用户 API 密钥,因此 Cognition 平台上的团队无需 Windsurf 服务密钥即可
获取工具使用情况报告。
指标
metric 查询参数为必填项,目前仅接受 calls,即智能体发起的工具调用次数。
该值以整数字段 calls 的形式出现在每一行中。如果请求未提供 metric 或指定了其他指标,将返回 400 错误。
无论使用哪个模型,只要智能体在 Devin Desktop
或 Devin CLI (包括在其他编辑器中作为智能体运行的 CLI) 中调用工具,均会计入工具调用次数。
product 参数同样为必填项,目前仅接受 agent。
工具
按tool 分组,可按工具类别细分调用。此时每一行都会包含一个 tool 字段,其值为以下之一:
| 工具 | 描述 |
|---|---|
SEARCH_WEB | 网页搜索、网页抓取和浏览器操作 |
RUN_COMMAND | Shell 命令以及与运行中进程的交互 |
VIEW_FILE | 读取文件和笔记本 |
CODE_ACTION | 编辑、写入和修补文件 |
GREP_SEARCH | 搜索文件内容和代码 |
FIND | 按名称查找文件 |
LIST_DIRECTORY | 列出目录 |
MCP_TOOL | 调用 MCP 服务器工具,以及列出 MCP 服务器、工具或资源 |
SKILL | 列出、搜索和调用技能 |
ASK_USER_QUESTION | 向用户提问 |
MEMORY | 读取和写入记忆 |
PROPOSE_CODE | 提出代码修改建议 |
PROXY_WEB_SERVER | 在浏览器中预览本地 Web 服务器 |
DEPLOY_WEB_APP | 部署 Web 应用 |
MQUERY | 代码库搜索 (Riptide) |
DEEPWIKI | DeepWiki 请求 |
CODEMAP_GENERATION、CODEMAP_SUGGESTIONS | Codemaps 请求 |
OTHER | 不属于上述类别的 Devin CLI 工具 |
LIST_DIRECTORY、MEMORY、PROPOSE_CODE、
PROXY_WEB_SERVER、DEPLOY_WEB_APP 和 MQUERY 仅针对 Devin Desktop 智能体记录;尚未分配类别的新
Devin CLI 工具则计入 OTHER。
分组与粒度
使用granularity 和 group_by 控制返回数据的结构:
- 不设置粒度或分组 — 返回整个日期范围的单行聚合数据
granularity=daily— 每行包含YYYY-MM-DD格式的timestampgranularity=monthly— 每行包含YYYY-MM格式的timestampgroup_by=tool— 每行包含tool(参见上文的工具)group_by=user— 每行包含user_id;如果该用户有记录的邮箱,还会包含user_emailgroup_by=model_uid— 每行包含model_uidgroup_by=ide— 每行包含idegroup_by=ide,ide_version— 每行包含ide和ide_version(按ide_version分组时必须同时包含ide)group_by=os— 每行包含os,例如darwin(macOS) 、windows或linux
group_by=user,tool 会统计每个用户调用每种
工具的次数。此处不支持 Get Output 中的 session 和 source 维度。
这里同样适用与 Get Consumption 相同的 models、group_id 和 user_id 过滤器,此外还支持 tool 过滤器,
用于将计数限定为某一种工具类别 (例如 tool=SEARCH_WEB) 。只有
此端点接受 tool;将其传给其他分析 API v2 端点会返回 400 错误。
示例
统计一周内每个用户的网页搜索次数:curl "https://server.codeium.com/api/v2alpha/analytics/tools?metric=calls&product=agent&start_date=2026-10-13&end_date=2026-10-19&group_by=user&tool=SEARCH_WEB" \
-H "Authorization: Bearer $DEVIN_API_KEY"
SEARCH_WEB 次数。若要改为查看每个用户的所有类别,请去掉 tool 过滤器,并添加 group_by=user,tool。
分页
结果以分页形式返回,默认每页 1,000 行 (最多 10,000 行) 。如果还有更多结果, 响应会在pagination 对象中返回 next_page_cursor。请在后续请求中将其作为 page_cursor 查询
参数传入,其余查询参数与原始请求保持一致。游标仅对签发它的端点有效;来自 /consumption 或 /output 的游标
会被拒绝,并返回 400。
页面游标的有效期为 24 小时。获取后续分页的请求不会计为新的 query,也不会占用您的速率限制。
速率限制
此端点的速率限制为每个团队每小时 10 次请求。超出此限制时, 服务器将返回429 Too Many Requests,并附带 Retry-After 标头。
对先前的查询进行分页 (即使用 next_page_cursor 继续获取结果) 不计入此限制,
只有每份报告的首次查询才会计入。之所以限制较低,是因为该端点用于
定期报告,而非实时用量监控。授权
查询参数
要返回的指标,以字段形式出现在每行中。支持的指标:
calls— 智能体的工具调用次数
日期范围的开始日期(含当日),格式为 YYYY-MM-DD。
日期范围的结束日期(含当日),格式为 YYYY-MM-DD。日期范围不得超过 90 天。
要查询其工具调用数据的产品。
可用选项:
agent 用于对结果分组的时间粒度。指定后,每行都包含一个 timestamp 字段。
如果省略,则汇总整个日期范围内的结果。
可用选项:
daily, monthly 用于对结果分组的维度列表,以逗号分隔。支持的维度:
tool— 每行包含tool(工具类别,例如SEARCH_WEB或RUN_COMMAND)user— 每行包含user_id;如果记录了该用户的电子邮件地址,还会包含user_emailmodel_uid— 每行包含model_uidide— 每行包含ideide_version— 每行包含ide_version;必须同时包含ideos— 每行包含os
用于过滤结果的模型 UID 列表,以逗号分隔。
仅统计一个工具类别,例如 SEARCH_WEB 或 RUN_COMMAND(精确匹配)。
仅此端点接受该参数。
仅返回指定组中用户的结果。服务密钥必须具有该组的访问权限。不支持使用 Devin 服务用户 API 密钥。
仅返回指定用户(身份验证 UID)的结果。
每页返回的最大行数。
必填范围:
1 <= x <= 10000上一个响应中 pagination.next_page_cursor 返回的不透明游标,用于获取下一页。传入的 metric 必须与生成该游标的请求中使用的值相同;其他端点生成的游标将被拒绝。

