chore(web): Add PostHog LLM analytics - #882

Merged
brendan-kellam merged 4 commits into
mainfrom
bkellam/posthog-ai
Feb 24, 2026
Merged

chore(web): Add PostHog LLM analytics#882
brendan-kellam merged 4 commits into
mainfrom
bkellam/posthog-ai

Conversation

@brendan-kellam

@brendan-kellambrendan-kellam commented Feb 12, 2026

Copy link
Copy Markdown
Contributor

Summary by CodeRabbit

  • Chores
    • Added an AI/analytics integration dependency to the web package.
  • Refactor
    • Modularized and exported analytics helpers for cleaner initialization and ID retrieval.
  • Chores
    • Enhanced tracing/telemetry wiring for chat to improve observability and reliability.

@coderabbitai

coderabbitaiBot commented Feb 12, 2026

Copy link
Copy Markdown
Contributor

Caution

Review failed

The pull request is closed.

ℹ️ Recent review info

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 3e5b31a and 5e2e827.

📒 Files selected for processing (1)
  • packages/web/src/features/chat/actions.ts

Walkthrough

Adds @posthog/ai to the web package, exports PostHog helper functions, and refactors the AISDK model-selection flow to return { model, providerOptions } while initializing a PostHog client, obtaining a distinct ID, and optionally wrapping the model with tracing.

Changes

Cohort / File(s)Summary
Dependency Addition
packages/web/package.json
Added runtime dependency @posthog/ai^7.8.10.
PostHog Utilities
packages/web/src/lib/posthog.ts
Renamed/exported distinct-id getter as tryGetPostHogDistinctId and added createPostHogClient helper; captureEvent updated to use these helpers.
Chat Model Selection
packages/web/src/features/chat/actions.ts
Refactored _getAISDKLanguageModelAndOptions to return { model, providerOptions? }; centralized per-provider selection into one post-processing step that creates a PostHog client, retrieves distinct ID, and conditionally applies withTracing before returning.

Sequence Diagram(s)

sequenceDiagram
participant Client as Chat Client
participant Action as Model Selection Action
participant PostHog as PostHog Client
participant AISDK as AISDK Model
Client->>Action: Request model selection
Action->>Action: Select model & providerOptions
Action->>PostHog: createPostHogClient()
Action->>PostHog: tryGetPostHogDistinctId()
alt tracing enabled
Action->>AISDK: withTracing(model, distinctId)
AISDK-->>Action: tracedModel
else tracing disabled
Action-->>Action: use model as-is
end
Action->>Client: return { model, providerOptions }
Loading

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~40 minutes

Possibly related PRs

Suggested reviewers

  • msukkari
🚥 Pre-merge checks | ✅ 2 | ❌ 1

❌ Failed checks (1 warning)

Check nameStatusExplanationResolution
Docstring Coverage⚠️ WarningDocstring coverage is 0.00% which is insufficient. The required threshold is 80.00%.Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (2 passed)
Check nameStatusExplanation
Description Check✅ PassedCheck skipped - CodeRabbit’s high-level summary is enabled.
Title check✅ PassedThe pull request title 'chore(web): Add PostHog LLM analytics' clearly and accurately summarizes the main change—integrating PostHog analytics for LLM tracking in the web package.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
  • 📝 Generate docstrings (stacked PR)
  • 📝 Generate docstrings (commit on current branch)
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch bkellam/posthog-ai

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@brendan-kellam
brendan-kellam marked this pull request as ready for review February 23, 2026 21:25
@github-actions

Copy link
Copy Markdown
Contributor

@brendan-kellam your pull request is missing a changelog!

@coderabbitaicoderabbitaiBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
packages/web/src/lib/posthog.ts (1)

90-110: ⚠️ Potential issue | 🟡 Minor

distinctId may be undefined when passed to posthog.capture().

tryGetPostHogDistinctId() can return undefined, but posthog.capture() expects distinctId to be a string. When no distinct ID is resolvable (no cookie, no session, no API key), this will pass undefined to the PostHog client, which could cause silent data loss or a runtime error.

Consider guarding against this:

Suggested fix
 const distinctId = await tryGetPostHogDistinctId();
const posthog = await createPostHogClient();
+ if (!distinctId) {+ return;+ }+
const headersList = await headers();
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In `@packages/web/src/lib/posthog.ts` around lines 90 - 110, The call to
posthog.capture in captureEvent currently passes distinctId which can be
undefined (from tryGetPostHogDistinctId); ensure captureEvent always provides a
string by adding a fallback before calling posthog.capture (e.g., const
distinctIdSafe = distinctId ?? crypto.randomUUID() or a deterministic anon id
using env.SOURCEBOT_INSTALL_ID) and pass distinctIdSafe to posthog.capture
instead of distinctId; update references in captureEvent and keep
tryGetPostHogDistinctId usage but guard its result so posthog.capture never
receives undefined.
🧹 Nitpick comments (2)
packages/web/src/features/chat/actions.ts (1)

34-36: Consolidate duplicate imports from @/lib/posthog.

Lines 34 and 36 both import from @/lib/posthog. Merge them into a single import statement.

Suggested fix
-import { captureEvent } from "@/lib/posthog";-import { withTracing } from "@posthog/ai";-import { createPostHogClient, tryGetPostHogDistinctId } from "@/lib/posthog";+import { captureEvent, createPostHogClient, tryGetPostHogDistinctId } from "@/lib/posthog";+import { withTracing } from "@posthog/ai";
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In `@packages/web/src/features/chat/actions.ts` around lines 34 - 36, There are
duplicate import lines from "@/lib/posthog"; consolidate them by replacing the
two separate imports with a single import that includes captureEvent,
createPostHogClient, and tryGetPostHogDistinctId together (so update the import
statements that reference captureEvent and the import that references
createPostHogClient/tryGetPostHogDistinctId into one unified import).
packages/web/package.json (1)

66-66: Consider updating @posthog/ai to the latest available version.

Version 7.8.10 is valid and exists on npm, but it is not current. The latest version is 7.9.1, with several newer patch releases also available (7.8.11, 7.8.12, 7.8.13). Since the dependency specifies ^7.8.10, it would automatically accept these compatible updates. Consider upgrading to 7.9.1 to benefit from the latest features and fixes.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In `@packages/web/package.json` at line 66, Update the `@posthog/ai` dependency in
package.json by replacing the current version specifier "^7.8.10" with the newer
release (e.g. "7.9.1") so the project uses the latest patch/feature fixes;
locate the dependency entry for "@posthog/ai" and change the version string
accordingly, then run your package manager (npm/yarn/pnpm) to install and verify
no breakages.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.
Inline comments:
In `@packages/web/src/lib/posthog.ts`:
- Around line 80-88: The code currently creates a new PostHog client on every
call of createPostHogClient (and callers like captureEvent) causing resource
leaks; change createPostHogClient to lazily initialize and return a module-level
singleton PostHog instance (e.g., keep a private let posthogInstance and
instantiate it once inside createPostHogClient if undefined), update callers
(captureEvent and any usages in actions.ts) to reuse createPostHogClient instead
of creating new clients per invocation, and add/export a shutdown function
(e.g., shutdownPostHog) that calls posthogInstance.shutdown() for graceful
teardown (also call it on process exit in initialization code or tests as
needed).
---
Outside diff comments:
In `@packages/web/src/lib/posthog.ts`:
- Around line 90-110: The call to posthog.capture in captureEvent currently
passes distinctId which can be undefined (from tryGetPostHogDistinctId); ensure
captureEvent always provides a string by adding a fallback before calling
posthog.capture (e.g., const distinctIdSafe = distinctId ?? crypto.randomUUID()
or a deterministic anon id using env.SOURCEBOT_INSTALL_ID) and pass
distinctIdSafe to posthog.capture instead of distinctId; update references in
captureEvent and keep tryGetPostHogDistinctId usage but guard its result so
posthog.capture never receives undefined.
---
Nitpick comments:
In `@packages/web/package.json`:
- Line 66: Update the `@posthog/ai` dependency in package.json by replacing the
current version specifier "^7.8.10" with the newer release (e.g. "7.9.1") so the
project uses the latest patch/feature fixes; locate the dependency entry for
"@posthog/ai" and change the version string accordingly, then run your package
manager (npm/yarn/pnpm) to install and verify no breakages.
In `@packages/web/src/features/chat/actions.ts`:
- Around line 34-36: There are duplicate import lines from "@/lib/posthog";
consolidate them by replacing the two separate imports with a single import that
includes captureEvent, createPostHogClient, and tryGetPostHogDistinctId together
(so update the import statements that reference captureEvent and the import that
references createPostHogClient/tryGetPostHogDistinctId into one unified import).

ℹ️ Review info

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 5be4667 and 3e5b31a.

