Repository navigation
Expand file tree
/
Copy pathpyproject.toml
More file actions
96 lines (91 loc) · 3.02 KB
/
Copy pathpyproject.toml
File metadata and controls
96 lines (91 loc) · 3.02 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
[project]
name = "opengtm"
version = "3.0.0"
description = "OpenGTM — open-source GTM agents for the world"
requires-python = ">=3.11"
dependencies = [
# FastAPI stack
"fastapi>=0.128.0",
"uvicorn[standard]>=0.54.0",
"sqlalchemy>=2.1.1",
"alembic>=1.20.0",
# Postgres driver (psycopg3). Required for the default Postgres DATABASE_URL
# and the shared, RLS-protected multi-tenant leads/signals store. The URL
# must use the 'postgresql+psycopg://' scheme (psycopg3), not bare
# 'postgresql://' (which would need psycopg2). Also lets plain `uv run
# alembic ...` / `uv run python -m apps.api.scripts.seed_demo` work without
# an ad-hoc `--with psycopg[binary]`. Mirrors apps/api/pyproject.toml.
"psycopg[binary]>=3.3.6",
"pydantic-settings>=2.0.0",
"slowapi>=0.1.9",
# Scraping & HTTP
"beautifulsoup4>=4.12",
"httpx>=0.28",
"aiohttp>=3.9",
"curl-cffi>=0.16.3",
"lxml>=6.1.3",
"markdownify>=1.2",
"requests>=2.32",
# Browser automation
"playwright>=1.63.0",
# Lead generation
"ddgs>=9.16.0",
"thefuzz>=0.22",
"pandas>=3.0.6",
# Auth
"passlib[bcrypt]>=1.7.4",
"python-jose[cryptography]>=3.5.0",
"python-multipart>=0.0.21",
# Envelope encryption for per-workspace integration secrets (spec WI-6)
"cryptography>=50.0.1",
# Email validation
"dnspython>=2.8.0",
"email-validator>=2.3.0",
# LLM SDKs
"anthropic>=1.9.0",
# Utilities
"python-dotenv>=1.0",
"logfire[fastapi]>=5.1.1",
"aiofiles>=25.1.0",
"duckduckgo-search>=8.1.1",
"redis>=6.4.0",
"bullmq>=3.2.8",
"pebble>=5.2.2",
# Billing — Stripe credit top-ups (WI-9)
"stripe>=15.6.1",
"authlib>=1.6.5",
"itsdangerous>=2.2.0",
]
[project.optional-dependencies]
# Browser-tier escalation for the lead-sourcing fetch path (apps/api/services/
# leadgen/http.py). These are OPTIONAL: the default fetch path degrades to plain
# HTTP when they're absent. Install with: `uv sync --extra browser` followed by
# `uv run patchright install chromium` for the browser binary.
# - patchright: stealth-patched Playwright fork (Tier 3 headless browser).
# - stealth-requests: curl_cffi session wrapper with built-in extractors (Tier 2).
# curl-cffi itself is a core dependency above (Tier 2 TLS/JA3 impersonation).
browser = [
"patchright>=1.63.0",
"stealth-requests>=1.2.0",
]
[project.scripts]
# Preferred command. The legacy alias remains so existing automation keeps working.
opengtm = "apps.api.cli:main"
yupcha = "apps.api.cli:main"
[tool.logfire]
ignore_no_config = true
[dependency-groups]
dev = [
"pillow>=12.0.0",
"pytest>=9.0.3",
]
[tool.pytest.ini_options]
# Product tests live here. Network/provider assessment scripts under apps/api
# are operational tools, not import-safe pytest modules.
testpaths = ["tests"]
pythonpath = ["."]
addopts = ["--strict-markers"]
markers = [
"live: opt-in tests that require real network services or credentials",
"postgres: integration tests that require a PostgreSQL service",
]