echotools 2.3.89__tar.gz → 2.3.90__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (245) hide show
  1. {echotools-2.3.89 → echotools-2.3.90}/PKG-INFO +1 -1
  2. {echotools-2.3.89 → echotools-2.3.90}/pyproject.toml +1 -1
  3. {echotools-2.3.89 → echotools-2.3.90}/src/echotools/exec/fncall/prompt/templates.py +16 -6
  4. {echotools-2.3.89 → echotools-2.3.90}/src/echotools/exec/fncall/protocols/entml.py +4 -3
  5. {echotools-2.3.89 → echotools-2.3.90}/src/echotools.egg-info/PKG-INFO +1 -1
  6. {echotools-2.3.89 → echotools-2.3.90}/src/tests/test_entml_protocol.py +4 -4
  7. {echotools-2.3.89 → echotools-2.3.90}/src/tests/test_entml_tool_pipeline.py +3 -3
  8. {echotools-2.3.89 → echotools-2.3.90}/README.md +0 -0
  9. {echotools-2.3.89 → echotools-2.3.90}/setup.cfg +0 -0
  10. {echotools-2.3.89 → echotools-2.3.90}/src/echotools/__init__.py +0 -0
  11. {echotools-2.3.89 → echotools-2.3.90}/src/echotools/base/cache/__init__.py +0 -0
  12. {echotools-2.3.89 → echotools-2.3.90}/src/echotools/base/cache/list_cache.py +0 -0
  13. {echotools-2.3.89 → echotools-2.3.90}/src/echotools/base/cache/memory_cache.py +0 -0
  14. {echotools-2.3.89 → echotools-2.3.90}/src/echotools/base/config/__init__.py +0 -0
  15. {echotools-2.3.89 → echotools-2.3.90}/src/echotools/base/config/base.py +0 -0
  16. {echotools-2.3.89 → echotools-2.3.90}/src/echotools/base/config/center.py +0 -0
  17. {echotools-2.3.89 → echotools-2.3.90}/src/echotools/base/config/center_notify.py +0 -0
  18. {echotools-2.3.89 → echotools-2.3.90}/src/echotools/base/config/center_template.py +0 -0
  19. {echotools-2.3.89 → echotools-2.3.90}/src/echotools/base/config/loader.py +0 -0
  20. {echotools-2.3.89 → echotools-2.3.90}/src/echotools/base/config/merge.py +0 -0
  21. {echotools-2.3.89 → echotools-2.3.90}/src/echotools/base/errors/__init__.py +0 -0
  22. {echotools-2.3.89 → echotools-2.3.90}/src/echotools/base/errors/base.py +0 -0
  23. {echotools-2.3.89 → echotools-2.3.90}/src/echotools/base/errors/classify.py +0 -0
  24. {echotools-2.3.89 → echotools-2.3.90}/src/echotools/base/errors/common.py +0 -0
  25. {echotools-2.3.89 → echotools-2.3.90}/src/echotools/base/errors/http.py +0 -0
  26. {echotools-2.3.89 → echotools-2.3.90}/src/echotools/base/ids/__init__.py +0 -0
  27. {echotools-2.3.89 → echotools-2.3.90}/src/echotools/base/ids/generator.py +0 -0
  28. {echotools-2.3.89 → echotools-2.3.90}/src/echotools/base/io/__init__.py +0 -0
  29. {echotools-2.3.89 → echotools-2.3.90}/src/echotools/base/io/io_utils.py +0 -0
  30. {echotools-2.3.89 → echotools-2.3.90}/src/echotools/base/io/printstream.py +0 -0
  31. {echotools-2.3.89 → echotools-2.3.90}/src/echotools/base/logger/__init__.py +0 -0
  32. {echotools-2.3.89 → echotools-2.3.90}/src/echotools/base/logger/manager.py +0 -0
  33. {echotools-2.3.89 → echotools-2.3.90}/src/echotools/base/retry/__init__.py +0 -0
  34. {echotools-2.3.89 → echotools-2.3.90}/src/echotools/base/retry/retry.py +0 -0
  35. {echotools-2.3.89 → echotools-2.3.90}/src/echotools/compat.py +0 -0
  36. {echotools-2.3.89 → echotools-2.3.90}/src/echotools/exec/dispatch/__init__.py +0 -0
  37. {echotools-2.3.89 → echotools-2.3.90}/src/echotools/exec/dispatch/candidate.py +0 -0
  38. {echotools-2.3.89 → echotools-2.3.90}/src/echotools/exec/dispatch/dispatcher.py +0 -0
  39. {echotools-2.3.89 → echotools-2.3.90}/src/echotools/exec/dispatch/proxy_selector.py +0 -0
  40. {echotools-2.3.89 → echotools-2.3.90}/src/echotools/exec/dispatch/race.py +0 -0
  41. {echotools-2.3.89 → echotools-2.3.90}/src/echotools/exec/dispatch/selector.py +0 -0
  42. {echotools-2.3.89 → echotools-2.3.90}/src/echotools/exec/dispatch/usage.py +0 -0
  43. {echotools-2.3.89 → echotools-2.3.90}/src/echotools/exec/fncall/__init__.py +0 -0
  44. {echotools-2.3.89 → echotools-2.3.90}/src/echotools/exec/fncall/parsers/__init__.py +0 -0
  45. {echotools-2.3.89 → echotools-2.3.90}/src/echotools/exec/fncall/parsers/stream.py +0 -0
  46. {echotools-2.3.89 → echotools-2.3.90}/src/echotools/exec/fncall/parsers/stream_delta.py +0 -0
  47. {echotools-2.3.89 → echotools-2.3.90}/src/echotools/exec/fncall/parsers/stream_feed.py +0 -0
  48. {echotools-2.3.89 → echotools-2.3.90}/src/echotools/exec/fncall/parsers/stream_final.py +0 -0
  49. {echotools-2.3.89 → echotools-2.3.90}/src/echotools/exec/fncall/parsers/xml_params.py +0 -0
  50. {echotools-2.3.89 → echotools-2.3.90}/src/echotools/exec/fncall/parsers/xml_parser.py +0 -0
  51. {echotools-2.3.89 → echotools-2.3.90}/src/echotools/exec/fncall/prompt/__init__.py +0 -0
  52. {echotools-2.3.89 → echotools-2.3.90}/src/echotools/exec/fncall/prompt/history.py +0 -0
  53. {echotools-2.3.89 → echotools-2.3.90}/src/echotools/exec/fncall/prompt/history_format.py +0 -0
  54. {echotools-2.3.89 → echotools-2.3.90}/src/echotools/exec/fncall/prompt/inject.py +0 -0
  55. {echotools-2.3.89 → echotools-2.3.90}/src/echotools/exec/fncall/prompt/prompt_helpers.py +0 -0
  56. {echotools-2.3.89 → echotools-2.3.90}/src/echotools/exec/fncall/protocols/__init__.py +0 -0
  57. {echotools-2.3.89 → echotools-2.3.90}/src/echotools/exec/fncall/protocols/entml_invoke.py +0 -0
  58. {echotools-2.3.89 → echotools-2.3.90}/src/echotools/exec/fncall/protocols/entml_patterns.py +0 -0
  59. {echotools-2.3.89 → echotools-2.3.90}/src/echotools/exec/fncall/protocols/entml_schema.py +0 -0
  60. {echotools-2.3.89 → echotools-2.3.90}/src/echotools/exec/fncall/protocols/entml_stream/__init__.py +0 -0
  61. {echotools-2.3.89 → echotools-2.3.90}/src/echotools/exec/fncall/protocols/entml_stream/body.py +0 -0
  62. {echotools-2.3.89 → echotools-2.3.90}/src/echotools/exec/fncall/protocols/entml_stream/snap.py +0 -0
  63. {echotools-2.3.89 → echotools-2.3.90}/src/echotools/exec/fncall/protocols/entml_think/__init__.py +0 -0
  64. {echotools-2.3.89 → echotools-2.3.90}/src/echotools/exec/fncall/protocols/entml_think/blocks.py +0 -0
  65. {echotools-2.3.89 → echotools-2.3.90}/src/echotools/exec/fncall/protocols/entml_think/core.py +0 -0
  66. {echotools-2.3.89 → echotools-2.3.90}/src/echotools/exec/fncall/protocols/entml_think/filter.py +0 -0
  67. {echotools-2.3.89 → echotools-2.3.90}/src/echotools/exec/fncall/protocols/entml_think/hist.py +0 -0
  68. {echotools-2.3.89 → echotools-2.3.90}/src/echotools/exec/fncall/protocols/entml_think/hold.py +0 -0
  69. {echotools-2.3.89 → echotools-2.3.90}/src/echotools/exec/fncall/protocols/entml_think/parse.py +0 -0
  70. {echotools-2.3.89 → echotools-2.3.90}/src/echotools/exec/fncall/registry.py +0 -0
  71. {echotools-2.3.89 → echotools-2.3.90}/src/echotools/exec/fncall/shared/__init__.py +0 -0
  72. {echotools-2.3.89 → echotools-2.3.90}/src/echotools/exec/fncall/shared/coercion.py +0 -0
  73. {echotools-2.3.89 → echotools-2.3.90}/src/echotools/exec/fncall/shared/history_markup.py +0 -0
  74. {echotools-2.3.89 → echotools-2.3.90}/src/echotools/exec/fncall/shared/loop_detect.py +0 -0
  75. {echotools-2.3.89 → echotools-2.3.90}/src/echotools/exec/fncall/shared/normalization.py +0 -0
  76. {echotools-2.3.89 → echotools-2.3.90}/src/echotools/exec/fncall/shared/schema_render.py +0 -0
  77. {echotools-2.3.89 → echotools-2.3.90}/src/echotools/exec/fncall/shared/xml_helpers.py +0 -0
  78. {echotools-2.3.89 → echotools-2.3.90}/src/echotools/exec/keys.py +0 -0
  79. {echotools-2.3.89 → echotools-2.3.90}/src/echotools/exec/lifecycle/__init__.py +0 -0
  80. {echotools-2.3.89 → echotools-2.3.90}/src/echotools/exec/lifecycle/manager.py +0 -0
  81. {echotools-2.3.89 → echotools-2.3.90}/src/echotools/exec/lifecycle/updater.py +0 -0
  82. {echotools-2.3.89 → echotools-2.3.90}/src/echotools/exec/lifecycle/updater_pull.py +0 -0
  83. {echotools-2.3.89 → echotools-2.3.90}/src/echotools/exec/process/__init__.py +0 -0
  84. {echotools-2.3.89 → echotools-2.3.90}/src/echotools/exec/process/port.py +0 -0
  85. {echotools-2.3.89 → echotools-2.3.90}/src/echotools/exec/protocol/__init__.py +0 -0
  86. {echotools-2.3.89 → echotools-2.3.90}/src/echotools/exec/protocol/base.py +0 -0
  87. {echotools-2.3.89 → echotools-2.3.90}/src/echotools/exec/terminal/__init__.py +0 -0
  88. {echotools-2.3.89 → echotools-2.3.90}/src/echotools/exec/terminal/conpty.py +0 -0
  89. {echotools-2.3.89 → echotools-2.3.90}/src/echotools/exec/terminal/local/__init__.py +0 -0
  90. {echotools-2.3.89 → echotools-2.3.90}/src/echotools/exec/terminal/local/core.py +0 -0
  91. {echotools-2.3.89 → echotools-2.3.90}/src/echotools/exec/terminal/local/proc.py +0 -0
  92. {echotools-2.3.89 → echotools-2.3.90}/src/echotools/exec/terminal/local/unix.py +0 -0
  93. {echotools-2.3.89 → echotools-2.3.90}/src/echotools/exec/terminal/local/win.py +0 -0
  94. {echotools-2.3.89 → echotools-2.3.90}/src/echotools/exec/terminal/sanitize.py +0 -0
  95. {echotools-2.3.89 → echotools-2.3.90}/src/echotools/exec/terminal/session/__init__.py +0 -0
  96. {echotools-2.3.89 → echotools-2.3.90}/src/echotools/exec/terminal/session/base.py +0 -0
  97. {echotools-2.3.89 → echotools-2.3.90}/src/echotools/exec/terminal/session/client.py +0 -0
  98. {echotools-2.3.89 → echotools-2.3.90}/src/echotools/exec/terminal/ssh.py +0 -0
  99. {echotools-2.3.89 → echotools-2.3.90}/src/echotools/exec/terminal/tmux.py +0 -0
  100. {echotools-2.3.89 → echotools-2.3.90}/src/echotools/media/console/__init__.py +0 -0
  101. {echotools-2.3.89 → echotools-2.3.90}/src/echotools/media/console/charmap.py +0 -0
  102. {echotools-2.3.89 → echotools-2.3.90}/src/echotools/media/console/spinner.py +0 -0
  103. {echotools-2.3.89 → echotools-2.3.90}/src/echotools/media/console/ui.py +0 -0
  104. {echotools-2.3.89 → echotools-2.3.90}/src/echotools/media/console/uicore/mixins/__init__.py +0 -0
  105. {echotools-2.3.89 → echotools-2.3.90}/src/echotools/media/console/uicore/mixins/uibase.py +0 -0
  106. {echotools-2.3.89 → echotools-2.3.90}/src/echotools/media/console/uicore/mixins/uicmds.py +0 -0
  107. {echotools-2.3.89 → echotools-2.3.90}/src/echotools/media/console/uicore/mixins/uiinteract.py +0 -0
  108. {echotools-2.3.89 → echotools-2.3.90}/src/echotools/media/console/uicore/mixins/uioutput.py +0 -0
  109. {echotools-2.3.89 → echotools-2.3.90}/src/echotools/media/console/uicore/mixins/uistream.py +0 -0
  110. {echotools-2.3.89 → echotools-2.3.90}/src/echotools/media/console/uicore/ui_console.py +0 -0
  111. {echotools-2.3.89 → echotools-2.3.90}/src/echotools/media/console/uicore/ui_io.py +0 -0
  112. {echotools-2.3.89 → echotools-2.3.90}/src/echotools/media/console/uicore/ui_log.py +0 -0
  113. {echotools-2.3.89 → echotools-2.3.90}/src/echotools/media/console/uicore/ui_platform.py +0 -0
  114. {echotools-2.3.89 → echotools-2.3.90}/src/echotools/media/console/uicore/ui_text.py +0 -0
  115. {echotools-2.3.89 → echotools-2.3.90}/src/echotools/media/console/uicore/ui_types.py +0 -0
  116. {echotools-2.3.89 → echotools-2.3.90}/src/echotools/media/console/uilayout/ui_countdown.py +0 -0
  117. {echotools-2.3.89 → echotools-2.3.90}/src/echotools/media/console/uilayout/ui_layout.py +0 -0
  118. {echotools-2.3.89 → echotools-2.3.90}/src/echotools/media/console/uilayout/ui_misc.py +0 -0
  119. {echotools-2.3.89 → echotools-2.3.90}/src/echotools/media/console/uilayout/ui_panel.py +0 -0
  120. {echotools-2.3.89 → echotools-2.3.90}/src/echotools/media/console/uilayout/ui_table.py +0 -0
  121. {echotools-2.3.89 → echotools-2.3.90}/src/echotools/media/console/uilayout/ui_tree.py +0 -0
  122. {echotools-2.3.89 → echotools-2.3.90}/src/echotools/media/console/uiwidgets/ui_box.py +0 -0
  123. {echotools-2.3.89 → echotools-2.3.90}/src/echotools/media/console/uiwidgets/ui_editor.py +0 -0
  124. {echotools-2.3.89 → echotools-2.3.90}/src/echotools/media/console/uiwidgets/ui_progress.py +0 -0
  125. {echotools-2.3.89 → echotools-2.3.90}/src/echotools/media/console/uiwidgets/ui_select.py +0 -0
  126. {echotools-2.3.89 → echotools-2.3.90}/src/echotools/media/console/uiwidgets/ui_stream.py +0 -0
  127. {echotools-2.3.89 → echotools-2.3.90}/src/echotools/media/events/__init__.py +0 -0
  128. {echotools-2.3.89 → echotools-2.3.90}/src/echotools/media/events/bus.py +0 -0
  129. {echotools-2.3.89 → echotools-2.3.90}/src/echotools/media/events/event.py +0 -0
  130. {echotools-2.3.89 → echotools-2.3.90}/src/echotools/media/spinner/__init__.py +0 -0
  131. {echotools-2.3.89 → echotools-2.3.90}/src/echotools/media/spinner/spinner.py +0 -0
  132. {echotools-2.3.89 → echotools-2.3.90}/src/echotools/media/spinner/spinner_color.py +0 -0
  133. {echotools-2.3.89 → echotools-2.3.90}/src/echotools/media/tracing/__init__.py +0 -0
  134. {echotools-2.3.89 → echotools-2.3.90}/src/echotools/media/tracing/context.py +0 -0
  135. {echotools-2.3.89 → echotools-2.3.90}/src/echotools/media/tracing/span.py +0 -0
  136. {echotools-2.3.89 → echotools-2.3.90}/src/echotools/media/tracing/tracer.py +0 -0
  137. {echotools-2.3.89 → echotools-2.3.90}/src/echotools/media/translate.py +0 -0
  138. {echotools-2.3.89 → echotools-2.3.90}/src/echotools/media/watcher/__init__.py +0 -0
  139. {echotools-2.3.89 → echotools-2.3.90}/src/echotools/media/watcher/file_watcher.py +0 -0
  140. {echotools-2.3.89 → echotools-2.3.90}/src/echotools/media/web/__init__.py +0 -0
  141. {echotools-2.3.89 → echotools-2.3.90}/src/echotools/media/web/application.py +0 -0
  142. {echotools-2.3.89 → echotools-2.3.90}/src/echotools/media/web/broker.py +0 -0
  143. {echotools-2.3.89 → echotools-2.3.90}/src/echotools/media/web/input_box/app.js +0 -0
  144. {echotools-2.3.89 → echotools-2.3.90}/src/echotools/media/web/input_box/components/filezone.js +0 -0
  145. {echotools-2.3.89 → echotools-2.3.90}/src/echotools/media/web/input_box/components/motionkit.js +0 -0
  146. {echotools-2.3.89 → echotools-2.3.90}/src/echotools/media/web/input_box/components/sendbutton.js +0 -0
  147. {echotools-2.3.89 → echotools-2.3.90}/src/echotools/media/web/input_box/components/sortablelist.css +0 -0
  148. {echotools-2.3.89 → echotools-2.3.90}/src/echotools/media/web/input_box/components/sortablelist.js +0 -0
  149. {echotools-2.3.89 → echotools-2.3.90}/src/echotools/media/web/input_box/components/textinput.js +0 -0
  150. {echotools-2.3.89 → echotools-2.3.90}/src/echotools/media/web/input_box/components/voiceinput.js +0 -0
  151. {echotools-2.3.89 → echotools-2.3.90}/src/echotools/media/web/input_box/fonts/inter-500.woff2 +0 -0
  152. {echotools-2.3.89 → echotools-2.3.90}/src/echotools/media/web/input_box/fonts/inter-600.woff2 +0 -0
  153. {echotools-2.3.89 → echotools-2.3.90}/src/echotools/media/web/input_box/fonts/inter400.woff2 +0 -0
  154. {echotools-2.3.89 → echotools-2.3.90}/src/echotools/media/web/input_box/inputbox.css +0 -0
  155. {echotools-2.3.89 → echotools-2.3.90}/src/echotools/media/web/input_box/inputbox.js +0 -0
  156. {echotools-2.3.89 → echotools-2.3.90}/src/echotools/media/web/input_box/style.css +0 -0
  157. {echotools-2.3.89 → echotools-2.3.90}/src/echotools/media/web/input_box/voicegif.js +0 -0
  158. {echotools-2.3.89 → echotools-2.3.90}/src/echotools/media/web/middleware.py +0 -0
  159. {echotools-2.3.89 → echotools-2.3.90}/src/echotools/media/web/stats.py +0 -0
  160. {echotools-2.3.89 → echotools-2.3.90}/src/echotools/media/web/utils.py +0 -0
  161. {echotools-2.3.89 → echotools-2.3.90}/src/echotools/plat/files/__init__.py +0 -0
  162. {echotools-2.3.89 → echotools-2.3.90}/src/echotools/plat/files/file_util.py +0 -0
  163. {echotools-2.3.89 → echotools-2.3.90}/src/echotools/plat/network/__init__.py +0 -0
  164. {echotools-2.3.89 → echotools-2.3.90}/src/echotools/plat/network/http_utils.py +0 -0
  165. {echotools-2.3.89 → echotools-2.3.90}/src/echotools/plat/plugin/__init__.py +0 -0
  166. {echotools-2.3.89 → echotools-2.3.90}/src/echotools/plat/plugin/base.py +0 -0
  167. {echotools-2.3.89 → echotools-2.3.90}/src/echotools/plat/plugin/discovery.py +0 -0
  168. {echotools-2.3.89 → echotools-2.3.90}/src/echotools/plat/plugin/registry.py +0 -0
  169. {echotools-2.3.89 → echotools-2.3.90}/src/echotools/plat/plugin/registry_ops.py +0 -0
  170. {echotools-2.3.89 → echotools-2.3.90}/src/echotools/plat/proxy/__init__.py +0 -0
  171. {echotools-2.3.89 → echotools-2.3.90}/src/echotools/plat/proxy/manager.py +0 -0
  172. {echotools-2.3.89 → echotools-2.3.90}/src/echotools/plat/runtime/__init__.py +0 -0
  173. {echotools-2.3.89 → echotools-2.3.90}/src/echotools/plat/runtime/collector.py +0 -0
  174. {echotools-2.3.89 → echotools-2.3.90}/src/echotools/plat/scheduler/__init__.py +0 -0
  175. {echotools-2.3.89 → echotools-2.3.90}/src/echotools/plat/scheduler/scheduler.py +0 -0
  176. {echotools-2.3.89 → echotools-2.3.90}/src/echotools/plat/sdk/__init__.py +0 -0
  177. {echotools-2.3.89 → echotools-2.3.90}/src/echotools/plat/sdk/facade.py +0 -0
  178. {echotools-2.3.89 → echotools-2.3.90}/src/echotools/version.py +0 -0
  179. {echotools-2.3.89 → echotools-2.3.90}/src/echotools.egg-info/SOURCES.txt +0 -0
  180. {echotools-2.3.89 → echotools-2.3.90}/src/echotools.egg-info/dependency_links.txt +0 -0
  181. {echotools-2.3.89 → echotools-2.3.90}/src/echotools.egg-info/requires.txt +0 -0
  182. {echotools-2.3.89 → echotools-2.3.90}/src/echotools.egg-info/top_level.txt +0 -0
  183. {echotools-2.3.89 → echotools-2.3.90}/src/tests/bench_import.py +0 -0
  184. {echotools-2.3.89 → echotools-2.3.90}/src/tests/conftest.py +0 -0
  185. {echotools-2.3.89 → echotools-2.3.90}/src/tests/fixtures/__init__.py +0 -0
  186. {echotools-2.3.89 → echotools-2.3.90}/src/tests/fixtures/simulated_fake_history_markup_responses.py +0 -0
  187. {echotools-2.3.89 → echotools-2.3.90}/src/tests/fixtures/simulated_fault_thinking_responses.py +0 -0
  188. {echotools-2.3.89 → echotools-2.3.90}/src/tests/fixtures/simulated_llm_tool_responses.py +0 -0
  189. {echotools-2.3.89 → echotools-2.3.90}/src/tests/test_adversarial_stream_splits.py +0 -0
  190. {echotools-2.3.89 → echotools-2.3.90}/src/tests/test_cache_retry.py +0 -0
  191. {echotools-2.3.89 → echotools-2.3.90}/src/tests/test_completion.py +0 -0
  192. {echotools-2.3.89 → echotools-2.3.90}/src/tests/test_config.py +0 -0
  193. {echotools-2.3.89 → echotools-2.3.90}/src/tests/test_config_extended.py +0 -0
  194. {echotools-2.3.89 → echotools-2.3.90}/src/tests/test_console.py +0 -0
  195. {echotools-2.3.89 → echotools-2.3.90}/src/tests/test_coverage_core.py +0 -0
  196. {echotools-2.3.89 → echotools-2.3.90}/src/tests/test_dispatch.py +0 -0
  197. {echotools-2.3.89 → echotools-2.3.90}/src/tests/test_dispatch_extended.py +0 -0
  198. {echotools-2.3.89 → echotools-2.3.90}/src/tests/test_dispatch_race.py +0 -0
  199. {echotools-2.3.89 → echotools-2.3.90}/src/tests/test_entml_agent_output_formats.py +0 -0
  200. {echotools-2.3.89 → echotools-2.3.90}/src/tests/test_entml_bare_invoke_format.py +0 -0
  201. {echotools-2.3.89 → echotools-2.3.90}/src/tests/test_entml_batch_stream_comprehensive.py +0 -0
  202. {echotools-2.3.89 → echotools-2.3.90}/src/tests/test_entml_invoke_known_tool_gate.py +0 -0
  203. {echotools-2.3.89 → echotools-2.3.90}/src/tests/test_entml_parser_comprehensive.py +0 -0
  204. {echotools-2.3.89 → echotools-2.3.90}/src/tests/test_entml_stream_json.py +0 -0
  205. {echotools-2.3.89 → echotools-2.3.90}/src/tests/test_entml_stream_json_exhaustive.py +0 -0
  206. {echotools-2.3.89 → echotools-2.3.90}/src/tests/test_entml_thinking_history.py +0 -0
  207. {echotools-2.3.89 → echotools-2.3.90}/src/tests/test_entml_thinking_parse.py +0 -0
  208. {echotools-2.3.89 → echotools-2.3.90}/src/tests/test_entml_tool_parse_leak.py +0 -0
  209. {echotools-2.3.89 → echotools-2.3.90}/src/tests/test_entml_tools.py +0 -0
  210. {echotools-2.3.89 → echotools-2.3.90}/src/tests/test_errors.py +0 -0
  211. {echotools-2.3.89 → echotools-2.3.90}/src/tests/test_errors_common.py +0 -0
  212. {echotools-2.3.89 → echotools-2.3.90}/src/tests/test_events.py +0 -0
  213. {echotools-2.3.89 → echotools-2.3.90}/src/tests/test_events_event.py +0 -0
  214. {echotools-2.3.89 → echotools-2.3.90}/src/tests/test_facade.py +0 -0
  215. {echotools-2.3.89 → echotools-2.3.90}/src/tests/test_fake_history_markup_batch.py +0 -0
  216. {echotools-2.3.89 → echotools-2.3.90}/src/tests/test_fake_history_markup_invoke_preserve.py +0 -0
  217. {echotools-2.3.89 → echotools-2.3.90}/src/tests/test_fake_history_markup_reply_protect.py +0 -0
  218. {echotools-2.3.89 → echotools-2.3.90}/src/tests/test_fake_history_markup_stream.py +0 -0
  219. {echotools-2.3.89 → echotools-2.3.90}/src/tests/test_fault_thinking_close_batch.py +0 -0
  220. {echotools-2.3.89 → echotools-2.3.90}/src/tests/test_fault_thinking_close_stream.py +0 -0
  221. {echotools-2.3.89 → echotools-2.3.90}/src/tests/test_fncall.py +0 -0
  222. {echotools-2.3.89 → echotools-2.3.90}/src/tests/test_fncall_stream_thinking.py +0 -0
  223. {echotools-2.3.89 → echotools-2.3.90}/src/tests/test_history_markup_filter.py +0 -0
  224. {echotools-2.3.89 → echotools-2.3.90}/src/tests/test_ids.py +0 -0
  225. {echotools-2.3.89 → echotools-2.3.90}/src/tests/test_imports.py +0 -0
  226. {echotools-2.3.89 → echotools-2.3.90}/src/tests/test_io.py +0 -0
  227. {echotools-2.3.89 → echotools-2.3.90}/src/tests/test_keys.py +0 -0
  228. {echotools-2.3.89 → echotools-2.3.90}/src/tests/test_lifecycle.py +0 -0
  229. {echotools-2.3.89 → echotools-2.3.90}/src/tests/test_logger.py +0 -0
  230. {echotools-2.3.89 → echotools-2.3.90}/src/tests/test_merge.py +0 -0
  231. {echotools-2.3.89 → echotools-2.3.90}/src/tests/test_model_branch_matrix.py +0 -0
  232. {echotools-2.3.89 → echotools-2.3.90}/src/tests/test_plugin.py +0 -0
  233. {echotools-2.3.89 → echotools-2.3.90}/src/tests/test_printstream.py +0 -0
  234. {echotools-2.3.89 → echotools-2.3.90}/src/tests/test_protocols.py +0 -0
  235. {echotools-2.3.89 → echotools-2.3.90}/src/tests/test_proxy.py +0 -0
  236. {echotools-2.3.89 → echotools-2.3.90}/src/tests/test_proxy_selector.py +0 -0
  237. {echotools-2.3.89 → echotools-2.3.90}/src/tests/test_runtime.py +0 -0
  238. {echotools-2.3.89 → echotools-2.3.90}/src/tests/test_scheduler.py +0 -0
  239. {echotools-2.3.89 → echotools-2.3.90}/src/tests/test_simulated_llm_tool_parse.py +0 -0
  240. {echotools-2.3.89 → echotools-2.3.90}/src/tests/test_stream_partial_json_parity.py +0 -0
  241. {echotools-2.3.89 → echotools-2.3.90}/src/tests/test_stream_realtime_parse.py +0 -0
  242. {echotools-2.3.89 → echotools-2.3.90}/src/tests/test_tracing.py +0 -0
  243. {echotools-2.3.89 → echotools-2.3.90}/src/tests/test_usage.py +0 -0
  244. {echotools-2.3.89 → echotools-2.3.90}/src/tests/test_web.py +0 -0
  245. {echotools-2.3.89 → echotools-2.3.90}/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.3.89
