Skip to content

feat(llma): add tools tab for LLM Analytics#48423

Open
andrewm4894 wants to merge 13 commits intomasterfrom
andy/llm-analytics-tools-tab
Open

feat(llma): add tools tab for LLM Analytics#48423
andrewm4894 wants to merge 13 commits intomasterfrom
andy/llm-analytics-tools-tab

Conversation

@andrewm4894
Copy link
Member

@andrewm4894 andrewm4894 commented Feb 19, 2026

Summary

  • Extract tool call names from $ai_output_choices at ingestion time into $ai_tools_called (comma-separated) and $ai_tool_call_count (integer) properties
  • Handles 7 output formats: OpenAI Chat, OpenAI unwrapped, OpenAI Responses API, Normalized SDK, Anthropic, Python repr (Agents SDK), and wrapped full API response ({"choices":[...]})
  • Hardened with fast keyword pre-checks, 500KB size limit, tool name sanitization, and 100-tool cap
  • Add a new Tools tab (behind LLM_ANALYTICS_TOOLS_TAB feature flag) showing per-tool aggregation with solo % indicating how often a tool is called alone vs in a batch

Changes

Ingestion (Node.js)

  • nodejs/src/ingestion/ai/tools/extract-tool-calls.ts — Core extraction for 7 formats, sanitization (trim, comma→underscore, 200-char truncate), 100-tool cap
  • nodejs/src/ingestion/ai/tools/index.ts — Pipeline step with fast keyword pre-check (tool_call, tool_use, function_call, "function"), 500KB size limit, new metric labels (skipped_no_indicators, skipped_too_large)
  • nodejs/src/ingestion/ai/tools/extract-tool-calls.test.ts — 66 parameterized tests
  • nodejs/src/ingestion/ai/process-ai-event.ts — Wired as pipeline step 5
  • nodejs/src/ingestion/ai/metrics.tsaiToolCallExtractionCounter Prometheus counter

Frontend

  • products/llm_analytics/frontend/tabs/llmAnalyticsToolsLogic.ts — Kea logic (mirrors errors tab pattern)
  • products/llm_analytics/frontend/LLMAnalyticsTools.tsx — DataTable with tool name links to filtered generations, solo % renderer
  • products/llm_analytics/frontend/LLMAnalyticsScene.tsx — Tab entry behind feature flag
  • products/llm_analytics/frontend/llmAnalyticsSharedLogic.ts — Added tools tab ID and URL routing
  • products/llm_analytics/manifest.tsx — Route and URL
  • frontend/src/lib/constants.tsxLLM_ANALYTICS_TOOLS_TAB feature flag

Backend

  • products/llm_analytics/backend/queries/tools.sql — HogQL query using arrayJoin(splitByChar(',', ...)) with columns: tool, total_calls, solo_pct, traces, users, sessions, days_seen, first_seen, last_seen
  • posthog/taxonomy/taxonomy.py — Property definitions for $ai_tools_called and $ai_tool_call_count

Storage format

Comma-separated string (not JSON array). HogQL's JSONExtractRaw + regex stripping leaves escaped quotes that break JSONExtractArrayRaw. Comma-separated works cleanly with splitByChar.

Test plan

  • 66 unit tests covering all 7 formats, sanitization, caps, pre-checks, wrapped responses, malformed data, and edge cases
  • Enable LLM_ANALYTICS_TOOLS_TAB feature flag and verify the tab renders at /llm-analytics/tools
  • Send test $ai_generation events with tool calls and verify extraction works for all formats
  • Verify clicking a tool name navigates to generations filtered by that tool
  • Verify solo % column shows correct values (100% for always-solo tools, lower for batch tools)

Extract tool call names from $ai_output_choices at ingestion time
(OpenAI tool_calls and Anthropic tool_use formats) into new
$ai_tools_called and $ai_tool_call_count properties. Add a new
Tools tab (behind LLM_ANALYTICS_TOOLS_TAB feature flag) that
aggregates tool usage with traces, users, sessions, and time metrics.
@andrewm4894 andrewm4894 self-assigned this Feb 19, 2026
@andrewm4894 andrewm4894 added the team/llm-analytics LLM Analytics label Feb 19, 2026
@assign-reviewers-posthog assign-reviewers-posthog bot requested review from a team February 19, 2026 10:21
Copy link
Contributor

@greptile-apps greptile-apps bot left a comment

Choose a reason for hiding this comment

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

14 files reviewed, 1 comment

Edit Code Review Agent Settings | Greptile

Copy link
Contributor

Choose a reason for hiding this comment

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

IContains on the JSON array string $ai_tools_called will match tool names as substrings, causing false positives. If a user clicks "search" from the tools table, it will match any tool containing "search" (e.g., "web_search", "search_docs", "vector_search"). Consider using JSONHas or exact matching after parsing the array in HogQL.

Prompt To Fix With AI
This is a comment left during a code review.
Path: products/llm_analytics/frontend/LLMAnalyticsTools.tsx
Line: 62

Comment:
`IContains` on the JSON array string `$ai_tools_called` will match tool names as substrings, causing false positives. If a user clicks "search" from the tools table, it will match any tool containing "search" (e.g., "web_search", "search_docs", "vector_search"). Consider using `JSONHas` or exact matching after parsing the array in HogQL.

How can I resolve this? If you propose a fix, please make it concise.

