* 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
* fix(NewDatasetItemForm): add JSON formatting utility for input, output, and metadata fields
* perf(NewDatasetItemFromExistingObject): conditionally render NewDatasetItemForm based on form state
* fix(NewDatasetItemForm): update JSON value check to handle undefined case
* fix(TracesTable): stabilize control column definition
- Ensured conditional rendering of the bookmarked column remains intact while simplifying the structure.
* refactor(TracesTable): enhance column visibility and order identifiers for control states
- Updated dialog header to use a title component and improved button layout for clarity.
- Adjusted positioning of the close button for better alignment.
- Enhanced header and footer with rounded corners for a more polished look.
* fixup: limit render duration of traces table
* fixup: reduce render cycles through data flows and memoization
* refactor: enhance performance and structure of table components
- Removed unnecessary console logs in `data-table.tsx`.
- Refactored `TablePeekView` to use a more structured props type and memoization for improved performance.
- Updated `usePeekData` to reduce stale time from 5 minutes to 1 minute.
- Replaced `IOTableCell` with `MemoizedIOTableCell` in various components to optimize rendering.
- Adjusted `peekView` configurations in `observations.tsx` and `traces.tsx` for consistency and clarity.
* chore: eslint
* chore: move features
* chore: move features
* chore: move features
* chore: move features
* chore: move features
* chore: move features
* chore: move features
* chore: move features
* chore: move features
* chore: move features
* chore: move features
* chore: move features
* chore: move features
* chore: move features
* chore: move features
* changes to pro plan
* chore: move features
* truncate title and description to prevent wraps
* remove unnecessary padding from charts
* improve bignumber chart
* add min h/w
* mobile resizing
* fix
2025-05-29 15:58:38 +00:00
Max DeichmannGitHubellipsis-dev[bot] <65095814+ellipsis-dev[bot]@users.noreply.github.com>
* perf: add exact timestamp match for eval batch actions
* perf: add exact timestamp match for eval batch actions
* perf: add exact timestamp match for eval batch actions
- 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.
# 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 20 (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`
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
4. 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.
@@ -134,6 +156,12 @@ Requirements
- Username: `demo@langfuse.com`
- Password: `password`
To get comprehensive example data, you can use the `seed` command:
```sh
pnpm run db:seed:examples
```
## Monorepo quickstart
- Available packages and their dependencies
@@ -183,23 +211,65 @@ 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-async`
- `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"
```
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
@@ -327,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.
| [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입니다. |
@@ -201,7 +202,7 @@ LANGFUSE_HOST="https://cloud.langfuse.com" # 🇪🇺 EU region
```
```python:main.py
from langfuse.decorators import observe
from langfuse import observe
from langfuse.openai import openai # OpenAI integration
<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/>
@@ -93,7 +96,7 @@ Langfuse is an **open source LLM engineering** platform. It helps teams collabor
### Langfuse Cloud
Managed deployment by the Langfuse team, generous free-tier (hobby plan), no credit card required.
Managed deployment by the Langfuse team, generous free-tier, no credit card required.
@@ -115,12 +118,11 @@ Run Langfuse on your own infrastructure:
# Run the langfuse docker compose
docker compose up
```
- [Kubernetes (Helm)](https://langfuse.com/self-hosting/kubernetes-helm): Run Langfuse on a Kubernetes cluster using Helm. This is the preferred production deployment.
- [VM](https://langfuse.com/self-hosting/docker-compose): Run Langfuse on a single Virtual Machine using Docker Compose.
- Planned: Cloud-specific deployment guides, please upvote and comment on the following threads: [AWS](https://github.com/orgs/langfuse/discussions/4645), [Google Cloud](https://github.com/orgs/langfuse/discussions/4646), [Azure](https://github.com/orgs/langfuse/discussions/4647).
- [Kubernetes (Helm)](https://langfuse.com/self-hosting/kubernetes-helm): Run Langfuse on a Kubernetes cluster using Helm. This is the preferred production deployment.
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'"
"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 && 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":"turbo run dev --filter=web -- --turbo",
File diff suppressed because it is too large
Load Diff
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.