# @firefliesai/fireflies-node-sdk 中文文档

规范地址：https://npmcn.com/package/%40firefliesai/fireflies-node-sdk/

版本：1\.2\.1
npm 元数据更新时间：2026-10-12T14:27:42.827Z
中文译文更新时间：2026-11-15T17:29:33.567Z
软件包许可：MIT

本文由上游 README 翻译，可能存在偏差，请结合原文核对 API、命令与配置。版权与许可归原作者所有。

原始 npm 页面：https://www.npmjs.com/package/%40firefliesai/fireflies-node-sdk
原文对照：https://npmcn.com/package/%40firefliesai/fireflies-node-sdk/?lang=original
项目主页：https://github.com/firefliesai/fireflies-node-sdk#readme
源码仓库：https://github.com/firefliesai/fireflies-node-sdk

## 关键信息（来自 npm 元数据）

- 包体积（解压后）：213 kB，22 个文件
- 模块格式：ESM + CJS
- TypeScript 类型：包内自带
- Node.js 要求：\>=14\.0\.0
- 运行依赖：1 个
- 首次发布：2025-04-25T15:35:24.933Z
- 最新版本发布：2026-10-12T14:27:37.359Z
- 近 30 天下载量：2025（2026-10-15 至 2026-11-13，npm 官方下载统计）
- 已发布版本数：5（近 12 个月 1 个）

## 中文简介

萤火虫的节点.js SDK.ai API

## 安装

```sh
npm install @firefliesai/fireflies-node-sdk
```

也可以使用：`pnpm add @firefliesai/fireflies-node-sdk`、`yarn add @firefliesai/fireflies-node-sdk`、`bun add @firefliesai/fireflies-node-sdk`

## README

# 萤火虫.ai 节点.js SDK

一个与萤火虫互动的节点.js SDK.ai GraphQL API. 这个SDK提供了一个简单的接口来访问萤火虫. ai的会议记录和分析功能.

## 安装

```bash
npm install @firefliesai/fireflies-node-sdk
# or
yarn add @firefliesai/fireflies-node-sdk
```

## 快速启动

```javascript
const { FirefliesSDK } = require("@firefliesai/fireflies-node-sdk");
// Or using ES modules:
// import { FirefliesSDK } from '@firefliesai/fireflies-node-sdk';

const fireflies = new FirefliesSDK({
  apiKey: process.env.FIREFLIES_API_KEY,
});

async function main() {
  try {
    // Get current user info - see docs.fireflies.ai for all available fields
    const userInfo = await fireflies.getCurrentUser(["email", "name"]);
    console.log("User:", userInfo);

    // Get recent transcripts - see docs.fireflies.ai for all available fields
    const transcripts = await fireflies.getTranscripts(
      { limit: 10, mine: true },
      ["id", "title"]
    );
    console.log("Recent transcripts:", transcripts);
  } catch (error) {
    console.error("Error:", error.message);
  }
}

main();
```

## 环境变量

创建一个 `.env` 在工程根中的文件 :

```env
FIREFLIES_API_KEY=your_api_key_here
```

## 特征

