@weirdfingers/baseboards 0.9.5 → 0.9.7

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 (237) hide show
  1. package/dist/index.js +561 -469
  2. package/dist/index.js.map +1 -1
  3. package/package.json +2 -5
  4. package/templates/README.md +0 -122
  5. package/templates/api/.env.example +0 -65
  6. package/templates/api/ARTIFACT_RESOLUTION_GUIDE.md +0 -148
  7. package/templates/api/Dockerfile +0 -32
  8. package/templates/api/README.md +0 -264
  9. package/templates/api/alembic/env.py +0 -114
  10. package/templates/api/alembic/script.py.mako +0 -28
  11. package/templates/api/alembic/versions/20250101_000000_initial_schema.py +0 -506
  12. package/templates/api/alembic/versions/20251022_174729_remove_provider_name_from_generations.py +0 -75
  13. package/templates/api/alembic/versions/20251023_165852_switch_to_declarative_base_and_mapping.py +0 -467
  14. package/templates/api/alembic/versions/20251202_000000_add_artifact_lineage.py +0 -134
  15. package/templates/api/alembic/versions/2025925_62735_add_seed_data_for_default_tenant.py +0 -88
  16. package/templates/api/alembic.ini +0 -36
  17. package/templates/api/config/generators.yaml +0 -237
  18. package/templates/api/config/storage_config.yaml +0 -26
  19. package/templates/api/docs/ADDING_GENERATORS.md +0 -409
  20. package/templates/api/docs/GENERATORS_API.md +0 -502
  21. package/templates/api/docs/MIGRATIONS.md +0 -472
  22. package/templates/api/docs/TESTING_LIVE_APIS.md +0 -417
  23. package/templates/api/docs/storage_providers.md +0 -337
  24. package/templates/api/pyproject.toml +0 -205
  25. package/templates/api/src/boards/__init__.py +0 -10
  26. package/templates/api/src/boards/api/app.py +0 -172
  27. package/templates/api/src/boards/api/auth.py +0 -75
  28. package/templates/api/src/boards/api/endpoints/__init__.py +0 -3
  29. package/templates/api/src/boards/api/endpoints/jobs.py +0 -76
  30. package/templates/api/src/boards/api/endpoints/setup.py +0 -505
  31. package/templates/api/src/boards/api/endpoints/sse.py +0 -129
  32. package/templates/api/src/boards/api/endpoints/storage.py +0 -155
  33. package/templates/api/src/boards/api/endpoints/tenant_registration.py +0 -296
  34. package/templates/api/src/boards/api/endpoints/uploads.py +0 -149
  35. package/templates/api/src/boards/api/endpoints/webhooks.py +0 -13
  36. package/templates/api/src/boards/auth/__init__.py +0 -15
  37. package/templates/api/src/boards/auth/adapters/__init__.py +0 -27
  38. package/templates/api/src/boards/auth/adapters/auth0.py +0 -220
  39. package/templates/api/src/boards/auth/adapters/base.py +0 -73
  40. package/templates/api/src/boards/auth/adapters/clerk.py +0 -172
  41. package/templates/api/src/boards/auth/adapters/jwt.py +0 -122
  42. package/templates/api/src/boards/auth/adapters/none.py +0 -102
  43. package/templates/api/src/boards/auth/adapters/oidc.py +0 -284
  44. package/templates/api/src/boards/auth/adapters/supabase.py +0 -110
  45. package/templates/api/src/boards/auth/context.py +0 -35
  46. package/templates/api/src/boards/auth/factory.py +0 -129
  47. package/templates/api/src/boards/auth/middleware.py +0 -221
  48. package/templates/api/src/boards/auth/provisioning.py +0 -129
  49. package/templates/api/src/boards/auth/tenant_extraction.py +0 -278
  50. package/templates/api/src/boards/cli.py +0 -354
  51. package/templates/api/src/boards/config.py +0 -131
  52. package/templates/api/src/boards/database/__init__.py +0 -7
  53. package/templates/api/src/boards/database/cli.py +0 -110
  54. package/templates/api/src/boards/database/connection.py +0 -292
  55. package/templates/api/src/boards/database/models.py +0 -19
  56. package/templates/api/src/boards/database/seed_data.py +0 -182
  57. package/templates/api/src/boards/dbmodels/__init__.py +0 -441
  58. package/templates/api/src/boards/generators/__init__.py +0 -57
  59. package/templates/api/src/boards/generators/artifact_resolution.py +0 -405
  60. package/templates/api/src/boards/generators/artifacts.py +0 -53
  61. package/templates/api/src/boards/generators/base.py +0 -144
  62. package/templates/api/src/boards/generators/implementations/__init__.py +0 -14
  63. package/templates/api/src/boards/generators/implementations/fal/__init__.py +0 -25
  64. package/templates/api/src/boards/generators/implementations/fal/audio/__init__.py +0 -23
  65. package/templates/api/src/boards/generators/implementations/fal/audio/beatoven_music_generation.py +0 -171
  66. package/templates/api/src/boards/generators/implementations/fal/audio/beatoven_sound_effect_generation.py +0 -167
  67. package/templates/api/src/boards/generators/implementations/fal/audio/chatterbox_text_to_speech.py +0 -176
  68. package/templates/api/src/boards/generators/implementations/fal/audio/chatterbox_tts_turbo.py +0 -195
  69. package/templates/api/src/boards/generators/implementations/fal/audio/elevenlabs_sound_effects_v2.py +0 -194
  70. package/templates/api/src/boards/generators/implementations/fal/audio/elevenlabs_tts_eleven_v3.py +0 -209
  71. package/templates/api/src/boards/generators/implementations/fal/audio/fal_elevenlabs_tts_turbo_v2_5.py +0 -206
  72. package/templates/api/src/boards/generators/implementations/fal/audio/fal_minimax_speech_26_hd.py +0 -237
  73. package/templates/api/src/boards/generators/implementations/fal/audio/minimax_music_v2.py +0 -173
  74. package/templates/api/src/boards/generators/implementations/fal/audio/minimax_speech_2_6_turbo.py +0 -221
  75. package/templates/api/src/boards/generators/implementations/fal/image/__init__.py +0 -63
  76. package/templates/api/src/boards/generators/implementations/fal/image/bytedance_seedream_v45_edit.py +0 -219
  77. package/templates/api/src/boards/generators/implementations/fal/image/clarity_upscaler.py +0 -220
  78. package/templates/api/src/boards/generators/implementations/fal/image/crystal_upscaler.py +0 -173
  79. package/templates/api/src/boards/generators/implementations/fal/image/fal_ideogram_character.py +0 -227
  80. package/templates/api/src/boards/generators/implementations/fal/image/flux_2.py +0 -203
  81. package/templates/api/src/boards/generators/implementations/fal/image/flux_2_edit.py +0 -230
  82. package/templates/api/src/boards/generators/implementations/fal/image/flux_2_pro.py +0 -204
  83. package/templates/api/src/boards/generators/implementations/fal/image/flux_2_pro_edit.py +0 -221
  84. package/templates/api/src/boards/generators/implementations/fal/image/flux_pro_kontext.py +0 -216
  85. package/templates/api/src/boards/generators/implementations/fal/image/flux_pro_ultra.py +0 -197
  86. package/templates/api/src/boards/generators/implementations/fal/image/gemini_25_flash_image.py +0 -177
  87. package/templates/api/src/boards/generators/implementations/fal/image/gemini_25_flash_image_edit.py +0 -208
  88. package/templates/api/src/boards/generators/implementations/fal/image/gpt_image_15_edit.py +0 -216
  89. package/templates/api/src/boards/generators/implementations/fal/image/gpt_image_1_5.py +0 -177
  90. package/templates/api/src/boards/generators/implementations/fal/image/gpt_image_1_edit_image.py +0 -182
  91. package/templates/api/src/boards/generators/implementations/fal/image/gpt_image_1_mini.py +0 -167
  92. package/templates/api/src/boards/generators/implementations/fal/image/ideogram_character_edit.py +0 -299
  93. package/templates/api/src/boards/generators/implementations/fal/image/ideogram_v2.py +0 -190
  94. package/templates/api/src/boards/generators/implementations/fal/image/imagen4_preview.py +0 -191
  95. package/templates/api/src/boards/generators/implementations/fal/image/imagen4_preview_fast.py +0 -179
  96. package/templates/api/src/boards/generators/implementations/fal/image/nano_banana.py +0 -183
  97. package/templates/api/src/boards/generators/implementations/fal/image/nano_banana_edit.py +0 -212
  98. package/templates/api/src/boards/generators/implementations/fal/image/nano_banana_pro.py +0 -179
  99. package/templates/api/src/boards/generators/implementations/fal/image/nano_banana_pro_edit.py +0 -226
  100. package/templates/api/src/boards/generators/implementations/fal/image/qwen_image.py +0 -249
  101. package/templates/api/src/boards/generators/implementations/fal/image/qwen_image_edit.py +0 -244
  102. package/templates/api/src/boards/generators/implementations/fal/image/reve_edit.py +0 -178
  103. package/templates/api/src/boards/generators/implementations/fal/image/reve_text_to_image.py +0 -155
  104. package/templates/api/src/boards/generators/implementations/fal/image/seedream_v45_text_to_image.py +0 -180
  105. package/templates/api/src/boards/generators/implementations/fal/utils.py +0 -61
  106. package/templates/api/src/boards/generators/implementations/fal/video/__init__.py +0 -77
  107. package/templates/api/src/boards/generators/implementations/fal/video/bytedance_seedance_v1_pro_text_to_video.py +0 -209
  108. package/templates/api/src/boards/generators/implementations/fal/video/creatify_lipsync.py +0 -161
  109. package/templates/api/src/boards/generators/implementations/fal/video/fal_bytedance_seedance_v1_pro_image_to_video.py +0 -222
  110. package/templates/api/src/boards/generators/implementations/fal/video/fal_minimax_hailuo_02_standard_text_to_video.py +0 -152
  111. package/templates/api/src/boards/generators/implementations/fal/video/fal_pixverse_lipsync.py +0 -197
  112. package/templates/api/src/boards/generators/implementations/fal/video/fal_sora_2_text_to_video.py +0 -173
  113. package/templates/api/src/boards/generators/implementations/fal/video/infinitalk.py +0 -221
  114. package/templates/api/src/boards/generators/implementations/fal/video/kling_video_ai_avatar_v2_pro.py +0 -168
  115. package/templates/api/src/boards/generators/implementations/fal/video/kling_video_ai_avatar_v2_standard.py +0 -159
  116. package/templates/api/src/boards/generators/implementations/fal/video/kling_video_v2_5_turbo_pro_image_to_video.py +0 -175
  117. package/templates/api/src/boards/generators/implementations/fal/video/kling_video_v2_5_turbo_pro_text_to_video.py +0 -168
  118. package/templates/api/src/boards/generators/implementations/fal/video/minimax_hailuo_2_3_pro_image_to_video.py +0 -153
  119. package/templates/api/src/boards/generators/implementations/fal/video/sora2_image_to_video.py +0 -172
  120. package/templates/api/src/boards/generators/implementations/fal/video/sora_2_image_to_video_pro.py +0 -175
  121. package/templates/api/src/boards/generators/implementations/fal/video/sora_2_text_to_video_pro.py +0 -163
  122. package/templates/api/src/boards/generators/implementations/fal/video/sync_lipsync_v2.py +0 -167
  123. package/templates/api/src/boards/generators/implementations/fal/video/sync_lipsync_v2_pro.py +0 -155
  124. package/templates/api/src/boards/generators/implementations/fal/video/veed_fabric_1_0.py +0 -180
  125. package/templates/api/src/boards/generators/implementations/fal/video/veed_lipsync.py +0 -174
  126. package/templates/api/src/boards/generators/implementations/fal/video/veo3.py +0 -194
  127. package/templates/api/src/boards/generators/implementations/fal/video/veo31.py +0 -190
  128. package/templates/api/src/boards/generators/implementations/fal/video/veo31_fast.py +0 -190
  129. package/templates/api/src/boards/generators/implementations/fal/video/veo31_fast_image_to_video.py +0 -191
  130. package/templates/api/src/boards/generators/implementations/fal/video/veo31_first_last_frame_to_video.py +0 -187
  131. package/templates/api/src/boards/generators/implementations/fal/video/veo31_image_to_video.py +0 -183
  132. package/templates/api/src/boards/generators/implementations/fal/video/veo31_reference_to_video.py +0 -172
  133. package/templates/api/src/boards/generators/implementations/fal/video/wan_25_preview_image_to_video.py +0 -212
  134. package/templates/api/src/boards/generators/implementations/fal/video/wan_25_preview_text_to_video.py +0 -208
  135. package/templates/api/src/boards/generators/implementations/fal/video/wan_pro_image_to_video.py +0 -158
  136. package/templates/api/src/boards/generators/implementations/kie/__init__.py +0 -11
  137. package/templates/api/src/boards/generators/implementations/kie/base.py +0 -316
  138. package/templates/api/src/boards/generators/implementations/kie/image/__init__.py +0 -3
  139. package/templates/api/src/boards/generators/implementations/kie/image/nano_banana_edit.py +0 -190
  140. package/templates/api/src/boards/generators/implementations/kie/utils.py +0 -98
  141. package/templates/api/src/boards/generators/implementations/kie/video/__init__.py +0 -8
  142. package/templates/api/src/boards/generators/implementations/kie/video/veo3.py +0 -161
  143. package/templates/api/src/boards/generators/implementations/openai/__init__.py +0 -1
  144. package/templates/api/src/boards/generators/implementations/openai/audio/__init__.py +0 -1
  145. package/templates/api/src/boards/generators/implementations/openai/audio/whisper.py +0 -69
  146. package/templates/api/src/boards/generators/implementations/openai/image/__init__.py +0 -1
  147. package/templates/api/src/boards/generators/implementations/openai/image/dalle3.py +0 -96
  148. package/templates/api/src/boards/generators/implementations/replicate/__init__.py +0 -1
  149. package/templates/api/src/boards/generators/implementations/replicate/image/__init__.py +0 -1
  150. package/templates/api/src/boards/generators/implementations/replicate/image/flux_pro.py +0 -88
  151. package/templates/api/src/boards/generators/implementations/replicate/video/__init__.py +0 -1
  152. package/templates/api/src/boards/generators/implementations/replicate/video/lipsync.py +0 -73
  153. package/templates/api/src/boards/generators/loader.py +0 -253
  154. package/templates/api/src/boards/generators/registry.py +0 -114
  155. package/templates/api/src/boards/generators/resolution.py +0 -632
  156. package/templates/api/src/boards/generators/testmods/class_gen.py +0 -34
  157. package/templates/api/src/boards/generators/testmods/import_side_effect.py +0 -35
  158. package/templates/api/src/boards/graphql/__init__.py +0 -7
  159. package/templates/api/src/boards/graphql/access_control.py +0 -136
  160. package/templates/api/src/boards/graphql/mutations/root.py +0 -148
  161. package/templates/api/src/boards/graphql/queries/root.py +0 -116
  162. package/templates/api/src/boards/graphql/resolvers/__init__.py +0 -8
  163. package/templates/api/src/boards/graphql/resolvers/auth.py +0 -12
  164. package/templates/api/src/boards/graphql/resolvers/board.py +0 -1053
  165. package/templates/api/src/boards/graphql/resolvers/generation.py +0 -666
  166. package/templates/api/src/boards/graphql/resolvers/generator.py +0 -50
  167. package/templates/api/src/boards/graphql/resolvers/lineage.py +0 -381
  168. package/templates/api/src/boards/graphql/resolvers/upload.py +0 -463
  169. package/templates/api/src/boards/graphql/resolvers/user.py +0 -25
  170. package/templates/api/src/boards/graphql/schema.py +0 -81
  171. package/templates/api/src/boards/graphql/types/board.py +0 -102
  172. package/templates/api/src/boards/graphql/types/generation.py +0 -166
  173. package/templates/api/src/boards/graphql/types/generator.py +0 -17
  174. package/templates/api/src/boards/graphql/types/user.py +0 -47
  175. package/templates/api/src/boards/jobs/repository.py +0 -153
  176. package/templates/api/src/boards/logging.py +0 -195
  177. package/templates/api/src/boards/middleware.py +0 -339
  178. package/templates/api/src/boards/progress/__init__.py +0 -4
  179. package/templates/api/src/boards/progress/models.py +0 -25
  180. package/templates/api/src/boards/progress/publisher.py +0 -64
  181. package/templates/api/src/boards/py.typed +0 -0
  182. package/templates/api/src/boards/redis_pool.py +0 -118
  183. package/templates/api/src/boards/storage/__init__.py +0 -52
  184. package/templates/api/src/boards/storage/base.py +0 -363
  185. package/templates/api/src/boards/storage/config.py +0 -187
  186. package/templates/api/src/boards/storage/factory.py +0 -288
  187. package/templates/api/src/boards/storage/implementations/__init__.py +0 -27
  188. package/templates/api/src/boards/storage/implementations/gcs.py +0 -340
  189. package/templates/api/src/boards/storage/implementations/local.py +0 -201
  190. package/templates/api/src/boards/storage/implementations/s3.py +0 -294
  191. package/templates/api/src/boards/storage/implementations/supabase.py +0 -218
  192. package/templates/api/src/boards/tenant_isolation.py +0 -446
  193. package/templates/api/src/boards/validation.py +0 -262
  194. package/templates/api/src/boards/workers/__init__.py +0 -1
  195. package/templates/api/src/boards/workers/actors.py +0 -274
  196. package/templates/api/src/boards/workers/cli.py +0 -125
  197. package/templates/api/src/boards/workers/context.py +0 -348
  198. package/templates/api/src/boards/workers/middleware.py +0 -58
  199. package/templates/api/src/py.typed +0 -0
  200. package/templates/compose.web.yaml +0 -35
  201. package/templates/compose.yaml +0 -116
  202. package/templates/docker/env.example +0 -23
  203. package/templates/web/.env.example +0 -28
  204. package/templates/web/Dockerfile +0 -51
  205. package/templates/web/components.json +0 -22
  206. package/templates/web/imageLoader.js +0 -18
  207. package/templates/web/next-env.d.ts +0 -5
  208. package/templates/web/next.config.js +0 -36
  209. package/templates/web/package.json +0 -41
  210. package/templates/web/postcss.config.mjs +0 -7
  211. package/templates/web/public/favicon.ico +0 -0
  212. package/templates/web/src/app/boards/[boardId]/page.tsx +0 -353
  213. package/templates/web/src/app/globals.css +0 -123
  214. package/templates/web/src/app/layout.tsx +0 -31
  215. package/templates/web/src/app/lineage/[generationId]/page.tsx +0 -235
  216. package/templates/web/src/app/page.tsx +0 -35
  217. package/templates/web/src/app/providers.tsx +0 -18
  218. package/templates/web/src/components/boards/ArtifactInputSlots.tsx +0 -206
  219. package/templates/web/src/components/boards/ArtifactPreview.tsx +0 -466
  220. package/templates/web/src/components/boards/GenerationGrid.tsx +0 -282
  221. package/templates/web/src/components/boards/GenerationInput.tsx +0 -370
  222. package/templates/web/src/components/boards/GeneratorSelector.tsx +0 -272
  223. package/templates/web/src/components/boards/UploadArtifact.tsx +0 -563
  224. package/templates/web/src/components/header.tsx +0 -32
  225. package/templates/web/src/components/theme-provider.tsx +0 -10
  226. package/templates/web/src/components/theme-toggle.tsx +0 -75
  227. package/templates/web/src/components/ui/alert-dialog.tsx +0 -157
  228. package/templates/web/src/components/ui/button.tsx +0 -58
  229. package/templates/web/src/components/ui/card.tsx +0 -92
  230. package/templates/web/src/components/ui/dropdown-menu.tsx +0 -200
  231. package/templates/web/src/components/ui/navigation-menu.tsx +0 -168
  232. package/templates/web/src/components/ui/toast.tsx +0 -128
  233. package/templates/web/src/components/ui/toaster.tsx +0 -35
  234. package/templates/web/src/components/ui/use-toast.ts +0 -187
  235. package/templates/web/src/hooks/useGeneratorMRU.ts +0 -57
  236. package/templates/web/src/lib/utils.ts +0 -6
  237. package/templates/web/tsconfig.json +0 -41
