"""Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.""" from __future__ import annotations from .observabilityfilterrulesconfig import ( ObservabilityFilterRulesConfig, ObservabilityFilterRulesConfigTypedDict, ) from openrouter.types import ( BaseModel, Nullable, OptionalNullable, UNSET, UNSET_SENTINEL, UnrecognizedStr, ) from openrouter.utils import validate_open_enum from pydantic import model_serializer from pydantic.functional_validators import PlainValidator from typing import Any, Dict, List, Literal, Optional, Union from typing_extensions import Annotated, NotRequired, TypedDict CreateObservabilityDestinationRequestType = Union[ Literal[ "arize", "braintrust", "clickhouse", "datadog", "grafana", "langfuse", "langsmith", "newrelic", "opik", "otel-collector", "posthog", "ramp", "s3", "sentry", "snowflake", "weave", "webhook", ], UnrecognizedStr, ] r"""The destination type. Only stable destination types are accepted.""" class CreateObservabilityDestinationRequestTypedDict(TypedDict): config: Dict[str, Nullable[Any]] r"""Provider-specific configuration. The shape depends on `type` and is validated server-side.""" name: str r"""Human-readable name for the destination.""" type: CreateObservabilityDestinationRequestType r"""The destination type. Only stable destination types are accepted.""" api_key_hashes: NotRequired[Nullable[List[str]]] r"""Optional allowlist of OpenRouter API key hashes whose traffic is forwarded. `null` or omitted means all keys. Must contain at least one hash if provided.""" enabled: NotRequired[bool] r"""Whether this destination should be enabled immediately.""" filter_rules: NotRequired[Nullable[ObservabilityFilterRulesConfigTypedDict]] r"""Optional structured filter rules controlling which events are forwarded.""" privacy_mode: NotRequired[bool] r"""When true, request/response bodies are not forwarded — only metadata.""" sampling_rate: NotRequired[float] r"""Sampling rate between 0.0001 and 1 (1 = 100%).""" workspace_id: NotRequired[str] r"""Optional workspace ID. Defaults to the authenticated entity's default workspace.""" class CreateObservabilityDestinationRequest(BaseModel): config: Dict[str, Nullable[Any]] r"""Provider-specific configuration. The shape depends on `type` and is validated server-side.""" name: str r"""Human-readable name for the destination.""" type: Annotated[ CreateObservabilityDestinationRequestType, PlainValidator(validate_open_enum(False)), ] r"""The destination type. Only stable destination types are accepted.""" api_key_hashes: OptionalNullable[List[str]] = UNSET r"""Optional allowlist of OpenRouter API key hashes whose traffic is forwarded. `null` or omitted means all keys. Must contain at least one hash if provided.""" enabled: Optional[bool] = True r"""Whether this destination should be enabled immediately.""" filter_rules: OptionalNullable[ObservabilityFilterRulesConfig] = UNSET r"""Optional structured filter rules controlling which events are forwarded.""" privacy_mode: Optional[bool] = False r"""When true, request/response bodies are not forwarded — only metadata.""" sampling_rate: Optional[float] = None r"""Sampling rate between 0.0001 and 1 (1 = 100%).""" workspace_id: Optional[str] = None r"""Optional workspace ID. Defaults to the authenticated entity's default workspace.""" @model_serializer(mode="wrap") def serialize_model(self, handler): optional_fields = [ "api_key_hashes", "enabled", "filter_rules", "privacy_mode", "sampling_rate", "workspace_id", ] nullable_fields = ["api_key_hashes", "filter_rules"] null_default_fields = [] serialized = handler(self) m = {} for n, f in type(self).model_fields.items(): k = f.alias or n val = serialized.get(k) serialized.pop(k, None) optional_nullable = k in optional_fields and k in nullable_fields is_set = ( self.__pydantic_fields_set__.intersection({n}) or k in null_default_fields ) # pylint: disable=no-member if val is not None and val != UNSET_SENTINEL: m[k] = val elif val != UNSET_SENTINEL and ( not k in optional_fields or (optional_nullable and is_set) ): m[k] = val return m