Skip to content

feat(llma): add $ai_stop_reason property to LLM analytics#54037

Merged
carlos-marchal-ph merged 5 commits into
masterfrom
feat(llma)/add-ai-stop-reason
Apr 20, 2026
Merged

feat(llma): add $ai_stop_reason property to LLM analytics#54037
carlos-marchal-ph merged 5 commits into
masterfrom
feat(llma)/add-ai-stop-reason

Conversation

@carlos-marchal-ph
Copy link
Copy Markdown
Contributor

Problem

LLM analytics users cannot filter or analyze why model responses ended. The finish/stop reason from providers (e.g. stop, end_turn, tool_use, max_tokens, SAFETY) was either stripped from OTel events or never extracted by SDK wrappers. This was reported as a user feature request on the LLM analytics docs page.

Changes

  • OTel middleware (traceloop, vercel-ai): map llm.response.finish_reason, llm.response.stop_reason, ai.response.finishReason, and gen_ai.response.finish_reasons to $ai_stop_reason instead of stripping them
  • Taxonomy: add $ai_stop_reason property definition in taxonomy.py, hogql/ai.py, and regenerated frontend JSON
  • Property lives in the event properties bag (no dedicated ClickHouse column)

Companion PRs:

  • PostHog/posthog-python — SDK extraction for OpenAI, Anthropic, Gemini, LangChain, OpenAI Agents, Claude Agent SDK
  • PostHog/posthog-js — @posthog/ai extraction for OpenAI, Anthropic, Gemini, Vercel AI SDK, LangChain

How did you test this code?

  • OTel middleware unit tests updated and passing (54 tests across traceloop + vercel-ai + pydantic-ai)
  • Full AI ingestion test suite passing (632 tests)
  • This PR was authored by an agent and has not been manually tested beyond automated tests.

Publish to changelog?

no

Captures the LLM's reason for stopping generation (e.g. "stop", "end_turn",
"tool_use", "SAFETY") as a top-level queryable event property. Previously,
finish_reason was stripped from OTel events and never extracted from SDK wrappers.
@carlos-marchal-ph carlos-marchal-ph requested a review from a team April 10, 2026 10:12
@carlos-marchal-ph carlos-marchal-ph self-assigned this Apr 10, 2026
@carlos-marchal-ph carlos-marchal-ph requested a review from a team as a code owner April 10, 2026 10:13
@assign-reviewers-posthog assign-reviewers-posthog Bot requested a review from a team April 10, 2026 10:13
@greptile-apps
Copy link
Copy Markdown
Contributor

greptile-apps Bot commented Apr 10, 2026

Prompt To Fix All With AI
This is a comment left during a code review.
Path: nodejs/src/ingestion/ai/otel/middleware/vercel-ai.test.ts
Line: 97

Comment:
**Missing test for `gen_ai.response.finish_reasons` array path**

The `gen_ai.response.finish_reasons` fallback (the `else if` branch in `vercel-ai.ts`) is untested. That branch has its own logic — array type check plus `[0]` indexing — and currently any breakage there would go undetected. A parametrised test covering `ai.response.finishReason` (primary), `gen_ai.response.finish_reasons` array (fallback), and neither present (undefined) would cover the three cases OnceAndOnlyOnce.

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

---

This is a comment left during a code review.
Path: nodejs/src/ingestion/ai/otel/middleware/traceloop.test.ts
Line: 207-208

Comment:
**`finish_reason`-only path is not exercised**

The test has both `llm.response.stop_reason` and `llm.response.finish_reason` present. The case where only `llm.response.finish_reason` is provided (no `stop_reason`) is untested, so a regression in the `??` fallback would go undetected. A parametrised test covering both-present (stop_reason wins), finish_reason-only, and neither-present (undefined) would match the preference for parameterised tests.

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

Reviews (1): Last reviewed commit: "feat(llma): add $ai_stop_reason property..." | Re-trigger Greptile

@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented Apr 10, 2026

Size Change: +8.45 kB (+0.01%)

Total Size: 128 MB

