TalkPipe 1.0.2b2__tar.gz → 1.0.2b3__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 (366) hide show
  1. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/CHANGELOG.md +17 -0
  2. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/PKG-INFO +6 -9
  3. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/README.md +5 -8
  4. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/appcenter/README.md +69 -8
  5. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/docs/architecture/chatterlang.md +22 -0
  6. talkpipe-1.0.2b3/docs/chatterlang_workbench_screenshot.png +0 -0
  7. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/src/talkpipe/llm/chat.py +40 -0
  8. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/src/talkpipe/llm/prompt_adapter_base.py +14 -1
  9. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/src/talkpipe/llm/prompt_adapters_anthropic.py +5 -1
  10. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/src/talkpipe/llm/prompt_adapters_ollama.py +6 -1
  11. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/src/talkpipe/llm/prompt_adapters_openai.py +4 -0
  12. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/src/talkpipe.egg-info/PKG-INFO +6 -9
  13. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/src/talkpipe.egg-info/SOURCES.txt +1 -0
  14. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/src/talkpipe.egg-info/scm_file_list.json +1 -0
  15. talkpipe-1.0.2b3/src/talkpipe.egg-info/scm_version.json +8 -0
  16. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/tests/talkpipe/llm/test_chat.py +68 -0
  17. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/tests/talkpipe/llm/test_prompt_adapters_anthropic.py +19 -0
  18. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/tests/talkpipe/llm/test_prompt_adapters_eliza.py +18 -0
  19. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/tests/talkpipe/llm/test_prompt_adapters_ollama.py +36 -0
  20. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/tests/talkpipe/llm/test_prompt_adapters_openai.py +36 -0
  21. talkpipe-1.0.2b2/src/talkpipe.egg-info/scm_version.json +0 -8
  22. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/.cursor/skills/changelog-update/SKILL.md +0 -0
  23. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/.cursor/skills/doc-example-formatting/SKILL.md +0 -0
  24. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/.cursor/skills/run-documentation-examples/SKILL.md +0 -0
  25. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/.cursor/skills/run-documentation-examples/scripts/run_documentation_examples.py +0 -0
  26. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/.cursor/skills/test-driven-development/SKILL.md +0 -0
  27. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/.cursor/skills/update-entry-points/SKILL.md +0 -0
  28. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/.cursor/skills/update-entry-points/scripts/update_entry_points.py +0 -0
  29. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/.dockerignore +0 -0
  30. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/.gitea/default_merge_message/MERGE_TEMPLATE.md +0 -0
  31. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/.gitea/default_merge_message/SQUASH_TEMPLATE.md +0 -0
  32. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/.github/CICD.md +0 -0
  33. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/.github/ISSUE_TEMPLATE/release-checklist.md +0 -0
  34. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/.github/SECURITY.md +0 -0
  35. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/.github/copilot-instructions.md +0 -0
  36. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/.github/dependabot.yml +0 -0
  37. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/.github/prompts/add-segment.prompt.md +0 -0
  38. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/.github/prompts/changelog.prompt.md +0 -0
  39. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/.github/prompts/doc-examples.prompt.md +0 -0
  40. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/.github/prompts/tdd.prompt.md +0 -0
  41. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/.github/prompts/update-entry-points.prompt.md +0 -0
  42. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/.github/workflows/ci-cd.yml +0 -0
  43. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/.gitignore +0 -0
  44. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/.pre-commit-config.yaml +0 -0
  45. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/.safety-policy.yml +0 -0
  46. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/.safety-project.ini +0 -0
  47. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/.vscode/settings.json +0 -0
  48. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/.vscode/tasks.json +0 -0
  49. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/AGENTS.md +0 -0
  50. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/COPYRIGHT +0 -0
  51. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/Dockerfile +0 -0
  52. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/LICENSE +0 -0
  53. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/RELEASING.md +0 -0
  54. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/appcenter/install.ps1 +0 -0
  55. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/appcenter/install.sh +0 -0
  56. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/appcenter/talkpipe.toml +0 -0
  57. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/appcenter/talkpipe_appcenter.py +0 -0
  58. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/appcenter/tests/conftest.py +0 -0
  59. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/appcenter/tests/test_actions.py +0 -0
  60. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/appcenter/tests/test_bootstrap.py +0 -0
  61. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/appcenter/tests/test_catalog.py +0 -0
  62. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/appcenter/tests/test_channel.py +0 -0
  63. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/appcenter/tests/test_cli.py +0 -0
  64. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/appcenter/tests/test_packaging.py +0 -0
  65. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/appcenter/tests/test_shortcut.py +0 -0
  66. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/appcenter/tests/test_status.py +0 -0
  67. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/appcenter/tests/test_tui.py +0 -0
  68. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/appcenter/tests/test_uv.py +0 -0
  69. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/docs/.gitignore +0 -0
  70. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/docs/LLMChat.png +0 -0
  71. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/docs/LLMEvaluateWebPage.png +0 -0
  72. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/docs/README.md +0 -0
  73. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/docs/TalkPipe.png +0 -0
  74. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/docs/TalkPipe.xcf +0 -0
  75. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/docs/api-reference/README.md +0 -0
  76. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/docs/api-reference/chatterlang-script.md +0 -0
  77. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/docs/api-reference/chatterlang-server.md +0 -0
  78. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/docs/api-reference/chatterlang-workbench.md +0 -0
  79. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/docs/api-reference/lazy-loading.md +0 -0
  80. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/docs/api-reference/talkpipe-plugin-manager.md +0 -0
  81. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/docs/api-reference/talkpipe-ref.md +0 -0
  82. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/docs/architecture/README.md +0 -0
  83. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/docs/architecture/configuration.md +0 -0
  84. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/docs/architecture/documentation-formatting.md +0 -0
  85. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/docs/architecture/extending-talkpipe.md +0 -0
  86. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/docs/architecture/metadata-stream.md +0 -0
  87. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/docs/architecture/pipe-api.md +0 -0
  88. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/docs/architecture/protocol.md +0 -0
  89. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/docs/architecture/security.md +0 -0
  90. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/docs/architecture/streaming.md +0 -0
  91. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/docs/contributing/developer-handbook.md +0 -0
  92. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/docs/guides/container-images.md +0 -0
  93. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/docs/guides/makevectordatabase-and-serverag.md +0 -0
  94. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/docs/guides/model-and-source-configuration.md +0 -0
  95. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/docs/guides/model2vec-embeddings.md +0 -0
  96. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/docs/make_structure_diagram.sh +0 -0
  97. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/docs/quickstart.md +0 -0
  98. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/docs/structure.tex +0 -0
  99. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/docs/talkpipe_architecture.png +0 -0
  100. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/docs/talkpipe_architecture.tex +0 -0
  101. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/docs/talkpipe_diagram.png +0 -0
  102. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/docs/tutorials/.gitignore +0 -0
  103. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/docs/tutorials/README.md +0 -0
  104. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/docs/tutorials/Tutorial_1-Document_Indexing/README.md +0 -0
  105. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/docs/tutorials/Tutorial_1-Document_Indexing/Step_1_CreateSyntheticData.bat +0 -0
  106. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/docs/tutorials/Tutorial_1-Document_Indexing/Step_1_CreateSyntheticData.script +0 -0
  107. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/docs/tutorials/Tutorial_1-Document_Indexing/Step_1_CreateSyntheticData.sh +0 -0
  108. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/docs/tutorials/Tutorial_1-Document_Indexing/Step_2_IndexStories.bat +0 -0
  109. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/docs/tutorials/Tutorial_1-Document_Indexing/Step_2_IndexStories.script +0 -0
  110. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/docs/tutorials/Tutorial_1-Document_Indexing/Step_2_IndexStories.sh +0 -0
  111. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/docs/tutorials/Tutorial_1-Document_Indexing/Step_3_SearchStories.bat +0 -0
  112. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/docs/tutorials/Tutorial_1-Document_Indexing/Step_3_SearchStories.script +0 -0
  113. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/docs/tutorials/Tutorial_1-Document_Indexing/Step_3_SearchStories.sh +0 -0
  114. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/docs/tutorials/Tutorial_1-Document_Indexing/stories.json +0 -0
  115. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/docs/tutorials/Tutorial_1-Document_Indexing/story_search_ui.yml +0 -0
  116. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/docs/tutorials/Tutorial_2-Search_by_Example_and_RAG/README.md +0 -0
  117. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/docs/tutorials/Tutorial_2-Search_by_Example_and_RAG/Step_1_CreateVectorDatabase.bat +0 -0
  118. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/docs/tutorials/Tutorial_2-Search_by_Example_and_RAG/Step_1_CreateVectorDatabase.script +0 -0
  119. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/docs/tutorials/Tutorial_2-Search_by_Example_and_RAG/Step_1_CreateVectorDatabase.sh +0 -0
  120. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/docs/tutorials/Tutorial_2-Search_by_Example_and_RAG/Step_2_SearchByExample.bat +0 -0
  121. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/docs/tutorials/Tutorial_2-Search_by_Example_and_RAG/Step_2_SearchByExample.script +0 -0
  122. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/docs/tutorials/Tutorial_2-Search_by_Example_and_RAG/Step_2_SearchByExample.sh +0 -0
  123. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/docs/tutorials/Tutorial_2-Search_by_Example_and_RAG/Step_3_SpecializedRag.bat +0 -0
  124. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/docs/tutorials/Tutorial_2-Search_by_Example_and_RAG/Step_3_SpecializedRag.script +0 -0
  125. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/docs/tutorials/Tutorial_2-Search_by_Example_and_RAG/Step_3_SpecializedRag.sh +0 -0
  126. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/docs/tutorials/Tutorial_2-Search_by_Example_and_RAG/step_3_extras.py +0 -0
  127. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/docs/tutorials/Tutorial_2-Search_by_Example_and_RAG/story_by_example_ui.yml +0 -0
  128. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/docs/tutorials/Tutorial_3_Report_Writing/README.md +0 -0
  129. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/docs/tutorials/Tutorial_3_Report_Writing/Step_1_ExecutiveSummaryGeneration.bat +0 -0
  130. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/docs/tutorials/Tutorial_3_Report_Writing/Step_1_ExecutiveSummaryGeneration.script +0 -0
  131. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/docs/tutorials/Tutorial_3_Report_Writing/Step_1_ExecutiveSummaryGeneration.sh +0 -0
  132. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/docs/tutorials/Tutorial_3_Report_Writing/Step_2_DetailedAnalysisReportGeneration.bat +0 -0
  133. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/docs/tutorials/Tutorial_3_Report_Writing/Step_2_DetailedAnalysisReportGeneration.script +0 -0
  134. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/docs/tutorials/Tutorial_3_Report_Writing/Step_2_DetailedAnalysisReportGeneration.sh +0 -0
  135. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/docs/tutorials/Tutorial_3_Report_Writing/Step_3_MultiFormatReportGeneration.bat +0 -0
  136. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/docs/tutorials/Tutorial_3_Report_Writing/Step_3_MultiFormatReportGeneration.script +0 -0
  137. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/docs/tutorials/Tutorial_3_Report_Writing/Step_3_MultiFormatReportGeneration.sh +0 -0
  138. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/docs/tutorials/Tutorial_3_Report_Writing/file_structure.md +0 -0
  139. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/docs/tutorials/Tutorial_3_Report_Writing/multi_format_ui.yml +0 -0
  140. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/docs/tutorials/Tutorial_3_Report_Writing/report_topic_ui.yml +0 -0
  141. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/docs/tutorials/Tutorial_3_Report_Writing/step_1_extras.py +0 -0
  142. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/docs/tutorials/Tutorial_3_Report_Writing/step_2_extras.py +0 -0
  143. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/docs/tutorials/Tutorial_3_Report_Writing/step_3_extras.py +0 -0
  144. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/docs/workbench_demo.mp4 +0 -0
  145. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/frontend/.gitignore +0 -0
  146. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/frontend/README.md +0 -0
  147. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/frontend/build.mjs +0 -0
  148. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/frontend/package-lock.json +0 -0
  149. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/frontend/package.json +0 -0
  150. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/frontend/src/cm.js +0 -0
  151. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/pyproject.toml +0 -0
  152. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/pytest.ini +0 -0
  153. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/scripts/extract_documentation_examples.py +0 -0
  154. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/setup.cfg +0 -0
  155. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/src/talkpipe/__init__.py +0 -0
  156. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/src/talkpipe/app/__init__.py +0 -0
  157. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/src/talkpipe/app/chatterlang_generate_entry_points.py +0 -0
  158. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/src/talkpipe/app/chatterlang_reference_browser.py +0 -0
  159. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/src/talkpipe/app/chatterlang_reference_generator.py +0 -0
  160. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/src/talkpipe/app/chatterlang_script.py +0 -0
  161. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/src/talkpipe/app/chatterlang_serve.py +0 -0
  162. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/src/talkpipe/app/chatterlang_workbench.py +0 -0
  163. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/src/talkpipe/app/doc_examples.py +0 -0
  164. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/src/talkpipe/app/makevectordatabase.py +0 -0
  165. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/src/talkpipe/app/precache_model2vec.py +0 -0
  166. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/src/talkpipe/app/server_common.py +0 -0
  167. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/src/talkpipe/app/serverag.py +0 -0
  168. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/src/talkpipe/app/static/favicon.ico +0 -0
  169. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/src/talkpipe/app/static/serve/common.js +0 -0
  170. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/src/talkpipe/app/static/serve/index.css +0 -0
  171. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/src/talkpipe/app/static/serve/index.js +0 -0
  172. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/src/talkpipe/app/static/serve/stream.css +0 -0
  173. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/src/talkpipe/app/static/serve/stream.js +0 -0
  174. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/src/talkpipe/app/static/serve/vendor/LICENSES.txt +0 -0
  175. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/src/talkpipe/app/static/serve/vendor/marked.min.js +0 -0
  176. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/src/talkpipe/app/static/serve/vendor/purify.min.js +0 -0
  177. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/src/talkpipe/app/static/talkpipe_logo.png +0 -0
  178. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/src/talkpipe/app/static/workbench/app.js +0 -0
  179. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/src/talkpipe/app/static/workbench/editor.js +0 -0
  180. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/src/talkpipe/app/static/workbench/index.html +0 -0
  181. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/src/talkpipe/app/static/workbench/styles.css +0 -0
  182. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/src/talkpipe/app/static/workbench/suggest.js +0 -0
  183. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/src/talkpipe/app/static/workbench/vendor/LICENSES.txt +0 -0
  184. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/src/talkpipe/app/static/workbench/vendor/codemirror.js +0 -0
  185. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/src/talkpipe/app/static/workbench/workspace.js +0 -0
  186. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/src/talkpipe/app/talkpipe_plugin_manager.py +0 -0
  187. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/src/talkpipe/app/templates/chatterlang_serve/index.html +0 -0
  188. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/src/talkpipe/app/templates/chatterlang_serve/stream.html +0 -0
  189. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/src/talkpipe/app/workbench/__init__.py +0 -0
  190. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/src/talkpipe/app/workbench/corpus.py +0 -0
  191. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/src/talkpipe/app/workbench/reference_api.py +0 -0
  192. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/src/talkpipe/app/workbench/suggest.py +0 -0
  193. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/src/talkpipe/app/workbench/suggest_api.py +0 -0
  194. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/src/talkpipe/app/workbench/workspace.py +0 -0
  195. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/src/talkpipe/app/workbench/workspace_api.py +0 -0
  196. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/src/talkpipe/app/workbench_data/seed_scripts/README.md +0 -0
  197. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/src/talkpipe/app/workbench_data/seed_scripts/tutorial_1-document_indexing__step_1_createsyntheticdata.script +0 -0
  198. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/src/talkpipe/app/workbench_data/seed_scripts/tutorial_1-document_indexing__step_2_indexstories.script +0 -0
  199. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/src/talkpipe/app/workbench_data/seed_scripts/tutorial_1-document_indexing__step_3_searchstories.script +0 -0
  200. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/src/talkpipe/app/workbench_data/seed_scripts/tutorial_2-search_by_example_and_rag__step_1_createvectordatabase.script +0 -0
  201. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/src/talkpipe/app/workbench_data/seed_scripts/tutorial_2-search_by_example_and_rag__step_2_searchbyexample.script +0 -0
  202. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/src/talkpipe/app/workbench_data/seed_scripts/tutorial_2-search_by_example_and_rag__step_3_specializedrag.script +0 -0
  203. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/src/talkpipe/app/workbench_data/seed_scripts/tutorial_3_report_writing__step_1_executivesummarygeneration.script +0 -0
  204. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/src/talkpipe/app/workbench_data/seed_scripts/tutorial_3_report_writing__step_2_detailedanalysisreportgeneration.script +0 -0
  205. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/src/talkpipe/app/workbench_data/seed_scripts/tutorial_3_report_writing__step_3_multiformatreportgeneration.script +0 -0
  206. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/src/talkpipe/chatterlang/__init__.py +0 -0
  207. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/src/talkpipe/chatterlang/compiler.py +0 -0
  208. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/src/talkpipe/chatterlang/parsers.py +0 -0
  209. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/src/talkpipe/chatterlang/registry.py +0 -0
  210. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/src/talkpipe/data/__init__.py +0 -0
  211. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/src/talkpipe/data/email.py +0 -0
  212. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/src/talkpipe/data/extraction.py +0 -0
  213. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/src/talkpipe/data/html.py +0 -0
  214. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/src/talkpipe/data/image.py +0 -0
  215. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/src/talkpipe/data/mongo.py +0 -0
  216. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/src/talkpipe/data/rss.py +0 -0
  217. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/src/talkpipe/data/text/__init__.py +0 -0
  218. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/src/talkpipe/data/text/chunking_units.py +0 -0
  219. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/src/talkpipe/data/text/cleaning.py +0 -0
  220. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/src/talkpipe/data/text/englishnormalize.py +0 -0
  221. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/src/talkpipe/data/text/operations.py +0 -0
  222. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/src/talkpipe/llm/__init__.py +0 -0
  223. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/src/talkpipe/llm/_ollama_common.py +0 -0
  224. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/src/talkpipe/llm/config.py +0 -0
  225. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/src/talkpipe/llm/content.py +0 -0
  226. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/src/talkpipe/llm/embedding.py +0 -0
  227. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/src/talkpipe/llm/embedding_adapters.py +0 -0
  228. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/src/talkpipe/llm/embedding_adapters_model2vec.py +0 -0
  229. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/src/talkpipe/llm/embedding_adapters_openai.py +0 -0
  230. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/src/talkpipe/llm/embedding_errors.py +0 -0
  231. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/src/talkpipe/llm/model2vec_embeddings.py +0 -0
  232. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/src/talkpipe/llm/multimodal.py +0 -0
  233. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/src/talkpipe/llm/prompt_adapter_memory.py +0 -0
  234. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/src/talkpipe/llm/prompt_adapters.py +0 -0
  235. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/src/talkpipe/llm/prompt_adapters_eliza.py +0 -0
  236. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/src/talkpipe/llm/vision.py +0 -0
  237. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/src/talkpipe/operations/__init__.py +0 -0
  238. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/src/talkpipe/operations/filtering.py +0 -0
  239. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/src/talkpipe/operations/matrices.py +0 -0
  240. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/src/talkpipe/operations/thread_ops.py +0 -0
  241. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/src/talkpipe/operations/transforms.py +0 -0
  242. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/src/talkpipe/pipe/__init__.py +0 -0
  243. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/src/talkpipe/pipe/basic.py +0 -0
  244. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/src/talkpipe/pipe/collect.py +0 -0
  245. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/src/talkpipe/pipe/core.py +0 -0
  246. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/src/talkpipe/pipe/debug.py +0 -0
  247. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/src/talkpipe/pipe/fields.py +0 -0
  248. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/src/talkpipe/pipe/filters.py +0 -0
  249. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/src/talkpipe/pipe/flow.py +0 -0
  250. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/src/talkpipe/pipe/fork.py +0 -0
  251. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/src/talkpipe/pipe/hashing.py +0 -0
  252. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/src/talkpipe/pipe/io.py +0 -0
  253. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/src/talkpipe/pipe/math.py +0 -0
  254. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/src/talkpipe/pipe/metadata.py +0 -0
  255. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/src/talkpipe/pipe/shell.py +0 -0
  256. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/src/talkpipe/pipelines/__init__.py +0 -0
  257. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/src/talkpipe/pipelines/basic_rag.py +0 -0
  258. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/src/talkpipe/pipelines/vector_databases.py +0 -0
  259. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/src/talkpipe/py.typed +0 -0
  260. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/src/talkpipe/search/__init__.py +0 -0
  261. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/src/talkpipe/search/abstract.py +0 -0
  262. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/src/talkpipe/search/lancedb.py +0 -0
  263. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/src/talkpipe/search/whoosh.py +0 -0
  264. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/src/talkpipe/util/__init__.py +0 -0
  265. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/src/talkpipe/util/collections.py +0 -0
  266. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/src/talkpipe/util/config.py +0 -0
  267. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/src/talkpipe/util/constants.py +0 -0
  268. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/src/talkpipe/util/data_manipulation.py +0 -0
  269. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/src/talkpipe/util/doc_extraction.py +0 -0
  270. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/src/talkpipe/util/iterators.py +0 -0
  271. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/src/talkpipe/util/os.py +0 -0
  272. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/src/talkpipe/util/plugin_loader.py +0 -0
  273. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/src/talkpipe.egg-info/dependency_links.txt +0 -0
  274. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/src/talkpipe.egg-info/entry_points.txt +0 -0
  275. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/src/talkpipe.egg-info/requires.txt +0 -0
  276. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/src/talkpipe.egg-info/top_level.txt +0 -0
  277. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/tests/conftest.py +0 -0
  278. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/tests/embedding_adapter_contract_suite.py +0 -0
  279. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/tests/prompt_adapter_contract_suite.py +0 -0
  280. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/tests/talkpipe/app/test_chatterlang_generate_entry_points.py +0 -0
  281. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/tests/talkpipe/app/test_chatterlang_reference_browser.py +0 -0
  282. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/tests/talkpipe/app/test_chatterlang_reference_generator.py +0 -0
  283. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/tests/talkpipe/app/test_chatterlang_script.py +0 -0
  284. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/tests/talkpipe/app/test_chatterlang_serve.py +0 -0
  285. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/tests/talkpipe/app/test_makevectordatabase.py +0 -0
  286. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/tests/talkpipe/app/test_precache_model2vec.py +0 -0
  287. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/tests/talkpipe/app/test_serve_static.py +0 -0
  288. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/tests/talkpipe/app/test_server_common.py +0 -0
  289. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/tests/talkpipe/app/test_server_hardening.py +0 -0
  290. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/tests/talkpipe/app/test_serverag.py +0 -0
  291. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/tests/talkpipe/app/test_talkpipe_plugin_manager.py +0 -0
  292. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/tests/talkpipe/app/test_workbench_corpus.py +0 -0
  293. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/tests/talkpipe/app/test_workbench_load_module.py +0 -0
  294. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/tests/talkpipe/app/test_workbench_reference_api.py +0 -0
  295. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/tests/talkpipe/app/test_workbench_static.py +0 -0
  296. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/tests/talkpipe/app/test_workbench_suggest.py +0 -0
  297. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/tests/talkpipe/app/test_workbench_workspace.py +0 -0
  298. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/tests/talkpipe/chatterlang/test_chatterlang_workbench.py +0 -0
  299. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/tests/talkpipe/chatterlang/test_compiler.py +0 -0
  300. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/tests/talkpipe/chatterlang/test_entry_point_drift.py +0 -0
  301. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/tests/talkpipe/chatterlang/test_entry_points.py +0 -0
  302. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/tests/talkpipe/chatterlang/test_parsers.py +0 -0
  303. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/tests/talkpipe/chatterlang/test_registry.py +0 -0
  304. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/tests/talkpipe/data/sample_feed.pkl +0 -0
  305. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/tests/talkpipe/data/test.docx +0 -0
  306. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/tests/talkpipe/data/test_email.py +0 -0
  307. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/tests/talkpipe/data/test_extraction.py +0 -0
  308. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/tests/talkpipe/data/test_html.py +0 -0
  309. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/tests/talkpipe/data/test_html_exceptions.py +0 -0
  310. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/tests/talkpipe/data/test_image.py +0 -0
  311. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/tests/talkpipe/data/test_mogomock.py +0 -0
  312. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/tests/talkpipe/data/test_mongo.py +0 -0
  313. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/tests/talkpipe/data/test_mongo_integration.py +0 -0
  314. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/tests/talkpipe/data/test_mongo_timeouts.py +0 -0
  315. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/tests/talkpipe/data/test_rss.py +0 -0
  316. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/tests/talkpipe/data/text/test_chunking_units.py +0 -0
  317. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/tests/talkpipe/data/text/test_cleaning.py +0 -0
  318. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/tests/talkpipe/data/text/test_englishnormalize.py +0 -0
  319. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/tests/talkpipe/data/text/test_operations.py +0 -0
  320. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/tests/talkpipe/llm/test_content.py +0 -0
  321. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/tests/talkpipe/llm/test_embedding.py +0 -0
  322. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/tests/talkpipe/llm/test_embedding_adapters_contract.py +0 -0
  323. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/tests/talkpipe/llm/test_embedding_batch.py +0 -0
  324. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/tests/talkpipe/llm/test_embedding_model2vec.py +0 -0
  325. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/tests/talkpipe/llm/test_embedding_token_overflow.py +0 -0
  326. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/tests/talkpipe/llm/test_multimodal.py +0 -0
  327. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/tests/talkpipe/llm/test_prompt_adapters_base.py +0 -0
  328. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/tests/talkpipe/llm/test_prompt_adapters_memory.py +0 -0
  329. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/tests/talkpipe/llm/test_timeouts.py +0 -0
  330. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/tests/talkpipe/llm/test_vision.py +0 -0
  331. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/tests/talkpipe/llm/test_vision_adapters.py +0 -0
  332. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/tests/talkpipe/operations/test_filtering.py +0 -0
  333. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/tests/talkpipe/operations/test_matrices.py +0 -0
  334. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/tests/talkpipe/operations/test_threading.py +0 -0
  335. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/tests/talkpipe/operations/test_transforms.py +0 -0
  336. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/tests/talkpipe/pipe/test_basic.py +0 -0
  337. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/tests/talkpipe/pipe/test_basic_split.py +0 -0
  338. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/tests/talkpipe/pipe/test_core.py +0 -0
  339. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/tests/talkpipe/pipe/test_fork.py +0 -0
  340. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/tests/talkpipe/pipe/test_io.py +0 -0
  341. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/tests/talkpipe/pipe/test_math.py +0 -0
  342. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/tests/talkpipe/pipe/test_metadata.py +0 -0
  343. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/tests/talkpipe/pipelines/test_basic_rag.py +0 -0
  344. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/tests/talkpipe/pipelines/test_vector_databases.py +0 -0
  345. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/tests/talkpipe/search/test_abstract.py +0 -0
  346. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/tests/talkpipe/search/test_lancedb.py +0 -0
  347. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/tests/talkpipe/search/test_lancedb_cache.py +0 -0
  348. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/tests/talkpipe/search/test_whoosh.py +0 -0
  349. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/tests/talkpipe/test_documentation_examples.py +0 -0
  350. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/tests/talkpipe/test_heavy_imports_are_lazy.py +0 -0
  351. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/tests/talkpipe/test_py_typed.py +0 -0
  352. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/tests/talkpipe/test_version.py +0 -0
  353. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/tests/talkpipe/util/test_collections.py +0 -0
  354. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/tests/talkpipe/util/test_config.py +0 -0
  355. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/tests/talkpipe/util/test_data_manipulation.py +0 -0
  356. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/tests/talkpipe/util/test_doc_extraction.py +0 -0
  357. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/tests/talkpipe/util/test_iterators.py +0 -0
  358. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/tests/talkpipe/util/test_os.py +0 -0
  359. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/tests/talkpipe/util/test_plugin_loader.py +0 -0
  360. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/tests/talkpipe/util/test_util.py +0 -0
  361. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/tests/test_config_keys_documented.py +0 -0
  362. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/tests/test_doc_examples.py +0 -0
  363. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/tests/test_security_vulnerabilities.py +0 -0
  364. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/tests/test_tutorial_scripts.py +0 -0
  365. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/tests/testutils.py +0 -0
  366. {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/uv.lock +0 -0
@@ -2,6 +2,23 @@
2
2
 
3
3
  ## Unreleased
4
4
 
5
+ - **`max_tokens` caps the length of an LLM response.** `llmPrompt` and the
6
+ guided-generation segments built on it (`llmScore`, `llmExtractTerms`,
7
+ `llmBinaryAnswer`) accept `max_tokens`, as do the Ollama/OpenAI/Anthropic
8
+ prompt adapters: the most tokens the model may generate per response
9
+ (output only; prompt tokens do not count). The Ollama adapter's chat path
10
+ sent only `temperature`, so a model that never emitted a stop token
11
+ generated until its context window filled; `timeout` fails the pipeline
12
+ in that case, while `max_tokens` bounds the item. It maps to `num_predict`
13
+ on Ollama, `max_output_tokens` on the OpenAI Responses API, and
14
+ `max_tokens` on Anthropic, where it replaces the adapter's 4096 (still the
15
+ value when unset). The default is `None`, which leaves every request
16
+ exactly as it was; there is no global config key, the option is
17
+ per-segment. On reasoning/thinking models the thinking tokens count
18
+ against the cap, and a truncated response from a guided-generation segment
19
+ fails schema validation rather than returning a partial result. Prompt
20
+ adapters that take no `max_tokens` (such as `eliza`, or third-party
21
+ adapters that predate it) keep working and ignore it.
5
22
  - **App Center: a launch opens the page of a released application that does
