perf(translate): fix slow translation startup — CJK estimation, output budget, provider token config
Root cause: batch sizing underestimated CJK token density (1.5→1.0 chars/token) and ignored output budget as primary constraint, causing cascading finish_reason=length. Changes: - _token_budget.py: CJK_RATIO 1.5→1.0, OTHER_RATIO 2.2→1.8, safety factors 0.75/0.70 - _token_budget.py: new _compute_max_rows_by_output() — output budget is PRIMARY constraint - _batch_sizer.py: resolve_provider_config() with DB-level context_window/max_output_tokens - _batch_sizer.py: INPUT_SAFETY_FACTOR applied, max_rows_by_output used as row cap - _llm_http.py: log actual usage.prompt_tokens/.completion_tokens from provider - _llm_call.py: retry only missing rows after finish_reason=length (save partial result) - models/llm.py + schema: provider-level context_window / max_output_tokens (nullable) - services/llm_provider.py: get_provider_token_config() helper - Alembic migration: add columns to llm_providers - Svelte ProviderConfig: collapsible Advanced: Token Limits section - 12 new tests (token budget, batch sizer, provider config) - All 492 tests pass
This commit is contained in:
@@ -0,0 +1,48 @@
|
||||
"""Add context_window and max_output_tokens to llm_providers
|
||||
|
||||
Revision ID: a1b2c3d4e5f6
|
||||
Revises: f1a2b3c4d5e6
|
||||
Create Date: 2026-06-03
|
||||
|
||||
Add token window configuration to LLM provider records:
|
||||
- context_window: total context window in tokens (nullable)
|
||||
- max_output_tokens: max output tokens limit (nullable)
|
||||
Both NULL = use PROVIDER_DEFAULTS fallback from model name.
|
||||
"""
|
||||
from typing import Sequence, Union
|
||||
|
||||
from alembic import op
|
||||
import sqlalchemy as sa
|
||||
|
||||
|
||||
# revision identifiers, used by Alembic.
|
||||
revision: str = "a1b2c3d4e5f6"
|
||||
down_revision: Union[str, None] = "f1a2b3c4d5e6"
|
||||
branch_labels: Union[str, Sequence[str], None] = None
|
||||
depends_on: Union[str, Sequence[str], None] = None
|
||||
|
||||
|
||||
def upgrade() -> None:
|
||||
op.add_column(
|
||||
"llm_providers",
|
||||
sa.Column(
|
||||
"context_window",
|
||||
sa.Integer(),
|
||||
nullable=True,
|
||||
comment="Total context window in tokens. NULL = auto-detect from model name",
|
||||
),
|
||||
)
|
||||
op.add_column(
|
||||
"llm_providers",
|
||||
sa.Column(
|
||||
"max_output_tokens",
|
||||
sa.Integer(),
|
||||
nullable=True,
|
||||
comment="Max output tokens limit. NULL = auto-detect from model name",
|
||||
),
|
||||
)
|
||||
|
||||
|
||||
def downgrade() -> None:
|
||||
op.drop_column("llm_providers", "max_output_tokens")
|
||||
op.drop_column("llm_providers", "context_window")
|
||||
Reference in New Issue
Block a user