Filename Size Change
frontend/dist/exporter.js 20.9 MB +2.12 kB (+0.01%)
frontend/dist/render-query 20.5 MB +2.12 kB (+0.01%)
frontend/dist/render-query.js 20.5 MB +2.12 kB (+0.01%)
frontend/dist/toolbar.js 10.2 MB +2.12 kB (+0.02%)
ℹ️ View Unchanged
Filename Size Change
frontend/dist/368Hedgehogs 5.26 kB 0 B
frontend/dist/abap 14.2 kB 0 B
frontend/dist/Action 23.2 kB 0 B
frontend/dist/Actions 1.02 kB 0 B
frontend/dist/AdvancedActivityLogsScene 34 kB 0 B
frontend/dist/AgenticAuthorize 5.25 kB 0 B
frontend/dist/apex 3.95 kB 0 B
frontend/dist/ApprovalDetail 16.2 kB 0 B
frontend/dist/array.full.es5.js 327 kB 0 B
frontend/dist/array.full.js 423 kB 0 B
frontend/dist/array.js 178 kB 0 B
frontend/dist/AsyncMigrations 13.1 kB 0 B
frontend/dist/AuthorizationStatus 716 B 0 B
frontend/dist/azcli 846 B 0 B
frontend/dist/bat 1.84 kB 0 B
frontend/dist/BatchExportScene 60.3 kB 0 B
frontend/dist/bicep 2.55 kB 0 B
frontend/dist/Billing 493 B 0 B
frontend/dist/BillingSection 20.8 kB 0 B
frontend/dist/BoxPlot 5.04 kB 0 B
frontend/dist/browserAll-0QZMN1W2 37.4 kB 0 B
frontend/dist/ButtonPrimitives 562 B 0 B
frontend/dist/CalendarHeatMap 4.79 kB 0 B
frontend/dist/cameligo 2.18 kB 0 B
frontend/dist/changeRequestsLogic 544 B 0 B
frontend/dist/CLIAuthorize 11.3 kB 0 B
frontend/dist/CLILive 3.97 kB 0 B
frontend/dist/clojure 9.64 kB 0 B
frontend/dist/coffee 3.59 kB 0 B
frontend/dist/Cohort 23.2 kB 0 B
frontend/dist/CohortCalculationHistory 6.22 kB 0 B
frontend/dist/Cohorts 9.39 kB 0 B
frontend/dist/ConfirmOrganization 4.48 kB 0 B
frontend/dist/conversations.js 65.8 kB 0 B
frontend/dist/Coupons 720 B 0 B
frontend/dist/cpp 5.3 kB 0 B
frontend/dist/Create 829 B 0 B
frontend/dist/crisp-chat-integration.js 1.88 kB 0 B
frontend/dist/csharp 4.52 kB 0 B
frontend/dist/csp 1.42 kB 0 B
frontend/dist/css 4.51 kB 0 B
frontend/dist/cssMode 4.15 kB 0 B
frontend/dist/CustomCssScene 3.55 kB 0 B
frontend/dist/CustomerAnalyticsConfigurationScene 1.99 kB 0 B
frontend/dist/CustomerAnalyticsScene 26.3 kB 0 B
frontend/dist/CustomerJourneyBuilderScene 1.69 kB 0 B
frontend/dist/CustomerJourneyTemplatesScene 7.39 kB 0 B
frontend/dist/customizations.full.js 17.9 kB 0 B
frontend/dist/CyclotronJobInputAssignee 1.32 kB 0 B
frontend/dist/CyclotronJobInputTicketTags 711 B 0 B
frontend/dist/cypher 3.38 kB 0 B
frontend/dist/dart 4.25 kB 0 B
frontend/dist/Dashboard 1.11 kB 0 B
frontend/dist/Dashboards 23.1 kB 0 B
frontend/dist/DataManagementScene 646 B 0 B
frontend/dist/DataPipelinesNewScene 2.28 kB 0 B
frontend/dist/DataWarehouseScene 1.21 kB -50 B (-3.97%)
frontend/dist/DataWarehouseSourceScene 634 B 0 B
frontend/dist/Deactivated 1.13 kB 0 B
frontend/dist/dead-clicks-autocapture.js 13.1 kB 0 B
frontend/dist/DeadLetterQueue 5.38 kB 0 B
frontend/dist/DebugScene 20 kB 0 B
frontend/dist/decompressionWorker 2.85 kB 0 B
frontend/dist/decompressionWorker.js 2.85 kB 0 B
frontend/dist/DefinitionEdit 7.11 kB 0 B
frontend/dist/DefinitionView 22.7 kB 0 B
frontend/dist/DestinationsScene 2.67 kB 0 B
frontend/dist/dist 575 B 0 B
frontend/dist/dockerfile 1.87 kB 0 B
frontend/dist/EarlyAccessFeature 753 B 0 B
frontend/dist/EarlyAccessFeatures 2.84 kB 0 B
frontend/dist/ecl 5.33 kB 0 B
frontend/dist/EditorScene 896 B 0 B
frontend/dist/elixir 10.3 kB 0 B
frontend/dist/elk.bundled 1.44 MB 0 B
frontend/dist/EmailMFAVerify 2.98 kB 0 B
frontend/dist/EndpointScene 37.5 kB 0 B
frontend/dist/EndpointsScene 22.1 kB 0 B
frontend/dist/ErrorTrackingConfigurationScene 2.2 kB 0 B
frontend/dist/ErrorTrackingIssueFingerprintsScene 6.98 kB 0 B
frontend/dist/ErrorTrackingIssueScene 81.9 kB 0 B
frontend/dist/ErrorTrackingScene 12.9 kB 0 B
frontend/dist/EvaluationTemplates 575 B 0 B
frontend/dist/EventsScene 2.46 kB 0 B
frontend/dist/exception-autocapture.js 11.8 kB 0 B
frontend/dist/Experiment 208 kB 0 B
frontend/dist/Experiments 17.7 kB 0 B
frontend/dist/exporter 20.9 MB 0 B
frontend/dist/ExportsScene 3.86 kB 0 B
frontend/dist/FeatureFlag 128 kB 0 B
frontend/dist/FeatureFlags 572 B 0 B
frontend/dist/FeatureFlagTemplatesScene 7.03 kB 0 B
frontend/dist/FlappyHog 5.78 kB 0 B
frontend/dist/flow9 1.8 kB 0 B
frontend/dist/freemarker2 16.7 kB 0 B
frontend/dist/fsharp 2.98 kB 0 B
frontend/dist/go 2.65 kB 0 B
frontend/dist/graphql 2.26 kB 0 B
frontend/dist/Group 14.4 kB 0 B
frontend/dist/Groups 3.91 kB 0 B
frontend/dist/GroupsNew 7.34 kB 0 B
frontend/dist/handlebars 7.34 kB 0 B
frontend/dist/hcl 3.59 kB 0 B
frontend/dist/HealthCategoryDetailScene 7.23 kB 0 B
frontend/dist/HealthScene 10.3 kB 0 B
frontend/dist/HeatmapNewScene 4.16 kB 0 B
frontend/dist/HeatmapRecordingScene 3.92 kB 0 B
frontend/dist/HeatmapScene 6.03 kB 0 B
frontend/dist/HeatmapsScene 3.88 kB 0 B
frontend/dist/hls 394 kB 0 B
frontend/dist/HogFunctionScene 59.7 kB 0 B
frontend/dist/HogRepl 7.37 kB 0 B
frontend/dist/html 5.58 kB 0 B
frontend/dist/htmlMode 4.62 kB 0 B
frontend/dist/image-blob-reduce.esm 49.4 kB 0 B
frontend/dist/InboxScene 59.7 kB 0 B
frontend/dist/index 308 kB 0 B
frontend/dist/index.js 308 kB 0 B
frontend/dist/ini 1.1 kB 0 B
frontend/dist/InsightOptions 5.41 kB 0 B
frontend/dist/InsightScene 28.9 kB 0 B
frontend/dist/IntegrationsRedirect 733 B 0 B
frontend/dist/intercom-integration.js 1.93 kB 0 B
frontend/dist/InviteSignup 14.4 kB 0 B
frontend/dist/java 3.22 kB 0 B
frontend/dist/javascript 985 B 0 B
frontend/dist/jsonMode 13.9 kB 0 B
frontend/dist/julia 7.22 kB 0 B
frontend/dist/kotlin 3.4 kB 0 B
frontend/dist/lazy 150 kB 0 B
frontend/dist/LegacyPluginScene 26.6 kB 0 B
frontend/dist/LemonTextAreaMarkdown 502 B 0 B
frontend/dist/less 3.9 kB 0 B
frontend/dist/lexon 2.44 kB 0 B
frontend/dist/lib 2.22 kB 0 B
frontend/dist/Link 468 B 0 B
frontend/dist/LinkScene 24.8 kB 0 B
frontend/dist/LinksScene 4.19 kB 0 B
frontend/dist/liquid 4.53 kB 0 B
frontend/dist/LiveDebugger 19.1 kB 0 B
frontend/dist/LiveEventsTable 2.98 kB 0 B
frontend/dist/LLMAnalyticsClusterScene 15.7 kB 0 B
frontend/dist/LLMAnalyticsClustersScene 43.1 kB 0 B
frontend/dist/LLMAnalyticsDatasetScene 19.7 kB 0 B
frontend/dist/LLMAnalyticsDatasetsScene 3.28 kB 0 B
frontend/dist/LLMAnalyticsEvaluation 41.7 kB 0 B
frontend/dist/LLMAnalyticsEvaluationsScene 29.5 kB 0 B
frontend/dist/LLMAnalyticsPlaygroundScene 36.3 kB 0 B
frontend/dist/LLMAnalyticsScene 116 kB 0 B
frontend/dist/LLMAnalyticsSessionScene 13.4 kB 0 B
frontend/dist/LLMAnalyticsTraceScene 127 kB 0 B
frontend/dist/LLMAnalyticsUsers 526 B 0 B
frontend/dist/LLMASessionFeedbackDisplay 4.83 kB 0 B
frontend/dist/LLMPromptScene 20.6 kB 0 B
frontend/dist/LLMPromptsScene 4.21 kB 0 B
frontend/dist/Login 8.57 kB 0 B
frontend/dist/Login2FA 4.2 kB 0 B
frontend/dist/logs.js 38.5 kB 0 B
frontend/dist/LogsScene 11.3 kB 0 B
frontend/dist/lua 2.11 kB 0 B
frontend/dist/m3 2.81 kB 0 B
frontend/dist/main 819 kB 0 B
frontend/dist/ManagedMigration 14 kB 0 B
frontend/dist/markdown 3.79 kB 0 B
frontend/dist/MarketingAnalyticsScene 39.7 kB 0 B
frontend/dist/MaterializedColumns 10.2 kB 0 B
frontend/dist/Max 835 B 0 B
frontend/dist/mdx 5.39 kB 0 B
frontend/dist/memlens.lib.bundle 27.8 kB 0 B
frontend/dist/MessageTemplate 16.3 kB 0 B
frontend/dist/MetricsScene 828 B 0 B
frontend/dist/mips 2.58 kB 0 B
frontend/dist/ModelsScene 13.6 kB 0 B
frontend/dist/MonacoDiffEditor 403 B 0 B
frontend/dist/monacoEditorWorker 288 kB 0 B
frontend/dist/monacoEditorWorker.js 288 kB 0 B
frontend/dist/monacoJsonWorker 419 kB 0 B
frontend/dist/monacoJsonWorker.js 419 kB 0 B
frontend/dist/monacoTsWorker 7.02 MB 0 B
frontend/dist/monacoTsWorker.js 7.02 MB 0 B
frontend/dist/MoveToPostHogCloud 4.46 kB 0 B
frontend/dist/msdax 4.91 kB 0 B
frontend/dist/mysql 11.3 kB 0 B
frontend/dist/NavTabChat 4.68 kB 0 B
frontend/dist/NewSourceWizard 724 B 0 B
frontend/dist/NewTabScene 681 B 0 B
frontend/dist/NodeDetailScene 16.3 kB 0 B
frontend/dist/NotebookCanvasScene 3.13 kB 0 B
frontend/dist/NotebookPanel 5.14 kB 0 B
frontend/dist/NotebookScene 8.14 kB 0 B
frontend/dist/NotebooksScene 7.58 kB 0 B
frontend/dist/OAuthAuthorize 573 B 0 B
frontend/dist/objective-c 2.41 kB 0 B
frontend/dist/Onboarding 682 kB 0 B
frontend/dist/OnboardingCouponRedemption 1.2 kB 0 B
frontend/dist/pascal 2.99 kB 0 B
frontend/dist/pascaligo 2 kB 0 B
frontend/dist/passkeyLogic 484 B 0 B
frontend/dist/PasswordReset 4.32 kB 0 B
frontend/dist/PasswordResetComplete 2.94 kB 0 B
frontend/dist/perl 8.25 kB 0 B
frontend/dist/PersonScene 16 kB 0 B
frontend/dist/PersonsScene 4.68 kB 0 B
frontend/dist/pgsql 13.5 kB 0 B
frontend/dist/php 8.02 kB 0 B
frontend/dist/PipelineStatusScene 6.22 kB 0 B
frontend/dist/pla 1.67 kB 0 B
frontend/dist/posthog 136 kB 0 B
frontend/dist/postiats 7.86 kB 0 B
frontend/dist/powerquery 16.9 kB 0 B
frontend/dist/powershell 3.27 kB 0 B
frontend/dist/PreflightCheck 5.53 kB 0 B
frontend/dist/product-tours.js 115 kB 0 B
frontend/dist/ProductTour 273 kB 0 B
frontend/dist/ProductTours 4.68 kB 0 B
frontend/dist/ProjectHomepage 24.7 kB 0 B
frontend/dist/protobuf 9.05 kB 0 B
frontend/dist/pug 4.82 kB 0 B
frontend/dist/python 4.76 kB 0 B
frontend/dist/qsharp 3.19 kB 0 B
frontend/dist/QueryPerformance 1.59 kB 0 B
frontend/dist/r 3.12 kB 0 B
frontend/dist/razor 9.35 kB 0 B
frontend/dist/recorder-v2.js 111 kB 0 B
frontend/dist/recorder.js 111 kB 0 B
frontend/dist/redis 3.55 kB 0 B
frontend/dist/redshift 11.8 kB 0 B
frontend/dist/RegionMap 29.4 kB 0 B
frontend/dist/ResourceTransfer 9.17 kB 0 B
frontend/dist/restructuredtext 3.9 kB 0 B
frontend/dist/RevenueAnalyticsScene 25.6 kB 0 B
frontend/dist/ruby 8.5 kB 0 B
frontend/dist/rust 4.16 kB 0 B
frontend/dist/SavedInsights 664 B 0 B
frontend/dist/sb 1.82 kB 0 B
frontend/dist/scala 7.32 kB 0 B
frontend/dist/scheme 1.76 kB 0 B
frontend/dist/scss 6.41 kB 0 B
frontend/dist/SdkDoctorScene 9.4 kB 0 B
frontend/dist/SessionAttributionExplorerScene 6.62 kB 0 B
frontend/dist/SessionGroupSummariesTable 4.62 kB 0 B
frontend/dist/SessionGroupSummaryScene 17 kB 0 B
frontend/dist/SessionProfileScene 15.8 kB 0 B
frontend/dist/SessionRecordingDetail 1.73 kB 0 B
frontend/dist/SessionRecordingFilePlaybackScene 4.46 kB 0 B
frontend/dist/SessionRecordings 742 B 0 B
frontend/dist/SessionRecordingsKiosk 8.84 kB 0 B
frontend/dist/SessionRecordingsPlaylistScene 4.14 kB 0 B
frontend/dist/SessionRecordingsSettingsScene 1.9 kB 0 B
frontend/dist/SessionsScene 3.86 kB 0 B
frontend/dist/SettingsScene 2.98 kB 0 B
frontend/dist/SharedMetric 4.83 kB 0 B
frontend/dist/SharedMetrics 549 B 0 B
frontend/dist/shell 3.07 kB 0 B
frontend/dist/SignupContainer 24.5 kB 0 B
frontend/dist/Site 1.18 kB 0 B
frontend/dist/solidity 18.6 kB 0 B
frontend/dist/sophia 2.76 kB 0 B
frontend/dist/SourcesScene 5.96 kB 0 B
frontend/dist/sourceWizardLogic 662 B 0 B
frontend/dist/sparql 2.55 kB 0 B
frontend/dist/sql 10.3 kB 0 B
frontend/dist/SqlVariableEditScene 7.24 kB 0 B
frontend/dist/st 7.4 kB 0 B
frontend/dist/StartupProgram 21.2 kB 0 B
frontend/dist/SubscriptionsScene 16.4 kB 0 B
frontend/dist/SupportSettingsScene 1.16 kB 0 B
frontend/dist/SupportTicketScene 23 kB 0 B
frontend/dist/SupportTicketsScene 733 B 0 B
frontend/dist/Survey 780 B 0 B
frontend/dist/SurveyFormBuilder 1.54 kB 0 B
frontend/dist/Surveys 18.2 kB 0 B
frontend/dist/surveys.js 90 kB 0 B
frontend/dist/SurveyWizard 64.2 kB 0 B
frontend/dist/swift 5.26 kB 0 B
frontend/dist/SystemStatus 16.8 kB 0 B
frontend/dist/systemverilog 7.61 kB 0 B
frontend/dist/TaskDetailScene 20.1 kB 0 B
frontend/dist/TaskTracker 13.2 kB 0 B
frontend/dist/tcl 3.57 kB 0 B
frontend/dist/TextCardMarkdownEditor 11 kB 0 B
frontend/dist/toolbar 10.2 MB 0 B
frontend/dist/ToolbarLaunch 2.52 kB 0 B
frontend/dist/tracing-headers.js 1.74 kB 0 B
frontend/dist/TracingScene 29.3 kB 0 B
frontend/dist/TransformationsScene 1.91 kB 0 B
frontend/dist/tsMode 24 kB 0 B
frontend/dist/twig 5.97 kB 0 B
frontend/dist/TwoFactorReset 3.98 kB 0 B
frontend/dist/typescript 240 B 0 B
frontend/dist/typespec 2.82 kB 0 B
frontend/dist/Unsubscribe 1.62 kB 0 B
frontend/dist/UserInterview 4.53 kB 0 B
frontend/dist/UserInterviews 2.01 kB 0 B
frontend/dist/vb 5.79 kB 0 B
frontend/dist/VercelConnect 4.95 kB 0 B
frontend/dist/VercelLinkError 1.91 kB 0 B
frontend/dist/VerifyEmail 4.48 kB 0 B
frontend/dist/vimMode 211 kB 0 B
frontend/dist/VisualReviewRunScene 18.6 kB 0 B
frontend/dist/VisualReviewRunsScene 6.16 kB 0 B
frontend/dist/VisualReviewSettingsScene 10.6 kB 0 B
frontend/dist/web-vitals.js 6.39 kB 0 B
frontend/dist/WebAnalyticsScene 5.77 kB 0 B
frontend/dist/WebGLRenderer-DYjOwNoG 60.3 kB 0 B
frontend/dist/WebGPURenderer-B_wkl_Ja 36.3 kB 0 B
frontend/dist/WebScriptsScene 2.54 kB 0 B
frontend/dist/webworkerAll-puPV1rBA 324 B 0 B
frontend/dist/wgsl 7.34 kB 0 B
frontend/dist/Wizard 4.45 kB 0 B
frontend/dist/WorkflowScene 103 kB 0 B
frontend/dist/WorkflowsScene 46.9 kB 0 B
frontend/dist/WorldMap 4.73 kB 0 B
frontend/dist/xml 2.98 kB 0 B
frontend/dist/yaml 4.6 kB 0 B