6
23
  not open its own.** A second newcomer run against the PyPI releases. The
7
24
  catalog's `opens_browser` describes the newest version of an application,
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: talkpipe
3
- Version: 1.0.2b2
3
+ Version: 1.0.2b3
4
4
  Summary: Python internal and external DSL for writing generative AI analytics
5
5
  Author-email: Travis Bauer <tlbauer@sandia.gov>
6
6
  Maintainer-email: Travis Bauer <tlbauer@sandia.gov>
@@ -113,12 +113,7 @@ Entry points for different usage scenarios, from interactive development to prod
113
113
  - **[chatterlang_workbench](docs/api-reference/chatterlang-workbench.md)**
114
114
  A browser-based IDE for writing, testing, and running ChatterLang scripts: editor with autocomplete and live error checking, real-time execution, pipeline save/load, next-component suggestions, logging, and documentation lookup.
115
115
 
116
- <video width="640" height="360" controls>
117
- <source src="docs/workbench_demo.mp4" type="video/mp4">
118
- Your browser does not support the video tag.
119
- </video>
120
-
121
- ([workbench demo video](docs/workbench_demo.mp4) — direct link, for renderers that strip the embed above.)
116
+ <center><img src="docs/chatterlang_workbench_screenshot.png" width=700 alt="ChatterLang Workbench: pipeline editor with autocomplete, next-component suggestions, and pipeline output"></center>
122
117
 
