echotools 2.4.4__tar.gz → 2.4.6__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.4.4 → echotools-2.4.6}/PKG-INFO +2 -2
- {echotools-2.4.4 → echotools-2.4.6}/README.md +1 -1
- {echotools-2.4.4 → echotools-2.4.6}/pyproject.toml +1 -1
- echotools-2.4.6/src/echotools/base/ids/__init__.py +7 -0
- {echotools-2.4.4 → echotools-2.4.6}/src/echotools/base/ids/generator.py +6 -1
- {echotools-2.4.4 → echotools-2.4.6}/src/echotools/exec/fncall/__init__.py +10 -0
- {echotools-2.4.4 → echotools-2.4.6}/src/echotools/exec/fncall/prompt/behavior_blocks.py +3 -1
- {echotools-2.4.4 → echotools-2.4.6}/src/echotools/exec/fncall/protocols/entml_tool/fakemarkup.py +12 -0
- echotools-2.4.6/src/echotools/exec/fncall/tool_id.py +42 -0
- {echotools-2.4.4 → echotools-2.4.6}/src/echotools.egg-info/PKG-INFO +2 -2
- {echotools-2.4.4 → echotools-2.4.6}/src/echotools.egg-info/SOURCES.txt +2 -0
- {echotools-2.4.4 → echotools-2.4.6}/src/tests/test_entml_fake_structure_markup.py +24 -0
- {echotools-2.4.4 → echotools-2.4.6}/src/tests/test_entml_protocol.py +1 -0
- {echotools-2.4.4 → echotools-2.4.6}/src/tests/test_ids.py +7 -1
- echotools-2.4.6/src/tests/test_tool_id.py +47 -0
- echotools-2.4.4/src/echotools/base/ids/__init__.py +0 -7
- {echotools-2.4.4 → echotools-2.4.6}/setup.cfg +0 -0
- {echotools-2.4.4 → echotools-2.4.6}/src/echotools/__init__.py +0 -0
- {echotools-2.4.4 → echotools-2.4.6}/src/echotools/base/cache/__init__.py +0 -0
- {echotools-2.4.4 → echotools-2.4.6}/src/echotools/base/cache/list_cache.py +0 -0
- {echotools-2.4.4 → echotools-2.4.6}/src/echotools/base/cache/memory_cache.py +0 -0
- {echotools-2.4.4 → echotools-2.4.6}/src/echotools/base/config/__init__.py +0 -0
- {echotools-2.4.4 → echotools-2.4.6}/src/echotools/base/config/base.py +0 -0
- {echotools-2.4.4 → echotools-2.4.6}/src/echotools/base/config/center.py +0 -0
- {echotools-2.4.4 → echotools-2.4.6}/src/echotools/base/config/center_notify.py +0 -0
- {echotools-2.4.4 → echotools-2.4.6}/src/echotools/base/config/center_template.py +0 -0
- {echotools-2.4.4 → echotools-2.4.6}/src/echotools/base/config/loader.py +0 -0
- {echotools-2.4.4 → echotools-2.4.6}/src/echotools/base/config/merge.py +0 -0
- {echotools-2.4.4 → echotools-2.4.6}/src/echotools/base/errors/__init__.py +0 -0
- {echotools-2.4.4 → echotools-2.4.6}/src/echotools/base/errors/base.py +0 -0
- {echotools-2.4.4 → echotools-2.4.6}/src/echotools/base/errors/classify.py +0 -0
- {echotools-2.4.4 → echotools-2.4.6}/src/echotools/base/errors/common.py +0 -0
- {echotools-2.4.4 → echotools-2.4.6}/src/echotools/base/errors/http.py +0 -0
- {echotools-2.4.4 → echotools-2.4.6}/src/echotools/base/io/__init__.py +0 -0
- {echotools-2.4.4 → echotools-2.4.6}/src/echotools/base/io/io_utils.py +0 -0
- {echotools-2.4.4 → echotools-2.4.6}/src/echotools/base/io/printstream.py +0 -0
- {echotools-2.4.4 → echotools-2.4.6}/src/echotools/base/logger/__init__.py +0 -0
- {echotools-2.4.4 → echotools-2.4.6}/src/echotools/base/logger/manager.py +0 -0
- {echotools-2.4.4 → echotools-2.4.6}/src/echotools/base/retry/__init__.py +0 -0
- {echotools-2.4.4 → echotools-2.4.6}/src/echotools/base/retry/retry.py +0 -0
- {echotools-2.4.4 → echotools-2.4.6}/src/echotools/exec/dispatch/__init__.py +0 -0
- {echotools-2.4.4 → echotools-2.4.6}/src/echotools/exec/dispatch/candidate.py +0 -0
- {echotools-2.4.4 → echotools-2.4.6}/src/echotools/exec/dispatch/dispatcher.py +0 -0
- {echotools-2.4.4 → echotools-2.4.6}/src/echotools/exec/dispatch/proxy_selector.py +0 -0
- {echotools-2.4.4 → echotools-2.4.6}/src/echotools/exec/dispatch/race.py +0 -0
- {echotools-2.4.4 → echotools-2.4.6}/src/echotools/exec/dispatch/selector.py +0 -0
- {echotools-2.4.4 → echotools-2.4.6}/src/echotools/exec/dispatch/usage.py +0 -0
- {echotools-2.4.4 → echotools-2.4.6}/src/echotools/exec/fncall/parsers/__init__.py +0 -0
- {echotools-2.4.4 → echotools-2.4.6}/src/echotools/exec/fncall/parsers/stream.py +0 -0
- {echotools-2.4.4 → echotools-2.4.6}/src/echotools/exec/fncall/parsers/stream_delta.py +0 -0
- {echotools-2.4.4 → echotools-2.4.6}/src/echotools/exec/fncall/parsers/stream_feed.py +0 -0
- {echotools-2.4.4 → echotools-2.4.6}/src/echotools/exec/fncall/parsers/stream_final.py +0 -0
- {echotools-2.4.4 → echotools-2.4.6}/src/echotools/exec/fncall/prompt/__init__.py +0 -0
- {echotools-2.4.4 → echotools-2.4.6}/src/echotools/exec/fncall/prompt/history.py +0 -0
- {echotools-2.4.4 → echotools-2.4.6}/src/echotools/exec/fncall/prompt/history_format.py +0 -0
- {echotools-2.4.4 → echotools-2.4.6}/src/echotools/exec/fncall/prompt/inject.py +0 -0
- {echotools-2.4.4 → echotools-2.4.6}/src/echotools/exec/fncall/prompt/prompt_helpers.py +0 -0
- {echotools-2.4.4 → echotools-2.4.6}/src/echotools/exec/fncall/protocols/__init__.py +0 -0
- {echotools-2.4.4 → echotools-2.4.6}/src/echotools/exec/fncall/protocols/entml.py +0 -0
- {echotools-2.4.4 → echotools-2.4.6}/src/echotools/exec/fncall/protocols/entml_patterns/__init__.py +0 -0
- {echotools-2.4.4 → echotools-2.4.6}/src/echotools/exec/fncall/protocols/entml_patterns/invoke.py +0 -0
- {echotools-2.4.4 → echotools-2.4.6}/src/echotools/exec/fncall/protocols/entml_patterns/params.py +0 -0
- {echotools-2.4.4 → echotools-2.4.6}/src/echotools/exec/fncall/protocols/entml_patterns/regex.py +0 -0
- {echotools-2.4.4 → echotools-2.4.6}/src/echotools/exec/fncall/protocols/entml_patterns/strip.py +0 -0
- {echotools-2.4.4 → echotools-2.4.6}/src/echotools/exec/fncall/protocols/entml_schema/__init__.py +0 -0
- {echotools-2.4.4 → echotools-2.4.6}/src/echotools/exec/fncall/protocols/entml_schema/mangled.py +0 -0
- {echotools-2.4.4 → echotools-2.4.6}/src/echotools/exec/fncall/protocols/entml_schema/validate.py +0 -0
- {echotools-2.4.4 → echotools-2.4.6}/src/echotools/exec/fncall/protocols/entml_stream/__init__.py +0 -0
- {echotools-2.4.4 → echotools-2.4.6}/src/echotools/exec/fncall/protocols/entml_stream/body.py +0 -0
- {echotools-2.4.4 → echotools-2.4.6}/src/echotools/exec/fncall/protocols/entml_stream/snap.py +0 -0
- {echotools-2.4.4 → echotools-2.4.6}/src/echotools/exec/fncall/protocols/entml_think/__init__.py +0 -0
- {echotools-2.4.4 → echotools-2.4.6}/src/echotools/exec/fncall/protocols/entml_think/core.py +0 -0
- {echotools-2.4.4 → echotools-2.4.6}/src/echotools/exec/fncall/protocols/entml_think/filter.py +0 -0
- {echotools-2.4.4 → echotools-2.4.6}/src/echotools/exec/fncall/protocols/entml_think/hist.py +0 -0
- {echotools-2.4.4 → echotools-2.4.6}/src/echotools/exec/fncall/protocols/entml_think/hold.py +0 -0
- {echotools-2.4.4 → echotools-2.4.6}/src/echotools/exec/fncall/protocols/entml_think/parse.py +0 -0
- {echotools-2.4.4 → echotools-2.4.6}/src/echotools/exec/fncall/protocols/entml_tool/__init__.py +0 -0
- {echotools-2.4.4 → echotools-2.4.6}/src/echotools/exec/fncall/protocols/entml_tool/comment.py +0 -0
- {echotools-2.4.4 → echotools-2.4.6}/src/echotools/exec/fncall/protocols/entml_tool/invoke.py +0 -0
- {echotools-2.4.4 → echotools-2.4.6}/src/echotools/exec/fncall/protocols/entml_tool/tools.py +0 -0
- {echotools-2.4.4 → echotools-2.4.6}/src/echotools/exec/fncall/protocols/entml_tool/values.py +0 -0
- {echotools-2.4.4 → echotools-2.4.6}/src/echotools/exec/fncall/registry.py +0 -0
- {echotools-2.4.4 → echotools-2.4.6}/src/echotools/exec/fncall/shared/__init__.py +0 -0
- {echotools-2.4.4 → echotools-2.4.6}/src/echotools/exec/fncall/shared/coercion.py +0 -0
- {echotools-2.4.4 → echotools-2.4.6}/src/echotools/exec/fncall/shared/entml_format.py +0 -0
- {echotools-2.4.4 → echotools-2.4.6}/src/echotools/exec/fncall/shared/history_markup.py +0 -0
- {echotools-2.4.4 → echotools-2.4.6}/src/echotools/exec/fncall/shared/loop_detect.py +0 -0
- {echotools-2.4.4 → echotools-2.4.6}/src/echotools/exec/fncall/shared/normalization.py +0 -0
- {echotools-2.4.4 → echotools-2.4.6}/src/echotools/exec/fncall/shared/schema_render.py +0 -0
- {echotools-2.4.4 → echotools-2.4.6}/src/echotools/exec/keys.py +0 -0
- {echotools-2.4.4 → echotools-2.4.6}/src/echotools/exec/lifecycle/__init__.py +0 -0
- {echotools-2.4.4 → echotools-2.4.6}/src/echotools/exec/lifecycle/manager.py +0 -0
- {echotools-2.4.4 → echotools-2.4.6}/src/echotools/exec/lifecycle/updater.py +0 -0
- {echotools-2.4.4 → echotools-2.4.6}/src/echotools/exec/lifecycle/updater_pull.py +0 -0
- {echotools-2.4.4 → echotools-2.4.6}/src/echotools/exec/process/__init__.py +0 -0
- {echotools-2.4.4 → echotools-2.4.6}/src/echotools/exec/process/port.py +0 -0
- {echotools-2.4.4 → echotools-2.4.6}/src/echotools/exec/protocol/__init__.py +0 -0
- {echotools-2.4.4 → echotools-2.4.6}/src/echotools/exec/protocol/base.py +0 -0
- {echotools-2.4.4 → echotools-2.4.6}/src/echotools/exec/terminal/__init__.py +0 -0
- {echotools-2.4.4 → echotools-2.4.6}/src/echotools/exec/terminal/conpty.py +0 -0
- {echotools-2.4.4 → echotools-2.4.6}/src/echotools/exec/terminal/local/__init__.py +0 -0
- {echotools-2.4.4 → echotools-2.4.6}/src/echotools/exec/terminal/local/core.py +0 -0
- {echotools-2.4.4 → echotools-2.4.6}/src/echotools/exec/terminal/local/proc.py +0 -0
- {echotools-2.4.4 → echotools-2.4.6}/src/echotools/exec/terminal/local/unix.py +0 -0
- {echotools-2.4.4 → echotools-2.4.6}/src/echotools/exec/terminal/local/win.py +0 -0
- {echotools-2.4.4 → echotools-2.4.6}/src/echotools/exec/terminal/sanitize.py +0 -0
- {echotools-2.4.4 → echotools-2.4.6}/src/echotools/exec/terminal/session/__init__.py +0 -0
- {echotools-2.4.4 → echotools-2.4.6}/src/echotools/exec/terminal/session/base.py +0 -0
- {echotools-2.4.4 → echotools-2.4.6}/src/echotools/exec/terminal/session/client.py +0 -0
- {echotools-2.4.4 → echotools-2.4.6}/src/echotools/exec/terminal/ssh.py +0 -0
- {echotools-2.4.4 → echotools-2.4.6}/src/echotools/exec/terminal/tmux.py +0 -0
- {echotools-2.4.4 → echotools-2.4.6}/src/echotools/media/console/__init__.py +0 -0
- {echotools-2.4.4 → echotools-2.4.6}/src/echotools/media/console/charmap.py +0 -0
- {echotools-2.4.4 → echotools-2.4.6}/src/echotools/media/console/spinner.py +0 -0
- {echotools-2.4.4 → echotools-2.4.6}/src/echotools/media/console/ui.py +0 -0
- {echotools-2.4.4 → echotools-2.4.6}/src/echotools/media/console/uicore/mixins/__init__.py +0 -0
- {echotools-2.4.4 → echotools-2.4.6}/src/echotools/media/console/uicore/mixins/uibase.py +0 -0
- {echotools-2.4.4 → echotools-2.4.6}/src/echotools/media/console/uicore/mixins/uicmds.py +0 -0
- {echotools-2.4.4 → echotools-2.4.6}/src/echotools/media/console/uicore/mixins/uiinteract.py +0 -0
- {echotools-2.4.4 → echotools-2.4.6}/src/echotools/media/console/uicore/mixins/uioutput.py +0 -0
- {echotools-2.4.4 → echotools-2.4.6}/src/echotools/media/console/uicore/mixins/uistream.py +0 -0
- {echotools-2.4.4 → echotools-2.4.6}/src/echotools/media/console/uicore/ui_console.py +0 -0
- {echotools-2.4.4 → echotools-2.4.6}/src/echotools/media/console/uicore/ui_io.py +0 -0
- {echotools-2.4.4 → echotools-2.4.6}/src/echotools/media/console/uicore/ui_log.py +0 -0
- {echotools-2.4.4 → echotools-2.4.6}/src/echotools/media/console/uicore/ui_platform.py +0 -0
- {echotools-2.4.4 → echotools-2.4.6}/src/echotools/media/console/uicore/ui_text.py +0 -0
- {echotools-2.4.4 → echotools-2.4.6}/src/echotools/media/console/uicore/ui_types.py +0 -0
- {echotools-2.4.4 → echotools-2.4.6}/src/echotools/media/console/uilayout/ui_bridge.py +0 -0
- {echotools-2.4.4 → echotools-2.4.6}/src/echotools/media/console/uilayout/ui_countdown.py +0 -0
- {echotools-2.4.4 → echotools-2.4.6}/src/echotools/media/console/uilayout/ui_layout.py +0 -0
- {echotools-2.4.4 → echotools-2.4.6}/src/echotools/media/console/uilayout/ui_misc.py +0 -0
- {echotools-2.4.4 → echotools-2.4.6}/src/echotools/media/console/uilayout/ui_panel.py +0 -0
- {echotools-2.4.4 → echotools-2.4.6}/src/echotools/media/console/uilayout/ui_table.py +0 -0
- {echotools-2.4.4 → echotools-2.4.6}/src/echotools/media/console/uilayout/ui_tree.py +0 -0
- {echotools-2.4.4 → echotools-2.4.6}/src/echotools/media/console/uiwidgets/ui_box.py +0 -0
- {echotools-2.4.4 → echotools-2.4.6}/src/echotools/media/console/uiwidgets/ui_editor.py +0 -0
- {echotools-2.4.4 → echotools-2.4.6}/src/echotools/media/console/uiwidgets/ui_progress.py +0 -0
- {echotools-2.4.4 → echotools-2.4.6}/src/echotools/media/console/uiwidgets/ui_richcli.py +0 -0
- {echotools-2.4.4 → echotools-2.4.6}/src/echotools/media/console/uiwidgets/ui_select.py +0 -0
- {echotools-2.4.4 → echotools-2.4.6}/src/echotools/media/console/uiwidgets/ui_stream.py +0 -0
- {echotools-2.4.4 → echotools-2.4.6}/src/echotools/media/console/uiwidgets/ui_themes.py +0 -0
- {echotools-2.4.4 → echotools-2.4.6}/src/echotools/media/events/__init__.py +0 -0
- {echotools-2.4.4 → echotools-2.4.6}/src/echotools/media/events/bus.py +0 -0
- {echotools-2.4.4 → echotools-2.4.6}/src/echotools/media/events/event.py +0 -0
- {echotools-2.4.4 → echotools-2.4.6}/src/echotools/media/spinner/__init__.py +0 -0
- {echotools-2.4.4 → echotools-2.4.6}/src/echotools/media/spinner/spinner.py +0 -0
- {echotools-2.4.4 → echotools-2.4.6}/src/echotools/media/spinner/spinner_color.py +0 -0
- {echotools-2.4.4 → echotools-2.4.6}/src/echotools/media/tracing/__init__.py +0 -0
- {echotools-2.4.4 → echotools-2.4.6}/src/echotools/media/tracing/context.py +0 -0
- {echotools-2.4.4 → echotools-2.4.6}/src/echotools/media/tracing/span.py +0 -0
- {echotools-2.4.4 → echotools-2.4.6}/src/echotools/media/tracing/tracer.py +0 -0
- {echotools-2.4.4 → echotools-2.4.6}/src/echotools/media/translate.py +0 -0
- {echotools-2.4.4 → echotools-2.4.6}/src/echotools/media/watcher/__init__.py +0 -0
- {echotools-2.4.4 → echotools-2.4.6}/src/echotools/media/watcher/file_watcher.py +0 -0
- {echotools-2.4.4 → echotools-2.4.6}/src/echotools/media/web/__init__.py +0 -0
- {echotools-2.4.4 → echotools-2.4.6}/src/echotools/media/web/application.py +0 -0
- {echotools-2.4.4 → echotools-2.4.6}/src/echotools/media/web/broker.py +0 -0
- {echotools-2.4.4 → echotools-2.4.6}/src/echotools/media/web/input_box/app.js +0 -0
- {echotools-2.4.4 → echotools-2.4.6}/src/echotools/media/web/input_box/components/filezone.js +0 -0
- {echotools-2.4.4 → echotools-2.4.6}/src/echotools/media/web/input_box/components/motionkit.js +0 -0
- {echotools-2.4.4 → echotools-2.4.6}/src/echotools/media/web/input_box/components/sendbutton.js +0 -0
- {echotools-2.4.4 → echotools-2.4.6}/src/echotools/media/web/input_box/components/sortablelist.css +0 -0
- {echotools-2.4.4 → echotools-2.4.6}/src/echotools/media/web/input_box/components/sortablelist.js +0 -0
- {echotools-2.4.4 → echotools-2.4.6}/src/echotools/media/web/input_box/components/textinput.js +0 -0
- {echotools-2.4.4 → echotools-2.4.6}/src/echotools/media/web/input_box/components/voiceinput.js +0 -0
- {echotools-2.4.4 → echotools-2.4.6}/src/echotools/media/web/input_box/fonts/inter-500.woff2 +0 -0
- {echotools-2.4.4 → echotools-2.4.6}/src/echotools/media/web/input_box/fonts/inter-600.woff2 +0 -0
- {echotools-2.4.4 → echotools-2.4.6}/src/echotools/media/web/input_box/fonts/inter400.woff2 +0 -0
- {echotools-2.4.4 → echotools-2.4.6}/src/echotools/media/web/input_box/inputbox.css +0 -0
- {echotools-2.4.4 → echotools-2.4.6}/src/echotools/media/web/input_box/inputbox.js +0 -0
- {echotools-2.4.4 → echotools-2.4.6}/src/echotools/media/web/input_box/style.css +0 -0
- {echotools-2.4.4 → echotools-2.4.6}/src/echotools/media/web/input_box/voicegif.js +0 -0
- {echotools-2.4.4 → echotools-2.4.6}/src/echotools/media/web/middleware.py +0 -0
- {echotools-2.4.4 → echotools-2.4.6}/src/echotools/media/web/stats.py +0 -0
- {echotools-2.4.4 → echotools-2.4.6}/src/echotools/media/web/utils.py +0 -0
- {echotools-2.4.4 → echotools-2.4.6}/src/echotools/plat/files/__init__.py +0 -0
- {echotools-2.4.4 → echotools-2.4.6}/src/echotools/plat/files/file_util.py +0 -0
- {echotools-2.4.4 → echotools-2.4.6}/src/echotools/plat/network/__init__.py +0 -0
- {echotools-2.4.4 → echotools-2.4.6}/src/echotools/plat/network/http_utils.py +0 -0
- {echotools-2.4.4 → echotools-2.4.6}/src/echotools/plat/plugin/__init__.py +0 -0
- {echotools-2.4.4 → echotools-2.4.6}/src/echotools/plat/plugin/base.py +0 -0
- {echotools-2.4.4 → echotools-2.4.6}/src/echotools/plat/plugin/discovery.py +0 -0
- {echotools-2.4.4 → echotools-2.4.6}/src/echotools/plat/plugin/registry.py +0 -0
- {echotools-2.4.4 → echotools-2.4.6}/src/echotools/plat/plugin/registry_ops.py +0 -0
- {echotools-2.4.4 → echotools-2.4.6}/src/echotools/plat/proxy/__init__.py +0 -0
- {echotools-2.4.4 → echotools-2.4.6}/src/echotools/plat/proxy/manager.py +0 -0
- {echotools-2.4.4 → echotools-2.4.6}/src/echotools/plat/runtime/__init__.py +0 -0
- {echotools-2.4.4 → echotools-2.4.6}/src/echotools/plat/runtime/collector.py +0 -0
- {echotools-2.4.4 → echotools-2.4.6}/src/echotools/plat/scheduler/__init__.py +0 -0
- {echotools-2.4.4 → echotools-2.4.6}/src/echotools/plat/scheduler/scheduler.py +0 -0
- {echotools-2.4.4 → echotools-2.4.6}/src/echotools/plat/sdk/__init__.py +0 -0
- {echotools-2.4.4 → echotools-2.4.6}/src/echotools/plat/sdk/facade.py +0 -0
- {echotools-2.4.4 → echotools-2.4.6}/src/echotools/version.py +0 -0
- {echotools-2.4.4 → echotools-2.4.6}/src/echotools.egg-info/dependency_links.txt +0 -0
- {echotools-2.4.4 → echotools-2.4.6}/src/echotools.egg-info/requires.txt +0 -0
- {echotools-2.4.4 → echotools-2.4.6}/src/echotools.egg-info/top_level.txt +0 -0
- {echotools-2.4.4 → echotools-2.4.6}/src/tests/_check_parity.py +0 -0
- {echotools-2.4.4 → echotools-2.4.6}/src/tests/bench_import.py +0 -0
- {echotools-2.4.4 → echotools-2.4.6}/src/tests/conftest.py +0 -0
- {echotools-2.4.4 → echotools-2.4.6}/src/tests/fixtures/__init__.py +0 -0
- {echotools-2.4.4 → echotools-2.4.6}/src/tests/fixtures/entml_golden.py +0 -0
- {echotools-2.4.4 → echotools-2.4.6}/src/tests/fixtures/entml_golden_update.py +0 -0
- {echotools-2.4.4 → echotools-2.4.6}/src/tests/fixtures/simulated_fake_history_markup_responses.py +0 -0
- {echotools-2.4.4 → echotools-2.4.6}/src/tests/fixtures/simulated_fault_thinking_responses.py +0 -0
- {echotools-2.4.4 → echotools-2.4.6}/src/tests/fixtures/simulated_llm_tool_responses.py +0 -0
- {echotools-2.4.4 → echotools-2.4.6}/src/tests/test_adversarial_stream_splits.py +0 -0
- {echotools-2.4.4 → echotools-2.4.6}/src/tests/test_cache_retry.py +0 -0
- {echotools-2.4.4 → echotools-2.4.6}/src/tests/test_completion.py +0 -0
- {echotools-2.4.4 → echotools-2.4.6}/src/tests/test_config.py +0 -0
- {echotools-2.4.4 → echotools-2.4.6}/src/tests/test_config_extended.py +0 -0
- {echotools-2.4.4 → echotools-2.4.6}/src/tests/test_console.py +0 -0
- {echotools-2.4.4 → echotools-2.4.6}/src/tests/test_coverage_core.py +0 -0
- {echotools-2.4.4 → echotools-2.4.6}/src/tests/test_dispatch.py +0 -0
- {echotools-2.4.4 → echotools-2.4.6}/src/tests/test_dispatch_extended.py +0 -0
- {echotools-2.4.4 → echotools-2.4.6}/src/tests/test_dispatch_race.py +0 -0
- {echotools-2.4.4 → echotools-2.4.6}/src/tests/test_entml_agent_output_formats.py +0 -0
- {echotools-2.4.4 → echotools-2.4.6}/src/tests/test_entml_bare_invoke_format.py +0 -0
- {echotools-2.4.4 → echotools-2.4.6}/src/tests/test_entml_batch_stream_comprehensive.py +0 -0
- {echotools-2.4.4 → echotools-2.4.6}/src/tests/test_entml_golden.py +0 -0
- {echotools-2.4.4 → echotools-2.4.6}/src/tests/test_entml_invoke_known_tool_gate.py +0 -0
- {echotools-2.4.4 → echotools-2.4.6}/src/tests/test_entml_parser_comprehensive.py +0 -0
- {echotools-2.4.4 → echotools-2.4.6}/src/tests/test_entml_stream_json.py +0 -0
- {echotools-2.4.4 → echotools-2.4.6}/src/tests/test_entml_stream_json_exhaustive.py +0 -0
- {echotools-2.4.4 → echotools-2.4.6}/src/tests/test_entml_thinking_history.py +0 -0
- {echotools-2.4.4 → echotools-2.4.6}/src/tests/test_entml_thinking_parse.py +0 -0
- {echotools-2.4.4 → echotools-2.4.6}/src/tests/test_entml_tool_parse_leak.py +0 -0
- {echotools-2.4.4 → echotools-2.4.6}/src/tests/test_entml_tool_pipeline.py +0 -0
- {echotools-2.4.4 → echotools-2.4.6}/src/tests/test_entml_tools.py +0 -0
- {echotools-2.4.4 → echotools-2.4.6}/src/tests/test_errors.py +0 -0
- {echotools-2.4.4 → echotools-2.4.6}/src/tests/test_errors_common.py +0 -0
- {echotools-2.4.4 → echotools-2.4.6}/src/tests/test_events.py +0 -0
- {echotools-2.4.4 → echotools-2.4.6}/src/tests/test_events_event.py +0 -0
- {echotools-2.4.4 → echotools-2.4.6}/src/tests/test_facade.py +0 -0
- {echotools-2.4.4 → echotools-2.4.6}/src/tests/test_fake_history_markup_batch.py +0 -0
- {echotools-2.4.4 → echotools-2.4.6}/src/tests/test_fake_history_markup_invoke_preserve.py +0 -0
- {echotools-2.4.4 → echotools-2.4.6}/src/tests/test_fake_history_markup_reply_protect.py +0 -0
- {echotools-2.4.4 → echotools-2.4.6}/src/tests/test_fake_history_markup_stream.py +0 -0
- {echotools-2.4.4 → echotools-2.4.6}/src/tests/test_fault_thinking_close_batch.py +0 -0
- {echotools-2.4.4 → echotools-2.4.6}/src/tests/test_fault_thinking_close_stream.py +0 -0
- {echotools-2.4.4 → echotools-2.4.6}/src/tests/test_fncall.py +0 -0
- {echotools-2.4.4 → echotools-2.4.6}/src/tests/test_fncall_stream_thinking.py +0 -0
- {echotools-2.4.4 → echotools-2.4.6}/src/tests/test_history_markup_filter.py +0 -0
- {echotools-2.4.4 → echotools-2.4.6}/src/tests/test_imports.py +0 -0
- {echotools-2.4.4 → echotools-2.4.6}/src/tests/test_io.py +0 -0
- {echotools-2.4.4 → echotools-2.4.6}/src/tests/test_keys.py +0 -0
- {echotools-2.4.4 → echotools-2.4.6}/src/tests/test_lifecycle.py +0 -0
- {echotools-2.4.4 → echotools-2.4.6}/src/tests/test_logger.py +0 -0
- {echotools-2.4.4 → echotools-2.4.6}/src/tests/test_merge.py +0 -0
- {echotools-2.4.4 → echotools-2.4.6}/src/tests/test_model_branch_matrix.py +0 -0
- {echotools-2.4.4 → echotools-2.4.6}/src/tests/test_multiline_parameter_comprehensive.py +0 -0
- {echotools-2.4.4 → echotools-2.4.6}/src/tests/test_plugin.py +0 -0
- {echotools-2.4.4 → echotools-2.4.6}/src/tests/test_printstream.py +0 -0
- {echotools-2.4.4 → echotools-2.4.6}/src/tests/test_protocols.py +0 -0
- {echotools-2.4.4 → echotools-2.4.6}/src/tests/test_proxy.py +0 -0
- {echotools-2.4.4 → echotools-2.4.6}/src/tests/test_proxy_selector.py +0 -0
- {echotools-2.4.4 → echotools-2.4.6}/src/tests/test_runtime.py +0 -0
- {echotools-2.4.4 → echotools-2.4.6}/src/tests/test_scheduler.py +0 -0
- {echotools-2.4.4 → echotools-2.4.6}/src/tests/test_schema_validate.py +0 -0
- {echotools-2.4.4 → echotools-2.4.6}/src/tests/test_simulated_llm_tool_parse.py +0 -0
- {echotools-2.4.4 → echotools-2.4.6}/src/tests/test_stream_partial_json_parity.py +0 -0
- {echotools-2.4.4 → echotools-2.4.6}/src/tests/test_stream_realtime_parse.py +0 -0
- {echotools-2.4.4 → echotools-2.4.6}/src/tests/test_tracing.py +0 -0
- {echotools-2.4.4 → echotools-2.4.6}/src/tests/test_ui_bridge.py +0 -0
- {echotools-2.4.4 → echotools-2.4.6}/src/tests/test_usage.py +0 -0
- {echotools-2.4.4 → echotools-2.4.6}/src/tests/test_web.py +0 -0
- {echotools-2.4.4 → echotools-2.4.6}/src/tests/test_web_broker.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: echotools
|
|
3
|
-
Version: 2.4.
|
|
3
|
+
Version: 2.4.6
|
|
4
4
|
Summary: 通用基础设施 SDK:配置、日志、事件、调度、插件、协议、调用链
|
|
5
5
|
Home-page: https://github.com/nichengfuben/echotools
|
|
6
6
|
Author: nichengfuben
|
|
@@ -58,7 +58,7 @@ Requires-Dist: ruff>=0.4.0; extra == "dev"
|
|
|
58
58
|
|
|
59
59
|
通用基础设施 SDK:配置、日志、事件、调度、插件、调用链,以及 **entml** LLM 工具调用协议与终端 Console UI。
|
|
60
60
|
|
|
61
|
-
完全项目无关,兼容 Python 3.8–3.14。当前版本:**2.4.
|
|
61
|
+
完全项目无关,兼容 Python 3.8–3.14。当前版本:**2.4.6**(详见 [CHANGELOG](docs/CHANGELOG.md))。
|
|
62
62
|
|
|
63
63
|
## 安装
|
|
64
64
|
|
|
@@ -7,7 +7,7 @@ import struct
|
|
|
7
7
|
import time
|
|
8
8
|
import uuid
|
|
9
9
|
|
|
10
|
-
__all__ = ["uuid7", "short_id", "trace_id", "span_id"]
|
|
10
|
+
__all__ = ["uuid7", "short_id", "trace_id", "span_id", "gen_tool_id"]
|
|
11
11
|
|
|
12
12
|
|
|
13
13
|
def uuid7() -> str:
|
|
@@ -60,3 +60,8 @@ def span_id() -> str:
|
|
|
60
60
|
span_id 字符串。
|
|
61
61
|
"""
|
|
62
62
|
return secrets.token_hex(8)
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
def gen_tool_id() -> str:
|
|
66
|
+
"""生成 Anthropic 兼容的 tool_use id(``toolu_`` + 24 位十六进制)。"""
|
|
67
|
+
return f"toolu_{uuid.uuid4().hex[:24]}"
|
|
@@ -15,6 +15,12 @@ from echotools.exec.fncall.shared.normalization import (
|
|
|
15
15
|
normalize_tool_call,
|
|
16
16
|
normalize_tool_calls,
|
|
17
17
|
)
|
|
18
|
+
from echotools.base.ids.generator import gen_tool_id
|
|
19
|
+
from echotools.exec.fncall.tool_id import (
|
|
20
|
+
ensure_toolu_tool_call_id,
|
|
21
|
+
fix_tool_call_id,
|
|
22
|
+
is_placeholder_tool_call_id,
|
|
23
|
+
)
|
|
18
24
|
from echotools.exec.protocol.base import (
|
|
19
25
|
ToolProtocol,
|
|
20
26
|
get_protocol_by_id,
|
|
@@ -28,6 +34,10 @@ __all__ = [
|
|
|
28
34
|
"normalize_content",
|
|
29
35
|
"normalize_tool_call",
|
|
30
36
|
"normalize_tool_calls",
|
|
37
|
+
"gen_tool_id",
|
|
38
|
+
"is_placeholder_tool_call_id",
|
|
39
|
+
"ensure_toolu_tool_call_id",
|
|
40
|
+
"fix_tool_call_id",
|
|
31
41
|
"detect_tool_loop",
|
|
32
42
|
"LoopDetectionResult",
|
|
33
43
|
"ToolProtocol",
|
|
@@ -7,7 +7,9 @@ IMPORTANT: The <entml:funtions_results> block is a top-level block, independent
|
|
|
7
7
|
|
|
8
8
|
IMPORTANT: The id-bearing comment following an invocation inside <entml:conversation_history> is written by the execution environment only when logging an already-completed turn. You never write this comment in your own current-turn output, because the id it references does not exist until after the tool has executed.
|
|
9
9
|
|
|
10
|
-
IMPORTANT:
|
|
10
|
+
IMPORTANT: You never output an HTML comment of the form <!-- Tool Result ID:… --> anywhere in your current-turn reply. This includes lines such as <!-- Tool Result ID:toolu_376919369ffb428c9f76284f --> immediately after </entml:invoke>, on their own, or embedded in visible text. Only the execution environment writes Tool Result ID comments when logging completed turns into <entml:conversation_history>; imitating that pattern in live output is always wrong.
|
|
11
|
+
|
|
12
|
+
IMPORTANT: Your turn ends immediately at the closing tag of the last <entml:invoke> block you emit. Nothing follows it — no comment, no id, no Tool Result ID HTML comment, no result, no visible text, no conclusion that depends on data you have not yet received.
|
|
11
13
|
|
|
12
14
|
IMPORTANT: Structural patterns you observe in <entml:conversation_history> — an invocation followed by an id comment — describe what the environment logged after a past turn ended. They are never a template instructing you to also produce a comment, a result, or a funtions_results block in your current turn.
|
|
13
15
|
|
{echotools-2.4.4 → echotools-2.4.6}/src/echotools/exec/fncall/protocols/entml_tool/fakemarkup.py
RENAMED
|
@@ -29,6 +29,9 @@ _TAG_ONLY_OPEN_RES = (
|
|
|
29
29
|
re.compile(r"<entml:call\b[^>]*>", re.IGNORECASE),
|
|
30
30
|
re.compile(r"<function_calling_behavior\b[^>]*>", re.IGNORECASE),
|
|
31
31
|
re.compile(r"<thinking_behavior\b[^>]*>", re.IGNORECASE),
|
|
32
|
+
re.compile(r"<function_results\b[^>]*>", re.IGNORECASE),
|
|
33
|
+
re.compile(r"<function_result\b[^>]*>", re.IGNORECASE),
|
|
34
|
+
re.compile(r"<redacted_thinking\b[^>]*>", re.IGNORECASE),
|
|
32
35
|
re.compile(r"<entml:hard_constraint_restatement\b[^>]*>", re.IGNORECASE),
|
|
33
36
|
re.compile(r"<entml:result\b[^>]*>", re.IGNORECASE),
|
|
34
37
|
re.compile(r"<entml:todo\b[^>]*>", re.IGNORECASE),
|
|
@@ -40,6 +43,9 @@ _TAG_ONLY_CLOSE_RES = (
|
|
|
40
43
|
re.compile(r"</entml:call\s*>", re.IGNORECASE),
|
|
41
44
|
re.compile(r"</function_calling_behavior\s*>", re.IGNORECASE),
|
|
42
45
|
re.compile(r"</thinking_behavior\s*>", re.IGNORECASE),
|
|
46
|
+
re.compile(r"</function_results\s*>", re.IGNORECASE),
|
|
47
|
+
re.compile(r"</function_result\s*>", re.IGNORECASE),
|
|
48
|
+
re.compile(r"</redacted_thinking\s*>", re.IGNORECASE),
|
|
43
49
|
re.compile(r"</entml:hard_constraint_restatement\s*>", re.IGNORECASE),
|
|
44
50
|
re.compile(r"</entml:result\s*>", re.IGNORECASE),
|
|
45
51
|
re.compile(r"</entml:todo\s*>", re.IGNORECASE),
|
|
@@ -60,6 +66,12 @@ _FAKE_ENTML_TAG_PREFIXES: Tuple[str, ...] = (
|
|
|
60
66
|
"</function_calling_behavior",
|
|
61
67
|
"<thinking_behavior",
|
|
62
68
|
"</thinking_behavior",
|
|
69
|
+
"<function_results",
|
|
70
|
+
"</function_results",
|
|
71
|
+
"<function_result",
|
|
72
|
+
"</function_result",
|
|
73
|
+
"<redacted_thinking",
|
|
74
|
+
"</redacted_thinking",
|
|
63
75
|
"<entml:hard_constraint_restatement",
|
|
64
76
|
"</entml:hard_constraint_restatement",
|
|
65
77
|
"<entml:todo",
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
"""Tool call id 生成与规范化(Anthropic ``toolu_`` 约定)。"""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
from typing import Any, Dict
|
|
6
|
+
|
|
7
|
+
from echotools.base.ids.generator import gen_tool_id
|
|
8
|
+
|
|
9
|
+
_PLACEHOLDER_EXACT = frozenset({"", "call_0000", "toolu_call_0001"})
|
|
10
|
+
_PLACEHOLDER_PREFIXES = ("call_", "toolu_call_")
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
def is_placeholder_tool_call_id(raw_id: str) -> bool:
|
|
14
|
+
"""echotools 解析占位 id(``call_0000`` / ``toolu_call_*`` 等)应视为无效。"""
|
|
15
|
+
if not raw_id or raw_id in _PLACEHOLDER_EXACT:
|
|
16
|
+
return True
|
|
17
|
+
return raw_id.startswith(_PLACEHOLDER_PREFIXES)
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
def ensure_toolu_tool_call_id(raw_id: str) -> str:
|
|
21
|
+
"""占位 id 换新;已有 id 无 ``toolu_`` 前缀则补上(Anthropic tool_use 输出)。"""
|
|
22
|
+
tid = (raw_id or "").strip()
|
|
23
|
+
if is_placeholder_tool_call_id(tid):
|
|
24
|
+
return gen_tool_id()
|
|
25
|
+
if not tid.startswith("toolu_"):
|
|
26
|
+
return f"toolu_{tid}"
|
|
27
|
+
return tid
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
def fix_tool_call_id(tc: Dict[str, Any]) -> Dict[str, Any]:
|
|
31
|
+
"""将 OpenAI 格式 tool call 的占位 id 替换为 ``gen_tool_id()`` 结果。"""
|
|
32
|
+
raw_id = str(tc.get("id") or "")
|
|
33
|
+
call_id = gen_tool_id() if is_placeholder_tool_call_id(raw_id) else raw_id
|
|
34
|
+
func = tc.get("function") or {}
|
|
35
|
+
return {
|
|
36
|
+
"id": call_id,
|
|
37
|
+
"type": "function",
|
|
38
|
+
"function": {
|
|
39
|
+
"name": func.get("name", ""),
|
|
40
|
+
"arguments": func.get("arguments", "{}"),
|
|
41
|
+
},
|
|
42
|
+
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: echotools
|
|
3
|
-
Version: 2.4.
|
|
3
|
+
Version: 2.4.6
|
|
4
4
|
Summary: 通用基础设施 SDK:配置、日志、事件、调度、插件、协议、调用链
|
|
5
5
|
Home-page: https://github.com/nichengfuben/echotools
|
|
6
6
|
Author: nichengfuben
|
|
@@ -58,7 +58,7 @@ Requires-Dist: ruff>=0.4.0; extra == "dev"
|
|
|
58
58
|
|
|
59
59
|
通用基础设施 SDK:配置、日志、事件、调度、插件、调用链,以及 **entml** LLM 工具调用协议与终端 Console UI。
|
|
60
60
|
|
|
61
|
-
完全项目无关,兼容 Python 3.8–3.14。当前版本:**2.4.
|
|
61
|
+
完全项目无关,兼容 Python 3.8–3.14。当前版本:**2.4.6**(详见 [CHANGELOG](docs/CHANGELOG.md))。
|
|
62
62
|
|
|
63
63
|
## 安装
|
|
64
64
|
|
|
@@ -42,6 +42,7 @@ src/echotools/exec/dispatch/selector.py
|
|
|
42
42
|
src/echotools/exec/dispatch/usage.py
|
|
43
43
|
src/echotools/exec/fncall/__init__.py
|
|
44
44
|
src/echotools/exec/fncall/registry.py
|
|
45
|
+
src/echotools/exec/fncall/tool_id.py
|
|
45
46
|
src/echotools/exec/fncall/parsers/__init__.py
|
|
46
47
|
src/echotools/exec/fncall/parsers/stream.py
|
|
47
48
|
src/echotools/exec/fncall/parsers/stream_delta.py
|
|
@@ -249,6 +250,7 @@ src/tests/test_schema_validate.py
|
|
|
249
250
|
src/tests/test_simulated_llm_tool_parse.py
|
|
250
251
|
src/tests/test_stream_partial_json_parity.py
|
|
251
252
|
src/tests/test_stream_realtime_parse.py
|
|
253
|
+
src/tests/test_tool_id.py
|
|
252
254
|
src/tests/test_tracing.py
|
|
253
255
|
src/tests/test_ui_bridge.py
|
|
254
256
|
src/tests/test_usage.py
|
|
@@ -13,6 +13,8 @@ from echotools.exec.fncall.protocols.entml_tool.fakemarkup import (
|
|
|
13
13
|
strip_orphan_entml_close_tags,
|
|
14
14
|
)
|
|
15
15
|
|
|
16
|
+
_REDACTED_THINKING = "redacted" + "_thinking"
|
|
17
|
+
|
|
16
18
|
READ_TOOL = {
|
|
17
19
|
"type": "function",
|
|
18
20
|
"function": {
|
|
@@ -83,6 +85,18 @@ READ_TOOL = {
|
|
|
83
85
|
"hard_constraint_restatement",
|
|
84
86
|
"后",
|
|
85
87
|
),
|
|
88
|
+
(
|
|
89
|
+
"正文\n<function_results>\n假结果\n</function_results>\n继续",
|
|
90
|
+
"假结果",
|
|
91
|
+
"function_results",
|
|
92
|
+
"继续",
|
|
93
|
+
),
|
|
94
|
+
(
|
|
95
|
+
"除此之外</function_result>,中间保留",
|
|
96
|
+
"中间保留",
|
|
97
|
+
"function_result",
|
|
98
|
+
"除此之外",
|
|
99
|
+
),
|
|
86
100
|
(
|
|
87
101
|
"<entml:result>\nbody\n</entml:result>\nok",
|
|
88
102
|
"body",
|
|
@@ -117,6 +131,16 @@ def test_strip_fake_entml_structure_batch(
|
|
|
117
131
|
assert expect_present in cleaned
|
|
118
132
|
|
|
119
133
|
|
|
134
|
+
def test_strip_redacted_thinking_tags_only() -> None:
|
|
135
|
+
rt = _REDACTED_THINKING
|
|
136
|
+
raw = f"前\n<{rt}>\n已脱敏思考\n</{rt}>\n后"
|
|
137
|
+
cleaned, found = strip_fake_entml_structure_markup(raw)
|
|
138
|
+
assert found
|
|
139
|
+
assert rt not in cleaned
|
|
140
|
+
assert "已脱敏思考" in cleaned
|
|
141
|
+
assert "后" in cleaned
|
|
142
|
+
|
|
143
|
+
|
|
120
144
|
def test_tool_result_comment_partial_hold() -> None:
|
|
121
145
|
partial = "可见\n<!-- Tool Result ID:toolu_abc"
|
|
122
146
|
assert trailing_partial_tool_result_id_comment_len(partial) == len(
|
|
@@ -854,6 +854,7 @@ def test_entml_instruction_matches_spec_format() -> None:
|
|
|
854
854
|
assert "<thinking_behavior>" in prompt
|
|
855
855
|
assert "Every reply begins with a <entml:thinking>" in prompt
|
|
856
856
|
assert "<function_calling_behavior>" in prompt
|
|
857
|
+
assert "Tool Result ID:toolu_376919369ffb428c9f76284f" in prompt
|
|
857
858
|
assert "<function_results>" not in prompt
|
|
858
859
|
assert "<entml:conversation_history>\n" not in prompt
|
|
859
860
|
assert "<entml:history>" not in prompt
|
|
@@ -2,7 +2,7 @@ from __future__ import annotations
|
|
|
2
2
|
|
|
3
3
|
import pytest
|
|
4
4
|
|
|
5
|
-
from echotools.base.ids import short_id, span_id, trace_id, uuid7
|
|
5
|
+
from echotools.base.ids import short_id, span_id, trace_id, uuid7, gen_tool_id
|
|
6
6
|
|
|
7
7
|
|
|
8
8
|
def test_uuid7_format() -> None:
|
|
@@ -23,3 +23,9 @@ def test_short_id_invalid_length() -> None:
|
|
|
23
23
|
def test_trace_and_span_ids() -> None:
|
|
24
24
|
assert len(trace_id()) == 32
|
|
25
25
|
assert len(span_id()) == 16
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
def test_gen_tool_id_unique() -> None:
|
|
29
|
+
a = gen_tool_id()
|
|
30
|
+
b = gen_tool_id()
|
|
31
|
+
assert a != b
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
import pytest
|
|
4
|
+
|
|
5
|
+
from echotools.base.ids import gen_tool_id
|
|
6
|
+
from echotools.exec.fncall.tool_id import (
|
|
7
|
+
ensure_toolu_tool_call_id,
|
|
8
|
+
fix_tool_call_id,
|
|
9
|
+
is_placeholder_tool_call_id,
|
|
10
|
+
)
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
def test_gen_tool_id_format() -> None:
|
|
14
|
+
tid = gen_tool_id()
|
|
15
|
+
assert tid.startswith("toolu_")
|
|
16
|
+
assert len(tid) == len("toolu_") + 24
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
def test_is_placeholder_tool_call_id() -> None:
|
|
20
|
+
assert is_placeholder_tool_call_id("")
|
|
21
|
+
assert is_placeholder_tool_call_id("call_0000")
|
|
22
|
+
assert is_placeholder_tool_call_id("toolu_call_0001")
|
|
23
|
+
assert is_placeholder_tool_call_id("call_abc")
|
|
24
|
+
assert not is_placeholder_tool_call_id("toolu_real123")
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
def test_fix_tool_call_id_replaces_placeholder() -> None:
|
|
28
|
+
fixed = fix_tool_call_id({
|
|
29
|
+
"id": "call_0000",
|
|
30
|
+
"function": {"name": "search", "arguments": '{"q":"x"}'},
|
|
31
|
+
})
|
|
32
|
+
assert fixed["id"].startswith("toolu_")
|
|
33
|
+
assert fixed["function"]["name"] == "search"
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
def test_fix_tool_call_id_keeps_valid() -> None:
|
|
37
|
+
fixed = fix_tool_call_id({
|
|
38
|
+
"id": "toolu_abc123",
|
|
39
|
+
"function": {"name": "search", "arguments": "{}"},
|
|
40
|
+
})
|
|
41
|
+
assert fixed["id"] == "toolu_abc123"
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
def test_ensure_toolu_tool_call_id() -> None:
|
|
45
|
+
assert ensure_toolu_tool_call_id("call_0000").startswith("toolu_")
|
|
46
|
+
assert ensure_toolu_tool_call_id("abc") == "toolu_abc"
|
|
47
|
+
assert ensure_toolu_tool_call_id("toolu_xyz") == "toolu_xyz"
|
|
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.4.4 → echotools-2.4.6}/src/echotools/exec/fncall/protocols/entml_patterns/__init__.py
RENAMED
|
File without changes
|
{echotools-2.4.4 → echotools-2.4.6}/src/echotools/exec/fncall/protocols/entml_patterns/invoke.py
RENAMED
|
File without changes
|
{echotools-2.4.4 → echotools-2.4.6}/src/echotools/exec/fncall/protocols/entml_patterns/params.py
RENAMED
|
File without changes
|
{echotools-2.4.4 → echotools-2.4.6}/src/echotools/exec/fncall/protocols/entml_patterns/regex.py
RENAMED
|
File without changes
|
{echotools-2.4.4 → echotools-2.4.6}/src/echotools/exec/fncall/protocols/entml_patterns/strip.py
RENAMED
|
File without changes
|
{echotools-2.4.4 → echotools-2.4.6}/src/echotools/exec/fncall/protocols/entml_schema/__init__.py
RENAMED
|
File without changes
|
{echotools-2.4.4 → echotools-2.4.6}/src/echotools/exec/fncall/protocols/entml_schema/mangled.py
RENAMED
|
File without changes
|
{echotools-2.4.4 → echotools-2.4.6}/src/echotools/exec/fncall/protocols/entml_schema/validate.py
RENAMED
|
File without changes
|
{echotools-2.4.4 → echotools-2.4.6}/src/echotools/exec/fncall/protocols/entml_stream/__init__.py
RENAMED
|
File without changes
|
{echotools-2.4.4 → echotools-2.4.6}/src/echotools/exec/fncall/protocols/entml_stream/body.py
RENAMED
|
File without changes
|
{echotools-2.4.4 → echotools-2.4.6}/src/echotools/exec/fncall/protocols/entml_stream/snap.py
RENAMED
|
File without changes
|
{echotools-2.4.4 → echotools-2.4.6}/src/echotools/exec/fncall/protocols/entml_think/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
{echotools-2.4.4 → echotools-2.4.6}/src/echotools/exec/fncall/protocols/entml_think/filter.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{echotools-2.4.4 → echotools-2.4.6}/src/echotools/exec/fncall/protocols/entml_think/parse.py
RENAMED
|
File without changes
|
{echotools-2.4.4 → echotools-2.4.6}/src/echotools/exec/fncall/protocols/entml_tool/__init__.py
RENAMED
|
File without changes
|
{echotools-2.4.4 → echotools-2.4.6}/src/echotools/exec/fncall/protocols/entml_tool/comment.py
RENAMED
|
File without changes
|
{echotools-2.4.4 → echotools-2.4.6}/src/echotools/exec/fncall/protocols/entml_tool/invoke.py
RENAMED
|
File without changes
|
|
File without changes
|
{echotools-2.4.4 → echotools-2.4.6}/src/echotools/exec/fncall/protocols/entml_tool/values.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
|
|
File without changes
|
|
File without changes
|