SDK覆盖了其中的每个操作 [公共图形QL API](https://docs.fireflies.ai/graphql-api)数字 :

-   **用户和团队**: 当前用户,用户通过ID,所有用户,设置用户角色,用户组及其成员
-   **语录**: 列表(所有有记录的过滤器)并获取、删除、更新标题、隐私和频道、共享和取消访问
-   **上传**: 从公共 URL 上传, 或直接上传本地文件, 并带有预先签名的 URL
-   **现场会议**: 将萤火虫添加到会议中, 列出正在举行的会议, 暂停和恢复录制, 现场动作项目和声音
-   **问Fred**:询问关于一次会议或跨次会议的问题、后续行动、清单、读取和删除线索
-   **贝斯(声贝)**: 创建、列表、获取
-   **频道和联系人**: 列表频道,获取频道,列表联系人
-   **分析、审计记录和规则**:团队和每个用户分析、审计事件、规则处决
-   **大赦国际应用程序**: 应用输出
-   **限制费率意识**: 自动、有界重试 `429` 编号 : `too_many_requests` 荣誉 `Retry-After`; 批次帮助从 `X-RateLimit-*` 页眉; 解析状态于 `sdk.rateLimit`
-   **多用户助手**: 在多个API 密钥上获取和复制会议

返回对象的方法选择 `fields` 数组(要选择的 GraphQL 字段, 如 字符串,包含嵌入式选择). 当您没有通过时, 方法会选择一个合理的默认集 .

## API 参考

关于现有字段和计划资料的完整清单,请参见: [官方的Filflies.ai文档](https://docs.fireflies.ai/)。 。 。 .

### 用户方法

```javascript
// Get current user - see docs.fireflies.ai for all available fields
await fireflies.getCurrentUser(["email", "name"]);

// Get user by ID - see docs.fireflies.ai for all available fields
await fireflies.getUser("user_id", ["email", "name"]);

// Set user role
await fireflies.setUserRole("user_id", "admin");
```

### 转写方法

```javascript
// Get transcripts - see docs.fireflies.ai for all available fields
await fireflies.getTranscripts({ limit: 50, mine: true }, [
  "id",
  "title",
  "privacy",
]);

// Get single transcript - see docs.fireflies.ai for all available fields
await fireflies.getTranscript("transcript_id", ["id", "title"]);

// Delete transcript
await fireflies.deleteTranscript("transcript_id");

// Get meetings for multiple users with deduplication
const meetings = await FirefliesSDK.getMeetingsForMultipleUsers(
  ["api-key-1", "api-key-2"],
  ["id", "title", "duration", "summary { keywords action_items }"],
  "json" // or 'console' for console output
);

// Find questions from external participants
const { externalParticipants, questions } =
  await fireflies.findExternalParticipantQuestions("@yourcompany.com");
console.log("External Participants:", externalParticipants);
console.log("Questions:", questions);

// Get video URLs from meetings
const meetings = await fireflies.getMeetingVideos();
meetings.forEach((meeting) => {
  if (meeting.video_url) {
    console.log(`Meeting: ${meeting.title}\nVideo URL: ${meeting.video_url}\n`);
  }
});

// Get transcript summary
const summary = await fireflies.getTranscriptSummary("transcript_id");
console.log("Overview:", summary.overview);
console.log("Action Items:", summary.action_items);
console.log("Keywords:", summary.keywords);
```

### 会议管理

```javascript
await fireflies.updateMeetingTitle({ id: "transcript_id", title: "Q3 planning" });
await fireflies.updateMeetingPrivacy({ id: "transcript_id", privacy: "teammates" });
await fireflies.updateMeetingChannel({ transcript_ids: ["t1", "t2"], channel_id: "channel_id" });

// Share with up to 50 people, optionally expiring after 7, 14 or 30 days
await fireflies.shareMeeting({ meeting_id: "transcript_id", emails: ["a@example.com"], expiry_days: 14 });
await fireflies.revokeSharedMeetingAccess({ meeting_id: "transcript_id", email: "a@example.com" });

// Search transcripts by keyword in titles and sentences
await fireflies.getTranscripts({ keyword: "pricing", scope: "all", fromDate: "2026-01-01T00:00:00.000Z" }, ["id", "title"]);
```

### 现场会议

```javascript
const meetings = await fireflies.getActiveMeetings({ states: ["active"] });

await fireflies.updateMeetingState({ meeting_id: meetings[0].id, action: "pause_recording" });
await fireflies.createLiveActionItem({ meeting_id: meetings[0].id, prompt: "Send the deck to the client" });
await fireflies.createLiveSoundbite({ meeting_id: meetings[0].id, prompt: "The pricing discussion" });
const items = await fireflies.getLiveActionItems(meetings[0].id);
```

### 问Fred

```javascript
const { message } = await fireflies.createAskFredThread({
  query: "What did we decide about the launch date?",
  transcript_id: "transcript_id", // or `filters` to search across meetings
});
console.log(message.answer);

const followUp = await fireflies.continueAskFredThread({ thread_id: message.thread_id, query: "Who owns it?" });

const threads = await fireflies.getAskFredThreads();
const thread = await fireflies.getAskFredThread(message.thread_id);
await fireflies.deleteAskFredThread(message.thread_id);
```

### 频道、联系人和用户组

```javascript
const channels = await fireflies.getChannels();
const channel = await fireflies.getChannel("channel_id");
const contacts = await fireflies.getContacts();

const groups = await fireflies.getUserGroups({ mine: true });
await fireflies.addUserToUserGroup({ group_id: "group_id", user_email: "a@example.com" });
await fireflies.removeUserFromUserGroup({ group_id: "group_id", user_email: "a@example.com" });
```

### 分析、审计日志和规则

```javascript
// Pass fields to choose what to return; see docs.fireflies.ai/graphql-api/query/analytics
const analytics = await fireflies.getAnalytics({ start_time: "2026-09-01T00:00:00Z" });

// Paginate with next_cursor
let cursor;
do {
  const page = await fireflies.getAuditEvents({ filters: { category: "MEETING_OPERATIONS" }, cursor });
  page.events.forEach((event) => console.log(event.time, event.action));
  cursor = page.has_more ? page.next_cursor : undefined;
} while (cursor);

const executions = await fireflies.getRuleExecutionsByMeeting({ limit: 10, filters: { is_test: false } });
```

### 方法

```javascript
// Get bites - see docs.fireflies.ai for all available fields
await fireflies.getBites({ mine: true, limit: 10 }, ["id", "name", "status"]);

// Create bite
await fireflies.createBite({
  transcript_id: "transcript_id",
  start_time: 120,
  end_time: 180,
});
```

### 音频上传

从公开的 HTTPS URL 中 :

```javascript
await fireflies.uploadAudio({
  url: "https://example.com/audio.mp3",
  title: "Meeting Recording",
  custom_language: "en",
});
```

来自本地文件, 并预签上传 URL :

```javascript
const fs = require("fs");

const file = fs.readFileSync("recording.mp3");
const { upload_url, meeting_id } = await fireflies.createUploadUrl({
  content_type: "audio/mpeg",
  file_size: file.length,
  title: "Meeting Recording",
});

const put = await fetch(upload_url, { method: "PUT", headers: { "Content-Type": "audio/mpeg" }, body: file });
if (!put.ok) throw new Error(`Upload failed: ${put.status}`);
await fireflies.confirmUpload(meeting_id);
```

## 高级特性

### 为多个用户获取会话

SDK提供了一个强大的功能,可以获取和复制多个用户的会议:

```javascript
const meetings = await FirefliesSDK.getMeetingsForMultipleUsers(
  ["api-key-1", "api-key-2", "api-key-3"],
  [
    "id",
    "title",
    "duration",
    "date",
    "host_email",
    "organizer_email",
    "summary { keywords action_items overview }",
  ],
  "json" // Output results to JSON files
);

// Results are also returned in the response
for (const [apiKey, result] of Object.entries(meetings)) {
  console.log(`API Key ${apiKey.split("-")[0]}:`);
  console.log(`- Meetings found: ${result.meetings.length}`);
  console.log(`- Errors encountered: ${result.errors.length}`);
}
```

这种方法 :

-   为多个用户使用 API 密钥获取会议
-   重复会议,以确保每次会议只分配给一个用户
-   从 API 分批处理请求 `X-RateLimit-Remaining` 编号 : `X-RateLimit-Reset` 信头( 回落到 5 个请求, 然后当信头缺席时暂停 5 s)
-   支持控制台输出和 JSON 文件输出
-   处理优雅的错误并提供详细的错误报告

当使用"json"输出时,结果被保存到:

-   `RESULTS_{api-key}.json`: 包含每个 API 密钥的会议
-   `ERRORS_{api-key}.json`: 包含每个 API 密钥遇到的任何错误

## 费率限制

萤火虫API按计划执行限制(每个计划每分钟限制一次,每天限制配额) Free and Pro; Business and Entertainment 将其每分钟的预算汇集到整个团队). 数字 和规则维持在 [API 文档的限定页](https://docs.fireflies.ai/fundamentals/limits) - SDK车 从来没有硬代码。 反之

| 页眉 | 含义 |
| --- | --- |
| `X-RateLimit-Limit` | 窗口大小 |
| `X-RateLimit-Remaining` | 请求留在窗口 |
| `X-RateLimit-Reset` | 秒到窗口重排 |
| `Retry-After` | 在一个 `429` 只: 在重试前等待秒 |

后缀变种 (`X-RateLimit-*-api`, (中文(简体) ), `X-RateLimit-*-api_burst`,)描述每个窗口 单独分析.

### 自动重试

与 HTTP 拒绝的请求 `429`,或带有 GraphQL 错误 `extensions.code` 实值 `too_many_requests`,在服务器要求的等待后重审: `Retry-After` 页眉,或 失败 `extensions.metadata.retryAfter` (时间戳入) **毫秒**) (中文(简体) ). SDK这个 永远不要提前复试 —— 在窗口重新打开前重试 , 并且永远不要等待 比起来 `maxRetryWaitMs`因此,每天耗尽的配额 立即浮出水面 而不是阻挡你的 进程时间.

```javascript
const fireflies = new FirefliesSDK({
  apiKey: process.env.FIREFLIES_API_KEY,
  rateLimit: {
    maxRetries: 3, // default; 0 disables retries
    maxRetryWaitMs: 65_000, // default; longer waits are surfaced as an error instead
    onRateLimited: ({ attempt, waitMs }) =>
      console.warn(`Rate limited, retry ${attempt} in ${waitMs} ms`),
  },
});
```

当复试被用完时 拒绝呼叫 `FirefliesRateLimitError`数字 :

```javascript
const { FirefliesRateLimitError } = require("@firefliesai/fireflies-node-sdk");

try {
  await fireflies.getTranscripts({ limit: 50 }, ["id"]);
} catch (error) {
  if (error instanceof FirefliesRateLimitError) {
    console.error(`Rate limited. Retry after ${error.retryAfter}s (at ${error.retryAt})`);
    console.error("Window that rejected the request:", error.rateLimit);
  }
}
```

### 检查当前状态

`sdk.rateLimit` 持有从API的答复中累积的费率限制状态(或 `null` 第一次选举之前 (第1个) 每个窗口都合并了每个响应,所以一个窗口的最新响应没有报告 (说 `call_join` ) 保留在旧旧的重置中,直到它 过期。 用它来抑制自己的循环:

```javascript
await fireflies.getCurrentUser(["email"]);
const state = fireflies.rateLimit; // null until a response carried the headers
if (state) {
  console.log(`${state.remaining}/${state.limit} requests left, window resets in ${state.reset}s`);
  console.log("Per-minute burst window:", state.windows.api_burst);
}
```

`getMeetingsForMultipleUsers` 财务报告和审定财务报表 `MeetingsHelper.batchProcess` 每个大小使用相同的状态 批次和等待出一个空窗口。 过 `{ rateLimitSource: sdk }` 调用时 `batchProcess` 直接,和 `concurrency` 编号 : `fallbackDelayMs` 编号 : `maxWaitMs` 来调音. 将一个端点按下自己的极限, 例如 `addToLiveMeeting`传出 `windows: ['default', 'api', 'api_burst', 'call_join']` 所以它的配额也封顶了批量.

## 处理错误

SDK使用标准节点.js错误处理:

```javascript
const { FirefliesRateLimitError } = require("@firefliesai/fireflies-node-sdk");

try {
  const transcripts = await fireflies.getTranscripts();
} catch (error) {
  if (error instanceof FirefliesRateLimitError) {
    console.error(`Rate limited, retry after ${error.retryAfter}s`);
  } else if (error.message.includes("API Error")) {
    console.error("Fireflies API Error:", error.message);
  } else {
    console.error("Network or other error:", error);
  }
}
```

## 实例

检查 [实例](https://npmcn.com/package/%40firefliesai/fireflies-node-sdk/examples) 更多使用示例的目录.

## 发展

```bash
# Install dependencies
npm install

# Run tests
npm test

# Build package
npm run build
```

## 捐款

1.  叉子存储器
2.  创建您的特性分支( E)`git checkout -b feature/amazing-feature`(中文(简体) )
3.  提交更改( E)`git commit -m 'Add amazing feature'`(中文(简体) )
4.  推向分行(`git push origin feature/amazing-feature`(中文(简体) )
5.  打开拉请求

## 贷项

-   [哈鲁纳·艾哈迈杜](https://github.com/sleemkeen)
-   [穆罕默德·阿卜杜拉](https://github.com/MrMuhammadAbdullah1704)
-   [所有贡献者](https://npmcn.com/package/contributors)

## 许可证

麻省理工学院

## 支助

-   [正式文件](https://docs.fireflies.ai/)
-   [API 参考](https://docs.fireflies.ai/graphql-api)
-   [支助门户](https://help.fireflies.ai/)
-   [GitHub 问题](https://github.com/fireflies-ai/node-sdk/issues)

## 常见问题

### @firefliesai/fireflies-node-sdk 是什么？

萤火虫的节点\.js SDK\.ai API

### 如何安装 @firefliesai/fireflies-node-sdk？

在项目目录运行 npm install @firefliesai/fireflies-node-sdk，或使用 pnpm add / yarn add / bun add。

### @firefliesai/fireflies-node-sdk 支持 TypeScript 吗？

支持。包内自带 TypeScript 类型声明（package\.json 声明了 types 入口），安装后即可获得类型提示，无需再安装 @types 包。

### @firefliesai/fireflies-node-sdk 支持 ESM 还是 CommonJS？

同时提供 ES Module 与 CommonJS 入口，import 和 require\(\) 都可以使用，打包工具会自动选择合适的版本。

### @firefliesai/fireflies-node-sdk 需要什么版本的 Node\.js？

package\.json 的 engines 字段要求 Node\.js \>=14\.0\.0。版本不符时 npm 默认只给出警告，开启 engine-strict 后会拒绝安装。

### @firefliesai/fireflies-node-sdk 可以商用吗？

@firefliesai/fireflies-node-sdk 使用 MIT 许可。宽松许可：允许商业使用、修改和再分发，通常只需在分发时保留原版权与许可声明。以上为概括，不构成法律意见，请以许可原文为准。

### @firefliesai/fireflies-node-sdk 的下载量有多少？

根据 npm 官方下载统计，@firefliesai/fireflies-node-sdk 在 2026/10/15 – 2026/11/13 这 30 天内被下载 2,025 次，日均约 68 次。下载量会把 CI 构建、镜像同步和作为其他包依赖的安装一并计入，适合横向比较热度，不能直接等同于使用人数。

### @firefliesai/fireflies-node-sdk 还在维护吗？

最新版本 1\.2\.1 发布于 2026/10/12（1 个月前）；至今共发布 5 个版本，其中过去 12 个月发布了 1 个；首次发布于 2025/04/25。发布频率只是参考信号：功能稳定的工具可能很少需要更新，建议结合源码仓库的 issue 和提交记录判断。