123
118
  - **[chatterlang_script](docs/api-reference/chatterlang-script.md)**
124
119
  Runs ChatterLang scripts from files or directly from the command line, for batch processing and automation.
@@ -148,9 +143,11 @@ Entry points for different usage scenarios, from interactive development to prod
148
143
  Each release attaches the version-stamped file, so the URL above needs a full
149
144
  release that post-dates the App Center — against an older one, or where the
150
145
  only such release so far is a pre-release, it returns "Not Found" and uv
151
- reports that as a `SyntaxError`. Pre-releases *of the App Center itself* are
146
+ reports that as a `SyntaxError`. **That is the case today: the App Center is
147
+ still in beta**, and pre-releases *of the App Center itself* are
152
148
  served by the experimental channel instead
153
- (`releases/download/experimental/talkpipe_appcenter.py`). Either copy
149
+ (`releases/download/experimental/talkpipe_appcenter.py`; see
150
+ [Testing the App Center while it is in beta](appcenter/README.md#testing-the-app-center-while-it-is-in-beta)). Either copy
154
151
  installs the release or the pre-release of each application — press `e` on
155
152
  its row to choose the channel and `i` to install, or pass
156
153
  `--experimental` — so you never need a particular copy to
@@ -44,12 +44,7 @@ Entry points for different usage scenarios, from interactive development to prod
44
44
  - **[chatterlang_workbench](docs/api-reference/chatterlang-workbench.md)**
45
45
  A browser-based IDE for writing, testing, and running ChatterLang scripts: editor with autocomplete and live error checking, real-time execution, pipeline save/load, next-component suggestions, logging, and documentation lookup.
46
46
 
47
- <video width="640" height="360" controls>
48
- <source src="docs/workbench_demo.mp4" type="video/mp4">
49
- Your browser does not support the video tag.
50
- </video>
51
-
52
- ([workbench demo video](docs/workbench_demo.mp4) — direct link, for renderers that strip the embed above.)
47
+ <center><img src="docs/chatterlang_workbench_screenshot.png" width=700 alt="ChatterLang Workbench: pipeline editor with autocomplete, next-component suggestions, and pipeline output"></center>
53
48
 
54
49
  - **[chatterlang_script](docs/api-reference/chatterlang-script.md)**
55
50
  Runs ChatterLang scripts from files or directly from the command line, for batch processing and automation.
@@ -79,9 +74,11 @@ Entry points for different usage scenarios, from interactive development to prod
79
74
  Each release attaches the version-stamped file, so the URL above needs a full
80
75
  release that post-dates the App Center — against an older one, or where the
81
76
  only such release so far is a pre-release, it returns "Not Found" and uv
82
- reports that as a `SyntaxError`. Pre-releases *of the App Center itself* are
77
+ reports that as a `SyntaxError`. **That is the case today: the App Center is
78
+ still in beta**, and pre-releases *of the App Center itself* are
83
79
  served by the experimental channel instead
84
- (`releases/download/experimental/talkpipe_appcenter.py`). Either copy
80
+ (`releases/download/experimental/talkpipe_appcenter.py`; see
81
+ [Testing the App Center while it is in beta](appcenter/README.md#testing-the-app-center-while-it-is-in-beta)). Either copy
85
82
  installs the release or the pre-release of each application — press `e` on
86
83
  its row to choose the channel and `i` to install, or pass
87
84
  `--experimental` — so you never need a particular copy to
@@ -3,6 +3,68 @@
3
3
  > Install, launch, and manage applications from one screen, with nothing to
4
4
  > set up first but [uv](https://docs.astral.sh/uv/).
5
5
 
6
+ ## Testing the App Center while it is in beta
7
+
8
+ > [!IMPORTANT]
9
+ > **These directions are temporary.** The App Center has only shipped in
10
+ > pre-releases so far, so the release commands in the rest of this page do
11
+ > not work yet: `releases/latest` is the newest release GitHub does *not*
12
+ > consider a pre-release, and against it those URLs return "Not Found" (uv
13
+ > reports that as a `SyntaxError`, since it tries to run the 404 body as
14
+ > Python). Once the first full release carries the App Center, this section
15
+ > goes away and the rest of the page applies as written.
16
+ >
17
+ > To try it now, fetch it from the `experimental` release instead, which CI
18
+ > keeps pointed at the assets of the newest release of either kind:
19
+ >
20
+ > ```bash
21
+ > uv run https://github.com/sandialabs/talkpipe/releases/download/experimental/talkpipe_appcenter.py
22
+ > ```
23
+ >
24
+ > The bootstrap scripts, for a computer without uv, take the channel by name.
25
+ > On Linux and macOS:
26
+ >
27
+ > ```bash
28
+ > curl -fsSL https://github.com/sandialabs/talkpipe/releases/download/experimental/install.sh | sh -s -- --experimental
29
+ > ```
30
+ >
31
+ > On Windows, set the channel in the environment first, because a piped
32
+ > `irm | iex` cannot be given arguments:
33
+ >
34
+ > ```powershell
35
+ > $env:TALKPIPE_APPCENTER_CHANNEL="experimental"
36
+ > powershell -ExecutionPolicy Bypass -c "irm https://github.com/sandialabs/talkpipe/releases/download/experimental/install.ps1 | iex"
37
+ > ```
38
+ >
39
+ > Or run the file straight from a checkout of the repository, which needs no
40
+ > release at all and is how to test a change before it is tagged:
41
+ >
42
+ > ```bash
43
+ > uv run appcenter/talkpipe_appcenter.py
44
+ > ```
45
+ >
46
+ > Three things to know while testing:
47
+ >
48
+ > - **The copy you run and the versions it installs are separate choices.**
49
+ > The beta of the App Center installs the newest *release* of each
50
+ > application, exactly as the released copy will; it does not put betas of
51
+ > the vault or the writing assistant on your computer. To test an
52
+ > application's pre-release too, press `e` on its row and then `i`, or pass
53
+ > `--experimental` (see [Channels](#channels-stable-and-experimental)).
54
+ > - **`--version` says which beta you have.** `uv run <url> --version` prints
55
+ > the talkpipe tag the file was attached to (`talkpipe-appcenter 1.0.2b2`,
56
+ > say); a copy run from a checkout prints `0.0.0+unknown`. Include that line
57
+ > when reporting a problem. uv fetches the file anew on every run (only the
58
+ > environment is cached), so a newly published beta is picked up the next
59
+ > time you run the command.
60
+ > - **The `experimental` URL rolls.** It serves whatever the newest release
61
+ > is, including the first full one when it comes. For a copy that stays put,
62
+ > use the beta's own tag:
63
+ > `https://github.com/sandialabs/talkpipe/releases/download/v1.0.2b2/talkpipe_appcenter.py`.
64
+ >
65
+ > The assets are published from github.com only; the Gitea mirror attaches
66
+ > none.
67
+
6
68
  The App Center is the part of TalkPipe that installs applications. It is
7
69
  designed to make the TalkPipe-based applications (the vault, the writing
8
70
  assistant, the workbench) easy to install, upgrade, and launch, and it comes
@@ -34,13 +96,10 @@ powershell -ExecutionPolicy Bypass -c "irm https://github.com/sandialabs/talkpip
34
96
  ```
35
97
 
36
98
  All three URLs are release assets, attached by CI to each release, so they need
37
- a release that post-dates the App Center; against an older `latest` they return
38
- "Not Found" (uv reports that as a `SyntaxError`, since it tries to run the 404
39
- body as Python). From a checkout, run the file directly instead:
40
-
41
- ```bash
42
- uv run appcenter/talkpipe_appcenter.py
43
- ```
99
+ a full release that post-dates the App Center. **There is no such release yet**;
100
+ until there is, use the commands under
101
+ [Testing the App Center while it is in beta](#testing-the-app-center-while-it-is-in-beta)
102
+ at the top of this page.
44
103
 
45
104
  ## Channels: stable and experimental
46
105
 
@@ -109,7 +168,9 @@ installs from it.
109
168
 
110
169
  ### Which copy of the App Center you run
111
170
 
112
- This choice matters only while no full release carries the App Center.
171
+ This choice matters only while no full release carries the App Center, which
172
+ is the case today; the commands to use meanwhile are collected under
173
+ [Testing the App Center while it is in beta](#testing-the-app-center-while-it-is-in-beta).
113
174
  `releases/latest` is the newest release GitHub does *not* consider a
114
175
  pre-release, so those URLs serve the last full release even while a beta is
115
176
  out — and if the only release carrying the App Center is a beta, they return
@@ -118,6 +118,28 @@ Example:
118
118
  Adapter implementations get deterministic and truncate summarization from the shared prompt-adapter memory mixin.
119
119
  Adapters only need to implement `complete_text_without_context(...)` when they support `memory_mode="summary_llm"`.
120
120
 
121
+ #### Capping the response length with `max_tokens`
122
+
123
+ `llmPrompt` and the guided-generation segments built on it (`llmScore`,
124
+ `llmExtractTerms`, `llmBinaryAnswer`) accept `max_tokens`: the most tokens the
125
+ model may generate per response. It is an **output** cap — prompt tokens do not
126
+ count — and it defaults to `None`, which leaves the backend default. Without it,
127
+ a model that fails to emit a stop token generates until its context window
128
+ fills; `timeout` only fails the pipeline, while `max_tokens` bounds the item.
129
+
130
+ ```chatterlang
131
+ | llmScore[system_prompt=p, field="toanalyze", set_as="ai_eval", max_tokens=1024]
132
+ ```
133
+
134
+ - It maps to `num_predict` on Ollama, `max_output_tokens` on OpenAI, and
135
+ `max_tokens` on Anthropic (where it replaces the adapter's 4096 default).
136
+ Adapters that generate nothing to cap (`eliza`) ignore it.
137
+ - On reasoning/thinking models (Anthropic extended thinking, OpenAI reasoning
138
+ models, Ollama thinking models) the thinking tokens count against the cap, so
139
+ leave room for them.
140
+ - A truncated response from a guided-generation segment such as `llmScore`
141
+ fails schema validation rather than returning a partial score.
142
+
121
143
  **Variables**: Store intermediate results
122
144
  ```chatterlang
123
145
  | @my_variable # Store results in variable
@@ -65,6 +65,19 @@ class LLMPrompt(AbstractSegment[Any, Any]):
65
65
  - unsummarized_message_count controls how many recent messages are kept verbatim during compaction.
66
66
  This is a message count, not a user+assistant turn-pair count.
67
67
  - memory_size controls the target max tokens for summaries created during compaction.
68
+
69
+ Output cap:
70
+ - max_tokens caps the tokens the model may generate per response. It is an
71
+ output cap only: prompt tokens do not count. None (the default) leaves the
72
+ backend default, so a model that never emits a stop token generates until
73
+ its context window fills.
74
+ - On reasoning/thinking models (Anthropic extended thinking, OpenAI reasoning
75
+ models, Ollama thinking models) the thinking tokens count against it, so
76
+ leave room for them.
77
+ - A response cut off by the cap is returned truncated. In a guided-generation
78
+ segment such as llmScore the truncated response fails schema validation
79
+ rather than returning a partial result.
80
+ - Adapters that generate nothing (eliza) or that predate the option ignore it.
68
81
  """
69
82
 
70
83
  def __init__(
@@ -115,6 +128,10 @@ class LLMPrompt(AbstractSegment[Any, Any]):
115
128
  float | None,
116
129
  "Request timeout in seconds for the model server; defaults to the llm_timeout config value (120 if unset)",
117
130
  ] = None,
131
+ max_tokens: Annotated[
132
+ int | None,
133
+ "Maximum tokens the model may generate per response (output only; prompt tokens do not count). None leaves the backend default.",
134
+ ] = None,
118
135
  ):
119
136
  super().__init__()
120
137
  logger.debug(f"Initializing LLMPrompt with name={model}, source={source}")
@@ -152,6 +169,7 @@ class LLMPrompt(AbstractSegment[Any, Any]):
152
169
  "memory_size": memory_size,
153
170
  "debug_messages": debug_messages,
154
171
  "timeout": timeout,
172
+ "max_tokens": max_tokens,
155
173
  }
156
174
  self.chat = self._create_prompt_adapter(
157
175
  getPromptAdapter(source), source, adapter_kwargs
@@ -178,6 +196,12 @@ class LLMPrompt(AbstractSegment[Any, Any]):
178
196
  "remove the timeout option or update the adapter."
179
197
  )
180
198
  adapter_kwargs = {k: v for k, v in adapter_kwargs.items() if k != "timeout"}
199
+ # ``max_tokens`` is dropped for such adapters even when set: eliza
200
+ # generates nothing to cap, so the option is harmless there.
201
+ if "max_tokens" in adapter_kwargs and "max_tokens" not in accepted_kwargs:
202
+ adapter_kwargs = {
203
+ k: v for k, v in adapter_kwargs.items() if k != "max_tokens"
204
+ }
181
205
  unsupported_compat_kwargs = (
182
206
  set(PROMPT_ADAPTER_COMPAT_KWARG_DEFAULTS) - accepted_kwargs
183
207
  )
@@ -250,6 +274,12 @@ class AbstractLLMGuidedGeneration(LLMPrompt):
250
274
  This class is used to create segments that generate output based on LLM responses.
251
275
  It is an abstract class and should not be used directly.
252
276
  Subclasses must implement the get_output_format method to specify the output format.
277
+
278
+ max_tokens caps the model's output per response (prompt tokens do not count;
279
+ on reasoning/thinking models the thinking tokens do). A response truncated by
280
+ the cap is not valid for the output format, so it fails schema validation
281
+ rather than returning a partial result -- size the cap for the whole
282
+ structured answer, explanation included.
253
283
  """
254
284
 
255
285
  @staticmethod
@@ -296,6 +326,10 @@ class AbstractLLMGuidedGeneration(LLMPrompt):
296
326
  debug_messages: Annotated[
297
327
  bool, "Whether to log outbound LLM request messages"
298
328
  ] = False,
329
+ max_tokens: Annotated[
330
+ int | None,
331
+ "Maximum tokens the model may generate per response (output only; prompt tokens do not count). None leaves the backend default.",
332
+ ] = None,
299
333
  ):
300
334
 
301
335
  super().__init__(
@@ -314,6 +348,7 @@ class AbstractLLMGuidedGeneration(LLMPrompt):
314
348
  context_token_trigger=context_token_trigger,
315
349
  memory_size=memory_size,
316
350
  debug_messages=debug_messages,
351
+ max_tokens=max_tokens,
317
352
  )
318
353
 
319
354
 
@@ -377,6 +412,11 @@ class LlmScore(AbstractLLMGuidedGeneration):
377
412
  - set_as (str, optional):
378
413
  If specified, the output will be appended as this field in the
379
414
  final response.
415
+ - max_tokens (int, optional):
416
+ Cap on the tokens generated per response (output only; on
417
+ reasoning/thinking models the thinking tokens count against it).
418
+ A response truncated by the cap fails schema validation rather than
419
+ returning a partial score, so leave room for the explanation.
380
420
 
381
421
  Data Model
382
422
  ----------
@@ -64,13 +64,26 @@ class AbstractLLMPromptAdapter(PromptAdapterMemoryMixin, ABC):
64
64
  debug_messages: Annotated[
65
65
  bool, "Whether to log outbound LLM request messages"
66
66
  ] = False,
67
+ max_tokens: Annotated[
68
+ int | None,
69
+ "Maximum tokens the model may generate per response (output only; prompt tokens do not count). None leaves the backend default.",
70
+ ] = None,
67
71
  ):
68
- """Initialize the chat model."""
72
+ """Initialize the chat model.
73
+
74
+ ``max_tokens`` caps the model's output per response; prompt tokens do
75
+ not count. On reasoning/thinking models (Anthropic extended thinking,
76
+ OpenAI reasoning models, Ollama thinking models) the thinking tokens
77
+ count against it. A response truncated by the cap is returned as is,
78
+ so with an ``output_format`` it fails schema validation rather than
79
+ yielding a partial result.
80
+ """
69
81
  self._model_name = model
70
82
  self._source = source
71
83
  self._multi_turn = multi_turn
72
84
  self._temperature = temperature
73
85
  self._temperature_explicit = temperature is not None
86
+ self._max_tokens = max_tokens
74
87
  self._output_format = output_format
75
88
  self._messages = []
76
89
  self._summary_message = None
@@ -28,6 +28,7 @@ class AnthropicPromptAdapter(AbstractLLMPromptAdapter):
28
28
  memory_size: int = 512,
29
29
  debug_messages: bool = False,
30
30
  timeout: float | None = None,
31
+ max_tokens: int | None = None,
31
32
  ):
32
33
  anthropic = self._require_dependency("anthropic", "Anthropic", "anthropic")
33
34
 
@@ -54,6 +55,7 @@ class AnthropicPromptAdapter(AbstractLLMPromptAdapter):
54
55
  context_token_trigger,
55
56
  memory_size,
56
57
  debug_messages,
58
+ max_tokens=max_tokens,
57
59
  )
58
60
  self._timeout = resolve_timeout(timeout, LLM_TIMEOUT, DEFAULT_LLM_TIMEOUT)
59
61
  self.client = self._build_client(
@@ -61,7 +63,9 @@ class AnthropicPromptAdapter(AbstractLLMPromptAdapter):
61
63
  "Anthropic",
62
64
  "ANTHROPIC_API_KEY",
63
65
  )
64
- self._max_tokens = 4096 # Default max tokens for response
66
+ # The Messages API requires max_tokens, so an unset cap falls back to 4096.
67
+ if self._max_tokens is None:
68
+ self._max_tokens = 4096
65
69
 
66
70
  def execute(self, prompt: str) -> str | BaseModel:
67
71
  """Execute the chat model.
@@ -35,6 +35,7 @@ class OllamaPromptAdapter(AbstractLLMPromptAdapter):
35
35
  memory_size: int = 512,
36
36
  debug_messages: bool = False,
37
37
  timeout: float | None = None,
38
+ max_tokens: int | None = None,
38
39
  ):
39
40
  super().__init__(
40
41
  model,
@@ -49,6 +50,7 @@ class OllamaPromptAdapter(AbstractLLMPromptAdapter):
49
50
  context_token_trigger,
50
51
  memory_size,
51
52
  debug_messages,
53
+ max_tokens=max_tokens,
52
54
  )
53
55
  # Ollama uses 0.5 as default when temperature is not specified
54
56
  if self._temperature is None:
@@ -76,13 +78,16 @@ class OllamaPromptAdapter(AbstractLLMPromptAdapter):
76
78
  # assembled history and parse the reply the same way.
77
79
  logger.debug(f"Sending chat request to Ollama model {self._model_name}")
78
80
  self._log_message_payload("messages", self._request_messages())
81
+ options: dict[str, Any] = {"temperature": self._temperature}
82
+ if self._max_tokens is not None:
83
+ options["num_predict"] = self._max_tokens
79
84
  response = self._chat_completion(
80
85
  model=self._model_name,
81
86
  messages=self._request_messages(),
82
87
  format_schema=self._output_format.model_json_schema()
83
88
  if self._output_format
84
89
  else None,
85
- options={"temperature": self._temperature},
90
+ options=options,
86
91
  )
87
92
 
88
93
  self._record_assistant_response(str(response.message.content))
@@ -27,6 +27,7 @@ class OpenAIPromptAdapter(AbstractLLMPromptAdapter):
27
27
  memory_size: int = 512,
28
28
  debug_messages: bool = False,
29
29
  timeout: float | None = None,
30
+ max_tokens: int | None = None,
30
31
  ):
31
32
  openai = self._require_dependency("openai", "OpenAI", "openai")
32
33
  super().__init__(
@@ -42,6 +43,7 @@ class OpenAIPromptAdapter(AbstractLLMPromptAdapter):
42
43
  context_token_trigger,
43
44
  memory_size,
44
45
  debug_messages,
46
+ max_tokens=max_tokens,
45
47
  )
46
48
  self._timeout = resolve_timeout(timeout, LLM_TIMEOUT, DEFAULT_LLM_TIMEOUT)
47
49
  self.client = self._build_client(
@@ -80,6 +82,8 @@ class OpenAIPromptAdapter(AbstractLLMPromptAdapter):
80
82
  }
81
83
 
82
84
  self._apply_temperature_if_explicit(request_params)
85
+ if self._max_tokens is not None:
86
+ request_params["max_output_tokens"] = self._max_tokens
83
87
 
84
88
  self._log_message_payload("input", request_params["input"])
85
89
  response = self._responses_request(parse=True, **request_params)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: talkpipe
3
- Version: 1.0.2b2
3
+ Version: 1.0.2b3
4
4
  Summary: Python internal and external DSL for writing generative AI analytics
5
5
  Author-email: Travis Bauer <tlbauer@sandia.gov>
6
6
  Maintainer-email: Travis Bauer <tlbauer@sandia.gov>
@@ -113,12 +113,7 @@ Entry points for different usage scenarios, from interactive development to prod
113
113
  - **[chatterlang_workbench](docs/api-reference/chatterlang-workbench.md)**
114
114
  A browser-based IDE for writing, testing, and running ChatterLang scripts: editor with autocomplete and live error checking, real-time execution, pipeline save/load, next-component suggestions, logging, and documentation lookup.
115
115
 
116
- <video width="640" height="360" controls>
117
- <source src="docs/workbench_demo.mp4" type="video/mp4">
118
- Your browser does not support the video tag.
119
- </video>
120
-
121
- ([workbench demo video](docs/workbench_demo.mp4) — direct link, for renderers that strip the embed above.)
116
+ <center><img src="docs/chatterlang_workbench_screenshot.png" width=700 alt="ChatterLang Workbench: pipeline editor with autocomplete, next-component suggestions, and pipeline output"></center>
122
117
 
123
118
  - **[chatterlang_script](docs/api-reference/chatterlang-script.md)**
124
119
  Runs ChatterLang scripts from files or directly from the command line, for batch processing and automation.
@@ -148,9 +143,11 @@ Entry points for different usage scenarios, from interactive development to prod
148
143
  Each release attaches the version-stamped file, so the URL above needs a full
149
144
  release that post-dates the App Center — against an older one, or where the
150
145
  only such release so far is a pre-release, it returns "Not Found" and uv
151
- reports that as a `SyntaxError`. Pre-releases *of the App Center itself* are
146
+ reports that as a `SyntaxError`. **That is the case today: the App Center is
147
+ still in beta**, and pre-releases *of the App Center itself* are
152
148
  served by the experimental channel instead
153
- (`releases/download/experimental/talkpipe_appcenter.py`). Either copy
149
+ (`releases/download/experimental/talkpipe_appcenter.py`; see
150
+ [Testing the App Center while it is in beta](appcenter/README.md#testing-the-app-center-while-it-is-in-beta)). Either copy
154
151
  installs the release or the pre-release of each application — press `e` on
155
152
  its row to choose the channel and `i` to install, or pass
156
153
  `--experimental` — so you never need a particular copy to
@@ -57,6 +57,7 @@ docs/LLMEvaluateWebPage.png
57
57
  docs/README.md
58
58
  docs/TalkPipe.png
59
59
  docs/TalkPipe.xcf
60
+ docs/chatterlang_workbench_screenshot.png
60
61
  docs/make_structure_diagram.sh
61
62
  docs/quickstart.md
62
63
  docs/structure.tex
@@ -73,6 +73,7 @@
73
73
  "docs/architecture/protocol.md",
74
74
  "docs/architecture/security.md",
75
75
  "docs/architecture/streaming.md",
76
+ "docs/chatterlang_workbench_screenshot.png",
76
77
  "docs/contributing/developer-handbook.md",
77
78
  "docs/guides/container-images.md",
78
79
  "docs/guides/makevectordatabase-and-serverag.md",
@@ -0,0 +1,8 @@
1
+ {
2
+ "tag": "1.0.2b3",
3
+ "distance": 0,
4
+ "node": "gc0c71951294cdc7328b6b67881f73f24ebea2100",
5
+ "dirty": false,
6
+ "branch": "HEAD",
7
+ "node_date": "2026-09-17"
8
+ }
@@ -145,6 +145,74 @@ def test_guided_generation_passes_context_params(monkeypatch):
145
145
  assert captured["memory_size"] == 128
146
146
 
147
147
 
148
+ def _install_capture_adapter(monkeypatch):
149
+ captured = {}
150
+
151
+ class CaptureAdapter:
152
+ def __init__(self, **kwargs):
153
+ captured.update(kwargs)
154
+
155
+ def execute(self, prompt):
156
+ return prompt
157
+
158
+ monkeypatch.setattr("talkpipe.llm.chat.getPromptSources", lambda: ["capture"])
159
+ monkeypatch.setattr(
160
+ "talkpipe.llm.chat.getPromptAdapter", lambda _source: CaptureAdapter
161
+ )
162
+ return captured
163
+
164
+
165
+ def test_llmprompt_max_tokens_defaults_to_none(monkeypatch):
166
+ captured = _install_capture_adapter(monkeypatch)
167
+ LLMPrompt(model="model-a", source="capture")
168
+ assert captured["max_tokens"] is None
169
+
170
+
171
+ def test_llmscore_passes_max_tokens(monkeypatch):
172
+ captured = _install_capture_adapter(monkeypatch)
173
+ LlmScore(system_prompt="score it", model="model-a", source="capture", max_tokens=64)
174
+ assert captured["max_tokens"] == 64
175
+
176
+
177
+ def test_chatterlang_script_passes_max_tokens(monkeypatch):
178
+ captured = _install_capture_adapter(monkeypatch)
179
+ compiler.compile(
180
+ 'CONST p = "score it"; '
181
+ '| llmScore[system_prompt=p, model="model-a", source="capture", '
182
+ 'field="toanalyze", set_as="ai_eval", max_tokens=1024]'
183
+ )
184
+ assert captured["max_tokens"] == 1024
185
+
186
+
187
+ def test_llmprompt_drops_max_tokens_for_adapter_that_predates_it(monkeypatch):
188
+ captured = {}
189
+
190
+ class OldAdapter:
191
+ def __init__(
192
+ self,
193
+ model,
194
+ system_prompt=None,
195
+ multi_turn=True,
196
+ temperature=None,
197
+ output_format=None,
198
+ role_map=None,
199
+ memory_mode="full",
200
+ unsummarized_message_count=6,
201
+ context_token_trigger=None,
202
+ memory_size=512,
203
+ debug_messages=False,
204
+ ):
205
+ captured["model"] = model
206
+
207
+ monkeypatch.setattr("talkpipe.llm.chat.getPromptSources", lambda: ["old"])
208
+ monkeypatch.setattr(
209
+ "talkpipe.llm.chat.getPromptAdapter", lambda _source: OldAdapter
210
+ )
211
+
212
+ LLMPrompt(model="model-a", source="old", max_tokens=64)
213
+ assert captured["model"] == "model-a"
214
+
215
+
148
216
  def test_llmprompt_supports_old_adapter_defaults(monkeypatch, caplog):
149
217
  captured = {}
150
218
 
@@ -148,3 +148,22 @@ def test_anthropic_no_temperature_warning_when_none_requested(monkeypatch, caplo
148
148
 
149
149
  assert "temperature" not in captured
150
150
  assert "temperature" not in caplog.text
151
+
152
+
153
+ def test_anthropic_execute_without_max_tokens_keeps_4096(monkeypatch):
154
+ _patch_anthropic_constructor(monkeypatch)
155
+ adapter = AnthropicPromptAdapter("claude-3-5-haiku-latest")
156
+ captured = _capture_messages_create(monkeypatch, adapter, "ok")
157
+
158
+ assert adapter.execute("prompt") == "ok"
159
+ assert captured["max_tokens"] == 4096
160
+ assert set(captured) == {"model", "messages", "max_tokens", "system"}
161
+
162
+
163
+ def test_anthropic_execute_max_tokens_replaces_4096(monkeypatch):
164
+ _patch_anthropic_constructor(monkeypatch)
165
+ adapter = AnthropicPromptAdapter("claude-3-5-haiku-latest", max_tokens=1024)
166
+ captured = _capture_messages_create(monkeypatch, adapter, "ok")
167
+
168
+ assert adapter.execute("prompt") == "ok"
169
+ assert captured["max_tokens"] == 1024
@@ -1,3 +1,5 @@
1
+ import logging
2
+
1
3
  from pydantic import BaseModel
2
4
 
3
5
  from prompt_adapter_contract_suite import (
@@ -5,6 +7,7 @@ from prompt_adapter_contract_suite import (
5
7
  run_shared_live_contract_checks,
6
8
  run_shared_offline_contract_checks,
7
9
  )
10
+ from talkpipe.llm.chat import LLMPrompt, LlmScore
8
11
  from talkpipe.llm.config import getPromptAdapter, getPromptSources
9
12
  from talkpipe.llm.prompt_adapters import ElizaPromptAdapter
10
13
 
@@ -114,3 +117,18 @@ def test_eliza_reintroduces_i_am_on_second_name_query():
114
117
  assert "i am dr. eliza" not in name_first.lower()
115
118
  assert "my name is dr. eliza" in name_first.lower()
116
119
  assert "i am dr. eliza" in name_second.lower()
120
+
121
+
122
+ def test_eliza_segment_ignores_max_tokens_without_warning(caplog):
123
+ # eliza generates nothing to cap, so max_tokens is dropped silently
124
+ # (unlike timeout, which eliza refuses).
125
+ with caplog.at_level(logging.WARNING):
126
+ prompt = LLMPrompt(model="eliza", source="eliza", max_tokens=16)
127
+ score = LlmScore(
128
+ system_prompt="Score 0-10.", model="eliza", source="eliza", max_tokens=16
129
+ )
130
+
131
+ assert isinstance(prompt.chat, ElizaPromptAdapter)
132
+ assert list(prompt(["hello"]))
133
+ assert isinstance(next(iter(score(["hello"]))), LlmScore.Score)
134
+ assert not [r for r in caplog.records if r.levelno >= logging.WARNING]