- New services/cost_tracker.py: sync httpx preflight()/record() + async wrappers; BudgetExceeded exception; no-op when COST_TRACKER_BASE_URL is empty - Preflight budget check added before ingestion (Gemini), per-language translation (video-native + traditional), and per-language TTS dispatch - _record_gemini_usage and _record_tts_cost now call cost_tracker directly; removes broken asyncio.get_event_loop() hack from sync Celery worker - Fix: _cost_ctx now threaded into extract_accessibility_targeted (video-native path) - Fix: user_id/cost_project_id now propagated through dispatch_language_tts → synthesize_cue_task.s() and the rerender_accessible_video.py re-render path - Remove oliver-cost-tracker SDK dependency (was commented-out/never installed) - Drop cost_tracker_outbox_path setting and get_cost_tracker() factory - Update COST_TRACKER_BASE_URL default to optical-dev.oliver.solutions in .env.prod.example, docker-compose.yml, and all Cloud Run service yamls - Cloud Run yamls use Secret Manager ref (cost-tracker-api-key) for the API key Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
109 lines
No EOL
2.9 KiB
TOML
109 lines
No EOL
2.9 KiB
TOML
[tool.poetry]
|
|
name = "accessible-video-backend"
|
|
version = "0.1.0"
|
|
description = "FastAPI backend for accessible video processing platform"
|
|
authors = ["Your Name <your.email@example.com>"]
|
|
readme = "README.md"
|
|
|
|
[tool.poetry.dependencies]
|
|
python = "^3.11"
|
|
fastapi = "^0.115.0"
|
|
uvicorn = {extras = ["standard"], version = "^0.24.0"}
|
|
gunicorn = "^21.2.0"
|
|
pydantic = {extras = ["email"], version = "^2.5.0"}
|
|
pydantic-settings = "^2.1.0"
|
|
pymongo = "^4.6.0"
|
|
motor = "^3.3.2"
|
|
redis = "^5.0.1"
|
|
celery = {extras = ["redis"], version = "^5.3.4"}
|
|
google-cloud-storage = "^2.10.0"
|
|
google-cloud-translate = "^3.12.1"
|
|
google-cloud-texttospeech = "^2.16.3"
|
|
google-cloud-secret-manager = "^2.18.1"
|
|
google-genai = "^1.56.0"
|
|
sendgrid = "^6.11.0"
|
|
python-jose = {extras = ["cryptography"], version = "^3.3.0"}
|
|
libpass = {extras = ["bcrypt"], version = "^1.9.1"}
|
|
python-multipart = "^0.0.6"
|
|
opentelemetry-api = "^1.21.0"
|
|
opentelemetry-sdk = "^1.21.0"
|
|
opentelemetry-instrumentation-fastapi = "^0.42b0"
|
|
opentelemetry-instrumentation-pymongo = "^0.42b0"
|
|
opentelemetry-instrumentation-redis = "^0.42b0"
|
|
opentelemetry-exporter-gcp-trace = "^1.6.0"
|
|
opentelemetry-exporter-otlp = "^1.21.0"
|
|
# opentelemetry-exporter-prometheus = "^1.11.1" # Temporarily disabled - version conflicts
|
|
prometheus-client = "^0.19.0"
|
|
sentry-sdk = {extras = ["fastapi"], version = "^1.38.0"}
|
|
ffmpeg-python = "^0.2.0"
|
|
pydub = "^0.25.1"
|
|
faster-whisper = "^1.2.0"
|
|
python-magic = "^0.4.27"
|
|
aiohttp = "^3.12.15"
|
|
jinja2 = "^3.1.6"
|
|
audioop-lts = {version = "^0.2.2", python = ">=3.13"}
|
|
|
|
[tool.poetry.group.dev.dependencies]
|
|
pytest = "^7.4.3"
|
|
pytest-asyncio = "^0.21.1"
|
|
pytest-mock = "^3.12.0"
|
|
httpx = "^0.28.1"
|
|
black = "^23.11.0"
|
|
ruff = "^0.1.6"
|
|
mypy = "^1.7.1"
|
|
pre-commit = "^3.6.0"
|
|
|
|
[build-system]
|
|
requires = ["poetry-core"]
|
|
build-backend = "poetry.core.masonry.api"
|
|
|
|
[tool.black]
|
|
line-length = 88
|
|
target-version = ['py311']
|
|
include = '\.pyi?$'
|
|
|
|
[tool.ruff]
|
|
target-version = "py311"
|
|
line-length = 88
|
|
select = [
|
|
"E", # pycodestyle errors
|
|
"W", # pycodestyle warnings
|
|
"F", # pyflakes
|
|
"I", # isort
|
|
"B", # flake8-bugbear
|
|
"C4", # flake8-comprehensions
|
|
"UP", # pyupgrade
|
|
]
|
|
ignore = [
|
|
"E501", # line too long, handled by black
|
|
"B008", # do not perform function calls in argument defaults
|
|
"C901", # too complex
|
|
]
|
|
|
|
[tool.ruff.per-file-ignores]
|
|
"__init__.py" = ["F401"]
|
|
|
|
[tool.mypy]
|
|
python_version = "3.11"
|
|
check_untyped_defs = true
|
|
disallow_any_generics = true
|
|
disallow_incomplete_defs = true
|
|
disallow_untyped_decorators = true
|
|
disallow_untyped_defs = true
|
|
ignore_missing_imports = true
|
|
no_implicit_optional = true
|
|
show_error_codes = true
|
|
strict_equality = true
|
|
warn_redundant_casts = true
|
|
warn_return_any = true
|
|
warn_unreachable = true
|
|
warn_unused_configs = true
|
|
warn_unused_ignores = true
|
|
|
|
[tool.pytest.ini_options]
|
|
testpaths = ["tests"]
|
|
python_files = ["test_*.py"]
|
|
python_classes = ["Test*"]
|
|
python_functions = ["test_*"]
|
|
addopts = "-v --tb=short"
|
|
asyncio_mode = "auto" |