@@ -1,417 +0,0 @@
1
- # Live API Testing Guide for Generators
2
-
3
- This guide explains how to test generators with real provider APIs (Replicate, Fal.ai, OpenAI, etc.) rather than mocked responses.
4
-
5
- ## Overview
6
-
7
- Boards includes two types of generator tests:
8
-
9
- 1. **Unit tests** (`test_<generator>.py`) - Use mocks, run by default, fast and free
10
- 2. **Live API tests** (`test_<generator>_live.py`) - Call real APIs, opt-in only, consume credits
11
-
12
- Live API tests are **never run by default**. They must be explicitly invoked and require valid API keys.
13
-
14
- ## When to Run Live API Tests
15
-
16
- Run live API tests when:
17
-
18
- - ✅ You've modified a generator implementation
19
- - ✅ You've updated a provider SDK dependency
20
- - ✅ You want to verify real API connectivity
21
- - ✅ You're debugging unexpected behavior in production
22
- - ✅ Before releasing a new generator to production
23
-
24
- **Don't run live tests:**
25
-
26
- - ❌ During regular development (use unit tests instead)
27
- - ❌ In pre-commit hooks
28
- - ❌ As part of `make test` or `make test-backend`
29
- - ❌ In CI/CD pipelines (unless explicitly configured)
30
-
31
- ## Setting Up API Keys
32
-
33
- Live tests require provider API keys. There are two ways to configure them:
34
-
35
- ### Option 1: Via Environment Variables (Direct)
36
-
37
- ```bash
38
- # Replicate
39
- export REPLICATE_API_TOKEN="r8_..."
40
-
41
- # Fal.ai
42
- export FAL_KEY="..."
43
-
44
- # OpenAI
45
- export OPENAI_API_KEY="sk-..."
46
- ```
47
-
48
- ### Option 2: Via Boards Configuration (Recommended)
49
-
50
- ```bash
51
- # Single key
52
- export BOARDS_GENERATOR_API_KEYS='{"REPLICATE_API_TOKEN": "r8_..."}'
53
-
54
- # Multiple keys (JSON format)
55
- export BOARDS_GENERATOR_API_KEYS='{
56
- "REPLICATE_API_TOKEN": "r8_...",
57
- "FAL_KEY": "...",
58
- "OPENAI_API_KEY": "sk-..."
59
- }'
60
- ```
61
-
62
- Or add to your `.env` file:
63
-
64
- ```bash
65
- BOARDS_GENERATOR_API_KEYS={"REPLICATE_API_TOKEN": "r8_..."}
66
- ```
67
-
68
- The Boards config system will automatically sync these keys to `os.environ` for third-party SDKs.
69
-
70
- ## Running Live API Tests
71
-
72
- ### Run a Single Generator's Live Test
73
-
74
- This is the **most common workflow** when developing generators:
75
-
76
- ```bash
77
- # After modifying flux_pro.py
78
- export REPLICATE_API_TOKEN="r8_..."
79
- pytest tests/generators/implementations/test_flux_pro_live.py -v -m live_api
80
- ```
81
-
82
- Example output:
83
- ```
84
- tests/generators/implementations/test_flux_pro_live.py::TestFluxProGeneratorLive::test_generate_basic PASSED
85
- tests/generators/implementations/test_flux_pro_live.py::TestFluxProGeneratorLive::test_generate_with_aspect_ratio PASSED
86
- ```
87
-
88
- If the API key is missing, tests will be skipped:
89
- ```
90
- tests/generators/implementations/test_flux_pro_live.py::TestFluxProGeneratorLive::test_generate_basic SKIPPED (REPLICATE_API_TOKEN not set)
91
- ```
92
-
93
- ### Run All Live Tests for One Provider
94
-
95
- ```bash
96
- # All Replicate generators
97
- export REPLICATE_API_TOKEN="r8_..."
98
- pytest -m live_replicate -v
99
-
100
- # All Fal generators
101
- export FAL_KEY="..."
102
- pytest -m live_fal -v
103
-
104
- # All OpenAI generators
105
- export OPENAI_API_KEY="sk-..."
106
- pytest -m live_openai -v
107
- ```
108
-
109
- ### Run All Live API Tests (Rarely Used)
110
-
111
- ```bash
112
- # Requires ALL provider API keys to be set
113
- export REPLICATE_API_TOKEN="r8_..."
114
- export FAL_KEY="..."
115
- export OPENAI_API_KEY="sk-..."
116
-
117
- pytest -m live_api -v
118
- ```
119
-
120
- ⚠️ **Warning:** This will consume credits across all providers!
121
-
122
- ### Run With Extra Verbosity
123
-
124
- ```bash
125
- # Show detailed output including print statements and logs
126
- pytest tests/generators/implementations/test_flux_pro_live.py -v -s -m live_api
127
-
128
- # Show full error tracebacks
129
- pytest tests/generators/implementations/test_flux_pro_live.py -v --tb=long -m live_api
130
- ```
131
-
132
- ## Cost Management
133
-
134
- Live API tests consume real provider credits. Follow these practices:
135
-
136
- ### 1. Cost Logging
137
-
138
- All live tests log estimated costs before running:
139
-
140
- ```python
141
- @pytest.mark.asyncio
142
- async def test_generate_basic(self, cost_logger):
143
- cost_logger("replicate-flux-pro", 0.055)
144
- # Test implementation...
145
- ```
146
-
147
- Look for log output like:
148
- ```
149
- WARNING live_api_test_cost generator=replicate-flux-pro estimated_cost_usd=0.055
150
- ```
151
-
152
- ### 2. Minimal Inputs
153
-
154
- Tests use minimal/cheap parameters:
155
-
156
- ```python
157
- # ✅ Good - Simple prompt, small size
158
- inputs = FluxProInput(
159
- prompt="A simple red circle",
160
- aspect_ratio="1:1",
161
- )
162
-
163
- # ❌ Bad - Complex prompt, large size, multiple images
164
- inputs = FluxProInput(
165
- prompt="Ultra detailed 8K photorealistic...",
166
- aspect_ratio="21:9",
167
- num_images=10,
168
- )
169
- ```
170
-
171
- ### 3. Approximate Costs (as of 2024)
172
-
173
- | Provider | Generator | Estimated Cost |
174
- |----------|-----------|----------------|
175
- | Replicate | flux-pro | $0.055/image |
176
- | Fal.ai | nano-banana | $0.05/image |
177
- | Fal.ai | nano-banana-edit | $0.05/image |
178
- | OpenAI | dalle3 | $0.04-$0.08/image |
179
- | OpenAI | whisper | $0.006/minute |
180
-
181
- Running a full test suite for one generator typically costs **$0.10 - $0.30**.
182
-
183
- ## Verifying Tests Are Excluded
184
-
185
- Live tests are **automatically excluded by default** thanks to `pytest.ini` configuration:
186
-
187
- ```bash
188
- # All of these commands exclude live tests by default:
189
- make test-backend
190
- cd packages/backend && uv run pytest
191
- cd packages/backend && uv run pytest tests/
192
- ```
193
-
194
- You should see output like:
195
- ```
196
- 337/350 tests collected (13 deselected)
197
- ```
198
-
199
- The 13 deselected tests are the live API tests.
200
-
201
- Check pytest markers to see which tests would run:
202
- ```bash
203
- # List all live API tests (without running them)
204
- pytest --collect-only -m live_api
205
-
206
- # Verify default behavior excludes live tests
207
- pytest --collect-only -q | tail -1
208
- # Should show: "337/350 tests collected (13 deselected)"
209
- ```
210
-
211
- ## Troubleshooting
212
-
213
- ### Tests Are Skipped
214
-
215
- **Problem:** All tests show `SKIPPED` status
216
-
217
- **Cause:** API key not found
218
-
219
- **Solution:**
220
- ```bash
221
- # Verify API key is set
222
- echo $REPLICATE_API_TOKEN
223
-
224
- # If empty, export it
225
- export REPLICATE_API_TOKEN="r8_..."
226
-
227
- # Or check Boards config
228
- python -c "from boards.config import settings; print(settings.generator_api_keys)"
229
- ```
230
-
231
- ### API Errors
232
-
233
- **Problem:** Test fails with authentication error
234
-
235
- **Solutions:**
236
- 1. Verify API key is valid (not expired/revoked)
237
- 2. Check API key has correct permissions
238
- 3. Verify provider account has sufficient credits
239
-
240
- **Example error:**
241
- ```
242
- ValueError: API configuration invalid. Missing REPLICATE_API_TOKEN
243
- ```
244
-
245
- ### Unexpected Costs
246
-
247
- **Problem:** Tests consumed more credits than expected
248
-
249
- **Prevention:**
250
- 1. Always read the test file first to understand what it does
251
- 2. Check cost logger output before tests run
252
- 3. Use single generator tests, not `pytest -m live_api`
253
- 4. Start with one test function: `pytest test_flux_pro_live.py::TestFluxProGeneratorLive::test_estimate_cost`
254
-
255
- ## Adding Live Tests for New Generators
256
-
257
- When creating a new generator, follow these steps:
258
-
259
- ### 1. Create the Live Test File
260
-
261
- ```bash
262
- # Template: test_<generator>_live.py
263
- touch tests/generators/implementations/test_my_generator_live.py
264
- ```
265
-
266
- ### 2. Use This Template
267
-
268
- ```python
269
- """
270
- Live API tests for MyGenerator.
271
-
272
- To run: pytest tests/generators/implementations/test_my_generator_live.py -v -m live_api
273
- """
274
- import pytest
275
- from boards.config import initialize_generator_api_keys
276
- from boards.generators.implementations.provider.type.my_generator import (
277
- MyGeneratorInput,
278
- MyGenerator,
279
- )
280
-
281
- pytestmark = [pytest.mark.live_api, pytest.mark.live_<provider>]
282
-
283
-
284
- class TestMyGeneratorLive:
285
- """Live API tests for MyGenerator."""
286
-
287
- def setup_method(self):
288
- """Set up generator and sync API keys."""
289
- self.generator = MyGenerator()
290
- initialize_generator_api_keys()
291
-
292
- @pytest.mark.asyncio
293
- async def test_generate_basic(
294
- self, skip_if_no_<provider>_key, dummy_context, cost_logger
295
- ):
296
- """Test basic generation with minimal parameters."""
297
- # Log cost
298
- estimated_cost = await self.generator.estimate_cost(
299
- MyGeneratorInput(prompt="test")
300
- )
301
- cost_logger(self.generator.name, estimated_cost)
302
-
303
- # Minimal input to reduce cost
304
- inputs = MyGeneratorInput(prompt="Simple test")
305
-
306
- # Execute
307
- result = await self.generator.generate(inputs, dummy_context)
308
-
309
- # Verify
310
- assert result.outputs is not None
311
- assert len(result.outputs) > 0
312
- assert result.outputs[0].storage_url is not None
313
- ```
314
-
315
- ### 3. Add Provider-Specific Skip Fixture (If New Provider)
316
-
317
- If adding a new provider (not Replicate/Fal/OpenAI), add to `conftest.py`:
318
-
319
- ```python
320
- @pytest.fixture
321
- def skip_if_no_my_provider_key():
322
- """Skip test if MY_PROVIDER_API_KEY is not available."""
323
- if not check_api_key("MY_PROVIDER_API_KEY"):
324
- pytest.skip("MY_PROVIDER_API_KEY not set, skipping live API test")
325
- ```
326
-
327
- ### 4. Add Pytest Marker (If New Provider)
328
-
329
- Update `pytest.ini`:
330
-
331
- ```ini
332
- markers =
333
- ...
334
- live_my_provider: marks tests that call MyProvider API (subset of live_api)
335
- ```
336
-
337
- ### 5. Test Your Live Test
338
-
339
- ```bash
340
- # Without API key - should skip
341
- pytest tests/generators/implementations/test_my_generator_live.py -v -m live_api
342
-
343
- # With API key - should run
344
- export MY_PROVIDER_API_KEY="..."
345
- pytest tests/generators/implementations/test_my_generator_live.py -v -m live_api
346
- ```
347
-
348
- ## Best Practices
349
-
350
- ### DO:
351
- - ✅ Run live tests individually after modifying a generator
352
- - ✅ Use minimal inputs to reduce costs
353
- - ✅ Log estimated costs before running tests
354
- - ✅ Keep live tests simple and focused
355
- - ✅ Verify tests are skipped when API keys are missing
356
- - ✅ Document expected costs in test docstrings
357
-
358
- ### DON'T:
359
- - ❌ Run `pytest -m live_api` unless you mean it
360
- - ❌ Add live tests to CI without explicit approval
361
- - ❌ Use live tests for load/performance testing
362
- - ❌ Test with expensive parameters (high quality, large sizes, etc.)
363
- - ❌ Create hundreds of test cases for one generator
364
- - ❌ Commit API keys to the repository
365
-
366
- ## Continuous Integration (Optional)
367
-
368
- If you want to run live tests in CI (not recommended for most projects):
369
-
370
- ### GitHub Actions Example
371
-
372
- ```yaml
373
- name: Live API Tests (Manual)
374
-
375
- on:
376
- workflow_dispatch: # Manual trigger only
377
-
378
- jobs:
379
- live-tests:
380
- runs-on: ubuntu-latest
381
- steps:
382
- - uses: actions/checkout@v3
383
- - name: Set up Python
384
- uses: actions/setup-python@v4
385
- with:
386
- python-version: '3.12'
387
- - name: Install dependencies
388
- run: |
389
- cd packages/backend
390
- pip install uv
391
- uv sync
392
- - name: Run Replicate live tests
393
- env:
394
- REPLICATE_API_TOKEN: ${{ secrets.REPLICATE_API_TOKEN }}
395
- run: |
396
- cd packages/backend
397
- uv run pytest -m live_replicate --tb=short
398
- ```
399
-
400
- **Important:** Only run on:
401
- - Manual workflow dispatch
402
- - Scheduled (e.g., nightly) runs
403
- - Release branches
404
-
405
- **Never** run live tests on every PR or commit.
406
-
407
- ## Summary
408
-
409
- - Live API tests verify real connectivity to provider APIs
410
- - They are **opt-in only** and never run by default
411
- - Set up API keys via environment variables or Boards config
412
- - Run individual tests after modifying generators: `pytest test_flux_pro_live.py -v -m live_api`
413
- - Monitor costs using cost logger output
414
- - Use minimal inputs to reduce expenses
415
- - Follow the template when adding tests for new generators
416
-
417
- For questions or issues, see the main [generator testing documentation](../../../apps/docs/docs/generators/testing.md).