dv-pipecat-flows 0.0.0.dev1644__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (80) hide show
  1. dv_pipecat_flows-0.0.0.dev1644/.claude/skills/loki-logs/SKILL.md +121 -0
  2. dv_pipecat_flows-0.0.0.dev1644/.claude/skills/loki-logs/query-reference.md +113 -0
  3. dv_pipecat_flows-0.0.0.dev1644/.gitattributes +2 -0
  4. dv_pipecat_flows-0.0.0.dev1644/.gitignore +184 -0
  5. dv_pipecat_flows-0.0.0.dev1644/.pre-commit-config.yaml +8 -0
  6. dv_pipecat_flows-0.0.0.dev1644/.python-version +1 -0
  7. dv_pipecat_flows-0.0.0.dev1644/.readthedocs.yaml +14 -0
  8. dv_pipecat_flows-0.0.0.dev1644/AGENTS.md +386 -0
  9. dv_pipecat_flows-0.0.0.dev1644/CHANGELOG.md +690 -0
  10. dv_pipecat_flows-0.0.0.dev1644/CLAUDE.md +8 -0
  11. dv_pipecat_flows-0.0.0.dev1644/CONTRIBUTING.md +320 -0
  12. dv_pipecat_flows-0.0.0.dev1644/LICENSE +24 -0
  13. dv_pipecat_flows-0.0.0.dev1644/MANIFEST.in +31 -0
  14. dv_pipecat_flows-0.0.0.dev1644/PKG-INFO +308 -0
  15. dv_pipecat_flows-0.0.0.dev1644/README.md +286 -0
  16. dv_pipecat_flows-0.0.0.dev1644/dev-requirements.txt +9 -0
  17. dv_pipecat_flows-0.0.0.dev1644/docker-compose.dev.yml +18 -0
  18. dv_pipecat_flows-0.0.0.dev1644/editor/.eslintrc.json +20 -0
  19. dv_pipecat_flows-0.0.0.dev1644/editor/.prettierrc +6 -0
  20. dv_pipecat_flows-0.0.0.dev1644/editor/css/tailwind.css +17 -0
  21. dv_pipecat_flows-0.0.0.dev1644/editor/examples/food_ordering.json +174 -0
  22. dv_pipecat_flows-0.0.0.dev1644/editor/examples/movie_explorer.json +143 -0
  23. dv_pipecat_flows-0.0.0.dev1644/editor/examples/patient_intake.json +266 -0
  24. dv_pipecat_flows-0.0.0.dev1644/editor/examples/restaurant_reservation.json +107 -0
  25. dv_pipecat_flows-0.0.0.dev1644/editor/examples/travel_planner.json +250 -0
  26. dv_pipecat_flows-0.0.0.dev1644/editor/favicon.png +0 -0
  27. dv_pipecat_flows-0.0.0.dev1644/editor/favicon.svg +7 -0
  28. dv_pipecat_flows-0.0.0.dev1644/editor/index.html +152 -0
  29. dv_pipecat_flows-0.0.0.dev1644/editor/js/editor/canvas.js +47 -0
  30. dv_pipecat_flows-0.0.0.dev1644/editor/js/editor/editorState.js +45 -0
  31. dv_pipecat_flows-0.0.0.dev1644/editor/js/editor/sidePanel.js +478 -0
  32. dv_pipecat_flows-0.0.0.dev1644/editor/js/editor/toolbar.js +159 -0
  33. dv_pipecat_flows-0.0.0.dev1644/editor/js/main.js +57 -0
  34. dv_pipecat_flows-0.0.0.dev1644/editor/js/nodes/baseNode.js +202 -0
  35. dv_pipecat_flows-0.0.0.dev1644/editor/js/nodes/endNode.js +82 -0
  36. dv_pipecat_flows-0.0.0.dev1644/editor/js/nodes/flowNode.js +34 -0
  37. dv_pipecat_flows-0.0.0.dev1644/editor/js/nodes/functionNode.js +237 -0
  38. dv_pipecat_flows-0.0.0.dev1644/editor/js/nodes/index.js +32 -0
  39. dv_pipecat_flows-0.0.0.dev1644/editor/js/nodes/mergeNode.js +69 -0
  40. dv_pipecat_flows-0.0.0.dev1644/editor/js/nodes/startNode.js +40 -0
  41. dv_pipecat_flows-0.0.0.dev1644/editor/js/types.js +48 -0
  42. dv_pipecat_flows-0.0.0.dev1644/editor/js/utils/export.js +186 -0
  43. dv_pipecat_flows-0.0.0.dev1644/editor/js/utils/helpers.js +22 -0
  44. dv_pipecat_flows-0.0.0.dev1644/editor/js/utils/import.js +204 -0
  45. dv_pipecat_flows-0.0.0.dev1644/editor/js/utils/validation.js +255 -0
  46. dv_pipecat_flows-0.0.0.dev1644/editor/jsdoc.json +24 -0
  47. dv_pipecat_flows-0.0.0.dev1644/editor/package-lock.json +5680 -0
  48. dv_pipecat_flows-0.0.0.dev1644/editor/package.json +37 -0
  49. dv_pipecat_flows-0.0.0.dev1644/editor/postcss.config.cjs +6 -0
  50. dv_pipecat_flows-0.0.0.dev1644/editor/public/favicon.png +0 -0
  51. dv_pipecat_flows-0.0.0.dev1644/editor/public/favicon.svg +7 -0
  52. dv_pipecat_flows-0.0.0.dev1644/editor/tailwind.config.cjs +34 -0
  53. dv_pipecat_flows-0.0.0.dev1644/editor/vercel.json +6 -0
  54. dv_pipecat_flows-0.0.0.dev1644/editor/vite.config.js +13 -0
  55. dv_pipecat_flows-0.0.0.dev1644/env.example +20 -0
  56. dv_pipecat_flows-0.0.0.dev1644/images/food-ordering-flow.png +0 -0
  57. dv_pipecat_flows-0.0.0.dev1644/pipecat-flows.png +0 -0
  58. dv_pipecat_flows-0.0.0.dev1644/pipecat_upgrade.md +138 -0
  59. dv_pipecat_flows-0.0.0.dev1644/pyproject.toml +80 -0
  60. dv_pipecat_flows-0.0.0.dev1644/remote-asterisk-code/README.md +307 -0
  61. dv_pipecat_flows-0.0.0.dev1644/remote-asterisk-code/extensions.conf +427 -0
  62. dv_pipecat_flows-0.0.0.dev1644/remote-asterisk-code/rtp.conf +163 -0
  63. dv_pipecat_flows-0.0.0.dev1644/requirements.txt +1 -0
  64. dv_pipecat_flows-0.0.0.dev1644/scripts/check-pypi-package.py +27 -0
  65. dv_pipecat_flows-0.0.0.dev1644/scripts/fix-ruff.sh +9 -0
  66. dv_pipecat_flows-0.0.0.dev1644/scripts/pre-commit.sh +27 -0
  67. dv_pipecat_flows-0.0.0.dev1644/setup.cfg +4 -0
  68. dv_pipecat_flows-0.0.0.dev1644/src/dv_pipecat_flows.egg-info/PKG-INFO +308 -0
  69. dv_pipecat_flows-0.0.0.dev1644/src/dv_pipecat_flows.egg-info/SOURCES.txt +78 -0
  70. dv_pipecat_flows-0.0.0.dev1644/src/dv_pipecat_flows.egg-info/dependency_links.txt +1 -0
  71. dv_pipecat_flows-0.0.0.dev1644/src/dv_pipecat_flows.egg-info/requires.txt +3 -0
  72. dv_pipecat_flows-0.0.0.dev1644/src/dv_pipecat_flows.egg-info/top_level.txt +1 -0
  73. dv_pipecat_flows-0.0.0.dev1644/src/pipecat_flows/__init__.py +60 -0
  74. dv_pipecat_flows-0.0.0.dev1644/src/pipecat_flows/actions.py +402 -0
  75. dv_pipecat_flows-0.0.0.dev1644/src/pipecat_flows/adapters.py +719 -0
  76. dv_pipecat_flows-0.0.0.dev1644/src/pipecat_flows/data_extractor.py +249 -0
  77. dv_pipecat_flows-0.0.0.dev1644/src/pipecat_flows/exceptions.py +62 -0
  78. dv_pipecat_flows-0.0.0.dev1644/src/pipecat_flows/manager.py +1374 -0
  79. dv_pipecat_flows-0.0.0.dev1644/src/pipecat_flows/types.py +453 -0
  80. dv_pipecat_flows-0.0.0.dev1644/uv.lock +3502 -0