3
+ Version: 2.3.90
4
4
  Summary: 通用基础设施 SDK:配置、日志、事件、调度、插件、协议、调用链
5
5
  Home-page: https://github.com/nichengfuben/echotools
6
6
  Author: nichengfuben
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "echotools"
7
- version = "2.3.89"
7
+ version = "2.3.90"
8
8
  description = "通用基础设施 SDK:配置、日志、事件、调度、插件、协议、调用链"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.8"
@@ -118,14 +118,24 @@ _HISTORY_CLARIFY_EN = (
118
118
  "The user's latest message follows below."
119
119
  )
120
120
 
121
- _HISTORY_TOOL_INVOKE_REMINDER_EN = (
122
- "IMPORTANT: Completed tool turns in conversation history are context only — "
123
- "never re-invoke them and never use the history `<tool>` block notation in "
124
- "your reply. To execute a tool in this turn, you must output a valid "
125
- "`<entml:invoke>` block exactly as specified in the tool instructions at "
126
- "the top of this prompt."
121
+ _TOOL_INVOKE_REMINDER_EN = (
122
+ "IMPORTANT — Tool invocation format for THIS reply (mandatory):\n"
123
+ "1. To execute a tool, output a literal `<entml:invoke name=\"TOOL_NAME\">` block "
124
+ "exactly as shown at the top of this prompt. The opening tag MUST close with `>`; "
125
+ "`TOOL_NAME` MUST be one of the available functions listed above (not a placeholder "
126
+ "or invented name).\n"
127
+ "2. Each argument goes in "
128
+ "`<entml:parameter name=\"PARAMETER_NAME\">VALUE</entml:parameter>` inside the invoke; "
129
+ "close with `</entml:invoke>`. String/scalar values as-is; lists and objects as JSON.\n"
130
+ "3. Do NOT copy `<tool>` blocks or `{ToolName: ...}` lines from conversation history — "
131
+ "those turns are already executed. History is context only; never re-invoke completed tools.\n"
132
+ "4. When mentioning `<entml:invoke>` in prose without executing, use backticks or otherwise "
133
+ "avoid a closed tag with a real tool name."
127
134
  )
128
135
 
136
+ # Back-compat alias
137
+ _HISTORY_TOOL_INVOKE_REMINDER_EN = _TOOL_INVOKE_REMINDER_EN
138
+
129
139
  _HISTORY_CLARIFY_ZH = (
130
140
  "以下是已完成的交互记录。"
131
141
  "此处展示的所有工具调用及其结果均已执行完毕,请勿重复调用。"
@@ -13,7 +13,7 @@ from typing import Any, Dict, List, Optional, Tuple
13
13
 
14
14
  from echotools.exec.fncall.prompt.templates import (
15
15
  _HISTORY_CLARIFY_EN,
16
- _HISTORY_TOOL_INVOKE_REMINDER_EN,
16
+ _TOOL_INVOKE_REMINDER_EN,
17
17
  )
18
18
  from echotools.exec.fncall.protocols.entml_invoke import (
19
19
  parse_entml_tool_calls,
@@ -194,8 +194,6 @@ class EntmlProtocol(ToolProtocol):
194
194
  sections.append(
195
195
  format_entml_conversation_history(history_text, _HISTORY_CLARIFY_EN)
196
196
  )
197
- if tool_descs and history_has_tool_calls:
198
- sections.append(_HISTORY_TOOL_INVOKE_REMINDER_EN)
199
197
 
200
198
  if loop_warning:
201
199
  sections.append(f"<loop_warning>\n{loop_warning}\n</loop_warning>")
@@ -208,6 +206,9 @@ class EntmlProtocol(ToolProtocol):
208
206
  if current_user_message is not None:
209
207
  sections.append(format_entml_current_user_message(current_user_message))
210
208
 
209
+ if tool_descs:
210
+ sections.append(_TOOL_INVOKE_REMINDER_EN)
211
+
211
212
  # thinking 放在最后,超限截断时优先保留在 send_text 尾部
212
213
  thinking_section = build_entml_thinking_section(
213
214
  protocol_options, has_tools=bool(tool_descs), history_text=history_text
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: echotools
3
- Version: 2.3.89
3
+ Version: 2.3.90
4
4
  Summary: 通用基础设施 SDK:配置、日志、事件、调度、插件、协议、调用链
5
5
  Home-page: https://github.com/nichengfuben/echotools
6
6
  Author: nichengfuben
@@ -510,12 +510,12 @@ def test_entml_history_tool_invoke_reminder_when_tools_in_history() -> None:
510
510
  assert "{search: docs}" in content or '"query": "docs"' in content
511
511
  assert "<tool>" in content
512
512
  assert "found 3" in content
513
- assert "IMPORTANT: Completed tool turns in conversation history" in content
514
- assert "`<entml:invoke>` block" in content
513
+ assert "IMPORTANT — Tool invocation format for THIS reply" in content
514
+ assert "`<entml:invoke name=\"TOOL_NAME\">`" in content
515
515
  hist_idx = content.index("<entml:conversation_history>")
516
- reminder_idx = content.index("IMPORTANT: Completed tool turns")
516
+ reminder_idx = content.index("IMPORTANT — Tool invocation format")
517
517
  user_idx = content.index("<current_user_message>")
518
- assert hist_idx < reminder_idx < user_idx
518
+ assert hist_idx < user_idx < reminder_idx
519
519
 
520
520
 
521
521
  def test_strip_entml_from_user_content() -> None:
@@ -756,11 +756,11 @@ class TestBuildMechanisms:
756
756
  idx_tools = prompt.index("### search")
757
757
  idx_sys = prompt.index("<user_system_prompt>")
758
758
  idx_hist = prompt.index("<entml:conversation_history>")
759
- idx_remind = prompt.index("IMPORTANT:")
760
759
  idx_loop = prompt.index("<loop_warning>")
761
760
  idx_user = prompt.index("<current_user_message>")
761
+ idx_remind = prompt.index("IMPORTANT — Tool invocation format")
762
762
  idx_think = prompt.index("<entml:thinking_mode>")
763
- assert idx_tools < idx_sys < idx_hist < idx_remind < idx_loop < idx_user < idx_think
763
+ assert idx_tools < idx_sys < idx_hist < idx_loop < idx_user < idx_remind < idx_think
764
764
 
765
765
  def test_inject_builds_history_tool_blocks(self) -> None:
766
766
  proto = _proto()
@@ -788,7 +788,7 @@ class TestBuildMechanisms:
788
788
  assert "{search: q}" in content
789
789
  assert "found" in content
790
790
  assert "<current_user_message>\nnext\n</current_user_message>" in content
791
- assert "IMPORTANT:" in content
791
+ assert "IMPORTANT — Tool invocation format" in content
792
792
 
793
793
  def test_build_then_parse_multi_tool_roundtrip(self) -> None:
794
794
  rendered = format_entml_tool_calls(
File without changes
File without changes