compressed-size-action

expect(key).not.toBe('operation.name')
expect(key).not.toBe('resource.name')
}
expect(event.properties!['$ai_stop_reason']).toBe('stop')
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.

P2 Missing test for gen_ai.response.finish_reasons array path

The gen_ai.response.finish_reasons fallback (the else if branch in vercel-ai.ts) is untested. That branch has its own logic — array type check plus [0] indexing — and currently any breakage there would go undetected. A parametrised test covering ai.response.finishReason (primary), gen_ai.response.finish_reasons array (fallback), and neither present (undefined) would cover the three cases OnceAndOnlyOnce.

Prompt To Fix With AI
This is a comment left during a code review.
Path: nodejs/src/ingestion/ai/otel/middleware/vercel-ai.test.ts
Line: 97

Comment:
**Missing test for `gen_ai.response.finish_reasons` array path**

The `gen_ai.response.finish_reasons` fallback (the `else if` branch in `vercel-ai.ts`) is untested. That branch has its own logic — array type check plus `[0]` indexing — and currently any breakage there would go undetected. A parametrised test covering `ai.response.finishReason` (primary), `gen_ai.response.finish_reasons` array (fallback), and neither present (undefined) would cover the three cases OnceAndOnlyOnce.

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

Comment on lines +207 to +208
// stop_reason takes priority over finish_reason
expect(event.properties!['$ai_stop_reason']).toBe('end_turn')
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.

