Skip to content
Snippets Groups Projects
telemetry.js 2.44 KiB
Newer Older
  • Learn to ignore specific revisions
  • 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",
    
        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 };
      },
    
        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 = {},
    
          const { client, distinctId: systemId } = await this.connect();
    
          const distinctId = !!subUserId ? `${systemId}::${subUserId}` : systemId;
    
          const properties = {
            ...eventProperties,
            runtime: this.runtime(),
            $process_person_profile: false,
          };
    
    
          // 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;
        }
      },
    
        const client = this.client();
    
        if (!client) return;
        await client.shutdownAsync();
      },
    
      setUid: async function () {
        const newId = v4();
    
        await SystemSettings._updateSettings({ [this.label]: newId });
    
      findOrCreateId: async function () {
    
        let currentId = await this.id();
        if (currentId) return currentId;
    
        currentId = await this.setUid();
        return currentId;