"""Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.""" from __future__ import annotations from .contentfilterbuiltinentryinput import ( ContentFilterBuiltinEntryInput, ContentFilterBuiltinEntryInputTypedDict, ) from .contentfilterentry import ContentFilterEntry, ContentFilterEntryTypedDict from .guardrailinterval import GuardrailInterval from openrouter.types import ( BaseModel, Nullable, OptionalNullable, UNSET, UNSET_SENTINEL, ) from openrouter.utils import validate_open_enum import pydantic from pydantic import model_serializer from pydantic.functional_validators import PlainValidator from typing import List, Optional from typing_extensions import Annotated, NotRequired, TypedDict class CreateGuardrailRequestTypedDict(TypedDict): name: str r"""Name for the new guardrail""" allowed_models: NotRequired[Nullable[List[str]]] r"""Array of model identifiers (slug or canonical_slug accepted)""" allowed_providers: NotRequired[Nullable[List[str]]] r"""List of allowed provider IDs""" content_filter_builtins: NotRequired[ Nullable[List[ContentFilterBuiltinEntryInputTypedDict]] ] r"""Builtin content filters to apply. The \"flag\" action is only supported for \"regex-prompt-injection\"; PII slugs (email, phone, ssn, credit-card, ip-address, person-name, address) accept \"block\" or \"redact\" only.""" content_filters: NotRequired[Nullable[List[ContentFilterEntryTypedDict]]] r"""Custom regex content filters to apply to request messages""" description: NotRequired[Nullable[str]] r"""Description of the guardrail""" enforce_zdr: NotRequired[Nullable[bool]] r"""Deprecated. Use enforce_zdr_anthropic, enforce_zdr_openai, enforce_zdr_google, and enforce_zdr_other instead. When provided, its value is copied into any of those per-provider fields that are not explicitly specified on the request.""" enforce_zdr_anthropic: NotRequired[Nullable[bool]] r"""Whether to enforce zero data retention for Anthropic models. Falls back to enforce_zdr when not provided.""" enforce_zdr_google: NotRequired[Nullable[bool]] r"""Whether to enforce zero data retention for Google models. Falls back to enforce_zdr when not provided.""" enforce_zdr_openai: NotRequired[Nullable[bool]] r"""Whether to enforce zero data retention for OpenAI models. Falls back to enforce_zdr when not provided.""" enforce_zdr_other: NotRequired[Nullable[bool]] r"""Whether to enforce zero data retention for models that are not from Anthropic, OpenAI, or Google. Falls back to enforce_zdr when not provided.""" ignored_models: NotRequired[Nullable[List[str]]] r"""Array of model identifiers to exclude from routing (slug or canonical_slug accepted)""" ignored_providers: NotRequired[Nullable[List[str]]] r"""List of provider IDs to exclude from routing""" limit_usd: NotRequired[Nullable[float]] r"""Spending limit in USD""" reset_interval: NotRequired[Nullable[GuardrailInterval]] r"""Interval at which the limit resets (daily, weekly, monthly)""" workspace_id: NotRequired[str] r"""The workspace to create the guardrail in. Defaults to the default workspace if not provided.""" class CreateGuardrailRequest(BaseModel): name: str r"""Name for the new guardrail""" allowed_models: OptionalNullable[List[str]] = UNSET r"""Array of model identifiers (slug or canonical_slug accepted)""" allowed_providers: OptionalNullable[List[str]] = UNSET r"""List of allowed provider IDs""" content_filter_builtins: OptionalNullable[List[ContentFilterBuiltinEntryInput]] = ( UNSET ) r"""Builtin content filters to apply. The \"flag\" action is only supported for \"regex-prompt-injection\"; PII slugs (email, phone, ssn, credit-card, ip-address, person-name, address) accept \"block\" or \"redact\" only.""" content_filters: OptionalNullable[List[ContentFilterEntry]] = UNSET r"""Custom regex content filters to apply to request messages""" description: OptionalNullable[str] = UNSET r"""Description of the guardrail""" enforce_zdr: Annotated[ OptionalNullable[bool], pydantic.Field( deprecated="warning: ** DEPRECATED ** - This will be removed in a future release, please migrate away from it as soon as possible." ), ] = UNSET r"""Deprecated. Use enforce_zdr_anthropic, enforce_zdr_openai, enforce_zdr_google, and enforce_zdr_other instead. When provided, its value is copied into any of those per-provider fields that are not explicitly specified on the request.""" enforce_zdr_anthropic: OptionalNullable[bool] = UNSET r"""Whether to enforce zero data retention for Anthropic models. Falls back to enforce_zdr when not provided.""" enforce_zdr_google: OptionalNullable[bool] = UNSET r"""Whether to enforce zero data retention for Google models. Falls back to enforce_zdr when not provided.""" enforce_zdr_openai: OptionalNullable[bool] = UNSET r"""Whether to enforce zero data retention for OpenAI models. Falls back to enforce_zdr when not provided.""" enforce_zdr_other: OptionalNullable[bool] = UNSET r"""Whether to enforce zero data retention for models that are not from Anthropic, OpenAI, or Google. Falls back to enforce_zdr when not provided.""" ignored_models: OptionalNullable[List[str]] = UNSET r"""Array of model identifiers to exclude from routing (slug or canonical_slug accepted)""" ignored_providers: OptionalNullable[List[str]] = UNSET r"""List of provider IDs to exclude from routing""" limit_usd: OptionalNullable[float] = UNSET r"""Spending limit in USD""" reset_interval: Annotated[ OptionalNullable[GuardrailInterval], PlainValidator(validate_open_enum(False)) ] = UNSET r"""Interval at which the limit resets (daily, weekly, monthly)""" workspace_id: Optional[str] = None r"""The workspace to create the guardrail in. Defaults to the default workspace if not provided.""" @model_serializer(mode="wrap") def serialize_model(self, handler): optional_fields = [ "allowed_models", "allowed_providers", "content_filter_builtins", "content_filters", "description", "enforce_zdr", "enforce_zdr_anthropic", "enforce_zdr_google", "enforce_zdr_openai", "enforce_zdr_other", "ignored_models", "ignored_providers", "limit_usd", "reset_interval", "workspace_id", ] nullable_fields = [ "allowed_models", "allowed_providers", "content_filter_builtins", "content_filters", "description", "enforce_zdr", "enforce_zdr_anthropic", "enforce_zdr_google", "enforce_zdr_openai", "enforce_zdr_other", "ignored_models", "ignored_providers", "limit_usd", "reset_interval", ] 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