P2 finish_reason-only path is not exercised

The test has both llm.response.stop_reason and llm.response.finish_reason present. The case where only llm.response.finish_reason is provided (no stop_reason) is untested, so a regression in the ?? fallback would go undetected. A parametrised test covering both-present (stop_reason wins), finish_reason-only, and neither-present (undefined) would match the preference for parameterised tests.

Prompt To Fix With AI
This is a comment left during a code review.
Path: nodejs/src/ingestion/ai/otel/middleware/traceloop.test.ts
Line: 207-208

Comment:
**`finish_reason`-only path is not exercised**

The test has both `llm.response.stop_reason` and `llm.response.finish_reason` present. The case where only `llm.response.finish_reason` is provided (no `stop_reason`) is untested, so a regression in the `??` fallback would go undetected. A parametrised test covering both-present (stop_reason wins), finish_reason-only, and neither-present (undefined) would match the preference for parameterised tests.

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

Copy link
Copy Markdown
Member

@andrewm4894 andrewm4894 left a comment

Choose a reason for hiding this comment

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

oh interesting - we can do some stuff with this one i think

@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented Apr 10, 2026

🎭 Playwright report · View test results →

⚠️ 1 flaky test:

  • Materialize view pane (chromium)

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

@carlos-marchal-ph
Copy link
Copy Markdown
Contributor Author

