* 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>
* perf: enable API Key and Prompt caching in redis by default
* chore: update sync prompt test
* chore: disable prompt caching for sync web tests
* chore: enable prompt caching in sync tests
* chore: disable cachking for v1 pipeline
* chore Use cacheEnabled as pure test overwrite
* chore; undefined check
* chore: log body
* chore: patch promptCache test
* chore: fmt
* remove console log
* chore(experiments): enhance error handling in LLM call and implement retry logic for experiment creation jobs
- Added try-catch block in callLLM function to handle specific API errors and return appropriate ApiError responses.
- Implemented retry logic for experiment creation jobs in experimentQueue, allowing retries for rate-limited and server errors, with a delay mechanism based on job age.
* chore: push
* refactor: introduce delay utility for job processing
* chore: abstract standardized error handling for LLM operations
* refactor: reorganize utilities and enhance error handling for job processing
* chore: push
* chore: typing
* chore: unify error message
* fix(retry-handler): change executeTakeFirst to executeTakeFirstOrThrow for better error handling
* chore(prompt-experiments): set langfuse-native environment
* refactor: no longer export ingestionEvent schema directly
* chore: rm line number
* chore(ingestion): refactor processEventBatch to accept options object
* chore(ingestion): refactor ingestion schemas for public and internal environments
- Introduced separate schemas for public and internal environments.
- Updated environment name validation logic and error messages.
- Refactored event schemas to utilize the new schema structure.
- Deprecated direct export of `ingestionEvent` schema in favor of factory method for better environment handling.
* chore: push
* chore: type environment schema as string
* chore: push
* chore: fix import statements
* chore: update langfuse-langchain to version 3.38.3
* chore: prettier
* chore: revert prettier
* add prettier command
* add pre-commit hook
* sync prettier config with .vscode config
* add line
* fix husky
* update for less changes
* upgrade to prettier 3.4 for bug fixes
* ignore no-undef in TS (also worker!)
* changes to prettier
* adhere to style
* make prettier 3.4 default for bug fix
* add prettier ignore
* reset to standard
* update to 3.6.2
---------
Co-authored-by: Max Deichmann <m.deichmann@tum.de>
* chore(dx): unit tests run against their own db
* fix clickhouse
* clean up a bit
* close
* update only use different postgres
* update with command
* remove CH
* fix: create virtual timestamp column in AMT query to support all filters
* chore: add test logging
* chore: skip database prune for async tests
* chore: cleanup
* chore: drop console logs
* perf: start to experimentally shift reads to new aggregatingmergetrees
* chore: linting
* chore: more linting
* chore: create checklist for trace table view migrations
* feat: shift by id queries onto new AMTs
* chore: cover traces for public api
* chore: add notes for maxMap
* chore: incorporate feedback into query declarations
* chore: cleanup queries
* chore: adjust reads to new layout
* chore: update ingestion pipeline to make use of nullable fields
* chore: add sampling
* chore: update sampling decision attribute
* chore: fix limit for getTracesByIds
* chore: spacing
* chore: linting
* Disable import button during processing and show loading state
Co-authored-by: marc <marc@langfuse.com>
* prettier
---------
Co-authored-by: Cursor Agent <cursoragent@cursor.com>
* run experiments with placeholders as well
* add missing file
* fix experiements
* run outside of loop
* add tests
* fix tests
* make tests clean again
* also test that variables resovle first
* Enhance prompt search to include tags with case-insensitive matching
Co-authored-by: marc <marc@langfuse.com>
* drop md
* prettier
---------
Co-authored-by: Cursor Agent <cursoragent@cursor.com>
* fix(prisma): update JobExecution and DefaultLlmModel relations to include onUpdate and onDelete behaviors to match DB constraints
* chore(prisma): update foreign key onUpdate behavior for job_template_id in JobExecution model
* Revert "chore(prisma): update foreign key onUpdate behavior for job_template_id in JobExecution model"
This reverts commit e65c12c9c36a1f8732560e665b1d8d7422c530f0.
* Fix typos: GitHub brand name and "check out" verb phrase
Co-authored-by: marc <marc@langfuse.com>
* Checkpoint before follow-up message
* Fix GitHub brand name and typos across documentation and UI
Co-authored-by: marc <marc@langfuse.com>
* Changes from background composer bc-bdbd909e-6932-4489-b125-e66b1d0f5ebe
---------
Co-authored-by: Cursor Agent <cursoragent@cursor.com>
* no naming collisions between prompt and placeholder
* tests for variable placeholder name collision
* fix test spelling
* also show conflict in playhground
* Add environment to PostHog event tracking for traces and observations
Co-authored-by: marc <marc@langfuse.com>
* use object envs instead of trace env
* fix
---------
Co-authored-by: Cursor Agent <cursoragent@cursor.com>
* upgrade turbo
* add web dev turbo runner
* upgrade docker
* fix linter
* set env mode to loose (as in turbo v1) so we don't have to double specify env vars
* feat(nav): integrate HoverCard component for improved navigation item display
* refactor(nav): enhance HoverCard integration and sidebar styles for improved UX
* chore(sidebar): replace cookie-based state management with local storage for sidebar state persistence
* chore: push
* refactor(nav): wrap HoverCardContent in Portal for improved rendering context
* style: mark hovered item as active
* chore(CreateLLMApiKeyForm): replace Input with PasswordInput for improved UX
* chore: revert
* chore(data): add seed data and constants for datasets, prompts, and traces
- Introduced new JSON files for chat ML and nested JSON data.
- Created seed constants for datasets and prompts to streamline data generation.
- Updated seed scripts to utilize new constants and improve dataset creation logic.
- Enhanced Clickhouse preparation scripts to support new dataset structures and trace generation.
- Added utility functions for generating unique trace IDs.
This commit lays the groundwork for improved data handling and observability in the Langfuse application.
* chore(data): remove deprecated prompt files and enhance seed constants
* chore(prisma): remove unique constraint on projectId, datasetId, and input in DatasetItem model
* chore: push
* chore(seeder): introduce seeder abstraction
* chore: typos
* chore: restructure files
* chore: restructure files
* chore: fix imports
* chore: fix imports
* chore: lint
* chore: simplify
* chore: ensure eval data integrity
* chore: update metric name calculation in ClickHouse query builder
* refactor: use test-utils for clickhouse inserts
* chore: add otel conventional attributes to clickhouse db spans
* chore: use db.system instead of db.system.name
* chore: set span kind client for clickhouse queries
- We build two containers, web (./web) and worker (./worker)
- We have shared code between these two in the shared package (./packages/shared). For that package, we have different entry points [package.json](mdc:packages/shared/package.json).
## Domain layer
The most important domain objects are in [observations.ts](mdc:packages/shared/src/domain/observations.ts), [traces.ts](mdc:packages/shared/src/domain/traces.ts), [scores.ts](mdc:packages/shared/src/domain/scores.ts).
## Database schema
We use Postgres and Clickhouse.
- The postgres schema is in [schema.prisma](mdc:packages/shared/prisma/schema.prisma)
- The clickhouse schema is in [0001_traces.up.sql](mdc:packages/shared/clickhouse/migrations/clustered/0001_traces.up.sql), [0002_observations.up.sql](mdc:packages/shared/clickhouse/migrations/clustered/0002_observations.up.sql), [0003_scores.up.sql](mdc:packages/shared/clickhouse/migrations/clustered/0003_scores.up.sql)
- When writing tests, focus on decoupling each `it` or `test` block to ensure that they can run independently and concurrently. Tests must never depend on the action or outcome of previous or subsequent tests.
- When writing tests, especially in the __tests__/async directory, ensure that you avoid `pruneDatabase` calls.
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
@@ -8,6 +8,8 @@ Langfuse is an **open source LLM engineering** platform for developing, monitori
## Tests
- Codex cannot run the test suite because it depends on Docker-based infrastructure that is unavailable in this environment.
- When writing tests, focus on decoupling each `it` or `test` block to ensure that they can run independently and concurrently. Tests must never depend on the action or outcome of previous or subsequent tests.
- When writing tests, especially in the __tests__/async directory, ensure that you avoid `pruneDatabase` calls.
## Cursor Rules
- Additional folder-specific rules live in `.cursor/rules/`.
Langfuse is an open-source LLM engineering platform that helps teams collaboratively develop, monitor, evaluate, and debug AI applications.
The main feature areas are tracing, evals and prompt management. Langfuse consists of the web application (this repo), documentation, python SDK and javascript/typescript SDK.
This repo contains the web application, worker, and supporting packages but notably not the JS nor Python client SDKs.
## Repository Structure
High level structure. There are more folders (eg for hooks etc).
pnpm run dev:web # Web app only (localhost:3000) - **used in most cases!**
pnpm run dev:worker # Worker only
pnpm run dx # Full initial setup: install deps, reset DBs, resets node modules, seed data, start dev. USE SPARINGLY AS IT WIPES THE DATABASE & node_modules
```
### Database Management
database commands are to be run in the `packages/shared/` folder.
- Use `golang-migrate` CLI for database migrations
- All database operations go through Prisma ORM for PostgreSQL
- Foreign key relationships may not be enforced in schema to allow unordered ingestion
### Testing
- Jest for API tests, Playwright for E2E tests
- For backend/API changes, tests must pass before pushes
- Add tests for new API endpoints and features
- When writing tests, focus on decoupling each `it` or `test` block to ensure that they can run independently and concurrently. Tests must never depend on the action or outcome of previous or subsequent tests.
- When writing tests, especially in the __tests__/async directory, ensure that you avoid `pruneDatabase` calls.
### Code Conventions
- **Pages Router** (not App Router)
- Follow conventional commits on main branch
- Use CSS variables for theming (supports auto dark/light mode)
- TypeScript throughout
- Zod v4 for all input validation
## Environment Setup
- **Node.js**: Version 24 (specified in `.nvmrc`)
- **Package Manager**: pnpm v9.5.0
- **Database Dependencies**: Docker for local PostgreSQL, ClickHouse, Redis, MinIO
- **Environment**: Copy `.env.dev.example` to `.env`
@@ -108,7 +108,7 @@ 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
@@ -124,30 +124,42 @@ Requirements
cd langfuse
```
3. Create an env file
3. Install dependencies and set up pre-commit hooks
```bash
pnpm install
pnpm run prepare # Sets up Husky pre-commit hooks for code formatting
```
4. Create an env file
```bash
cp .env.dev.example .env
```
4. Run the entire infrastructure in dev mode
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
pnpm run dx # first run only (resets db, docker containers, etc...)
pnpm run dev # any subsequent runs
```
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)
To get comprehensive example data, you can use the `seed` command:
```sh
pnpm run db:seed:examples
```
## Monorepo quickstart
- Available packages and their dependencies
@@ -197,23 +209,67 @@ Requirements
On the main branch, we adhere to the best practices of [conventional commits](https://www.conventionalcommits.org/en/v1.0.0/). All pull requests and branches are squash-merged to maintain a clean and readable history. This approach ensures the addition of a conventional commit message when merging contributions.
## Test the public API
## Running Unit Tests
The API is tested using Jest. With the development server running, you can run the tests with:
All tests run in the CI and must pass before merging.
All tests run against a running langfuse instance and **write/delete real data from the database**.
Run all
### Test Database Setup
Per default, the tests use the local development database. Therefore, wiping your data in the process.
For proper test isolation, create a `.env.test` file in the root directory:
```bash
npm run test
cp .env.test.example .env.test
```
Run interactively in watch mode
Then, a different PostgreSQL and Redis are used for the tests.
The `.env.test` file only overrides the set values and falls back on `.env` for all undefined values.
```bash
npm run test:watch
- **PostgreSQL**: Uses separate `langfuse_test` database for isolation
- **ClickHouse**: Uses shared `default` database for now
- **Redis**: Uses database 1 instead of 0 for isolation (Redis data is not cleaned between tests)
Tests automatically create the PostgreSQL test database if it doesn't exist and clean up data between runs.
### Tests in the `web` package (public API)
We're using Jest with in the `web` package. Therefore, if you want to provide an argument to the test runner, do it directly without an intermittent `--`.
There are three types of unit tests:
- `test-sync`
- `test` (for async folder tests)
- `test-client`
To run a specific test, for example the test: `"should handle special characters in prompt names"` in `prompts.v2.servertest.ts`, run:
```sh
cd web # or with --filter=web
pnpm test-sync --testPathPattern="prompts\.v2\.servertest" --testNamePattern="should handle special characters in prompt names"
# for async folder tests:
pnpm test -- --testPathPattern="observations-api" --testNamePattern="should fetch all observations"
```
These tests are also run in CI.
To run all tests:
```sh
pnpm run test
```
Run interactively in watch mode (not recommended!)
```sh
pnpm run test:watch
```
### Tests in the `worker` package
For the `worker` package, we're using `vitest` to run unit tests.
```sh
pnpm run test --filter=worker -- FILE_YOU_WANT_TO_TEST.ts -t "test name"
```
## CI/CD
@@ -341,6 +397,20 @@ Please note that
Until the V3 release, both the JSON record must be updated **and** a migration must be created to continue supporting self-hosted users. Note that the migration must updated both the `models` as well as the `prices` table accordingly.
## Updating the OpenAPI Specs & fern SDKs
We maintain the API specifications manually to guarantee a high degree of understandability. If you made changes to the API, please update the respective `.yml` files in `fern/apis/...`.
To generate the respective `openapi.yml` files which power the online API reference & SDKs, run:
```sh
npx fern-api generate --api server # for the server API
npx fern-api generate --api client # for the client API
npx fern-api generate --api organizations # for the organizations API
```
**Note:** You need a signed in fern account to run those commands.
## License
Langfuse is MIT licensed, except for `ee/` folder. See [LICENSE](LICENSE) and [docs](https://langfuse.com/docs/open-source) for more details.
| [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에서 기본 및 파인튜닝된 모델을 실행합니다. |
| [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) | 에이전트 | 에이전트 간 협업 및 도구 사용을 위한 다중 에이전트 프레임워크입니다. |
## 🚀 빠른 시작
@@ -184,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)를 참조하세요.
@@ -275,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)):
<span>Langfuse uses <a href="https://github.com/orgs/langfuse/discussions"><strong>Github Discussions</strong></a> for Support and Feature Requests.</span>
<span>Langfuse uses <a href="https://github.com/orgs/langfuse/discussions"><strong>GitHub Discussions</strong></a> for Support and Feature Requests.</span>
<br/>
<span><b>We're hiring.</b> <a href="https://langfuse.com/careers"><strong>Join us</strong></a> in product engineering and technical go-to-market roles.</span>
<br/>
@@ -73,15 +76,15 @@ Langfuse is an **open source LLM engineering** platform. It helps teams collabor
- [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.
@@ -89,7 +92,7 @@ Langfuse is an **open source LLM engineering** platform. It helps teams collabor
@@ -115,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.
@@ -173,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.
@@ -211,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)_
@@ -264,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'."
"dx":"pnpm i && pnpm run infra:dev:prune && pnpm run infra:dev:up --pull always && pnpm --filter=shared run db:reset && pnpm --filter=shared run ch:reset && pnpm --filter=shared run db:seed:examples && pnpm run dev",
"dx-f":"pnpm i && pnpm run infra:dev:prune && pnpm run infra:dev:up --pull always && pnpm --filter=shared run db:reset -f && SKIP_CONFIRM=1 pnpm --filter=shared run ch:reset && pnpm --filter=shared run db:seed:examples && pnpm run dev",
"dx:skip-infra":"pnpm i && pnpm --filter=shared run db:reset && pnpm --filter=shared run ch:reset && pnpm --filter=shared run db:seed:examples && pnpm run dev",
"dx":"pnpm i && pnpm run infra:dev:prune && pnpm run infra:dev:up --pull always && pnpm --filter=shared run db:reset:test && pnpm --filter=shared run db:reset && pnpm --filter=shared run ch:reset && pnpm --filter=shared run db:seed:examples && pnpm run dev",
"dx-f":"pnpm i && pnpm run infra:dev:prune && pnpm run infra:dev:up --pull always && pnpm --filter=shared run db:reset:test && pnpm --filter=shared run db:reset -f && SKIP_CONFIRM=1 pnpm --filter=shared run ch:reset && pnpm --filter=shared run db:seed:examples && pnpm run dev",
"dx:skip-infra":"pnpm i && pnpm --filter=shared run db:reset:test && pnpm --filter=shared run db:reset && pnpm --filter=shared run ch:reset && pnpm --filter=shared run db:seed:examples && pnpm run dev",
"build":"turbo run build",
"start":"turbo run start",
"dev":"turbo run dev",
"dev:worker":"turbo run dev --filter=worker",
"dev:web":"turbo run dev --filter=web",
"dev:web":"turbo run dev --filter=web -- --turbo",
console.error("Error during Clickhouse preparation:",error);
}finally{
awaitprisma.$disconnect();
redis?.disconnect();
console.log("Disconnected from Clickhouse.");
}
}
main();
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.