Windsurf 分析 API (SaaS)
概览
Windsurf 支持用于自定义分析的 API。它允许查询来自自动补全、聊天和命令的数据,并支持多种过滤器、分组和聚合。
我们提供所有使用 curl 的示例;然后可以将其转换为其他语言的 HTTP 请求。
用户数据分析 API 规范
可以使用以下命令获取团队页面上“用户”表中的数据
SERVICE_KEY: 服务密钥 - 管理员用户可以在设置页面的服务密钥部分创建一个。服务密钥的角色必须具有“只读团队”权限。
GROUP_NAME: 用于过滤的组的名称。此字段是可选的。
START_TIMESTAMP/END_TIMESTAMP: RFC 3339 格式的时间戳,例如 2023-01-01T00:00:00Z
示例输出
Cascade 分析 API 规范
在以下页面上看到的 Cascade 特定数据分析页面可以通过 API 进行查询。
SERVICE_KEY: 服务密钥 - 管理员用户可以从 https://windsurf.com/team/team_settings 创建一个新的:
GROUP_NAME: 用于过滤的组的名称。此字段是可选的。如果设置了 emails,则不能设置此字段。
START_TIMESTAMP/END_TIMESTAMP: RFC 3339 格式的时间戳,例如 2023-01-01T00:00:00Z
EMAILS: 用于过滤的电子邮件列表。此字段是可选的。如果设置了 group_name,则不能设置此字段。
IDE_TYPES: 用于过滤的 IDE 类型列表。此字段是可选的。可能的值如下所述。
QUERY_REQUESTS: 要进行的查询请求列表。此字段是必需的。CASCADE_DATA_SOURCE 的可能值如下所述。
示例查询
IDE 类型
我们将 cascade 数据分为两类:编辑器和 JetBrains 插件。在查询中排除 ide_types 字段将返回两者的数据。如果您只想查询其中一种 IDE 的数据,可以使用以下两种选项之一:
- Windsurf 编辑器的“editor”
- JetBrains 插件的“jetbrains”
Cascade 数据源
CASCADE_DATA_SOURCE 有三个可能的值
源:cascade_lines
使用 cascade_lines 查询每天建议和接受的 cascade 行的数据。
示例输出
linesSuggested: 给定日期建议的行数。 linesAccepted: 给定日期接受的行数。
源:cascade_runs
使用 cascade_runs 查询模型使用情况、积分消耗和模式的数据。
示例输出
day: 运行的日期。
model: 用于消息的模型。
mode: 运行的模式。以下之一:CONVERSATIONAL_PLANNER_MODE_DEFAULT (写入模式)、CONVERSATIONAL_PLANNER_MODE_READ_ONLY (读取模式)、CONVERSATIONAL_PLANNER_MODE_NO_TOOL (传统模式) 或 UNKNOWN。
messagesSent: 发送的消息数量。
cascadeId: 运行的 ID。此 ID 可用于了解已开始了多少个不同的对话(与用户发送消息的次数不同)。
promptsUsed: 使用的积分数量。
API 返回的数据是原始格式,这可能解释任何“UNKNOWN”值。如果使用此数据源来获取您自己的指标,建议按您感兴趣的特定指标进行聚合(例如,汇总 promptsUsed 字段以了解用户使用模式,汇总 messagesSent 以了解用户参与度等),因为模式和提示数据可能会分散在不同的条目中。
源:cascade_tool_usage
使用 cascade_tool_usage 查询工具使用情况数据。请注意,这将返回给定时间段内工具的总使用次数。
示例输出
tool: 用于消息的工具。
count: 工具的使用次数。
这是返回的枚举及其在 UI 中显示的易于理解的名称对照表
- CODE_ACTION: ‘代码编辑’
- VIEW_FILE: ‘查看文件’
- RUN_COMMAND: ‘运行命令’
- FIND: ‘查找工具’
- GREP_SEARCH: ‘Grep 搜索’
- VIEW_FILE_OUTLINE: ‘查看文件大纲’
- MQUERY: ‘Riptide’
- LIST_DIRECTORY: ‘列出目录’
- MCP_TOOL: ‘MCP 工具’
- PROPOSE_CODE: ‘建议代码’
- SEARCH_WEB: ‘搜索网页’
- MEMORY: ‘记忆’
- PROXY_WEB_SERVER: ‘浏览器预览’
- DEPLOY_WEB_APP: ‘部署 Web 应用’
自定义分析 API 规范
某些数据源允许通过自定义分析 API 进行可定制的查询。
选择、过滤器、聚合和排序的完整模式在以下部分中,为 JSON 格式。每种数据源的示例查询以及查询调试技巧将在文档末尾。
DATA_SOURCE: 选择 USER_DATA、CHAT_DATA 或 COMMAND_DATA,具体取决于您要查找的是自动补全、聊天还是命令数据。
SERVICE_KEY: 服务密钥 - 管理员用户可以从 https://windsurf.com/team/team_settings 创建一个新的:
GROUP_NAME: 用于过滤的组的名称。此字段是可选的。
模式
选择
选择是必需的。
每个选择对应一个要查询的值。
FIELD_NAME: 您希望查询的字段。请参阅下面的“可用字段”部分。
NAME: 字段的别名。如果未指定,将是 <AGGREGATION_FUNCTION>_<FIELD_NAME> 的小写版本,例如 sum_num_acceptances。必须与其他所有字段和聚合名称不同。
AGGREGATION_FUNCTION: 应为 UNSPECIFIED、COUNT、SUM、AVG、MAX、MIN 中的一个。如果未提供“aggregation_function”,则默认为 UNSPECIFIED。
过滤器
过滤器用于将数据缩小到仅包含符合特定条件的元素。它们是可选的。
NAME: 您希望过滤的字段的名称。如果被过滤的项目与选择/聚合相同,则此名称必须等于字段/聚合的名称。
VALUE: 正在比较的值。
FILTER: 以下之一:EQUAL、NOT_EQUAL、GREATER_THAN、LESS_THAN、GE (大于或等于)、LE (小于或等于)。
聚合
聚合用于根据指定条件将数据分组。它们是可选的。
FIELD_NAME: 您希望查询的字段。请参阅“可用字段”部分。
NAME: 字段的别名。必须与其他所有字段和聚合名称不同。
可用字段
用户数据
来自 USER_DATA 源的所有数据按用户、按小时聚合。
注意:PCW(代码编写百分比)现在有自己的表,不再依赖于 user_data 表。 | 字段名称 | 描述 |
---|---|---|
有效聚合 | api_key | 用户 API 密钥的哈希值。 |
UNSPECIFIED, COUNT | date | 用户 API 密钥的哈希值。 |
自动补全的 UTC 日期。 | date UTC-x | 用户 API 密钥的哈希值。 |
自动补全的日期,带有有时区偏移量。例如,PST 将是“date UTC-8”。 | hour | 用户 API 密钥的哈希值。 |
自动补全的 UTC 小时。 | language | 用户 API 密钥的哈希值。 |
正在使用的编程语言。 | ide | 用户 API 密钥的哈希值。 |
正在使用的 IDE。 | version | 用户 API 密钥的哈希值。 |
使用的 Windsurf 版本。 | num_acceptances | 用户接受自动补全的次数。这发生在用户编写一些代码,看到灰色文本,然后按下 tab 键时。 |
SUM, MAX, MIN, AVG | num_lines_accepted | 用户接受自动补全的次数。这发生在用户编写一些代码,看到灰色文本,然后按下 tab 键时。 |
从自动补全接受的代码行数。 | num_bytes_accepted | 用户接受自动补全的次数。这发生在用户编写一些代码,看到灰色文本,然后按下 tab 键时。 |
从自动补全接受的字节数。 | distinct_users | 用户 API 密钥的哈希值。 |
独立用户数。 | distinct_developer_days | 用户 API 密钥的哈希值。 |
独立 (用户, 天) 元组。 | distinct_developer_hours | 用户 API 密钥的哈希值。 |
独立 (用户, 小时) 元组。
聊天数据
注意:PCW(代码编写百分比)现在有自己的表,不再依赖于 user_data 表。 | 字段名称 | 描述 |
---|---|---|
有效聚合 | 请注意,聊天数据 API 中提供的所有数据均针对聊天模型的响应,而非用户提问。 | 用户 API 密钥的哈希值。 |
用户 API 密钥的哈希值 | model_id | 用户 API 密钥的哈希值。 |
UNSPECIFIED, COUNT | 聊天模型的 ID,在部署时设置。 | 用户 API 密钥的哈希值。 |
自动补全的 UTC 日期。 | 聊天响应的 UTC 日期。 | 用户 API 密钥的哈希值。 |
正在使用的编程语言。 | 聊天响应的日期,带有有时区偏移量。例如,PST 将是“date UTC-8”。 | 用户 API 密钥的哈希值。 |
正在使用的 IDE。 | version | 用户 API 密钥的哈希值。 |
正在使用的 IDE | latest_intent_type 模型响应是来自代码透镜还是常规聊天。常规聊天对应于 CHAT_INTENT_GENERIC 而代码透镜对应于以下之一: CHAT_INTENT_FUNCTION_EXPLAIN CHAT_INTENT_FUNCTION_DOCSTRING CHAT_INTENT_FUNCTION_REFACTOR CHAT_INTENT_CODE_BLOCK_EXPLAIN CHAT_INTENT_CODE_BLOCK_REFACTOR CHAT_INTENT_PROBLEM_EXPLAIN | 用户 API 密钥的哈希值。 |
CHAT_INTENT_FUNCTION_UNIT_TESTS | num_chats_received | 用户接受自动补全的次数。这发生在用户编写一些代码,看到灰色文本,然后按下 tab 键时。 |
从 Windsurf 发送给用户的聊天消息数量。 | chat_accepted | 如果 Windsurf 的聊天响应中发送了代码块,并且点击了“点赞”按钮,则为 True。 |
SUM, COUNT | chat_inserted_at_cursor | 如果 Windsurf 的聊天响应中发送了代码块,并且点击了“点赞”按钮,则为 True。 |
如果 Windsurf 的聊天响应中发送了代码块,并且点击了“插入”按钮,则为 True。 | chat_applied | 如果 Windsurf 的聊天响应中发送了代码块,并且点击了“点赞”按钮,则为 True。 |
如果 Windsurf 的聊天响应中发送了代码块,并且点击了“应用差异”按钮,则为 True。 | chat_loc_used | 用户接受自动补全的次数。这发生在用户编写一些代码,看到灰色文本,然后按下 tab 键时。 |
如果 Windsurf 的聊天中发送了代码块,并且点击了“插入”、“复制”或“应用差异”按钮中的任何一个,则为使用的代码行数。
命令数据
注意:PCW(代码编写百分比)现在有自己的表,不再依赖于 user_data 表。 | 字段名称 | 描述 |
---|---|---|
有效聚合 | api_key | 用户 API 密钥的哈希值。 |
UNSPECIFIED, COUNT | 请注意,“命令数据”源包含**所有**命令,包括已拒绝的命令。“accepted”字段可用于仅过滤已接受的命令。 | 用户 API 密钥的哈希值。 |
命令的 UTC 日期。 | timestamp | 用户 API 密钥的哈希值。 |
自动补全的 UTC 小时。 | language | 用户 API 密钥的哈希值。 |
正在使用的编程语言。 | ide | 用户 API 密钥的哈希值。 |
正在使用的 IDE。 | version | 用户 API 密钥的哈希值。 |
命令的 UTC 时间戳。 | command_source 触发命令的原因。有效值包括: COMMAND_REQUEST_SOURCE_LINE_HINT_CODE_LENS COMMAND_REQUEST_SOURCE_DEFAULT COMMAND_REQUEST_SOURCE_RIGHT_CLICK_REFACTOR COMMAND_REQUEST_SOURCE_FUNCTION_CODE_LENS COMMAND_REQUEST_SOURCE_FOLLOWUP COMMAND_REQUEST_SOURCE_CLASS_CODE_LENS COMMAND_REQUEST_SOURCE_PLAN COMMAND_REQUEST_SOURCE_SELECTION_HINT_CODE_LENS | 用户 API 密钥的哈希值。 |
COMMAND_REQUEST_SOURCE_DEFAULT 对应于典型的命令使用情况。 | provider_source | 用户 API 密钥的哈希值。 |
确定命令是在生成模式还是编辑模式下触发的。有效值包括:PROVIDER_SOURCE_COMMAND_GENERATE PROVIDER_SOURCE_COMMAND_EDIT | lines_added | 用户接受自动补全的次数。这发生在用户编写一些代码,看到灰色文本,然后按下 tab 键时。 |
命令添加的代码行数。 | lines_removed | 用户接受自动补全的次数。这发生在用户编写一些代码,看到灰色文本,然后按下 tab 键时。 |
命令删除的代码行数。 | bytes_added | 用户接受自动补全的次数。这发生在用户编写一些代码,看到灰色文本,然后按下 tab 键时。 |
命令添加的字节数。 | bytes_removed | 用户接受自动补全的次数。这发生在用户编写一些代码,看到灰色文本,然后按下 tab 键时。 |
命令删除的字节数。 | selection_lines | 用户接受自动补全的次数。这发生在用户编写一些代码,看到灰色文本,然后按下 tab 键时。 |
命令选择的代码行数。对于生成,应始终为零。 | selection_bytes | 用户接受自动补全的次数。这发生在用户编写一些代码,看到灰色文本,然后按下 tab 键时。 |
命令选择的字节数。对于生成,应始终为零。 | accepted | 如果 Windsurf 的聊天响应中发送了代码块,并且点击了“点赞”按钮,则为 True。 |
命令是否被接受。
PCW 数据
注意:PCW(代码编写百分比)现在有自己的表,不再依赖于 user_data 表。 | 字段名称 | 描述 |
---|---|---|
有效选择 | percent_code_written | 代码编写百分比。计算公式为 (Windsurf 生成的字节数) / (Windsurf 生成的字节数 + 用户生成的字节数)。此指标在单天或单个用户内部可能有较高的方差,因此我们建议按周进行聚合。 |
UNSPECIFIED | windsurf_bytes | 代码编写百分比。计算公式为 (Windsurf 生成的字节数) / (Windsurf 生成的字节数 + 用户生成的字节数)。此指标在单天或单个用户内部可能有较高的方差,因此我们建议按周进行聚合。 |
Windsurf 总字节数,等于 windsurf_bytes_by_autocomplete + windsurf_bytes_by_command | user_bytes | 代码编写百分比。计算公式为 (Windsurf 生成的字节数) / (Windsurf 生成的字节数 + 用户生成的字节数)。此指标在单天或单个用户内部可能有较高的方差,因此我们建议按周进行聚合。 |
用户总字节数 | total_bytes | 代码编写百分比。计算公式为 (Windsurf 生成的字节数) / (Windsurf 生成的字节数 + 用户生成的字节数)。此指标在单天或单个用户内部可能有较高的方差,因此我们建议按周进行聚合。 |
windsurf_bytes + user_bytes | windsurf_bytes_by_autocomplete | 代码编写百分比。计算公式为 (Windsurf 生成的字节数) / (Windsurf 生成的字节数 + 用户生成的字节数)。此指标在单天或单个用户内部可能有较高的方差,因此我们建议按周进行聚合。 |
从自动补全生成的 Windsurf 总字节数 | windsurf_bytes_by_command | 代码编写百分比。计算公式为 (Windsurf 生成的字节数) / (Windsurf 生成的字节数 + 用户生成的字节数)。此指标在单天或单个用户内部可能有较高的方差,因此我们建议按周进行聚合。 |
从命令生成的 Windsurf 总字节数
注意:PCW(代码编写百分比)现在有自己的表,不再依赖于 user_data 表。 | 字段名称 | 有效过滤器 |
有效聚合 | api_key | |
自动补全的 UTC 小时。 | language | 一些示例 |
正在使用的编程语言。 | ide | KOTLIN, GO, JAVA |
正在使用的 IDE。 | version | 1.28.0, 130.0 |
jetbrains, vscode
要按日期过滤,请使用 start_timestamp 和 end_timestamp,它们应采用 RFC 3339 格式(例如 2023-01-01T00:00:00Z,参见下方示例)。
可用字段
示例
独立 (用户, 小时) 元组。
此查询计算 2024 年 1 月整个月份的代码编写百分比。示例响应(为提高可读性而格式化为 JSON)
此查询显示从“生成文档字符串”代码透镜接受的代码行数,统计所有时间,按 IDE 分组。
如果 Windsurf 的聊天中发送了代码块,并且点击了“插入”、“复制”或“应用差异”按钮中的任何一个,则为使用的代码行数。
示例响应
此查询显示从“生成文档字符串”代码透镜接受的代码行数,统计所有时间,按 IDE 分组。
命令是否被接受。
此查询获取“编辑”命令添加和删除的代码行数,按编程语言分组。
此查询显示从“生成文档字符串”代码透镜接受的代码行数,统计所有时间,按 IDE 分组。
此查询获取 PCW(代码编写百分比)数据以及按 Go 语言过滤的字节数。
查询调试
从 1.10.0 版本及更高版本开始,无效查询将返回错误消息。本节包含一些常见的错误消息、它们的含义以及如何调试相应的查询。 | 错误消息 |
---|---|
解释 | 至少需要一个字段或聚合 |
未检测到任何选择或聚合 - 请确保查询请求至少包含一个。 | 字符串类型字段 ide 的聚合函数无效:QUERY_AGGREGATION_SUM |
其中一个选择使用了无效的聚合函数。在这种情况下,我们尝试对“ide”字段使用 SUM,但它仅支持 COUNT 和 UNSPECIFIED。 | 无效的查询表:QUERY_DATA_SOURCE_UNSPECIFIED |
data_source 字段可能存在拼写错误,请仔细检查拼写。 | 所有选择字段应具有聚合函数,或者它们都不应具有 如果存在多个选择字段,则它们要么全部包含 aggregation_function,要么都不包含。例如,此选择无效,因为对 num_acceptances 进行了求和,但未对 num_lines_accepted 进行求和。 |
未检测到任何选择或聚合 - 请确保查询请求至少包含一个。 | 注意:PCW 始终被视为已聚合。如果未明确选择 aggregation_function,则视为未指定。如果您想获取这两个字段的信息,请使用两个独立的查询。 |
并非每个字段都支持每种聚合函数;请参阅可用字段部分了解匹配项。在这种情况下,查询对“ide”字段使用了 QUERY_AGGREGATION_SUM 聚合函数,这是无效的。 | 尝试对独立字段进行聚合:distinct_developer_days。请考虑对非独立字段进行聚合,例如:[api_key date] 模式为“distinct_*”的字段不能出现在 aggregations 部分;错误建议改为在替代字段上进行聚合。所以,代替 |
尝试 | 选择/聚合的字段别名重复:num_acceptances |
所有选择和聚合必须具有不同的名称。请记住,如果未指定名称,则默认设置为 <AGGREGATION_FUNCTION>_<FIELD_NAME>。 | 无效的组名称:GroupName |