- Test finish_reason-only path (no stop_reason) in traceloop middleware
- Test gen_ai.response.finish_reasons array path in vercel-ai middleware
- Test undefined when neither reason is present
@github-actions
Copy link
Copy Markdown
Contributor

This PR hasn't seen activity in a week! Should it be merged, closed, or further worked on? If you want to keep it open, please remove the stale label – otherwise this will be closed in another week. If you want to permanently keep it open, use the waiting label.

@github-actions github-actions Bot added the stale label Apr 20, 2026
@carlos-marchal-ph carlos-marchal-ph removed request for a team April 20, 2026 09:20
@carlos-marchal-ph carlos-marchal-ph enabled auto-merge (squash) April 20, 2026 09:21
@tests-posthog
Copy link
Copy Markdown
Contributor

tests-posthog Bot commented Apr 20, 2026

⏭️ Skipped snapshot commit because branch advanced to 4baac50 while workflow was testing d5f34d4.

The new commit will trigger its own snapshot update workflow.

If you expected this workflow to succeed: This can happen due to concurrent commits. To get a fresh workflow run, either:

  • Merge master into your branch, or
  • Push an empty commit: git commit --allow-empty -m 'trigger CI' && git push

@carlos-marchal-ph carlos-marchal-ph merged commit d94b73a into master Apr 20, 2026
140 checks passed
@carlos-marchal-ph carlos-marchal-ph deleted the feat(llma)/add-ai-stop-reason branch April 20, 2026 09:41
inkeep Bot added a commit that referenced this pull request Apr 20, 2026
Reflects PR #54037 which adds $ai_stop_reason to LLM analytics,
capturing why model responses ended (e.g. stop, end_turn, max_tokens,
tool_use).
@deployment-status-posthog
Copy link
Copy Markdown

deployment-status-posthog Bot commented Apr 20, 2026

Deploy status

Environment Status Deployed At Workflow
dev ✅ Deployed 2026-04-20 10:05 UTC Run
prod-us ✅ Deployed 2026-04-20 10:18 UTC Run
prod-eu ✅ Deployed 2026-04-20 10:36 UTC Run

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants