From bd72c65efdda7ee970219e02eede938838896e17 Mon Sep 17 00:00:00 2001 From: langfuse-bot Date: Mon, 3 Nov 2025 11:35:49 +0100 Subject: [PATCH 1/3] feat(api): update API spec from langfuse/langfuse efe3532 (#687) Co-authored-by: langfuse-bot Co-authored-by: Hassieb Pakzad <68423100+hassiebp@users.noreply.github.com> --- .../client/requests/GetObservationsRequest.ts | 78 +++++++++++- .../resources/organizations/client/Client.ts | 118 ++++++++++++++++++ .../organizations/types/OrganizationApiKey.ts | 13 ++ .../types/OrganizationApiKeysResponse.ts | 9 ++ .../resources/organizations/types/index.ts | 2 + .../trace/client/requests/GetTracesRequest.ts | 86 ++++++++++++- 6 files changed, 302 insertions(+), 4 deletions(-) create mode 100644 packages/core/src/api/api/resources/organizations/types/OrganizationApiKey.ts create mode 100644 packages/core/src/api/api/resources/organizations/types/OrganizationApiKeysResponse.ts diff --git a/packages/core/src/api/api/resources/observations/client/requests/GetObservationsRequest.ts b/packages/core/src/api/api/resources/observations/client/requests/GetObservationsRequest.ts index dac4f3f9..cdfd6a65 100644 --- a/packages/core/src/api/api/resources/observations/client/requests/GetObservationsRequest.ts +++ b/packages/core/src/api/api/resources/observations/client/requests/GetObservationsRequest.ts @@ -29,13 +29,15 @@ export interface GetObservationsRequest { /** Optional filter to only include observations with a certain version. */ version?: string; /** - * JSON string containing an array of filter conditions. When provided, this takes precedence over legacy filter parameters (userId, name, sessionId, tags, version, release, environment, fromTimestamp, toTimestamp). + * JSON string containing an array of filter conditions. When provided, this takes precedence over query parameter filters (userId, name, type, level, environment, fromStartTime, ...). + * + * ## Filter Structure * Each filter condition has the following structure: * ```json * [ * { * "type": string, // Required. One of: "datetime", "string", "number", "stringOptions", "categoryOptions", "arrayOptions", "stringObject", "numberObject", "boolean", "null" - * "column": string, // Required. Column to filter on + * "column": string, // Required. Column to filter on (see available columns below) * "operator": string, // Required. Operator based on type: * // - datetime: ">", "<", ">=", "<=" * // - string: "=", "contains", "does not contain", "starts with", "ends with" @@ -52,6 +54,78 @@ export interface GetObservationsRequest { * } * ] * ``` + * + * ## Available Columns + * + * ### Core Observation Fields + * - `id` (string) - Observation ID + * - `type` (string) - Observation type (SPAN, GENERATION, EVENT) + * - `name` (string) - Observation name + * - `traceId` (string) - Associated trace ID + * - `startTime` (datetime) - Observation start time + * - `endTime` (datetime) - Observation end time + * - `environment` (string) - Environment tag + * - `level` (string) - Log level (DEBUG, DEFAULT, WARNING, ERROR) + * - `statusMessage` (string) - Status message + * - `version` (string) - Version tag + * + * ### Performance Metrics + * - `latency` (number) - Latency in seconds (calculated: end_time - start_time) + * - `timeToFirstToken` (number) - Time to first token in seconds + * - `tokensPerSecond` (number) - Output tokens per second + * + * ### Token Usage + * - `inputTokens` (number) - Number of input tokens + * - `outputTokens` (number) - Number of output tokens + * - `totalTokens` (number) - Total tokens (alias: `tokens`) + * + * ### Cost Metrics + * - `inputCost` (number) - Input cost in USD + * - `outputCost` (number) - Output cost in USD + * - `totalCost` (number) - Total cost in USD + * + * ### Model Information + * - `model` (string) - Provided model name + * - `promptName` (string) - Associated prompt name + * - `promptVersion` (number) - Associated prompt version + * + * ### Structured Data + * - `metadata` (stringObject/numberObject/categoryOptions) - Metadata key-value pairs. Use `key` parameter to filter on specific metadata keys. + * + * ### Scores (requires join with scores table) + * - `scores_avg` (number) - Average of numeric scores (alias: `scores`) + * - `score_categories` (categoryOptions) - Categorical score values + * + * ### Associated Trace Fields (requires join with traces table) + * - `userId` (string) - User ID from associated trace + * - `traceName` (string) - Name from associated trace + * - `traceEnvironment` (string) - Environment from associated trace + * - `traceTags` (arrayOptions) - Tags from associated trace + * + * ## Filter Examples + * ```json + * [ + * { + * "type": "string", + * "column": "type", + * "operator": "=", + * "value": "GENERATION" + * }, + * { + * "type": "number", + * "column": "latency", + * "operator": ">=", + * "value": 2.5 + * }, + * { + * "type": "stringObject", + * "column": "metadata", + * "key": "environment", + * "operator": "=", + * "value": "production" + * } + * ] + * ``` */ filter?: string; } diff --git a/packages/core/src/api/api/resources/organizations/client/Client.ts b/packages/core/src/api/api/resources/organizations/client/Client.ts index 17bb5b11..b0f26f04 100644 --- a/packages/core/src/api/api/resources/organizations/client/Client.ts +++ b/packages/core/src/api/api/resources/organizations/client/Client.ts @@ -929,6 +929,124 @@ export class Organizations { } } + /** + * Get all API keys for the organization associated with the API key (requires organization-scoped API key) + * + * @param {Organizations.RequestOptions} requestOptions - Request-specific configuration. + * + * @throws {@link LangfuseAPI.Error} + * @throws {@link LangfuseAPI.UnauthorizedError} + * @throws {@link LangfuseAPI.AccessDeniedError} + * @throws {@link LangfuseAPI.MethodNotAllowedError} + * @throws {@link LangfuseAPI.NotFoundError} + * + * @example + * await client.organizations.getOrganizationApiKeys() + */ + public getOrganizationApiKeys( + requestOptions?: Organizations.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise( + this.__getOrganizationApiKeys(requestOptions), + ); + } + + private async __getOrganizationApiKeys( + requestOptions?: Organizations.RequestOptions, + ): Promise> { + let _headers: core.Fetcher.Args["headers"] = mergeHeaders( + this._options?.headers, + mergeOnlyDefinedHeaders({ + Authorization: await this._getAuthorizationHeader(), + "X-Langfuse-Sdk-Name": + requestOptions?.xLangfuseSdkName ?? this._options?.xLangfuseSdkName, + "X-Langfuse-Sdk-Version": + requestOptions?.xLangfuseSdkVersion ?? + this._options?.xLangfuseSdkVersion, + "X-Langfuse-Public-Key": + requestOptions?.xLangfusePublicKey ?? + this._options?.xLangfusePublicKey, + }), + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + "/api/public/organizations/apiKeys", + ), + method: "GET", + headers: _headers, + queryParameters: requestOptions?.queryParams, + timeoutMs: + requestOptions?.timeoutInSeconds != null + ? requestOptions.timeoutInSeconds * 1000 + : 60000, + maxRetries: requestOptions?.maxRetries, + abortSignal: requestOptions?.abortSignal, + }); + if (_response.ok) { + return { + data: _response.body as LangfuseAPI.OrganizationApiKeysResponse, + rawResponse: _response.rawResponse, + }; + } + + if (_response.error.reason === "status-code") { + switch (_response.error.statusCode) { + case 400: + throw new LangfuseAPI.Error( + _response.error.body as unknown, + _response.rawResponse, + ); + case 401: + throw new LangfuseAPI.UnauthorizedError( + _response.error.body as unknown, + _response.rawResponse, + ); + case 403: + throw new LangfuseAPI.AccessDeniedError( + _response.error.body as unknown, + _response.rawResponse, + ); + case 405: + throw new LangfuseAPI.MethodNotAllowedError( + _response.error.body as unknown, + _response.rawResponse, + ); + case 404: + throw new LangfuseAPI.NotFoundError( + _response.error.body as unknown, + _response.rawResponse, + ); + default: + throw new errors.LangfuseAPIError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + } + + switch (_response.error.reason) { + case "non-json": + throw new errors.LangfuseAPIError({ + statusCode: _response.error.statusCode, + body: _response.error.rawBody, + rawResponse: _response.rawResponse, + }); + case "timeout": + throw new errors.LangfuseAPITimeoutError( + "Timeout exceeded when calling GET /api/public/organizations/apiKeys.", + ); + case "unknown": + throw new errors.LangfuseAPIError({ + message: _response.error.errorMessage, + rawResponse: _response.rawResponse, + }); + } + } + protected async _getAuthorizationHeader(): Promise { const username = await core.Supplier.get(this._options.username); const password = await core.Supplier.get(this._options.password); diff --git a/packages/core/src/api/api/resources/organizations/types/OrganizationApiKey.ts b/packages/core/src/api/api/resources/organizations/types/OrganizationApiKey.ts new file mode 100644 index 00000000..f28534b7 --- /dev/null +++ b/packages/core/src/api/api/resources/organizations/types/OrganizationApiKey.ts @@ -0,0 +1,13 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ + +export interface OrganizationApiKey { + id: string; + createdAt: string; + expiresAt?: string; + lastUsedAt?: string; + note?: string; + publicKey: string; + displaySecretKey: string; +} diff --git a/packages/core/src/api/api/resources/organizations/types/OrganizationApiKeysResponse.ts b/packages/core/src/api/api/resources/organizations/types/OrganizationApiKeysResponse.ts new file mode 100644 index 00000000..5e02ec7c --- /dev/null +++ b/packages/core/src/api/api/resources/organizations/types/OrganizationApiKeysResponse.ts @@ -0,0 +1,9 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ + +import * as LangfuseAPI from "../../../index.js"; + +export interface OrganizationApiKeysResponse { + apiKeys: LangfuseAPI.OrganizationApiKey[]; +} diff --git a/packages/core/src/api/api/resources/organizations/types/index.ts b/packages/core/src/api/api/resources/organizations/types/index.ts index fa7f563b..9d3d2623 100644 --- a/packages/core/src/api/api/resources/organizations/types/index.ts +++ b/packages/core/src/api/api/resources/organizations/types/index.ts @@ -6,3 +6,5 @@ export * from "./MembershipDeletionResponse.js"; export * from "./MembershipsResponse.js"; export * from "./OrganizationProject.js"; export * from "./OrganizationProjectsResponse.js"; +export * from "./OrganizationApiKey.js"; +export * from "./OrganizationApiKeysResponse.js"; diff --git a/packages/core/src/api/api/resources/trace/client/requests/GetTracesRequest.ts b/packages/core/src/api/api/resources/trace/client/requests/GetTracesRequest.ts index c2e6d7d7..7eab5669 100644 --- a/packages/core/src/api/api/resources/trace/client/requests/GetTracesRequest.ts +++ b/packages/core/src/api/api/resources/trace/client/requests/GetTracesRequest.ts @@ -31,13 +31,15 @@ export interface GetTracesRequest { /** 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'. */ fields?: string; /** - * JSON string containing an array of filter conditions. When provided, this takes precedence over legacy filter parameters (userId, name, sessionId, tags, version, release, environment, fromTimestamp, toTimestamp). + * JSON string containing an array of filter conditions. When provided, this takes precedence over query parameter filters (userId, name, sessionId, tags, version, release, environment, fromTimestamp, toTimestamp). + * + * ## Filter Structure * Each filter condition has the following structure: * ```json * [ * { * "type": string, // Required. One of: "datetime", "string", "number", "stringOptions", "categoryOptions", "arrayOptions", "stringObject", "numberObject", "boolean", "null" - * "column": string, // Required. Column to filter on + * "column": string, // Required. Column to filter on (see available columns below) * "operator": string, // Required. Operator based on type: * // - datetime: ">", "<", ">=", "<=" * // - string: "=", "contains", "does not contain", "starts with", "ends with" @@ -54,6 +56,86 @@ export interface GetTracesRequest { * } * ] * ``` + * + * ## Available Columns + * + * ### Core Trace Fields + * - `id` (string) - Trace ID + * - `name` (string) - Trace name + * - `timestamp` (datetime) - Trace timestamp + * - `userId` (string) - User ID + * - `sessionId` (string) - Session ID + * - `environment` (string) - Environment tag + * - `version` (string) - Version tag + * - `release` (string) - Release tag + * - `tags` (arrayOptions) - Array of tags + * - `bookmarked` (boolean) - Bookmark status + * + * ### Structured Data + * - `metadata` (stringObject/numberObject/categoryOptions) - Metadata key-value pairs. Use `key` parameter to filter on specific metadata keys. + * + * ### Aggregated Metrics (from observations) + * These metrics are aggregated from all observations within the trace: + * - `latency` (number) - Latency in seconds (time from first observation start to last observation end) + * - `inputTokens` (number) - Total input tokens across all observations + * - `outputTokens` (number) - Total output tokens across all observations + * - `totalTokens` (number) - Total tokens (alias: `tokens`) + * - `inputCost` (number) - Total input cost in USD + * - `outputCost` (number) - Total output cost in USD + * - `totalCost` (number) - Total cost in USD + * + * ### Observation Level Aggregations + * These fields aggregate observation levels within the trace: + * - `level` (string) - Highest severity level (ERROR > WARNING > DEFAULT > DEBUG) + * - `warningCount` (number) - Count of WARNING level observations + * - `errorCount` (number) - Count of ERROR level observations + * - `defaultCount` (number) - Count of DEFAULT level observations + * - `debugCount` (number) - Count of DEBUG level observations + * + * ### Scores (requires join with scores table) + * - `scores_avg` (number) - Average of numeric scores (alias: `scores`) + * - `score_categories` (categoryOptions) - Categorical score values + * + * ## Filter Examples + * ```json + * [ + * { + * "type": "datetime", + * "column": "timestamp", + * "operator": ">=", + * "value": "2024-01-01T00:00:00Z" + * }, + * { + * "type": "string", + * "column": "userId", + * "operator": "=", + * "value": "user-123" + * }, + * { + * "type": "number", + * "column": "totalCost", + * "operator": ">=", + * "value": 0.01 + * }, + * { + * "type": "arrayOptions", + * "column": "tags", + * "operator": "all of", + * "value": ["production", "critical"] + * }, + * { + * "type": "stringObject", + * "column": "metadata", + * "key": "customer_tier", + * "operator": "=", + * "value": "enterprise" + * } + * ] + * ``` + * + * ## Performance Notes + * - Filtering on `userId`, `sessionId`, or `metadata` may enable skip indexes for better query performance + * - Score filters require a join with the scores table and may impact query performance */ filter?: string; } From c8fcea54f5efae553d40103b8ea126c0ad47671b Mon Sep 17 00:00:00 2001 From: langfuse-bot Date: Thu, 6 Nov 2025 19:18:57 +0100 Subject: [PATCH 2/3] feat(api): update API spec from langfuse/langfuse 25e6ad9 (#688) Co-authored-by: langfuse-bot --- packages/core/src/api/api/resources/commons/types/Dataset.ts | 4 ++++ packages/core/src/api/api/resources/datasets/client/Client.ts | 4 +++- .../api/api/resources/datasets/types/CreateDatasetRequest.ts | 4 ++++ .../src/api/api/resources/score/types/CreateScoreRequest.ts | 2 +- 4 files changed, 12 insertions(+), 2 deletions(-) diff --git a/packages/core/src/api/api/resources/commons/types/Dataset.ts b/packages/core/src/api/api/resources/commons/types/Dataset.ts index 8a154d90..6252a563 100644 --- a/packages/core/src/api/api/resources/commons/types/Dataset.ts +++ b/packages/core/src/api/api/resources/commons/types/Dataset.ts @@ -7,6 +7,10 @@ export interface Dataset { name: string; description?: string; metadata?: unknown; + /** JSON Schema for validating dataset item inputs */ + inputSchema?: unknown; + /** JSON Schema for validating dataset item expected outputs */ + expectedOutputSchema?: unknown; projectId: string; createdAt: string; updatedAt: string; diff --git a/packages/core/src/api/api/resources/datasets/client/Client.ts b/packages/core/src/api/api/resources/datasets/client/Client.ts index d137aec1..923ad0e0 100644 --- a/packages/core/src/api/api/resources/datasets/client/Client.ts +++ b/packages/core/src/api/api/resources/datasets/client/Client.ts @@ -331,7 +331,9 @@ export class Datasets { * await client.datasets.create({ * name: "name", * description: undefined, - * metadata: undefined + * metadata: undefined, + * inputSchema: undefined, + * expectedOutputSchema: undefined * }) */ public create( diff --git a/packages/core/src/api/api/resources/datasets/types/CreateDatasetRequest.ts b/packages/core/src/api/api/resources/datasets/types/CreateDatasetRequest.ts index cf1b9286..52e7023f 100644 --- a/packages/core/src/api/api/resources/datasets/types/CreateDatasetRequest.ts +++ b/packages/core/src/api/api/resources/datasets/types/CreateDatasetRequest.ts @@ -6,4 +6,8 @@ export interface CreateDatasetRequest { name: string; description?: string; metadata?: unknown; + /** JSON Schema for validating dataset item inputs. When set, all new and existing dataset items will be validated against this schema. */ + inputSchema?: unknown; + /** JSON Schema for validating dataset item expected outputs. When set, all new and existing dataset items will be validated against this schema. */ + expectedOutputSchema?: unknown; } diff --git a/packages/core/src/api/api/resources/score/types/CreateScoreRequest.ts b/packages/core/src/api/api/resources/score/types/CreateScoreRequest.ts index ca758e2c..c7f7794c 100644 --- a/packages/core/src/api/api/resources/score/types/CreateScoreRequest.ts +++ b/packages/core/src/api/api/resources/score/types/CreateScoreRequest.ts @@ -74,7 +74,7 @@ export interface CreateScoreRequest { /** The value of the score. Must be passed as string for categorical scores, and numeric for boolean and numeric scores. Boolean score values must equal either 1 or 0 (true or false) */ value: LangfuseAPI.CreateScoreValue; comment?: string; - metadata?: unknown; + metadata?: Record; /** The environment of the score. Can be any lowercase alphanumeric string with hyphens and underscores that does not start with 'langfuse'. */ environment?: string; /** The annotation queue referenced by the score. Indicates if score was initially created while processing annotation queue. */ From 28b7bfc24c165fc41105df52e9d94498508d49cf Mon Sep 17 00:00:00 2001 From: Hassieb Pakzad <68423100+hassiebp@users.noreply.github.com> Date: Thu, 6 Nov 2025 19:23:15 +0100 Subject: [PATCH 3/3] chore: release v4.4.1 --- package.json | 2 +- packages/client/package.json | 2 +- packages/core/package.json | 2 +- packages/langchain/package.json | 2 +- packages/openai/package.json | 2 +- packages/otel/package.json | 2 +- packages/tracing/package.json | 2 +- 7 files changed, 7 insertions(+), 7 deletions(-) diff --git a/package.json b/package.json index b66cb3a9..86ce8191 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "langfuse-js", - "version": "4.4.0", + "version": "4.4.1", "description": "Langfuse JavaScript / TypeScript SDK", "author": "Langfuse", "license": "MIT", diff --git a/packages/client/package.json b/packages/client/package.json index b8681668..c9bc7e7e 100644 --- a/packages/client/package.json +++ b/packages/client/package.json @@ -1,6 +1,6 @@ { "name": "@langfuse/client", - "version": "4.4.0", + "version": "4.4.1", "description": "Langfuse API client for universal JavaScript environments", "type": "module", "sideEffects": false, diff --git a/packages/core/package.json b/packages/core/package.json index 5caf5f0f..ce6b06af 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -1,6 +1,6 @@ { "name": "@langfuse/core", - "version": "4.4.0", + "version": "4.4.1", "description": "Core functions and utilities for Langfuse packages", "type": "module", "sideEffects": false, diff --git a/packages/langchain/package.json b/packages/langchain/package.json index 8fc5d567..3d1eec0b 100644 --- a/packages/langchain/package.json +++ b/packages/langchain/package.json @@ -1,6 +1,6 @@ { "name": "@langfuse/langchain", - "version": "4.4.0", + "version": "4.4.1", "description": "Langfuse integration for LangChain", "type": "module", "sideEffects": false, diff --git a/packages/openai/package.json b/packages/openai/package.json index 35876589..d2c8e8c5 100644 --- a/packages/openai/package.json +++ b/packages/openai/package.json @@ -1,6 +1,6 @@ { "name": "@langfuse/openai", - "version": "4.4.0", + "version": "4.4.1", "description": "Langfuse integration for OpenAI SDK", "type": "module", "sideEffects": false, diff --git a/packages/otel/package.json b/packages/otel/package.json index dbb8432f..19626f5f 100644 --- a/packages/otel/package.json +++ b/packages/otel/package.json @@ -1,6 +1,6 @@ { "name": "@langfuse/otel", - "version": "4.4.0", + "version": "4.4.1", "author": "Langfuse", "license": "MIT", "engines": { diff --git a/packages/tracing/package.json b/packages/tracing/package.json index 1fa4ed07..72d72f96 100644 --- a/packages/tracing/package.json +++ b/packages/tracing/package.json @@ -1,6 +1,6 @@ { "name": "@langfuse/tracing", - "version": "4.4.0", + "version": "4.4.1", "author": "Langfuse", "license": "MIT", "engines": {