smartpipe-cli 1.3.0__tar.gz → 1.4.0rc1__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.
- {smartpipe_cli-1.3.0 → smartpipe_cli-1.4.0rc1}/.gitignore +4 -0
- {smartpipe_cli-1.3.0 → smartpipe_cli-1.4.0rc1}/CHANGELOG.md +94 -3
- {smartpipe_cli-1.3.0 → smartpipe_cli-1.4.0rc1}/CITATION.cff +2 -2
- smartpipe_cli-1.4.0rc1/PKG-INFO +264 -0
- smartpipe_cli-1.4.0rc1/README.md +228 -0
- smartpipe_cli-1.4.0rc1/demo/video/README.md +17 -0
- smartpipe_cli-1.4.0rc1/demo/video/src/Main.tsx +55 -0
- smartpipe_cli-1.4.0rc1/demo/video/src/Root.tsx +57 -0
- smartpipe_cli-1.4.0rc1/demo/video/src/components/Background.tsx +46 -0
- smartpipe_cli-1.4.0rc1/demo/video/src/components/Caption.tsx +75 -0
- smartpipe_cli-1.4.0rc1/demo/video/src/components/FileGlyph.tsx +109 -0
- smartpipe_cli-1.4.0rc1/demo/video/src/components/SceneFrame.tsx +64 -0
- smartpipe_cli-1.4.0rc1/demo/video/src/components/Terminal.tsx +267 -0
- smartpipe_cli-1.4.0rc1/demo/video/src/components/Wordmark.tsx +80 -0
- smartpipe_cli-1.4.0rc1/demo/video/src/config.ts +52 -0
- smartpipe_cli-1.4.0rc1/demo/video/src/font.ts +9 -0
- smartpipe_cli-1.4.0rc1/demo/video/src/index.ts +4 -0
- smartpipe_cli-1.4.0rc1/demo/video/src/scenes/Close.tsx +82 -0
- smartpipe_cli-1.4.0rc1/demo/video/src/scenes/ColdOpen.tsx +60 -0
- smartpipe_cli-1.4.0rc1/demo/video/src/scenes/CostHonesty.tsx +203 -0
- smartpipe_cli-1.4.0rc1/demo/video/src/scenes/Hook.tsx +40 -0
- smartpipe_cli-1.4.0rc1/demo/video/src/scenes/Multimodal.tsx +182 -0
- smartpipe_cli-1.4.0rc1/demo/video/src/scenes/Scale.tsx +47 -0
- smartpipe_cli-1.4.0rc1/docs/assets/demo-thumb.jpg +0 -0
- {smartpipe_cli-1.3.0 → smartpipe_cli-1.4.0rc1}/docs/comparison.md +9 -13
- smartpipe_cli-1.4.0rc1/docs/concepts/feeding-smartpipe.md +99 -0
- {smartpipe_cli-1.3.0 → smartpipe_cli-1.4.0rc1}/docs/concepts/models-and-providers.md +42 -40
- {smartpipe_cli-1.3.0 → smartpipe_cli-1.4.0rc1}/docs/concepts/output-formats.md +28 -28
- {smartpipe_cli-1.3.0 → smartpipe_cli-1.4.0rc1}/docs/concepts/pipes-and-items.md +28 -27
- {smartpipe_cli-1.3.0 → smartpipe_cli-1.4.0rc1}/docs/concepts/structured-output.md +21 -23
- smartpipe_cli-1.4.0rc1/docs/concepts/the-item.md +103 -0
- {smartpipe_cli-1.3.0 → smartpipe_cli-1.4.0rc1}/docs/cookbook/README.md +18 -14
- {smartpipe_cli-1.3.0 → smartpipe_cli-1.4.0rc1}/docs/cookbook/contract-extraction.md +15 -15
- smartpipe_cli-1.4.0rc1/docs/cookbook/customer-feedback.md +63 -0
- smartpipe_cli-1.4.0rc1/docs/cookbook/invoice-reconciliation.md +47 -0
- smartpipe_cli-1.4.0rc1/docs/cookbook/live-monitoring.md +104 -0
- smartpipe_cli-1.4.0rc1/docs/cookbook/log-triage.md +106 -0
- smartpipe_cli-1.4.0rc1/docs/cookbook/meeting-digest.md +41 -0
- {smartpipe_cli-1.3.0 → smartpipe_cli-1.4.0rc1}/docs/cookbook/ranking-documents.md +15 -15
- {smartpipe_cli-1.3.0 → smartpipe_cli-1.4.0rc1}/docs/cookbook/stream-enrichment.md +7 -7
- smartpipe_cli-1.4.0rc1/docs/cookbook/training-data-prep.md +140 -0
- smartpipe_cli-1.4.0rc1/docs/cookbook/video-qa.md +68 -0
- smartpipe_cli-1.4.0rc1/docs/cookbook/visualizing-results.md +113 -0
- smartpipe_cli-1.4.0rc1/docs/demo/index.html +24 -0
- smartpipe_cli-1.4.0rc1/docs/index.md +88 -0
- {smartpipe_cli-1.3.0 → smartpipe_cli-1.4.0rc1}/docs/inputs/files.md +50 -45
- smartpipe_cli-1.4.0rc1/docs/install.md +68 -0
- smartpipe_cli-1.3.0/docs/quickstart.md → smartpipe_cli-1.4.0rc1/docs/learn/1-first-pipeline.md +46 -43
- smartpipe_cli-1.4.0rc1/docs/learn/2-structured-data.md +75 -0
- smartpipe_cli-1.4.0rc1/docs/learn/3-files-and-media.md +65 -0
- smartpipe_cli-1.4.0rc1/docs/learn/4-free-verbs.md +49 -0
- smartpipe_cli-1.4.0rc1/docs/learn/5-scale-and-cost.md +56 -0
- smartpipe_cli-1.4.0rc1/docs/learn/6-pipelines-that-last.md +53 -0
- {smartpipe_cli-1.3.0 → smartpipe_cli-1.4.0rc1}/docs/privacy.md +11 -12
- smartpipe_cli-1.4.0rc1/docs/quickstart.md +5 -0
- smartpipe_cli-1.4.0rc1/docs/reference/agents.md +18 -0
- {smartpipe_cli-1.3.0 → smartpipe_cli-1.4.0rc1}/docs/reference/cli.md +43 -34
- {smartpipe_cli-1.3.0 → smartpipe_cli-1.4.0rc1}/docs/reference/custom-verbs.md +14 -14
- {smartpipe_cli-1.3.0 → smartpipe_cli-1.4.0rc1}/docs/reference/sem-files.md +28 -30
- {smartpipe_cli-1.3.0 → smartpipe_cli-1.4.0rc1}/docs/troubleshooting.md +57 -27
- smartpipe_cli-1.4.0rc1/docs/verbs/cluster.md +37 -0
- {smartpipe_cli-1.3.0 → smartpipe_cli-1.4.0rc1}/docs/verbs/diff.md +8 -9
- {smartpipe_cli-1.3.0 → smartpipe_cli-1.4.0rc1}/docs/verbs/distinct.md +18 -18
- {smartpipe_cli-1.3.0 → smartpipe_cli-1.4.0rc1}/docs/verbs/embed.md +18 -18
- {smartpipe_cli-1.3.0 → smartpipe_cli-1.4.0rc1}/docs/verbs/extend.md +10 -11
- {smartpipe_cli-1.3.0 → smartpipe_cli-1.4.0rc1}/docs/verbs/filter.md +31 -20
- smartpipe_cli-1.4.0rc1/docs/verbs/getschema.md +24 -0
- {smartpipe_cli-1.3.0 → smartpipe_cli-1.4.0rc1}/docs/verbs/join.md +24 -24
- {smartpipe_cli-1.3.0 → smartpipe_cli-1.4.0rc1}/docs/verbs/map.md +66 -45
- {smartpipe_cli-1.3.0 → smartpipe_cli-1.4.0rc1}/docs/verbs/outliers.md +10 -10
- {smartpipe_cli-1.3.0 → smartpipe_cli-1.4.0rc1}/docs/verbs/reduce.md +28 -29
- {smartpipe_cli-1.3.0 → smartpipe_cli-1.4.0rc1}/docs/verbs/sample.md +15 -15
- smartpipe_cli-1.4.0rc1/docs/verbs/sort.md +21 -0
- {smartpipe_cli-1.3.0 → smartpipe_cli-1.4.0rc1}/docs/verbs/split.md +24 -24
- {smartpipe_cli-1.3.0 → smartpipe_cli-1.4.0rc1}/docs/verbs/summarize.md +12 -12
- {smartpipe_cli-1.3.0 → smartpipe_cli-1.4.0rc1}/docs/verbs/top-k.md +28 -28
- {smartpipe_cli-1.3.0 → smartpipe_cli-1.4.0rc1}/docs/verbs/where.md +10 -22
- {smartpipe_cli-1.3.0 → smartpipe_cli-1.4.0rc1}/mkdocs.yml +14 -3
- {smartpipe_cli-1.3.0 → smartpipe_cli-1.4.0rc1}/pyproject.toml +11 -18
- {smartpipe_cli-1.3.0 → smartpipe_cli-1.4.0rc1}/qa/README.md +53 -6
- {smartpipe_cli-1.3.0 → smartpipe_cli-1.4.0rc1}/src/smartpipe/__init__.py +1 -1
- {smartpipe_cli-1.3.0 → smartpipe_cli-1.4.0rc1}/src/smartpipe/cli/chart_cmd.py +1 -1
- {smartpipe_cli-1.3.0 → smartpipe_cli-1.4.0rc1}/src/smartpipe/cli/cluster_cmd.py +8 -2
- {smartpipe_cli-1.3.0 → smartpipe_cli-1.4.0rc1}/src/smartpipe/cli/config_cmd.py +128 -24
- {smartpipe_cli-1.3.0 → smartpipe_cli-1.4.0rc1}/src/smartpipe/cli/distinct_cmd.py +16 -2
- {smartpipe_cli-1.3.0 → smartpipe_cli-1.4.0rc1}/src/smartpipe/cli/doctor_cmd.py +2 -0
- {smartpipe_cli-1.3.0 → smartpipe_cli-1.4.0rc1}/src/smartpipe/cli/embed_cmd.py +10 -4
- {smartpipe_cli-1.3.0 → smartpipe_cli-1.4.0rc1}/src/smartpipe/cli/extend_cmd.py +56 -1
- {smartpipe_cli-1.3.0 → smartpipe_cli-1.4.0rc1}/src/smartpipe/cli/filter_cmd.py +26 -3
- {smartpipe_cli-1.3.0 → smartpipe_cli-1.4.0rc1}/src/smartpipe/cli/getschema_cmd.py +1 -1
- {smartpipe_cli-1.3.0 → smartpipe_cli-1.4.0rc1}/src/smartpipe/cli/input_options.py +55 -4
- {smartpipe_cli-1.3.0 → smartpipe_cli-1.4.0rc1}/src/smartpipe/cli/join_cmd.py +56 -3
- {smartpipe_cli-1.3.0 → smartpipe_cli-1.4.0rc1}/src/smartpipe/cli/map_cmd.py +58 -3
- {smartpipe_cli-1.3.0 → smartpipe_cli-1.4.0rc1}/src/smartpipe/cli/outliers_cmd.py +8 -2
- smartpipe_cli-1.4.0rc1/src/smartpipe/cli/read_cmd.py +66 -0
- smartpipe_cli-1.4.0rc1/src/smartpipe/cli/readable_cmd.py +36 -0
- {smartpipe_cli-1.3.0 → smartpipe_cli-1.4.0rc1}/src/smartpipe/cli/reduce_cmd.py +8 -1
- {smartpipe_cli-1.3.0 → smartpipe_cli-1.4.0rc1}/src/smartpipe/cli/root.py +23 -0
- smartpipe_cli-1.4.0rc1/src/smartpipe/cli/schema_cmd.py +245 -0
- {smartpipe_cli-1.3.0 → smartpipe_cli-1.4.0rc1}/src/smartpipe/cli/screens.py +20 -2
- {smartpipe_cli-1.3.0 → smartpipe_cli-1.4.0rc1}/src/smartpipe/cli/sort_cmd.py +2 -2
- {smartpipe_cli-1.3.0 → smartpipe_cli-1.4.0rc1}/src/smartpipe/cli/split_cmd.py +11 -5
- {smartpipe_cli-1.3.0 → smartpipe_cli-1.4.0rc1}/src/smartpipe/cli/summarize_cmd.py +12 -2
- {smartpipe_cli-1.3.0 → smartpipe_cli-1.4.0rc1}/src/smartpipe/cli/top_k_cmd.py +9 -3
- {smartpipe_cli-1.3.0 → smartpipe_cli-1.4.0rc1}/src/smartpipe/cli/where_cmd.py +10 -2
- smartpipe_cli-1.4.0rc1/src/smartpipe/cli/write_cmd.py +60 -0
- {smartpipe_cli-1.3.0 → smartpipe_cli-1.4.0rc1}/src/smartpipe/config/display.py +2 -0
- {smartpipe_cli-1.3.0 → smartpipe_cli-1.4.0rc1}/src/smartpipe/config/store.py +3 -0
- {smartpipe_cli-1.3.0 → smartpipe_cli-1.4.0rc1}/src/smartpipe/container.py +44 -4
- {smartpipe_cli-1.3.0 → smartpipe_cli-1.4.0rc1}/src/smartpipe/core/errors.py +8 -0
- smartpipe_cli-1.4.0rc1/src/smartpipe/engine/chunking.py +348 -0
- {smartpipe_cli-1.3.0 → smartpipe_cli-1.4.0rc1}/src/smartpipe/engine/prompts.py +46 -0
- {smartpipe_cli-1.3.0 → smartpipe_cli-1.4.0rc1}/src/smartpipe/engine/runner.py +80 -15
- {smartpipe_cli-1.3.0 → smartpipe_cli-1.4.0rc1}/src/smartpipe/engine/schema.py +79 -2
- {smartpipe_cli-1.3.0 → smartpipe_cli-1.4.0rc1}/src/smartpipe/engine/schema_dsl.py +25 -3
- {smartpipe_cli-1.3.0 → smartpipe_cli-1.4.0rc1}/src/smartpipe/io/inputs.py +3 -1
- smartpipe_cli-1.4.0rc1/src/smartpipe/io/items.py +255 -0
- {smartpipe_cli-1.3.0 → smartpipe_cli-1.4.0rc1}/src/smartpipe/io/leaderboard.py +1 -1
- {smartpipe_cli-1.3.0 → smartpipe_cli-1.4.0rc1}/src/smartpipe/io/metering.py +43 -0
- {smartpipe_cli-1.3.0 → smartpipe_cli-1.4.0rc1}/src/smartpipe/io/progress.py +60 -7
- {smartpipe_cli-1.3.0 → smartpipe_cli-1.4.0rc1}/src/smartpipe/io/readers.py +217 -16
- smartpipe_cli-1.4.0rc1/src/smartpipe/io/render.py +163 -0
- {smartpipe_cli-1.3.0 → smartpipe_cli-1.4.0rc1}/src/smartpipe/io/writers.py +87 -31
- {smartpipe_cli-1.3.0 → smartpipe_cli-1.4.0rc1}/src/smartpipe/models/anthropic_adapter.py +5 -1
- {smartpipe_cli-1.3.0 → smartpipe_cli-1.4.0rc1}/src/smartpipe/models/gemini_native.py +16 -3
- {smartpipe_cli-1.3.0 → smartpipe_cli-1.4.0rc1}/src/smartpipe/models/ollama.py +7 -4
- {smartpipe_cli-1.3.0 → smartpipe_cli-1.4.0rc1}/src/smartpipe/models/openai_codex.py +3 -1
- {smartpipe_cli-1.3.0 → smartpipe_cli-1.4.0rc1}/src/smartpipe/models/openai_compat.py +5 -3
- {smartpipe_cli-1.3.0 → smartpipe_cli-1.4.0rc1}/src/smartpipe/parsing/extract.py +7 -2
- {smartpipe_cli-1.3.0 → smartpipe_cli-1.4.0rc1}/src/smartpipe/verbs/chart.py +1 -1
- {smartpipe_cli-1.3.0 → smartpipe_cli-1.4.0rc1}/src/smartpipe/verbs/common.py +116 -14
- {smartpipe_cli-1.3.0 → smartpipe_cli-1.4.0rc1}/src/smartpipe/verbs/distinct.py +66 -7
- {smartpipe_cli-1.3.0 → smartpipe_cli-1.4.0rc1}/src/smartpipe/verbs/embed.py +6 -4
- {smartpipe_cli-1.3.0 → smartpipe_cli-1.4.0rc1}/src/smartpipe/verbs/extend.py +81 -19
- {smartpipe_cli-1.3.0 → smartpipe_cli-1.4.0rc1}/src/smartpipe/verbs/filter.py +70 -16
- {smartpipe_cli-1.3.0 → smartpipe_cli-1.4.0rc1}/src/smartpipe/verbs/join.py +286 -24
- {smartpipe_cli-1.3.0 → smartpipe_cli-1.4.0rc1}/src/smartpipe/verbs/map.py +165 -33
- smartpipe_cli-1.4.0rc1/src/smartpipe/verbs/oversize.py +379 -0
- smartpipe_cli-1.4.0rc1/src/smartpipe/verbs/readable.py +54 -0
- {smartpipe_cli-1.3.0 → smartpipe_cli-1.4.0rc1}/src/smartpipe/verbs/reduce.py +37 -3
- {smartpipe_cli-1.3.0 → smartpipe_cli-1.4.0rc1}/src/smartpipe/verbs/sortverb.py +1 -1
- {smartpipe_cli-1.3.0 → smartpipe_cli-1.4.0rc1}/src/smartpipe/verbs/split.py +56 -23
- {smartpipe_cli-1.3.0 → smartpipe_cli-1.4.0rc1}/src/smartpipe/verbs/summarize.py +21 -0
- {smartpipe_cli-1.3.0 → smartpipe_cli-1.4.0rc1}/src/smartpipe/verbs/top_k.py +1 -1
- {smartpipe_cli-1.3.0 → smartpipe_cli-1.4.0rc1}/src/smartpipe/verbs/where.py +17 -0
- smartpipe_cli-1.4.0rc1/src/smartpipe/verbs/write.py +209 -0
- smartpipe_cli-1.3.0/PKG-INFO +0 -192
- smartpipe_cli-1.3.0/README.md +0 -150
- smartpipe_cli-1.3.0/docs/cookbook/live-monitoring.md +0 -85
- smartpipe_cli-1.3.0/docs/cookbook/log-triage.md +0 -65
- smartpipe_cli-1.3.0/docs/cookbook/training-data-prep.md +0 -70
- smartpipe_cli-1.3.0/docs/cookbook/video-qa.md +0 -52
- smartpipe_cli-1.3.0/docs/cookbook/visualizing-results.md +0 -113
- smartpipe_cli-1.3.0/docs/index.md +0 -70
- smartpipe_cli-1.3.0/docs/install.md +0 -92
- smartpipe_cli-1.3.0/docs/verbs/cluster.md +0 -39
- smartpipe_cli-1.3.0/docs/verbs/getschema.md +0 -26
- smartpipe_cli-1.3.0/docs/verbs/sort.md +0 -21
- smartpipe_cli-1.3.0/src/smartpipe/cli/schema_cmd.py +0 -75
- smartpipe_cli-1.3.0/src/smartpipe/engine/chunking.py +0 -161
- smartpipe_cli-1.3.0/src/smartpipe/io/items.py +0 -149
- {smartpipe_cli-1.3.0 → smartpipe_cli-1.4.0rc1}/CONTRIBUTING.md +0 -0
- {smartpipe_cli-1.3.0 → smartpipe_cli-1.4.0rc1}/LICENSE +0 -0
- {smartpipe_cli-1.3.0 → smartpipe_cli-1.4.0rc1}/NOTICE +0 -0
- {smartpipe_cli-1.3.0 → smartpipe_cli-1.4.0rc1}/src/smartpipe/__main__.py +0 -0
- {smartpipe_cli-1.3.0 → smartpipe_cli-1.4.0rc1}/src/smartpipe/assets/probe.png +0 -0
- {smartpipe_cli-1.3.0 → smartpipe_cli-1.4.0rc1}/src/smartpipe/assets/probe.txt +0 -0
- {smartpipe_cli-1.3.0 → smartpipe_cli-1.4.0rc1}/src/smartpipe/assets/probe.wav +0 -0
- {smartpipe_cli-1.3.0 → smartpipe_cli-1.4.0rc1}/src/smartpipe/cli/__init__.py +0 -0
- {smartpipe_cli-1.3.0 → smartpipe_cli-1.4.0rc1}/src/smartpipe/cli/auth_cmd.py +0 -0
- {smartpipe_cli-1.3.0 → smartpipe_cli-1.4.0rc1}/src/smartpipe/cli/cache_cmd.py +0 -0
- {smartpipe_cli-1.3.0 → smartpipe_cli-1.4.0rc1}/src/smartpipe/cli/cite_cmd.py +0 -0
- {smartpipe_cli-1.3.0 → smartpipe_cli-1.4.0rc1}/src/smartpipe/cli/completions.py +0 -0
- {smartpipe_cli-1.3.0 → smartpipe_cli-1.4.0rc1}/src/smartpipe/cli/diff_cmd.py +0 -0
- {smartpipe_cli-1.3.0 → smartpipe_cli-1.4.0rc1}/src/smartpipe/cli/echo_cmd.py +0 -0
- {smartpipe_cli-1.3.0 → smartpipe_cli-1.4.0rc1}/src/smartpipe/cli/interrupts.py +0 -0
- {smartpipe_cli-1.3.0 → smartpipe_cli-1.4.0rc1}/src/smartpipe/cli/probe_cmd.py +0 -0
- {smartpipe_cli-1.3.0 → smartpipe_cli-1.4.0rc1}/src/smartpipe/cli/run_cmd.py +0 -0
- {smartpipe_cli-1.3.0 → smartpipe_cli-1.4.0rc1}/src/smartpipe/cli/sample_cmd.py +0 -0
- {smartpipe_cli-1.3.0 → smartpipe_cli-1.4.0rc1}/src/smartpipe/cli/sem_file.py +0 -0
- {smartpipe_cli-1.3.0 → smartpipe_cli-1.4.0rc1}/src/smartpipe/cli/usage_cmd.py +0 -0
- {smartpipe_cli-1.3.0 → smartpipe_cli-1.4.0rc1}/src/smartpipe/config/__init__.py +0 -0
- {smartpipe_cli-1.3.0 → smartpipe_cli-1.4.0rc1}/src/smartpipe/config/credentials.py +0 -0
- {smartpipe_cli-1.3.0 → smartpipe_cli-1.4.0rc1}/src/smartpipe/config/doctor.py +0 -0
- {smartpipe_cli-1.3.0 → smartpipe_cli-1.4.0rc1}/src/smartpipe/config/paths.py +0 -0
- {smartpipe_cli-1.3.0 → smartpipe_cli-1.4.0rc1}/src/smartpipe/core/__init__.py +0 -0
- {smartpipe_cli-1.3.0 → smartpipe_cli-1.4.0rc1}/src/smartpipe/core/jsontools.py +0 -0
- {smartpipe_cli-1.3.0 → smartpipe_cli-1.4.0rc1}/src/smartpipe/engine/__init__.py +0 -0
- {smartpipe_cli-1.3.0 → smartpipe_cli-1.4.0rc1}/src/smartpipe/engine/aggregate.py +0 -0
- {smartpipe_cli-1.3.0 → smartpipe_cli-1.4.0rc1}/src/smartpipe/engine/blocking.py +0 -0
- {smartpipe_cli-1.3.0 → smartpipe_cli-1.4.0rc1}/src/smartpipe/engine/chart.py +0 -0
- {smartpipe_cli-1.3.0 → smartpipe_cli-1.4.0rc1}/src/smartpipe/engine/clustering.py +0 -0
- {smartpipe_cli-1.3.0 → smartpipe_cli-1.4.0rc1}/src/smartpipe/engine/predicate.py +0 -0
- {smartpipe_cli-1.3.0 → smartpipe_cli-1.4.0rc1}/src/smartpipe/engine/ranking.py +0 -0
- {smartpipe_cli-1.3.0 → smartpipe_cli-1.4.0rc1}/src/smartpipe/engine/tally.py +0 -0
- {smartpipe_cli-1.3.0 → smartpipe_cli-1.4.0rc1}/src/smartpipe/engine/timebin.py +0 -0
- {smartpipe_cli-1.3.0 → smartpipe_cli-1.4.0rc1}/src/smartpipe/engine/units.py +0 -0
- {smartpipe_cli-1.3.0 → smartpipe_cli-1.4.0rc1}/src/smartpipe/engine/windows.py +0 -0
- {smartpipe_cli-1.3.0 → smartpipe_cli-1.4.0rc1}/src/smartpipe/io/__init__.py +0 -0
- {smartpipe_cli-1.3.0 → smartpipe_cli-1.4.0rc1}/src/smartpipe/io/diagnostics.py +0 -0
- {smartpipe_cli-1.3.0 → smartpipe_cli-1.4.0rc1}/src/smartpipe/io/text.py +0 -0
- {smartpipe_cli-1.3.0 → smartpipe_cli-1.4.0rc1}/src/smartpipe/io/tty.py +0 -0
- {smartpipe_cli-1.3.0 → smartpipe_cli-1.4.0rc1}/src/smartpipe/io/usage.py +0 -0
- {smartpipe_cli-1.3.0 → smartpipe_cli-1.4.0rc1}/src/smartpipe/models/__init__.py +0 -0
- {smartpipe_cli-1.3.0 → smartpipe_cli-1.4.0rc1}/src/smartpipe/models/base.py +0 -0
- {smartpipe_cli-1.3.0 → smartpipe_cli-1.4.0rc1}/src/smartpipe/models/budget.py +0 -0
- {smartpipe_cli-1.3.0 → smartpipe_cli-1.4.0rc1}/src/smartpipe/models/cache.py +0 -0
- {smartpipe_cli-1.3.0 → smartpipe_cli-1.4.0rc1}/src/smartpipe/models/http_support.py +0 -0
- {smartpipe_cli-1.3.0 → smartpipe_cli-1.4.0rc1}/src/smartpipe/models/jina.py +0 -0
- {smartpipe_cli-1.3.0 → smartpipe_cli-1.4.0rc1}/src/smartpipe/models/local_embed.py +0 -0
- {smartpipe_cli-1.3.0 → smartpipe_cli-1.4.0rc1}/src/smartpipe/models/openai_oauth.py +0 -0
- {smartpipe_cli-1.3.0 → smartpipe_cli-1.4.0rc1}/src/smartpipe/models/resolve.py +0 -0
- {smartpipe_cli-1.3.0 → smartpipe_cli-1.4.0rc1}/src/smartpipe/models/retry.py +0 -0
- {smartpipe_cli-1.3.0 → smartpipe_cli-1.4.0rc1}/src/smartpipe/models/stt.py +0 -0
- {smartpipe_cli-1.3.0 → smartpipe_cli-1.4.0rc1}/src/smartpipe/models/windows.py +0 -0
- {smartpipe_cli-1.3.0 → smartpipe_cli-1.4.0rc1}/src/smartpipe/parsing/__init__.py +0 -0
- {smartpipe_cli-1.3.0 → smartpipe_cli-1.4.0rc1}/src/smartpipe/parsing/detect.py +0 -0
- {smartpipe_cli-1.3.0 → smartpipe_cli-1.4.0rc1}/src/smartpipe/py.typed +0 -0
- {smartpipe_cli-1.3.0 → smartpipe_cli-1.4.0rc1}/src/smartpipe/verbs/__init__.py +0 -0
- {smartpipe_cli-1.3.0 → smartpipe_cli-1.4.0rc1}/src/smartpipe/verbs/cluster.py +0 -0
- {smartpipe_cli-1.3.0 → smartpipe_cli-1.4.0rc1}/src/smartpipe/verbs/convert.py +0 -0
- {smartpipe_cli-1.3.0 → smartpipe_cli-1.4.0rc1}/src/smartpipe/verbs/diff.py +0 -0
- {smartpipe_cli-1.3.0 → smartpipe_cli-1.4.0rc1}/src/smartpipe/verbs/getschema.py +0 -0
- {smartpipe_cli-1.3.0 → smartpipe_cli-1.4.0rc1}/src/smartpipe/verbs/outliers.py +0 -0
- {smartpipe_cli-1.3.0 → smartpipe_cli-1.4.0rc1}/src/smartpipe/verbs/sample.py +0 -0
- {smartpipe_cli-1.3.0 → smartpipe_cli-1.4.0rc1}/tests/corpus/README.md +0 -0
|
@@ -5,6 +5,97 @@ Format: [Keep a Changelog](https://keepachangelog.com/en/1.1.0/) · Versioning:
|
|
|
5
5
|
|
|
6
6
|
## [Unreleased]
|
|
7
7
|
|
|
8
|
+
## [1.4.0] — 2026-07-08
|
|
9
|
+
|
|
10
|
+
The identity release.
|
|
11
|
+
|
|
12
|
+
### The item — one law for everything in a pipe
|
|
13
|
+
- **The `__` metadata spine.** Tool metadata lives in a reserved
|
|
14
|
+
double-underscore namespace that rides every record: `__source` (path plus
|
|
15
|
+
HOW the item was cut - file, lines, jsonl, pages, minutes, segment index),
|
|
16
|
+
`__media` (one transport object for bytes crossing a pipe), `__score`
|
|
17
|
+
(join), `__invalid`/`__error`/`__raw` (kept failures). Known fields
|
|
18
|
+
round-trip through saved files; unknown `__` fields warn once and carry.
|
|
19
|
+
User data owns everything up to one leading underscore.
|
|
20
|
+
- **Records in, records out.** A plain-prompt `map` over records now returns
|
|
21
|
+
a record (`{"result": …}` plus the spine) instead of bare prose - structure
|
|
22
|
+
and provenance survive transformation. Text lines still leave as text.
|
|
23
|
+
- **The `--as` ingestion dial** (`file` | `lines` | `jsonl`) on every input
|
|
24
|
+
verb. Auto defaults: `.jsonl` means rows (loud per-line errors on
|
|
25
|
+
non-JSON), everything else means whole-document; stdin keeps per-line
|
|
26
|
+
sniffing; `--as file` slurps stdin whole (new). Media files refuse text
|
|
27
|
+
granularities with signposts to `split`.
|
|
28
|
+
- **The binary is the reader.** `smartpipe report.pdf | …` - a first
|
|
29
|
+
argument that exists on disk streams items; verbs always win names,
|
|
30
|
+
`./name` disambiguates. Every input verb also takes positional FILE
|
|
31
|
+
arguments; `--in` survives as a hidden alias.
|
|
32
|
+
- **`write` — the egress mirror.** Items route to files by template
|
|
33
|
+
(`{name}`, `{stem}`, `{index}`, any record field for content fan-out);
|
|
34
|
+
egress mirrors ingress via the spine - whole-file items become files,
|
|
35
|
+
line/row items reassemble into their sources in original order. Emits
|
|
36
|
+
written paths so pipes continue. Text-only records leave as plain text.
|
|
37
|
+
- **`readable` — the human door.** The same YAML-ish renderer as the TTY
|
|
38
|
+
preview, as an explicit pipe stage: nesting indented, lists bulleted,
|
|
39
|
+
multi-line strings as block scalars, spine dimmed, long values truncated
|
|
40
|
+
with counts (`--full` to disable), media summarized (`image/png (48 KB)`)
|
|
41
|
+
- never base64. Piped machine output is untouched JSONL; `--bare` strips
|
|
42
|
+
the spine from it.
|
|
43
|
+
- **Mixed streams are visible.** A kind census notes mixed inputs;
|
|
44
|
+
`where`/`summarize` report rows that had no fields; `--strict-rows` turns
|
|
45
|
+
the notes into errors. Multi-line plain output into a pipe warns that
|
|
46
|
+
line framing is ambiguous (use `--output json`).
|
|
47
|
+
|
|
48
|
+
### Judgment you can gate, retry, and keep
|
|
49
|
+
- **`--keep-invalid`** (map/extend): after the repair retry fails, keep the
|
|
50
|
+
failure as one JSON row (`__invalid`/`__error`/`__raw`) instead of a skip
|
|
51
|
+
- dim one-liner at a TTY, full row when piped.
|
|
52
|
+
- **`smartpipe schema`** - the free rungs: compile braces/DSL to JSON Schema,
|
|
53
|
+
`--check FILE` validates rows (exit 0/1), `--example` prints a validating
|
|
54
|
+
instance, bare stdin mode is a REPL. **`--dry-run`** (map/extend) prints
|
|
55
|
+
the composed first request and exits before any model resolution.
|
|
56
|
+
- **Nullability is declared.** `?` on any type (`string?`, `number[]?`, bare
|
|
57
|
+
`field?`) compiles to a null union; bare fields mean scalar-or-scalar-list
|
|
58
|
+
and never admit null (D48, shipped earlier in this cycle).
|
|
59
|
+
- **Circuit breaker + `fallback-model`.** Five consecutive transport
|
|
60
|
+
failures stop the run with a provider-down screen (`SMARTPIPE_BREAKER`
|
|
61
|
+
tunes; 0 disables) - or, with a configured fallback, the run switches
|
|
62
|
+
chat models wholesale, re-runs the failed window on the successor, and
|
|
63
|
+
the receipt splits counts per model. Embedding fallback is refused
|
|
64
|
+
(one vector space per run). One fallback, no chains.
|
|
65
|
+
- **Deterministic rungs.** `join --on 'left.K == right.K'` alone is a free
|
|
66
|
+
key-equality join (all kinds, `--unmatched`); with a prompt it becomes
|
|
67
|
+
blocking - equality narrows pairs, the judge reasons within blocks, the
|
|
68
|
+
receipt reports pairs avoided. `distinct --exact` folds byte/value
|
|
69
|
+
duplicates only (records canonicalized, media hashed by bytes) - zero
|
|
70
|
+
model calls. Verb tables mark the free rungs.
|
|
71
|
+
|
|
72
|
+
### The terminal behaves
|
|
73
|
+
- Result writes pause/erase/redraw the status line under an arbiter - the
|
|
74
|
+
spinner can never interleave with output again. Only the final pipe stage
|
|
75
|
+
(stdout a TTY) animates; mid-pipe stages stay line-atomic.
|
|
76
|
+
- Records render at the TTY as YAML-ish blocks. The welcome screen links
|
|
77
|
+
docs, cookbook, and issues. The wizard offers to install shell
|
|
78
|
+
completions (consented, idempotent).
|
|
79
|
+
|
|
80
|
+
### Docs: a shape, not a pile
|
|
81
|
+
- New Learn track (`docs/learn/1…6`), `concepts/the-item.md` (the five
|
|
82
|
+
laws), `concepts/feeding-smartpipe.md` (the ingestion chapter), nav
|
|
83
|
+
regrouped Learn/Verbs/Concepts/Cookbook/Reference, index as mode-router,
|
|
84
|
+
every example reconciled to the new syntax with outputs from tests, qa/
|
|
85
|
+
flows extended (a live walk of which caught and fixed a real write
|
|
86
|
+
round-trip bug).
|
|
87
|
+
|
|
88
|
+
## [1.3.1] — 2026-07-08
|
|
89
|
+
|
|
90
|
+
### Fixed
|
|
91
|
+
- **PyPI no longer advertises phantom extras.** 1.3.0 kept the old extra
|
|
92
|
+
names (`[files]`, `[video]`, …) as empty compat aliases - but nothing was
|
|
93
|
+
ever published under the old name, so they protected nobody while the
|
|
94
|
+
PyPI sidebar listed six extras that contradict the everything-in-the-box
|
|
95
|
+
install story. The optional-dependencies table is gone entirely; pip
|
|
96
|
+
warns on an unknown extra and installs the complete package regardless.
|
|
97
|
+
Keywords now carry the multimodal story (pdf, audio, video, embeddings).
|
|
98
|
+
|
|
8
99
|
## [1.3.0] — 2026-07-07
|
|
9
100
|
|
|
10
101
|
Installs from PyPI as **`smartpipe-cli`** (the plain name was too close to
|
|
@@ -26,9 +117,9 @@ that degrade per-item with the provider's real reason quoted.
|
|
|
26
117
|
(PDF/DOCX/PPTX/XLSX/HTML/EPUB), video (bundled static ffmpeg), and chart
|
|
27
118
|
`--save` all ship in the core install now, joining D44's whisper and local
|
|
28
119
|
embeddings. One `pip install smartpipe-cli` is the entire multimodal surface.
|
|
29
|
-
The old extra names (
|
|
30
|
-
|
|
31
|
-
|
|
120
|
+
The old extra names briefly remained as empty aliases (removed for real
|
|
121
|
+
in 1.3.1 - nothing was ever published under the old name, so they only
|
|
122
|
+
advertised a false install story). `doctor`'s extras row now verifies the bundled components and
|
|
32
123
|
FAILS on a broken install instead of suggesting installs.
|
|
33
124
|
- **The gemini profile's default chat model is `gemini-3.1-flash-lite` (D45).**
|
|
34
125
|
Verified against the live catalog (GA, not a preview) and through the
|
|
@@ -0,0 +1,264 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: smartpipe-cli
|
|
3
|
+
Version: 1.4.0rc1
|
|
4
|
+
Summary: Semantic pipes and queries for your terminal - PDFs, images, audio, video, and text through Unix verbs that understand.
|
|
5
|
+
Project-URL: Homepage, https://github.com/prabal-rje/smartpipe
|
|
6
|
+
Project-URL: Changelog, https://github.com/prabal-rje/smartpipe/blob/main/CHANGELOG.md
|
|
7
|
+
Project-URL: Issues, https://github.com/prabal-rje/smartpipe/issues
|
|
8
|
+
Author-email: Prabal Gupta <prabal@rjeinc.ca>
|
|
9
|
+
License-Expression: Apache-2.0
|
|
10
|
+
License-File: LICENSE
|
|
11
|
+
License-File: NOTICE
|
|
12
|
+
Keywords: audio,cli,embeddings,grep,llm,multimodal,ollama,pdf,pipes,semantic,unix,video
|
|
13
|
+
Classifier: Development Status :: 5 - Production/Stable
|
|
14
|
+
Classifier: Environment :: Console
|
|
15
|
+
Classifier: Intended Audience :: Developers
|
|
16
|
+
Classifier: Operating System :: OS Independent
|
|
17
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
18
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
19
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
20
|
+
Classifier: Topic :: Text Processing :: Filters
|
|
21
|
+
Classifier: Topic :: Utilities
|
|
22
|
+
Requires-Python: >=3.11
|
|
23
|
+
Requires-Dist: anthropic>=0.40
|
|
24
|
+
Requires-Dist: click>=8.1
|
|
25
|
+
Requires-Dist: fastembed>=0.4; python_version < '3.14'
|
|
26
|
+
Requires-Dist: faster-whisper>=1.0; python_version < '3.14'
|
|
27
|
+
Requires-Dist: httpx>=0.27
|
|
28
|
+
Requires-Dist: imageio-ffmpeg>=0.5
|
|
29
|
+
Requires-Dist: jsonschema>=4.23
|
|
30
|
+
Requires-Dist: markitdown[docx,pdf,pptx,xlsx]>=0.1.6; python_version < '3.14'
|
|
31
|
+
Requires-Dist: pdfminer-six>=20231228
|
|
32
|
+
Requires-Dist: pypdf>=5.0
|
|
33
|
+
Requires-Dist: svgwrite>=1.4
|
|
34
|
+
Requires-Dist: tomli-w>=1.0
|
|
35
|
+
Description-Content-Type: text/markdown
|
|
36
|
+
|
|
37
|
+
# smartpipe
|
|
38
|
+
|
|
39
|
+
[](https://github.com/prabal-rje/smartpipe/actions/workflows/ci.yml)
|
|
40
|
+
[](https://pypi.org/project/smartpipe-cli/)
|
|
41
|
+
[](pyproject.toml)
|
|
42
|
+
[](https://prabal-rje.github.io/smartpipe/)
|
|
43
|
+
[](LICENSE)
|
|
44
|
+
|
|
45
|
+
**Semantic pipes and queries for your terminal.**
|
|
46
|
+
|
|
47
|
+
Run PDFs, images, audio, video, and text through Unix verbs that understand
|
|
48
|
+
their input.
|
|
49
|
+
|
|
50
|
+
[](https://prabal-rje.github.io/smartpipe/demo/)
|
|
51
|
+
|
|
52
|
+
*[▶ Watch the full 70-second demo](https://prabal-rje.github.io/smartpipe/demo/) - sound, controls, no download.*
|
|
53
|
+
|
|
54
|
+
## Install
|
|
55
|
+
|
|
56
|
+
```bash
|
|
57
|
+
# zero-install trial (or: pip install smartpipe-cli)
|
|
58
|
+
uvx --from smartpipe-cli smartpipe
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
## Point it at a model
|
|
62
|
+
|
|
63
|
+
```bash
|
|
64
|
+
# log in with a ChatGPT account - covers most people
|
|
65
|
+
smartpipe auth login
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
No ChatGPT plan? Use local [Ollama][ollama] or a cloud API key - see
|
|
69
|
+
[Models & providers][models].
|
|
70
|
+
|
|
71
|
+
## Examples
|
|
72
|
+
|
|
73
|
+
```bash
|
|
74
|
+
# summarize each filing, figures included
|
|
75
|
+
smartpipe map "summarize the key risk" 'filings/*.pdf'
|
|
76
|
+
|
|
77
|
+
# keep only the calls that sound frustrated - audio, understood
|
|
78
|
+
smartpipe filter "the caller sounds frustrated" 'calls/*.mp3'
|
|
79
|
+
|
|
80
|
+
# text on stdin works the same way
|
|
81
|
+
echo "hello world" \
|
|
82
|
+
| smartpipe map "translate to Spanish"
|
|
83
|
+
# → hola mundo
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
PDFs pass through with their figures. Scanned pages route to a vision model.
|
|
87
|
+
Audio is sent natively where the model hears it, transcribed locally otherwise.
|
|
88
|
+
Video is sent whole where the wire supports it, or split into frames plus a
|
|
89
|
+
transcript. Each conversion is noted per row.
|
|
90
|
+
|
|
91
|
+
It composes with `grep`, `jq`, `sort`, and `tail -f`: `stdin` to `stdout`,
|
|
92
|
+
one item at a time.
|
|
93
|
+
|
|
94
|
+
## Verbs
|
|
95
|
+
|
|
96
|
+
A **verb** is one operation on your data - `map`, `filter`, `cluster`. Each reads
|
|
97
|
+
`stdin` (or named FILES) and writes `stdout`, so verbs pipe into each other and
|
|
98
|
+
into ordinary Unix tools. Every verb is documented at
|
|
99
|
+
[prabal-rje.github.io/smartpipe][docs].
|
|
100
|
+
|
|
101
|
+
**Semantic verbs** call a model:
|
|
102
|
+
|
|
103
|
+
| Verb | What it does | Feels like |
|
|
104
|
+
|---|---|---|
|
|
105
|
+
| [`map`][map] | transform each item - text or media - with a prompt | `sed`, but it understands |
|
|
106
|
+
| [`extend`][extend] | add extracted fields; keep everything else | your record, plus columns |
|
|
107
|
+
| [`filter`][filter] | keep items matching a plain-English condition | `grep`, but semantic |
|
|
108
|
+
| [`embed`][embed] / [`top_k`][top_k] | vectors; rank by similarity | `sort \| head`, by meaning |
|
|
109
|
+
| [`reduce`][reduce] | synthesize many items into one | `awk` END, but literate |
|
|
110
|
+
| [`join`][join] | match two inputs (`--kind inner\|leftouter\|anti`); `--on` alone is free | SQL join, but semantic |
|
|
111
|
+
| [`cluster`][cluster] | group by meaning, label each group | themes with sizes and quotes |
|
|
112
|
+
| [`distinct`][distinct] | fold near-duplicates; `--exact` is free | `sort -u`, by meaning |
|
|
113
|
+
| [`diff`][diff] | what distinguishes two sets | the post-incident answer |
|
|
114
|
+
| [`outliers`][outliers] | the items least like the rest | novelty, surfaced |
|
|
115
|
+
|
|
116
|
+
**Free verbs** never call a model. Run them first to cut the corpus before any
|
|
117
|
+
paid stage:
|
|
118
|
+
|
|
119
|
+
| Verb | What it does | Feels like |
|
|
120
|
+
|---|---|---|
|
|
121
|
+
| [`where`][where] | filter on exact field predicates | SQL `WHERE` |
|
|
122
|
+
| [`summarize`][summarize] | count, average, percentiles, time buckets | SQL `GROUP BY` |
|
|
123
|
+
| [`sort`][sort] | order items by a field | `sort` |
|
|
124
|
+
| [`sample`][sample] | take a seeded random subset | `shuf` |
|
|
125
|
+
| [`getschema`][getschema] | list fields, types, and coverage | `head`, for structure |
|
|
126
|
+
| [`split`][split] | break items into pieces (pages, minutes) | `split` |
|
|
127
|
+
| [`chart`][cli] | terminal bars, SVG, facets, time series | quick plots |
|
|
128
|
+
|
|
129
|
+
Some semantic verbs have a **conditionally free mode**: `join --on` (key
|
|
130
|
+
equality, no prompt), `distinct --exact` (hash-only folding), `map`/`extend`
|
|
131
|
+
`--dry-run` (compose without sending), and `smartpipe schema` with a
|
|
132
|
+
braces/DSL expression. Each stays at zero model calls by construction.
|
|
133
|
+
|
|
134
|
+
## A one-minute tour
|
|
135
|
+
|
|
136
|
+
```bash
|
|
137
|
+
# 1. point smartpipe at a model (ChatGPT login, a cloud key, or local Ollama)
|
|
138
|
+
smartpipe config
|
|
139
|
+
|
|
140
|
+
# 2. ask one question across a folder of mixed documents
|
|
141
|
+
smartpipe map "What does this say about pricing?" 'docs/*.pdf'
|
|
142
|
+
|
|
143
|
+
# 3. typed extraction - braces carry names, types, and guidance
|
|
144
|
+
cat tickets.jsonl \
|
|
145
|
+
| smartpipe extend "Add {label enum(bug, feature, praise), urgency number: 0 to 1}"
|
|
146
|
+
|
|
147
|
+
# 4. group feedback by meaning, label each theme, chart it
|
|
148
|
+
cat feedback.txt \
|
|
149
|
+
| smartpipe cluster --top 8 \
|
|
150
|
+
| smartpipe chart cluster --save themes.svg
|
|
151
|
+
|
|
152
|
+
# 5. cut for free with `where`, then let the model judge only what is left
|
|
153
|
+
cat app.log \
|
|
154
|
+
| smartpipe where 'text has "ERROR"' \
|
|
155
|
+
| smartpipe filter "an actual outage"
|
|
156
|
+
|
|
157
|
+
# 6. save a whole pipeline as a file; it runs as a command
|
|
158
|
+
smartpipe run triage.sem --dry-run # prints the stage graph and cost, makes zero calls
|
|
159
|
+
|
|
160
|
+
# 7. month-end close: the vision model IS the OCR; the anti-join is the worklist
|
|
161
|
+
smartpipe map "Extract {vendor string, invoice_number string, total number}" 'invoices/2026-06/*.pdf' \
|
|
162
|
+
| tee june-invoices.ndjson \
|
|
163
|
+
| smartpipe join "the same payment" --right ledger.jsonl --kind anti > missing-from-ledger.jsonl
|
|
164
|
+
|
|
165
|
+
# 8. video RAG, no vector database: index a folder of recordings once, ask any day
|
|
166
|
+
smartpipe embed 'sessions/**/*.mp4' > sessions.embeddings
|
|
167
|
+
smartpipe top_k 3 --near "user gives up after the coupon fails" < sessions.embeddings
|
|
168
|
+
```
|
|
169
|
+
|
|
170
|
+
Numbers 7 and 8 are full recipes -
|
|
171
|
+
[invoice reconciliation](docs/cookbook/invoice-reconciliation.md) and
|
|
172
|
+
[video RAG](docs/cookbook/video-qa.md) - two of a dozen in the
|
|
173
|
+
[cookbook](docs/cookbook/README.md).
|
|
174
|
+
|
|
175
|
+
New to this? The [Learn track][quickstart] starts at zero and assumes nothing, including
|
|
176
|
+
what a "model" is.
|
|
177
|
+
|
|
178
|
+
## For AI agents
|
|
179
|
+
|
|
180
|
+
Driving smartpipe from an agent? [SKILL.md](SKILL.md) is the operating
|
|
181
|
+
manual - invocation patterns, the cost model, machine-output contracts,
|
|
182
|
+
and quoting gotchas, written for programmatic use.
|
|
183
|
+
|
|
184
|
+
## Where your data goes
|
|
185
|
+
|
|
186
|
+
Some steps run locally no matter which chat model you pick: embeddings
|
|
187
|
+
(`fastembed`) and transcription (`whisper`) are built in.
|
|
188
|
+
|
|
189
|
+
For chat, [Ollama][ollama] runs models on your machine. Any cloud model sends
|
|
190
|
+
that run's data to its provider - `gpt-5.4-mini`, `claude-opus-4-8`,
|
|
191
|
+
`gemini-3.1-flash-lite`, `mistral-large-latest`, `openrouter/…`.
|
|
192
|
+
|
|
193
|
+
API keys come from environment variables and are never stored. ChatGPT
|
|
194
|
+
subscribers can run `smartpipe auth login` instead. `smartpipe usage` keeps
|
|
195
|
+
local run and token totals; see [Privacy & security][privacy] for the details.
|
|
196
|
+
|
|
197
|
+
## Unix behavior
|
|
198
|
+
|
|
199
|
+
- **`stdout` is data, `stderr` is diagnostics.** Progress and receipts never
|
|
200
|
+
touch your pipe.
|
|
201
|
+
- **Adapts to where it runs.** Readable tables at a terminal; `JSONL` when piped
|
|
202
|
+
into another command.
|
|
203
|
+
- **Order-preserving.** Output order matches input order, even with parallel calls.
|
|
204
|
+
- **Failure-tolerant.** One bad item is a warning, not a crash.
|
|
205
|
+
|
|
206
|
+
## Learn more
|
|
207
|
+
|
|
208
|
+
Full docs: **[prabal-rje.github.io/smartpipe][docs]**.
|
|
209
|
+
|
|
210
|
+
- [Learn track][quickstart] - zero to first result, six short chapters
|
|
211
|
+
- [Install][install] - packages and platforms
|
|
212
|
+
- [Working with files & media][files] - PDFs, scans, images, audio, video
|
|
213
|
+
- [CLI reference][cli] - every flag, format, and exit code
|
|
214
|
+
- [Models & providers][models] - local Ollama, cloud keys, ChatGPT login
|
|
215
|
+
- [Privacy & security][privacy]
|
|
216
|
+
|
|
217
|
+
## How to cite
|
|
218
|
+
|
|
219
|
+
If smartpipe is useful in your research, cite it (or run `smartpipe cite`):
|
|
220
|
+
|
|
221
|
+
```bibtex
|
|
222
|
+
@software{gupta_smartpipe_2026,
|
|
223
|
+
author = {Gupta, Prabal},
|
|
224
|
+
title = {smartpipe: semantic pipes for your terminal},
|
|
225
|
+
year = {2026},
|
|
226
|
+
version = {1.4.0rc1},
|
|
227
|
+
license = {Apache-2.0},
|
|
228
|
+
url = {https://github.com/prabal-rje/smartpipe}
|
|
229
|
+
}
|
|
230
|
+
```
|
|
231
|
+
|
|
232
|
+
GitHub's "Cite this repository" button (from [CITATION.cff](CITATION.cff)) gives APA too.
|
|
233
|
+
|
|
234
|
+
## Development
|
|
235
|
+
|
|
236
|
+
Built in the open, under **Apache-2.0**. Contributor setup and the quality
|
|
237
|
+
gates are in [CONTRIBUTING.md](CONTRIBUTING.md); the manual release pass
|
|
238
|
+
lives in [`qa/`](qa/README.md). The CLI surface is a SemVer contract.
|
|
239
|
+
|
|
240
|
+
[docs]: https://prabal-rje.github.io/smartpipe/
|
|
241
|
+
[quickstart]: https://prabal-rje.github.io/smartpipe/learn/1-first-pipeline/
|
|
242
|
+
[install]: https://prabal-rje.github.io/smartpipe/install/
|
|
243
|
+
[files]: https://prabal-rje.github.io/smartpipe/inputs/files/
|
|
244
|
+
[cli]: https://prabal-rje.github.io/smartpipe/reference/cli/
|
|
245
|
+
[models]: https://prabal-rje.github.io/smartpipe/concepts/models-and-providers/
|
|
246
|
+
[privacy]: https://prabal-rje.github.io/smartpipe/privacy/
|
|
247
|
+
[ollama]: https://ollama.com
|
|
248
|
+
[map]: https://prabal-rje.github.io/smartpipe/verbs/map/
|
|
249
|
+
[extend]: https://prabal-rje.github.io/smartpipe/verbs/extend/
|
|
250
|
+
[filter]: https://prabal-rje.github.io/smartpipe/verbs/filter/
|
|
251
|
+
[embed]: https://prabal-rje.github.io/smartpipe/verbs/embed/
|
|
252
|
+
[top_k]: https://prabal-rje.github.io/smartpipe/verbs/top-k/
|
|
253
|
+
[reduce]: https://prabal-rje.github.io/smartpipe/verbs/reduce/
|
|
254
|
+
[join]: https://prabal-rje.github.io/smartpipe/verbs/join/
|
|
255
|
+
[cluster]: https://prabal-rje.github.io/smartpipe/verbs/cluster/
|
|
256
|
+
[distinct]: https://prabal-rje.github.io/smartpipe/verbs/distinct/
|
|
257
|
+
[diff]: https://prabal-rje.github.io/smartpipe/verbs/diff/
|
|
258
|
+
[outliers]: https://prabal-rje.github.io/smartpipe/verbs/outliers/
|
|
259
|
+
[where]: https://prabal-rje.github.io/smartpipe/verbs/where/
|
|
260
|
+
[summarize]: https://prabal-rje.github.io/smartpipe/verbs/summarize/
|
|
261
|
+
[sort]: https://prabal-rje.github.io/smartpipe/verbs/sort/
|
|
262
|
+
[sample]: https://prabal-rje.github.io/smartpipe/verbs/sample/
|
|
263
|
+
[getschema]: https://prabal-rje.github.io/smartpipe/verbs/getschema/
|
|
264
|
+
[split]: https://prabal-rje.github.io/smartpipe/verbs/split/
|
|
@@ -0,0 +1,228 @@
|
|
|
1
|
+
# smartpipe
|
|
2
|
+
|
|
3
|
+
[](https://github.com/prabal-rje/smartpipe/actions/workflows/ci.yml)
|
|
4
|
+
[](https://pypi.org/project/smartpipe-cli/)
|
|
5
|
+
[](pyproject.toml)
|
|
6
|
+
[](https://prabal-rje.github.io/smartpipe/)
|
|
7
|
+
[](LICENSE)
|
|
8
|
+
|
|
9
|
+
**Semantic pipes and queries for your terminal.**
|
|
10
|
+
|
|
11
|
+
Run PDFs, images, audio, video, and text through Unix verbs that understand
|
|
12
|
+
their input.
|
|
13
|
+
|
|
14
|
+
[](https://prabal-rje.github.io/smartpipe/demo/)
|
|
15
|
+
|
|
16
|
+
*[▶ Watch the full 70-second demo](https://prabal-rje.github.io/smartpipe/demo/) - sound, controls, no download.*
|
|
17
|
+
|
|
18
|
+
## Install
|
|
19
|
+
|
|
20
|
+
```bash
|
|
21
|
+
# zero-install trial (or: pip install smartpipe-cli)
|
|
22
|
+
uvx --from smartpipe-cli smartpipe
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
## Point it at a model
|
|
26
|
+
|
|
27
|
+
```bash
|
|
28
|
+
# log in with a ChatGPT account - covers most people
|
|
29
|
+
smartpipe auth login
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
No ChatGPT plan? Use local [Ollama][ollama] or a cloud API key - see
|
|
33
|
+
[Models & providers][models].
|
|
34
|
+
|
|
35
|
+
## Examples
|
|
36
|
+
|
|
37
|
+
```bash
|
|
38
|
+
# summarize each filing, figures included
|
|
39
|
+
smartpipe map "summarize the key risk" 'filings/*.pdf'
|
|
40
|
+
|
|
41
|
+
# keep only the calls that sound frustrated - audio, understood
|
|
42
|
+
smartpipe filter "the caller sounds frustrated" 'calls/*.mp3'
|
|
43
|
+
|
|
44
|
+
# text on stdin works the same way
|
|
45
|
+
echo "hello world" \
|
|
46
|
+
| smartpipe map "translate to Spanish"
|
|
47
|
+
# → hola mundo
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
PDFs pass through with their figures. Scanned pages route to a vision model.
|
|
51
|
+
Audio is sent natively where the model hears it, transcribed locally otherwise.
|
|
52
|
+
Video is sent whole where the wire supports it, or split into frames plus a
|
|
53
|
+
transcript. Each conversion is noted per row.
|
|
54
|
+
|
|
55
|
+
It composes with `grep`, `jq`, `sort`, and `tail -f`: `stdin` to `stdout`,
|
|
56
|
+
one item at a time.
|
|
57
|
+
|
|
58
|
+
## Verbs
|
|
59
|
+
|
|
60
|
+
A **verb** is one operation on your data - `map`, `filter`, `cluster`. Each reads
|
|
61
|
+
`stdin` (or named FILES) and writes `stdout`, so verbs pipe into each other and
|
|
62
|
+
into ordinary Unix tools. Every verb is documented at
|
|
63
|
+
[prabal-rje.github.io/smartpipe][docs].
|
|
64
|
+
|
|
65
|
+
**Semantic verbs** call a model:
|
|
66
|
+
|
|
67
|
+
| Verb | What it does | Feels like |
|
|
68
|
+
|---|---|---|
|
|
69
|
+
| [`map`][map] | transform each item - text or media - with a prompt | `sed`, but it understands |
|
|
70
|
+
| [`extend`][extend] | add extracted fields; keep everything else | your record, plus columns |
|
|
71
|
+
| [`filter`][filter] | keep items matching a plain-English condition | `grep`, but semantic |
|
|
72
|
+
| [`embed`][embed] / [`top_k`][top_k] | vectors; rank by similarity | `sort \| head`, by meaning |
|
|
73
|
+
| [`reduce`][reduce] | synthesize many items into one | `awk` END, but literate |
|
|
74
|
+
| [`join`][join] | match two inputs (`--kind inner\|leftouter\|anti`); `--on` alone is free | SQL join, but semantic |
|
|
75
|
+
| [`cluster`][cluster] | group by meaning, label each group | themes with sizes and quotes |
|
|
76
|
+
| [`distinct`][distinct] | fold near-duplicates; `--exact` is free | `sort -u`, by meaning |
|
|
77
|
+
| [`diff`][diff] | what distinguishes two sets | the post-incident answer |
|
|
78
|
+
| [`outliers`][outliers] | the items least like the rest | novelty, surfaced |
|
|
79
|
+
|
|
80
|
+
**Free verbs** never call a model. Run them first to cut the corpus before any
|
|
81
|
+
paid stage:
|
|
82
|
+
|
|
83
|
+
| Verb | What it does | Feels like |
|
|
84
|
+
|---|---|---|
|
|
85
|
+
| [`where`][where] | filter on exact field predicates | SQL `WHERE` |
|
|
86
|
+
| [`summarize`][summarize] | count, average, percentiles, time buckets | SQL `GROUP BY` |
|
|
87
|
+
| [`sort`][sort] | order items by a field | `sort` |
|
|
88
|
+
| [`sample`][sample] | take a seeded random subset | `shuf` |
|
|
89
|
+
| [`getschema`][getschema] | list fields, types, and coverage | `head`, for structure |
|
|
90
|
+
| [`split`][split] | break items into pieces (pages, minutes) | `split` |
|
|
91
|
+
| [`chart`][cli] | terminal bars, SVG, facets, time series | quick plots |
|
|
92
|
+
|
|
93
|
+
Some semantic verbs have a **conditionally free mode**: `join --on` (key
|
|
94
|
+
equality, no prompt), `distinct --exact` (hash-only folding), `map`/`extend`
|
|
95
|
+
`--dry-run` (compose without sending), and `smartpipe schema` with a
|
|
96
|
+
braces/DSL expression. Each stays at zero model calls by construction.
|
|
97
|
+
|
|
98
|
+
## A one-minute tour
|
|
99
|
+
|
|
100
|
+
```bash
|
|
101
|
+
# 1. point smartpipe at a model (ChatGPT login, a cloud key, or local Ollama)
|
|
102
|
+
smartpipe config
|
|
103
|
+
|
|
104
|
+
# 2. ask one question across a folder of mixed documents
|
|
105
|
+
smartpipe map "What does this say about pricing?" 'docs/*.pdf'
|
|
106
|
+
|
|
107
|
+
# 3. typed extraction - braces carry names, types, and guidance
|
|
108
|
+
cat tickets.jsonl \
|
|
109
|
+
| smartpipe extend "Add {label enum(bug, feature, praise), urgency number: 0 to 1}"
|
|
110
|
+
|
|
111
|
+
# 4. group feedback by meaning, label each theme, chart it
|
|
112
|
+
cat feedback.txt \
|
|
113
|
+
| smartpipe cluster --top 8 \
|
|
114
|
+
| smartpipe chart cluster --save themes.svg
|
|
115
|
+
|
|
116
|
+
# 5. cut for free with `where`, then let the model judge only what is left
|
|
117
|
+
cat app.log \
|
|
118
|
+
| smartpipe where 'text has "ERROR"' \
|
|
119
|
+
| smartpipe filter "an actual outage"
|
|
120
|
+
|
|
121
|
+
# 6. save a whole pipeline as a file; it runs as a command
|
|
122
|
+
smartpipe run triage.sem --dry-run # prints the stage graph and cost, makes zero calls
|
|
123
|
+
|
|
124
|
+
# 7. month-end close: the vision model IS the OCR; the anti-join is the worklist
|
|
125
|
+
smartpipe map "Extract {vendor string, invoice_number string, total number}" 'invoices/2026-06/*.pdf' \
|
|
126
|
+
| tee june-invoices.ndjson \
|
|
127
|
+
| smartpipe join "the same payment" --right ledger.jsonl --kind anti > missing-from-ledger.jsonl
|
|
128
|
+
|
|
129
|
+
# 8. video RAG, no vector database: index a folder of recordings once, ask any day
|
|
130
|
+
smartpipe embed 'sessions/**/*.mp4' > sessions.embeddings
|
|
131
|
+
smartpipe top_k 3 --near "user gives up after the coupon fails" < sessions.embeddings
|
|
132
|
+
```
|
|
133
|
+
|
|
134
|
+
Numbers 7 and 8 are full recipes -
|
|
135
|
+
[invoice reconciliation](docs/cookbook/invoice-reconciliation.md) and
|
|
136
|
+
[video RAG](docs/cookbook/video-qa.md) - two of a dozen in the
|
|
137
|
+
[cookbook](docs/cookbook/README.md).
|
|
138
|
+
|
|
139
|
+
New to this? The [Learn track][quickstart] starts at zero and assumes nothing, including
|
|
140
|
+
what a "model" is.
|
|
141
|
+
|
|
142
|
+
## For AI agents
|
|
143
|
+
|
|
144
|
+
Driving smartpipe from an agent? [SKILL.md](SKILL.md) is the operating
|
|
145
|
+
manual - invocation patterns, the cost model, machine-output contracts,
|
|
146
|
+
and quoting gotchas, written for programmatic use.
|
|
147
|
+
|
|
148
|
+
## Where your data goes
|
|
149
|
+
|
|
150
|
+
Some steps run locally no matter which chat model you pick: embeddings
|
|
151
|
+
(`fastembed`) and transcription (`whisper`) are built in.
|
|
152
|
+
|
|
153
|
+
For chat, [Ollama][ollama] runs models on your machine. Any cloud model sends
|
|
154
|
+
that run's data to its provider - `gpt-5.4-mini`, `claude-opus-4-8`,
|
|
155
|
+
`gemini-3.1-flash-lite`, `mistral-large-latest`, `openrouter/…`.
|
|
156
|
+
|
|
157
|
+
API keys come from environment variables and are never stored. ChatGPT
|
|
158
|
+
subscribers can run `smartpipe auth login` instead. `smartpipe usage` keeps
|
|
159
|
+
local run and token totals; see [Privacy & security][privacy] for the details.
|
|
160
|
+
|
|
161
|
+
## Unix behavior
|
|
162
|
+
|
|
163
|
+
- **`stdout` is data, `stderr` is diagnostics.** Progress and receipts never
|
|
164
|
+
touch your pipe.
|
|
165
|
+
- **Adapts to where it runs.** Readable tables at a terminal; `JSONL` when piped
|
|
166
|
+
into another command.
|
|
167
|
+
- **Order-preserving.** Output order matches input order, even with parallel calls.
|
|
168
|
+
- **Failure-tolerant.** One bad item is a warning, not a crash.
|
|
169
|
+
|
|
170
|
+
## Learn more
|
|
171
|
+
|
|
172
|
+
Full docs: **[prabal-rje.github.io/smartpipe][docs]**.
|
|
173
|
+
|
|
174
|
+
- [Learn track][quickstart] - zero to first result, six short chapters
|
|
175
|
+
- [Install][install] - packages and platforms
|
|
176
|
+
- [Working with files & media][files] - PDFs, scans, images, audio, video
|
|
177
|
+
- [CLI reference][cli] - every flag, format, and exit code
|
|
178
|
+
- [Models & providers][models] - local Ollama, cloud keys, ChatGPT login
|
|
179
|
+
- [Privacy & security][privacy]
|
|
180
|
+
|
|
181
|
+
## How to cite
|
|
182
|
+
|
|
183
|
+
If smartpipe is useful in your research, cite it (or run `smartpipe cite`):
|
|
184
|
+
|
|
185
|
+
```bibtex
|
|
186
|
+
@software{gupta_smartpipe_2026,
|
|
187
|
+
author = {Gupta, Prabal},
|
|
188
|
+
title = {smartpipe: semantic pipes for your terminal},
|
|
189
|
+
year = {2026},
|
|
190
|
+
version = {1.4.0rc1},
|
|
191
|
+
license = {Apache-2.0},
|
|
192
|
+
url = {https://github.com/prabal-rje/smartpipe}
|
|
193
|
+
}
|
|
194
|
+
```
|
|
195
|
+
|
|
196
|
+
GitHub's "Cite this repository" button (from [CITATION.cff](CITATION.cff)) gives APA too.
|
|
197
|
+
|
|
198
|
+
## Development
|
|
199
|
+
|
|
200
|
+
Built in the open, under **Apache-2.0**. Contributor setup and the quality
|
|
201
|
+
gates are in [CONTRIBUTING.md](CONTRIBUTING.md); the manual release pass
|
|
202
|
+
lives in [`qa/`](qa/README.md). The CLI surface is a SemVer contract.
|
|
203
|
+
|
|
204
|
+
[docs]: https://prabal-rje.github.io/smartpipe/
|
|
205
|
+
[quickstart]: https://prabal-rje.github.io/smartpipe/learn/1-first-pipeline/
|
|
206
|
+
[install]: https://prabal-rje.github.io/smartpipe/install/
|
|
207
|
+
[files]: https://prabal-rje.github.io/smartpipe/inputs/files/
|
|
208
|
+
[cli]: https://prabal-rje.github.io/smartpipe/reference/cli/
|
|
209
|
+
[models]: https://prabal-rje.github.io/smartpipe/concepts/models-and-providers/
|
|
210
|
+
[privacy]: https://prabal-rje.github.io/smartpipe/privacy/
|
|
211
|
+
[ollama]: https://ollama.com
|
|
212
|
+
[map]: https://prabal-rje.github.io/smartpipe/verbs/map/
|
|
213
|
+
[extend]: https://prabal-rje.github.io/smartpipe/verbs/extend/
|
|
214
|
+
[filter]: https://prabal-rje.github.io/smartpipe/verbs/filter/
|
|
215
|
+
[embed]: https://prabal-rje.github.io/smartpipe/verbs/embed/
|
|
216
|
+
[top_k]: https://prabal-rje.github.io/smartpipe/verbs/top-k/
|
|
217
|
+
[reduce]: https://prabal-rje.github.io/smartpipe/verbs/reduce/
|
|
218
|
+
[join]: https://prabal-rje.github.io/smartpipe/verbs/join/
|
|
219
|
+
[cluster]: https://prabal-rje.github.io/smartpipe/verbs/cluster/
|
|
220
|
+
[distinct]: https://prabal-rje.github.io/smartpipe/verbs/distinct/
|
|
221
|
+
[diff]: https://prabal-rje.github.io/smartpipe/verbs/diff/
|
|
222
|
+
[outliers]: https://prabal-rje.github.io/smartpipe/verbs/outliers/
|
|
223
|
+
[where]: https://prabal-rje.github.io/smartpipe/verbs/where/
|
|
224
|
+
[summarize]: https://prabal-rje.github.io/smartpipe/verbs/summarize/
|
|
225
|
+
[sort]: https://prabal-rje.github.io/smartpipe/verbs/sort/
|
|
226
|
+
[sample]: https://prabal-rje.github.io/smartpipe/verbs/sample/
|
|
227
|
+
[getschema]: https://prabal-rje.github.io/smartpipe/verbs/getschema/
|
|
228
|
+
[split]: https://prabal-rje.github.io/smartpipe/verbs/split/
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
# smartpipe demo video
|
|
2
|
+
|
|
3
|
+
A self-contained [Remotion](https://remotion.dev) project that renders the
|
|
4
|
+
~70-second smartpipe demo (1920x1080, 30 fps): six scenes - cold open, the
|
|
5
|
+
hook, multimodal, cost honesty, scale, close - all driven by one reusable
|
|
6
|
+
`<Terminal>` component and the frame-math constants in `src/config.ts`
|
|
7
|
+
(tune scene lengths there). Run `npm install` once, then `npm run studio`
|
|
8
|
+
to preview in the browser or `npm run render` to produce
|
|
9
|
+
`out/smartpipe-demo.mp4`; each scene is also registered as its own
|
|
10
|
+
composition (`ColdOpen`, `Hook`, `Multimodal`, `CostHonesty`, `Scale`,
|
|
11
|
+
`Close`), so `npx remotion render Hook out/hook.mp4` re-renders one scene
|
|
12
|
+
independently. The music bed is `public/silicon-prism-waltz.m4a` (60 s,
|
|
13
|
+
looped over the 70 s cut with a fade-out); if you ever need a
|
|
14
|
+
no-strings-attached replacement, `node scripts/make-music.mjs` (ffmpeg
|
|
15
|
+
required) synthesizes an original ambient track from scratch into
|
|
16
|
+
`public/music.m4a` - royalty-free by construction - and you can point the
|
|
17
|
+
`<Audio>` element in `src/Main.tsx` at it.
|