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.
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/CHANGELOG.md +17 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/PKG-INFO +6 -9
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/README.md +5 -8
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/appcenter/README.md +69 -8
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/docs/architecture/chatterlang.md +22 -0
- talkpipe-1.0.2b3/docs/chatterlang_workbench_screenshot.png +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/src/talkpipe/llm/chat.py +40 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/src/talkpipe/llm/prompt_adapter_base.py +14 -1
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/src/talkpipe/llm/prompt_adapters_anthropic.py +5 -1
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/src/talkpipe/llm/prompt_adapters_ollama.py +6 -1
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/src/talkpipe/llm/prompt_adapters_openai.py +4 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/src/talkpipe.egg-info/PKG-INFO +6 -9
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/src/talkpipe.egg-info/SOURCES.txt +1 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/src/talkpipe.egg-info/scm_file_list.json +1 -0
- talkpipe-1.0.2b3/src/talkpipe.egg-info/scm_version.json +8 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/tests/talkpipe/llm/test_chat.py +68 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/tests/talkpipe/llm/test_prompt_adapters_anthropic.py +19 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/tests/talkpipe/llm/test_prompt_adapters_eliza.py +18 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/tests/talkpipe/llm/test_prompt_adapters_ollama.py +36 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/tests/talkpipe/llm/test_prompt_adapters_openai.py +36 -0
- talkpipe-1.0.2b2/src/talkpipe.egg-info/scm_version.json +0 -8
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/.cursor/skills/changelog-update/SKILL.md +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/.cursor/skills/doc-example-formatting/SKILL.md +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/.cursor/skills/run-documentation-examples/SKILL.md +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/.cursor/skills/run-documentation-examples/scripts/run_documentation_examples.py +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/.cursor/skills/test-driven-development/SKILL.md +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/.cursor/skills/update-entry-points/SKILL.md +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/.cursor/skills/update-entry-points/scripts/update_entry_points.py +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/.dockerignore +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/.gitea/default_merge_message/MERGE_TEMPLATE.md +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/.gitea/default_merge_message/SQUASH_TEMPLATE.md +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/.github/CICD.md +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/.github/ISSUE_TEMPLATE/release-checklist.md +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/.github/SECURITY.md +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/.github/copilot-instructions.md +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/.github/dependabot.yml +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/.github/prompts/add-segment.prompt.md +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/.github/prompts/changelog.prompt.md +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/.github/prompts/doc-examples.prompt.md +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/.github/prompts/tdd.prompt.md +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/.github/prompts/update-entry-points.prompt.md +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/.github/workflows/ci-cd.yml +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/.gitignore +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/.pre-commit-config.yaml +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/.safety-policy.yml +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/.safety-project.ini +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/.vscode/settings.json +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/.vscode/tasks.json +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/AGENTS.md +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/COPYRIGHT +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/Dockerfile +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/LICENSE +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/RELEASING.md +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/appcenter/install.ps1 +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/appcenter/install.sh +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/appcenter/talkpipe.toml +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/appcenter/talkpipe_appcenter.py +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/appcenter/tests/conftest.py +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/appcenter/tests/test_actions.py +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/appcenter/tests/test_bootstrap.py +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/appcenter/tests/test_catalog.py +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/appcenter/tests/test_channel.py +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/appcenter/tests/test_cli.py +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/appcenter/tests/test_packaging.py +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/appcenter/tests/test_shortcut.py +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/appcenter/tests/test_status.py +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/appcenter/tests/test_tui.py +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/appcenter/tests/test_uv.py +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/docs/.gitignore +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/docs/LLMChat.png +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/docs/LLMEvaluateWebPage.png +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/docs/README.md +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/docs/TalkPipe.png +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/docs/TalkPipe.xcf +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/docs/api-reference/README.md +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/docs/api-reference/chatterlang-script.md +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/docs/api-reference/chatterlang-server.md +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/docs/api-reference/chatterlang-workbench.md +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/docs/api-reference/lazy-loading.md +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/docs/api-reference/talkpipe-plugin-manager.md +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/docs/api-reference/talkpipe-ref.md +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/docs/architecture/README.md +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/docs/architecture/configuration.md +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/docs/architecture/documentation-formatting.md +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/docs/architecture/extending-talkpipe.md +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/docs/architecture/metadata-stream.md +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/docs/architecture/pipe-api.md +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/docs/architecture/protocol.md +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/docs/architecture/security.md +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/docs/architecture/streaming.md +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/docs/contributing/developer-handbook.md +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/docs/guides/container-images.md +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/docs/guides/makevectordatabase-and-serverag.md +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/docs/guides/model-and-source-configuration.md +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/docs/guides/model2vec-embeddings.md +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/docs/make_structure_diagram.sh +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/docs/quickstart.md +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/docs/structure.tex +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/docs/talkpipe_architecture.png +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/docs/talkpipe_architecture.tex +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/docs/talkpipe_diagram.png +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/docs/tutorials/.gitignore +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/docs/tutorials/README.md +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/docs/tutorials/Tutorial_1-Document_Indexing/README.md +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/docs/tutorials/Tutorial_1-Document_Indexing/Step_1_CreateSyntheticData.bat +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/docs/tutorials/Tutorial_1-Document_Indexing/Step_1_CreateSyntheticData.script +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/docs/tutorials/Tutorial_1-Document_Indexing/Step_1_CreateSyntheticData.sh +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/docs/tutorials/Tutorial_1-Document_Indexing/Step_2_IndexStories.bat +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/docs/tutorials/Tutorial_1-Document_Indexing/Step_2_IndexStories.script +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/docs/tutorials/Tutorial_1-Document_Indexing/Step_2_IndexStories.sh +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/docs/tutorials/Tutorial_1-Document_Indexing/Step_3_SearchStories.bat +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/docs/tutorials/Tutorial_1-Document_Indexing/Step_3_SearchStories.script +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/docs/tutorials/Tutorial_1-Document_Indexing/Step_3_SearchStories.sh +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/docs/tutorials/Tutorial_1-Document_Indexing/stories.json +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/docs/tutorials/Tutorial_1-Document_Indexing/story_search_ui.yml +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/docs/tutorials/Tutorial_2-Search_by_Example_and_RAG/README.md +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/docs/tutorials/Tutorial_2-Search_by_Example_and_RAG/Step_1_CreateVectorDatabase.bat +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/docs/tutorials/Tutorial_2-Search_by_Example_and_RAG/Step_1_CreateVectorDatabase.script +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/docs/tutorials/Tutorial_2-Search_by_Example_and_RAG/Step_1_CreateVectorDatabase.sh +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/docs/tutorials/Tutorial_2-Search_by_Example_and_RAG/Step_2_SearchByExample.bat +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/docs/tutorials/Tutorial_2-Search_by_Example_and_RAG/Step_2_SearchByExample.script +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/docs/tutorials/Tutorial_2-Search_by_Example_and_RAG/Step_2_SearchByExample.sh +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/docs/tutorials/Tutorial_2-Search_by_Example_and_RAG/Step_3_SpecializedRag.bat +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/docs/tutorials/Tutorial_2-Search_by_Example_and_RAG/Step_3_SpecializedRag.script +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/docs/tutorials/Tutorial_2-Search_by_Example_and_RAG/Step_3_SpecializedRag.sh +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/docs/tutorials/Tutorial_2-Search_by_Example_and_RAG/step_3_extras.py +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/docs/tutorials/Tutorial_2-Search_by_Example_and_RAG/story_by_example_ui.yml +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/docs/tutorials/Tutorial_3_Report_Writing/README.md +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/docs/tutorials/Tutorial_3_Report_Writing/Step_1_ExecutiveSummaryGeneration.bat +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/docs/tutorials/Tutorial_3_Report_Writing/Step_1_ExecutiveSummaryGeneration.script +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/docs/tutorials/Tutorial_3_Report_Writing/Step_1_ExecutiveSummaryGeneration.sh +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/docs/tutorials/Tutorial_3_Report_Writing/Step_2_DetailedAnalysisReportGeneration.bat +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/docs/tutorials/Tutorial_3_Report_Writing/Step_2_DetailedAnalysisReportGeneration.script +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/docs/tutorials/Tutorial_3_Report_Writing/Step_2_DetailedAnalysisReportGeneration.sh +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/docs/tutorials/Tutorial_3_Report_Writing/Step_3_MultiFormatReportGeneration.bat +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/docs/tutorials/Tutorial_3_Report_Writing/Step_3_MultiFormatReportGeneration.script +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/docs/tutorials/Tutorial_3_Report_Writing/Step_3_MultiFormatReportGeneration.sh +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/docs/tutorials/Tutorial_3_Report_Writing/file_structure.md +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/docs/tutorials/Tutorial_3_Report_Writing/multi_format_ui.yml +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/docs/tutorials/Tutorial_3_Report_Writing/report_topic_ui.yml +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/docs/tutorials/Tutorial_3_Report_Writing/step_1_extras.py +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/docs/tutorials/Tutorial_3_Report_Writing/step_2_extras.py +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/docs/tutorials/Tutorial_3_Report_Writing/step_3_extras.py +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/docs/workbench_demo.mp4 +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/frontend/.gitignore +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/frontend/README.md +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/frontend/build.mjs +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/frontend/package-lock.json +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/frontend/package.json +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/frontend/src/cm.js +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/pyproject.toml +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/pytest.ini +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/scripts/extract_documentation_examples.py +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/setup.cfg +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/src/talkpipe/__init__.py +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/src/talkpipe/app/__init__.py +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/src/talkpipe/app/chatterlang_generate_entry_points.py +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/src/talkpipe/app/chatterlang_reference_browser.py +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/src/talkpipe/app/chatterlang_reference_generator.py +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/src/talkpipe/app/chatterlang_script.py +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/src/talkpipe/app/chatterlang_serve.py +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/src/talkpipe/app/chatterlang_workbench.py +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/src/talkpipe/app/doc_examples.py +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/src/talkpipe/app/makevectordatabase.py +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/src/talkpipe/app/precache_model2vec.py +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/src/talkpipe/app/server_common.py +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/src/talkpipe/app/serverag.py +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/src/talkpipe/app/static/favicon.ico +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/src/talkpipe/app/static/serve/common.js +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/src/talkpipe/app/static/serve/index.css +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/src/talkpipe/app/static/serve/index.js +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/src/talkpipe/app/static/serve/stream.css +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/src/talkpipe/app/static/serve/stream.js +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/src/talkpipe/app/static/serve/vendor/LICENSES.txt +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/src/talkpipe/app/static/serve/vendor/marked.min.js +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/src/talkpipe/app/static/serve/vendor/purify.min.js +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/src/talkpipe/app/static/talkpipe_logo.png +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/src/talkpipe/app/static/workbench/app.js +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/src/talkpipe/app/static/workbench/editor.js +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/src/talkpipe/app/static/workbench/index.html +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/src/talkpipe/app/static/workbench/styles.css +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/src/talkpipe/app/static/workbench/suggest.js +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/src/talkpipe/app/static/workbench/vendor/LICENSES.txt +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/src/talkpipe/app/static/workbench/vendor/codemirror.js +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/src/talkpipe/app/static/workbench/workspace.js +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/src/talkpipe/app/talkpipe_plugin_manager.py +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/src/talkpipe/app/templates/chatterlang_serve/index.html +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/src/talkpipe/app/templates/chatterlang_serve/stream.html +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/src/talkpipe/app/workbench/__init__.py +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/src/talkpipe/app/workbench/corpus.py +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/src/talkpipe/app/workbench/reference_api.py +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/src/talkpipe/app/workbench/suggest.py +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/src/talkpipe/app/workbench/suggest_api.py +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/src/talkpipe/app/workbench/workspace.py +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/src/talkpipe/app/workbench/workspace_api.py +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/src/talkpipe/app/workbench_data/seed_scripts/README.md +0 -0
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/src/talkpipe/chatterlang/__init__.py +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/src/talkpipe/chatterlang/compiler.py +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/src/talkpipe/chatterlang/parsers.py +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/src/talkpipe/chatterlang/registry.py +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/src/talkpipe/data/__init__.py +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/src/talkpipe/data/email.py +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/src/talkpipe/data/extraction.py +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/src/talkpipe/data/html.py +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/src/talkpipe/data/image.py +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/src/talkpipe/data/mongo.py +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/src/talkpipe/data/rss.py +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/src/talkpipe/data/text/__init__.py +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/src/talkpipe/data/text/chunking_units.py +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/src/talkpipe/data/text/cleaning.py +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/src/talkpipe/data/text/englishnormalize.py +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/src/talkpipe/data/text/operations.py +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/src/talkpipe/llm/__init__.py +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/src/talkpipe/llm/_ollama_common.py +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/src/talkpipe/llm/config.py +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/src/talkpipe/llm/content.py +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/src/talkpipe/llm/embedding.py +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/src/talkpipe/llm/embedding_adapters.py +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/src/talkpipe/llm/embedding_adapters_model2vec.py +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/src/talkpipe/llm/embedding_adapters_openai.py +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/src/talkpipe/llm/embedding_errors.py +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/src/talkpipe/llm/model2vec_embeddings.py +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/src/talkpipe/llm/multimodal.py +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/src/talkpipe/llm/prompt_adapter_memory.py +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/src/talkpipe/llm/prompt_adapters.py +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/src/talkpipe/llm/prompt_adapters_eliza.py +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/src/talkpipe/llm/vision.py +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/src/talkpipe/operations/__init__.py +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/src/talkpipe/operations/filtering.py +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/src/talkpipe/operations/matrices.py +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/src/talkpipe/operations/thread_ops.py +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/src/talkpipe/operations/transforms.py +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/src/talkpipe/pipe/__init__.py +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/src/talkpipe/pipe/basic.py +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/src/talkpipe/pipe/collect.py +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/src/talkpipe/pipe/core.py +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/src/talkpipe/pipe/debug.py +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/src/talkpipe/pipe/fields.py +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/src/talkpipe/pipe/filters.py +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/src/talkpipe/pipe/flow.py +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/src/talkpipe/pipe/fork.py +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/src/talkpipe/pipe/hashing.py +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/src/talkpipe/pipe/io.py +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/src/talkpipe/pipe/math.py +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/src/talkpipe/pipe/metadata.py +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/src/talkpipe/pipe/shell.py +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/src/talkpipe/pipelines/__init__.py +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/src/talkpipe/pipelines/basic_rag.py +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/src/talkpipe/pipelines/vector_databases.py +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/src/talkpipe/py.typed +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/src/talkpipe/search/__init__.py +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/src/talkpipe/search/abstract.py +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/src/talkpipe/search/lancedb.py +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/src/talkpipe/search/whoosh.py +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/src/talkpipe/util/__init__.py +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/src/talkpipe/util/collections.py +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/src/talkpipe/util/config.py +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/src/talkpipe/util/constants.py +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/src/talkpipe/util/data_manipulation.py +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/src/talkpipe/util/doc_extraction.py +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/src/talkpipe/util/iterators.py +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/src/talkpipe/util/os.py +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/src/talkpipe/util/plugin_loader.py +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/src/talkpipe.egg-info/dependency_links.txt +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/src/talkpipe.egg-info/entry_points.txt +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/src/talkpipe.egg-info/requires.txt +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/src/talkpipe.egg-info/top_level.txt +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/tests/conftest.py +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/tests/embedding_adapter_contract_suite.py +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/tests/prompt_adapter_contract_suite.py +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/tests/talkpipe/app/test_chatterlang_generate_entry_points.py +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/tests/talkpipe/app/test_chatterlang_reference_browser.py +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/tests/talkpipe/app/test_chatterlang_reference_generator.py +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/tests/talkpipe/app/test_chatterlang_script.py +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/tests/talkpipe/app/test_chatterlang_serve.py +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/tests/talkpipe/app/test_makevectordatabase.py +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/tests/talkpipe/app/test_precache_model2vec.py +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/tests/talkpipe/app/test_serve_static.py +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/tests/talkpipe/app/test_server_common.py +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/tests/talkpipe/app/test_server_hardening.py +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/tests/talkpipe/app/test_serverag.py +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/tests/talkpipe/app/test_talkpipe_plugin_manager.py +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/tests/talkpipe/app/test_workbench_corpus.py +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/tests/talkpipe/app/test_workbench_load_module.py +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/tests/talkpipe/app/test_workbench_reference_api.py +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/tests/talkpipe/app/test_workbench_static.py +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/tests/talkpipe/app/test_workbench_suggest.py +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/tests/talkpipe/app/test_workbench_workspace.py +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/tests/talkpipe/chatterlang/test_chatterlang_workbench.py +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/tests/talkpipe/chatterlang/test_compiler.py +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/tests/talkpipe/chatterlang/test_entry_point_drift.py +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/tests/talkpipe/chatterlang/test_entry_points.py +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/tests/talkpipe/chatterlang/test_parsers.py +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/tests/talkpipe/chatterlang/test_registry.py +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/tests/talkpipe/data/sample_feed.pkl +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/tests/talkpipe/data/test.docx +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/tests/talkpipe/data/test_email.py +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/tests/talkpipe/data/test_extraction.py +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/tests/talkpipe/data/test_html.py +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/tests/talkpipe/data/test_html_exceptions.py +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/tests/talkpipe/data/test_image.py +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/tests/talkpipe/data/test_mogomock.py +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/tests/talkpipe/data/test_mongo.py +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/tests/talkpipe/data/test_mongo_integration.py +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/tests/talkpipe/data/test_mongo_timeouts.py +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/tests/talkpipe/data/test_rss.py +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/tests/talkpipe/data/text/test_chunking_units.py +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/tests/talkpipe/data/text/test_cleaning.py +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/tests/talkpipe/data/text/test_englishnormalize.py +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/tests/talkpipe/data/text/test_operations.py +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/tests/talkpipe/llm/test_content.py +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/tests/talkpipe/llm/test_embedding.py +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/tests/talkpipe/llm/test_embedding_adapters_contract.py +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/tests/talkpipe/llm/test_embedding_batch.py +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/tests/talkpipe/llm/test_embedding_model2vec.py +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/tests/talkpipe/llm/test_embedding_token_overflow.py +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/tests/talkpipe/llm/test_multimodal.py +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/tests/talkpipe/llm/test_prompt_adapters_base.py +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/tests/talkpipe/llm/test_prompt_adapters_memory.py +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/tests/talkpipe/llm/test_timeouts.py +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/tests/talkpipe/llm/test_vision.py +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/tests/talkpipe/llm/test_vision_adapters.py +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/tests/talkpipe/operations/test_filtering.py +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/tests/talkpipe/operations/test_matrices.py +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/tests/talkpipe/operations/test_threading.py +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/tests/talkpipe/operations/test_transforms.py +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/tests/talkpipe/pipe/test_basic.py +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/tests/talkpipe/pipe/test_basic_split.py +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/tests/talkpipe/pipe/test_core.py +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/tests/talkpipe/pipe/test_fork.py +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/tests/talkpipe/pipe/test_io.py +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/tests/talkpipe/pipe/test_math.py +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/tests/talkpipe/pipe/test_metadata.py +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/tests/talkpipe/pipelines/test_basic_rag.py +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/tests/talkpipe/pipelines/test_vector_databases.py +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/tests/talkpipe/search/test_abstract.py +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/tests/talkpipe/search/test_lancedb.py +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/tests/talkpipe/search/test_lancedb_cache.py +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/tests/talkpipe/search/test_whoosh.py +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/tests/talkpipe/test_documentation_examples.py +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/tests/talkpipe/test_heavy_imports_are_lazy.py +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/tests/talkpipe/test_py_typed.py +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/tests/talkpipe/test_version.py +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/tests/talkpipe/util/test_collections.py +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/tests/talkpipe/util/test_config.py +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/tests/talkpipe/util/test_data_manipulation.py +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/tests/talkpipe/util/test_doc_extraction.py +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/tests/talkpipe/util/test_iterators.py +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/tests/talkpipe/util/test_os.py +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/tests/talkpipe/util/test_plugin_loader.py +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/tests/talkpipe/util/test_util.py +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/tests/test_config_keys_documented.py +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/tests/test_doc_examples.py +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/tests/test_security_vulnerabilities.py +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/tests/test_tutorial_scripts.py +0 -0
- {talkpipe-1.0.2b2 → talkpipe-1.0.2b3}/tests/testutils.py +0 -0
- {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.
|
|
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
|
-
<
|
|
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`.
|
|
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
|
|
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
|
-
<
|
|
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`.
|
|
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
|
|
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
|
|
38
|
-
|
|
39
|
-
|
|
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
|
|
Binary file
|
|
@@ -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
|
-
|
|
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=
|
|
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.
|
|
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
|
-
<
|
|
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`.
|
|
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
|
|
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
|
|
@@ -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",
|
|
@@ -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]
|