deerflow2/backend/packages/harness/deerflow/config/billing_config.py

63 lines
2.2 KiB
Python

"""Configuration for reservation/finalization billing integration."""
from pydantic import BaseModel, Field
class BillingConfig(BaseModel):
"""Configuration for external billing reservation/finalization calls."""
enabled: bool = Field(default=False, description="Enable external billing middleware.")
include_subagents: bool = Field(
default=False,
description="Whether billing applies to subagent model calls as well.",
)
fail_closed: bool = Field(
default=True,
description="Block model calls when reserve request fails or balance is insufficient.",
)
block_only_specific_reserve_codes: bool = Field(
default=True,
description=(
"When true, only reserve responses with codes in blocking_reserve_codes block model calls. "
"When false, fallback to fail_closed behavior for all reserve failures."
),
)
blocking_reserve_codes: list[int] = Field(
default_factory=lambda: [-1104, -1106],
description="Reserve response codes that should block model calls when block_only_specific_reserve_codes is enabled.",
)
frozen_type: int = Field(
default=1,
ge=1,
description="Frozen type sent to the platform. Current flow uses 1 for token billing.",
)
reserve_url: str | None = Field(
default=None,
description="HTTP(S) endpoint for creating frozen reservations.",
)
finalize_url: str | None = Field(
default=None,
description="HTTP(S) endpoint for finalizing frozen reservations.",
)
headers: dict[str, str] = Field(
default_factory=dict,
description="Extra HTTP headers included in reserve/finalize requests.",
)
timeout_seconds: float = Field(
default=10.0,
gt=0,
le=120,
description="HTTP request timeout for reserve/finalize calls.",
)
default_expire_seconds: int = Field(
default=1800,
ge=60,
le=86400,
description="Default reservation expiration seconds when expireAt is included.",
)
default_estimated_output_tokens: int | None = Field(
default=None,
ge=1,
description="Fallback estimatedOutputTokens when model max_tokens is unavailable.",
)