stillmade-sdk 0.1.42 → 0.1.44
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.
- package/.stillmade/sdk-baseline.json +6 -8
- package/AGENTS.md +15 -10
- package/FRAME_VIEWS.md +113 -0
- package/INTERFACE_DESIGN.md +62 -22
- package/MOBILE_UI.md +4 -2
- package/MODULES.md +152 -6
- package/PASTE_TO_LLM.md +35 -25
- package/README.md +3 -2
- package/SDK.md +994 -550
- package/UI_AESTHETIC.md +22 -2
- package/blocks/generate/package.js +1 -0
- package/blocks/generate/versions/1.0.0/package.js +463 -0
- package/docs/build/audio-to-editor.md +36 -0
- package/docs/build/block-builder-contract.md +150 -0
- package/docs/build/comfyui.md +227 -0
- package/docs/build/concepts.md +40 -0
- package/docs/build/context.md +159 -0
- package/docs/build/cookbook.md +57 -0
- package/docs/build/custom-interface.md +617 -0
- package/docs/build/data-types.md +83 -0
- package/docs/build/frame-views.md +259 -0
- package/docs/build/generate-media.md +59 -0
- package/docs/build/github-applications.md +314 -0
- package/docs/build/hosted-images.md +214 -0
- package/docs/build/hosted-music.md +39 -0
- package/docs/build/hosted-speech.md +157 -0
- package/docs/build/hosted-text.md +246 -0
- package/docs/build/image-description.md +49 -0
- package/docs/build/interface-design.md +343 -0
- package/docs/build/javascript.md +63 -0
- package/docs/build/local-preview.md +61 -0
- package/docs/build/media-analysis.md +27 -0
- package/docs/build/media.md +400 -0
- package/docs/build/mobile-ui.md +106 -0
- package/docs/build/modules.md +487 -0
- package/docs/build/original-blocks.md +70 -0
- package/docs/build/outside-apis.md +128 -0
- package/docs/build/production-context-templates.md +12 -0
- package/docs/build/project-storage.md +94 -0
- package/docs/build/quickstart.md +48 -0
- package/docs/build/recipes.md +103 -0
- package/docs/build/script-handoff.md +45 -0
- package/docs/build/script-writer.md +34 -0
- package/docs/build/state.md +223 -0
- package/docs/build/testing.md +112 -0
- package/docs/build/timeline-edits.md +116 -0
- package/docs/build/timeline-proposals.md +76 -0
- package/docs/build/transcription.md +59 -0
- package/docs/build/triggers.md +59 -0
- package/docs/build/tutorial.md +52 -0
- package/docs/build/typescript.md +34 -0
- package/docs/build/video-generation.md +61 -0
- package/docs/build/web-reading.md +37 -0
- package/docs/build/with-your-ai.md +27 -0
- package/docs/changelog.md +9 -0
- package/docs/creators.md +21 -0
- package/docs/distribute/discovery.md +43 -0
- package/docs/distribute/imports.md +58 -0
- package/docs/distribute/publishing.md +29 -0
- package/docs/distribute/sdk-versions.md +36 -0
- package/docs/distribute/selling.md +14 -0
- package/docs/distribute/teams.md +60 -0
- package/docs/distribute/versioning.md +28 -0
- package/docs/examples.md +23 -0
- package/docs/gallery.md +26 -0
- package/docs/index.md +50 -0
- package/docs/native-mcp.md +307 -0
- package/docs/project-types/automation.md +43 -0
- package/docs/project-types/batches.md +50 -0
- package/docs/project-types/build.md +42 -0
- package/docs/project-types/completion.md +15 -0
- package/docs/project-types/conditions.md +21 -0
- package/docs/project-types/hosted-review.md +115 -0
- package/docs/project-types/onboarding.md +75 -0
- package/docs/project-types/running.md +309 -0
- package/docs/project-types/testing.md +72 -0
- package/docs/reference/application-artifacts.md +87 -0
- package/docs/reference/authoring-guide.md +134 -0
- package/docs/reference/browser-applications.md +267 -0
- package/docs/reference/capabilities.md +45 -0
- package/docs/reference/cli.md +71 -0
- package/docs/reference/connection-api.md +59 -0
- package/docs/reference/cooperative-jobs.md +13 -0
- package/docs/reference/desktop-capabilities.md +172 -0
- package/docs/reference/desktop-execution.md +77 -0
- package/docs/reference/errors.md +233 -0
- package/docs/reference/execution.md +800 -0
- package/docs/reference/first-party-blocks.md +40 -0
- package/docs/reference/generation-models.md +59 -0
- package/docs/reference/limits.md +306 -0
- package/docs/reference/manifest-kinds-controls.md +36 -0
- package/docs/reference/manifest.md +181 -0
- package/docs/reference/operations.md +36 -0
- package/docs/reference/package-jobs.md +35 -0
- package/docs/reference/parity.md +55 -0
- package/docs/reference/permissions.md +86 -0
- package/docs/reference/ports.md +26 -0
- package/docs/reference/types.md +268 -0
- package/docs/reference/universal-resolver.md +303 -0
- package/docs/reference/view-bridge.md +60 -0
- package/docs/reference/view-rules.md +15 -0
- package/docs/reference/workspace-sync.md +25 -0
- package/docs/sdk.md +34 -0
- package/docs/tools/block-remix.md +211 -0
- package/docs/tools/llm.md +2213 -0
- package/docs/tools/repository-adaptation.md +613 -0
- package/examples/check-clip.stillmade.json +4 -1
- package/examples/generate-video.stillmade.json +6 -2
- package/examples/research-topic.stillmade.json +5 -1
- package/examples/text-workflow.stillmade.json +3 -32
- package/examples/timeline-polish.stillmade.json +11 -3
- package/examples/transcribe-audio.stillmade.json +11 -3
- package/package.json +1 -1
- package/packages/block-cli/cli.js +13 -6
- package/packages/block-cli/dev-host/assets/host.js +76 -38
- package/packages/block-cli/dev-host/assets/index.css +1 -1
- package/packages/block-cli/format.js +1 -1
- package/packages/block-cli/templates.js +31 -13
- package/packages/block-cli/type-packages.js +119 -0
- package/packages/block-platform/block-readiness.js +5 -0
- package/packages/block-platform/canvas.js +2 -1
- package/packages/block-platform/catalog.js +27 -48
- package/packages/block-platform/native-host-inventory.js +0 -226
- package/packages/block-platform/plain-descriptions.js +1 -25
- package/packages/block-platform/project-type-starters.js +13 -53
- package/packages/block-platform/script-handoff.js +2 -4
- package/packages/block-platform/type-workspace.js +2 -0
- package/packages/block-sdk/appearance.js +3 -1
- package/packages/block-sdk/block-tier.js +1 -1
- package/packages/block-sdk/builder-contract.js +10 -8
- package/packages/block-sdk/capabilities.js +1 -1
- package/packages/block-sdk/contracts.js +6 -2
- package/packages/block-sdk/first-party-identities.js +1 -84
- package/packages/block-sdk/first-party-packages.js +3 -85
- package/packages/block-sdk/generation-catalog.js +15 -3
- package/packages/block-sdk/index.d.ts +2 -1
- package/packages/block-sdk/media-analysis-example.js +1 -1
- package/packages/block-sdk/mock-host.js +7 -1
- package/packages/block-sdk/module-host-calls.js +35 -10
- package/packages/block-sdk/module-hosted.js +15 -2
- package/packages/block-sdk/module-media-access.js +71 -0
- package/packages/block-sdk/module-node.js +1 -1
- package/packages/block-sdk/portable-media-actions.js +1 -1
- package/packages/block-sdk/runtime.js +1 -1
- package/packages/block-sdk/timeline-proposal-example.js +1 -1
- package/packages/block-sdk/transcription-example.js +1 -1
- package/packages/block-sdk/video-generation-example.js +1 -1
- package/packages/block-sdk/view-bridge.js +4 -1
- package/packages/block-sdk/view-design.js +17 -14
- package/packages/block-sdk/web-example.js +1 -1
- package/packages/design-system/block-kit.css +48 -12
- package/packages/design-system/block-kit.html +3 -2
- package/blocks/mcp-motion-planner/versions/1.1.0/package.js +0 -97
- package/blocks/motion-designer/versions/1.0.1/package.js +0 -173318
- package/blocks/motion-designer/versions/1.0.2/package.js +0 -173318
- package/blocks/motion-frame-review/versions/1.1.1/package.js +0 -465
- package/blocks/motion-frame-review/versions/1.1.2/package.snapshot.js +0 -572
- package/blocks/narration/package.js +0 -1
- package/blocks/narration/versions/1.0.0/package.js +0 -221
- package/blocks/narration/versions/1.0.1/package.js +0 -221
- package/blocks/native/sm.animated-scene/versions/2.0.0/package.js +0 -475
- package/blocks/native/sm.animated-scene/versions/2.1.0/package.js +0 -498
- package/blocks/native/sm.animated-scene/versions/2.2.0/package.js +0 -524
- package/blocks/native/sm.animated-scene/versions/2.3.0/package.js +0 -618
- package/blocks/native/sm.animated-scene/versions/2.3.1/package.js +0 -618
- package/blocks/native/sm.animated-scene/versions/2.3.2/package.js +0 -723
- package/blocks/native/sm.animated-scene/versions/2.3.3/package.js +0 -723
- package/blocks/native/sm.animated-scene/versions/2.3.4/package.js +0 -676
- package/blocks/native/sm.animated-scene/versions/2.3.5/package.js +0 -693
- package/blocks/native/sm.animated-scene/versions/2.3.6/package.js +0 -700
- package/blocks/native/sm.animated-scene/versions/2.3.7/package.js +0 -747
- package/blocks/native/sm.animated-scene/versions/2.3.8/package.js +0 -769
- package/blocks/native/sm.animated-scene/versions/2.3.9/package.js +0 -769
- package/blocks/native/sm.animated-scene-assistant/versions/1.0.0/package.js +0 -183
- package/blocks/native/sm.blueprint/versions/2.0.0/package.js +0 -358
- package/blocks/native/sm.blueprint/versions/2.1.0/package.js +0 -358
- package/blocks/native/sm.blueprint/versions/2.1.1/package.js +0 -358
- package/blocks/native/sm.blueprint/versions/2.1.2/package.js +0 -358
- package/blocks/native/sm.blueprint/versions/2.1.3/package.js +0 -381
- package/blocks/native/sm.blueprint/versions/2.1.4/package.js +0 -381
- package/blocks/native/sm.blueprint/versions/2.1.5/package.js +0 -339
- package/blocks/native/sm.blueprint/versions/2.1.6/package.js +0 -356
- package/blocks/native/sm.blueprint/versions/2.1.7/package.js +0 -363
- package/blocks/native/sm.blueprint/versions/2.1.8/package.js +0 -410
- package/blocks/native/sm.blueprint/versions/2.1.9/package.js +0 -422
- package/blocks/native/sm.blueprint-assistant/versions/1.0.0/package.js +0 -172
- package/blocks/native/sm.chat/versions/2.0.0/package.js +0 -144
- package/blocks/native/sm.chat/versions/2.0.1/package.js +0 -97
- package/blocks/native/sm.chat/versions/2.0.2/package.js +0 -100
- package/blocks/native/sm.chat/versions/2.0.3/package.js +0 -100
- package/blocks/native/sm.continue-if/versions/1.0.0/package.js +0 -168
- package/blocks/native/sm.describe-media/versions/2.0.0/package.js +0 -153
- package/blocks/native/sm.describe-media/versions/2.0.1/package.js +0 -156
- package/blocks/native/sm.describe-media/versions/2.1.0/package.js +0 -140
- package/blocks/native/sm.image-editor/versions/2.0.0/package.js +0 -183
- package/blocks/native/sm.image-editor/versions/2.0.1/package.js +0 -190
- package/blocks/native/sm.new-items/versions/1.0.0/package.js +0 -191
- package/blocks/native/sm.pick-photos/versions/1.0.0/package.js +0 -334
- package/blocks/native/sm.quality-audit/versions/1.0.0/package.js +0 -192
- package/blocks/native/sm.quality-audit/versions/1.0.1/package.js +0 -192
- package/blocks/native/sm.quality-audit/versions/1.0.2/package.js +0 -195
- package/blocks/native/sm.research/versions/2.0.0/package.js +0 -175
- package/blocks/native/sm.research/versions/2.0.1/package.js +0 -184
- package/blocks/native/sm.research/versions/2.0.2/package.js +0 -187
- package/blocks/native/sm.script/versions/2.0.0/package.js +0 -144
- package/blocks/native/sm.script/versions/2.1.0/package.js +0 -144
- package/blocks/native/sm.script/versions/2.1.1/package.js +0 -144
- package/blocks/native/sm.script/versions/2.1.2/package.js +0 -105
- package/blocks/native/sm.script/versions/2.1.3/package.js +0 -152
- package/blocks/native/sm.script/versions/2.1.4/package.js +0 -156
- package/blocks/native/sm.script/versions/2.1.5/package.js +0 -156
- package/blocks/native/sm.shot-plan/versions/2.0.0/package.js +0 -301
- package/blocks/native/sm.shot-plan/versions/2.1.0/package.js +0 -528
- package/blocks/native/sm.shot-plan/versions/2.1.1/package.js +0 -528
- package/blocks/native/sm.shot-plan/versions/2.1.2/package.js +0 -528
- package/blocks/native/sm.shot-plan/versions/2.1.3/package.js +0 -536
- package/blocks/native/sm.shot-plan/versions/2.2.0/package.js +0 -800
- package/blocks/native/sm.shot-plan/versions/2.2.1/package.js +0 -920
- package/blocks/native/sm.shot-plan-assistant/versions/1.0.0/package.js +0 -173
- package/blocks/native/sm.stock-search/versions/2.0.0/package.js +0 -174
- package/blocks/native/sm.thumbnail/versions/2.0.0/package.js +0 -137
- package/blocks/native/sm.thumbnail/versions/2.0.1/package.js +0 -140
- package/blocks/native/sm.transcribe/versions/2.0.0/package.js +0 -163
- package/blocks/native/sm.transcribe/versions/2.0.1/package.js +0 -168
- package/blocks/native/sm.whiteboard-assistant/versions/1.0.0/package.js +0 -175
- package/blocks/native/sm.youtube/versions/2.0.0/package.js +0 -217
- package/blocks/occasion-story/package.js +0 -1
- package/blocks/occasion-story/versions/1.0.0/package.js +0 -1658
- package/blocks/occasion-story/versions/1.0.1/package.js +0 -1699
- package/blocks/occasion-story/versions/1.0.2/package.js +0 -1682
- package/blocks/photo-reel-composer/versions/1.0.0/package.js +0 -3043
- package/blocks/photo-reel-composer/versions/1.0.1/package.js +0 -3026
- package/blocks/photo-reel-composer/versions/1.0.2/package.js +0 -4149
- package/blocks/product-ad-variants/versions/1.0.0/package.js +0 -2911
- package/blocks/product-launch-director/versions/1.0.0/package.js +0 -103
- package/blocks/release-visuals/package.js +0 -1
- package/blocks/release-visuals/versions/1.0.0/package.js +0 -1492
- package/blocks/release-visuals/versions/1.0.1/package.js +0 -1517
- package/blocks/release-visuals/versions/1.0.2/package.js +0 -1500
- package/blocks/screen-recorder/package.js +0 -1
- package/blocks/screen-recorder/versions/1.0.0/package.js +0 -223
- package/blocks/screen-recorder/versions/1.0.1/package.js +0 -223
- package/blocks/short-form-finish/package.js +0 -1
- package/blocks/short-form-finish/versions/1.0.0/package.js +0 -1043
- package/blocks/short-form-finish/versions/1.0.1/package.js +0 -1043
- package/blocks/short-form-finish/versions/1.0.2/package.js +0 -1043
- package/blocks/short-form-finish/versions/1.0.3/package.js +0 -1026
- package/examples/saas-product-launch-reviewed-source.stillmade.json +0 -383
- package/examples/saas-product-launch.stillmade.json +0 -304
- package/packages/block-platform/dealer-inventory-video-project-type.js +0 -38
- package/packages/block-platform/first-revenue-project-types.js +0 -46
- package/packages/block-platform/fixture-starters.js +0 -13
- package/packages/block-platform/launch-project-source.js +0 -10
- package/packages/block-platform/launch-project.js +0 -30
- package/packages/block-platform/motion-project-types.js +0 -55
- package/packages/block-platform/motion-starters.js +0 -14
- package/packages/block-platform/product-ad-variants-project-type.js +0 -30
- package/packages/block-platform/product-launch-updated.js +0 -90
- package/packages/block-platform/revenue-review-project-types.js +0 -36
- package/packages/block-platform/revenue-review-starters.js +0 -13
- package/packages/block-platform/script-writer.js +0 -29
- package/packages/block-platform/website-source-block.js +0 -14
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
# Hosted speech generation
|
|
2
|
+
|
|
3
|
+
Use `runtime: "capability"` and `operation: "audio.speech"` to turn up to 3,800
|
|
4
|
+
characters of supplied text into one speech recording. This operation speaks
|
|
5
|
+
the supplied text; it does not draft a script or run another generation first.
|
|
6
|
+
The package contains no provider, payment method, endpoint, credentials, or
|
|
7
|
+
execution receipts. It may suggest a voice and speed; StillMade selects and
|
|
8
|
+
confirms the final choice outside the package and its optional sandboxed
|
|
9
|
+
interface.
|
|
10
|
+
|
|
11
|
+
### Package and declaration
|
|
12
|
+
|
|
13
|
+
Download [the complete Narrate a script package](https://stillmade.shop/block-sdk/examples/narrate-script.stillmade.json).
|
|
14
|
+
The offline SDK also includes `packages/block-sdk/speech-example.js`, exporting
|
|
15
|
+
`audioSpeech`. Copy the example, choose your own namespace, and edit its fixtures:
|
|
16
|
+
|
|
17
|
+
```sh
|
|
18
|
+
node packages/block-cli/cli.js validate examples/narrate-script.stillmade.json
|
|
19
|
+
node packages/block-cli/cli.js pack examples/narrate-script.stillmade.json narrate-script.stillmade.json
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
The package has `manifest`, `capability`, `tests`, and optional `view`. Its
|
|
23
|
+
manifest declares exactly one primary input of type `text` or `script`, exactly
|
|
24
|
+
one primary output of type `audio`, and:
|
|
25
|
+
|
|
26
|
+
```json
|
|
27
|
+
{"project":[],"capabilities":["audio.speech"],"network":[],"filesystem":[],"secrets":[]}
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
The capability object has these four fields; the input and output names
|
|
31
|
+
must match its declared ports:
|
|
32
|
+
|
|
33
|
+
```json
|
|
34
|
+
{"schemaVersion":1,"operation":"audio.speech","text":{"$input":"script"},"output":"audio"}
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
It may add `settings` with a suggested StillMade catalog voice and speed. The
|
|
38
|
+
dialog preselects them when that voice is available, and the person running the
|
|
39
|
+
Block can still change both:
|
|
40
|
+
|
|
41
|
+
```json
|
|
42
|
+
{"schemaVersion":1,"operation":"audio.speech","text":{"$input":"script"},"output":"audio","settings":{"voice":"asteria","speed":1.1}}
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
`voice` is a catalog voice id (lowercase letters, digits, `-` or `_`) and
|
|
46
|
+
`speed` is 0.25 to 4. See [Generation models](../reference/generation-models.md)
|
|
47
|
+
for the voice list.
|
|
48
|
+
|
|
49
|
+
A text input is a string. A script input contains
|
|
50
|
+
`{"schemaVersion":1,"text":"Words to speak."}`. Only its `text` is forwarded;
|
|
51
|
+
extra structured script fields cannot select a voice or add provider settings.
|
|
52
|
+
Text must be nonblank and at most 3,800 characters. Oversized text is rejected,
|
|
53
|
+
not silently truncated. A default is permitted; scoped script context still
|
|
54
|
+
requires `context.script.read`. Declare generic primary ports unless a matching
|
|
55
|
+
semantic role is needed by a particular downstream contract.
|
|
56
|
+
|
|
57
|
+
### Audio output and fixture expectations
|
|
58
|
+
|
|
59
|
+
StillMade catalog voices return the provider's measured MP3 or WAV, stored
|
|
60
|
+
byte for byte (schema 3 receipts, any sample rate, mono or stereo). The OpenAI
|
|
61
|
+
TTS-1 path normalizes and stores 16-bit PCM WAV at 24,000 Hz, mono. Either way
|
|
62
|
+
the output is a reference with exactly these fields, using host-created
|
|
63
|
+
identities and a saved HTTPS or host media URL:
|
|
64
|
+
|
|
65
|
+
```json
|
|
66
|
+
{
|
|
67
|
+
"kind":"audio","assetId":"speech-run-one","versionId":"v1",
|
|
68
|
+
"url":"/api/media/owner/speech-one.wav","mimeType":"audio/wav",
|
|
69
|
+
"duration":1,"bytes":48044,"sampleRate":24000,"channels":1
|
|
70
|
+
}
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
This reference is illustrative; it is not a generated file or execution receipt.
|
|
74
|
+
`duration` is measured from the actual PCM sample count; `bytes` includes the
|
|
75
|
+
canonical WAV header. Audio must be nonempty, at most 64 MiB (67,108,864 bytes),
|
|
76
|
+
and at most 1,400 seconds. The SDK validates finite bounds and the exact shape;
|
|
77
|
+
metadata alone cannot establish that bytes exist, are WAV, or belong to a user.
|
|
78
|
+
The host performs byte checks and stores a separate bound media receipt.
|
|
79
|
+
|
|
80
|
+
Include 1–3 fixtures using expectations, never an exact output or a fabricated
|
|
81
|
+
audio reference. Each expectation requires exactly `kind`, `format`,
|
|
82
|
+
`minDuration`, `maxDuration`, `minBytes`, and `maxBytes`:
|
|
83
|
+
|
|
84
|
+
```json
|
|
85
|
+
{
|
|
86
|
+
"name":"Read a short welcome",
|
|
87
|
+
"input":{"script":{"schemaVersion":1,"text":"Welcome to the quiet forest."}},
|
|
88
|
+
"expectations":{"audio":{"kind":"audio","format":"wav","minDuration":0.1,"maxDuration":30,"minBytes":46,"maxBytes":1500000}}
|
|
89
|
+
}
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
Duration bounds are finite seconds with `0 <= minDuration <= maxDuration <= 1400`
|
|
93
|
+
and a positive maximum. Byte bounds are integers with
|
|
94
|
+
`46 <= minBytes <= maxBytes <= 67108864`. Bounds are inclusive. These checks do
|
|
95
|
+
not transcribe the output, assess pronunciation, or verify a speaker's identity.
|
|
96
|
+
|
|
97
|
+
### Review, listen, and accept
|
|
98
|
+
|
|
99
|
+
Importing source and requesting **Review cost** do not generate audio. The host
|
|
100
|
+
dialog offers **StillMade voices**, the same catalog the app's Voiceover uses
|
|
101
|
+
(Deepgram, ElevenLabs, OpenAI and Kokoro voices configured on the server), paid
|
|
102
|
+
with StillMade credits at the Voiceover price for the text's length. It also
|
|
103
|
+
offers OpenAI TTS-1 with credits or your own key, and a speed from 0.25× to 4×.
|
|
104
|
+
Keys remain in the host's encrypted account vault. BYOK uses the account's
|
|
105
|
+
OpenAI key; missing keys never switch to credits.
|
|
106
|
+
Changing text, source, model, voice, speed, or price requires a new quote.
|
|
107
|
+
|
|
108
|
+
Review the displayed input, voice, speed, cost for every fixture and the separate
|
|
109
|
+
sample, and the total before choosing **Run tests and sample**. Each approved
|
|
110
|
+
invocation produces its own recording and receipt. Listen to the AI-generated
|
|
111
|
+
audio before choosing **Finish review**, then **Confirm Import** to install the
|
|
112
|
+
Block. A project run has its own **Run in project** confirmation and **Use this
|
|
113
|
+
audio** acceptance. The shared ledger binds source, inputs, account, project,
|
|
114
|
+
voice, speed, payment, quote, and retained outputs. Uncertain submissions are
|
|
115
|
+
not automatically repeated; recovering status does not itself generate audio.
|
|
116
|
+
|
|
117
|
+
The result is a typed audio output and a playable Block result. After accepting
|
|
118
|
+
a confirmed project speech run, open **Media** in the Editor and find **Audio
|
|
119
|
+
from Blocks** to listen and explicitly **Add at playhead**. See [Add speech to the Editor](audio-to-editor.md).
|
|
120
|
+
Generic audio outputs can also connect to compatible SDK audio inputs.
|
|
121
|
+
|
|
122
|
+
Adding audio to the Editor does not create or select a native Voiceover take,
|
|
123
|
+
replace its master recording or narration, or create word timings or a
|
|
124
|
+
transcript. Voiceover's primary input remains `script`; the Editor action does
|
|
125
|
+
not introduce an audio-to-Voiceover connection. A sandboxed view may request
|
|
126
|
+
`StillMade.run`, which opens the host approval flow; there is no guest
|
|
127
|
+
`previewAudio`, timeline mutation, or provider API.
|
|
128
|
+
|
|
129
|
+
### Validation status and host integration
|
|
130
|
+
|
|
131
|
+
No live provider speech test has been completed for this implementation.
|
|
132
|
+
Schema, fixture-contract, and host-boundary tests use synthetic inputs and
|
|
133
|
+
explicit mocks. They do not claim successful provider speech generation. Every
|
|
134
|
+
installation still requires the actual host fixtures, sample, playback review,
|
|
135
|
+
and import confirmation for the selected account and settings.
|
|
136
|
+
|
|
137
|
+
Offline `validate` and `pack` work without a key. `pack` reports `tests: 0`,
|
|
138
|
+
`reviewRequired: true`, and `liveVerified: false`. Offline `test` and `preview`
|
|
139
|
+
return `RUNTIME_UNAVAILABLE`; they do not fetch speech or return placeholders.
|
|
140
|
+
|
|
141
|
+
`prepareCapabilityInvocation(pkg, input)` returns exactly
|
|
142
|
+
`{operation:"audio.speech",text}`. The trusted host executes the separately
|
|
143
|
+
approved request and calls `capabilityOutputs(pkg, canonicalAudioReference)`.
|
|
144
|
+
`capabilityOperation(manifest)` distinguishes text, speech and image contracts;
|
|
145
|
+
`defaultCapabilityExpectations(manifest)` supplies their bounded default checks.
|
|
146
|
+
The existing `validateCapabilityExpectations`, `testCapabilityOutputs`, and
|
|
147
|
+
`validateCapabilityResult` dispatch through the declared operation.
|
|
148
|
+
|
|
149
|
+
A trusted speech executor may return `{outputs, metadata, mediaReceipts}`.
|
|
150
|
+
`mediaReceipts` is keyed by the exact audio output name. Its receipt has exactly
|
|
151
|
+
`schemaVersion:1`, `kind:"audio"`, `ownerId`, `runId`, `index`, `storageKey`,
|
|
152
|
+
`sha256`, and the canonical reference's `assetId`, `versionId`, `url`,
|
|
153
|
+
`mimeType`, `duration`, `bytes`, `sampleRate`, and `channels`. The SDK validates
|
|
154
|
+
shape, index 0–3, hash syntax, and equality to the output, and preserves a copy.
|
|
155
|
+
The authenticated host client must additionally verify account/run identity;
|
|
156
|
+
package code and custom interfaces cannot submit receipts as execution evidence.
|
|
157
|
+
Optional metadata remains bounded to 8 KiB and is not proof of generation.
|
|
@@ -0,0 +1,246 @@
|
|
|
1
|
+
# Hosted text generation
|
|
2
|
+
|
|
3
|
+
Use `runtime: "capability"` to implement a portable Block that asks StillMade to
|
|
4
|
+
generate text. The package declares the prompt, instructions, output contract,
|
|
5
|
+
and fixtures. StillMade owns account authentication, model choice, provider
|
|
6
|
+
keys, cost confirmation, and execution. This is a separate declarative runtime;
|
|
7
|
+
`fetch`, `ctx.capabilities`, and arbitrary host calls remain unavailable inside
|
|
8
|
+
JavaScript Blocks.
|
|
9
|
+
|
|
10
|
+
### Create and package
|
|
11
|
+
|
|
12
|
+
```sh
|
|
13
|
+
node packages/block-cli/cli.js create ./script-draft capability
|
|
14
|
+
node packages/block-cli/cli.js validate ./script-draft
|
|
15
|
+
node packages/block-cli/cli.js pack ./script-draft script-draft.stillmade.json
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
The folder contains `stillmade.block.json`, `src/capability.json`, and
|
|
19
|
+
`tests/fixtures.json`. A packed JSON contains `{manifest, capability, tests}`
|
|
20
|
+
and may include a sandboxed `view`. No provider key, endpoint, model, billing
|
|
21
|
+
selection, or receipt belongs in the package. Those fields are rejected.
|
|
22
|
+
|
|
23
|
+
Download [the complete script-draft example](https://stillmade.shop/block-sdk/examples/script-draft.stillmade.json).
|
|
24
|
+
Its manifest uses `entry: "src/capability.json"`, one primary `prompt` input of
|
|
25
|
+
type `text`, one primary `script` output of type `script`, and:
|
|
26
|
+
|
|
27
|
+
```json
|
|
28
|
+
{"project":[],"capabilities":["text.generate"],"network":[],"filesystem":[],"secrets":[]}
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
Its capability declaration is:
|
|
32
|
+
|
|
33
|
+
```json
|
|
34
|
+
{
|
|
35
|
+
"schemaVersion": 1,
|
|
36
|
+
"operation": "text.generate",
|
|
37
|
+
"prompt": {"$input": "prompt"},
|
|
38
|
+
"system": "Write a concise narration script. Return only the script text.",
|
|
39
|
+
"maxTokens": 1200,
|
|
40
|
+
"output": "script"
|
|
41
|
+
}
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
Declare exactly one prompt input (`text`, `script`, or `brief`) and exactly one
|
|
45
|
+
output (`text`, `script`, `json`, or a structured `object`).
|
|
46
|
+
|
|
47
|
+
An optional second `text` input can carry the user's own instructions, such as
|
|
48
|
+
decision rules or what to write: name it in `"prompt": {"$input": "data",
|
|
49
|
+
"$instructions": "rules"}`. StillMade sends `Instructions:` then `Input:`.
|
|
50
|
+
|
|
51
|
+
For a structured answer, declare one `object` output with a flat `schema` of up
|
|
52
|
+
to 20 `string`, `number`, `integer` or `boolean` fields, for example
|
|
53
|
+
`{"yes":"boolean","score":"integer","label":"string","reason":"string"}`.
|
|
54
|
+
StillMade asks the model for exactly one JSON object with those fields, accepts
|
|
55
|
+
the common `"85"` and `"true"` string forms, drops undeclared fields and fails the
|
|
56
|
+
run when a field is missing. Fixtures for an object output use
|
|
57
|
+
`{"kind":"object"}`; the declared fields are always checked. Later Steps can use
|
|
58
|
+
the fields directly, for example with "Continue only if". Structured prompt inputs contain
|
|
59
|
+
`{"schemaVersion":1,"text":"..."}`. A generated script returns that same
|
|
60
|
+
structured shape; a text output returns a string. Typed ports, primary markers,
|
|
61
|
+
semantic roles, and scoped project context retain their SDK meaning. A context
|
|
62
|
+
prompt needs its declared read permission and fresh authorized project snapshot.
|
|
63
|
+
Do not infer scene or character structure from an unstructured generated script.
|
|
64
|
+
|
|
65
|
+
Up to three other read-only inputs (for example the saved project script) can
|
|
66
|
+
also reach the model: list them in the descriptor as `"context": ["script"]`.
|
|
67
|
+
StillMade appends their current values after the prompt as delimited data the
|
|
68
|
+
model is told never to treat as instructions, and the review covers that exact
|
|
69
|
+
text. An input that is not listed (one a custom view only displays) is never
|
|
70
|
+
sent.
|
|
71
|
+
|
|
72
|
+
Generated `text` and `script` outputs state only what the run was given. Before
|
|
73
|
+
the result reaches a Step, the host removes each sentence that names a phone
|
|
74
|
+
number, web address or email, an inspection, certification, warranty or
|
|
75
|
+
vehicle-history claim, a price or a mileage figure that the run's input does not
|
|
76
|
+
contain (contact details written in the Block's own instructions count as given;
|
|
77
|
+
claim words there do not). A removed call to action becomes "Contact us today to
|
|
78
|
+
learn more." Line breaks are kept, and `object` and `json` outputs are not
|
|
79
|
+
changed. To keep such a sentence, supply the fact in an input.
|
|
80
|
+
|
|
81
|
+
#### Conversations
|
|
82
|
+
|
|
83
|
+
To continue a conversation, declare one optional `json` input for the earlier
|
|
84
|
+
turns and bind it as `history`:
|
|
85
|
+
|
|
86
|
+
```json
|
|
87
|
+
{"schemaVersion":1,"operation":"text.generate","prompt":{"$input":"message"},
|
|
88
|
+
"history":{"$input":"history"},"system":"You are a friendly script coach.",
|
|
89
|
+
"maxTokens":800,"output":"reply"}
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
The history value is up to 20 turns of `{"role":"user"|"assistant","content":"..."}`
|
|
93
|
+
(each at most 8,000 characters, 24,000 in total); StillMade sends them between
|
|
94
|
+
the system instructions and the prompt, and the review covers the exact turns.
|
|
95
|
+
Other fields and other roles are rejected. A missing history starts a fresh
|
|
96
|
+
conversation. A custom view or a JavaScript Step can keep the turns and pass
|
|
97
|
+
them back on the next run.
|
|
98
|
+
|
|
99
|
+
#### Structured replies (JSON schema)
|
|
100
|
+
|
|
101
|
+
For data instead of prose, declare a `json` output and add `schema`, the JSON
|
|
102
|
+
Schema the reply must match:
|
|
103
|
+
|
|
104
|
+
```json
|
|
105
|
+
{"schemaVersion":1,"operation":"text.generate","prompt":{"$input":"topic"},
|
|
106
|
+
"system":"You plan short podcast intros.","maxTokens":800,"output":"plan",
|
|
107
|
+
"schema":{"type":"object","additionalProperties":false,"required":["title","script"],
|
|
108
|
+
"properties":{"title":{"type":"string","maxLength":80},
|
|
109
|
+
"script":{"type":"string","maxLength":1200},
|
|
110
|
+
"beats":{"type":"array","items":{"type":"string"},"minItems":3,"maxItems":6}}}}
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
StillMade tells the model to reply with JSON matching the schema, parses the
|
|
114
|
+
reply (one surrounding code fence is tolerated) and checks it against the
|
|
115
|
+
schema before any Step receives it. A reply that does not match fails the run
|
|
116
|
+
with the first mismatch, for example `$.beats: needs at least 3 items`. The
|
|
117
|
+
output port then carries the parsed value, so a JavaScript Block downstream
|
|
118
|
+
reads `input.plan.title` directly.
|
|
119
|
+
|
|
120
|
+
The supported subset is `type` (one or a list of `object`, `array`, `string`,
|
|
121
|
+
`number`, `integer`, `boolean`, `null`), `description`, `title`, `enum`,
|
|
122
|
+
`properties`, `required`, `additionalProperties`, `items`, `minItems`,
|
|
123
|
+
`maxItems`, `minLength`, `maxLength`, `pattern`, `format` (`date`,
|
|
124
|
+
`date-time`, `email`, `uri`), `minimum` and `maximum`; up to 8 levels deep and
|
|
125
|
+
8,192 characters. The system instructions plus the schema instruction must fit
|
|
126
|
+
in 8,000 characters. Fixture expectations for a json output are
|
|
127
|
+
`{"kind":"json"}` with optional `includes` literal phrases.
|
|
128
|
+
|
|
129
|
+
Limits: package 256 KiB; prompt 32,000 characters; system instructions 8,000
|
|
130
|
+
characters; generated text 32,768 characters; `maxTokens` integer 1–4096.
|
|
131
|
+
The operation is one text generation call. Image, audio, video, tool calling,
|
|
132
|
+
streaming, multi-call agent loops, and arbitrary API requests are not supported
|
|
133
|
+
by this declaration.
|
|
134
|
+
|
|
135
|
+
### Fixtures and real review
|
|
136
|
+
|
|
137
|
+
Generated text varies, so fixtures use bounded expectations instead of an exact
|
|
138
|
+
`expected` string:
|
|
139
|
+
|
|
140
|
+
```json
|
|
141
|
+
[{
|
|
142
|
+
"name": "A short opening narration",
|
|
143
|
+
"input": {"prompt":"Write two narration sentences about a quiet forest at sunrise."},
|
|
144
|
+
"expectations": {"script":{"kind":"script","minLength":20,"maxLength":6000}}
|
|
145
|
+
}]
|
|
146
|
+
```
|
|
147
|
+
|
|
148
|
+
Include 1–3 fixtures. Every output has its matching `kind`, positive `minLength`,
|
|
149
|
+
and `maxLength` no larger than the output limit. Optional `includes` contains at
|
|
150
|
+
most eight required literal strings of at most 256 characters each; regular
|
|
151
|
+
expressions are not supported. Expectations check the declared interface and
|
|
152
|
+
bounded behavior, not factual correctness. Review the actual generated result.
|
|
153
|
+
|
|
154
|
+
Offline `validate` and `pack` check source only. `pack` reports `tests: 0`,
|
|
155
|
+
`reviewRequired: true`, and `liveVerified: false`. Offline `test` and `preview`
|
|
156
|
+
fail with `RUNTIME_UNAVAILABLE`; they do not invent a generation result.
|
|
157
|
+
|
|
158
|
+
Import the JSON or ZIP into StillMade. Test and preview loads available models
|
|
159
|
+
and payment methods. **Review cost** obtains a non-billable quote. Only the
|
|
160
|
+
separate **Run tests and sample** action submits one call per fixture and one
|
|
161
|
+
additional sample call. The host displays the complete call count and credit
|
|
162
|
+
cost first. BYOK uses your encrypted account OpenRouter key; provider usage is
|
|
163
|
+
billed by that provider and does not consume StillMade generation credits.
|
|
164
|
+
A missing BYOK key never silently switches to credits.
|
|
165
|
+
|
|
166
|
+
The server binds the report to your account, exact source digest, inputs,
|
|
167
|
+
resolved model/payment selection, quote, and execution policy. Every fixture,
|
|
168
|
+
the separate sample, typed outputs, and expectations must pass. Inspect the
|
|
169
|
+
sample and source rights, then **Confirm Import** to install. A client-supplied
|
|
170
|
+
`passed` flag or an LLM-written report cannot authorize import or release.
|
|
171
|
+
AI authoring generates and statically validates a draft; it stops for this
|
|
172
|
+
hosted review and does not silently run the drafted capability.
|
|
173
|
+
|
|
174
|
+
### Run in a project and recover
|
|
175
|
+
|
|
176
|
+
Add the reviewed Block to a Project Type to make a Step. Its controls and
|
|
177
|
+
optional custom interface use the same host execution dialog. Guest UI cannot
|
|
178
|
+
choose a model, reveal keys, or confirm a quote. Existing matching review
|
|
179
|
+
results can be reused for project execution, but the current project input
|
|
180
|
+
always gets its own quote and explicit run confirmation. An expired import
|
|
181
|
+
review can be reused for a project only after the server revalidates its source,
|
|
182
|
+
selection, policy, and current project edit access.
|
|
183
|
+
|
|
184
|
+
Each confirmed request has an account-scoped UUID and durable execution record.
|
|
185
|
+
The host advances one invocation at a time, retains results, and makes duplicate
|
|
186
|
+
requests idempotent. An unknown provider outcome is not automatically submitted
|
|
187
|
+
again. If the creation response is lost, the host finds the original request by
|
|
188
|
+
its UUID without generating. Continuing an unfinished recovered review requires
|
|
189
|
+
another explicit Continue generation action; it advances the already confirmed
|
|
190
|
+
plan, not a new request. Cancellation cannot guarantee that a provider stops already submitted
|
|
191
|
+
work; completed results are retained, while a cancelled or stale project run
|
|
192
|
+
cannot be automatically accepted into the project. Failed StillMade-credit
|
|
193
|
+
charges use the existing idempotent refund ledger. BYOK provider charges follow
|
|
194
|
+
the provider account and cannot be refunded by StillMade.
|
|
195
|
+
|
|
196
|
+
A Project Type can be imported after every embedded hosted package receives its
|
|
197
|
+
own current account review; see [review hosted Project Types](../project-types/hosted-review.md).
|
|
198
|
+
This is package admission, not proof that the connected flow ran. Connected
|
|
199
|
+
automatic runs and unattended future-media jobs stop at the hosted capability
|
|
200
|
+
boundary; they do not grant advance permission for paid calls.
|
|
201
|
+
|
|
202
|
+
### Publish a verified listing sample
|
|
203
|
+
|
|
204
|
+
After releasing the Block publicly, choose **Publish verified sample** in its
|
|
205
|
+
listing editor. Confirm the public display of that sample's input and output.
|
|
206
|
+
StillMade reuses the exact retained sample from the release review; it does not
|
|
207
|
+
call the provider or charge again. The source, account ownership, current runtime
|
|
208
|
+
policy, quarantine state, complete fixture evidence, and sample contract are
|
|
209
|
+
checked again. An expired import receipt or a removed API key does not invalidate
|
|
210
|
+
historical output. Project-run receipts cannot publish a private project sample
|
|
211
|
+
through this action. The stored preview records the original model and generation
|
|
212
|
+
time, so it is not represented as a new execution.
|
|
213
|
+
|
|
214
|
+
### Host integration API
|
|
215
|
+
|
|
216
|
+
```js
|
|
217
|
+
import {runPackageAsync, prepareCapabilityInvocation, capabilityOutputs}
|
|
218
|
+
from './packages/block-sdk/index.js';
|
|
219
|
+
|
|
220
|
+
const result = await runPackageAsync(pkg, input, {
|
|
221
|
+
capability: async (reviewedPackage, values, {signal}) => {
|
|
222
|
+
const request = prepareCapabilityInvocation(reviewedPackage, values);
|
|
223
|
+
// Trusted host: authenticate, review cost and approval, execute once,
|
|
224
|
+
// retain the result, then return typed outputs. Never implement this in
|
|
225
|
+
// package code or treat this SDK callback as proof of import review.
|
|
226
|
+
const text = await approvedHostTextRun(request, {signal});
|
|
227
|
+
return {outputs: capabilityOutputs(reviewedPackage, text)};
|
|
228
|
+
}
|
|
229
|
+
});
|
|
230
|
+
```
|
|
231
|
+
|
|
232
|
+
`approvedHostTextRun` is a host integration placeholder, not an SDK function.
|
|
233
|
+
The SDK validates declaration and output types; StillMade's server supplies the
|
|
234
|
+
account receipt and billing guarantees. Optional returned metadata is bounded
|
|
235
|
+
to 8 KiB and is not an authorization receipt. Without a trusted executor,
|
|
236
|
+
`runPackageAsync` fails closed. `validateCapability`,
|
|
237
|
+
`prepareCapabilityInvocation`, `capabilityOutputs`,
|
|
238
|
+
`validateCapabilityExpectations`, and `testCapabilityOutputs` are the portable
|
|
239
|
+
validation helpers. They never access a provider.
|
|
240
|
+
|
|
241
|
+
StillMade's authenticated `/api/block-capabilities` routes provide options,
|
|
242
|
+
quotes, review creation/lookup, run creation/status/poll/cancel, and read-only
|
|
243
|
+
`GET /requests/:requestId` recovery. Status GETs never execute calls or reconcile
|
|
244
|
+
refunds; POST polling/cancellation handles those mutations. They use StillMade's
|
|
245
|
+
credit ledger and encrypted BYOK vault or platform model key; Block authors
|
|
246
|
+
configure nothing.
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
# Describe an image
|
|
2
|
+
|
|
3
|
+
Use `runtime: "capability"` with `operation: "image.describe"` when a Block must inspect one image and return plain text. This is the portable boundary for visual analysis: the Block declares its image input, analysis instructions, output, tests, and license; StillMade owns image loading, provider credentials, model/payment selection, approval, accounting, and the retained execution record.
|
|
4
|
+
|
|
5
|
+
**StillMade credits do not pay for `image.describe`** (since September 13, 2026). A Block that calls it runs only for people who added their own OpenRouter key in Settings → API keys, and stops for everyone else. For a Block anyone can run on StillMade credits, use `media.analyze` instead (`stillmade-block create my-block analyze-media`): it takes one image or one to four images, answers one question about each, and is priced per image. The built-in Describe media 2.1.0 and Photo notes 1.1.0 moved to it; their earlier releases stay for projects pinned to them.
|
|
6
|
+
|
|
7
|
+
The downloaded SDK includes `examples/describe-image.stillmade.json` and `packages/block-sdk/image-description-example.js`.
|
|
8
|
+
|
|
9
|
+
```json
|
|
10
|
+
{
|
|
11
|
+
"manifest": {
|
|
12
|
+
"schemaVersion": 1,
|
|
13
|
+
"sdkVersion": "0.1.0",
|
|
14
|
+
"id": "example.describe-image",
|
|
15
|
+
"version": "1.0.0",
|
|
16
|
+
"name": "Describe an image",
|
|
17
|
+
"description": "Turn one owned image into concise production-ready visual notes.",
|
|
18
|
+
"kind": "task",
|
|
19
|
+
"runtime": "capability",
|
|
20
|
+
"entry": "src/capability.json",
|
|
21
|
+
"license": "MIT",
|
|
22
|
+
"inputs": {"image": {"type": "image", "primary": true}},
|
|
23
|
+
"outputs": {"description": {"type": "text", "primary": true, "role": "visual_description"}},
|
|
24
|
+
"permissions": {"project": [], "capabilities": ["image.describe"], "network": [], "filesystem": [], "secrets": []},
|
|
25
|
+
"ui": [{"control": "asset", "port": "image"}]
|
|
26
|
+
},
|
|
27
|
+
"capability": {
|
|
28
|
+
"schemaVersion": 1,
|
|
29
|
+
"operation": "image.describe",
|
|
30
|
+
"image": {"$input": "image"},
|
|
31
|
+
"instruction": "Describe only visibly supported subject matter, composition, lighting, color, texture, camera feel and visual style. Return concise production-ready plain text.",
|
|
32
|
+
"maxTokens": 700,
|
|
33
|
+
"output": "description"
|
|
34
|
+
},
|
|
35
|
+
"tests": [{
|
|
36
|
+
"name": "Blue image",
|
|
37
|
+
"input": {"image": {"width": 1, "height": 1, "data": [20, 80, 200, 255]}},
|
|
38
|
+
"expectations": {"description": {"kind": "text", "minLength": 20, "maxLength": 32768, "includes": ["blue"]}}
|
|
39
|
+
}]
|
|
40
|
+
}
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
Declare exactly one `image` input (or one `image[]` input to describe or compare one to four images together, in order) and one `text` output. The descriptor contains exactly `schemaVersion`, `operation`, `image`, `instruction`, `maxTokens`, and `output`. `image.$input` names the declared image port. Instructions must contain 1–8,000 characters and `maxTokens` must be 1–4,096. Provider names, endpoints, keys, payment settings, arbitrary URLs, and executable code do not belong in the descriptor.
|
|
44
|
+
|
|
45
|
+
Fixture inputs may use bounded RGBA pixels for offline contract validation. Real runs use a persistent image reference selected through StillMade. The trusted host requires the referenced media to belong to the signed-in account, reads and bounds the stored bytes, canonicalizes the image to PNG, and sends that image through the exact approved provider request. Block code never receives credentials or storage access.
|
|
46
|
+
|
|
47
|
+
Tests describe nondeterministic text expectations: `kind:"text"`, ordered `minLength` and `maxLength`, and up to eight literal `includes` phrases. They do not contain fabricated descriptions presented as provider evidence. Offline validation and packaging inspect the contract and report that live review remains required. In StillMade, the creator runs every fixture and a separate sample, reviews the output, and confirms the import.
|
|
48
|
+
|
|
49
|
+
`prepareCapabilityInvocation` returns `{operation:"image.describe",image,instruction,maxTokens}`. The host returns the named text output through the same capability result, quote, review, project execution, cancellation, failure, and receipt flow used by other hosted Blocks. A completed text record proves the exact package, input, selection, and output passed validation; it does not prove that every sentence is factually correct, so the user reviews the description before using it downstream.
|