// Code generated by Fern. DO NOT EDIT.

package metricsv2

import (
    core "pentagi/pkg/observability/langfuse/api/core"
    internal "pentagi/pkg/observability/langfuse/api/internal"
    context "context"
    api "pentagi/pkg/observability/langfuse/api"
    option "pentagi/pkg/observability/langfuse/api/option"
)


type Client struct {
    WithRawResponse *RawClient

    options *core.RequestOptions
    baseURL string
    caller *internal.Caller
}

func NewClient(options *core.RequestOptions) *Client {
    return &Client{
        WithRawResponse: NewRawClient(options),
        options: options,
        baseURL: options.BaseURL,
        caller: internal.NewCaller(
            &internal.CallerParams{
                Client: options.HTTPClient,
                MaxAttempts: options.MaxAttempts,
            },
        ),
    }
}

// Get metrics from the Langfuse project using a query object. V2 endpoint with optimized performance.
// 
// ## V2 Differences
// - Supports `observations`, `scores-numeric`, and `scores-categorical` views only (traces view not supported)
// - Direct access to tags and release fields on observations
// - Backwards-compatible: traceName, traceRelease, traceVersion dimensions are still available on observations view
// - High cardinality dimensions are not supported and will return a 400 error (see below)
// 
// For more details, see the [Metrics API documentation](https://langfuse.com/docs/metrics/features/metrics-api).
// 
// ## Available Views
// 
// ### observations
// Query observation-level data (spans, generations, events).
// 
// **Dimensions:**
// - `environment` - Deployment environment (e.g., production, staging)
// - `type` - Type of observation (SPAN, GENERATION, EVENT)
// - `name` - Name of the observation
// - `level` - Logging level of the observation
// - `version` - Version of the observation
// - `tags` - User-defined tags
// - `release` - Release version
// - `traceName` - Name of the parent trace (backwards-compatible)
// - `traceRelease` - Release version of the parent trace (backwards-compatible, maps to release)
// - `traceVersion` - Version of the parent trace (backwards-compatible, maps to version)
// - `providedModelName` - Name of the model used
// - `promptName` - Name of the prompt used
// - `promptVersion` - Version of the prompt used
// - `startTimeMonth` - Month of start_time in YYYY-MM format
// 
// **Measures:**
// - `count` - Total number of observations
// - `latency` - Observation latency (milliseconds)
// - `streamingLatency` - Generation latency from completion start to end (milliseconds)
// - `inputTokens` - Sum of input tokens consumed
// - `outputTokens` - Sum of output tokens produced
// - `totalTokens` - Sum of all tokens consumed
// - `outputTokensPerSecond` - Output tokens per second
// - `tokensPerSecond` - Total tokens per second
// - `inputCost` - Input cost (USD)
// - `outputCost` - Output cost (USD)
// - `totalCost` - Total cost (USD)
// - `timeToFirstToken` - Time to first token (milliseconds)
// - `countScores` - Number of scores attached to the observation
// 
// ### scores-numeric
// Query numeric and boolean score data.
// 
// **Dimensions:**
// - `environment` - Deployment environment
// - `name` - Name of the score (e.g., accuracy, toxicity)
// - `source` - Origin of the score (API, ANNOTATION, EVAL)
// - `dataType` - Data type (NUMERIC, BOOLEAN)
// - `configId` - Identifier of the score config
// - `timestampMonth` - Month in YYYY-MM format
// - `timestampDay` - Day in YYYY-MM-DD format
// - `value` - Numeric value of the score
// - `traceName` - Name of the parent trace
// - `tags` - Tags
// - `traceRelease` - Release version
// - `traceVersion` - Version
// - `observationName` - Name of the associated observation
// - `observationModelName` - Model name of the associated observation
// - `observationPromptName` - Prompt name of the associated observation
// - `observationPromptVersion` - Prompt version of the associated observation
// 
// **Measures:**
// - `count` - Total number of scores
// - `value` - Score value (for aggregations)
// 
// ### scores-categorical
// Query categorical score data. Same dimensions as scores-numeric except uses `stringValue` instead of `value`.
// 
// **Measures:**
// - `count` - Total number of scores
// 
// ## High Cardinality Dimensions
// The following dimensions cannot be used as grouping dimensions in v2 metrics API as they can cause performance issues.
// Use them in filters instead.
// 
// **observations view:**
// - `id` - Use traceId filter to narrow down results
// - `traceId` - Use traceId filter instead
// - `userId` - Use userId filter instead
// - `sessionId` - Use sessionId filter instead
// - `parentObservationId` - Use parentObservationId filter instead
// 
// **scores-numeric / scores-categorical views:**
// - `id` - Use specific filters to narrow down results
// - `traceId` - Use traceId filter instead
// - `userId` - Use userId filter instead
// - `sessionId` - Use sessionId filter instead
// - `observationId` - Use observationId filter instead
// 
// ## Aggregations
// Available aggregation functions: `sum`, `avg`, `count`, `max`, `min`, `p50`, `p75`, `p90`, `p95`, `p99`, `histogram`
// 
// ## Time Granularities
// Available granularities for timeDimension: `auto`, `minute`, `hour`, `day`, `week`, `month`
// - `auto` bins the data into approximately 50 buckets based on the time range
func (c *Client) Metrics(
    ctx context.Context,
    request *api.MetricsV2MetricsRequest,
    opts ...option.RequestOption,
) (*api.MetricsV2Response, error){
    response, err := c.WithRawResponse.Metrics(
        ctx,
        request,
        opts...,
    )
    if err != nil {
        return nil, err
    }
    return response.Body, nil
}