Copy link
Member Author

Choose a reason for hiding this comment

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

Fixed in c1aadc9 — switched from IContains to Regex with (^|,)toolname(,|$) so it matches exact comma-delimited tokens. Since we use comma-separated storage, this gives precise matching without substring false positives.

@github-actions
Copy link
Contributor

github-actions bot commented Feb 19, 2026

Size Change: +5.55 kB (+0.01%)

Total Size: 100 MB

Filename Size Change
frontend/dist/LLMAnalyticsScene 46.5 kB +4.65 kB (+11.13%) ⚠️
ℹ️ View Unchanged
Filename Size Change
frontend/dist/1c 160 kB 0 B
frontend/dist/368Hedgehogs 5.98 kB 0 B
frontend/dist/abap 145 B 0 B
frontend/dist/abnf 145 B 0 B
frontend/dist/accesslog 1.04 kB 0 B
frontend/dist/Action 21.1 kB 0 B
frontend/dist/Actions 1.74 kB 0 B
frontend/dist/actionscript 153 B 0 B
frontend/dist/ada 144 B 0 B
frontend/dist/AdvancedActivityLogsScene 34.5 kB 0 B
frontend/dist/agda 145 B 0 B
frontend/dist/al 143 B 0 B
frontend/dist/angelscript 1.73 kB 0 B
frontend/dist/antlr4 147 B 0 B
frontend/dist/apache 1.05 kB 0 B
frontend/dist/apacheconf 151 B 0 B
frontend/dist/apex 179 B 0 B
frontend/dist/apl 144 B 0 B
frontend/dist/applescript 152 B 0 B
frontend/dist/ApprovalDetail 16.9 kB 0 B
frontend/dist/AppsScene 3.14 kB 0 B
frontend/dist/aql 144 B 0 B
frontend/dist/arcade 2.94 kB 0 B
frontend/dist/arduino 8.88 kB 0 B
frontend/dist/arff 145 B 0 B
frontend/dist/armasm 3.27 kB 0 B
frontend/dist/array.full.es5.js 321 kB 0 B
frontend/dist/array.full.js 421 kB 0 B
frontend/dist/array.js 176 kB 0 B
frontend/dist/asciidoc 149 B 0 B
frontend/dist/asm6502 148 B 0 B
frontend/dist/asmatmel 149 B 0 B
frontend/dist/aspectj 2.69 kB 0 B
frontend/dist/aspnet 181 B 0 B
frontend/dist/AsyncMigrations 13.9 kB 0 B
frontend/dist/AuthorizationStatus 1.43 kB 0 B
frontend/dist/autohotkey 1.04 kB 0 B
frontend/dist/autoit 6.74 kB 0 B
frontend/dist/avisynth 149 B 0 B
frontend/dist/avrasm 2.1 kB 0 B
frontend/dist/avro-idl 149 B 0 B
frontend/dist/awk 804 B 0 B
frontend/dist/axapta 1.76 kB 0 B
frontend/dist/azcli 852 B 0 B
frontend/dist/bash 2.18 kB 0 B
frontend/dist/basic 146 B 0 B
frontend/dist/bat 1.85 kB 0 B
frontend/dist/batch 146 B 0 B
frontend/dist/BatchExportScene 50.6 kB 0 B
frontend/dist/bbcode 147 B 0 B
frontend/dist/bicep 2.56 kB 0 B
frontend/dist/Billing 1.21 kB 0 B
frontend/dist/BillingSection 21.4 kB 0 B
frontend/dist/birb 145 B 0 B
frontend/dist/bison 180 B 0 B
frontend/dist/bnf 144 B 0 B
frontend/dist/brainfuck 150 B 0 B
frontend/dist/brightscript 153 B 0 B
frontend/dist/bro 144 B 0 B
frontend/dist/browserAll-0QZMN1W2 37.3 kB 0 B
frontend/dist/bsl 144 B 0 B
frontend/dist/ButtonPrimitives 1.28 kB 0 B
frontend/dist/c-like 5.27 kB 0 B
frontend/dist/c 142 B 0 B
frontend/dist/cal 1.12 kB 0 B
frontend/dist/CalendarHeatMap 5.53 kB 0 B
frontend/dist/cameligo 2.2 kB 0 B
frontend/dist/capnproto 974 B 0 B
frontend/dist/ceylon 1.24 kB 0 B
frontend/dist/cfscript 149 B 0 B
frontend/dist/chaiscript 219 B 0 B
frontend/dist/changeRequestsLogic 1.26 kB 0 B
frontend/dist/cil 144 B 0 B
frontend/dist/clean 671 B 0 B
frontend/dist/CLIAuthorize 11 kB 0 B
frontend/dist/clike 146 B 0 B
frontend/dist/CLILive 4.69 kB 0 B
frontend/dist/clojure 3.76 kB 0 B
frontend/dist/clojure-repl 326 B 0 B
frontend/dist/cmake 146 B 0 B
frontend/dist/cobol 146 B 0 B
frontend/dist/coffee 3.6 kB 0 B
frontend/dist/coffeescript 153 B 0 B
frontend/dist/Cohort 23.6 kB 0 B
frontend/dist/CohortCalculationHistory 6.95 kB 0 B
frontend/dist/Cohorts 10.1 kB 0 B
frontend/dist/concurnas 150 B 0 B
frontend/dist/ConfirmOrganization 5.21 kB 0 B
frontend/dist/conversations.js 46.2 kB 0 B
frontend/dist/coq 3.61 kB 0 B
frontend/dist/core 315 B 0 B
frontend/dist/cos 1.46 kB 0 B
frontend/dist/Coupons 1.45 kB 0 B
frontend/dist/cpp 5.31 kB 0 B
frontend/dist/Create 1.38 kB 0 B
frontend/dist/crisp-chat-integration.js 2.11 kB 0 B
frontend/dist/crmsh 1.53 kB 0 B
frontend/dist/crystal 182 B 0 B
frontend/dist/csharp 147 B 0 B
frontend/dist/cshtml 181 B 0 B
frontend/dist/csp 571 B 0 B
frontend/dist/css 4.51 kB 0 B
frontend/dist/css-extras 151 B 0 B
frontend/dist/cssMode 4.14 kB 0 B
frontend/dist/csv 144 B 0 B
frontend/dist/CustomCssScene 4.27 kB 0 B
frontend/dist/CustomerAnalyticsConfigurationScene 2.71 kB 0 B
frontend/dist/CustomerAnalyticsScene 31.5 kB 0 B
frontend/dist/customizations.full.js 18 kB 0 B
frontend/dist/cypher 3.4 kB 0 B
frontend/dist/d 142 B 0 B
frontend/dist/dart 4.26 kB 0 B
frontend/dist/Dashboard 1.62 kB 0 B
frontend/dist/Dashboards 14 kB 0 B
frontend/dist/DataManagementScene 1.36 kB 0 B
frontend/dist/DataPipelinesNewScene 3.03 kB 0 B
frontend/dist/DataWarehouseScene 1.42 kB 0 B
frontend/dist/DataWarehouseSourceScene 1.38 kB 0 B
frontend/dist/dataweave 150 B 0 B
frontend/dist/dax 144 B 0 B
frontend/dist/Deactivated 1.85 kB 0 B
frontend/dist/dead-clicks-autocapture.js 13.1 kB 0 B
frontend/dist/DeadLetterQueue 6.11 kB 0 B
frontend/dist/DebugScene 19.2 kB 0 B
frontend/dist/decompressionWorker 2.85 kB 0 B
frontend/dist/decompressionWorker.js 2.85 kB 0 B
frontend/dist/DefinitionEdit 7.84 kB 0 B
frontend/dist/DefinitionView 22.9 kB 0 B
frontend/dist/delphi 2.1 kB 0 B
frontend/dist/DestinationsScene 3.36 kB 0 B
frontend/dist/dhall 146 B 0 B
frontend/dist/diff 145 B 0 B
frontend/dist/dist 541 B 0 B
frontend/dist/django 181 B 0 B
frontend/dist/dns 1.88 kB 0 B
frontend/dist/dns-zone-file 154 B 0 B
frontend/dist/docker 147 B 0 B
frontend/dist/dockerfile 1.88 kB 0 B
frontend/dist/dos 1.3 kB 0 B
frontend/dist/dot 144 B 0 B
frontend/dist/dsconfig 724 B 0 B
frontend/dist/dts 1.47 kB 0 B
frontend/dist/dust 585 B 0 B
frontend/dist/EarlyAccessFeature 1.43 kB 0 B
frontend/dist/EarlyAccessFeatures 3.56 kB 0 B
frontend/dist/ebnf 145 B 0 B
frontend/dist/ecl 5.35 kB 0 B
frontend/dist/editorconfig 153 B 0 B
frontend/dist/EditorScene 211 kB 0 B
frontend/dist/eiffel 147 B 0 B
frontend/dist/ejs 178 B 0 B
frontend/dist/elixir 10.3 kB 0 B
frontend/dist/elm 144 B 0 B
frontend/dist/EmailMFAVerify 3.7 kB 0 B
frontend/dist/EndpointScene 30.4 kB 0 B
frontend/dist/EndpointsScene 19 kB 0 B
frontend/dist/erb 344 B 0 B
frontend/dist/erlang 2.09 kB 0 B
frontend/dist/erlang-repl 1.01 kB 0 B
frontend/dist/ErrorTrackingConfigurationScene 2.76 kB 0 B
frontend/dist/ErrorTrackingIssueFingerprintsScene 6.05 kB 0 B
frontend/dist/ErrorTrackingIssueScene 81.9 kB 0 B
frontend/dist/ErrorTrackingScene 12 kB 0 B
frontend/dist/etlua 214 B 0 B
frontend/dist/EvaluationTemplates 1.32 kB 0 B
frontend/dist/EventsScene 3.16 kB 0 B
frontend/dist/excel-formula 154 B 0 B
frontend/dist/excel 4.45 kB 0 B
frontend/dist/exception-autocapture.js 11.9 kB 0 B
frontend/dist/Experiment 261 kB 0 B
frontend/dist/Experiments 17.9 kB 0 B
frontend/dist/exporter 19.1 MB 0 B
frontend/dist/exporter.js 19.1 MB +224 B (0%)
frontend/dist/ExportsScene 4.58 kB 0 B
frontend/dist/factor 147 B 0 B
frontend/dist/false 146 B 0 B
frontend/dist/FeatureFlag 87 kB 0 B
frontend/dist/FeatureFlags 1.29 kB 0 B
frontend/dist/firestore-security-rules 165 B 0 B
frontend/dist/fix 529 B 0 B
frontend/dist/FlappyHog 6.5 kB 0 B
frontend/dist/flix 756 B 0 B
frontend/dist/flow 145 B 0 B
frontend/dist/flow9 1.81 kB 0 B
frontend/dist/fortran 148 B 0 B
frontend/dist/freemarker2 16.7 kB 0 B
frontend/dist/fsharp 2.99 kB 0 B
frontend/dist/ftl 178 B 0 B
frontend/dist/gams 3.17 kB 0 B
frontend/dist/gap 144 B 0 B
frontend/dist/gauss 13.1 kB 0 B
frontend/dist/gcode 146 B 0 B
frontend/dist/gdscript 149 B 0 B
frontend/dist/gedcom 147 B 0 B
frontend/dist/gherkin 670 B 0 B
frontend/dist/git 144 B 0 B
frontend/dist/glsl 179 B 0 B
frontend/dist/gml 144 B 0 B
frontend/dist/gn 143 B 0 B
frontend/dist/go 143 B 0 B
frontend/dist/go-module 150 B 0 B
frontend/dist/golo 677 B 0 B
frontend/dist/gradle 1.68 kB 0 B
frontend/dist/graphql 2.27 kB 0 B
frontend/dist/groovy 1.73 kB 0 B
frontend/dist/Group 15.1 kB 0 B
frontend/dist/Groups 6.33 kB 0 B
frontend/dist/GroupsNew 8.06 kB 0 B
frontend/dist/haml 179 B 0 B
frontend/dist/handlebars 2.51 kB 0 B
frontend/dist/haskell 1.82 kB 0 B
frontend/dist/haxe 2.01 kB 0 B
frontend/dist/hcl 3.6 kB 0 B
frontend/dist/HealthScene 2.88 kB 0 B
frontend/dist/HeatmapNewScene 4.89 kB 0 B
frontend/dist/HeatmapRecordingScene 4.62 kB 0 B
frontend/dist/HeatmapScene 6.63 kB 0 B
frontend/dist/HeatmapsScene 4.6 kB 0 B
frontend/dist/hlsl 179 B 0 B
frontend/dist/HogFunctionScene 59.7 kB 0 B
frontend/dist/HogRepl 8.09 kB 0 B
frontend/dist/hoon 145 B 0 B
frontend/dist/hpkp 145 B 0 B
frontend/dist/hsp 3.51 kB 0 B
frontend/dist/hsts 145 B 0 B
frontend/dist/html 5.56 kB 0 B
frontend/dist/htmlbars 2.62 kB 0 B
frontend/dist/htmlMode 4.6 kB 0 B
frontend/dist/http 1.04 kB 0 B
frontend/dist/hy 3.08 kB 0 B
frontend/dist/ichigojam 150 B 0 B
frontend/dist/icon 145 B 0 B
frontend/dist/icu-message-format 159 B 0 B
frontend/dist/idris 180 B 0 B
frontend/dist/iecst 146 B 0 B
frontend/dist/ignore 147 B 0 B
frontend/dist/image-blob-reduce.esm 49.4 kB 0 B
frontend/dist/InboxScene 7.9 kB 0 B
frontend/dist/index 310 kB 0 B
frontend/dist/index.js 310 kB 0 B
frontend/dist/inform7 802 B 0 B
frontend/dist/ini 1.11 kB 0 B
frontend/dist/InsightOptions 5.48 kB 0 B
frontend/dist/InsightScene 26.3 kB 0 B
frontend/dist/IntegrationsRedirect 1.45 kB 0 B
frontend/dist/intercom-integration.js 2.16 kB 0 B
frontend/dist/InviteSignup 14 kB 0 B
frontend/dist/io 143 B 0 B
frontend/dist/irpf90 4.94 kB 0 B
frontend/dist/isbl 83.8 kB 0 B
frontend/dist/j 142 B 0 B
frontend/dist/java 2.69 kB 0 B
frontend/dist/javadoc 216 B 0 B
frontend/dist/javadoclike 152 B 0 B
frontend/dist/javascript 962 B 0 B
frontend/dist/javastacktrace 155 B 0 B
frontend/dist/jboss-cli 1.02 kB 0 B
frontend/dist/jexl 145 B 0 B
frontend/dist/jolie 146 B 0 B
frontend/dist/jq 143 B 0 B
frontend/dist/js-extras 150 B 0 B
frontend/dist/js-templates 153 B 0 B
frontend/dist/jsdoc 214 B 0 B
frontend/dist/json 714 B 0 B
frontend/dist/json5 180 B 0 B
frontend/dist/jsonMode 13.9 kB 0 B
frontend/dist/jsonp 180 B 0 B
frontend/dist/jsstacktrace 153 B 0 B
frontend/dist/jsx 144 B 0 B
frontend/dist/julia-repl 353 B 0 B
frontend/dist/julia 7.24 kB 0 B
frontend/dist/keepalived 151 B 0 B
frontend/dist/keyman 147 B 0 B
frontend/dist/kotlin 147 B 0 B
frontend/dist/kumir 146 B 0 B
frontend/dist/kusto 146 B 0 B
frontend/dist/lasso 3.07 kB 0 B
frontend/dist/latex 3.68 kB 0 B
frontend/dist/latte 214 B 0 B
frontend/dist/lazy 152 kB 0 B
frontend/dist/ldif 475 B 0 B
frontend/dist/leaf 564 B 0 B
frontend/dist/LegacyPluginScene 21.8 kB 0 B
frontend/dist/LemonDialog 1.2 kB 0 B
frontend/dist/less 7.7 kB 0 B
frontend/dist/lexon 2.45 kB 0 B
frontend/dist/lib 2.23 kB 0 B
frontend/dist/lilypond 183 B 0 B
frontend/dist/LinkScene 25.6 kB 0 B
frontend/dist/LinksScene 4.92 kB 0 B
frontend/dist/liquid 4.51 kB 0 B
frontend/dist/lisp 1.27 kB 0 B
frontend/dist/livecodeserver 8.34 kB 0 B
frontend/dist/LiveDebugger 19.7 kB 0 B
frontend/dist/LiveEventsTable 5.13 kB 0 B
frontend/dist/livescript 3.54 kB 0 B
frontend/dist/LLMAnalyticsClusterScene 16.3 kB 0 B
frontend/dist/LLMAnalyticsClustersScene 37 kB 0 B
frontend/dist/LLMAnalyticsDatasetScene 20.4 kB 0 B
frontend/dist/LLMAnalyticsDatasetsScene 4 kB 0 B
frontend/dist/LLMAnalyticsEvaluation 35.9 kB 0 B
frontend/dist/LLMAnalyticsEvaluationsScene 19.9 kB 0 B
frontend/dist/LLMAnalyticsPlaygroundScene 1.26 kB 0 B
frontend/dist/LLMAnalyticsSessionScene 12.9 kB 0 B
frontend/dist/LLMAnalyticsTraceScene 96.7 kB 0 B
frontend/dist/LLMAnalyticsUsers 1.24 kB 0 B
frontend/dist/LLMASessionFeedbackDisplay 5.55 kB 0 B
frontend/dist/LLMPromptScene 13.8 kB 0 B
frontend/dist/LLMPromptsScene 4.02 kB 0 B
frontend/dist/llvm 145 B 0 B
frontend/dist/log 144 B 0 B
frontend/dist/Login 9.09 kB 0 B
frontend/dist/Login2FA 4.93 kB 0 B
frontend/dist/logs.js 39 kB 0 B
frontend/dist/LogsScene 109 kB 0 B
frontend/dist/lolcode 148 B 0 B
frontend/dist/lsl 12 kB 0 B
frontend/dist/lua 2 kB 0 B
frontend/dist/m3 2.82 kB 0 B
frontend/dist/magma 146 B 0 B
frontend/dist/makefile 1.2 kB 0 B
frontend/dist/ManagedMigration 14.8 kB 0 B
frontend/dist/markdown 3.79 kB 0 B
frontend/dist/MarketingAnalyticsScene 24.2 kB 0 B
frontend/dist/markup-templating 158 B 0 B
frontend/dist/markup 147 B 0 B
frontend/dist/MaterializedColumns 10.9 kB 0 B
frontend/dist/mathematica 113 kB 0 B
frontend/dist/matlab 147 B 0 B
frontend/dist/Max 1.41 kB 0 B
frontend/dist/maxima 28.8 kB 0 B
frontend/dist/maxscript 150 B 0 B
frontend/dist/mdx 5.36 kB 0 B
frontend/dist/mel 16.7 kB 0 B
frontend/dist/mercury 2.19 kB 0 B
frontend/dist/mermaid 148 B 0 B
frontend/dist/MessageTemplate 16.9 kB 0 B
frontend/dist/mips 2.59 kB 0 B
frontend/dist/mipsasm 2.58 kB 0 B
frontend/dist/mizar 856 B 0 B
frontend/dist/ModelsScene 2.42 kB 0 B
frontend/dist/mojolicious 443 B 0 B
frontend/dist/mongodb 148 B 0 B
frontend/dist/monkey 1.46 kB 0 B
frontend/dist/moonscript 151 B 0 B
frontend/dist/MoveToPostHogCloud 5.17 kB 0 B
frontend/dist/msdax 4.92 kB 0 B
frontend/dist/mysql 11.3 kB 0 B
frontend/dist/n1ql 3.12 kB 0 B
frontend/dist/n4js 145 B 0 B
frontend/dist/nand2tetris-hdl 156 B 0 B
frontend/dist/naniscript 151 B 0 B
frontend/dist/nasm 145 B 0 B
frontend/dist/neon 145 B 0 B
frontend/dist/nevod 146 B 0 B
frontend/dist/NewSourceWizard 1.47 kB 0 B
frontend/dist/NewTabScene 1.33 kB 0 B
frontend/dist/nginx 1.51 kB 0 B
frontend/dist/nim 144 B 0 B
frontend/dist/nix 770 B 0 B
frontend/dist/node-repl 369 B 0 B
frontend/dist/NotebookCanvasScene 3.75 kB 0 B
frontend/dist/NotebookScene 8.89 kB 0 B
frontend/dist/NotebooksScene 8.24 kB 0 B
frontend/dist/nsis 145 B 0 B
frontend/dist/OAuthAuthorize 10.4 kB 0 B
frontend/dist/objective-c 2.42 kB 0 B
frontend/dist/objectivec 2.67 kB 0 B
frontend/dist/ocaml 146 B 0 B
frontend/dist/Onboarding 634 kB 0 B
frontend/dist/OnboardingCouponRedemption 1.91 kB 0 B
frontend/dist/opencl 181 B 0 B
frontend/dist/openqasm 149 B 0 B
frontend/dist/openscad 1.43 kB 0 B
frontend/dist/oxygene 2.06 kB 0 B
frontend/dist/oz 143 B 0 B
frontend/dist/parigp 147 B 0 B
frontend/dist/parser 147 B 0 B
frontend/dist/parser3 689 B 0 B
frontend/dist/pascal 3 kB 0 B
frontend/dist/pascaligo 150 B 0 B
frontend/dist/passkeyLogic 1.2 kB 0 B
frontend/dist/PasswordReset 5.04 kB 0 B
frontend/dist/PasswordResetComplete 3.65 kB 0 B
frontend/dist/pcaxis 147 B 0 B
frontend/dist/peoplecode 151 B 0 B
frontend/dist/perl 8.26 kB 0 B
frontend/dist/PersonScene 16.5 kB 0 B
frontend/dist/PersonsScene 6.03 kB 0 B
frontend/dist/pf 1.41 kB 0 B
frontend/dist/pgsql 19 kB 0 B
frontend/dist/php 8.03 kB 0 B
frontend/dist/php-extras 219 B 0 B
frontend/dist/php-template 576 B 0 B
frontend/dist/phpdoc 249 B 0 B
frontend/dist/PipelineStatusScene 3.4 kB 0 B
frontend/dist/pla 1.69 kB 0 B
frontend/dist/plaintext 268 B 0 B
frontend/dist/plsql 180 B 0 B
frontend/dist/pony 1.11 kB 0 B
frontend/dist/posthog 252 kB 0 B
frontend/dist/postiats 7.86 kB 0 B
frontend/dist/powerquery 151 B 0 B
frontend/dist/powershell 3.28 kB 0 B
frontend/dist/PreflightCheck 6.27 kB 0 B
frontend/dist/processing 151 B 0 B
frontend/dist/product-tours.js 112 kB 0 B
frontend/dist/ProductTour 469 kB 0 B
frontend/dist/ProductTours 5.43 kB 0 B
frontend/dist/profile 632 B 0 B
frontend/dist/ProjectHomepage 6.5 kB 0 B
frontend/dist/prolog 147 B 0 B
frontend/dist/promql 147 B 0 B
frontend/dist/properties 859 B 0 B
frontend/dist/protobuf 824 B 0 B
frontend/dist/psl 144 B 0 B
frontend/dist/pug 144 B 0 B
frontend/dist/puppet 147 B 0 B
frontend/dist/pure 145 B 0 B
frontend/dist/purebasic 1.74 kB 0 B
frontend/dist/purescript 185 B 0 B
frontend/dist/python 4.75 kB 0 B
frontend/dist/python-repl 375 B 0 B
frontend/dist/q 1.28 kB 0 B
frontend/dist/qml 144 B 0 B
frontend/dist/qore 145 B 0 B
frontend/dist/qsharp 147 B 0 B
frontend/dist/r 3.24 kB 0 B
frontend/dist/racket 181 B 0 B
frontend/dist/razor 9.31 kB 0 B
frontend/dist/reason 147 B 0 B
frontend/dist/reasonml 3.41 kB 0 B
frontend/dist/recorder-v2.js 113 kB 0 B
frontend/dist/recorder.js 113 kB 0 B
frontend/dist/redis 3.56 kB 0 B
frontend/dist/redshift 11.8 kB 0 B
frontend/dist/refractor 17.8 kB 0 B
frontend/dist/regex 146 B 0 B
frontend/dist/RegionMap 135 kB 0 B
frontend/dist/rego 145 B 0 B
frontend/dist/render-query 18.8 MB 0 B
frontend/dist/render-query.js 18.8 MB +224 B (0%)
frontend/dist/renpy 146 B 0 B
frontend/dist/ResourceTransfer 9.87 kB 0 B
frontend/dist/rest 145 B 0 B
frontend/dist/restructuredtext 3.91 kB 0 B
frontend/dist/RevenueAnalyticsScene 26.4 kB 0 B
frontend/dist/rib 1.44 kB 0 B
frontend/dist/rip 144 B 0 B
frontend/dist/roboconf 149 B 0 B
frontend/dist/robotframework 155 B 0 B
frontend/dist/routeros 2.66 kB 0 B
frontend/dist/rsl 1.2 kB 0 B
frontend/dist/ruby 8.51 kB 0 B
frontend/dist/ruleslanguage 3.98 kB 0 B
frontend/dist/rust 4.17 kB 0 B
frontend/dist/sas 144 B 0 B
frontend/dist/sass 145 B 0 B
frontend/dist/SavedInsights 1.38 kB 0 B
frontend/dist/sb 1.83 kB 0 B
frontend/dist/scala 1.68 kB 0 B
frontend/dist/scheme 147 B 0 B
frontend/dist/scilab 1.33 kB 0 B
frontend/dist/scss 145 B 0 B
frontend/dist/SdkDoctorScene 4.76 kB 0 B
frontend/dist/SessionAttributionExplorerScene 7.29 kB 0 B
frontend/dist/SessionGroupSummariesTable 5.35 kB 0 B
frontend/dist/SessionGroupSummaryScene 17.8 kB 0 B
frontend/dist/SessionProfileScene 16.6 kB 0 B
frontend/dist/SessionRecordingDetail 2.45 kB 0 B
frontend/dist/SessionRecordingFilePlaybackScene 5.19 kB 0 B
frontend/dist/SessionRecordings 1.49 kB 0 B
frontend/dist/SessionRecordingsKiosk 5.77 kB 0 B
frontend/dist/SessionRecordingsPlaylistScene 4.86 kB 0 B
frontend/dist/SessionRecordingsSettingsScene 2.65 kB 0 B
frontend/dist/SessionsScene 4.59 kB 0 B
frontend/dist/SettingsScene 3.71 kB 0 B
frontend/dist/SharedMetric 16 kB 0 B
frontend/dist/SharedMetrics 1.23 kB 0 B
frontend/dist/shell-session 188 B 0 B
frontend/dist/shell 3.08 kB 0 B
frontend/dist/SignalsDebug 3.38 kB 0 B
frontend/dist/SignupContainer 23.6 kB 0 B
frontend/dist/Site 1.89 kB 0 B
frontend/dist/smali 1.23 kB 0 B
frontend/dist/smalltalk 150 B 0 B
frontend/dist/smarty 181 B 0 B
frontend/dist/sml 1.27 kB 0 B
frontend/dist/solidity 149 B 0 B
frontend/dist/solution-file 154 B 0 B
frontend/dist/sophia 2.77 kB 0 B
frontend/dist/SourcesScene 3.87 kB 0 B
frontend/dist/sourceWizardLogic 1.41 kB 0 B
frontend/dist/soy 178 B 0 B
frontend/dist/sparql 181 B 0 B
frontend/dist/splunk-spl 151 B 0 B
frontend/dist/sqf 32.3 kB 0 B
frontend/dist/sql_more 12.4 kB 0 B
frontend/dist/sql 6.73 kB 0 B
frontend/dist/SqlVariableEditScene 7.97 kB 0 B
frontend/dist/squirrel 149 B 0 B
frontend/dist/st 7.41 kB 0 B
frontend/dist/stan 145 B 0 B
frontend/dist/StartupProgram 21.9 kB 0 B
frontend/dist/stata 16.8 kB 0 B
frontend/dist/step21 753 B 0 B
frontend/dist/stylus 147 B 0 B
frontend/dist/subunit 642 B 0 B
frontend/dist/SupportSettingsScene 20.8 kB 0 B
frontend/dist/SupportTicketScene 19 kB 0 B
frontend/dist/SupportTicketsScene 6.7 kB 0 B
frontend/dist/Survey 1.56 kB 0 B
frontend/dist/Surveys 14.5 kB 0 B
frontend/dist/surveys.js 90 kB 0 B
frontend/dist/SurveyTemplates 1.28 kB 0 B
frontend/dist/SurveyWizard 174 kB 0 B
frontend/dist/swift 7.62 kB 0 B
frontend/dist/systemd 148 B 0 B
frontend/dist/SystemStatus 17.7 kB 0 B
frontend/dist/systemverilog 7.62 kB 0 B
frontend/dist/t4-cs 214 B 0 B
frontend/dist/t4-templating 154 B 0 B
frontend/dist/t4-vb 248 B 0 B
frontend/dist/taggerscript 535 B 0 B
frontend/dist/tap 533 B 0 B
frontend/dist/TaskDetailScene 19.7 kB 0 B
frontend/dist/TaskTracker 17.1 kB 0 B
frontend/dist/tcl 3.57 kB 0 B
frontend/dist/textile 148 B 0 B
frontend/dist/thrift 744 B 0 B
frontend/dist/toml 145 B 0 B
frontend/dist/toolbar 7.72 MB +223 B (0%)
frontend/dist/toolbar.js 7.72 MB +223 B (0%)
frontend/dist/ToolbarLaunch 3.24 kB 0 B
frontend/dist/tp 1.6 kB 0 B
frontend/dist/tracing-headers.js 1.93 kB 0 B
frontend/dist/TransformationsScene 2.67 kB 0 B
frontend/dist/tremor 147 B 0 B
frontend/dist/tsMode 24 kB 0 B
frontend/dist/tsx 212 B 0 B
frontend/dist/tt2 178 B 0 B
frontend/dist/turtle 147 B 0 B
frontend/dist/twig 1.3 kB 0 B
frontend/dist/TwoFactorReset 4.7 kB 0 B
frontend/dist/typescript 151 B 0 B
frontend/dist/typespec 2.83 kB 0 B
frontend/dist/typoscript 151 B 0 B
frontend/dist/unrealscript 153 B 0 B
frontend/dist/Unsubscribe 2.34 kB 0 B
frontend/dist/uorazor 148 B 0 B
frontend/dist/uri 144 B 0 B
frontend/dist/UserInterview 5.25 kB 0 B
frontend/dist/UserInterviews 2.73 kB 0 B
frontend/dist/v 142 B 0 B
frontend/dist/vala 145 B 0 B
frontend/dist/vb 5.8 kB 0 B
frontend/dist/vbnet 180 B 0 B
frontend/dist/vbscript 1.83 kB 0 B
frontend/dist/vbscript-html 308 B 0 B
frontend/dist/velocity 149 B 0 B
frontend/dist/VercelLinkError 2.62 kB 0 B
frontend/dist/VerifyEmail 5.2 kB 0 B
frontend/dist/verilog 148 B 0 B
frontend/dist/vhdl 1.81 kB 0 B
frontend/dist/vim 144 B 0 B
frontend/dist/visual-basic 153 B 0 B
frontend/dist/warpscript 151 B 0 B
frontend/dist/wasm 145 B 0 B
frontend/dist/web-idl 148 B 0 B
frontend/dist/web-vitals.js 6.6 kB 0 B
frontend/dist/WebAnalyticsScene 6.77 kB 0 B
frontend/dist/WebGLRenderer-DYjOwNoG 60.3 kB 0 B
frontend/dist/WebGPURenderer-B_wkl_Ja 36.2 kB 0 B
frontend/dist/webworkerAll-puPV1rBA 296 B 0 B
frontend/dist/wgsl 7.35 kB 0 B
frontend/dist/wiki 145 B 0 B
frontend/dist/Wizard 5.18 kB 0 B
frontend/dist/wolfram 148 B 0 B
frontend/dist/WorkflowScene 90 kB 0 B
frontend/dist/WorkflowsScene 46.5 kB 0 B
frontend/dist/WorldMap 1.04 MB 0 B
frontend/dist/wren 145 B 0 B
frontend/dist/x86asm 19.2 kB 0 B
frontend/dist/xeora 146 B 0 B
frontend/dist/xl 1.77 kB 0 B
frontend/dist/xml-doc 148 B 0 B
frontend/dist/xml 2.14 kB 0 B
frontend/dist/xojo 145 B 0 B
frontend/dist/xquery 147 B 0 B
frontend/dist/yaml 145 B 0 B
frontend/dist/yang 145 B 0 B
frontend/dist/zephir 1.71 kB 0 B
frontend/dist/zig 144 B 0 B

