Skip to content

[Feature]: Support "Less Than" Operators in Query #5651

@CalebCourier

Description

@CalebCourier

Description

A common need when querying traces is to filter by a time range. While WeaveClient.get_calls supports greater than ($gt) and greater than or equal to ($gte) operators in Query expressions, it does not support any of the less than operators making it impossible to query by a time range.

To illustrate this, the following code sample yields the subsequent error:

query = {
    "$expr": {
        "$and": [
            { "$gte": [{ "$getField": "started_at" }, { "$literal": start_time }] },
            { "$lt": [{ "$getField": "ended_at" }, { "$literal": end_time }] }
        ]
    }
}


weave_client = weave.init(f"{entity}/{project}")
traces = weave_client.get_calls(
    query=query
)
pydantic_core._pydantic_core.ValidationError: 18 validation errors for WeaveClient.get_calls
query.$expr.AndOperation.$and.1.LiteralOperation.$literal
  Field required [type=missing, input_value={'$lt': [{'$getField': 'e...iteral': 1761919200.0}]}, input_type=dict]
    For further information visit https://errors.pydantic.dev/2.11/v/missing
query.$expr.AndOperation.$and.1.GetFieldOperator.$getField
  Field required [type=missing, input_value={'$lt': [{'$getField': 'e...iteral': 1761919200.0}]}, input_type=dict]
    For further information visit https://errors.pydantic.dev/2.11/v/missing
query.$expr.AndOperation.$and.1.ConvertOperation.$convert
  Field required [type=missing, input_value={'$lt': [{'$getField': 'e...iteral': 1761919200.0}]}, input_type=dict]
    For further information visit https://errors.pydantic.dev/2.11/v/missing
query.$expr.AndOperation.$and.1.AndOperation.$and
  Field required [type=missing, input_value={'$lt': [{'$getField': 'e...iteral': 1761919200.0}]}, input_type=dict]
    For further information visit https://errors.pydantic.dev/2.11/v/missing
query.$expr.AndOperation.$and.1.OrOperation.$or
  Field required [type=missing, input_value={'$lt': [{'$getField': 'e...iteral': 1761919200.0}]}, input_type=dict]
    For further information visit https://errors.pydantic.dev/2.11/v/missing
query.$expr.AndOperation.$and.1.NotOperation.$not
  Field required [type=missing, input_value={'$lt': [{'$getField': 'e...iteral': 1761919200.0}]}, input_type=dict]
    For further information visit https://errors.pydantic.dev/2.11/v/missing
query.$expr.AndOperation.$and.1.EqOperation.$eq
  Field required [type=missing, input_value={'$lt': [{'$getField': 'e...iteral': 1761919200.0}]}, input_type=dict]
    For further information visit https://errors.pydantic.dev/2.11/v/missing
query.$expr.AndOperation.$and.1.GtOperation.$gt
  Field required [type=missing, input_value={'$lt': [{'$getField': 'e...iteral': 1761919200.0}]}, input_type=dict]
    For further information visit https://errors.pydantic.dev/2.11/v/missing
query.$expr.AndOperation.$and.1.GteOperation.$gte
  Field required [type=missing, input_value={'$lt': [{'$getField': 'e...iteral': 1761919200.0}]}, input_type=dict]
    For further information visit https://errors.pydantic.dev/2.11/v/missing
query.$expr.AndOperation.$and.1.InOperation.$in
  Field required [type=missing, input_value={'$lt': [{'$getField': 'e...iteral': 1761919200.0}]}, input_type=dict]
    For further information visit https://errors.pydantic.dev/2.11/v/missing
query.$expr.AndOperation.$and.1.ContainsOperation.$contains
  Field required [type=missing, input_value={'$lt': [{'$getField': 'e...iteral': 1761919200.0}]}, input_type=dict]
    For further information visit https://errors.pydantic.dev/2.11/v/missing
query.$expr.OrOperation.$or
  Field required [type=missing, input_value={'$and': [{'$gte': [{'$ge...eral': 1761919200.0}]}]}, input_type=dict]
    For further information visit https://errors.pydantic.dev/2.11/v/missing
query.$expr.NotOperation.$not
  Field required [type=missing, input_value={'$and': [{'$gte': [{'$ge...eral': 1761919200.0}]}]}, input_type=dict]
    For further information visit https://errors.pydantic.dev/2.11/v/missing
query.$expr.EqOperation.$eq
  Field required [type=missing, input_value={'$and': [{'$gte': [{'$ge...eral': 1761919200.0}]}]}, input_type=dict]
    For further information visit https://errors.pydantic.dev/2.11/v/missing
query.$expr.GtOperation.$gt
  Field required [type=missing, input_value={'$and': [{'$gte': [{'$ge...eral': 1761919200.0}]}]}, input_type=dict]
    For further information visit https://errors.pydantic.dev/2.11/v/missing
query.$expr.GteOperation.$gte
  Field required [type=missing, input_value={'$and': [{'$gte': [{'$ge...eral': 1761919200.0}]}]}, input_type=dict]
    For further information visit https://errors.pydantic.dev/2.11/v/missing
query.$expr.InOperation.$in
  Field required [type=missing, input_value={'$and': [{'$gte': [{'$ge...eral': 1761919200.0}]}]}, input_type=dict]
    For further information visit https://errors.pydantic.dev/2.11/v/missing
query.$expr.ContainsOperation.$contains
  Field required [type=missing, input_value={'$and': [{'$gte': [{'$ge...eral': 1761919200.0}]}]}, input_type=dict]
    For further information visit https://errors.pydantic.dev/2.11/v/missing

Suggested Solution

The Query pydantic model, and any downstream services, should support $lt and $lte operators.

Weave Project Link

https://wandb.ai/ml-guardrails/gen-traces-without-run/weave

Screenshots or Mockups

No response

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or request

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions