OutputMeta enables usage-based pricing by reporting what your app processes and generates.
Basic Structure
1from inferencesh import BaseAppOutput, OutputMeta, TextMeta, ImageMeta, VideoMeta, AudioMeta23class AppOutput(BaseAppOutput):4 result: File = Field(description="Generated output")5 # output_meta is inherited from BaseAppOutputMetaItem Types
| Type | Class | Key Fields |
|---|---|---|
| Text | TextMeta | tokens |
| Image | ImageMeta | width, height, resolution_mp, steps, count |
| Video | VideoMeta | width, height, resolution, seconds |
| Audio | AudioMeta | seconds |
Examples
LLM/Text Generation
Track both input (prompt) and output (completion) tokens:
1from inferencesh.models.usage import OutputMeta, TextMeta23# In your run method, after getting the response:4return AppOutput(5 response=generated_text,6 output_meta=OutputMeta(7 inputs=[TextMeta(tokens=prompt_tokens)],8 outputs=[TextMeta(tokens=completion_tokens)]9 )10)For streaming responses, update token counts from the final chunk:
1# Track usage from stream chunks2if hasattr(chunk, "usage") and chunk.usage:3 input_tokens = chunk.usage.prompt_tokens4 output_tokens = chunk.usage.completion_tokens56# Build output with token tracking7output_meta = OutputMeta(8 inputs=[TextMeta(tokens=input_tokens)] if input_tokens else [],9 outputs=[TextMeta(tokens=output_tokens)] if output_tokens else []10)Image Generation
1return AppOutput(2 image=File(path=output_path),3 output_meta=OutputMeta(4 outputs=[ImageMeta(5 width=1024,6 height=1024,7 resolution_mp=1.05,8 steps=20,9 count=110 )]11 )12)Video Generation
1return AppOutput(2 video=File(path=output_path),3 output_meta=OutputMeta(4 outputs=[VideoMeta(5 width=1280,6 height=720,7 resolution="720p",8 seconds=5.09 )]10 )11)Audio Generation
1return AppOutput(2 audio=File(path=output_path),3 output_meta=OutputMeta(4 outputs=[AudioMeta(seconds=30.0)]5 )6)Custom Data
Use extra for app-specific pricing factors:
1output_meta=OutputMeta(2 outputs=[ImageMeta(3 width=1024,4 height=1024,5 extra={6 "model": "sdxl-turbo",7 "lora_count": 28 }9 )]10)Public API visibility
output_meta is pricing metadata for the platform. App authors should always set it on task output, but it is not returned on public surfaces:
| Surface | What you see |
|---|---|
Task output (REST, WebSocket, SDK) | output_meta is extracted at write time; only your app's user-facing fields remain in output |
App output_schema (version DTO, app store, Grid) | output_meta is stripped from schemas at deploy and on read |
Your app code still returns output_meta in AppOutput / run results — the backend stores it for usage-based billing and CEL pricing formulas. Do not rely on clients reading output_meta from completed tasks or published schemas.
Best Practices
- Always populate
output_metaif usage varies per request - Use accurate token counts from the actual tokenizer
- Report actual dimensions - don't hardcode
- Include relevant
extradata for pricing flexibility
Next
→ Usage-based pricing — CEL formulas that read output_meta
→ Secrets — API keys and sensitive values