smartpipe-cli 1.3.1__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.
Files changed (226) hide show
  1. {smartpipe_cli-1.3.1 → smartpipe_cli-1.4.0rc1}/.gitignore +4 -0
  2. {smartpipe_cli-1.3.1 → smartpipe_cli-1.4.0rc1}/CHANGELOG.md +80 -0
  3. {smartpipe_cli-1.3.1 → smartpipe_cli-1.4.0rc1}/CITATION.cff +1 -1
  4. smartpipe_cli-1.4.0rc1/PKG-INFO +264 -0
  5. smartpipe_cli-1.4.0rc1/README.md +228 -0
  6. smartpipe_cli-1.4.0rc1/demo/video/README.md +17 -0
  7. smartpipe_cli-1.4.0rc1/demo/video/src/Main.tsx +55 -0
  8. smartpipe_cli-1.4.0rc1/demo/video/src/Root.tsx +57 -0
  9. smartpipe_cli-1.4.0rc1/demo/video/src/components/Background.tsx +46 -0
  10. smartpipe_cli-1.4.0rc1/demo/video/src/components/Caption.tsx +75 -0
  11. smartpipe_cli-1.4.0rc1/demo/video/src/components/FileGlyph.tsx +109 -0
  12. smartpipe_cli-1.4.0rc1/demo/video/src/components/SceneFrame.tsx +64 -0
  13. smartpipe_cli-1.4.0rc1/demo/video/src/components/Terminal.tsx +267 -0
  14. smartpipe_cli-1.4.0rc1/demo/video/src/components/Wordmark.tsx +80 -0
  15. smartpipe_cli-1.4.0rc1/demo/video/src/config.ts +52 -0
  16. smartpipe_cli-1.4.0rc1/demo/video/src/font.ts +9 -0
  17. smartpipe_cli-1.4.0rc1/demo/video/src/index.ts +4 -0
  18. smartpipe_cli-1.4.0rc1/demo/video/src/scenes/Close.tsx +82 -0
  19. smartpipe_cli-1.4.0rc1/demo/video/src/scenes/ColdOpen.tsx +60 -0
  20. smartpipe_cli-1.4.0rc1/demo/video/src/scenes/CostHonesty.tsx +203 -0
  21. smartpipe_cli-1.4.0rc1/demo/video/src/scenes/Hook.tsx +40 -0
  22. smartpipe_cli-1.4.0rc1/demo/video/src/scenes/Multimodal.tsx +182 -0
  23. smartpipe_cli-1.4.0rc1/demo/video/src/scenes/Scale.tsx +47 -0
  24. smartpipe_cli-1.4.0rc1/docs/assets/demo-thumb.jpg +0 -0
  25. {smartpipe_cli-1.3.1 → smartpipe_cli-1.4.0rc1}/docs/comparison.md +9 -13
  26. smartpipe_cli-1.4.0rc1/docs/concepts/feeding-smartpipe.md +99 -0
  27. {smartpipe_cli-1.3.1 → smartpipe_cli-1.4.0rc1}/docs/concepts/models-and-providers.md +42 -40
  28. {smartpipe_cli-1.3.1 → smartpipe_cli-1.4.0rc1}/docs/concepts/output-formats.md +28 -28
  29. {smartpipe_cli-1.3.1 → smartpipe_cli-1.4.0rc1}/docs/concepts/pipes-and-items.md +28 -27
  30. {smartpipe_cli-1.3.1 → smartpipe_cli-1.4.0rc1}/docs/concepts/structured-output.md +21 -23
  31. smartpipe_cli-1.4.0rc1/docs/concepts/the-item.md +103 -0
  32. {smartpipe_cli-1.3.1 → smartpipe_cli-1.4.0rc1}/docs/cookbook/README.md +18 -14
  33. {smartpipe_cli-1.3.1 → smartpipe_cli-1.4.0rc1}/docs/cookbook/contract-extraction.md +15 -15
  34. smartpipe_cli-1.4.0rc1/docs/cookbook/customer-feedback.md +63 -0
  35. smartpipe_cli-1.4.0rc1/docs/cookbook/invoice-reconciliation.md +47 -0
  36. smartpipe_cli-1.4.0rc1/docs/cookbook/live-monitoring.md +104 -0
  37. smartpipe_cli-1.4.0rc1/docs/cookbook/log-triage.md +106 -0
  38. smartpipe_cli-1.4.0rc1/docs/cookbook/meeting-digest.md +41 -0
  39. {smartpipe_cli-1.3.1 → smartpipe_cli-1.4.0rc1}/docs/cookbook/ranking-documents.md +15 -15
  40. {smartpipe_cli-1.3.1 → smartpipe_cli-1.4.0rc1}/docs/cookbook/stream-enrichment.md +7 -7
  41. smartpipe_cli-1.4.0rc1/docs/cookbook/training-data-prep.md +140 -0
  42. smartpipe_cli-1.4.0rc1/docs/cookbook/video-qa.md +68 -0
  43. smartpipe_cli-1.4.0rc1/docs/cookbook/visualizing-results.md +113 -0
  44. smartpipe_cli-1.4.0rc1/docs/demo/index.html +24 -0
  45. smartpipe_cli-1.4.0rc1/docs/index.md +88 -0
  46. {smartpipe_cli-1.3.1 → smartpipe_cli-1.4.0rc1}/docs/inputs/files.md +50 -45
  47. smartpipe_cli-1.4.0rc1/docs/install.md +68 -0
  48. smartpipe_cli-1.3.1/docs/quickstart.md → smartpipe_cli-1.4.0rc1/docs/learn/1-first-pipeline.md +46 -43
  49. smartpipe_cli-1.4.0rc1/docs/learn/2-structured-data.md +75 -0
  50. smartpipe_cli-1.4.0rc1/docs/learn/3-files-and-media.md +65 -0
  51. smartpipe_cli-1.4.0rc1/docs/learn/4-free-verbs.md +49 -0
  52. smartpipe_cli-1.4.0rc1/docs/learn/5-scale-and-cost.md +56 -0
  53. smartpipe_cli-1.4.0rc1/docs/learn/6-pipelines-that-last.md +53 -0
  54. {smartpipe_cli-1.3.1 → smartpipe_cli-1.4.0rc1}/docs/privacy.md +11 -12
  55. smartpipe_cli-1.4.0rc1/docs/quickstart.md +5 -0
  56. smartpipe_cli-1.4.0rc1/docs/reference/agents.md +18 -0
  57. {smartpipe_cli-1.3.1 → smartpipe_cli-1.4.0rc1}/docs/reference/cli.md +43 -34
  58. {smartpipe_cli-1.3.1 → smartpipe_cli-1.4.0rc1}/docs/reference/custom-verbs.md +14 -14
  59. {smartpipe_cli-1.3.1 → smartpipe_cli-1.4.0rc1}/docs/reference/sem-files.md +28 -30
  60. {smartpipe_cli-1.3.1 → smartpipe_cli-1.4.0rc1}/docs/troubleshooting.md +57 -27
  61. smartpipe_cli-1.4.0rc1/docs/verbs/cluster.md +37 -0
  62. {smartpipe_cli-1.3.1 → smartpipe_cli-1.4.0rc1}/docs/verbs/diff.md +8 -9
  63. {smartpipe_cli-1.3.1 → smartpipe_cli-1.4.0rc1}/docs/verbs/distinct.md +18 -18
  64. {smartpipe_cli-1.3.1 → smartpipe_cli-1.4.0rc1}/docs/verbs/embed.md +18 -18
  65. {smartpipe_cli-1.3.1 → smartpipe_cli-1.4.0rc1}/docs/verbs/extend.md +10 -11
  66. {smartpipe_cli-1.3.1 → smartpipe_cli-1.4.0rc1}/docs/verbs/filter.md +31 -20
  67. smartpipe_cli-1.4.0rc1/docs/verbs/getschema.md +24 -0
  68. {smartpipe_cli-1.3.1 → smartpipe_cli-1.4.0rc1}/docs/verbs/join.md +24 -24
  69. {smartpipe_cli-1.3.1 → smartpipe_cli-1.4.0rc1}/docs/verbs/map.md +66 -45
  70. {smartpipe_cli-1.3.1 → smartpipe_cli-1.4.0rc1}/docs/verbs/outliers.md +10 -10
  71. {smartpipe_cli-1.3.1 → smartpipe_cli-1.4.0rc1}/docs/verbs/reduce.md +28 -29
  72. {smartpipe_cli-1.3.1 → smartpipe_cli-1.4.0rc1}/docs/verbs/sample.md +15 -15
  73. smartpipe_cli-1.4.0rc1/docs/verbs/sort.md +21 -0
  74. {smartpipe_cli-1.3.1 → smartpipe_cli-1.4.0rc1}/docs/verbs/split.md +24 -24
  75. {smartpipe_cli-1.3.1 → smartpipe_cli-1.4.0rc1}/docs/verbs/summarize.md +12 -12
  76. {smartpipe_cli-1.3.1 → smartpipe_cli-1.4.0rc1}/docs/verbs/top-k.md +28 -28
  77. {smartpipe_cli-1.3.1 → smartpipe_cli-1.4.0rc1}/docs/verbs/where.md +10 -22
  78. {smartpipe_cli-1.3.1 → smartpipe_cli-1.4.0rc1}/mkdocs.yml +14 -3
  79. {smartpipe_cli-1.3.1 → smartpipe_cli-1.4.0rc1}/pyproject.toml +7 -7
  80. {smartpipe_cli-1.3.1 → smartpipe_cli-1.4.0rc1}/qa/README.md +53 -6
  81. {smartpipe_cli-1.3.1 → smartpipe_cli-1.4.0rc1}/src/smartpipe/__init__.py +1 -1
  82. {smartpipe_cli-1.3.1 → smartpipe_cli-1.4.0rc1}/src/smartpipe/cli/chart_cmd.py +1 -1
  83. {smartpipe_cli-1.3.1 → smartpipe_cli-1.4.0rc1}/src/smartpipe/cli/cluster_cmd.py +8 -2
  84. {smartpipe_cli-1.3.1 → smartpipe_cli-1.4.0rc1}/src/smartpipe/cli/config_cmd.py +128 -24
  85. {smartpipe_cli-1.3.1 → smartpipe_cli-1.4.0rc1}/src/smartpipe/cli/distinct_cmd.py +16 -2
  86. {smartpipe_cli-1.3.1 → smartpipe_cli-1.4.0rc1}/src/smartpipe/cli/doctor_cmd.py +2 -0
  87. {smartpipe_cli-1.3.1 → smartpipe_cli-1.4.0rc1}/src/smartpipe/cli/embed_cmd.py +10 -4
  88. {smartpipe_cli-1.3.1 → smartpipe_cli-1.4.0rc1}/src/smartpipe/cli/extend_cmd.py +56 -1
  89. {smartpipe_cli-1.3.1 → smartpipe_cli-1.4.0rc1}/src/smartpipe/cli/filter_cmd.py +26 -3
  90. {smartpipe_cli-1.3.1 → smartpipe_cli-1.4.0rc1}/src/smartpipe/cli/getschema_cmd.py +1 -1
  91. {smartpipe_cli-1.3.1 → smartpipe_cli-1.4.0rc1}/src/smartpipe/cli/input_options.py +55 -4
  92. {smartpipe_cli-1.3.1 → smartpipe_cli-1.4.0rc1}/src/smartpipe/cli/join_cmd.py +56 -3
  93. {smartpipe_cli-1.3.1 → smartpipe_cli-1.4.0rc1}/src/smartpipe/cli/map_cmd.py +58 -3
  94. {smartpipe_cli-1.3.1 → smartpipe_cli-1.4.0rc1}/src/smartpipe/cli/outliers_cmd.py +8 -2
  95. smartpipe_cli-1.4.0rc1/src/smartpipe/cli/read_cmd.py +66 -0
  96. smartpipe_cli-1.4.0rc1/src/smartpipe/cli/readable_cmd.py +36 -0
  97. {smartpipe_cli-1.3.1 → smartpipe_cli-1.4.0rc1}/src/smartpipe/cli/reduce_cmd.py +8 -1
  98. {smartpipe_cli-1.3.1 → smartpipe_cli-1.4.0rc1}/src/smartpipe/cli/root.py +23 -0
  99. smartpipe_cli-1.4.0rc1/src/smartpipe/cli/schema_cmd.py +245 -0
  100. {smartpipe_cli-1.3.1 → smartpipe_cli-1.4.0rc1}/src/smartpipe/cli/screens.py +20 -2
  101. {smartpipe_cli-1.3.1 → smartpipe_cli-1.4.0rc1}/src/smartpipe/cli/sort_cmd.py +2 -2
  102. {smartpipe_cli-1.3.1 → smartpipe_cli-1.4.0rc1}/src/smartpipe/cli/split_cmd.py +11 -5
  103. {smartpipe_cli-1.3.1 → smartpipe_cli-1.4.0rc1}/src/smartpipe/cli/summarize_cmd.py +12 -2
  104. {smartpipe_cli-1.3.1 → smartpipe_cli-1.4.0rc1}/src/smartpipe/cli/top_k_cmd.py +9 -3
  105. {smartpipe_cli-1.3.1 → smartpipe_cli-1.4.0rc1}/src/smartpipe/cli/where_cmd.py +10 -2
  106. smartpipe_cli-1.4.0rc1/src/smartpipe/cli/write_cmd.py +60 -0
  107. {smartpipe_cli-1.3.1 → smartpipe_cli-1.4.0rc1}/src/smartpipe/config/display.py +2 -0
  108. {smartpipe_cli-1.3.1 → smartpipe_cli-1.4.0rc1}/src/smartpipe/config/store.py +3 -0
  109. {smartpipe_cli-1.3.1 → smartpipe_cli-1.4.0rc1}/src/smartpipe/container.py +44 -4
  110. {smartpipe_cli-1.3.1 → smartpipe_cli-1.4.0rc1}/src/smartpipe/core/errors.py +8 -0
  111. smartpipe_cli-1.4.0rc1/src/smartpipe/engine/chunking.py +348 -0
  112. {smartpipe_cli-1.3.1 → smartpipe_cli-1.4.0rc1}/src/smartpipe/engine/prompts.py +46 -0
  113. {smartpipe_cli-1.3.1 → smartpipe_cli-1.4.0rc1}/src/smartpipe/engine/runner.py +80 -15
  114. {smartpipe_cli-1.3.1 → smartpipe_cli-1.4.0rc1}/src/smartpipe/engine/schema.py +79 -2
  115. {smartpipe_cli-1.3.1 → smartpipe_cli-1.4.0rc1}/src/smartpipe/engine/schema_dsl.py +25 -3
  116. {smartpipe_cli-1.3.1 → smartpipe_cli-1.4.0rc1}/src/smartpipe/io/inputs.py +3 -1
  117. smartpipe_cli-1.4.0rc1/src/smartpipe/io/items.py +255 -0
  118. {smartpipe_cli-1.3.1 → smartpipe_cli-1.4.0rc1}/src/smartpipe/io/leaderboard.py +1 -1
  119. {smartpipe_cli-1.3.1 → smartpipe_cli-1.4.0rc1}/src/smartpipe/io/metering.py +43 -0
  120. {smartpipe_cli-1.3.1 → smartpipe_cli-1.4.0rc1}/src/smartpipe/io/progress.py +60 -7
  121. {smartpipe_cli-1.3.1 → smartpipe_cli-1.4.0rc1}/src/smartpipe/io/readers.py +217 -16
  122. smartpipe_cli-1.4.0rc1/src/smartpipe/io/render.py +163 -0
  123. {smartpipe_cli-1.3.1 → smartpipe_cli-1.4.0rc1}/src/smartpipe/io/writers.py +87 -31
  124. {smartpipe_cli-1.3.1 → smartpipe_cli-1.4.0rc1}/src/smartpipe/models/anthropic_adapter.py +5 -1
  125. {smartpipe_cli-1.3.1 → smartpipe_cli-1.4.0rc1}/src/smartpipe/models/gemini_native.py +16 -3
  126. {smartpipe_cli-1.3.1 → smartpipe_cli-1.4.0rc1}/src/smartpipe/models/ollama.py +7 -4
  127. {smartpipe_cli-1.3.1 → smartpipe_cli-1.4.0rc1}/src/smartpipe/models/openai_codex.py +3 -1
  128. {smartpipe_cli-1.3.1 → smartpipe_cli-1.4.0rc1}/src/smartpipe/models/openai_compat.py +5 -3
  129. {smartpipe_cli-1.3.1 → smartpipe_cli-1.4.0rc1}/src/smartpipe/parsing/extract.py +7 -2
  130. {smartpipe_cli-1.3.1 → smartpipe_cli-1.4.0rc1}/src/smartpipe/verbs/chart.py +1 -1
  131. {smartpipe_cli-1.3.1 → smartpipe_cli-1.4.0rc1}/src/smartpipe/verbs/common.py +116 -14
  132. {smartpipe_cli-1.3.1 → smartpipe_cli-1.4.0rc1}/src/smartpipe/verbs/distinct.py +66 -7
  133. {smartpipe_cli-1.3.1 → smartpipe_cli-1.4.0rc1}/src/smartpipe/verbs/embed.py +6 -4
  134. {smartpipe_cli-1.3.1 → smartpipe_cli-1.4.0rc1}/src/smartpipe/verbs/extend.py +81 -19
  135. {smartpipe_cli-1.3.1 → smartpipe_cli-1.4.0rc1}/src/smartpipe/verbs/filter.py +70 -16
  136. {smartpipe_cli-1.3.1 → smartpipe_cli-1.4.0rc1}/src/smartpipe/verbs/join.py +286 -24
  137. {smartpipe_cli-1.3.1 → smartpipe_cli-1.4.0rc1}/src/smartpipe/verbs/map.py +165 -33
  138. smartpipe_cli-1.4.0rc1/src/smartpipe/verbs/oversize.py +379 -0
  139. smartpipe_cli-1.4.0rc1/src/smartpipe/verbs/readable.py +54 -0
  140. {smartpipe_cli-1.3.1 → smartpipe_cli-1.4.0rc1}/src/smartpipe/verbs/reduce.py +37 -3
  141. {smartpipe_cli-1.3.1 → smartpipe_cli-1.4.0rc1}/src/smartpipe/verbs/sortverb.py +1 -1
  142. {smartpipe_cli-1.3.1 → smartpipe_cli-1.4.0rc1}/src/smartpipe/verbs/split.py +56 -23
  143. {smartpipe_cli-1.3.1 → smartpipe_cli-1.4.0rc1}/src/smartpipe/verbs/summarize.py +21 -0
  144. {smartpipe_cli-1.3.1 → smartpipe_cli-1.4.0rc1}/src/smartpipe/verbs/top_k.py +1 -1
  145. {smartpipe_cli-1.3.1 → smartpipe_cli-1.4.0rc1}/src/smartpipe/verbs/where.py +17 -0
  146. smartpipe_cli-1.4.0rc1/src/smartpipe/verbs/write.py +209 -0
  147. smartpipe_cli-1.3.1/PKG-INFO +0 -186
  148. smartpipe_cli-1.3.1/README.md +0 -150
  149. smartpipe_cli-1.3.1/docs/cookbook/live-monitoring.md +0 -85
  150. smartpipe_cli-1.3.1/docs/cookbook/log-triage.md +0 -65
  151. smartpipe_cli-1.3.1/docs/cookbook/training-data-prep.md +0 -70
  152. smartpipe_cli-1.3.1/docs/cookbook/video-qa.md +0 -52
  153. smartpipe_cli-1.3.1/docs/cookbook/visualizing-results.md +0 -113
  154. smartpipe_cli-1.3.1/docs/index.md +0 -70
  155. smartpipe_cli-1.3.1/docs/install.md +0 -92
  156. smartpipe_cli-1.3.1/docs/verbs/cluster.md +0 -39
  157. smartpipe_cli-1.3.1/docs/verbs/getschema.md +0 -26
  158. smartpipe_cli-1.3.1/docs/verbs/sort.md +0 -21
  159. smartpipe_cli-1.3.1/src/smartpipe/cli/schema_cmd.py +0 -75
  160. smartpipe_cli-1.3.1/src/smartpipe/engine/chunking.py +0 -161
  161. smartpipe_cli-1.3.1/src/smartpipe/io/items.py +0 -149
  162. {smartpipe_cli-1.3.1 → smartpipe_cli-1.4.0rc1}/CONTRIBUTING.md +0 -0
  163. {smartpipe_cli-1.3.1 → smartpipe_cli-1.4.0rc1}/LICENSE +0 -0
  164. {smartpipe_cli-1.3.1 → smartpipe_cli-1.4.0rc1}/NOTICE +0 -0
  165. {smartpipe_cli-1.3.1 → smartpipe_cli-1.4.0rc1}/src/smartpipe/__main__.py +0 -0
  166. {smartpipe_cli-1.3.1 → smartpipe_cli-1.4.0rc1}/src/smartpipe/assets/probe.png +0 -0
  167. {smartpipe_cli-1.3.1 → smartpipe_cli-1.4.0rc1}/src/smartpipe/assets/probe.txt +0 -0
  168. {smartpipe_cli-1.3.1 → smartpipe_cli-1.4.0rc1}/src/smartpipe/assets/probe.wav +0 -0
  169. {smartpipe_cli-1.3.1 → smartpipe_cli-1.4.0rc1}/src/smartpipe/cli/__init__.py +0 -0
  170. {smartpipe_cli-1.3.1 → smartpipe_cli-1.4.0rc1}/src/smartpipe/cli/auth_cmd.py +0 -0
  171. {smartpipe_cli-1.3.1 → smartpipe_cli-1.4.0rc1}/src/smartpipe/cli/cache_cmd.py +0 -0
  172. {smartpipe_cli-1.3.1 → smartpipe_cli-1.4.0rc1}/src/smartpipe/cli/cite_cmd.py +0 -0
  173. {smartpipe_cli-1.3.1 → smartpipe_cli-1.4.0rc1}/src/smartpipe/cli/completions.py +0 -0
  174. {smartpipe_cli-1.3.1 → smartpipe_cli-1.4.0rc1}/src/smartpipe/cli/diff_cmd.py +0 -0
  175. {smartpipe_cli-1.3.1 → smartpipe_cli-1.4.0rc1}/src/smartpipe/cli/echo_cmd.py +0 -0
  176. {smartpipe_cli-1.3.1 → smartpipe_cli-1.4.0rc1}/src/smartpipe/cli/interrupts.py +0 -0
  177. {smartpipe_cli-1.3.1 → smartpipe_cli-1.4.0rc1}/src/smartpipe/cli/probe_cmd.py +0 -0
  178. {smartpipe_cli-1.3.1 → smartpipe_cli-1.4.0rc1}/src/smartpipe/cli/run_cmd.py +0 -0
  179. {smartpipe_cli-1.3.1 → smartpipe_cli-1.4.0rc1}/src/smartpipe/cli/sample_cmd.py +0 -0
  180. {smartpipe_cli-1.3.1 → smartpipe_cli-1.4.0rc1}/src/smartpipe/cli/sem_file.py +0 -0
  181. {smartpipe_cli-1.3.1 → smartpipe_cli-1.4.0rc1}/src/smartpipe/cli/usage_cmd.py +0 -0
  182. {smartpipe_cli-1.3.1 → smartpipe_cli-1.4.0rc1}/src/smartpipe/config/__init__.py +0 -0
  183. {smartpipe_cli-1.3.1 → smartpipe_cli-1.4.0rc1}/src/smartpipe/config/credentials.py +0 -0
  184. {smartpipe_cli-1.3.1 → smartpipe_cli-1.4.0rc1}/src/smartpipe/config/doctor.py +0 -0
  185. {smartpipe_cli-1.3.1 → smartpipe_cli-1.4.0rc1}/src/smartpipe/config/paths.py +0 -0
  186. {smartpipe_cli-1.3.1 → smartpipe_cli-1.4.0rc1}/src/smartpipe/core/__init__.py +0 -0
  187. {smartpipe_cli-1.3.1 → smartpipe_cli-1.4.0rc1}/src/smartpipe/core/jsontools.py +0 -0
  188. {smartpipe_cli-1.3.1 → smartpipe_cli-1.4.0rc1}/src/smartpipe/engine/__init__.py +0 -0
  189. {smartpipe_cli-1.3.1 → smartpipe_cli-1.4.0rc1}/src/smartpipe/engine/aggregate.py +0 -0
  190. {smartpipe_cli-1.3.1 → smartpipe_cli-1.4.0rc1}/src/smartpipe/engine/blocking.py +0 -0
  191. {smartpipe_cli-1.3.1 → smartpipe_cli-1.4.0rc1}/src/smartpipe/engine/chart.py +0 -0
  192. {smartpipe_cli-1.3.1 → smartpipe_cli-1.4.0rc1}/src/smartpipe/engine/clustering.py +0 -0
  193. {smartpipe_cli-1.3.1 → smartpipe_cli-1.4.0rc1}/src/smartpipe/engine/predicate.py +0 -0
  194. {smartpipe_cli-1.3.1 → smartpipe_cli-1.4.0rc1}/src/smartpipe/engine/ranking.py +0 -0
  195. {smartpipe_cli-1.3.1 → smartpipe_cli-1.4.0rc1}/src/smartpipe/engine/tally.py +0 -0
  196. {smartpipe_cli-1.3.1 → smartpipe_cli-1.4.0rc1}/src/smartpipe/engine/timebin.py +0 -0
  197. {smartpipe_cli-1.3.1 → smartpipe_cli-1.4.0rc1}/src/smartpipe/engine/units.py +0 -0
  198. {smartpipe_cli-1.3.1 → smartpipe_cli-1.4.0rc1}/src/smartpipe/engine/windows.py +0 -0
  199. {smartpipe_cli-1.3.1 → smartpipe_cli-1.4.0rc1}/src/smartpipe/io/__init__.py +0 -0
  200. {smartpipe_cli-1.3.1 → smartpipe_cli-1.4.0rc1}/src/smartpipe/io/diagnostics.py +0 -0
  201. {smartpipe_cli-1.3.1 → smartpipe_cli-1.4.0rc1}/src/smartpipe/io/text.py +0 -0
  202. {smartpipe_cli-1.3.1 → smartpipe_cli-1.4.0rc1}/src/smartpipe/io/tty.py +0 -0
  203. {smartpipe_cli-1.3.1 → smartpipe_cli-1.4.0rc1}/src/smartpipe/io/usage.py +0 -0
  204. {smartpipe_cli-1.3.1 → smartpipe_cli-1.4.0rc1}/src/smartpipe/models/__init__.py +0 -0
  205. {smartpipe_cli-1.3.1 → smartpipe_cli-1.4.0rc1}/src/smartpipe/models/base.py +0 -0
  206. {smartpipe_cli-1.3.1 → smartpipe_cli-1.4.0rc1}/src/smartpipe/models/budget.py +0 -0
  207. {smartpipe_cli-1.3.1 → smartpipe_cli-1.4.0rc1}/src/smartpipe/models/cache.py +0 -0
  208. {smartpipe_cli-1.3.1 → smartpipe_cli-1.4.0rc1}/src/smartpipe/models/http_support.py +0 -0
  209. {smartpipe_cli-1.3.1 → smartpipe_cli-1.4.0rc1}/src/smartpipe/models/jina.py +0 -0
  210. {smartpipe_cli-1.3.1 → smartpipe_cli-1.4.0rc1}/src/smartpipe/models/local_embed.py +0 -0
  211. {smartpipe_cli-1.3.1 → smartpipe_cli-1.4.0rc1}/src/smartpipe/models/openai_oauth.py +0 -0
  212. {smartpipe_cli-1.3.1 → smartpipe_cli-1.4.0rc1}/src/smartpipe/models/resolve.py +0 -0
  213. {smartpipe_cli-1.3.1 → smartpipe_cli-1.4.0rc1}/src/smartpipe/models/retry.py +0 -0
  214. {smartpipe_cli-1.3.1 → smartpipe_cli-1.4.0rc1}/src/smartpipe/models/stt.py +0 -0
  215. {smartpipe_cli-1.3.1 → smartpipe_cli-1.4.0rc1}/src/smartpipe/models/windows.py +0 -0
  216. {smartpipe_cli-1.3.1 → smartpipe_cli-1.4.0rc1}/src/smartpipe/parsing/__init__.py +0 -0
  217. {smartpipe_cli-1.3.1 → smartpipe_cli-1.4.0rc1}/src/smartpipe/parsing/detect.py +0 -0
  218. {smartpipe_cli-1.3.1 → smartpipe_cli-1.4.0rc1}/src/smartpipe/py.typed +0 -0
  219. {smartpipe_cli-1.3.1 → smartpipe_cli-1.4.0rc1}/src/smartpipe/verbs/__init__.py +0 -0
  220. {smartpipe_cli-1.3.1 → smartpipe_cli-1.4.0rc1}/src/smartpipe/verbs/cluster.py +0 -0
  221. {smartpipe_cli-1.3.1 → smartpipe_cli-1.4.0rc1}/src/smartpipe/verbs/convert.py +0 -0
  222. {smartpipe_cli-1.3.1 → smartpipe_cli-1.4.0rc1}/src/smartpipe/verbs/diff.py +0 -0
  223. {smartpipe_cli-1.3.1 → smartpipe_cli-1.4.0rc1}/src/smartpipe/verbs/getschema.py +0 -0
  224. {smartpipe_cli-1.3.1 → smartpipe_cli-1.4.0rc1}/src/smartpipe/verbs/outliers.py +0 -0
  225. {smartpipe_cli-1.3.1 → smartpipe_cli-1.4.0rc1}/src/smartpipe/verbs/sample.py +0 -0
  226. {smartpipe_cli-1.3.1 → smartpipe_cli-1.4.0rc1}/tests/corpus/README.md +0 -0
