echotools 2.3.51__tar.gz → 2.3.52__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.
- {echotools-2.3.51 → echotools-2.3.52}/PKG-INFO +1 -1
- {echotools-2.3.51 → echotools-2.3.52}/pyproject.toml +1 -1
- {echotools-2.3.51 → echotools-2.3.52}/src/echotools/exec/fncall/parsers/stream.py +18 -1
- {echotools-2.3.51 → echotools-2.3.52}/src/echotools.egg-info/PKG-INFO +1 -1
- {echotools-2.3.51 → echotools-2.3.52}/src/tests/test_fncall_stream_thinking.py +36 -0
- {echotools-2.3.51 → echotools-2.3.52}/README.md +0 -0
- {echotools-2.3.51 → echotools-2.3.52}/docs/README.md +0 -0
- {echotools-2.3.51 → echotools-2.3.52}/setup.cfg +0 -0
- {echotools-2.3.51 → echotools-2.3.52}/src/echotools/__init__.py +0 -0
- {echotools-2.3.51 → echotools-2.3.52}/src/echotools/base/cache/__init__.py +0 -0
- {echotools-2.3.51 → echotools-2.3.52}/src/echotools/base/cache/list_cache.py +0 -0
- {echotools-2.3.51 → echotools-2.3.52}/src/echotools/base/cache/memory_cache.py +0 -0
- {echotools-2.3.51 → echotools-2.3.52}/src/echotools/base/config/__init__.py +0 -0
- {echotools-2.3.51 → echotools-2.3.52}/src/echotools/base/config/base.py +0 -0
- {echotools-2.3.51 → echotools-2.3.52}/src/echotools/base/config/center.py +0 -0
- {echotools-2.3.51 → echotools-2.3.52}/src/echotools/base/config/center_notify.py +0 -0
- {echotools-2.3.51 → echotools-2.3.52}/src/echotools/base/config/center_template.py +0 -0
- {echotools-2.3.51 → echotools-2.3.52}/src/echotools/base/config/loader.py +0 -0
- {echotools-2.3.51 → echotools-2.3.52}/src/echotools/base/config/merge.py +0 -0
- {echotools-2.3.51 → echotools-2.3.52}/src/echotools/base/errors/__init__.py +0 -0
- {echotools-2.3.51 → echotools-2.3.52}/src/echotools/base/errors/base.py +0 -0
- {echotools-2.3.51 → echotools-2.3.52}/src/echotools/base/errors/classify.py +0 -0
- {echotools-2.3.51 → echotools-2.3.52}/src/echotools/base/errors/common.py +0 -0
- {echotools-2.3.51 → echotools-2.3.52}/src/echotools/base/errors/http.py +0 -0
- {echotools-2.3.51 → echotools-2.3.52}/src/echotools/base/ids/__init__.py +0 -0
- {echotools-2.3.51 → echotools-2.3.52}/src/echotools/base/ids/generator.py +0 -0
- {echotools-2.3.51 → echotools-2.3.52}/src/echotools/base/io/__init__.py +0 -0
- {echotools-2.3.51 → echotools-2.3.52}/src/echotools/base/io/io_utils.py +0 -0
- {echotools-2.3.51 → echotools-2.3.52}/src/echotools/base/io/printstream.py +0 -0
- {echotools-2.3.51 → echotools-2.3.52}/src/echotools/base/logger/__init__.py +0 -0
- {echotools-2.3.51 → echotools-2.3.52}/src/echotools/base/logger/manager.py +0 -0
- {echotools-2.3.51 → echotools-2.3.52}/src/echotools/base/retry/__init__.py +0 -0
- {echotools-2.3.51 → echotools-2.3.52}/src/echotools/base/retry/retry.py +0 -0
- {echotools-2.3.51 → echotools-2.3.52}/src/echotools/compat.py +0 -0
- {echotools-2.3.51 → echotools-2.3.52}/src/echotools/exec/dispatch/__init__.py +0 -0
- {echotools-2.3.51 → echotools-2.3.52}/src/echotools/exec/dispatch/candidate.py +0 -0
- {echotools-2.3.51 → echotools-2.3.52}/src/echotools/exec/dispatch/dispatcher.py +0 -0
- {echotools-2.3.51 → echotools-2.3.52}/src/echotools/exec/dispatch/proxy_selector.py +0 -0
- {echotools-2.3.51 → echotools-2.3.52}/src/echotools/exec/dispatch/race.py +0 -0
- {echotools-2.3.51 → echotools-2.3.52}/src/echotools/exec/dispatch/selector.py +0 -0
- {echotools-2.3.51 → echotools-2.3.52}/src/echotools/exec/dispatch/usage.py +0 -0
- {echotools-2.3.51 → echotools-2.3.52}/src/echotools/exec/fncall/__init__.py +0 -0
- {echotools-2.3.51 → echotools-2.3.52}/src/echotools/exec/fncall/parsers/__init__.py +0 -0
- {echotools-2.3.51 → echotools-2.3.52}/src/echotools/exec/fncall/parsers/xml_params.py +0 -0
- {echotools-2.3.51 → echotools-2.3.52}/src/echotools/exec/fncall/parsers/xml_parser.py +0 -0
- {echotools-2.3.51 → echotools-2.3.52}/src/echotools/exec/fncall/prompt/__init__.py +0 -0
- {echotools-2.3.51 → echotools-2.3.52}/src/echotools/exec/fncall/prompt/history.py +0 -0
- {echotools-2.3.51 → echotools-2.3.52}/src/echotools/exec/fncall/prompt/history_format.py +0 -0
- {echotools-2.3.51 → echotools-2.3.52}/src/echotools/exec/fncall/prompt/inject.py +0 -0
- {echotools-2.3.51 → echotools-2.3.52}/src/echotools/exec/fncall/prompt/prompt_helpers.py +0 -0
- {echotools-2.3.51 → echotools-2.3.52}/src/echotools/exec/fncall/prompt/templates.py +0 -0
- {echotools-2.3.51 → echotools-2.3.52}/src/echotools/exec/fncall/protocols/__init__.py +0 -0
- {echotools-2.3.51 → echotools-2.3.52}/src/echotools/exec/fncall/protocols/entml.py +0 -0
- {echotools-2.3.51 → echotools-2.3.52}/src/echotools/exec/fncall/protocols/entml_invoke.py +0 -0
- {echotools-2.3.51 → echotools-2.3.52}/src/echotools/exec/fncall/protocols/entml_patterns.py +0 -0
- {echotools-2.3.51 → echotools-2.3.52}/src/echotools/exec/fncall/protocols/entml_stream_json.py +0 -0
- {echotools-2.3.51 → echotools-2.3.52}/src/echotools/exec/fncall/protocols/entml_think/__init__.py +0 -0
- {echotools-2.3.51 → echotools-2.3.52}/src/echotools/exec/fncall/protocols/entml_think/core.py +0 -0
- {echotools-2.3.51 → echotools-2.3.52}/src/echotools/exec/fncall/protocols/entml_think/hist.py +0 -0
- {echotools-2.3.51 → echotools-2.3.52}/src/echotools/exec/fncall/protocols/entml_think/parse.py +0 -0
- {echotools-2.3.51 → echotools-2.3.52}/src/echotools/exec/fncall/protocols/entml_tools.py +0 -0
- {echotools-2.3.51 → echotools-2.3.52}/src/echotools/exec/fncall/protocols/entml_values.py +0 -0
- {echotools-2.3.51 → echotools-2.3.52}/src/echotools/exec/fncall/registry.py +0 -0
- {echotools-2.3.51 → echotools-2.3.52}/src/echotools/exec/fncall/shared/__init__.py +0 -0
- {echotools-2.3.51 → echotools-2.3.52}/src/echotools/exec/fncall/shared/coercion.py +0 -0
- {echotools-2.3.51 → echotools-2.3.52}/src/echotools/exec/fncall/shared/loop_detect.py +0 -0
- {echotools-2.3.51 → echotools-2.3.52}/src/echotools/exec/fncall/shared/normalization.py +0 -0
- {echotools-2.3.51 → echotools-2.3.52}/src/echotools/exec/fncall/shared/schema_render.py +0 -0
- {echotools-2.3.51 → echotools-2.3.52}/src/echotools/exec/fncall/shared/xml_helpers.py +0 -0
- {echotools-2.3.51 → echotools-2.3.52}/src/echotools/exec/keys.py +0 -0
- {echotools-2.3.51 → echotools-2.3.52}/src/echotools/exec/lifecycle/__init__.py +0 -0
- {echotools-2.3.51 → echotools-2.3.52}/src/echotools/exec/lifecycle/manager.py +0 -0
- {echotools-2.3.51 → echotools-2.3.52}/src/echotools/exec/lifecycle/updater.py +0 -0
- {echotools-2.3.51 → echotools-2.3.52}/src/echotools/exec/lifecycle/updater_pull.py +0 -0
- {echotools-2.3.51 → echotools-2.3.52}/src/echotools/exec/process/__init__.py +0 -0
- {echotools-2.3.51 → echotools-2.3.52}/src/echotools/exec/process/port.py +0 -0
- {echotools-2.3.51 → echotools-2.3.52}/src/echotools/exec/protocol/__init__.py +0 -0
- {echotools-2.3.51 → echotools-2.3.52}/src/echotools/exec/protocol/base.py +0 -0
- {echotools-2.3.51 → echotools-2.3.52}/src/echotools/exec/terminal/__init__.py +0 -0
- {echotools-2.3.51 → echotools-2.3.52}/src/echotools/exec/terminal/conpty.py +0 -0
- {echotools-2.3.51 → echotools-2.3.52}/src/echotools/exec/terminal/local/__init__.py +0 -0
- {echotools-2.3.51 → echotools-2.3.52}/src/echotools/exec/terminal/local/core.py +0 -0
- {echotools-2.3.51 → echotools-2.3.52}/src/echotools/exec/terminal/local/proc.py +0 -0
- {echotools-2.3.51 → echotools-2.3.52}/src/echotools/exec/terminal/local/unix.py +0 -0
- {echotools-2.3.51 → echotools-2.3.52}/src/echotools/exec/terminal/local/win.py +0 -0
- {echotools-2.3.51 → echotools-2.3.52}/src/echotools/exec/terminal/sanitize.py +0 -0
- {echotools-2.3.51 → echotools-2.3.52}/src/echotools/exec/terminal/session/__init__.py +0 -0
- {echotools-2.3.51 → echotools-2.3.52}/src/echotools/exec/terminal/session/base.py +0 -0
- {echotools-2.3.51 → echotools-2.3.52}/src/echotools/exec/terminal/session/client.py +0 -0
- {echotools-2.3.51 → echotools-2.3.52}/src/echotools/exec/terminal/ssh.py +0 -0
- {echotools-2.3.51 → echotools-2.3.52}/src/echotools/exec/terminal/tmux.py +0 -0
- {echotools-2.3.51 → echotools-2.3.52}/src/echotools/media/console/__init__.py +0 -0
- {echotools-2.3.51 → echotools-2.3.52}/src/echotools/media/console/charmap.py +0 -0
- {echotools-2.3.51 → echotools-2.3.52}/src/echotools/media/console/spinner.py +0 -0
- {echotools-2.3.51 → echotools-2.3.52}/src/echotools/media/console/ui.py +0 -0
- {echotools-2.3.51 → echotools-2.3.52}/src/echotools/media/console/uicore/mixins/__init__.py +0 -0
- {echotools-2.3.51 → echotools-2.3.52}/src/echotools/media/console/uicore/mixins/uibase.py +0 -0
- {echotools-2.3.51 → echotools-2.3.52}/src/echotools/media/console/uicore/mixins/uicmds.py +0 -0
- {echotools-2.3.51 → echotools-2.3.52}/src/echotools/media/console/uicore/mixins/uiinteract.py +0 -0
- {echotools-2.3.51 → echotools-2.3.52}/src/echotools/media/console/uicore/mixins/uioutput.py +0 -0
- {echotools-2.3.51 → echotools-2.3.52}/src/echotools/media/console/uicore/mixins/uistream.py +0 -0
- {echotools-2.3.51 → echotools-2.3.52}/src/echotools/media/console/uicore/ui_console.py +0 -0
- {echotools-2.3.51 → echotools-2.3.52}/src/echotools/media/console/uicore/ui_io.py +0 -0
- {echotools-2.3.51 → echotools-2.3.52}/src/echotools/media/console/uicore/ui_log.py +0 -0
- {echotools-2.3.51 → echotools-2.3.52}/src/echotools/media/console/uicore/ui_platform.py +0 -0
- {echotools-2.3.51 → echotools-2.3.52}/src/echotools/media/console/uicore/ui_text.py +0 -0
- {echotools-2.3.51 → echotools-2.3.52}/src/echotools/media/console/uicore/ui_types.py +0 -0
- {echotools-2.3.51 → echotools-2.3.52}/src/echotools/media/console/uilayout/ui_countdown.py +0 -0
- {echotools-2.3.51 → echotools-2.3.52}/src/echotools/media/console/uilayout/ui_layout.py +0 -0
- {echotools-2.3.51 → echotools-2.3.52}/src/echotools/media/console/uilayout/ui_misc.py +0 -0
- {echotools-2.3.51 → echotools-2.3.52}/src/echotools/media/console/uilayout/ui_panel.py +0 -0
- {echotools-2.3.51 → echotools-2.3.52}/src/echotools/media/console/uilayout/ui_table.py +0 -0
- {echotools-2.3.51 → echotools-2.3.52}/src/echotools/media/console/uilayout/ui_tree.py +0 -0
- {echotools-2.3.51 → echotools-2.3.52}/src/echotools/media/console/uiwidgets/ui_box.py +0 -0
- {echotools-2.3.51 → echotools-2.3.52}/src/echotools/media/console/uiwidgets/ui_editor.py +0 -0
- {echotools-2.3.51 → echotools-2.3.52}/src/echotools/media/console/uiwidgets/ui_progress.py +0 -0
- {echotools-2.3.51 → echotools-2.3.52}/src/echotools/media/console/uiwidgets/ui_select.py +0 -0
- {echotools-2.3.51 → echotools-2.3.52}/src/echotools/media/console/uiwidgets/ui_stream.py +0 -0
- {echotools-2.3.51 → echotools-2.3.52}/src/echotools/media/events/__init__.py +0 -0
- {echotools-2.3.51 → echotools-2.3.52}/src/echotools/media/events/bus.py +0 -0
- {echotools-2.3.51 → echotools-2.3.52}/src/echotools/media/events/event.py +0 -0
- {echotools-2.3.51 → echotools-2.3.52}/src/echotools/media/spinner/__init__.py +0 -0
- {echotools-2.3.51 → echotools-2.3.52}/src/echotools/media/spinner/spinner.py +0 -0
- {echotools-2.3.51 → echotools-2.3.52}/src/echotools/media/spinner/spinner_color.py +0 -0
- {echotools-2.3.51 → echotools-2.3.52}/src/echotools/media/tracing/__init__.py +0 -0
- {echotools-2.3.51 → echotools-2.3.52}/src/echotools/media/tracing/context.py +0 -0
- {echotools-2.3.51 → echotools-2.3.52}/src/echotools/media/tracing/span.py +0 -0
- {echotools-2.3.51 → echotools-2.3.52}/src/echotools/media/tracing/tracer.py +0 -0
- {echotools-2.3.51 → echotools-2.3.52}/src/echotools/media/translate.py +0 -0
- {echotools-2.3.51 → echotools-2.3.52}/src/echotools/media/watcher/__init__.py +0 -0
- {echotools-2.3.51 → echotools-2.3.52}/src/echotools/media/watcher/file_watcher.py +0 -0
- {echotools-2.3.51 → echotools-2.3.52}/src/echotools/media/web/__init__.py +0 -0
- {echotools-2.3.51 → echotools-2.3.52}/src/echotools/media/web/application.py +0 -0
- {echotools-2.3.51 → echotools-2.3.52}/src/echotools/media/web/broker.py +0 -0
- {echotools-2.3.51 → echotools-2.3.52}/src/echotools/media/web/input_box/app.js +0 -0
- {echotools-2.3.51 → echotools-2.3.52}/src/echotools/media/web/input_box/components/filezone.js +0 -0
- {echotools-2.3.51 → echotools-2.3.52}/src/echotools/media/web/input_box/components/motionkit.js +0 -0
- {echotools-2.3.51 → echotools-2.3.52}/src/echotools/media/web/input_box/components/sendbutton.js +0 -0
- {echotools-2.3.51 → echotools-2.3.52}/src/echotools/media/web/input_box/components/sortablelist.css +0 -0
- {echotools-2.3.51 → echotools-2.3.52}/src/echotools/media/web/input_box/components/sortablelist.js +0 -0
- {echotools-2.3.51 → echotools-2.3.52}/src/echotools/media/web/input_box/components/textinput.js +0 -0
- {echotools-2.3.51 → echotools-2.3.52}/src/echotools/media/web/input_box/components/voiceinput.js +0 -0
- {echotools-2.3.51 → echotools-2.3.52}/src/echotools/media/web/input_box/fonts/inter-500.woff2 +0 -0
- {echotools-2.3.51 → echotools-2.3.52}/src/echotools/media/web/input_box/fonts/inter-600.woff2 +0 -0
- {echotools-2.3.51 → echotools-2.3.52}/src/echotools/media/web/input_box/fonts/inter400.woff2 +0 -0
- {echotools-2.3.51 → echotools-2.3.52}/src/echotools/media/web/input_box/inputbox.css +0 -0
- {echotools-2.3.51 → echotools-2.3.52}/src/echotools/media/web/input_box/inputbox.js +0 -0
- {echotools-2.3.51 → echotools-2.3.52}/src/echotools/media/web/input_box/style.css +0 -0
- {echotools-2.3.51 → echotools-2.3.52}/src/echotools/media/web/input_box/voicegif.js +0 -0
- {echotools-2.3.51 → echotools-2.3.52}/src/echotools/media/web/middleware.py +0 -0
- {echotools-2.3.51 → echotools-2.3.52}/src/echotools/media/web/stats.py +0 -0
- {echotools-2.3.51 → echotools-2.3.52}/src/echotools/media/web/utils.py +0 -0
- {echotools-2.3.51 → echotools-2.3.52}/src/echotools/plat/files/__init__.py +0 -0
- {echotools-2.3.51 → echotools-2.3.52}/src/echotools/plat/files/file_util.py +0 -0
- {echotools-2.3.51 → echotools-2.3.52}/src/echotools/plat/network/__init__.py +0 -0
- {echotools-2.3.51 → echotools-2.3.52}/src/echotools/plat/network/http_utils.py +0 -0
- {echotools-2.3.51 → echotools-2.3.52}/src/echotools/plat/plugin/__init__.py +0 -0
- {echotools-2.3.51 → echotools-2.3.52}/src/echotools/plat/plugin/base.py +0 -0
- {echotools-2.3.51 → echotools-2.3.52}/src/echotools/plat/plugin/discovery.py +0 -0
- {echotools-2.3.51 → echotools-2.3.52}/src/echotools/plat/plugin/registry.py +0 -0
- {echotools-2.3.51 → echotools-2.3.52}/src/echotools/plat/plugin/registry_ops.py +0 -0
- {echotools-2.3.51 → echotools-2.3.52}/src/echotools/plat/proxy/__init__.py +0 -0
- {echotools-2.3.51 → echotools-2.3.52}/src/echotools/plat/proxy/manager.py +0 -0
- {echotools-2.3.51 → echotools-2.3.52}/src/echotools/plat/runtime/__init__.py +0 -0
- {echotools-2.3.51 → echotools-2.3.52}/src/echotools/plat/runtime/collector.py +0 -0
- {echotools-2.3.51 → echotools-2.3.52}/src/echotools/plat/scheduler/__init__.py +0 -0
- {echotools-2.3.51 → echotools-2.3.52}/src/echotools/plat/scheduler/scheduler.py +0 -0
- {echotools-2.3.51 → echotools-2.3.52}/src/echotools/plat/sdk/__init__.py +0 -0
- {echotools-2.3.51 → echotools-2.3.52}/src/echotools/plat/sdk/facade.py +0 -0
- {echotools-2.3.51 → echotools-2.3.52}/src/echotools/version.py +0 -0
- {echotools-2.3.51 → echotools-2.3.52}/src/echotools.egg-info/SOURCES.txt +0 -0
- {echotools-2.3.51 → echotools-2.3.52}/src/echotools.egg-info/dependency_links.txt +0 -0
- {echotools-2.3.51 → echotools-2.3.52}/src/echotools.egg-info/requires.txt +0 -0
- {echotools-2.3.51 → echotools-2.3.52}/src/echotools.egg-info/top_level.txt +0 -0
- {echotools-2.3.51 → echotools-2.3.52}/src/tests/bench_import.py +0 -0
- {echotools-2.3.51 → echotools-2.3.52}/src/tests/conftest.py +0 -0
- {echotools-2.3.51 → echotools-2.3.52}/src/tests/fixtures/__init__.py +0 -0
- {echotools-2.3.51 → echotools-2.3.52}/src/tests/fixtures/simulated_llm_tool_responses.py +0 -0
- {echotools-2.3.51 → echotools-2.3.52}/src/tests/test_adversarial_stream_splits.py +0 -0
- {echotools-2.3.51 → echotools-2.3.52}/src/tests/test_cache_retry.py +0 -0
- {echotools-2.3.51 → echotools-2.3.52}/src/tests/test_completion.py +0 -0
- {echotools-2.3.51 → echotools-2.3.52}/src/tests/test_config.py +0 -0
- {echotools-2.3.51 → echotools-2.3.52}/src/tests/test_config_extended.py +0 -0
- {echotools-2.3.51 → echotools-2.3.52}/src/tests/test_console.py +0 -0
- {echotools-2.3.51 → echotools-2.3.52}/src/tests/test_coverage_core.py +0 -0
- {echotools-2.3.51 → echotools-2.3.52}/src/tests/test_dispatch.py +0 -0
- {echotools-2.3.51 → echotools-2.3.52}/src/tests/test_dispatch_extended.py +0 -0
- {echotools-2.3.51 → echotools-2.3.52}/src/tests/test_dispatch_race.py +0 -0
- {echotools-2.3.51 → echotools-2.3.52}/src/tests/test_entml_agent_output_formats.py +0 -0
- {echotools-2.3.51 → echotools-2.3.52}/src/tests/test_entml_bare_invoke_format.py +0 -0
- {echotools-2.3.51 → echotools-2.3.52}/src/tests/test_entml_parser_comprehensive.py +0 -0
- {echotools-2.3.51 → echotools-2.3.52}/src/tests/test_entml_protocol.py +0 -0
- {echotools-2.3.51 → echotools-2.3.52}/src/tests/test_entml_stream_json.py +0 -0
- {echotools-2.3.51 → echotools-2.3.52}/src/tests/test_entml_stream_json_exhaustive.py +0 -0
- {echotools-2.3.51 → echotools-2.3.52}/src/tests/test_entml_thinking_history.py +0 -0
- {echotools-2.3.51 → echotools-2.3.52}/src/tests/test_entml_thinking_parse.py +0 -0
- {echotools-2.3.51 → echotools-2.3.52}/src/tests/test_entml_tool_parse_leak.py +0 -0
- {echotools-2.3.51 → echotools-2.3.52}/src/tests/test_entml_tool_pipeline.py +0 -0
- {echotools-2.3.51 → echotools-2.3.52}/src/tests/test_entml_tools.py +0 -0
- {echotools-2.3.51 → echotools-2.3.52}/src/tests/test_errors.py +0 -0
- {echotools-2.3.51 → echotools-2.3.52}/src/tests/test_errors_common.py +0 -0
- {echotools-2.3.51 → echotools-2.3.52}/src/tests/test_events.py +0 -0
- {echotools-2.3.51 → echotools-2.3.52}/src/tests/test_events_event.py +0 -0
- {echotools-2.3.51 → echotools-2.3.52}/src/tests/test_facade.py +0 -0
- {echotools-2.3.51 → echotools-2.3.52}/src/tests/test_fncall.py +0 -0
- {echotools-2.3.51 → echotools-2.3.52}/src/tests/test_ids.py +0 -0
- {echotools-2.3.51 → echotools-2.3.52}/src/tests/test_imports.py +0 -0
- {echotools-2.3.51 → echotools-2.3.52}/src/tests/test_io.py +0 -0
- {echotools-2.3.51 → echotools-2.3.52}/src/tests/test_keys.py +0 -0
- {echotools-2.3.51 → echotools-2.3.52}/src/tests/test_lifecycle.py +0 -0
- {echotools-2.3.51 → echotools-2.3.52}/src/tests/test_logger.py +0 -0
- {echotools-2.3.51 → echotools-2.3.52}/src/tests/test_merge.py +0 -0
- {echotools-2.3.51 → echotools-2.3.52}/src/tests/test_plugin.py +0 -0
- {echotools-2.3.51 → echotools-2.3.52}/src/tests/test_printstream.py +0 -0
- {echotools-2.3.51 → echotools-2.3.52}/src/tests/test_protocols.py +0 -0
- {echotools-2.3.51 → echotools-2.3.52}/src/tests/test_proxy.py +0 -0
- {echotools-2.3.51 → echotools-2.3.52}/src/tests/test_proxy_selector.py +0 -0
- {echotools-2.3.51 → echotools-2.3.52}/src/tests/test_runtime.py +0 -0
- {echotools-2.3.51 → echotools-2.3.52}/src/tests/test_scheduler.py +0 -0
- {echotools-2.3.51 → echotools-2.3.52}/src/tests/test_simulated_llm_tool_parse.py +0 -0
- {echotools-2.3.51 → echotools-2.3.52}/src/tests/test_stream_realtime_parse.py +0 -0
- {echotools-2.3.51 → echotools-2.3.52}/src/tests/test_tracing.py +0 -0
- {echotools-2.3.51 → echotools-2.3.52}/src/tests/test_usage.py +0 -0
- {echotools-2.3.51 → echotools-2.3.52}/src/tests/test_web.py +0 -0
- {echotools-2.3.51 → echotools-2.3.52}/src/tests/test_web_broker.py +0 -0
|
@@ -332,6 +332,23 @@ class FncallStreamParser:
|
|
|
332
332
|
return True
|
|
333
333
|
return False
|
|
334
334
|
|
|
335
|
+
def _sync_json_stream_encoder_emitted(self) -> None:
|
|
336
|
+
"""invoke 已 ready 后对齐 encoder,避免下一 chunk 重发整段 partial_json。"""
|
|
337
|
+
if self._json_stream_encoder is None:
|
|
338
|
+
return
|
|
339
|
+
from echotools.exec.fncall.protocols.entml_stream_json import (
|
|
340
|
+
build_streaming_json_snapshot,
|
|
341
|
+
split_invoke_open,
|
|
342
|
+
)
|
|
343
|
+
|
|
344
|
+
parsed = split_invoke_open(self._fncall_buf)
|
|
345
|
+
if not parsed:
|
|
346
|
+
self._json_stream_encoder.reset()
|
|
347
|
+
return
|
|
348
|
+
_, body_start = parsed
|
|
349
|
+
body = self._fncall_buf[body_start:]
|
|
350
|
+
self._json_stream_encoder._emitted = build_streaming_json_snapshot(body)
|
|
351
|
+
|
|
335
352
|
def feed(self, chunk: str) -> List[Dict[str, Any]]:
|
|
336
353
|
"""喂入新的流式文本块。
|
|
337
354
|
|
|
@@ -352,7 +369,7 @@ class FncallStreamParser:
|
|
|
352
369
|
self._pending_stream_delta = self._poll_streaming_tool_input_delta()
|
|
353
370
|
ready = self.get_ready_tool_calls()
|
|
354
371
|
if ready and self._json_stream_encoder is not None:
|
|
355
|
-
self.
|
|
372
|
+
self._sync_json_stream_encoder_emitted()
|
|
356
373
|
return ready
|
|
357
374
|
|
|
358
375
|
def _poll_streaming_tool_input_delta(self) -> Optional[Tuple[str, str]]:
|
|
@@ -170,6 +170,42 @@ def test_fault_thinking_close_without_invoke_is_plain_text() -> None:
|
|
|
170
170
|
assert "answer" in clean
|
|
171
171
|
|
|
172
172
|
|
|
173
|
+
def test_stream_delta_not_duplicated_after_invoke_in_thinking() -> None:
|
|
174
|
+
"""thinking 内 invoke ready 后,下一 chunk 不应重发整段 partial_json。"""
|
|
175
|
+
import json
|
|
176
|
+
|
|
177
|
+
bash_tools = [
|
|
178
|
+
{
|
|
179
|
+
"type": "function",
|
|
180
|
+
"function": {
|
|
181
|
+
"name": "Bash",
|
|
182
|
+
"parameters": {
|
|
183
|
+
"type": "object",
|
|
184
|
+
"properties": {"command": {"type": "string"}},
|
|
185
|
+
"required": ["command"],
|
|
186
|
+
},
|
|
187
|
+
},
|
|
188
|
+
},
|
|
189
|
+
]
|
|
190
|
+
parser = FncallStreamParser(protocol=get_protocol("entml"), tools=bash_tools)
|
|
191
|
+
text = (
|
|
192
|
+
"<entml:thinking>\nneed to run echo\n"
|
|
193
|
+
'<entml:invoke name="Bash">\n'
|
|
194
|
+
'<entml:parameter name="command">echo hello</entml:parameter>\n'
|
|
195
|
+
"</entml:invoke>\n"
|
|
196
|
+
)
|
|
197
|
+
merged = ""
|
|
198
|
+
for ch in text:
|
|
199
|
+
parser.feed(ch)
|
|
200
|
+
delta = parser.consume_stream_delta()
|
|
201
|
+
if delta:
|
|
202
|
+
merged += delta[1]
|
|
203
|
+
json.loads(merged)
|
|
204
|
+
assert merged.count('"command"') == 1
|
|
205
|
+
_, calls = parser.finalize()
|
|
206
|
+
assert len(calls) == 1
|
|
207
|
+
|
|
208
|
+
|
|
173
209
|
def test_fault_thinking_close_stays_open_while_waiting_for_invoke() -> None:
|
|
174
210
|
filt = EntmlThinkingStreamFilter()
|
|
175
211
|
filt.feed("<entml:thinking>\nplan\n</thinking>\nstill ")
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{echotools-2.3.51 → echotools-2.3.52}/src/echotools/exec/fncall/protocols/entml_stream_json.py
RENAMED
|
File without changes
|
{echotools-2.3.51 → echotools-2.3.52}/src/echotools/exec/fncall/protocols/entml_think/__init__.py
RENAMED
|
File without changes
|
{echotools-2.3.51 → echotools-2.3.52}/src/echotools/exec/fncall/protocols/entml_think/core.py
RENAMED
|
File without changes
|
{echotools-2.3.51 → echotools-2.3.52}/src/echotools/exec/fncall/protocols/entml_think/hist.py
RENAMED
|
File without changes
|
{echotools-2.3.51 → echotools-2.3.52}/src/echotools/exec/fncall/protocols/entml_think/parse.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{echotools-2.3.51 → echotools-2.3.52}/src/echotools/media/console/uicore/mixins/uiinteract.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{echotools-2.3.51 → echotools-2.3.52}/src/echotools/media/web/input_box/components/filezone.js
RENAMED
|
File without changes
|
{echotools-2.3.51 → echotools-2.3.52}/src/echotools/media/web/input_box/components/motionkit.js
RENAMED
|
File without changes
|
{echotools-2.3.51 → echotools-2.3.52}/src/echotools/media/web/input_box/components/sendbutton.js
RENAMED
|
File without changes
|
{echotools-2.3.51 → echotools-2.3.52}/src/echotools/media/web/input_box/components/sortablelist.css
RENAMED
|
File without changes
|
{echotools-2.3.51 → echotools-2.3.52}/src/echotools/media/web/input_box/components/sortablelist.js
RENAMED
|
File without changes
|
{echotools-2.3.51 → echotools-2.3.52}/src/echotools/media/web/input_box/components/textinput.js
RENAMED
|
File without changes
|
{echotools-2.3.51 → echotools-2.3.52}/src/echotools/media/web/input_box/components/voiceinput.js
RENAMED
|
File without changes
|
{echotools-2.3.51 → echotools-2.3.52}/src/echotools/media/web/input_box/fonts/inter-500.woff2
RENAMED
|
File without changes
|
{echotools-2.3.51 → echotools-2.3.52}/src/echotools/media/web/input_box/fonts/inter-600.woff2
RENAMED
|
File without changes
|
{echotools-2.3.51 → echotools-2.3.52}/src/echotools/media/web/input_box/fonts/inter400.woff2
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|