I am leaving measureAndReturn in place because it emits a lot of useful
tracing metadata and it remains a good place to conduct experiments in
the future.
* feat(onboarding): add DatasetItemsOnboarding component for dataset item management
- Introduced a new onboarding component to facilitate the addition of items to datasets, including options for CSV uploads and manual entry.
- Updated SplashScreen to accept children for enhanced flexibility.
- Modified DatasetItemsTable and related components to conditionally render onboarding based on dataset item count.
* chore: references
* Checkpoint before follow-up message
Co-authored-by: michael <michael@langfuse.com>
* fix(spend-alerts): format code and fix toast imports
* feat(spend-alerts): add test script for spend alert emails
- Follows same pattern as send-test-threshold-emails.ts
- Includes 3 test scenarios with different thresholds
- Requires manual email configuration for safety
* feat(spend-alerts): add Prisma migration for CloudSpendAlert table
- Creates cloud_spend_alerts table with proper schema
- Adds foreign key constraint to organizations table
- Includes index on org_id for performance
- Supports decimal thresholds and trigger tracking
* add concurrently keyword to index
* fix linter error
* fix linter error
* remove old usage alerts
* update syling
* refatcor alerts jobs
* fix build errors
* update rate limit for stripe
* fix migration
* update email template and tracking
* update text
* add review comments
* add queue body deifniton
---------
Co-authored-by: Cursor Agent <cursoragent@cursor.com>
Co-authored-by: michael <michael@langfuse.com>
* shuffle toolbar
* controls sidebar
* setup for filter attributes
* test with environment filter
* new filter state management
* name filter
* add reset filter button
* add tags filter
* add bookmarked filter
* unify column id v display handling
* rename to bookmarked
* polish, fix bugs
* merge hooks, efficiency
* support dual-value in slider
* latency filter
* make filters generic
* add sidebar to observations, sessions, prompts, scores and evals
* simplify table-controls component
* allow resetting individual filters
* clean up layout
* show "all" when only selected item
* text facets
* add key-value filter
* add numerical key-value filter
* add metadata filter
* disable accordion animations
* add filtering for values
* fix observation filters not being applied
* add ai filters
* represent no range filter with empty inputs
* update look of reset button
* fix header shrinking
* tidy up vertical spacing
* clean up
* fix type and lint issues
* fix none-of operator not being used when it should
* fix missing env filter
* a few last fixes
* another type error
* oops
* Fix: Prevent duplicate job scheduling in queues
Co-authored-by: michael <michael@langfuse.com>
* Fix: Deduplicate queue jobs across multiple worker instances
Co-authored-by: michael <michael@langfuse.com>
* Checkpoint before follow-up message
Co-authored-by: michael <michael@langfuse.com>
* Checkpoint before follow-up message
Co-authored-by: michael <michael@langfuse.com>
* fix: prevent duplicate queue job scheduling across multiple containers
- Add unique jobIds to CloudFreeTierUsageThresholdQueue for deduplication
- Add comprehensive logging for job scheduling and execution tracking
- Apply best practices pattern with descriptive job data and comments
- Remove investigation documentation files
This resolves the issue where multiple worker containers were creating
duplicate recurring and bootstrap jobs, causing 10x more executions
than expected.
* add logging statements
* remove job id and bootstrap execution
---------
Co-authored-by: Cursor Agent <cursoragent@cursor.com>
Co-authored-by: michael <michael@langfuse.com>
* fix(billing): implement chunked updates for free tier usage tracking
Reduces DB load by 95% via transaction batching (50,000 → 50 chunks).
Each chunk processes 1,000 orgs with proper error handling.
Failed chunks reported to Datadog without killing the job.
Changes:
- Refactored processThresholds() to return update data instead of executing immediately
- Created bulkUpdates.ts with chunked transaction processing (1000 orgs per batch)
- Modified usageAggregation.ts to collect updates and execute in bulk
- Updated tests to verify returned data instead of mock calls
- Added error handling with traceException for failed chunks
- Structured for easy swap to raw SQL (Option 1) if needed
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
* test: update cache invalidation tests to use bulkUpdateOrganizations
The tests now call bulkUpdateOrganizations() to complete the update flow,
including cache invalidation. This reflects the refactored architecture where
processThresholds() returns update data and bulkUpdateOrganizations() executes it.
* fix: reduce transaction timeout from 60s to 15s per chunk
60 seconds was excessive for 1000 orgs. Even at 10ms per update,
that's only 10 seconds. 15 seconds provides a reasonable buffer.
* refactor: use Promise.allSettled instead of transaction wrapper
Benefits over previous () approach:
- Better resilience: One failed org doesn't fail the entire 1000-org chunk
- Concurrent execution: Much faster than sequential transaction
- Granular error tracking: Track exactly which orgs failed
- Better error handling: Each org failure reported to Datadog individually
Trade-off: No atomicity per chunk, but we don't need it for this use case.
Each org update is independent and idempotent.
* fix: remove unused chunkOrgIds variable
* remove unused code
* refactor transaction update and add rawsql update
* Update worker/src/ee/usageThresholds/bulkUpdates.ts
Co-authored-by: ellipsis-dev[bot] <65095814+ellipsis-dev[bot]@users.noreply.github.com>
* Update worker/src/ee/usageThresholds/bulkUpdates.ts
Co-authored-by: ellipsis-dev[bot] <65095814+ellipsis-dev[bot]@users.noreply.github.com>
* make rawsql query default
---------
Co-authored-by: Claude <noreply@anthropic.com>
Co-authored-by: ellipsis-dev[bot] <65095814+ellipsis-dev[bot]@users.noreply.github.com>
* fix(billing): enhance free tier usage emails with pricing, reset dates, and CRM integration
- Add getBillingCycleEnd() helper to calculate when usage limits reset
- Add comprehensive tests for billing cycle end date calculations
- Add optional USAGE_THRESHOLD_EMAIL_BCC env variable for CRM integration (e.g., HubSpot)
- Include reset date in both warning and suspension emails
- Add Core plan pricing ($29/month) and key benefits to email templates
- Mention startup program (50% off for first year) with link to langfuse.com/startups
- Update email templates to include:
- When usage limit resets
- Pricing information from stripeCatalogue
- Key upgrade benefits: unlimited users, 90-day retention, email/chat support
- Startup program callout
- Update test script to include reset date and BCC configuration
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
* refactor(billing): rename USAGE_THRESHOLD_EMAIL_BCC to CLOUD_CRM_EMAIL
Rename environment variable to better reflect its purpose as a general
cloud CRM integration endpoint rather than being specific to email BCC.
Changes:
- Renamed env variable in both .env.dev.example and .env.prod.example
- Updated email sending functions to use new variable name
- Updated test script with new variable name
- Regenerated TypeScript declarations
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
* security(billing): add email validation for CLOUD_CRM_EMAIL
Add Zod email validation before using CLOUD_CRM_EMAIL in BCC field
to prevent potential email header injection attacks.
Changes:
- Import and use zod/v4 for email validation in both email functions
- Validate CLOUD_CRM_EMAIL format before assigning to BCC
- Log warning if invalid email format is detected
- Add CLOUD_CRM_EMAIL to worker env schema
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
---------
Co-authored-by: Claude <noreply@anthropic.com>
When LANGFUSE_FREE_TIER_USAGE_THRESHOLD_ENFORCEMENT_ENABLED is false,
the paid plan check was never reached due to early return. This caused
ALL organizations (paid and free) to be incorrectly counted as free_tier_orgs.
Fix: Move paid plan check before enforcement check to ensure paid orgs
always return "PAID_PLAN" regardless of enforcement status.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-authored-by: Claude <noreply@anthropic.com>
* fix: show input/output/total columns in traces table correctly
* fix: show input/output/total columns in traces table correctly
* fix: show input/output/total columns in traces table correctly
* Add current datetime to AI prompt context
Co-authored-by: marc <marc@langfuse.com>
* Refactor datetime formatting for AI prompt
Co-authored-by: marc <marc@langfuse.com>
---------
Co-authored-by: Cursor Agent <cursoragent@cursor.com>
* fixup(datasets-compare): support front-end column filtering
- Added column filtering capabilities to the DatasetCompareRunsTable and DatasetRunAggregateColumnHelpers.
- Introduced useColumnFilterState hook for managing filter state with URL persistence.
- Updated DatasetRunItemsByRunTable to accept multiple dataset run IDs.
- Enhanced PopoverFilterBuilder to support different button variants for filter actions.
- Refactored related components to integrate new filtering features.
* chore: remove fetching of run items data in compare view
* chore: move filter logic into useDatasetRunAggregateColumns
* chore: extend useColumnFilterState
* chore(scores): add ScoreDataType and ScoreDataTypeDomain
* chore: move state out of useDatasetRunAggregateColumns
* chore(dataset-run-items): enhance DatasetRunItem types and converters for optional IO support
* chore: refactor compare data fetching to support one API route
* feat: support filtering on compare view
* feat: add FilteredRunPills component for enhanced filtering display in compare view
* chore: eslint
* chore: simplify and refactor
* chore: push
* fix import
* chore: remove console log
* chore: drop first approach of pulling dataset item ids from postgres
* chore: rename trpc route
* tests: adjust non filter tests
* chore: rename dataset repository helper functions
* chore: add intersection query
* chore: push
* chore: debounce updateRunFilters
* chore: add filter synchronization for run IDs in DatasetCompareRunsTable
* feat: better relative date range selects
* fix: date picker styles
fixes LFE-6702
* add TimeRangePicker
* use TimeRangePicker in traces view
* update dashboards and tables to use TimeRangePicker
* missed fixes due to updated time range utils
* simplify
* update remaining
* remove old timestamp filter
* address comment
* silence codespell false-positive
* fix badge heights
ClickHouse has a quirk when it comes to handling exceptions mid response.
It will simply output a row with "exception" key inside, which is indistinguishable from
a query like `SELECT "my lovely string" AS exception;` may return.
This PR makes the best effort to convert such rows into errors and throws them.
See:
- https://github.com/ClickHouse/clickhouse-js/issues/332
- https://github.com/ClickHouse/ClickHouse/issues/75175
Ideally this should get fixed in the future versions of ClickHouse.
* fix(otel-ingest): don't overwrite trace metadata from new observation
* update test
* skip test, not good
* skip test because it's not getting the entire trace
* Refactor: Add last used auth method persistence
Co-authored-by: leo <leo@langfuse.com>
* Refactor: Use useLocalStorage hook for auth method persistence
Co-authored-by: leo <leo@langfuse.com>
* Refactor SSOButtons to use parent-managed last used method
Co-authored-by: leo <leo@langfuse.com>
* Refactor: Conditionally show "Last used" badge on sign-in
Co-authored-by: leo <leo@langfuse.com>
* refactor styles
* pass lint
---------
Co-authored-by: Cursor Agent <cursoragent@cursor.com>
* Michael/lfe 6645 (#9046)
* refactor billing settings and cancel button
* refactor billing components
* chore(stripe): bump stripe from 17.4.0 to 18.5.0.basil (#9050)
* bump stripe api version to 18.5.0.basil
* update stripeAPIHandler to 18.5.0
* update cloud billing router and add log statements
* Show stripe buttons only with active subscription
* remove logging statements
* feat(billing): show plan end in billing settings (#9052)
* update cloudConfigSchema with metadata field for scheduled cancellations
* add function to unpack cancellation metadata in subscription.update webhook
* store cancellation metadata in db
* add and aggegregation option to LocalIsoDate component
* add BillingCurrentPlanLabel component to indicate cancelled plans
* add title prop to StripeCustomerPortalButton for better accessibility
* remove text from label
* fix(billing): cancel pending cancellations on plan switches (#9076)
cancel pending cancellations on plan switches
* feat(billing): distinguish between new subscriptions and legacy subscriptions (#9078)
* add orderKeys to distinguish between upgrades and downgrades of subcriptions
* add optional activeUsageProductId to cloudConfig schema
* add legacy Plan flag on cloudConfig.stripe schema
* set usageProductId in webhook callback
* feat(billing): Add new billing logic and update stripe integration (#9096)
* update stripe usage product id to match sandbox
* update to cloudBillinRouter.createCheckoutSession to deal with legacy and new prices
* add orderKeys and replace them with monthly price to distinguish upgrade and downgrade paths
* update cloudBillingRouter.changePlan mutation to deal with different upgrade paths
* update stripeWebHookApiHandler to listen for subscriptionSchedule events
* update cloudConfig schema to store subscription schedule metadata
* extract formatLocalIsoDate into own function
* add useBillingInformation hook for common ui-billing operations
* Add BillingScheduleNotification component to indicate to user when their subscription is cancelled or scheduled to change
* refactor billing component to use new hook
* add managed cancellation button
* fix planSwitch info overrides on schedule.update callbacks
* remove logging statements
* add buttons to isolate strip cancelation, plan continuation, and switching
* refacor billingSwitchPlanDialog
* fix linter errors
* fix bug where released schedules where released
* fix Billing Portal ui issue
* add support for legacy plans to enable testing on staging
* clear cancellationInfo and planSwitchScheduleInfo on customer.subscription.deleted webhook
* extract condition into variable
* fix typo
* Add invoice table
* fix unstable ref causing rerenders
* fix uneccessary cast
* feat(billing): invoice table in billing settings (#9134)
* Add invoice table
* fix unstable ref causing rerenders
* fix uneccessary cast
* update webhooks to allow externally triggered subscription schedules
* nit
* feat(billing): Rewrite Billing Service to Reduce Complexity and Minimize Data Drift Risks (#9169)
* refactor code for more effective refetches
* Refactor cloudBillingRouter into BillingService
* Add Idempotency keys for unique stripe ops, add logging and auditLogs, Refactor for cleaner dx
* Add env checks to stripe webhook handler
* Add env checks to stripe webhook handler
* add review comments
* standardize logger statements
* Add new readme
* update plan switch/cance/reactivate explanation messages
* Add fallbacks in org resolution to webhook, to deal with susbcriptions created from the dashboard
* fix linter errors
* remove comment
* fix build errors
* implement review comments
* add discount column to invoice table
* update orderkey of core plan to reflect new price
* fix(billing): apply existing discounts to new subscription phase when updating via subscription schedule (#9199)
* safeguard against illegal invoice.createPreview call and apply discounts on subscription schedule change
* fix typo
* add docstrings to stripeIdempotencyKey.ts
* update productId for prod
---------
Co-authored-by: Marc Klingen <git@marcklingen.com>
* fix: fetch environment options from raw data
* chore: drop stuff
* chore: patch
* chore: always add default
* chore: adjust mapping logic for correctness
* chore: drop materialized views to fill project_environments
* chore: remove migration files
* perf: drop final on check trace exists
* chore: only apply final on eval check if non-id filter is used
* chore: skip full query if not needed
* chore: revert query changes
* chore: simplify condition
* chore: add metrics
* feat: add api endpoint to configure blob storage integration
* chore: add test suite and generated API docs
* chore: add implementation
* chore: simplify delete endpoint
* chore: PUT route cleanups
* feat(dataset-run-items-ui): support score filters in UI table
* chore: add dataset run item scores to seeder
* chore: make datasetid optional
* chore: drop dataset item id from scores CTE
* feat: Add HIPAA region and improve region selection
Co-authored-by: marc <marc@langfuse.com>
* Refactor: Remove unused state and simplify region logic
Co-authored-by: marc <marc@langfuse.com>
* Fix: Update BAA link to HIPAA security page
Co-authored-by: marc <marc@langfuse.com>
* Refactor AuthCloudRegionSwitch component for clarity
Co-authored-by: marc <marc@langfuse.com>
* delete weird file and prettier
* replace contact support on sign in with mailto link
---------
Co-authored-by: Cursor Agent <cursoragent@cursor.com>
* Refactor: Use signIn with redirect: false for OTP verification
Co-authored-by: marc <marc@langfuse.com>
* nit
* revert button changes, not the focus of this pr
* push
---------
Co-authored-by: Cursor Agent <cursoragent@cursor.com>
* fixup(peek): isolate data fetching for peek view to depend on trpc and be independent of table state
* fix: rely only on url for peek state management
* fixup: drop complex peek logic
* refactor: replace createPeekHandler with usePeekNavigation for improved URL management in table components
* chore: all peek logic fixed except compare view and expand
* chore: refactor navigation logic
* chore: docs
* chore: clear url params also in row click navigation
* chore(table): rename isPinned to isFixedPosition
* chore(table): do not allow re-ordering fixed position columns
* refactor(table): update column visibility and order keys for dataset runs
* feat(dataset-runs): fix first two columns on y-/x-scroll
* chore: fixup
* chore: add comment
* Add support form and drawer scaffolding
* style changes
* fix flickering
* style support drawer into section
* update form
* refactor to use useForm hook
* add initial trpc router for creating chats
* add plainRouter and remove legacy chat
* refactor plain trpc route to fire and forget non-critical updates
* update success section
* add mobile support view
* make interaction type conditional
* add community section
* replace support-menu-dropdown with supportmenu-button
* add entitlement in-app-support to all cloud plans
* make plain call synchronous
* add file upload
* fix lint error
* remove unused code
* add first implementation of threadEvents
* remove auto-open on project create
* remove auto-open on tracing api generation
* remove comments
* remove old trpc route
* remove unused function
* simplify function return
* reduce input surface of createThread procedure
* simplified layout
* make drawer props more explicit
* remove duplicate threadFields
* remove misleading button
* refactor trpc router and plain client
* add support for uiCustomization
* remove plain chat from csp
* strict equality
* replace radio buttons
* perf: move tokenization in worker to worker thread
* chore: linting
* chore: test timeouts
* duplicate worker file
* chore: linting
* chore: make async tokenization rate configurable
* chore: add note in worker-thread files on keeping them same
* chore: make pool size dynamic and add error fallback
* chore: pass text as is to tokenization
* chore: patch tracing behaviour
* chore: bump to 4 workers
* chore: linting
* chore: update span prop names
* chore: start with 2 workers
* feat(table-ui): filter score columns to show score only if has value for given table
* chore: refactor analytics
* chore: include dataset id in filter condition for DRI scores
* chore: fix tests
* chore: await data
* fixup-remove: upgrade to nextjs v15 (#8795)
* chore: simplify query
* chore: remove getRunScoresGroupedByNameSourceType
* chore: push
* fix: stabilize hook dependency
* Revert "fixup-remove: upgrade to nextjs v15 (#8795)"
This reverts commit 50b742325a82057f5dbfbe3f548d0610d3343f13.
* chore: eslint
---------
Co-authored-by: Nimar <l.nimar.b@gmail.com>
* chore: validate IP adresses
* chore: validate IP adresses
* chore: validate IP adresses
* chore: validate IP adresses
* chore: validate IP adresses
* chore: validate IP adresses
* chore: validate IP adresses
* chore: validate IP adresses
* chore: validate IP adresses
* chore: validate IP adresses
* chore: validate IP adresses
* chore: validate IP adresses
* chore: validate IP adresses
* chore: validate IP adresses
* docs: add spec
* feat: add filter and date range saving to dashboard
* feat: take out url params hook for date ranges
* docs: remove specs
* move migration
* move migration
* fixes
* fixes
---------
Co-authored-by: Max Deichmann <m.deichmann@tum.de>
* feat(dataset-items-ui): allow filtering by metadata keys
* chore: push
* chore: push
* chore: fix after rebase
* feat(datasets): full text search for dataset items
* chore: remove checking for trace and observation existence before returning dataset items
* chore: eslint
* chore: pass search parameters
* perf: use aggregations to calculate traces all API result
* chore: adjust AMT settings for redis-cluster tests
* chore: patch test cases
* chore: handle prefix and filter differentl
* chore: move trace column def to shared server to use env imports
* fix: use dynamic asset path for Ragas logo with custom basePath
- Fixes hardcoded /assets/ragas-logo.png path that breaks with NEXT_PUBLIC_BASE_PATH
- Uses router.basePath to construct correct asset URL dynamically
- Resolves broken Ragas evaluator icons for custom base path deployments
- Backward compatible with root path deployments
Fixes#8611
* fix: prettier formatting for ragas-logo.tsx
- Add missing newline at end of file
- Ensure consistent formatting
* fix: apply prettier formatting to ragas-logo.tsx
* fix: use env.NEXT_PUBLIC_BASE_PATH directly for Ragas logo
Addresses reviewer feedback to use environment variable directly
instead of useRouter().basePath, matching pattern used throughout
the codebase (LangfuseLogo, auth redirects, API endpoints, etc.)
* chore: upgrade to trpc v11, react-query v5
* equalize ts version
* onSuccess -> useEffect
* isPending
* restore some
* fix
* fixx
* fix again
* fix
* ugly working state
* make the TS concise types a bit more beautifyul
* fix one more
* more loading
* mock
* moar pending
* moar
* use queryclient instead
* upgrade superjson
* pot fix
* more specific types
* fix build
* clean up
* undo
* cleanup
* cleanup
* wip small scores
* fix: root node missing selected state
* refactor: only use command for search results
* chore: more consistent styling between search and tree
* fix: rerendering issue
* fix: more styling issues
* fix: lint warnings and eslint vscode plugin config
* more cleanup
* fix: selecting root node from search
* turn timeline toggle into dropdown
* improve collapse / expand all
* fix missing title on view options
* fix observation name overflow
* allow resizing tree view
* better tree indicators and smaller font size
* integrate new feedback
* add some spacing to scores
* fix timeline toggle label
* fix timeline view dynamic sizing
* resizable improvements
* last tree connector fixes
* switching views shouldn't push to history
* even more density
* polish
* fix type errors
* update dataset compare detail view
* fix missing vertical padding in tree node without metrics
* rebase cleanup
* fix: implement a recursive version of getChannels
SlackService.getChannels only fetched 200 channels, which after
filtering might get even less. This doesn't work for large
organizations, as there are usually more than 200 active channels,
with possibly more archived (which counted into the limit)
Signed-off-by: Łukasz Jernaś <lukasz.jernas@allegro.com>
* chore: Add limit on how many records we can download from Slack API
Signed-off-by: Łukasz Jernaś <lukasz.jernas@allegro.com>
* fix: Actually respect the fetch limit
Signed-off-by: Łukasz Jernaś <lukasz.jernas@allegro.com>
* fix: Implement review suggestions
Signed-off-by: Łukasz Jernaś <lukasz.jernas@allegro.com>
---------
Signed-off-by: Łukasz Jernaś <lukasz.jernas@allegro.com>
Co-authored-by: Steffen Schmitz <steffen@langfuse.com>
* feat(traces): add more observation types
* observations table default filter for all types
* fix test running instructions
* add seeder
* add basic tests
* add to evaluator object selector
* add test to verify we default to span-create for all types
* allow generation like attributes on all types
* check if something is generation LIKE not strictly a GENERATION
* fix test
* ensure that GENERATION-like type's fields can also be null
* simplify create- logic
* chore(dataset-run-items): return CH result
* chore: sunset dual-write phase for dri in CH execution path; do not fall back on PG for reads
* chore: eslint
* chore: limit traces to trace AMT migration to only write into traces_all_amt
* chore: revert validation changes
* chore: simplify query
* chore: tune both queries
* chore: avoid full aggregation during migration
* chore: handle IO coalescing to skip aggregations fully
* chore: remove obsolete query parts
* fix(evals): ensure default model supports langfuse evals at set up
* fix: await upsertDefaultModel
* chore: provide actionable error messages in case of misconfiguration
- LLM connections: surface required model selection
for Azure/Bedrock; simplify advanced settings and validation
- Move custom model names to main form for Azure and Bedrock; require at least one model
- Remove default models toggle for Azure/Bedrock (they don’t support defaults)
- Keep Azure base URL and extra headers in main form; remove Azure advanced panel entirely
- Show advanced settings only for OpenAI, Anthropic, Vertex AI, and Google AI Studio
- Improve validation order to avoid confusing errors when defaults aren’t supported
- Add adapter-based placeholder for provider name; clarify copy
- Consolidate adapter logic to a single helper used in UI and schema
* chore: skip S3 list and legacy trace insert based on env flag
* chore: adjust skip s3 list conditions
* chore; refactor traceUpserQueue entity assoication
* chore: reverse
* chore(annotation-queue): add AnnotationQueueMembership model and related database schema updates
* chore(annotation-queue): add AnnotationQueueMembership POST and DEL APIs
* feat(annotation-queue): implement user assignment functionality for annotation queues
* fix: role logic for users
* chore: rn to assignments
* fixup: rn to assignments
* chore(annotation-queue): enhance user assignment section with debounced search and display of assigned users
* feat(annotation-queue): add MultiSelectCombobox for user assignment and enhance DataTable with row class name functionality
* refactor(rbac): replace generateUserQuery with generateUserProjectRolesQuery and introduce utility functions for project role resolution
* fixup: filter query for user ids
* fixup: resolve project role test
* fix: validate user project role before adding to annotation assignment
* chore: remove code
* chore: fix
* chore: fix filter
* chore: fix filter
* tests for auth logic
* push: fix api route test
* tests for auth logic
* fix
* fix
* chore: push
* chore: rename
* docs: api types
* fix: formatting
* fix: formatting
* chore: add disabled prop to MultiSelectCombobox
* chore: rename migration
---------
Co-authored-by: Max Deichmann <m.deichmann@tum.de>
* feat(evaluator-form): add tooltip for existing evaluator usage in edit mode
* feat(evaluator-form): enhance target data label with tooltip for edit mode
* chore: lint
* chore(dataset-run-items): GET /dataset-run-items
* fixup(dataset-run-items): GET /dataset-run-items
* chore(dataset-run-items): GET datasetRun/[runName]
* fix(dataset-run-items): return 0 for count when no records found
* fix(dataset-run-items): ensure offset is calculated only when page and limit are present
* feat(dataset-run-items): enhance dataset filtering by adding datasetId support and refactor related functions
* chore: rm comment
* refactor(dataset-run-items): rename dataset run name to ID across API and table definitions
* feat(dataset-run-items): add dataset_run_items to Clickhouse table names and refactor dataset filtering to use camelCase
* fix(dataset-run-items): update dataset filtering to ensure only the latest version of each dataset run item is retrieved
* chore: imports
* chore: fix de-duplication
* chore(dataset-router): mark runitemsByRunIdOrItemId as deprecated
* chore: refactor only, split out routes into byItemId and byRunId
* Revert "chore: refactor only, split out routes into byItemId and byRunId"
This reverts commit 2e1f2e3c14b9ed1173e2fb73b7f721c72d57bfbb.
* Revert "chore(dataset-router): mark runitemsByRunIdOrItemId as deprecated"
This reverts commit 5cb2232198d84baf7f027b00603c6fb3b9489c52.
* fixup: runitemsbyrunidoritemid
* chore: rewrite runitemsByRunIdOrItemId
* chore: rewrite runsByDatasetIdMetrics
* chore: ordering
* chore: order by created at and remove base data from query
* chore: add back name
* chore: push
* chore(dataset-run-items): GET /dataset-run-items
* fixup(dataset-run-items): GET /dataset-run-items
* chore(dataset-run-items): GET datasetRun/[runName]
* fix(dataset-run-items): return 0 for count when no records found
* fix(dataset-run-items): ensure offset is calculated only when page and limit are present
* feat(dataset-run-items): enhance dataset filtering by adding datasetId support and refactor related functions
* chore: rm comment
* refactor(dataset-run-items): rename dataset run name to ID across API and table definitions
* feat(dataset-run-items): add dataset_run_items to Clickhouse table names and refactor dataset filtering to use camelCase
* fix(dataset-run-items): update dataset filtering to ensure only the latest version of each dataset run item is retrieved
* chore: imports
* chore: fix de-duplication
* feat(dataset-run-items): implement experiment service writes
* chore: add
* fix(experiments): update error messages for missing API key using constants
* chore(experimentCreateQueue): increase backoff delay to 10 seconds
* chore(auth): update ingestion types for improved flexibility
* chore: create traces & error-level generations for DRIs
* chore: unify timestamps
* chore: revert test to PG implementation until we add DRI migration across environments
* chore: typo
* chore: implement unified trace ID generation for ClickHouse and PostgreSQL executions to prevent duplicate traces
* chore: refactor trace creation logic for ClickHouse and PostgreSQL executions to use a unified approach
* chore: eslint
* chore: comment
* chore: rebase
* chore: rebase
* chore: rename function for clarity and fix typo in comments
* refactor: remove fetchDatasetRun function and replace with direct Prisma query for dataset run retrieval
* chore: eslint
* chore: fix test
* chore: fix test
* refactor: rename function and update comments for clarity in experimentServiceClickhouse
* feat(dataset): implement dataset run items deletion queue and processing
* feat(dataset): add dataset run items deletion functionality and integrate with deletion queue
* chore: revert imports
* chore: handle DRI deletion on project deletion conditionally
* fix(dataset-router): await Promise.all for dataset run items deletion
* refactor(dataset-router): streamline dataset deletion process and ensure async handling of dataset run items
* fix(env): add new environment variable for dataset run items deletion concurrency duration
* chore: rm comment
* refactor(dataset-run-items): update delete functions to use object destructuring for parameters
* fix(dataset-run-items): replace hardcoded request timeout with environment variable for deletion timeout
* refactor(dataset): rename and restructure dataset deletion functionality, replacing dataset run items deletion with a unified dataset deletion queue
* fixup(experiments): support trigger for remote experiment run
* chore: remove instructions
* chore: rename webhook > remote experiment server side
* chore: rename webhook > remote experiment client side
* style: design review
* chore: lint
* fix(experiments): change URL validation to use z.url() in RemoteExperimentUpsertForm
* chore: rename
* feat(datasets): add transformation function for datasets and update API responses
* docs: add technical specs for multi window/prompt playground
* docs: add requirements and tech summary for sharing
* feat: add multi-window playground architecture and state isolation
* feat: make playground UI multi-window capable
* fix: multi window playground caching
* fix: jump to playground button adds windows to playground using stable id
* fix: avoid race condition in writing to cache before navigating to playground
* feat: add collapsible, more compact sections to non-model config
* feat: add compact version of model picker/params component
* feat: add ability to copy window states to multi playground
* fix: solve header crowding for thin windows in playground
* feat: make entire playground config section collapsible
* feat: change SaveToPrompt button to align with other window buttons
* feat: switch buttons in page header to icon-only when too small
* fix: adjust button labels to fit button size
* fix: update the execution window status correctly
* docs: complete remaining task items
* refactor: simplify playground state management hooks
* fix: make the model configuration section prettier
* docs: remove agent work files
* refactor: call register functions on the registry directly
* chore: refactored some components and compacted the design even more
* chore: move add message buttons
* chore: start align model param settings popover when compact
* chore: small UI spacing improvements
* fix: scrolling bug
* fix: handle config headers when window gets small
* chore: rename button hover
* feat: move CMD+Enter to execute all button
* feat: give user the choice to jump to fresh/existing playground
* push
* chore: fix
* chore: fix
* push
* push
* fixes
---------
Co-authored-by: Max Deichmann <m.deichmann@tum.de>
* fix: use drop down for prompt full text search
* fix: use drop down for prompt full text search
* fix: use drop down for prompt full text search
* fix: use drop down for prompt full text search
* fix: use drop down for prompt full text search
* feat(migrations): add dataset_run_items table in clickhouse
* feat(dataset): add environment variables and utility for pg/ch execution
* chore: re-write `runitemsByRunIdOrItemId` to support both clickhouse and postgres execution
* chore: use `runItemsByRunId` or `runItemsByItemId` rather than `runitemsByRunIdOrItemId`
* chore: rename env variables
* chore: reflect dri as ch data is seeder
* fixup: dataset run item types and converters
* chore: background migration
* chore: rewrite dataset-router routes
* chore(dataset): dual-write strategy for dataset run items to support ClickHouse and PostgreSQL
* chore: add utilities and converters
* chore: rewrite GET api/public/dataset-run-items
* feat(dataset): implement dataset run items deletion queue and processing
* chore: rewrite DELETE api/public/datasets/{datasetName}/runs/{runName}
* chore: rewrite GET api/public/datasets/{datasetName}/runs/{runName}
* fixup: rewrite GET api/public/datasets/{datasetName}/runs/{runName}
* chore(schema): add error to DRI schema
* fixup(ingestion): support dataset run items
* fixup: rewrite POST /api/public/dataset-run-items
* fixup: rewrite POST /api/public/dataset-run-items --amend
* fixup(ingestion): support dataset run items --amend
* fixup(experiments): preliminary implementation, for illustrative purposes only
* fixup(schema): indexes
* fixup(schema): remove indexes, add `output`
* chore: support DRI ingestion
* chore: eslint, writes related
* chore: rewrite experiment service
* chore: rm file
* chore: cascade delete dataset run items
* chore: add clustered migrations
* chore: update background migration
* chore: handle experiment job errors
* chore: remove CH read implementation
* chore: remove md file
* chore: remove CH read implementation II
* chore: fix typing
* chore: fix migration types
* fix: lint/imports
* fix: import errors
* chore: imports and comments
* chore: remove only from test
* fix: validateDatasetRunAndFetch
* fix: validateDatasetRunAndFetch id
* fixup: attempt fix of test
* fix: test
* chore: test validate logging
* chore: adjust logs
* chore: revert cascade delete
* Revert "feat(dataset): implement dataset run items deletion queue and processing"
This reverts commit 9f725f053386ded41e3617efaacee128d5ac023f.
* chore: delete imports
* revert: experiment service changes
* chore: adjust comment
* rename: env variables to incl experiment
* chore: remove unused variable eslint disables from datasetExecution and types files
* refactor: remove enrichedDatasetRunItem function and integrate its logic directly into IngestionService
* chore: remove TODO comment regarding dataset run item authorization
* refactor: replace Date constructor with parseClickhouseUTCDateTimeFormat for date parsing in dataset run item conversion
* chore: remove deprecated flag for runitemsByRunIdOrItemId method
* refactor: remove getDatasetRunItemsByRunId function to streamline dataset run item retrieval
* refactor: add back run properties in dataset runs mapping
* chore: revert changes to delete-dataset-run API
* refactor: remove validateDatasetItemAndFetch function and replace its usage with direct Prisma query in IngestionService
* refactor: delete validateCreateDatasetRunItemBodyAndFetch function and replace its logic with direct Prisma queries in dataset-run-items API
* refactor: move createOrFetchDatasetRun function to a new dataset-runs API file and maintain unique constraint handling
* refactor: remove validateDatasetRunAndFetch function and replace its usage with direct Prisma queries in dataset-run-items and IngestionService
* chore: nits
* refactor: streamline dataset run item creation by consolidating validation and execution logic
* chore: fix imports
* fix: types
* fix: simplify ingestion schema
* refactor: enhance ingestion schema creation to support public and internal environments
* chore: extend immutable keys list DRI
* chore: use same id for clickhouse and postgres
* chore: remove background migration trigger
* chore: move dataset run items migration into readme
* chore: remove creation of DRI in seeder
* chore: lint
* feat(tracing): pretty display json as collapsible table
* show empty list and unwrap single item containing objects
* enable toggle for code or pretty view
* clean up
* fix type casting
* some more fixes
* expand row with click anywhere
* fix alignment
* remove dead code
* cleanup
* make it more clean
* don't unwrap initial items
* collapse expand all
* fixing collapse button
* don't render for chatml
* better markdown check
* reduce col width
* make table borderless
* display null / empty string for empty value
* smaller text
* make table more compact
* make preview items grey & italic
* linebreak path column
* table headers inherit color
* cleanup
* external collapsed state; also move button into code view
* remove code view switch
* show empty dicts also as empty
* always show objects as tables
* extract markdown into helper function
* review fixes
* update
* Update turbo.json to use @langfuse/shared#dev instead of #build
Co-authored-by: max <max@langfuse.com>
* Add incremental build script and update turbo.json dev dependencies
Co-authored-by: max <max@langfuse.com>
* Remove build:dev script and update turbo.json dependencies
Co-authored-by: max <max@langfuse.com>
* push
---------
Co-authored-by: Cursor Agent <cursoragent@cursor.com>
description:Please describe the question you have as clear and concise as possible.
validations:
required:true
- type:dropdown
id:hosting
attributes:
label:Are you using Langfuse Cloud or self-host Langfuse?
options:
- Langfuse Cloud
- Self-hosted Langfuse
validations:
required:true
- type:checkboxes
attributes:
label:I checked if there is already an [issue](https://github.com/langfuse/langfuse/issues) or [discussion](https://github.com/orgs/langfuse/discussions) for my question and asked the [Langfuse AI](https://langfuse.com/docs/ask-ai) for help.
description:Create a bug report to help us improve
title:"bug: "
description:Report a bug to help us improve
title:"bug: <short description>"
labels:["🐞❔ unconfirmed bug"]
body:
- type:textarea
attributes:
label:Describe the bug
description:A clear and concise description of the bug, as well as what you expected to happen when encountering it.
description:A clear and concise description of the bug, and what you expected to happen when you encountered it.
validations:
required:true
- type:textarea
attributes:
label:To reproduce
description:Describe how to reproduce your bug. Please provide detailed steps, code snippets, reproduction repos etc.
label:Steps to reproduce
description:Describe how to reproduce the bug. Please provide detailed steps, code snippets, a minimal reproduction repository, etc.
validations:
required:true
- type:dropdown
attributes:
label:Langfuse Cloud or self-hosted?
options:
- "Langfuse Cloud"
- "Self-hosted"
validations:
required:true
- type:input
attributes:
label:If self-hosted, what version are you running?
description:We may ask you to upgrade to the latest version, as many issues are continuously being fixed.
- type:textarea
attributes:
label:SDK and container versions
description:If you're experiencing an issue with an integration or SDK, please ensure you're using the latest version. If you're self-hosting Langfuse, check that you're running the most recent version. If updating isn't an option, please provide the specific versions you're currently using.
label:SDK and integration versions
description:If you're experiencing an issue with an integration or SDK, please share all package versions you're using. If you are not on the latest version, try upgrading, as this will often resolve the issue.
- type:textarea
attributes:
label:Additional information
description:Add any other information related to the bug here, screenshots if applicable.
description:Add any other information related to the bug here, including screenshots if applicable.
- type:dropdown
id:contribute
attributes:
label:Are you interested to contribute a fix for this bug?
description:If this is a confirmed bug, the maintainers are happy to support with guidance and review.
label:Are you interested in contributing a fix for this bug?
description:If this is a confirmed bug, the maintainers are happy to provide guidance and review.
# Without this patch, the JS SDK will not build due to
# "Error: packages/core build: src/api/core/auth/index.ts(1,10): error TS1205: Re-exporting a type when 'isolatedModules' is enabled requires using 'export type'."
if [ -f "packages/core/src/api/core/auth/index.ts" ]; then
if grep -q '^export { AuthProvider } from "./AuthProvider.js";$' packages/core/src/api/core/auth/index.ts; then
sed -i '1s/^export { AuthProvider }/export { type AuthProvider }/' packages/core/src/api/core/auth/index.ts
fi
fi
# Install dependencies and format
npm install -g pnpm
pnpm install
pnpm format
# Check for changes and show diff for debugging
if git diff --quiet; then
echo "No changes detected in TypeScript SDK"
exit 0
fi
# Close existing api-spec-bot PRs
gh pr list --author langfuse-bot --state open --json number --jq '.[].number' | xargs -I {} gh pr close {}
# Get the GitHub username of the original commit author
cd ../langfuse
ORIGINAL_AUTHOR=$(gh api repos/langfuse/langfuse/commits/${GITHUB_SHA} --jq '.author.login')
cd ../langfuse-js
# Create new branch and push changes
BRANCH_NAME="api-spec-bot-${GITHUB_SHA::7}"
git checkout -b "$BRANCH_NAME"
git add .
git commit -m "feat(api): update API spec from langfuse/langfuse ${GITHUB_SHA::7}" --no-verify
git push origin "$BRANCH_NAME"
# Create PR with original author as reviewer
gh pr create --title "feat(api): update API spec from langfuse/langfuse ${GITHUB_SHA::7}" --body "" --reviewer "$ORIGINAL_AUTHOR"
# Snyk cannot upload results in merge group. Hence, we only run on PRs and when pushingon the main branch https://github.com/github/codeql-action/issues/1572
@@ -108,15 +108,19 @@ We built a monorepo using [pnpm](https://pnpm.io/motivation) and [turbo](https:/
Requirements
- Node.js 20 as specified in the [.nvmrc](.nvmrc)
- Node.js 24 as specified in the [.nvmrc](.nvmrc)
- Pnpm v.9.5.0
- Docker to run the database locally
- Clickhouse client
**Note:** You can also simply run Langfuse in a **GitHub Codespace** via the provided devcontainer. To do this, click on the green "Code" button in the top right corner of the repository and select "Open with Codespaces".
**Steps**
1. Install [golang-migrate](https://github.com/golang-migrate/migrate/tree/master/cmd/migrate#migrate-cli) as CLI
1. Install development dependencies:
- [golang-migrate](https://github.com/golang-migrate/migrate/tree/master/cmd/migrate#migrate-cli) as CLI
- [clickhouse binary](https://clickhouse.com/docs/install) on macOS with brew: `brew install --cask clickhouse`
2. Fork the repository and clone it locally
```bash
@@ -137,7 +141,7 @@ Requirements
cp .env.dev.example .env
```
4. Run the entire infrastructure in dev mode. **Note**: if you have an existing database, this command wipes it.
5. Run the entire infrastructure in dev mode. **Note**: if you have an existing database, this command wipes it. Also, this will fail on the very first run. Please run it again.
```bash
pnpm run dx # first run only (resets db, docker containers, etc...)
@@ -146,13 +150,11 @@ Requirements
You will be asked whether you want to reset Postgres and ClickHouse. Confirm both with 'Y' and press enter.
5. Open the web app in your browser to start using Langfuse:
6. Open the web app in your browser to start using Langfuse:
- [Sign up page, http://localhost:3000](http://localhost:3000)
| [LlamaIndex](https://langfuse.com/docs/integrations/llama-index/get-started) | Python | LlamaIndex 콜백 시스템을 통한 자동 계측을 지원합니다. |
| [Haystack](https://langfuse.com/docs/integrations/haystack) | Python | Haystack 콘텐츠 추적 시스템을 통한 자동 계측을 지원합니다. |
| [LiteLLM](https://langfuse.com/docs/integrations/litellm) | Python, JS/TS (proxy only) | GPT의 드롭인 대체품으로 어떤 LLM도 사용할 수 있습니다. Azure, OpenAI, Cohere, Anthropic, Ollama, VLLM, Sagemaker, HuggingFace, Replicate 등 100개 이상의 LLM 지원. |
| [Vercel AI SDK](https://langfuse.com/docs/integrations/vercel-ai-sdk) | JS/TS | React, Next.js, Vue, Svelte, Node.js와 함께 AI 기반 애플리케이션 구축을 돕는 TypeScript 툴킷입니다. |
| [API](https://langfuse.com/docs/api) | | 공개 API를 직접 호출합니다. OpenAPI 명세가 제공됩니다. |
| [LlamaIndex](https://langfuse.com/docs/integrations/llama-index/get-started) | Python | LlamaIndex 콜백 시스템을 통한 자동 계측을 지원합니다. |
| [Haystack](https://langfuse.com/docs/integrations/haystack) | Python | Haystack 콘텐츠 추적 시스템을 통한 자동 계측을 지원합니다. |
| [LiteLLM](https://langfuse.com/docs/integrations/litellm) | Python, JS/TS (proxy only) | GPT의 드롭인 대체품으로 어떤 LLM도 사용할 수 있습니다. Azure, OpenAI, Cohere, Anthropic, Ollama, VLLM, Sagemaker, HuggingFace, Replicate 등 100개 이상의 LLM 지원. |
| [Vercel AI SDK](https://langfuse.com/docs/integrations/vercel-ai-sdk) | JS/TS | React, Next.js, Vue, Svelte, Node.js와 함께 AI 기반 애플리케이션 구축을 돕는 TypeScript 툴킷입니다. |
| [API](https://langfuse.com/docs/api) | | 공개 API를 직접 호출합니다. OpenAPI 명세가 제공됩니다. |
| [Ollama](https://langfuse.com/docs/integrations/ollama) | 모델 (로컬) | 자신의 컴퓨터에서 오픈 소스 LLM을 손쉽게 실행할 수 있습니다. |
| [Amazon Bedrock](https://langfuse.com/docs/integrations/amazon-bedrock) | 모델 | AWS에서 기본 및 파인튜닝된 모델을 실행합니다. |
| [Google VertexAI and Gemini](https://langfuse.com/docs/integrations/google-vertex-ai) | 모델 | Google에서 기본 및 파인튜닝된 모델을 실행합니다. |
| [AutoGen](https://langfuse.com/docs/integrations/autogen) | 에이전트 프레임워크 | 분산 에이전트 구축을 위한 오픈 소스 LLM 플랫폼입니다. |
| [Flowise](https://langfuse.com/docs/integrations/flowise) | 채팅/에이전트 UI | 맞춤형 LLM 플로우를 위한 JS/TS 코드 없는(no-code) 빌더입니다. |
| [Langflow](https://langfuse.com/docs/integrations/langflow) | 채팅/에이전트 UI | react-flow를 활용하여 실험 및 프로토타이핑을 손쉽게 할 수 있도록 디자인된 LangChain용 Python 기반 UI입니다. |
| [Dify](https://langfuse.com/docs/integrations/dify) | 채팅/에이전트 UI | 코드 없는 빌더와 함께 제공되는 오픈 소스 LLM 애플리케이션 개발 플랫폼입니다. |
| [OpenWebUI](https://langfuse.com/docs/integrations/openwebui) | 채팅/에이전트 UI | 셀프 호스팅 및 로컬 모델 등 다양한 LLM 실행기를 지원하는 셀프 호스팅 LLM 채팅 웹 UI입니다. |
| [Promptfoo](https://langfuse.com/docs/integrations/promptfoo) | 도구 | 오픈 소스 LLM 테스트 플랫폼입니다. |
| [LobeChat](https://langfuse.com/docs/integrations/lobechat) | 채팅/에이전트 UI | 오픈 소스 챗봇 플랫폼입니다. |
| [Vapi](https://langfuse.com/docs/integrations/vapi) | 플랫폼 | 오픈 소스 음성 AI 플랫폼입니다. |
| [Inferable](https://langfuse.com/docs/integrations/other/inferable) | 에이전트 | 분산 에이전트 구축을 위한 오픈 소스 LLM 플랫폼입니다. |
| [Gradio](https://langfuse.com/docs/integrations/other/gradio) | 채팅/에이전트 UI | 채팅 UI와 같은 웹 인터페이스 구축을 위한 오픈 소스 Python 라이브러리입니다. |
| [Goose](https://langfuse.com/docs/integrations/goose) | 에이전트 | 분산 에이전트 구축을 위한 오픈 소스 LLM 플랫폼입니다. |
| [smolagents](https://langfuse.com/docs/integrations/smolagents) | 에이전트 | 오픈 소스 AI 에이전트 프레임워크입니다. |
| [CrewAI](https://langfuse.com/docs/integrations/crewai) | 에이전트 | 에이전트 간 협업 및 도구 사용을 위한 다중 에이전트 프레임워크입니다. |
| [Ollama](https://langfuse.com/docs/integrations/ollama) | 모델 (로컬) | 자신의 컴퓨터에서 오픈 소스 LLM을 손쉽게 실행할 수 있습니다. |
| [Amazon Bedrock](https://langfuse.com/docs/integrations/amazon-bedrock) | 모델 | AWS에서 기본 및 파인튜닝된 모델을 실행합니다. |
| [Google VertexAI and Gemini](https://langfuse.com/docs/integrations/google-vertex-ai) | 모델 | Google에서 기본 및 파인튜닝된 모델을 실행합니다. |
| [AutoGen](https://langfuse.com/docs/integrations/autogen) | 에이전트 프레임워크 | 분산 에이전트 구축을 위한 오픈 소스 LLM 플랫폼입니다. |
| [Flowise](https://langfuse.com/docs/integrations/flowise) | 채팅/에이전트 UI | 맞춤형 LLM 플로우를 위한 JS/TS 코드 없는(no-code) 빌더입니다. |
| [Langflow](https://langfuse.com/docs/integrations/langflow) | 채팅/에이전트 UI | react-flow를 활용하여 실험 및 프로토타이핑을 손쉽게 할 수 있도록 디자인된 LangChain용 Python 기반 UI입니다. |
| [Dify](https://langfuse.com/docs/integrations/dify) | 채팅/에이전트 UI | 코드 없는 빌더와 함께 제공되는 오픈 소스 LLM 애플리케이션 개발 플랫폼입니다. |
| [OpenWebUI](https://langfuse.com/docs/integrations/openwebui) | 채팅/에이전트 UI | 셀프 호스팅 및 로컬 모델 등 다양한 LLM 실행기를 지원하는 셀프 호스팅 LLM 채팅 웹 UI입니다. |
| [Promptfoo](https://langfuse.com/docs/integrations/promptfoo) | 도구 | 오픈 소스 LLM 테스트 플랫폼입니다. |
| [LobeChat](https://langfuse.com/docs/integrations/lobechat) | 채팅/에이전트 UI | 오픈 소스 챗봇 플랫폼입니다. |
| [Vapi](https://langfuse.com/docs/integrations/vapi) | 플랫폼 | 오픈 소스 음성 AI 플랫폼입니다. |
| [Inferable](https://langfuse.com/docs/integrations/other/inferable) | 에이전트 | 분산 에이전트 구축을 위한 오픈 소스 LLM 플랫폼입니다. |
| [Gradio](https://langfuse.com/docs/integrations/other/gradio) | 채팅/에이전트 UI | 채팅 UI와 같은 웹 인터페이스 구축을 위한 오픈 소스 Python 라이브러리입니다. |
| [Goose](https://langfuse.com/docs/integrations/goose) | 에이전트 | 분산 에이전트 구축을 위한 오픈 소스 LLM 플랫폼입니다. |
| [smolagents](https://langfuse.com/docs/integrations/smolagents) | 에이전트 | 오픈 소스 AI 에이전트 프레임워크입니다. |
| [CrewAI](https://langfuse.com/docs/integrations/crewai) | 에이전트 | 에이전트 간 협업 및 도구 사용을 위한 다중 에이전트 프레임워크입니다. |
## 🚀 빠른 시작
@@ -185,7 +185,7 @@ Langfuse 팀이 관리하는 배포 방식으로, 후한 무료 플랜(취미
### 2️⃣ 첫 번째 LLM 호출 기록하기
[`@observe()` 데코레이터](https://langfuse.com/docs/sdk/python/decorators)를 사용하면 Python LLM 애플리케이션의 추적이 매우 간편해집니다. 이 빠른 시작 예제에서는 Langfuse [OpenAI 통합](https://langfuse.com/docs/integrations/openai)을 사용하여 모든 모델 파라미터를 자동으로 캡처합니다.
[`@observe()` 데코레이터](https://langfuse.com/docs/sdk/python/decorators)를 사용하면 Python LLM 애플리케이션의 추적이 매우 간편해집니다. 이 빠른 시작 예제에서는 Langfuse [OpenAI 통합](https://langfuse.com/integrations/model-providers/openai-py)을 사용하여 모든 모델 파라미터를 자동으로 캡처합니다.
> [!TIP]
> OpenAI를 사용하지 않으시다면, 다른 모델 및 프레임워크의 로그 기록 방법은 [문서](https://langfuse.com/docs/get-started#log-your-first-llm-call-to-langfuse)를 참조하세요.
@@ -276,8 +276,8 @@ _[Langfuse의 공개 예제 trace](https://cloud.langfuse.com/project/cloramnkj0
별(star) 수를 기준으로 순위가 매겨진 Langfuse를 사용하는 상위 오픈 소스 Python 프로젝트들 ([출처](https://github.com/langfuse/langfuse-docs/blob/main/components-mdx/dependents)):
- [LLM Application Observability](https://langfuse.com/docs/tracing): Instrument your app and start ingesting traces to Langfuse, thereby tracking LLM calls and other relevant logic in your app such as retrieval, embedding, or agent actions. Inspect and debug complex logs and user sessions. Try the interactive [demo](https://langfuse.com/docs/demo) to see this in action.
- [Prompt Management](https://langfuse.com/docs/prompts/get-started) helps you centrally manage, version control, and collaboratively iterate on your prompts. Thanks to strong caching on server and client side, you can iterate on prompts without adding latency to your application.
- [Prompt Management](https://langfuse.com/docs/prompt-management/get-started) helps you centrally manage, version control, and collaboratively iterate on your prompts. Thanks to strong caching on server and client side, you can iterate on prompts without adding latency to your application.
- [Evaluations](https://langfuse.com/docs/scores/overview) are key to the LLM application development workflow, and Langfuse adapts to your needs. It supports LLM-as-a-judge, user feedback collection, manual labeling, and custom evaluation pipelines via APIs/SDKs.
- [Evaluations](https://langfuse.com/docs/evaluation/overview) are key to the LLM application development workflow, and Langfuse adapts to your needs. It supports LLM-as-a-judge, user feedback collection, manual labeling, and custom evaluation pipelines via APIs/SDKs.
- [Datasets](https://langfuse.com/docs/datasets/overview) enable test sets and benchmarks for evaluating your LLM application. They support continuous improvement, pre-deployment testing, structured experiments, flexible evaluation, and seamless integration with frameworks like LangChain and LlamaIndex.
- [Datasets](https://langfuse.com/docs/evaluation/dataset-runs/datasets) enable test sets and benchmarks for evaluating your LLM application. They support continuous improvement, pre-deployment testing, structured experiments, flexible evaluation, and seamless integration with frameworks like LangChain and LlamaIndex.
- [LLM Playground](https://langfuse.com/docs/playground) is a tool for testing and iterating on your prompts and model configurations, shortening the feedback loop and accelerating development. When you see a bad result in tracing, you can directly jump to the playground to iterate on it.
@@ -92,7 +92,7 @@ Langfuse is an **open source LLM engineering** platform. It helps teams collabor
@@ -118,6 +118,7 @@ Run Langfuse on your own infrastructure:
# Run the langfuse docker compose
docker compose up
```
- [VM](https://langfuse.com/self-hosting/docker-compose): Run Langfuse on a single Virtual Machine using Docker Compose.
- [Kubernetes (Helm)](https://langfuse.com/self-hosting/kubernetes-helm): Run Langfuse on a Kubernetes cluster using Helm. This is the preferred production deployment.
@@ -176,7 +177,7 @@ Instrument your app and start ingesting traces to Langfuse, thereby tracking LLM
### 2️⃣ Log your first LLM call
The [`@observe()` decorator](https://langfuse.com/docs/sdk/python/decorators) makes it easy to trace any Python LLM application. In this quickstart we also use the Langfuse [OpenAI integration](https://langfuse.com/docs/integrations/openai) to automatically capture all model parameters.
The [`@observe()` decorator](https://langfuse.com/docs/sdk/python/decorators) makes it easy to trace any Python LLM application. In this quickstart we also use the Langfuse [OpenAI integration](https://langfuse.com/integrations/model-providers/openai-py) to automatically capture all model parameters.
> [!TIP]
> Not using OpenAI? Visit [our documentation](https://langfuse.com/docs/get-started#log-your-first-llm-call-to-langfuse) to learn how to log other models and frameworks.
@@ -214,7 +215,7 @@ main()
See your language model calls and other application logic in Langfuse.

<img width="1787" height="674" alt="Example trace in Langfuse" src="https://github.com/user-attachments/assets/f796eb78-dfb5-4570-b236-bdb4b67d4d55" />
_[Public example trace in Langfuse](https://cloud.langfuse.com/project/cloramnkj0002jz088vzn1ja4/traces/2cec01e3-3dc2-472f-afcf-3b968cf0c1f4?timestamp=2025-02-10T14%3A27%3A30.275Z&observation=cb5ff844-07ef-41e6-b8e2-6c64344bc13b)_
@@ -267,52 +268,105 @@ This repository is MIT licensed, except for the `ee` folders. See [LICENSE](LICE
Top open-source Python projects that use Langfuse, ranked by stars ([Source](https://github.com/langfuse/langfuse-docs/blob/main/components-mdx/dependents)):
- ClickHouse migrations in the `packages/shared/clickhouse/migrations/clustered` directory should include `ON CLUSTER default` and should use `Replicated` merge tree table types.
- E.g. `ReplacingMergeTree` is likely an error while `ReplicatedReplacingMergeTree` would be correct in most cases.
- ClickHouse migrations in the `packages/shared/clickhouse/migrations/unclustered` directory must not include `ON CLUSTER` statements and must not use `Replicated` merge tree table types.
- Migrations in `packages/shared/clickhouse/migrations/clustered` should match their counterparts in `packages/shared/clickhouse/migrations/unclustered` aside from the restrictions listed above.
- When adding new indexes on ClickHouse, ensure that there is a corresponding `MATERIALIZE INDEX` statement in the same migration. The materialization can use `SETTINGS mutations_sync = 2` if they operate on smaller tables, but may timeout otherwise.
### Postgres
- Most `schema.prisma` changes should produce a change in `packages/shared/prisma/migrations`.
### Environment Variables
- Environment variables should be imported from the `env.mjs/ts` file of the respective package and not from `process.env.*` to ensure validation and typing.
## Redis Invocations
- Highlight usage of `redis.call` invocations. Those may have suboptimal redis cluster routing and will raise errors. Instead, use the native call patterns.
Example: `await redis?.call("SET", key, "1", "NX", "EX", TTLSeconds);` should use `await redis?.set(key, "1", "EX", TTLSeconds, "NX");` instead.
## Langfuse Cloud
- When attempting to confirm if the current environment is Langfuse Cloud in the frontend, use the `useLangfuseCloudRegion` hook and never environment variables directly.
docs:Get all blob storage integrations for the organization (requires organization-scoped API key)
method:GET
path:""
response:BlobStorageIntegrationsResponse
upsertBlobStorageIntegration:
docs:Create or update a blob storage integration for a specific project (requires organization-scoped API key). The configuration is validated by performing a test upload to the bucket.
method:PUT
path:""
request:CreateBlobStorageIntegrationRequest
response:BlobStorageIntegrationResponse
deleteBlobStorageIntegration:
docs:Delete a blob storage integration by ID (requires organization-scoped API key)
method:DELETE
path:"/{id}"
path-parameters:
id:string
response:BlobStorageIntegrationDeletionResponse
types:
BlobStorageIntegrationType:
enum:
- S3
- S3_COMPATIBLE
- AZURE_BLOB_STORAGE
BlobStorageIntegrationFileType:
enum:
- JSON
- CSV
- JSONL
BlobStorageExportMode:
enum:
- FULL_HISTORY
- FROM_TODAY
- FROM_CUSTOM_DATE
BlobStorageExportFrequency:
enum:
- hourly
- daily
- weekly
CreateBlobStorageIntegrationRequest:
properties:
projectId:
type:string
docs:ID of the project in which to configure the blob storage integration
type:BlobStorageIntegrationType
bucketName:
type:string
docs:Name of the storage bucket
endpoint:
type:optional<string>
docs:Custom endpoint URL (required for S3_COMPATIBLE type)
region:
type:string
docs:Storage region
accessKeyId:
type:optional<string>
docs:Access key ID for authentication
secretAccessKey:
type:optional<string>
docs:Secret access key for authentication (will be encrypted when stored)
prefix:
type:optional<string>
docs:Path prefix for exported files (must end with forward slash if provided)
exportFrequency:BlobStorageExportFrequency
enabled:
type:boolean
docs:Whether the integration is active
forcePathStyle:
type:boolean
docs:Use path-style URLs for S3 requests
fileType:BlobStorageIntegrationFileType
exportMode:BlobStorageExportMode
exportStartDate:
type:optional<datetime>
docs:Custom start date for exports (required when exportMode is FROM_CUSTOM_DATE)
If you want to use tracing via the API, such as to build your own Langfuse client implementation, this is the only API route you need to implement.
**Legacy endpoint for batch ingestion for Langfuse Observability.**
-> Please use the OpenTelemetry endpoint (`/api/public/otel`). Learn more: https://langfuse.com/integrations/native/opentelemetry
Within each batch, there can be multiple events.
Each event has a type, an id, a timestamp, metadata and a body.
@@ -19,7 +20,7 @@ service:
I.e. if you want to update a trace, you'd use the same body id, but separate event IDs.
Notes:
- Introduction to data model: https://langfuse.com/docs/tracing-data-model
- Introduction to data model: https://langfuse.com/docs/observability/data-model
- Batch sizes are limited to 3.5 MB in total. You need to adjust the number of events per batch accordingly.
- The API does not return a 4xx status code for input errors. Instead, it responds with a 207 status code, which includes a list of the encountered errors.
docs:The unique langfuse identifier of a score config
response:commons.ScoreConfig
update:
docs:Update a score config
method:PATCH
path:/score-configs/{configId}
path-parameters:
configId:
type:string
docs:The unique langfuse identifier of a score config
request:UpdateScoreConfigRequest
response:commons.ScoreConfig
types:
ScoreConfigs:
properties:
@@ -56,3 +68,23 @@ types:
description:
type:optional<string>
docs:Description is shown across the Langfuse UI and can be used to e.g. explain the config categories in detail, why a numeric range was set, or provide additional context on config name or usage
UpdateScoreConfigRequest:
properties:
isArchived:
type:optional<boolean>
docs:The status of the score config showing if it is archived or not
name:
type:optional<string>
docs:The name of the score config
categories:
type:optional<list<commons.ConfigCategory>>
docs:Configure custom categories for categorical scores. Pass a list of objects with `label` and `value` properties. Categories are autogenerated for boolean configs and cannot be passed
minValue:
type:optional<double>
docs:Configure a minimum value for numerical scores. If not set, the minimum value defaults to -∞
maxValue:
type:optional<double>
docs:Configure a maximum value for numerical scores. If not set, the maximum value defaults to +∞
description:
type:optional<string>
docs:Description is shown across the Langfuse UI and can be used to e.g. explain the config categories in detail, why a numeric range was set, or provide additional context on config name or usage
docs:Optional filter for traces where the environment is one of the provided values.
fields:
type:optional<string>
docs:"Comma-separated list of fields to include in the response. Available field groups are 'core' (always included), 'io' (input, output, metadata), 'scores', 'observations', 'metrics'. If not provided, all fields are included. Example: 'core,scores,metrics'"
docs:"Comma-separated list of fields to include in the response. Available field groups: 'core' (always included), 'io' (input, output, metadata), 'scores', 'observations', 'metrics'. If not specified, all fields are returned. Example: 'core,scores,metrics'. Note: Excluded 'observations' or 'scores' fields return empty arrays; excluded 'metrics' returns -1 for 'totalCost' and 'latency'."
filter:
type:optional<string>
docs:|
JSON string containing an array of filter conditions. When provided, this takes precedence over legacy filter parameters (userId, name, sessionId, tags, version, release, environment, fromTimestamp, toTimestamp).
Each filter condition has the following structure:
-- This migration adds more than one value to an enum.
-- With PostgreSQL versions 11 and earlier, this is not possible
-- in a single migration. This can be worked around by creating
-- multiple migrations, each migration adding only one value to
-- the enum.
ALTERTYPE"ObservationType"ADDVALUE'AGENT';
ALTERTYPE"ObservationType"ADDVALUE'TOOL';
ALTERTYPE"ObservationType"ADDVALUE'CHAIN';
ALTERTYPE"ObservationType"ADDVALUE'RETRIEVER';
ALTERTYPE"ObservationType"ADDVALUE'EVALUATOR';
ALTERTYPE"ObservationType"ADDVALUE'EMBEDDING';
ALTERTYPE"ObservationType"ADDVALUE'GUARDRAIL';
Some files were not shown because too many files have changed in this diff
Show More
Reference in New Issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.