⛔ Files ignored due to path filters (1)
  • yarn.lock is excluded by !**/yarn.lock, !**/*.lock
📒 Files selected for processing (3)
  • packages/web/package.json
  • packages/web/src/features/chat/actions.ts
  • packages/web/src/lib/posthog.ts

Comment threadpackages/web/src/lib/posthog.ts
@brendan-kellam
brendan-kellam merged commit 5a00847 into mainFeb 24, 2026
8 checks passed
@brendan-kellam
brendan-kellam deleted the bkellam/posthog-ai branch February 24, 2026 23:53
@github-actionsgithub-actionsBot mentioned this pull request Feb 24, 2026
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@brendan-kellam
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

chore(web): Add PostHog LLM analytics - #882

Merged
brendan-kellam merged 4 commits into
mainfrom
bkellam/posthog-ai
Feb 24, 2026
Merged

chore(web): Add PostHog LLM analytics#882
brendan-kellam merged 4 commits into
mainfrom
bkellam/posthog-ai

Conversation

@brendan-kellam

@brendan-kellambrendan-kellam commented Feb 12, 2026

Copy link
Copy Markdown
Contributor

Summary by CodeRabbit

  • Chores
    • Added an AI/analytics integration dependency to the web package.
  • Refactor
    • Modularized and exported analytics helpers for cleaner initialization and ID retrieval.
  • Chores
    • Enhanced tracing/telemetry wiring for chat to improve observability and reliability.

@coderabbitai

coderabbitaiBot commented Feb 12, 2026

Copy link
Copy Markdown
Contributor

Caution

Review failed

The pull request is closed.

ℹ️ Recent review info

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 3e5b31a and 5e2e827.

📒 Files selected for processing (1)
  • packages/web/src/features/chat/actions.ts

Walkthrough

Adds @posthog/ai to the web package, exports PostHog helper functions, and refactors the AISDK model-selection flow to return { model, providerOptions } while initializing a PostHog client, obtaining a distinct ID, and optionally wrapping the model with tracing.

Changes

Cohort / File(s)Summary
Dependency Addition
packages/web/package.json
Added runtime dependency @posthog/ai^7.8.10.
PostHog Utilities
packages/web/src/lib/posthog.ts
Renamed/exported distinct-id getter as tryGetPostHogDistinctId and added createPostHogClient helper; captureEvent updated to use these helpers.
Chat Model Selection
packages/web/src/features/chat/actions.ts
Refactored _getAISDKLanguageModelAndOptions to return { model, providerOptions? }; centralized per-provider selection into one post-processing step that creates a PostHog client, retrieves distinct ID, and conditionally applies withTracing before returning.

Sequence Diagram(s)

sequenceDiagram
participant Client as Chat Client
participant Action as Model Selection Action
participant PostHog as PostHog Client
participant AISDK as AISDK Model
Client->>Action: Request model selection
Action->>Action: Select model & providerOptions
Action->>PostHog: createPostHogClient()
Action->>PostHog: tryGetPostHogDistinctId()
alt tracing enabled
Action->>AISDK: withTracing(model, distinctId)
AISDK-->>Action: tracedModel
else tracing disabled
Action-->>Action: use model as-is
end
Action->>Client: return { model, providerOptions }
Loading

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~40 minutes

Possibly related PRs

Suggested reviewers

  • msukkari
🚥 Pre-merge checks | ✅ 2 | ❌ 1

❌ Failed checks (1 warning)

Check nameStatusExplanationResolution
Docstring Coverage⚠️ WarningDocstring coverage is 0.00% which is insufficient. The required threshold is 80.00%.Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (2 passed)
Check nameStatusExplanation
Description Check✅ PassedCheck skipped - CodeRabbit’s high-level summary is enabled.
Title check✅ PassedThe pull request title 'chore(web): Add PostHog LLM analytics' clearly and accurately summarizes the main change—integrating PostHog analytics for LLM tracking in the web package.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
  • 📝 Generate docstrings (stacked PR)
  • 📝 Generate docstrings (commit on current branch)
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch bkellam/posthog-ai

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@brendan-kellam
brendan-kellam marked this pull request as ready for review February 23, 2026 21:25
@github-actions

Copy link
Copy Markdown
Contributor

@brendan-kellam your pull request is missing a changelog!

@coderabbitaicoderabbitaiBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
packages/web/src/lib/posthog.ts (1)

90-110: ⚠️ Potential issue | 🟡 Minor

distinctId may be undefined when passed to posthog.capture().

tryGetPostHogDistinctId() can return undefined, but posthog.capture() expects distinctId to be a string. When no distinct ID is resolvable (no cookie, no session, no API key), this will pass undefined to the PostHog client, which could cause silent data loss or a runtime error.

Consider guarding against this:

Suggested fix
 const distinctId = await tryGetPostHogDistinctId();
const posthog = await createPostHogClient();
+ if (!distinctId) {+ return;+ }+
const headersList = await headers();
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In `@packages/web/src/lib/posthog.ts` around lines 90 - 110, The call to
posthog.capture in captureEvent currently passes distinctId which can be
undefined (from tryGetPostHogDistinctId); ensure captureEvent always provides a
string by adding a fallback before calling posthog.capture (e.g., const
distinctIdSafe = distinctId ?? crypto.randomUUID() or a deterministic anon id
using env.SOURCEBOT_INSTALL_ID) and pass distinctIdSafe to posthog.capture
instead of distinctId; update references in captureEvent and keep
tryGetPostHogDistinctId usage but guard its result so posthog.capture never
receives undefined.
🧹 Nitpick comments (2)
packages/web/src/features/chat/actions.ts (1)

34-36: Consolidate duplicate imports from @/lib/posthog.

Lines 34 and 36 both import from @/lib/posthog. Merge them into a single import statement.

Suggested fix
-import { captureEvent } from "@/lib/posthog";-import { withTracing } from "@posthog/ai";-import { createPostHogClient, tryGetPostHogDistinctId } from "@/lib/posthog";+import { captureEvent, createPostHogClient, tryGetPostHogDistinctId } from "@/lib/posthog";+import { withTracing } from "@posthog/ai";
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In `@packages/web/src/features/chat/actions.ts` around lines 34 - 36, There are
duplicate import lines from "@/lib/posthog"; consolidate them by replacing the
two separate imports with a single import that includes captureEvent,
createPostHogClient, and tryGetPostHogDistinctId together (so update the import
statements that reference captureEvent and the import that references
createPostHogClient/tryGetPostHogDistinctId into one unified import).
packages/web/package.json (1)

66-66: Consider updating @posthog/ai to the latest available version.

Version 7.8.10 is valid and exists on npm, but it is not current. The latest version is 7.9.1, with several newer patch releases also available (7.8.11, 7.8.12, 7.8.13). Since the dependency specifies ^7.8.10, it would automatically accept these compatible updates. Consider upgrading to 7.9.1 to benefit from the latest features and fixes.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In `@packages/web/package.json` at line 66, Update the `@posthog/ai` dependency in
package.json by replacing the current version specifier "^7.8.10" with the newer
release (e.g. "7.9.1") so the project uses the latest patch/feature fixes;
locate the dependency entry for "@posthog/ai" and change the version string
accordingly, then run your package manager (npm/yarn/pnpm) to install and verify
no breakages.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.
Inline comments:
In `@packages/web/src/lib/posthog.ts`:
- Around line 80-88: The code currently creates a new PostHog client on every
call of createPostHogClient (and callers like captureEvent) causing resource
leaks; change createPostHogClient to lazily initialize and return a module-level
singleton PostHog instance (e.g., keep a private let posthogInstance and
instantiate it once inside createPostHogClient if undefined), update callers
(captureEvent and any usages in actions.ts) to reuse createPostHogClient instead
of creating new clients per invocation, and add/export a shutdown function
(e.g., shutdownPostHog) that calls posthogInstance.shutdown() for graceful
teardown (also call it on process exit in initialization code or tests as
needed).
---
Outside diff comments:
In `@packages/web/src/lib/posthog.ts`:
- Around line 90-110: The call to posthog.capture in captureEvent currently
passes distinctId which can be undefined (from tryGetPostHogDistinctId); ensure
captureEvent always provides a string by adding a fallback before calling
posthog.capture (e.g., const distinctIdSafe = distinctId ?? crypto.randomUUID()
or a deterministic anon id using env.SOURCEBOT_INSTALL_ID) and pass
distinctIdSafe to posthog.capture instead of distinctId; update references in
captureEvent and keep tryGetPostHogDistinctId usage but guard its result so
posthog.capture never receives undefined.
---
Nitpick comments:
In `@packages/web/package.json`:
- Line 66: Update the `@posthog/ai` dependency in package.json by replacing the
current version specifier "^7.8.10" with the newer release (e.g. "7.9.1") so the
project uses the latest patch/feature fixes; locate the dependency entry for
"@posthog/ai" and change the version string accordingly, then run your package
manager (npm/yarn/pnpm) to install and verify no breakages.
In `@packages/web/src/features/chat/actions.ts`:
- Around line 34-36: There are duplicate import lines from "@/lib/posthog";
consolidate them by replacing the two separate imports with a single import that
includes captureEvent, createPostHogClient, and tryGetPostHogDistinctId together
(so update the import statements that reference captureEvent and the import that
references createPostHogClient/tryGetPostHogDistinctId into one unified import).

ℹ️ Review info

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 5be4667 and 3e5b31a.

⛔ Files ignored due to path filters (1)
  • yarn.lock is excluded by !**/yarn.lock, !**/*.lock
📒 Files selected for processing (3)
  • packages/web/package.json
  • packages/web/src/features/chat/actions.ts
  • packages/web/src/lib/posthog.ts

Comment threadpackages/web/src/lib/posthog.ts
@brendan-kellam
brendan-kellam merged commit 5a00847 into mainFeb 24, 2026
8 checks passed
@brendan-kellam
brendan-kellam deleted the bkellam/posthog-ai branch February 24, 2026 23:53
@github-actionsgithub-actionsBot mentioned this pull request Feb 24, 2026
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@brendan-kellam
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

chore(web): Add PostHog LLM analytics - #882

Merged
brendan-kellam merged 4 commits into
mainfrom
bkellam/posthog-ai
Feb 24, 2026
Merged

chore(web): Add PostHog LLM analytics#882
brendan-kellam merged 4 commits into
mainfrom
bkellam/posthog-ai

Conversation

@brendan-kellam

@brendan-kellambrendan-kellam commented Feb 12, 2026

Copy link
Copy Markdown
Contributor

Summary by CodeRabbit

  • Chores
    • Added an AI/analytics integration dependency to the web package.
  • Refactor
    • Modularized and exported analytics helpers for cleaner initialization and ID retrieval.
  • Chores
    • Enhanced tracing/telemetry wiring for chat to improve observability and reliability.

@coderabbitai

coderabbitaiBot commented Feb 12, 2026

Copy link
Copy Markdown
Contributor

Caution

Review failed

The pull request is closed.

ℹ️ Recent review info

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 3e5b31a and 5e2e827.

📒 Files selected for processing (1)
  • packages/web/src/features/chat/actions.ts

Walkthrough

Adds @posthog/ai to the web package, exports PostHog helper functions, and refactors the AISDK model-selection flow to return { model, providerOptions } while initializing a PostHog client, obtaining a distinct ID, and optionally wrapping the model with tracing.

Changes

Cohort / File(s)Summary
Dependency Addition
packages/web/package.json
Added runtime dependency @posthog/ai^7.8.10.
PostHog Utilities
packages/web/src/lib/posthog.ts
Renamed/exported distinct-id getter as tryGetPostHogDistinctId and added createPostHogClient helper; captureEvent updated to use these helpers.
Chat Model Selection
packages/web/src/features/chat/actions.ts
Refactored _getAISDKLanguageModelAndOptions to return { model, providerOptions? }; centralized per-provider selection into one post-processing step that creates a PostHog client, retrieves distinct ID, and conditionally applies withTracing before returning.

Sequence Diagram(s)

sequenceDiagram
participant Client as Chat Client
participant Action as Model Selection Action
participant PostHog as PostHog Client
participant AISDK as AISDK Model
Client->>Action: Request model selection
Action->>Action: Select model & providerOptions
Action->>PostHog: createPostHogClient()
Action->>PostHog: tryGetPostHogDistinctId()
alt tracing enabled
Action->>AISDK: withTracing(model, distinctId)
AISDK-->>Action: tracedModel
else tracing disabled
Action-->>Action: use model as-is
end
Action->>Client: return { model, providerOptions }
Loading

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~40 minutes

Possibly related PRs

Suggested reviewers

  • msukkari
🚥 Pre-merge checks | ✅ 2 | ❌ 1

❌ Failed checks (1 warning)

Check nameStatusExplanationResolution
Docstring Coverage⚠️ WarningDocstring coverage is 0.00% which is insufficient. The required threshold is 80.00%.Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (2 passed)
Check nameStatusExplanation
Description Check✅ PassedCheck skipped - CodeRabbit’s high-level summary is enabled.
Title check✅ PassedThe pull request title 'chore(web): Add PostHog LLM analytics' clearly and accurately summarizes the main change—integrating PostHog analytics for LLM tracking in the web package.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
  • 📝 Generate docstrings (stacked PR)
  • 📝 Generate docstrings (commit on current branch)
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch bkellam/posthog-ai

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@brendan-kellam
brendan-kellam marked this pull request as ready for review February 23, 2026 21:25
@github-actions

Copy link
Copy Markdown
Contributor

@brendan-kellam your pull request is missing a changelog!

@coderabbitaicoderabbitaiBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
packages/web/src/lib/posthog.ts (1)

90-110: ⚠️ Potential issue | 🟡 Minor

distinctId may be undefined when passed to posthog.capture().

tryGetPostHogDistinctId() can return undefined, but posthog.capture() expects distinctId to be a string. When no distinct ID is resolvable (no cookie, no session, no API key), this will pass undefined to the PostHog client, which could cause silent data loss or a runtime error.

Consider guarding against this:

Suggested fix
 const distinctId = await tryGetPostHogDistinctId();
const posthog = await createPostHogClient();
+ if (!distinctId) {+ return;+ }+
const headersList = await headers();
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In `@packages/web/src/lib/posthog.ts` around lines 90 - 110, The call to
posthog.capture in captureEvent currently passes distinctId which can be
undefined (from tryGetPostHogDistinctId); ensure captureEvent always provides a
string by adding a fallback before calling posthog.capture (e.g., const
distinctIdSafe = distinctId ?? crypto.randomUUID() or a deterministic anon id
using env.SOURCEBOT_INSTALL_ID) and pass distinctIdSafe to posthog.capture
instead of distinctId; update references in captureEvent and keep
tryGetPostHogDistinctId usage but guard its result so posthog.capture never
receives undefined.
🧹 Nitpick comments (2)
packages/web/src/features/chat/actions.ts (1)

34-36: Consolidate duplicate imports from @/lib/posthog.

Lines 34 and 36 both import from @/lib/posthog. Merge them into a single import statement.

Suggested fix
-import { captureEvent } from "@/lib/posthog";-import { withTracing } from "@posthog/ai";-import { createPostHogClient, tryGetPostHogDistinctId } from "@/lib/posthog";+import { captureEvent, createPostHogClient, tryGetPostHogDistinctId } from "@/lib/posthog";+import { withTracing } from "@posthog/ai";
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In `@packages/web/src/features/chat/actions.ts` around lines 34 - 36, There are
duplicate import lines from "@/lib/posthog"; consolidate them by replacing the
two separate imports with a single import that includes captureEvent,
createPostHogClient, and tryGetPostHogDistinctId together (so update the import
statements that reference captureEvent and the import that references
createPostHogClient/tryGetPostHogDistinctId into one unified import).
packages/web/package.json (1)

66-66: Consider updating @posthog/ai to the latest available version.

Version 7.8.10 is valid and exists on npm, but it is not current. The latest version is 7.9.1, with several newer patch releases also available (7.8.11, 7.8.12, 7.8.13). Since the dependency specifies ^7.8.10, it would automatically accept these compatible updates. Consider upgrading to 7.9.1 to benefit from the latest features and fixes.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In `@packages/web/package.json` at line 66, Update the `@posthog/ai` dependency in
package.json by replacing the current version specifier "^7.8.10" with the newer
release (e.g. "7.9.1") so the project uses the latest patch/feature fixes;
locate the dependency entry for "@posthog/ai" and change the version string
accordingly, then run your package manager (npm/yarn/pnpm) to install and verify
no breakages.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.
Inline comments:
In `@packages/web/src/lib/posthog.ts`:
- Around line 80-88: The code currently creates a new PostHog client on every
call of createPostHogClient (and callers like captureEvent) causing resource
leaks; change createPostHogClient to lazily initialize and return a module-level
singleton PostHog instance (e.g., keep a private let posthogInstance and
instantiate it once inside createPostHogClient if undefined), update callers
(captureEvent and any usages in actions.ts) to reuse createPostHogClient instead
of creating new clients per invocation, and add/export a shutdown function
(e.g., shutdownPostHog) that calls posthogInstance.shutdown() for graceful
teardown (also call it on process exit in initialization code or tests as
needed).
---
Outside diff comments:
In `@packages/web/src/lib/posthog.ts`:
- Around line 90-110: The call to posthog.capture in captureEvent currently
passes distinctId which can be undefined (from tryGetPostHogDistinctId); ensure
captureEvent always provides a string by adding a fallback before calling
posthog.capture (e.g., const distinctIdSafe = distinctId ?? crypto.randomUUID()
or a deterministic anon id using env.SOURCEBOT_INSTALL_ID) and pass
distinctIdSafe to posthog.capture instead of distinctId; update references in
captureEvent and keep tryGetPostHogDistinctId usage but guard its result so
posthog.capture never receives undefined.
---
Nitpick comments:
In `@packages/web/package.json`:
- Line 66: Update the `@posthog/ai` dependency in package.json by replacing the
current version specifier "^7.8.10" with the newer release (e.g. "7.9.1") so the
project uses the latest patch/feature fixes; locate the dependency entry for
"@posthog/ai" and change the version string accordingly, then run your package
manager (npm/yarn/pnpm) to install and verify no breakages.
In `@packages/web/src/features/chat/actions.ts`:
- Around line 34-36: There are duplicate import lines from "@/lib/posthog";
consolidate them by replacing the two separate imports with a single import that
includes captureEvent, createPostHogClient, and tryGetPostHogDistinctId together
(so update the import statements that reference captureEvent and the import that
references createPostHogClient/tryGetPostHogDistinctId into one unified import).

ℹ️ Review info

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 5be4667 and 3e5b31a.

⛔ Files ignored due to path filters (1)
  • yarn.lock is excluded by !**/yarn.lock, !**/*.lock
📒 Files selected for processing (3)
  • packages/web/package.json
  • packages/web/src/features/chat/actions.ts
  • packages/web/src/lib/posthog.ts

Comment threadpackages/web/src/lib/posthog.ts
@brendan-kellam
brendan-kellam merged commit 5a00847 into mainFeb 24, 2026
8 checks passed
@brendan-kellam
brendan-kellam deleted the bkellam/posthog-ai branch February 24, 2026 23:53
@github-actionsgithub-actionsBot mentioned this pull request Feb 24, 2026
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@brendan-kellam
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

chore(web): Add PostHog LLM analytics - #882

Merged
brendan-kellam merged 4 commits into
mainfrom
bkellam/posthog-ai
Feb 24, 2026
Merged

chore(web): Add PostHog LLM analytics#882
brendan-kellam merged 4 commits into
mainfrom
bkellam/posthog-ai

Conversation

@brendan-kellam

@brendan-kellambrendan-kellam commented Feb 12, 2026

Copy link
Copy Markdown
Contributor

Summary by CodeRabbit

  • Chores
    • Added an AI/analytics integration dependency to the web package.
  • Refactor
    • Modularized and exported analytics helpers for cleaner initialization and ID retrieval.
  • Chores
    • Enhanced tracing/telemetry wiring for chat to improve observability and reliability.

@coderabbitai

coderabbitaiBot commented Feb 12, 2026

Copy link
Copy Markdown
Contributor

Caution

Review failed

The pull request is closed.

ℹ️ Recent review info

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 3e5b31a and 5e2e827.

📒 Files selected for processing (1)
  • packages/web/src/features/chat/actions.ts

Walkthrough

Adds @posthog/ai to the web package, exports PostHog helper functions, and refactors the AISDK model-selection flow to return { model, providerOptions } while initializing a PostHog client, obtaining a distinct ID, and optionally wrapping the model with tracing.

Changes

Cohort / File(s)Summary
Dependency Addition
packages/web/package.json
Added runtime dependency @posthog/ai^7.8.10.
PostHog Utilities
packages/web/src/lib/posthog.ts
Renamed/exported distinct-id getter as tryGetPostHogDistinctId and added createPostHogClient helper; captureEvent updated to use these helpers.
Chat Model Selection
packages/web/src/features/chat/actions.ts
Refactored _getAISDKLanguageModelAndOptions to return { model, providerOptions? }; centralized per-provider selection into one post-processing step that creates a PostHog client, retrieves distinct ID, and conditionally applies withTracing before returning.

Sequence Diagram(s)

sequenceDiagram
participant Client as Chat Client
participant Action as Model Selection Action
participant PostHog as PostHog Client
participant AISDK as AISDK Model
Client->>Action: Request model selection
Action->>Action: Select model & providerOptions
Action->>PostHog: createPostHogClient()
Action->>PostHog: tryGetPostHogDistinctId()
alt tracing enabled
Action->>AISDK: withTracing(model, distinctId)
AISDK-->>Action: tracedModel
else tracing disabled
Action-->>Action: use model as-is
end
Action->>Client: return { model, providerOptions }
Loading

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~40 minutes

Possibly related PRs

Suggested reviewers

  • msukkari
🚥 Pre-merge checks | ✅ 2 | ❌ 1

❌ Failed checks (1 warning)

Check nameStatusExplanationResolution
Docstring Coverage⚠️ WarningDocstring coverage is 0.00% which is insufficient. The required threshold is 80.00%.Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (2 passed)
Check nameStatusExplanation
Description Check✅ PassedCheck skipped - CodeRabbit’s high-level summary is enabled.
Title check✅ PassedThe pull request title 'chore(web): Add PostHog LLM analytics' clearly and accurately summarizes the main change—integrating PostHog analytics for LLM tracking in the web package.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
  • 📝 Generate docstrings (stacked PR)
  • 📝 Generate docstrings (commit on current branch)
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch bkellam/posthog-ai

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@brendan-kellam
brendan-kellam marked this pull request as ready for review February 23, 2026 21:25
@github-actions

Copy link
Copy Markdown
Contributor

@brendan-kellam your pull request is missing a changelog!

@coderabbitaicoderabbitaiBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
packages/web/src/lib/posthog.ts (1)

90-110: ⚠️ Potential issue | 🟡 Minor

distinctId may be undefined when passed to posthog.capture().

tryGetPostHogDistinctId() can return undefined, but posthog.capture() expects distinctId to be a string. When no distinct ID is resolvable (no cookie, no session, no API key), this will pass undefined to the PostHog client, which could cause silent data loss or a runtime error.

Consider guarding against this:

Suggested fix
 const distinctId = await tryGetPostHogDistinctId();
const posthog = await createPostHogClient();
+ if (!distinctId) {+ return;+ }+
const headersList = await headers();
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In `@packages/web/src/lib/posthog.ts` around lines 90 - 110, The call to
posthog.capture in captureEvent currently passes distinctId which can be
undefined (from tryGetPostHogDistinctId); ensure captureEvent always provides a
string by adding a fallback before calling posthog.capture (e.g., const
distinctIdSafe = distinctId ?? crypto.randomUUID() or a deterministic anon id
using env.SOURCEBOT_INSTALL_ID) and pass distinctIdSafe to posthog.capture
instead of distinctId; update references in captureEvent and keep
tryGetPostHogDistinctId usage but guard its result so posthog.capture never
receives undefined.
🧹 Nitpick comments (2)
packages/web/src/features/chat/actions.ts (1)

34-36: Consolidate duplicate imports from @/lib/posthog.

Lines 34 and 36 both import from @/lib/posthog. Merge them into a single import statement.

Suggested fix
-import { captureEvent } from "@/lib/posthog";-import { withTracing } from "@posthog/ai";-import { createPostHogClient, tryGetPostHogDistinctId } from "@/lib/posthog";+import { captureEvent, createPostHogClient, tryGetPostHogDistinctId } from "@/lib/posthog";+import { withTracing } from "@posthog/ai";
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In `@packages/web/src/features/chat/actions.ts` around lines 34 - 36, There are
duplicate import lines from "@/lib/posthog"; consolidate them by replacing the
two separate imports with a single import that includes captureEvent,
createPostHogClient, and tryGetPostHogDistinctId together (so update the import
statements that reference captureEvent and the import that references
createPostHogClient/tryGetPostHogDistinctId into one unified import).
packages/web/package.json (1)

66-66: Consider updating @posthog/ai to the latest available version.

Version 7.8.10 is valid and exists on npm, but it is not current. The latest version is 7.9.1, with several newer patch releases also available (7.8.11, 7.8.12, 7.8.13). Since the dependency specifies ^7.8.10, it would automatically accept these compatible updates. Consider upgrading to 7.9.1 to benefit from the latest features and fixes.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In `@packages/web/package.json` at line 66, Update the `@posthog/ai` dependency in
package.json by replacing the current version specifier "^7.8.10" with the newer
release (e.g. "7.9.1") so the project uses the latest patch/feature fixes;
locate the dependency entry for "@posthog/ai" and change the version string
accordingly, then run your package manager (npm/yarn/pnpm) to install and verify
no breakages.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.
Inline comments:
In `@packages/web/src/lib/posthog.ts`:
- Around line 80-88: The code currently creates a new PostHog client on every
call of createPostHogClient (and callers like captureEvent) causing resource
leaks; change createPostHogClient to lazily initialize and return a module-level
singleton PostHog instance (e.g., keep a private let posthogInstance and
instantiate it once inside createPostHogClient if undefined), update callers
(captureEvent and any usages in actions.ts) to reuse createPostHogClient instead
of creating new clients per invocation, and add/export a shutdown function
(e.g., shutdownPostHog) that calls posthogInstance.shutdown() for graceful
teardown (also call it on process exit in initialization code or tests as
needed).
---
Outside diff comments:
In `@packages/web/src/lib/posthog.ts`:
- Around line 90-110: The call to posthog.capture in captureEvent currently
passes distinctId which can be undefined (from tryGetPostHogDistinctId); ensure
captureEvent always provides a string by adding a fallback before calling
posthog.capture (e.g., const distinctIdSafe = distinctId ?? crypto.randomUUID()
or a deterministic anon id using env.SOURCEBOT_INSTALL_ID) and pass
distinctIdSafe to posthog.capture instead of distinctId; update references in
captureEvent and keep tryGetPostHogDistinctId usage but guard its result so
posthog.capture never receives undefined.
---
Nitpick comments:
In `@packages/web/package.json`:
- Line 66: Update the `@posthog/ai` dependency in package.json by replacing the
current version specifier "^7.8.10" with the newer release (e.g. "7.9.1") so the
project uses the latest patch/feature fixes; locate the dependency entry for
"@posthog/ai" and change the version string accordingly, then run your package
manager (npm/yarn/pnpm) to install and verify no breakages.
In `@packages/web/src/features/chat/actions.ts`:
- Around line 34-36: There are duplicate import lines from "@/lib/posthog";
consolidate them by replacing the two separate imports with a single import that
includes captureEvent, createPostHogClient, and tryGetPostHogDistinctId together
(so update the import statements that reference captureEvent and the import that
references createPostHogClient/tryGetPostHogDistinctId into one unified import).

ℹ️ Review info

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 5be4667 and 3e5b31a.

⛔ Files ignored due to path filters (1)
  • yarn.lock is excluded by !**/yarn.lock, !**/*.lock
📒 Files selected for processing (3)
  • packages/web/package.json
  • packages/web/src/features/chat/actions.ts
  • packages/web/src/lib/posthog.ts

Comment threadpackages/web/src/lib/posthog.ts
@brendan-kellam
brendan-kellam merged commit 5a00847 into mainFeb 24, 2026
8 checks passed
@brendan-kellam
brendan-kellam deleted the bkellam/posthog-ai branch February 24, 2026 23:53
@github-actionsgithub-actionsBot mentioned this pull request Feb 24, 2026
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@brendan-kellam
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

chore(web): Add PostHog LLM analytics - #882

Merged
brendan-kellam merged 4 commits into
mainfrom
bkellam/posthog-ai
Feb 24, 2026
Merged

chore(web): Add PostHog LLM analytics#882
brendan-kellam merged 4 commits into
mainfrom
bkellam/posthog-ai

Conversation

@brendan-kellam

@brendan-kellambrendan-kellam commented Feb 12, 2026

Copy link
Copy Markdown
Contributor

Summary by CodeRabbit

  • Chores
    • Added an AI/analytics integration dependency to the web package.
  • Refactor
    • Modularized and exported analytics helpers for cleaner initialization and ID retrieval.
  • Chores
    • Enhanced tracing/telemetry wiring for chat to improve observability and reliability.

@coderabbitai

coderabbitaiBot commented Feb 12, 2026

Copy link
Copy Markdown
Contributor

Caution

Review failed

The pull request is closed.

ℹ️ Recent review info

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 3e5b31a and 5e2e827.

📒 Files selected for processing (1)
  • packages/web/src/features/chat/actions.ts

Walkthrough

Adds @posthog/ai to the web package, exports PostHog helper functions, and refactors the AISDK model-selection flow to return { model, providerOptions } while initializing a PostHog client, obtaining a distinct ID, and optionally wrapping the model with tracing.

Changes

Cohort / File(s)Summary
Dependency Addition
packages/web/package.json
Added runtime dependency @posthog/ai^7.8.10.
PostHog Utilities
packages/web/src/lib/posthog.ts
Renamed/exported distinct-id getter as tryGetPostHogDistinctId and added createPostHogClient helper; captureEvent updated to use these helpers.
Chat Model Selection
packages/web/src/features/chat/actions.ts
Refactored _getAISDKLanguageModelAndOptions to return { model, providerOptions? }; centralized per-provider selection into one post-processing step that creates a PostHog client, retrieves distinct ID, and conditionally applies withTracing before returning.

Sequence Diagram(s)

sequenceDiagram
participant Client as Chat Client
participant Action as Model Selection Action
participant PostHog as PostHog Client
participant AISDK as AISDK Model
Client->>Action: Request model selection
Action->>Action: Select model & providerOptions
Action->>PostHog: createPostHogClient()
Action->>PostHog: tryGetPostHogDistinctId()
alt tracing enabled
Action->>AISDK: withTracing(model, distinctId)
AISDK-->>Action: tracedModel
else tracing disabled
Action-->>Action: use model as-is
end
Action->>Client: return { model, providerOptions }
Loading

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~40 minutes

Possibly related PRs

Suggested reviewers

  • msukkari
🚥 Pre-merge checks | ✅ 2 | ❌ 1

❌ Failed checks (1 warning)

Check nameStatusExplanationResolution
Docstring Coverage⚠️ WarningDocstring coverage is 0.00% which is insufficient. The required threshold is 80.00%.Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (2 passed)
Check nameStatusExplanation
Description Check✅ PassedCheck skipped - CodeRabbit’s high-level summary is enabled.
Title check✅ PassedThe pull request title 'chore(web): Add PostHog LLM analytics' clearly and accurately summarizes the main change—integrating PostHog analytics for LLM tracking in the web package.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
  • 📝 Generate docstrings (stacked PR)
  • 📝 Generate docstrings (commit on current branch)
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch bkellam/posthog-ai

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@brendan-kellam
brendan-kellam marked this pull request as ready for review February 23, 2026 21:25
@github-actions

Copy link
Copy Markdown
Contributor

@brendan-kellam your pull request is missing a changelog!

@coderabbitaicoderabbitaiBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
packages/web/src/lib/posthog.ts (1)

90-110: ⚠️ Potential issue | 🟡 Minor

distinctId may be undefined when passed to posthog.capture().

tryGetPostHogDistinctId() can return undefined, but posthog.capture() expects distinctId to be a string. When no distinct ID is resolvable (no cookie, no session, no API key), this will pass undefined to the PostHog client, which could cause silent data loss or a runtime error.

Consider guarding against this:

Suggested fix
 const distinctId = await tryGetPostHogDistinctId();
const posthog = await createPostHogClient();
+ if (!distinctId) {+ return;+ }+
const headersList = await headers();
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In `@packages/web/src/lib/posthog.ts` around lines 90 - 110, The call to
posthog.capture in captureEvent currently passes distinctId which can be
undefined (from tryGetPostHogDistinctId); ensure captureEvent always provides a
string by adding a fallback before calling posthog.capture (e.g., const
distinctIdSafe = distinctId ?? crypto.randomUUID() or a deterministic anon id
using env.SOURCEBOT_INSTALL_ID) and pass distinctIdSafe to posthog.capture
instead of distinctId; update references in captureEvent and keep
tryGetPostHogDistinctId usage but guard its result so posthog.capture never
receives undefined.
🧹 Nitpick comments (2)
packages/web/src/features/chat/actions.ts (1)

34-36: Consolidate duplicate imports from @/lib/posthog.

Lines 34 and 36 both import from @/lib/posthog. Merge them into a single import statement.

Suggested fix
-import { captureEvent } from "@/lib/posthog";-import { withTracing } from "@posthog/ai";-import { createPostHogClient, tryGetPostHogDistinctId } from "@/lib/posthog";+import { captureEvent, createPostHogClient, tryGetPostHogDistinctId } from "@/lib/posthog";+import { withTracing } from "@posthog/ai";
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In `@packages/web/src/features/chat/actions.ts` around lines 34 - 36, There are
duplicate import lines from "@/lib/posthog"; consolidate them by replacing the
two separate imports with a single import that includes captureEvent,
createPostHogClient, and tryGetPostHogDistinctId together (so update the import
statements that reference captureEvent and the import that references
createPostHogClient/tryGetPostHogDistinctId into one unified import).
packages/web/package.json (1)

66-66: Consider updating @posthog/ai to the latest available version.

Version 7.8.10 is valid and exists on npm, but it is not current. The latest version is 7.9.1, with several newer patch releases also available (7.8.11, 7.8.12, 7.8.13). Since the dependency specifies ^7.8.10, it would automatically accept these compatible updates. Consider upgrading to 7.9.1 to benefit from the latest features and fixes.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In `@packages/web/package.json` at line 66, Update the `@posthog/ai` dependency in
package.json by replacing the current version specifier "^7.8.10" with the newer
release (e.g. "7.9.1") so the project uses the latest patch/feature fixes;
locate the dependency entry for "@posthog/ai" and change the version string
accordingly, then run your package manager (npm/yarn/pnpm) to install and verify
no breakages.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.
Inline comments:
In `@packages/web/src/lib/posthog.ts`:
- Around line 80-88: The code currently creates a new PostHog client on every
call of createPostHogClient (and callers like captureEvent) causing resource
leaks; change createPostHogClient to lazily initialize and return a module-level
singleton PostHog instance (e.g., keep a private let posthogInstance and
instantiate it once inside createPostHogClient if undefined), update callers
(captureEvent and any usages in actions.ts) to reuse createPostHogClient instead
of creating new clients per invocation, and add/export a shutdown function
(e.g., shutdownPostHog) that calls posthogInstance.shutdown() for graceful
teardown (also call it on process exit in initialization code or tests as
needed).
---
Outside diff comments:
In `@packages/web/src/lib/posthog.ts`:
- Around line 90-110: The call to posthog.capture in captureEvent currently
passes distinctId which can be undefined (from tryGetPostHogDistinctId); ensure
captureEvent always provides a string by adding a fallback before calling
posthog.capture (e.g., const distinctIdSafe = distinctId ?? crypto.randomUUID()
or a deterministic anon id using env.SOURCEBOT_INSTALL_ID) and pass
distinctIdSafe to posthog.capture instead of distinctId; update references in
captureEvent and keep tryGetPostHogDistinctId usage but guard its result so
posthog.capture never receives undefined.
---
Nitpick comments:
In `@packages/web/package.json`:
- Line 66: Update the `@posthog/ai` dependency in package.json by replacing the
current version specifier "^7.8.10" with the newer release (e.g. "7.9.1") so the
project uses the latest patch/feature fixes; locate the dependency entry for
"@posthog/ai" and change the version string accordingly, then run your package
manager (npm/yarn/pnpm) to install and verify no breakages.
In `@packages/web/src/features/chat/actions.ts`:
- Around line 34-36: There are duplicate import lines from "@/lib/posthog";
consolidate them by replacing the two separate imports with a single import that
includes captureEvent, createPostHogClient, and tryGetPostHogDistinctId together
(so update the import statements that reference captureEvent and the import that
references createPostHogClient/tryGetPostHogDistinctId into one unified import).

ℹ️ Review info

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 5be4667 and 3e5b31a.

⛔ Files ignored due to path filters (1)
  • yarn.lock is excluded by !**/yarn.lock, !**/*.lock
📒 Files selected for processing (3)
  • packages/web/package.json
  • packages/web/src/features/chat/actions.ts
  • packages/web/src/lib/posthog.ts

Comment threadpackages/web/src/lib/posthog.ts
@brendan-kellam
brendan-kellam merged commit 5a00847 into mainFeb 24, 2026
8 checks passed
@brendan-kellam
brendan-kellam deleted the bkellam/posthog-ai branch February 24, 2026 23:53
@github-actionsgithub-actionsBot mentioned this pull request Feb 24, 2026
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@brendan-kellam
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

chore(web): Add PostHog LLM analytics - #882

Merged
brendan-kellam merged 4 commits into
mainfrom
bkellam/posthog-ai
Feb 24, 2026
Merged

chore(web): Add PostHog LLM analytics#882
brendan-kellam merged 4 commits into
mainfrom
bkellam/posthog-ai

Conversation

@brendan-kellam

@brendan-kellambrendan-kellam commented Feb 12, 2026

Copy link
Copy Markdown
Contributor

Summary by CodeRabbit

  • Chores
    • Added an AI/analytics integration dependency to the web package.
  • Refactor
    • Modularized and exported analytics helpers for cleaner initialization and ID retrieval.
  • Chores
    • Enhanced tracing/telemetry wiring for chat to improve observability and reliability.

@coderabbitai

coderabbitaiBot commented Feb 12, 2026

Copy link
Copy Markdown
Contributor

Caution

Review failed

The pull request is closed.

ℹ️ Recent review info

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 3e5b31a and 5e2e827.

📒 Files selected for processing (1)
  • packages/web/src/features/chat/actions.ts

Walkthrough

Adds @posthog/ai to the web package, exports PostHog helper functions, and refactors the AISDK model-selection flow to return { model, providerOptions } while initializing a PostHog client, obtaining a distinct ID, and optionally wrapping the model with tracing.

Changes

Cohort / File(s)Summary
Dependency Addition
packages/web/package.json
Added runtime dependency @posthog/ai^7.8.10.
PostHog Utilities
packages/web/src/lib/posthog.ts
Renamed/exported distinct-id getter as tryGetPostHogDistinctId and added createPostHogClient helper; captureEvent updated to use these helpers.
Chat Model Selection
packages/web/src/features/chat/actions.ts
Refactored _getAISDKLanguageModelAndOptions to return { model, providerOptions? }; centralized per-provider selection into one post-processing step that creates a PostHog client, retrieves distinct ID, and conditionally applies withTracing before returning.

Sequence Diagram(s)

sequenceDiagram
participant Client as Chat Client
participant Action as Model Selection Action
participant PostHog as PostHog Client
participant AISDK as AISDK Model
Client->>Action: Request model selection
Action->>Action: Select model & providerOptions
Action->>PostHog: createPostHogClient()
Action->>PostHog: tryGetPostHogDistinctId()
alt tracing enabled
Action->>AISDK: withTracing(model, distinctId)
AISDK-->>Action: tracedModel
else tracing disabled
Action-->>Action: use model as-is
end
Action->>Client: return { model, providerOptions }
Loading

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~40 minutes

Possibly related PRs

Suggested reviewers

  • msukkari
🚥 Pre-merge checks | ✅ 2 | ❌ 1

❌ Failed checks (1 warning)

Check nameStatusExplanationResolution
Docstring Coverage⚠️ WarningDocstring coverage is 0.00% which is insufficient. The required threshold is 80.00%.Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (2 passed)
Check nameStatusExplanation
Description Check✅ PassedCheck skipped - CodeRabbit’s high-level summary is enabled.
Title check✅ PassedThe pull request title 'chore(web): Add PostHog LLM analytics' clearly and accurately summarizes the main change—integrating PostHog analytics for LLM tracking in the web package.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
  • 📝 Generate docstrings (stacked PR)
  • 📝 Generate docstrings (commit on current branch)
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch bkellam/posthog-ai

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@brendan-kellam
brendan-kellam marked this pull request as ready for review February 23, 2026 21:25
@github-actions

Copy link
Copy Markdown
Contributor

@brendan-kellam your pull request is missing a changelog!

@coderabbitaicoderabbitaiBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
packages/web/src/lib/posthog.ts (1)

90-110: ⚠️ Potential issue | 🟡 Minor

distinctId may be undefined when passed to posthog.capture().

tryGetPostHogDistinctId() can return undefined, but posthog.capture() expects distinctId to be a string. When no distinct ID is resolvable (no cookie, no session, no API key), this will pass undefined to the PostHog client, which could cause silent data loss or a runtime error.

Consider guarding against this:

Suggested fix
 const distinctId = await tryGetPostHogDistinctId();
const posthog = await createPostHogClient();
+ if (!distinctId) {+ return;+ }+
const headersList = await headers();
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In `@packages/web/src/lib/posthog.ts` around lines 90 - 110, The call to
posthog.capture in captureEvent currently passes distinctId which can be
undefined (from tryGetPostHogDistinctId); ensure captureEvent always provides a
string by adding a fallback before calling posthog.capture (e.g., const
distinctIdSafe = distinctId ?? crypto.randomUUID() or a deterministic anon id
using env.SOURCEBOT_INSTALL_ID) and pass distinctIdSafe to posthog.capture
instead of distinctId; update references in captureEvent and keep
tryGetPostHogDistinctId usage but guard its result so posthog.capture never
receives undefined.
🧹 Nitpick comments (2)
packages/web/src/features/chat/actions.ts (1)

34-36: Consolidate duplicate imports from @/lib/posthog.

Lines 34 and 36 both import from @/lib/posthog. Merge them into a single import statement.

Suggested fix
-import { captureEvent } from "@/lib/posthog";-import { withTracing } from "@posthog/ai";-import { createPostHogClient, tryGetPostHogDistinctId } from "@/lib/posthog";+import { captureEvent, createPostHogClient, tryGetPostHogDistinctId } from "@/lib/posthog";+import { withTracing } from "@posthog/ai";
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In `@packages/web/src/features/chat/actions.ts` around lines 34 - 36, There are
duplicate import lines from "@/lib/posthog"; consolidate them by replacing the
two separate imports with a single import that includes captureEvent,
createPostHogClient, and tryGetPostHogDistinctId together (so update the import
statements that reference captureEvent and the import that references
createPostHogClient/tryGetPostHogDistinctId into one unified import).
packages/web/package.json (1)

66-66: Consider updating @posthog/ai to the latest available version.

Version 7.8.10 is valid and exists on npm, but it is not current. The latest version is 7.9.1, with several newer patch releases also available (7.8.11, 7.8.12, 7.8.13). Since the dependency specifies ^7.8.10, it would automatically accept these compatible updates. Consider upgrading to 7.9.1 to benefit from the latest features and fixes.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In `@packages/web/package.json` at line 66, Update the `@posthog/ai` dependency in
package.json by replacing the current version specifier "^7.8.10" with the newer
release (e.g. "7.9.1") so the project uses the latest patch/feature fixes;
locate the dependency entry for "@posthog/ai" and change the version string
accordingly, then run your package manager (npm/yarn/pnpm) to install and verify
no breakages.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.
Inline comments:
In `@packages/web/src/lib/posthog.ts`:
- Around line 80-88: The code currently creates a new PostHog client on every
call of createPostHogClient (and callers like captureEvent) causing resource
leaks; change createPostHogClient to lazily initialize and return a module-level
singleton PostHog instance (e.g., keep a private let posthogInstance and
instantiate it once inside createPostHogClient if undefined), update callers
(captureEvent and any usages in actions.ts) to reuse createPostHogClient instead
of creating new clients per invocation, and add/export a shutdown function
(e.g., shutdownPostHog) that calls posthogInstance.shutdown() for graceful
teardown (also call it on process exit in initialization code or tests as
needed).
---
Outside diff comments:
In `@packages/web/src/lib/posthog.ts`:
- Around line 90-110: The call to posthog.capture in captureEvent currently
passes distinctId which can be undefined (from tryGetPostHogDistinctId); ensure
captureEvent always provides a string by adding a fallback before calling
posthog.capture (e.g., const distinctIdSafe = distinctId ?? crypto.randomUUID()
or a deterministic anon id using env.SOURCEBOT_INSTALL_ID) and pass
distinctIdSafe to posthog.capture instead of distinctId; update references in
captureEvent and keep tryGetPostHogDistinctId usage but guard its result so
posthog.capture never receives undefined.
---
Nitpick comments:
In `@packages/web/package.json`:
- Line 66: Update the `@posthog/ai` dependency in package.json by replacing the
current version specifier "^7.8.10" with the newer release (e.g. "7.9.1") so the
project uses the latest patch/feature fixes; locate the dependency entry for
"@posthog/ai" and change the version string accordingly, then run your package
manager (npm/yarn/pnpm) to install and verify no breakages.
In `@packages/web/src/features/chat/actions.ts`:
- Around line 34-36: There are duplicate import lines from "@/lib/posthog";
consolidate them by replacing the two separate imports with a single import that
includes captureEvent, createPostHogClient, and tryGetPostHogDistinctId together
(so update the import statements that reference captureEvent and the import that
references createPostHogClient/tryGetPostHogDistinctId into one unified import).

ℹ️ Review info

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 5be4667 and 3e5b31a.

⛔ Files ignored due to path filters (1)
  • yarn.lock is excluded by !**/yarn.lock, !**/*.lock
📒 Files selected for processing (3)
  • packages/web/package.json
  • packages/web/src/features/chat/actions.ts
  • packages/web/src/lib/posthog.ts

Comment threadpackages/web/src/lib/posthog.ts
@brendan-kellam
brendan-kellam merged commit 5a00847 into mainFeb 24, 2026
8 checks passed
@brendan-kellam
brendan-kellam deleted the bkellam/posthog-ai branch February 24, 2026 23:53
@github-actionsgithub-actionsBot mentioned this pull request Feb 24, 2026
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@brendan-kellam
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

chore(web): Add PostHog LLM analytics - #882

Merged
brendan-kellam merged 4 commits into
mainfrom
bkellam/posthog-ai
Feb 24, 2026
Merged

chore(web): Add PostHog LLM analytics#882
brendan-kellam merged 4 commits into
mainfrom
bkellam/posthog-ai

Conversation

@brendan-kellam

@brendan-kellambrendan-kellam commented Feb 12, 2026

Copy link
Copy Markdown
Contributor

Summary by CodeRabbit

  • Chores
    • Added an AI/analytics integration dependency to the web package.
  • Refactor
    • Modularized and exported analytics helpers for cleaner initialization and ID retrieval.
  • Chores
    • Enhanced tracing/telemetry wiring for chat to improve observability and reliability.

@coderabbitai

coderabbitaiBot commented Feb 12, 2026

Copy link
Copy Markdown
Contributor

Caution

Review failed

The pull request is closed.

ℹ️ Recent review info

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 3e5b31a and 5e2e827.

📒 Files selected for processing (1)
  • packages/web/src/features/chat/actions.ts

Walkthrough

Adds @posthog/ai to the web package, exports PostHog helper functions, and refactors the AISDK model-selection flow to return { model, providerOptions } while initializing a PostHog client, obtaining a distinct ID, and optionally wrapping the model with tracing.

Changes

Cohort / File(s)Summary
Dependency Addition
packages/web/package.json
Added runtime dependency @posthog/ai^7.8.10.
PostHog Utilities
packages/web/src/lib/posthog.ts
Renamed/exported distinct-id getter as tryGetPostHogDistinctId and added createPostHogClient helper; captureEvent updated to use these helpers.
Chat Model Selection
packages/web/src/features/chat/actions.ts
Refactored _getAISDKLanguageModelAndOptions to return { model, providerOptions? }; centralized per-provider selection into one post-processing step that creates a PostHog client, retrieves distinct ID, and conditionally applies withTracing before returning.

Sequence Diagram(s)

sequenceDiagram
participant Client as Chat Client
participant Action as Model Selection Action
participant PostHog as PostHog Client
participant AISDK as AISDK Model
Client->>Action: Request model selection
Action->>Action: Select model & providerOptions
Action->>PostHog: createPostHogClient()
Action->>PostHog: tryGetPostHogDistinctId()
alt tracing enabled
Action->>AISDK: withTracing(model, distinctId)
AISDK-->>Action: tracedModel
else tracing disabled
Action-->>Action: use model as-is
end
Action->>Client: return { model, providerOptions }
Loading

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~40 minutes

Possibly related PRs

Suggested reviewers

  • msukkari
🚥 Pre-merge checks | ✅ 2 | ❌ 1

❌ Failed checks (1 warning)

Check nameStatusExplanationResolution
Docstring Coverage⚠️ WarningDocstring coverage is 0.00% which is insufficient. The required threshold is 80.00%.Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (2 passed)
Check nameStatusExplanation
Description Check✅ PassedCheck skipped - CodeRabbit’s high-level summary is enabled.
Title check✅ PassedThe pull request title 'chore(web): Add PostHog LLM analytics' clearly and accurately summarizes the main change—integrating PostHog analytics for LLM tracking in the web package.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
  • 📝 Generate docstrings (stacked PR)
  • 📝 Generate docstrings (commit on current branch)
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch bkellam/posthog-ai

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@brendan-kellam
brendan-kellam marked this pull request as ready for review February 23, 2026 21:25
@github-actions

Copy link
Copy Markdown
Contributor

@brendan-kellam your pull request is missing a changelog!

@coderabbitaicoderabbitaiBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
packages/web/src/lib/posthog.ts (1)

90-110: ⚠️ Potential issue | 🟡 Minor

distinctId may be undefined when passed to posthog.capture().

tryGetPostHogDistinctId() can return undefined, but posthog.capture() expects distinctId to be a string. When no distinct ID is resolvable (no cookie, no session, no API key), this will pass undefined to the PostHog client, which could cause silent data loss or a runtime error.

Consider guarding against this:

Suggested fix
 const distinctId = await tryGetPostHogDistinctId();
const posthog = await createPostHogClient();
+ if (!distinctId) {+ return;+ }+
const headersList = await headers();
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In `@packages/web/src/lib/posthog.ts` around lines 90 - 110, The call to
posthog.capture in captureEvent currently passes distinctId which can be
undefined (from tryGetPostHogDistinctId); ensure captureEvent always provides a
string by adding a fallback before calling posthog.capture (e.g., const
distinctIdSafe = distinctId ?? crypto.randomUUID() or a deterministic anon id
using env.SOURCEBOT_INSTALL_ID) and pass distinctIdSafe to posthog.capture
instead of distinctId; update references in captureEvent and keep
tryGetPostHogDistinctId usage but guard its result so posthog.capture never
receives undefined.
🧹 Nitpick comments (2)
packages/web/src/features/chat/actions.ts (1)

34-36: Consolidate duplicate imports from @/lib/posthog.

Lines 34 and 36 both import from @/lib/posthog. Merge them into a single import statement.

Suggested fix
-import { captureEvent } from "@/lib/posthog";-import { withTracing } from "@posthog/ai";-import { createPostHogClient, tryGetPostHogDistinctId } from "@/lib/posthog";+import { captureEvent, createPostHogClient, tryGetPostHogDistinctId } from "@/lib/posthog";+import { withTracing } from "@posthog/ai";
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In `@packages/web/src/features/chat/actions.ts` around lines 34 - 36, There are
duplicate import lines from "@/lib/posthog"; consolidate them by replacing the
two separate imports with a single import that includes captureEvent,
createPostHogClient, and tryGetPostHogDistinctId together (so update the import
statements that reference captureEvent and the import that references
createPostHogClient/tryGetPostHogDistinctId into one unified import).
packages/web/package.json (1)

66-66: Consider updating @posthog/ai to the latest available version.

Version 7.8.10 is valid and exists on npm, but it is not current. The latest version is 7.9.1, with several newer patch releases also available (7.8.11, 7.8.12, 7.8.13). Since the dependency specifies ^7.8.10, it would automatically accept these compatible updates. Consider upgrading to 7.9.1 to benefit from the latest features and fixes.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In `@packages/web/package.json` at line 66, Update the `@posthog/ai` dependency in
package.json by replacing the current version specifier "^7.8.10" with the newer
release (e.g. "7.9.1") so the project uses the latest patch/feature fixes;
locate the dependency entry for "@posthog/ai" and change the version string
accordingly, then run your package manager (npm/yarn/pnpm) to install and verify
no breakages.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.
Inline comments:
In `@packages/web/src/lib/posthog.ts`:
- Around line 80-88: The code currently creates a new PostHog client on every
call of createPostHogClient (and callers like captureEvent) causing resource
leaks; change createPostHogClient to lazily initialize and return a module-level
singleton PostHog instance (e.g., keep a private let posthogInstance and
instantiate it once inside createPostHogClient if undefined), update callers
(captureEvent and any usages in actions.ts) to reuse createPostHogClient instead
of creating new clients per invocation, and add/export a shutdown function
(e.g., shutdownPostHog) that calls posthogInstance.shutdown() for graceful
teardown (also call it on process exit in initialization code or tests as
needed).
---
Outside diff comments:
In `@packages/web/src/lib/posthog.ts`:
- Around line 90-110: The call to posthog.capture in captureEvent currently
passes distinctId which can be undefined (from tryGetPostHogDistinctId); ensure
captureEvent always provides a string by adding a fallback before calling
posthog.capture (e.g., const distinctIdSafe = distinctId ?? crypto.randomUUID()
or a deterministic anon id using env.SOURCEBOT_INSTALL_ID) and pass
distinctIdSafe to posthog.capture instead of distinctId; update references in
captureEvent and keep tryGetPostHogDistinctId usage but guard its result so
posthog.capture never receives undefined.
---
Nitpick comments:
In `@packages/web/package.json`:
- Line 66: Update the `@posthog/ai` dependency in package.json by replacing the
current version specifier "^7.8.10" with the newer release (e.g. "7.9.1") so the
project uses the latest patch/feature fixes; locate the dependency entry for
"@posthog/ai" and change the version string accordingly, then run your package
manager (npm/yarn/pnpm) to install and verify no breakages.
In `@packages/web/src/features/chat/actions.ts`:
- Around line 34-36: There are duplicate import lines from "@/lib/posthog";
consolidate them by replacing the two separate imports with a single import that
includes captureEvent, createPostHogClient, and tryGetPostHogDistinctId together
(so update the import statements that reference captureEvent and the import that
references createPostHogClient/tryGetPostHogDistinctId into one unified import).

ℹ️ Review info

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 5be4667 and 3e5b31a.

⛔ Files ignored due to path filters (1)
  • yarn.lock is excluded by !**/yarn.lock, !**/*.lock
📒 Files selected for processing (3)
  • packages/web/package.json
  • packages/web/src/features/chat/actions.ts
  • packages/web/src/lib/posthog.ts

Comment threadpackages/web/src/lib/posthog.ts
@brendan-kellam
brendan-kellam merged commit 5a00847 into mainFeb 24, 2026
8 checks passed
@brendan-kellam
brendan-kellam deleted the bkellam/posthog-ai branch February 24, 2026 23:53
@github-actionsgithub-actionsBot mentioned this pull request Feb 24, 2026
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@brendan-kellam
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

chore(web): Add PostHog LLM analytics - #882

Merged
brendan-kellam merged 4 commits into
mainfrom
bkellam/posthog-ai
Feb 24, 2026
Merged

chore(web): Add PostHog LLM analytics#882
brendan-kellam merged 4 commits into
mainfrom
bkellam/posthog-ai

Conversation

@brendan-kellam

@brendan-kellambrendan-kellam commented Feb 12, 2026

Copy link
Copy Markdown
Contributor

Summary by CodeRabbit

  • Chores
    • Added an AI/analytics integration dependency to the web package.
  • Refactor
    • Modularized and exported analytics helpers for cleaner initialization and ID retrieval.
  • Chores
    • Enhanced tracing/telemetry wiring for chat to improve observability and reliability.

@coderabbitai

coderabbitaiBot commented Feb 12, 2026

Copy link
Copy Markdown
Contributor

Caution

Review failed

The pull request is closed.

ℹ️ Recent review info

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 3e5b31a and 5e2e827.

📒 Files selected for processing (1)
  • packages/web/src/features/chat/actions.ts

Walkthrough

Adds @posthog/ai to the web package, exports PostHog helper functions, and refactors the AISDK model-selection flow to return { model, providerOptions } while initializing a PostHog client, obtaining a distinct ID, and optionally wrapping the model with tracing.

Changes

Cohort / File(s)Summary
Dependency Addition
packages/web/package.json
Added runtime dependency @posthog/ai^7.8.10.
PostHog Utilities
packages/web/src/lib/posthog.ts
Renamed/exported distinct-id getter as tryGetPostHogDistinctId and added createPostHogClient helper; captureEvent updated to use these helpers.
Chat Model Selection
packages/web/src/features/chat/actions.ts
Refactored _getAISDKLanguageModelAndOptions to return { model, providerOptions? }; centralized per-provider selection into one post-processing step that creates a PostHog client, retrieves distinct ID, and conditionally applies withTracing before returning.

Sequence Diagram(s)

sequenceDiagram
participant Client as Chat Client
participant Action as Model Selection Action
participant PostHog as PostHog Client
participant AISDK as AISDK Model
Client->>Action: Request model selection
Action->>Action: Select model & providerOptions
Action->>PostHog: createPostHogClient()
Action->>PostHog: tryGetPostHogDistinctId()
alt tracing enabled
Action->>AISDK: withTracing(model, distinctId)
AISDK-->>Action: tracedModel
else tracing disabled
Action-->>Action: use model as-is
end
Action->>Client: return { model, providerOptions }
Loading

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~40 minutes

Possibly related PRs

Suggested reviewers

  • msukkari
🚥 Pre-merge checks | ✅ 2 | ❌ 1

❌ Failed checks (1 warning)

Check nameStatusExplanationResolution
Docstring Coverage⚠️ WarningDocstring coverage is 0.00% which is insufficient. The required threshold is 80.00%.Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (2 passed)
Check nameStatusExplanation
Description Check✅ PassedCheck skipped - CodeRabbit’s high-level summary is enabled.
Title check✅ PassedThe pull request title 'chore(web): Add PostHog LLM analytics' clearly and accurately summarizes the main change—integrating PostHog analytics for LLM tracking in the web package.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
  • 📝 Generate docstrings (stacked PR)
  • 📝 Generate docstrings (commit on current branch)
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch bkellam/posthog-ai

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@brendan-kellam
brendan-kellam marked this pull request as ready for review February 23, 2026 21:25
@github-actions

Copy link
Copy Markdown
Contributor

@brendan-kellam your pull request is missing a changelog!

@coderabbitaicoderabbitaiBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
packages/web/src/lib/posthog.ts (1)

90-110: ⚠️ Potential issue | 🟡 Minor

distinctId may be undefined when passed to posthog.capture().

tryGetPostHogDistinctId() can return undefined, but posthog.capture() expects distinctId to be a string. When no distinct ID is resolvable (no cookie, no session, no API key), this will pass undefined to the PostHog client, which could cause silent data loss or a runtime error.

Consider guarding against this:

Suggested fix
 const distinctId = await tryGetPostHogDistinctId();
const posthog = await createPostHogClient();
+ if (!distinctId) {+ return;+ }+
const headersList = await headers();
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In `@packages/web/src/lib/posthog.ts` around lines 90 - 110, The call to
posthog.capture in captureEvent currently passes distinctId which can be
undefined (from tryGetPostHogDistinctId); ensure captureEvent always provides a
string by adding a fallback before calling posthog.capture (e.g., const
distinctIdSafe = distinctId ?? crypto.randomUUID() or a deterministic anon id
using env.SOURCEBOT_INSTALL_ID) and pass distinctIdSafe to posthog.capture
instead of distinctId; update references in captureEvent and keep
tryGetPostHogDistinctId usage but guard its result so posthog.capture never
receives undefined.
🧹 Nitpick comments (2)
packages/web/src/features/chat/actions.ts (1)

34-36: Consolidate duplicate imports from @/lib/posthog.

Lines 34 and 36 both import from @/lib/posthog. Merge them into a single import statement.

Suggested fix
-import { captureEvent } from "@/lib/posthog";-import { withTracing } from "@posthog/ai";-import { createPostHogClient, tryGetPostHogDistinctId } from "@/lib/posthog";+import { captureEvent, createPostHogClient, tryGetPostHogDistinctId } from "@/lib/posthog";+import { withTracing } from "@posthog/ai";
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In `@packages/web/src/features/chat/actions.ts` around lines 34 - 36, There are
duplicate import lines from "@/lib/posthog"; consolidate them by replacing the
two separate imports with a single import that includes captureEvent,
createPostHogClient, and tryGetPostHogDistinctId together (so update the import
statements that reference captureEvent and the import that references
createPostHogClient/tryGetPostHogDistinctId into one unified import).
packages/web/package.json (1)

66-66: Consider updating @posthog/ai to the latest available version.

Version 7.8.10 is valid and exists on npm, but it is not current. The latest version is 7.9.1, with several newer patch releases also available (7.8.11, 7.8.12, 7.8.13). Since the dependency specifies ^7.8.10, it would automatically accept these compatible updates. Consider upgrading to 7.9.1 to benefit from the latest features and fixes.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In `@packages/web/package.json` at line 66, Update the `@posthog/ai` dependency in
package.json by replacing the current version specifier "^7.8.10" with the newer
release (e.g. "7.9.1") so the project uses the latest patch/feature fixes;
locate the dependency entry for "@posthog/ai" and change the version string
accordingly, then run your package manager (npm/yarn/pnpm) to install and verify
no breakages.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.
Inline comments:
In `@packages/web/src/lib/posthog.ts`:
- Around line 80-88: The code currently creates a new PostHog client on every
call of createPostHogClient (and callers like captureEvent) causing resource
leaks; change createPostHogClient to lazily initialize and return a module-level
singleton PostHog instance (e.g., keep a private let posthogInstance and
instantiate it once inside createPostHogClient if undefined), update callers
(captureEvent and any usages in actions.ts) to reuse createPostHogClient instead
of creating new clients per invocation, and add/export a shutdown function
(e.g., shutdownPostHog) that calls posthogInstance.shutdown() for graceful
teardown (also call it on process exit in initialization code or tests as
needed).
---
Outside diff comments:
In `@packages/web/src/lib/posthog.ts`:
- Around line 90-110: The call to posthog.capture in captureEvent currently
passes distinctId which can be undefined (from tryGetPostHogDistinctId); ensure
captureEvent always provides a string by adding a fallback before calling
posthog.capture (e.g., const distinctIdSafe = distinctId ?? crypto.randomUUID()
or a deterministic anon id using env.SOURCEBOT_INSTALL_ID) and pass
distinctIdSafe to posthog.capture instead of distinctId; update references in
captureEvent and keep tryGetPostHogDistinctId usage but guard its result so
posthog.capture never receives undefined.
---
Nitpick comments:
In `@packages/web/package.json`:
- Line 66: Update the `@posthog/ai` dependency in package.json by replacing the
current version specifier "^7.8.10" with the newer release (e.g. "7.9.1") so the
project uses the latest patch/feature fixes; locate the dependency entry for
"@posthog/ai" and change the version string accordingly, then run your package
manager (npm/yarn/pnpm) to install and verify no breakages.
In `@packages/web/src/features/chat/actions.ts`:
- Around line 34-36: There are duplicate import lines from "@/lib/posthog";
consolidate them by replacing the two separate imports with a single import that
includes captureEvent, createPostHogClient, and tryGetPostHogDistinctId together
(so update the import statements that reference captureEvent and the import that
references createPostHogClient/tryGetPostHogDistinctId into one unified import).

ℹ️ Review info

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 5be4667 and 3e5b31a.

⛔ Files ignored due to path filters (1)
  • yarn.lock is excluded by !**/yarn.lock, !**/*.lock
📒 Files selected for processing (3)
  • packages/web/package.json
  • packages/web/src/features/chat/actions.ts
  • packages/web/src/lib/posthog.ts

Comment threadpackages/web/src/lib/posthog.ts
@brendan-kellam
brendan-kellam merged commit 5a00847 into mainFeb 24, 2026
8 checks passed
@brendan-kellam
brendan-kellam deleted the bkellam/posthog-ai branch February 24, 2026 23:53
@github-actionsgithub-actionsBot mentioned this pull request Feb 24, 2026
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@brendan-kellam