compressed-size-action

Copy link

@chatgpt-codex-connector chatgpt-codex-connector bot left a comment

Choose a reason for hiding this comment

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

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: a3004c7aee

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

- Add support for normalized format (content blocks with type=function)
- Add Python repr fallback for OpenAI Agents SDK format
  (ResponseFunctionToolCall(name='...'))
- Fix nullable ARRAY JOIN by wrapping property in ifNull(..., '[]')
- Use parseJSON instead of JSON.parse per eslint rule
@github-actions
Copy link
Contributor

github-actions bot commented Feb 19, 2026

🎭 Playwright report · View test results →

⚠️ 1 flaky test:

  • Can submit the signup form multiple times if there is a generic email set (chromium)

These issues are not necessarily caused by your changes.
Annoyed by this comment? Help fix flakies and failures and it'll disappear!

- OpenAI Responses API: flat items with type=function_call and name
- Unwrapped choices: tool_calls directly on choice without message wrapper
HogQL's property access via JSONExtractRaw + regex stripping leaves
escaped quotes in JSON array values, breaking JSONExtractArrayRaw.
Switch to comma-separated format (get_weather,search_docs) and use
splitByChar(',', ...) in the query instead.
…, and caps

Add fast keyword pre-check and 500KB size limit to skip unnecessary JSON
parsing for text-only events. Sanitize tool names (trim, replace commas,
truncate to 200 chars). Cap at 100 tools per event. Use else-if between
message-wrapped and top-level paths. Track new metric outcomes
(skipped_no_indicators, skipped_too_large).
Remove errors column (always 0 since tool calls imply successful
generation). Add solo_pct column showing percentage of calls where
the tool was the only one called, placed after days_seen.
Some SDKs store the full API response in $ai_output_choices as
{"choices":[...]} instead of just the choices array. Real prod data
shows 33% of tool-calling events use this format. Unwrap the choices
key before processing.
- Use regex (^|,)toolname(,|$) instead of IContains for exact tool
  matching in drilldown filter, avoiding false positives