@@ -23,3 +23,7 @@ context/
23
23
  /plan/
24
24
  /TODO.md
25
25
  /idea.md
26
+
27
+ # Local-only scratch folder — never tracked, never in the sdist
28
+ /local/
29
+ .claude/
@@ -5,6 +5,86 @@ 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
+
8
88
  ## [1.3.1] — 2026-07-08
9
89
 
10
90
  ### Fixed
@@ -7,5 +7,5 @@ authors:
7
7
  given-names: Prabal
8
8
  repository-code: "https://github.com/prabal-rje/smartpipe"
9
9
  license: Apache-2.0
10
- version: 1.3.1
10
+ version: 1.4.0rc1
11
11
  date-released: '2026-07-08'
@@ -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
+ [![CI](https://github.com/prabal-rje/smartpipe/actions/workflows/ci.yml/badge.svg)](https://github.com/prabal-rje/smartpipe/actions/workflows/ci.yml)
40
+ [![PyPI](https://img.shields.io/pypi/v/smartpipe-cli)](https://pypi.org/project/smartpipe-cli/)
41
+ [![Python](https://img.shields.io/badge/python-3.11%E2%80%933.13-blue)](pyproject.toml)
42
+ [![Docs](https://img.shields.io/badge/docs-prabal--rje.github.io%2Fsmartpipe-blue)](https://prabal-rje.github.io/smartpipe/)
43
+ [![License: Apache 2.0](https://img.shields.io/badge/License-Apache_2.0-blue)](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
+ [![smartpipe demo - click to play with sound and controls](https://github.com/prabal-rje/smartpipe/releases/download/demo-assets/smartpipe-teaser-v2.gif)](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
+ [![CI](https://github.com/prabal-rje/smartpipe/actions/workflows/ci.yml/badge.svg)](https://github.com/prabal-rje/smartpipe/actions/workflows/ci.yml)
4
+ [![PyPI](https://img.shields.io/pypi/v/smartpipe-cli)](https://pypi.org/project/smartpipe-cli/)
5
+ [![Python](https://img.shields.io/badge/python-3.11%E2%80%933.13-blue)](pyproject.toml)
6
+ [![Docs](https://img.shields.io/badge/docs-prabal--rje.github.io%2Fsmartpipe-blue)](https://prabal-rje.github.io/smartpipe/)
7
+ [![License: Apache 2.0](https://img.shields.io/badge/License-Apache_2.0-blue)](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
+ [![smartpipe demo - click to play with sound and controls](https://github.com/prabal-rje/smartpipe/releases/download/demo-assets/smartpipe-teaser-v2.gif)](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.
@@ -0,0 +1,55 @@
1
+ import React from "react";
2
+ import { AbsoluteFill, Audio, interpolate, Series, staticFile } from "remotion";
3
+ import { SCENE, TOTAL_FRAMES } from "./config";
4
+ import { Background } from "./components/Background";
5
+ import { Close } from "./scenes/Close";
6
+ import { ColdOpen } from "./scenes/ColdOpen";
7
+ import { CostHonesty } from "./scenes/CostHonesty";
8
+ import { Hook } from "./scenes/Hook";
9
+ import { Multimodal } from "./scenes/Multimodal";
10
+ import { Scale } from "./scenes/Scale";
11
+
12
+ /** The full ~70s cut: one persistent background, six scenes in series. */
13
+ export const Main: React.FC = () => {
14
+ return (
15
+ <AbsoluteFill>
16
+ {/* Music bed: Silicon Prism Waltz (60s, looped to cover the 70s cut).
17
+ Volume envelope: quick fade-in, steady bed, fade-out over the close.
18
+ A fully synthesized fallback lives at scripts/make-music.mjs. */}
19
+ <Audio
20
+ loop
21
+ src={staticFile("silicon-prism-waltz.m4a")}
22
+ volume={(f) =>
23
+ 0.55 *
24
+ interpolate(
25
+ f,
26
+ [0, 36, TOTAL_FRAMES - 96, TOTAL_FRAMES - 8],
27
+ [0, 1, 1, 0],
28
+ { extrapolateLeft: "clamp", extrapolateRight: "clamp" },
29
+ )
30
+ }
31
+ />
32
+ <Background />
33
+ <Series>
34
+ <Series.Sequence durationInFrames={SCENE.coldOpen}>
35
+ <ColdOpen />
36
+ </Series.Sequence>
37
+ <Series.Sequence durationInFrames={SCENE.hook}>
38
+ <Hook />
39
+ </Series.Sequence>
40
+ <Series.Sequence durationInFrames={SCENE.multimodal}>
41
+ <Multimodal />
42
+ </Series.Sequence>
43
+ <Series.Sequence durationInFrames={SCENE.cost}>
44
+ <CostHonesty />
45
+ </Series.Sequence>
46
+ <Series.Sequence durationInFrames={SCENE.scale}>
47
+ <Scale />
48
+ </Series.Sequence>
49
+ <Series.Sequence durationInFrames={SCENE.close}>
50
+ <Close />
51
+ </Series.Sequence>
52
+ </Series>
53
+ </AbsoluteFill>
54
+ );
55
+ };