@@ -0,0 +1,121 @@
1
+ ---
2
+ name: loki-logs
3
+ description: Fetch and analyze pipecat application logs from Loki by call ID or call SID. Use when debugging call issues, investigating errors, or analyzing bot behavior for a specific call. Accepts a call_id (UUID) or call_sid (numeric string like 3341710001) and optional environment (staging/production).
4
+ argument-hint: <call_id|call_sid> [staging|production]
5
+ allowed-tools: Bash(curl *), Bash(jq *)
6
+ ---
7
+
8
+ # Loki Logs Fetcher
9
+
10
+ Fetch logs from Loki for a specific pipecat call and analyze them.
11
+
12
+ ## Parameters
13
+
14
+ - `$0` — **call_id or call_sid** (required): Either a UUID (e.g. `f3df923e-d535-4eff-a3c8-fefbae0e73bf`) or a numeric call SID string (e.g. `3341710001`)
15
+ - `$1` — **environment** (optional): `production` (default) or `staging`
16
+
17
+ ## Instructions
18
+
19
+ When invoked, follow these steps:
20
+
21
+ ### 1. Parse arguments
22
+
23
+ ```
24
+ IDENTIFIER = $0
25
+ ENV = $1 (default: "production")
26
+ ```
27
+
28
+ If `ENV` is `prod`, normalize it to `production`.
29
+ If `IDENTIFIER` is missing, ask the user for it.
30
+
31
+ Detect the identifier type:
32
+ - **UUID format** (contains hyphens, hex chars, e.g. `f3df923e-d535-...`): This is a `call_id`
33
+ - **Numeric string** (digits only, e.g. `3341710001`): This is a `call_sid`
34
+
35
+ Both work the same way in the Loki query — they are used as a substring match (`|=`) against the log lines.
36
+
37
+ ### 2. Fetch logs from Loki
38
+
39
+ Use the Loki HTTP API at `http://35.154.72.110:3100` to query logs.
40
+
41
+ The LogQL query to use:
42
+
43
+ ```
44
+ {application="pipecat", environment="<ENV>"} |= `<IDENTIFIER>` | json | level=~"(?i)DEBUG|INFO|WARNING|ERROR|FATAL" | line_format `{{.message}}`
45
+ ```
46
+
47
+ Execute this curl command (default time range: last 24 hours):
48
+
49
+ **Timezone note:** If the user provides a specific time or time range, treat it as **IST (Asia/Kolkata, UTC+5:30)**. Convert to UTC epoch before querying Loki.
50
+
51
+ ```bash
52
+ # Calculate timestamps (nanoseconds) — default: last 24 hours
53
+ END=$(date +%s)000000000
54
+ START=$(( $(date +%s) - 86400 ))000000000
55
+
56
+ curl -s "http://35.154.72.110:3100/loki/api/v1/query_range" \
57
+ --data-urlencode "query={application=\"pipecat\", environment=\"<ENV>\"} |= \`<IDENTIFIER>\` | json | level=~\"(?i)DEBUG|INFO|WARNING|ERROR|FATAL\" | line_format \`{{.message}}\`" \
58
+ --data-urlencode "start=$START" \
59
+ --data-urlencode "end=$END" \
60
+ --data-urlencode "limit=5000" \
61
+ --data-urlencode "direction=forward" | jq .
62
+ ```
63
+
64
+ If the result set is empty and the environment was `production`, suggest trying `staging` (and vice versa).
65
+
66
+ If the result set is empty for both, try expanding the time range to 48 hours.
67
+
68
+ ### 3. Parse and display the logs
69
+
70
+ Extract the log lines from the Loki JSON response. The response structure is:
71
+
72
+ ```json
73
+ {
74
+ "data": {
75
+ "result": [
76
+ {
77
+ "values": [
78
+ ["<timestamp_ns>", "<log_line>"]
79
+ ]
80
+ }
81
+ ]
82
+ }
83
+ }
84
+ ```
85
+
86
+ Display the logs in chronological order (earliest first). Show:
87
+ - Timestamp (human-readable)
88
+ - Log level (if parseable)
89
+ - Message content
90
+
91
+ ### 4. Analyze the logs
92
+
93
+ After displaying the logs, provide a brief analysis:
94
+
95
+ 1. **Call timeline**: What happened during this call? (connected, greeted, conversation flow, ended)
96
+ 2. **Errors/warnings**: Highlight any ERROR or WARNING level logs
97
+ 3. **Tool calls**: List any function/tool calls made during the call
98
+ 4. **TTS/STT activity**: Note any speech-related events
99
+ 5. **Call outcome**: How did the call end? (normal hangup, error, transfer, timeout)
100
+ 6. **Anomalies**: Flag anything unusual (long silences, repeated errors, unexpected state transitions)
101
+
102
+ ### 5. Grafana link
103
+
104
+ Always provide a clickable Grafana Explore link for the user to view the logs in the browser:
105
+
106
+ ```
107
+ http://35.154.72.110:3000/explore?schemaVersion=1&panes=%7B%221f1%22%3A%7B%22datasource%22%3A%22eeey6hiactdz4c%22%2C%22queries%22%3A%5B%7B%22datasource%22%3A%7B%22type%22%3A%22loki%22%2C%22uid%22%3A%22eeey6hiactdz4c%22%7D%2C%22direction%22%3A%22backward%22%2C%22editorMode%22%3A%22code%22%2C%22expr%22%3A%22%7Bapplication%3D%5C%22pipecat%5C%22%2C+environment%3D%5C%22<ENV>%5C%22%7D+%7C%3D+%60<IDENTIFIER>%60+%7C+json+%7C+level%3D%7E%5C%22%28%3Fi%29DEBUG%7CINFO%7CWARNING%7CERROR%7C+FATAL%5C%22+%7C+line_format+%60%7B%7B.message%7D%7D%60%22%2C%22queryType%22%3A%22range%22%2C%22refId%22%3A%22A%22%7D%5D%2C%22range%22%3A%7B%22from%22%3A%22now-6h%22%2C%22to%22%3A%22now%22%7D%2C%22compact%22%3Afalse%7D%7D&orgId=1
108
+ ```
109
+
110
+ Replace `<ENV>` and `<IDENTIFIER>` in the URL with the actual values (URL-encoded where needed).
111
+
112
+ ## Troubleshooting
113
+
114
+ - If curl times out, the Loki instance may be under heavy load — retry with a shorter time range or lower limit.
115
+ - If you get no results, confirm the call_id is correct and try the other environment.
116
+ - For very old calls (>48h), increase the time range or ask the user for an approximate time window.
117
+ - All user-provided times are in **IST (UTC+5:30)** — convert to UTC epoch before querying.
118
+
119
+ ## Reference
120
+
121
+ For LogQL query syntax and more filtering options, see [query-reference.md](query-reference.md).
@@ -0,0 +1,113 @@
1
+ # LogQL Query Reference for Pipecat Logs
2
+
3
+ ## Base Query Pattern
4
+
5
+ ```logql
6
+ {application="pipecat", environment="<env>"} |= `<call_id>` | json | level=~"(?i)DEBUG|INFO|WARNING|ERROR|FATAL" | line_format `{{.message}}`
7
+ ```
8
+
9
+ ## Common Variations
10
+
11
+ ### Filter by log level
12
+
13
+ **Errors only:**
14
+ ```logql
15
+ {application="pipecat", environment="staging"} |= `<call_id>` | json | level=~"(?i)ERROR|FATAL" | line_format `{{.message}}`
16
+ ```
17
+
18
+ **Warnings and above:**
19
+ ```logql
20
+ {application="pipecat", environment="staging"} |= `<call_id>` | json | level=~"(?i)WARNING|ERROR|FATAL" | line_format `{{.message}}`
21
+ ```
22
+
23
+ ### Filter by keyword
24
+
25
+ **LLM-related logs:**
26
+ ```logql
27
+ {application="pipecat", environment="staging"} |= `<call_id>` | json | level=~"(?i)DEBUG|INFO|WARNING|ERROR|FATAL" | line_format `{{.message}}` |= "LLM"
28
+ ```
29
+
30
+ **TTS-related logs:**
31
+ ```logql
32
+ {application="pipecat", environment="staging"} |= `<call_id>` | json | line_format `{{.message}}` |= "TTS"
33
+ ```
34
+
35
+ **Tool/function call logs:**
36
+ ```logql
37
+ {application="pipecat", environment="staging"} |= `<call_id>` | json | line_format `{{.message}}` |~ "function|tool_call|generic_function"
38
+ ```
39
+
40
+ **VAD/speech detection:**
41
+ ```logql
42
+ {application="pipecat", environment="staging"} |= `<call_id>` | json | line_format `{{.message}}` |~ "VAD|speaking|speech|silence|idle"
43
+ ```
44
+
45
+ ### Search across all calls in an environment
46
+
47
+ **Recent errors (no call_id filter):**
48
+ ```logql
49
+ {application="pipecat", environment="staging"} | json | level=~"(?i)ERROR|FATAL" | line_format `{{.message}}`
50
+ ```
51
+
52
+ **By pod name:**
53
+ ```logql
54
+ {application="pipecat", environment="staging", pod=~"pipecat-.*"} | json | line_format `{{.message}}`
55
+ ```
56
+
57
+ ## Loki API Endpoints
58
+
59
+ | Endpoint | Purpose |
60
+ |----------|---------|
61
+ | `GET /loki/api/v1/query_range` | Query logs over a time range |
62
+ | `GET /loki/api/v1/query` | Query logs at a single point in time |
63
+ | `GET /loki/api/v1/labels` | List all label names |
64
+ | `GET /loki/api/v1/label/<name>/values` | List values for a label |
65
+ | `GET /loki/api/v1/tail` | Stream logs via WebSocket |
66
+
67
+ ### API Parameters for query_range
68
+
69
+ | Parameter | Description | Example |
70
+ |-----------|-------------|---------|
71
+ | `query` | LogQL query string | `{application="pipecat"}` |
72
+ | `start` | Start timestamp (nanoseconds or RFC3339) | `1609459200000000000` |
73
+ | `end` | End timestamp (nanoseconds or RFC3339) | `1609545600000000000` |
74
+ | `limit` | Max entries to return | `5000` |
75
+ | `direction` | Sort order: `forward` or `backward` | `forward` |
76
+ | `step` | Query resolution step (for metrics) | `60s` |
77
+
78
+ ## Response Structure
79
+
80
+ ```json
81
+ {
82
+ "status": "success",
83
+ "data": {
84
+ "resultType": "streams",
85
+ "result": [
86
+ {
87
+ "stream": {
88
+ "application": "pipecat",
89
+ "environment": "staging",
90
+ "level": "INFO"
91
+ },
92
+ "values": [
93
+ ["1700000000000000000", "log message here"],
94
+ ["1700000001000000000", "another log message"]
95
+ ]
96
+ }
97
+ ]
98
+ }
99
+ }
100
+ ```
101
+
102
+ ## Environment Values
103
+
104
+ | Environment | Label Value | Description |
105
+ |-------------|-------------|-------------|
106
+ | Staging | `staging` | Test/staging environment |
107
+ | Production | `production` | Live production environment |
108
+
109
+ ## Infrastructure
110
+
111
+ - **Loki endpoint**: `http://35.154.72.110:3100`
112
+ - **Grafana UI**: `http://35.154.72.110:3000`
113
+ - **Loki datasource UID**: `eeey6hiactdz4c`
@@ -0,0 +1,2 @@
1
+ ringg-bot/krisp_wheels/*.whl filter=lfs diff=lfs merge=lfs -text
2
+ ringg-bot/models/*.kef filter=lfs diff=lfs merge=lfs -text
@@ -0,0 +1,184 @@
1
+ .vscode
2
+ env/
3
+ __pycache__/
4
+ *~
5
+ venv
6
+ .venv
7
+ /.idea
8
+ #*#
9
+ data/
10
+ # Dependencies
11
+ node_modules/
12
+ npm-debug.log*
13
+ yarn-debug.log*
14
+ yarn-error.log*
15
+ .pnpm-debug.log*
16
+
17
+ # Production build
18
+ dist/
19
+ build/
20
+
21
+ # IDE - VSCode
22
+ .vscode/
23
+ *.code-workspace
24
+ .history
25
+
26
+ # IDE - WebStorm/IntelliJ
27
+ .idea/
28
+ *.iml
29
+ *.iws
30
+ *.ipr
31
+
32
+ # IDE - Sublime Text
33
+ *.sublime-workspace
34
+ *.sublime-project
35
+
36
+ # macOS
37
+ .DS_Store
38
+ .AppleDouble
39
+ .LSOverride
40
+ ._*
41
+
42
+ # Windows
43
+ Thumbs.db
44
+ Thumbs.db:encryptable
45
+ ehthumbs.db
46
+ ehthumbs_vista.db
47
+ *.lnk
48
+
49
+ # Local development settings
50
+ .env
51
+ .env.local
52
+ .env.development.local
53
+ .env.test.local
54
+ .env.production.local
55
+
56
+ # Debug logs
57
+ logs/
58
+ *.log
59
+ npm-debug.log*
60
+
61
+ # Optional: Cache directories
62
+ .cache/
63
+ .npm/
64
+ .eslintcache
65
+
66
+ # Optional: Editor directories and files
67
+ .project
68
+ .settings/
69
+ *.suo
70
+ *.ntvs*
71
+ *.njsproj
72
+ *.sln
73
+ *.sw?
74
+
75
+ # Auto-generated docs
76
+ docs/api
77
+ docs/_build/
78
+
79
+ # Python
80
+ __pycache__/
81
+ *.py[cod]
82
+ *$py.class
83
+ *.so
84
+ .Python
85
+ develop-eggs/
86
+ downloads/
87
+ eggs/
88
+ .eggs/
89
+ lib/
90
+ lib64/
91
+ parts/
92
+ sdist/
93
+ var/
94
+ wheels/
95
+ *.egg-info/
96
+ .installed.cfg
97
+ *.egg
98
+ MANIFEST
99
+ .python-version
100
+ *.pyc
101
+
102
+ # Virtual Environment
103
+ venv/
104
+ ENV/
105
+ env/
106
+ .env/
107
+ .venv/
108
+ env.bak/
109
+ venv.bak/
110
+
111
+ # Testing
112
+ .tox/
113
+ .coverage
114
+ .coverage.*
115
+ .cache
116
+ nosetests.xml
117
+ coverage.xml
118
+ *.cover
119
+ .hypothesis/
120
+ .pytest_cache/
121
+ htmlcov/
122
+
123
+ # mypy
124
+ .mypy_cache/
125
+ .dmypy.json
126
+ dmypy.json
127
+
128
+ # Jupyter Notebook
129
+ .ipynb_checkpoints
130
+
131
+ # IPython
132
+ profile_default/
133
+ ipython_config.py
134
+
135
+ # Spyder project settings
136
+ .spyderproject
137
+ .spyproject
138
+
139
+ # Rope project settings
140
+ .ropeproject
141
+
142
+ # Distribution / packaging
143
+ .Python
144
+ build/
145
+ develop-eggs/
146
+ pipecat_dist/
147
+ dist/
148
+ downloads/
149
+ eggs/
150
+ .eggs/
151
+ lib/
152
+ lib64/
153
+ parts/
154
+ sdist/
155
+ var/
156
+ wheels/
157
+ share/python-wheels/
158
+ *.egg-info/
159
+ .installed.cfg
160
+ *.egg
161
+ MANIFEST
162
+ .DS_Store
163
+ .env
164
+ fly.toml
165
+
166
+ # macOS
167
+ .DS_Store
168
+
169
+ # Documentation
170
+ docs/api/_build/
171
+ docs/api/api
172
+ memory-bank/
173
+
174
+ # Logs
175
+ logs/*
176
+
177
+ # Repomix
178
+ repomix*
179
+
180
+ creds.json
181
+ MANIFEST
182
+
183
+ # Asterisk configs
184
+ remote-asterisk-code/pjsip.conf
@@ -0,0 +1,8 @@
1
+ repos:
2
+ - repo: https://github.com/astral-sh/ruff-pre-commit
3
+ rev: v0.9.7
4
+ hooks:
5
+ - id: ruff
6
+ language_version: python3
7
+ args: [--fix]
8
+ - id: ruff-format
@@ -0,0 +1 @@
1
+ 3.12.0
@@ -0,0 +1,14 @@
1
+ version: 2
2
+
3
+ build:
4
+ os: ubuntu-22.04
5
+ tools:
6
+ python: '3.12'
7
+ jobs:
8
+ post_install:
9
+ - pip install uv
10
+ - UV_PROJECT_ENVIRONMENT=$READTHEDOCS_VIRTUALENV_PATH uv sync --group docs
11
+
12
+ sphinx:
13
+ configuration: docs/conf.py
14
+ fail_on_warning: false