- Set $ai_tool_call_count from user-provided $ai_tools_called so
  events aren't excluded by the tools query filter
@andrewm4894 andrewm4894 removed request for a team February 19, 2026 12:49
*/

SELECT
arrayJoin(splitByChar(',', assumeNotNull(properties.$ai_tools_called))) as tool,
Copy link
Contributor

Choose a reason for hiding this comment

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

Potential null/empty string handling issue. The query uses assumeNotNull(properties.$ai_tools_called) but if $ai_tools_called is an empty string, splitByChar(',', '') returns [''], causing arrayJoin to create a row with an empty tool name. While the WHERE clause filters for $ai_tool_call_count > 0, there's no guarantee these two properties are always in sync (e.g., if manually set by users or due to edge cases in extraction logic).

Fix: Add validation to filter out empty tool names:

SELECT
    arrayJoin(splitByChar(',', assumeNotNull(properties.$ai_tools_called))) as tool,
    ...
WHERE event = '$ai_generation'
    AND properties.$ai_tool_call_count > 0
    AND properties.$ai_tools_called != ''
    AND tool != ''
    AND {filters}

Spotted by Graphite Agent

Fix in Graphite


Is this helpful? React 👍 or 👎 to let us know.

The posthog-js SDK uses type "tool-call" (not "function") for Vercel AI
SDK and OTel integrations. Our extraction logic only matched "function"
and "tool_use", silently dropping these tool calls.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

team/llm-analytics LLM Analytics

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

Comments