萤火虫.ai 节点.js SDK
一个与萤火虫互动的节点.js SDK.ai GraphQL API. 这个SDK提供了一个简单的接口来访问萤火虫. ai的会议记录和分析功能.
安装
npm install @firefliesai/fireflies-node-sdk
# or
yarn add @firefliesai/fireflies-node-sdk
快速启动
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 在工程根中的文件 :
FIREFLIES_API_KEY=your_api_key_here
特征
SDK覆盖了其中的每个操作 公共图形QL API数字 :
- 用户和团队: 当前用户,用户通过ID,所有用户,设置用户角色,用户组及其成员
- 语录: 列表(所有有记录的过滤器)并获取、删除、更新标题、隐私和频道、共享和取消访问
- 上传: 从公共 URL 上传, 或直接上传本地文件, 并带有预先签名的 URL
- 现场会议: 将萤火虫添加到会议中, 列出正在举行的会议, 暂停和恢复录制, 现场动作项目和声音
- 问Fred:询问关于一次会议或跨次会议的问题、后续行动、清单、读取和删除线索
- 贝斯(声贝): 创建、列表、获取
- 频道和联系人: 列表频道,获取频道,列表联系人
- 分析、审计记录和规则:团队和每个用户分析、审计事件、规则处决
- 大赦国际应用程序: 应用输出
- 限制费率意识: 自动、有界重试
429编号 :too_many_requests荣誉Retry-After; 批次帮助从X-RateLimit-*页眉; 解析状态于sdk.rateLimit - 多用户助手: 在多个API 密钥上获取和复制会议
返回对象的方法选择 fields 数组(要选择的 GraphQL 字段, 如
字符串,包含嵌入式选择). 当您没有通过时, 方法会选择一个合理的默认集 .
API 参考
关于现有字段和计划资料的完整清单,请参见: 官方的Filflies.ai文档。 。 。 .
用户方法
// 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");
转写方法
// 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);
会议管理
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: ["[email protected]"], expiry_days: 14 });
await fireflies.revokeSharedMeetingAccess({ meeting_id: "transcript_id", email: "[email protected]" });
// Search transcripts by keyword in titles and sentences
await fireflies.getTranscripts({ keyword: "pricing", scope: "all", fromDate: "2026-01-01T00:00:00.000Z" }, ["id", "title"]);
现场会议
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
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);
频道、联系人和用户组
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: "[email protected]" });
await fireflies.removeUserFromUserGroup({ group_id: "group_id", user_email: "[email protected]" });
分析、审计日志和规则
// 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 } });
方法
// 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 中 :
await fireflies.uploadAudio({
url: "https://example.com/audio.mp3",
title: "Meeting Recording",
custom_language: "en",
});
来自本地文件, 并预签上传 URL :
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提供了一个强大的功能,可以获取和复制多个用户的会议:
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 文档的限定页 - 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因此,每天耗尽的配额 立即浮出水面 而不是阻挡你的
进程时间.
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数字 :
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 ) 保留在旧旧的重置中,直到它
过期。 用它来抑制自己的循环:
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错误处理:
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);
}
}
实例
检查 实例 更多使用示例的目录.
发展
# Install dependencies
npm install
# Run tests
npm test
# Build package
npm run build
捐款
- 叉子存储器
- 创建您的特性分支( E)
git checkout -b feature/amazing-feature(中文(简体) ) - 提交更改( E)
git commit -m 'Add amazing feature'(中文(简体) ) - 推向分行(
git push origin feature/amazing-feature(中文(简体) ) - 打开拉请求
贷项
许可证
麻省理工学院