Agent-friendly Python facade over fal.ai for generating and managing AI media (images, video, audio).
Project description
falaw
Agent-friendly Python facade over fal.ai for generating and managing AI media (images, video, audio).
from falaw import generate_image, list_models, journal
r = generate_image("a tiger eye, macro, 35mm", quality="fast")
r.first.download(to="./tiger.png")
[m.id for m in list_models(category="video")]
journal.note("schnell at quality='fast' defaults to 1024x1024")
Why
fal-client already gives you 100+ models behind a uniform call. What
agents (and humans) still struggle with is which model to use, what
parameters it takes, and what to do with the URL it returns. falaw
adds:
- Task-level verbs (
generate_image,text_to_speech, ...) with smart model selection by quality tier. - A queryable model registry --- no more grepping docs for IDs.
Result/Assetobjects that download, name, and organize outputs.- A journal so each session leaves notes for the next one.
- A Claude skill, plus stub bridges for MCP and HTTP services --- all derived from the same tool registry.
Install
pip install -e .
export FAL_KEY="your-fal-api-key"
Core surface
| Function | Purpose |
|---|---|
generate_image(prompt, *, quality, image_size, model_id, extra) |
Text-to-image, picks FLUX by quality tier. |
text_to_speech(text, *, quality, voice, model_id, extra) |
TTS, picks a voice model by tier. |
list_models(*, category, quality_tier) |
Browse the catalog. |
pick_model(*, category, quality_tier) |
Pick a sensible default. |
call_fal(application, arguments, *, on_event) |
Escape hatch to any fal model. Emits ProgressEvents + auto-journals on error. |
cached_call_fal(...) |
Same, plus content-addressed cache; emits cache_hit events on reuse. |
render_scene(scene, *, concurrency=N) / iter_render_scene(...) |
Render every shot+beat; thread-pooled, with yield-as-done iterator. |
estimate_scene_cost(scene) |
Walk a Scene, return a CostRollup with per-line USD breakdown. |
subscribe(callback) |
Attach a global subscriber to the ProgressEvent bus. |
journal.note / issue / improvement(...) |
Leave a trace for future sessions. |
Session(output_dir=...) |
Optional stateful controller. |
Structured progress events
call_fal and cached_call_fal emit ProgressEvents at every
lifecycle transition (queued, progress, log, done, error,
cache_hit). Subscribe per-call (on_event=) or globally
(falaw.subscribe(...)); the legacy on_log=print is still honored
for backward compatibility.
from falaw import subscribe, generate_image
subscribe(lambda ev: print(f"[{ev.kind}] {ev.application} {ev.elapsed_s:.2f}s"))
generate_image("a tiger eye", quality="fast")
Cost estimation
ModelRecord.cost_estimate: CostEstimate | None carries a structured
{kind, amount, currency} price (kinds: per_call | per_image | per_second | per_token | per_megapixel). estimate_scene_cost(scene)
sums per-call costs and returns a CostRollup with per-line
breakdown. Models without a populated cost_estimate appear in the
rollup's skipped list so audits surface drift.
Concurrency
render_scene(..., concurrency=4) runs shots and beats in parallel
through a thread pool (fal calls are HTTP-bound). Default
concurrency=1 preserves serial behavior. Use iter_render_scene(...)
to yield (kind, result) pairs as each unit completes — handy for
live UI updates.
Architecture
Single source of truth: a ToolSpec dataclass per tool. From it we derive every external surface:
falaw.registry ──► bridges/skill.py ──► .claude/skills/falaw/SKILL.md
──► bridges/mcp.py ──► MCP server (planned)
──► bridges/service.py ──► qh HTTP service (planned)
──► (UI) (planned)
Adding a new surface is a new bridge module, never a re-implementation of the operations.
Self-improvement loop
Every session can read and write the agent journal at ~/.config/falaw/journal/. The Claude skill instructs Claude to:
- Read recent entries before novel work.
- Write a note / issue / improvement when something surprises it.
call_fal auto-journals failures with the application id and arguments, so the next session recognizes the trap.
Layout
falaw/
base.py ToolSpec, ModelRecord
core.py call_fal: subscribe + auto-journal
registry.py register_tool, list/get/pick model
results.py Asset, Result, parse_response
session.py Session
journal.py file-backed journal
operations/
images.py generate_image
audio.py text_to_speech
bridges/
skill.py render Claude SKILL.md from registry
mcp.py (stub)
service.py (stub)
data/
models.json seed catalog
skills/falaw/ generated skill files (shipped with package)
misc/
docs/ aggregated fal.ai docs (3MB md, llms.txt, llms-full.txt)
regenerate_skill.py
tests/
Regenerate the skill after adding a tool
python misc/regenerate_skill.py
Writes falaw/data/skills/falaw/SKILL.md and .claude/skills/falaw/SKILL.md.
Status
v0 --- functional core, real Claude skill, stubs for MCP and HTTP service. The bridges share the same registry, so filling in the stubs is additive.
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file falaw-0.0.6.tar.gz.
File metadata
- Download URL: falaw-0.0.6.tar.gz
- Upload date:
- Size: 1.0 MB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.11.9 {"installer":{"name":"uv","version":"0.11.9","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
b96f2eebb0c434e00076366da1ec7fb1ab255c2c84b2a04e9e2cc3378ec7ee92
|
|
| MD5 |
1063b41b5ac850b63c08bb3b3bcb6925
|
|
| BLAKE2b-256 |
99a8718e9e596a776db8bd31f13a6f5b68d94414c653d46ae03fe077ee19e319
|
File details
Details for the file falaw-0.0.6-py3-none-any.whl.
File metadata
- Download URL: falaw-0.0.6-py3-none-any.whl
- Upload date:
- Size: 65.7 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.11.9 {"installer":{"name":"uv","version":"0.11.9","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
4d05011c1651fc5b43bc6a3c305e6dcd1a65ff4325b5ea1c4addf1410f994bc1
|
|
| MD5 |
3e0621cfbf12edd017d44a26662636f0
|
|
| BLAKE2b-256 |
af860242a6346508eece94b739b6763bda47be79bd5e2148ca1e33dbc0e4ff55
|