|
|
const { v4 } = require("uuid");const { SystemSettings } = require("./systemSettings");
const Telemetry = { // Write-only key. It can't read events or any of your other data, so it's safe to use in public apps.
pubkey: "phc_9qu7QLpV8L84P3vFmEiZxL020t2EqIubP7HHHxrSsqS", stubDevelopmentEvents: true, // [DO NOT TOUCH] Core team only.
label: "telemetry_id",
id: async function () { const result = await SystemSettings.get({ label: this.label }); return result?.value || null; },
connect: async function () { const client = this.client(); const distinctId = await this.findOrCreateId(); return { client, distinctId }; },
isDev: function () { return process.env.NODE_ENV === "development" && this.stubDevelopmentEvents; },
client: function () { if (process.env.DISABLE_TELEMETRY === "true" || this.isDev()) return null; const { PostHog } = require("posthog-node"); return new PostHog(this.pubkey); },
runtime: function () { if (process.env.ANYTHING_LLM_RUNTIME === "docker") return "docker"; if (process.env.NODE_ENV === "production") return "production"; return "other"; },
sendTelemetry: async function ( event, eventProperties = {}, subUserId = null, silent = false ) { try { const { client, distinctId: systemId } = await this.connect(); if (!client) return; const distinctId = !!subUserId ? `${systemId}::${subUserId}` : systemId; const properties = { ...eventProperties, runtime: this.runtime() };
// Silence some events to keep logs from being too messy in production
// eg: Tool calls from agents spamming the logs.
if (!silent) { console.log(`\x1b[32m[TELEMETRY SENT]\x1b[0m`, { event, distinctId, properties, }); }
client.capture({ event, distinctId, properties, }); } catch { return; } },
flush: async function () { const client = this.client(); if (!client) return; await client.shutdownAsync(); },
setUid: async function () { const newId = v4(); await SystemSettings._updateSettings({ [this.label]: newId }); return newId; },
findOrCreateId: async function () { let currentId = await this.id(); if (currentId) return currentId;
currentId = await this.setUid(); return currentId; },};
module.exports = { Telemetry };
|