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.
Files changed (266) hide show
  1. {echotools-2.4.4 → echotools-2.4.6}/PKG-INFO +2 -2
  2. {echotools-2.4.4 → echotools-2.4.6}/README.md +1 -1
  3. {echotools-2.4.4 → echotools-2.4.6}/pyproject.toml +1 -1
  4. echotools-2.4.6/src/echotools/base/ids/__init__.py +7 -0
  5. {echotools-2.4.4 → echotools-2.4.6}/src/echotools/base/ids/generator.py +6 -1
  6. {echotools-2.4.4 → echotools-2.4.6}/src/echotools/exec/fncall/__init__.py +10 -0
  7. {echotools-2.4.4 → echotools-2.4.6}/src/echotools/exec/fncall/prompt/behavior_blocks.py +3 -1
  8. {echotools-2.4.4 → echotools-2.4.6}/src/echotools/exec/fncall/protocols/entml_tool/fakemarkup.py +12 -0
  9. echotools-2.4.6/src/echotools/exec/fncall/tool_id.py +42 -0
  10. {echotools-2.4.4 → echotools-2.4.6}/src/echotools.egg-info/PKG-INFO +2 -2
  11. {echotools-2.4.4 → echotools-2.4.6}/src/echotools.egg-info/SOURCES.txt +2 -0
  12. {echotools-2.4.4 → echotools-2.4.6}/src/tests/test_entml_fake_structure_markup.py +24 -0
  13. {echotools-2.4.4 → echotools-2.4.6}/src/tests/test_entml_protocol.py +1 -0
  14. {echotools-2.4.4 → echotools-2.4.6}/src/tests/test_ids.py +7 -1
  15. echotools-2.4.6/src/tests/test_tool_id.py +47 -0
  16. echotools-2.4.4/src/echotools/base/ids/__init__.py +0 -7
  17. {echotools-2.4.4 → echotools-2.4.6}/setup.cfg +0 -0
  18. {echotools-2.4.4 → echotools-2.4.6}/src/echotools/__init__.py +0 -0
  19. {echotools-2.4.4 → echotools-2.4.6}/src/echotools/base/cache/__init__.py +0 -0
  20. {echotools-2.4.4 → echotools-2.4.6}/src/echotools/base/cache/list_cache.py +0 -0
  21. {echotools-2.4.4 → echotools-2.4.6}/src/echotools/base/cache/memory_cache.py +0 -0
  22. {echotools-2.4.4 → echotools-2.4.6}/src/echotools/base/config/__init__.py +0 -0
  23. {echotools-2.4.4 → echotools-2.4.6}/src/echotools/base/config/base.py +0 -0
  24. {echotools-2.4.4 → echotools-2.4.6}/src/echotools/base/config/center.py +0 -0
  25. {echotools-2.4.4 → echotools-2.4.6}/src/echotools/base/config/center_notify.py +0 -0
  26. {echotools-2.4.4 → echotools-2.4.6}/src/echotools/base/config/center_template.py +0 -0
  27. {echotools-2.4.4 → echotools-2.4.6}/src/echotools/base/config/loader.py +0 -0
  28. {echotools-2.4.4 → echotools-2.4.6}/src/echotools/base/config/merge.py +0 -0
  29. {echotools-2.4.4 → echotools-2.4.6}/src/echotools/base/errors/__init__.py +0 -0
  30. {echotools-2.4.4 → echotools-2.4.6}/src/echotools/base/errors/base.py +0 -0
  31. {echotools-2.4.4 → echotools-2.4.6}/src/echotools/base/errors/classify.py +0 -0
  32. {echotools-2.4.4 → echotools-2.4.6}/src/echotools/base/errors/common.py +0 -0
  33. {echotools-2.4.4 → echotools-2.4.6}/src/echotools/base/errors/http.py +0 -0
  34. {echotools-2.4.4 → echotools-2.4.6}/src/echotools/base/io/__init__.py +0 -0
  35. {echotools-2.4.4 → echotools-2.4.6}/src/echotools/base/io/io_utils.py +0 -0
  36. {echotools-2.4.4 → echotools-2.4.6}/src/echotools/base/io/printstream.py +0 -0
  37. {echotools-2.4.4 → echotools-2.4.6}/src/echotools/base/logger/__init__.py +0 -0
  38. {echotools-2.4.4 → echotools-2.4.6}/src/echotools/base/logger/manager.py +0 -0
  39. {echotools-2.4.4 → echotools-2.4.6}/src/echotools/base/retry/__init__.py +0 -0
  40. {echotools-2.4.4 → echotools-2.4.6}/src/echotools/base/retry/retry.py +0 -0
  41. {echotools-2.4.4 → echotools-2.4.6}/src/echotools/exec/dispatch/__init__.py +0 -0
  42. {echotools-2.4.4 → echotools-2.4.6}/src/echotools/exec/dispatch/candidate.py +0 -0
  43. {echotools-2.4.4 → echotools-2.4.6}/src/echotools/exec/dispatch/dispatcher.py +0 -0
  44. {echotools-2.4.4 → echotools-2.4.6}/src/echotools/exec/dispatch/proxy_selector.py +0 -0
  45. {echotools-2.4.4 → echotools-2.4.6}/src/echotools/exec/dispatch/race.py +0 -0
  46. {echotools-2.4.4 → echotools-2.4.6}/src/echotools/exec/dispatch/selector.py +0 -0
  47. {echotools-2.4.4 → echotools-2.4.6}/src/echotools/exec/dispatch/usage.py +0 -0
  48. {echotools-2.4.4 → echotools-2.4.6}/src/echotools/exec/fncall/parsers/__init__.py +0 -0
  49. {echotools-2.4.4 → echotools-2.4.6}/src/echotools/exec/fncall/parsers/stream.py +0 -0
  50. {echotools-2.4.4 → echotools-2.4.6}/src/echotools/exec/fncall/parsers/stream_delta.py +0 -0
  51. {echotools-2.4.4 → echotools-2.4.6}/src/echotools/exec/fncall/parsers/stream_feed.py +0 -0
  52. {echotools-2.4.4 → echotools-2.4.6}/src/echotools/exec/fncall/parsers/stream_final.py +0 -0
  53. {echotools-2.4.4 → echotools-2.4.6}/src/echotools/exec/fncall/prompt/__init__.py +0 -0
  54. {echotools-2.4.4 → echotools-2.4.6}/src/echotools/exec/fncall/prompt/history.py +0 -0
  55. {echotools-2.4.4 → echotools-2.4.6}/src/echotools/exec/fncall/prompt/history_format.py +0 -0
  56. {echotools-2.4.4 → echotools-2.4.6}/src/echotools/exec/fncall/prompt/inject.py +0 -0
  57. {echotools-2.4.4 → echotools-2.4.6}/src/echotools/exec/fncall/prompt/prompt_helpers.py +0 -0
  58. {echotools-2.4.4 → echotools-2.4.6}/src/echotools/exec/fncall/protocols/__init__.py +0 -0
  59. {echotools-2.4.4 → echotools-2.4.6}/src/echotools/exec/fncall/protocols/entml.py +0 -0
  60. {echotools-2.4.4 → echotools-2.4.6}/src/echotools/exec/fncall/protocols/entml_patterns/__init__.py +0 -0
  61. {echotools-2.4.4 → echotools-2.4.6}/src/echotools/exec/fncall/protocols/entml_patterns/invoke.py +0 -0
  62. {echotools-2.4.4 → echotools-2.4.6}/src/echotools/exec/fncall/protocols/entml_patterns/params.py +0 -0
  63. {echotools-2.4.4 → echotools-2.4.6}/src/echotools/exec/fncall/protocols/entml_patterns/regex.py +0 -0
  64. {echotools-2.4.4 → echotools-2.4.6}/src/echotools/exec/fncall/protocols/entml_patterns/strip.py +0 -0
  65. {echotools-2.4.4 → echotools-2.4.6}/src/echotools/exec/fncall/protocols/entml_schema/__init__.py +0 -0
  66. {echotools-2.4.4 → echotools-2.4.6}/src/echotools/exec/fncall/protocols/entml_schema/mangled.py +0 -0
  67. {echotools-2.4.4 → echotools-2.4.6}/src/echotools/exec/fncall/protocols/entml_schema/validate.py +0 -0
  68. {echotools-2.4.4 → echotools-2.4.6}/src/echotools/exec/fncall/protocols/entml_stream/__init__.py +0 -0
  69. {echotools-2.4.4 → echotools-2.4.6}/src/echotools/exec/fncall/protocols/entml_stream/body.py +0 -0
  70. {echotools-2.4.4 → echotools-2.4.6}/src/echotools/exec/fncall/protocols/entml_stream/snap.py +0 -0
  71. {echotools-2.4.4 → echotools-2.4.6}/src/echotools/exec/fncall/protocols/entml_think/__init__.py +0 -0
  72. {echotools-2.4.4 → echotools-2.4.6}/src/echotools/exec/fncall/protocols/entml_think/core.py +0 -0
  73. {echotools-2.4.4 → echotools-2.4.6}/src/echotools/exec/fncall/protocols/entml_think/filter.py +0 -0
  74. {echotools-2.4.4 → echotools-2.4.6}/src/echotools/exec/fncall/protocols/entml_think/hist.py +0 -0
  75. {echotools-2.4.4 → echotools-2.4.6}/src/echotools/exec/fncall/protocols/entml_think/hold.py +0 -0
  76. {echotools-2.4.4 → echotools-2.4.6}/src/echotools/exec/fncall/protocols/entml_think/parse.py +0 -0
  77. {echotools-2.4.4 → echotools-2.4.6}/src/echotools/exec/fncall/protocols/entml_tool/__init__.py +0 -0
  78. {echotools-2.4.4 → echotools-2.4.6}/src/echotools/exec/fncall/protocols/entml_tool/comment.py +0 -0
  79. {echotools-2.4.4 → echotools-2.4.6}/src/echotools/exec/fncall/protocols/entml_tool/invoke.py +0 -0
  80. {echotools-2.4.4 → echotools-2.4.6}/src/echotools/exec/fncall/protocols/entml_tool/tools.py +0 -0
  81. {echotools-2.4.4 → echotools-2.4.6}/src/echotools/exec/fncall/protocols/entml_tool/values.py +0 -0
  82. {echotools-2.4.4 → echotools-2.4.6}/src/echotools/exec/fncall/registry.py +0 -0
  83. {echotools-2.4.4 → echotools-2.4.6}/src/echotools/exec/fncall/shared/__init__.py +0 -0
  84. {echotools-2.4.4 → echotools-2.4.6}/src/echotools/exec/fncall/shared/coercion.py +0 -0
  85. {echotools-2.4.4 → echotools-2.4.6}/src/echotools/exec/fncall/shared/entml_format.py +0 -0
  86. {echotools-2.4.4 → echotools-2.4.6}/src/echotools/exec/fncall/shared/history_markup.py +0 -0
  87. {echotools-2.4.4 → echotools-2.4.6}/src/echotools/exec/fncall/shared/loop_detect.py +0 -0
  88. {echotools-2.4.4 → echotools-2.4.6}/src/echotools/exec/fncall/shared/normalization.py +0 -0
  89. {echotools-2.4.4 → echotools-2.4.6}/src/echotools/exec/fncall/shared/schema_render.py +0 -0
  90. {echotools-2.4.4 → echotools-2.4.6}/src/echotools/exec/keys.py +0 -0
  91. {echotools-2.4.4 → echotools-2.4.6}/src/echotools/exec/lifecycle/__init__.py +0 -0
  92. {echotools-2.4.4 → echotools-2.4.6}/src/echotools/exec/lifecycle/manager.py +0 -0
  93. {echotools-2.4.4 → echotools-2.4.6}/src/echotools/exec/lifecycle/updater.py +0 -0
  94. {echotools-2.4.4 → echotools-2.4.6}/src/echotools/exec/lifecycle/updater_pull.py +0 -0
  95. {echotools-2.4.4 → echotools-2.4.6}/src/echotools/exec/process/__init__.py +0 -0
  96. {echotools-2.4.4 → echotools-2.4.6}/src/echotools/exec/process/port.py +0 -0
  97. {echotools-2.4.4 → echotools-2.4.6}/src/echotools/exec/protocol/__init__.py +0 -0
  98. {echotools-2.4.4 → echotools-2.4.6}/src/echotools/exec/protocol/base.py +0 -0
  99. {echotools-2.4.4 → echotools-2.4.6}/src/echotools/exec/terminal/__init__.py +0 -0
  100. {echotools-2.4.4 → echotools-2.4.6}/src/echotools/exec/terminal/conpty.py +0 -0
  101. {echotools-2.4.4 → echotools-2.4.6}/src/echotools/exec/terminal/local/__init__.py +0 -0
  102. {echotools-2.4.4 → echotools-2.4.6}/src/echotools/exec/terminal/local/core.py +0 -0
  103. {echotools-2.4.4 → echotools-2.4.6}/src/echotools/exec/terminal/local/proc.py +0 -0
  104. {echotools-2.4.4 → echotools-2.4.6}/src/echotools/exec/terminal/local/unix.py +0 -0
  105. {echotools-2.4.4 → echotools-2.4.6}/src/echotools/exec/terminal/local/win.py +0 -0
  106. {echotools-2.4.4 → echotools-2.4.6}/src/echotools/exec/terminal/sanitize.py +0 -0
  107. {echotools-2.4.4 → echotools-2.4.6}/src/echotools/exec/terminal/session/__init__.py +0 -0
  108. {echotools-2.4.4 → echotools-2.4.6}/src/echotools/exec/terminal/session/base.py +0 -0
  109. {echotools-2.4.4 → echotools-2.4.6}/src/echotools/exec/terminal/session/client.py +0 -0
  110. {echotools-2.4.4 → echotools-2.4.6}/src/echotools/exec/terminal/ssh.py +0 -0
  111. {echotools-2.4.4 → echotools-2.4.6}/src/echotools/exec/terminal/tmux.py +0 -0
  112. {echotools-2.4.4 → echotools-2.4.6}/src/echotools/media/console/__init__.py +0 -0
  113. {echotools-2.4.4 → echotools-2.4.6}/src/echotools/media/console/charmap.py +0 -0
  114. {echotools-2.4.4 → echotools-2.4.6}/src/echotools/media/console/spinner.py +0 -0
  115. {echotools-2.4.4 → echotools-2.4.6}/src/echotools/media/console/ui.py +0 -0
  116. {echotools-2.4.4 → echotools-2.4.6}/src/echotools/media/console/uicore/mixins/__init__.py +0 -0
  117. {echotools-2.4.4 → echotools-2.4.6}/src/echotools/media/console/uicore/mixins/uibase.py +0 -0
  118. {echotools-2.4.4 → echotools-2.4.6}/src/echotools/media/console/uicore/mixins/uicmds.py +0 -0
  119. {echotools-2.4.4 → echotools-2.4.6}/src/echotools/media/console/uicore/mixins/uiinteract.py +0 -0
  120. {echotools-2.4.4 → echotools-2.4.6}/src/echotools/media/console/uicore/mixins/uioutput.py +0 -0
  121. {echotools-2.4.4 → echotools-2.4.6}/src/echotools/media/console/uicore/mixins/uistream.py +0 -0
  122. {echotools-2.4.4 → echotools-2.4.6}/src/echotools/media/console/uicore/ui_console.py +0 -0
  123. {echotools-2.4.4 → echotools-2.4.6}/src/echotools/media/console/uicore/ui_io.py +0 -0
  124. {echotools-2.4.4 → echotools-2.4.6}/src/echotools/media/console/uicore/ui_log.py +0 -0
  125. {echotools-2.4.4 → echotools-2.4.6}/src/echotools/media/console/uicore/ui_platform.py +0 -0
  126. {echotools-2.4.4 → echotools-2.4.6}/src/echotools/media/console/uicore/ui_text.py +0 -0
  127. {echotools-2.4.4 → echotools-2.4.6}/src/echotools/media/console/uicore/ui_types.py +0 -0
  128. {echotools-2.4.4 → echotools-2.4.6}/src/echotools/media/console/uilayout/ui_bridge.py +0 -0
  129. {echotools-2.4.4 → echotools-2.4.6}/src/echotools/media/console/uilayout/ui_countdown.py +0 -0
  130. {echotools-2.4.4 → echotools-2.4.6}/src/echotools/media/console/uilayout/ui_layout.py +0 -0
  131. {echotools-2.4.4 → echotools-2.4.6}/src/echotools/media/console/uilayout/ui_misc.py +0 -0
  132. {echotools-2.4.4 → echotools-2.4.6}/src/echotools/media/console/uilayout/ui_panel.py +0 -0
  133. {echotools-2.4.4 → echotools-2.4.6}/src/echotools/media/console/uilayout/ui_table.py +0 -0
  134. {echotools-2.4.4 → echotools-2.4.6}/src/echotools/media/console/uilayout/ui_tree.py +0 -0
  135. {echotools-2.4.4 → echotools-2.4.6}/src/echotools/media/console/uiwidgets/ui_box.py +0 -0
  136. {echotools-2.4.4 → echotools-2.4.6}/src/echotools/media/console/uiwidgets/ui_editor.py +0 -0
  137. {echotools-2.4.4 → echotools-2.4.6}/src/echotools/media/console/uiwidgets/ui_progress.py +0 -0
  138. {echotools-2.4.4 → echotools-2.4.6}/src/echotools/media/console/uiwidgets/ui_richcli.py +0 -0
  139. {echotools-2.4.4 → echotools-2.4.6}/src/echotools/media/console/uiwidgets/ui_select.py +0 -0
  140. {echotools-2.4.4 → echotools-2.4.6}/src/echotools/media/console/uiwidgets/ui_stream.py +0 -0
  141. {echotools-2.4.4 → echotools-2.4.6}/src/echotools/media/console/uiwidgets/ui_themes.py +0 -0
  142. {echotools-2.4.4 → echotools-2.4.6}/src/echotools/media/events/__init__.py +0 -0
  143. {echotools-2.4.4 → echotools-2.4.6}/src/echotools/media/events/bus.py +0 -0
  144. {echotools-2.4.4 → echotools-2.4.6}/src/echotools/media/events/event.py +0 -0
  145. {echotools-2.4.4 → echotools-2.4.6}/src/echotools/media/spinner/__init__.py +0 -0
  146. {echotools-2.4.4 → echotools-2.4.6}/src/echotools/media/spinner/spinner.py +0 -0
  147. {echotools-2.4.4 → echotools-2.4.6}/src/echotools/media/spinner/spinner_color.py +0 -0
  148. {echotools-2.4.4 → echotools-2.4.6}/src/echotools/media/tracing/__init__.py +0 -0
  149. {echotools-2.4.4 → echotools-2.4.6}/src/echotools/media/tracing/context.py +0 -0
  150. {echotools-2.4.4 → echotools-2.4.6}/src/echotools/media/tracing/span.py +0 -0
  151. {echotools-2.4.4 → echotools-2.4.6}/src/echotools/media/tracing/tracer.py +0 -0
  152. {echotools-2.4.4 → echotools-2.4.6}/src/echotools/media/translate.py +0 -0
  153. {echotools-2.4.4 → echotools-2.4.6}/src/echotools/media/watcher/__init__.py +0 -0
  154. {echotools-2.4.4 → echotools-2.4.6}/src/echotools/media/watcher/file_watcher.py +0 -0
  155. {echotools-2.4.4 → echotools-2.4.6}/src/echotools/media/web/__init__.py +0 -0
  156. {echotools-2.4.4 → echotools-2.4.6}/src/echotools/media/web/application.py +0 -0
  157. {echotools-2.4.4 → echotools-2.4.6}/src/echotools/media/web/broker.py +0 -0
  158. {echotools-2.4.4 → echotools-2.4.6}/src/echotools/media/web/input_box/app.js +0 -0
  159. {echotools-2.4.4 → echotools-2.4.6}/src/echotools/media/web/input_box/components/filezone.js +0 -0
  160. {echotools-2.4.4 → echotools-2.4.6}/src/echotools/media/web/input_box/components/motionkit.js +0 -0
  161. {echotools-2.4.4 → echotools-2.4.6}/src/echotools/media/web/input_box/components/sendbutton.js +0 -0
  162. {echotools-2.4.4 → echotools-2.4.6}/src/echotools/media/web/input_box/components/sortablelist.css +0 -0
  163. {echotools-2.4.4 → echotools-2.4.6}/src/echotools/media/web/input_box/components/sortablelist.js +0 -0
  164. {echotools-2.4.4 → echotools-2.4.6}/src/echotools/media/web/input_box/components/textinput.js +0 -0
  165. {echotools-2.4.4 → echotools-2.4.6}/src/echotools/media/web/input_box/components/voiceinput.js +0 -0
  166. {echotools-2.4.4 → echotools-2.4.6}/src/echotools/media/web/input_box/fonts/inter-500.woff2 +0 -0
  167. {echotools-2.4.4 → echotools-2.4.6}/src/echotools/media/web/input_box/fonts/inter-600.woff2 +0 -0
  168. {echotools-2.4.4 → echotools-2.4.6}/src/echotools/media/web/input_box/fonts/inter400.woff2 +0 -0
  169. {echotools-2.4.4 → echotools-2.4.6}/src/echotools/media/web/input_box/inputbox.css +0 -0
  170. {echotools-2.4.4 → echotools-2.4.6}/src/echotools/media/web/input_box/inputbox.js +0 -0
  171. {echotools-2.4.4 → echotools-2.4.6}/src/echotools/media/web/input_box/style.css +0 -0
  172. {echotools-2.4.4 → echotools-2.4.6}/src/echotools/media/web/input_box/voicegif.js +0 -0
  173. {echotools-2.4.4 → echotools-2.4.6}/src/echotools/media/web/middleware.py +0 -0
  174. {echotools-2.4.4 → echotools-2.4.6}/src/echotools/media/web/stats.py +0 -0
  175. {echotools-2.4.4 → echotools-2.4.6}/src/echotools/media/web/utils.py +0 -0
  176. {echotools-2.4.4 → echotools-2.4.6}/src/echotools/plat/files/__init__.py +0 -0
  177. {echotools-2.4.4 → echotools-2.4.6}/src/echotools/plat/files/file_util.py +0 -0
  178. {echotools-2.4.4 → echotools-2.4.6}/src/echotools/plat/network/__init__.py +0 -0
  179. {echotools-2.4.4 → echotools-2.4.6}/src/echotools/plat/network/http_utils.py +0 -0
  180. {echotools-2.4.4 → echotools-2.4.6}/src/echotools/plat/plugin/__init__.py +0 -0
  181. {echotools-2.4.4 → echotools-2.4.6}/src/echotools/plat/plugin/base.py +0 -0
  182. {echotools-2.4.4 → echotools-2.4.6}/src/echotools/plat/plugin/discovery.py +0 -0
  183. {echotools-2.4.4 → echotools-2.4.6}/src/echotools/plat/plugin/registry.py +0 -0
  184. {echotools-2.4.4 → echotools-2.4.6}/src/echotools/plat/plugin/registry_ops.py +0 -0
  185. {echotools-2.4.4 → echotools-2.4.6}/src/echotools/plat/proxy/__init__.py +0 -0
  186. {echotools-2.4.4 → echotools-2.4.6}/src/echotools/plat/proxy/manager.py +0 -0
  187. {echotools-2.4.4 → echotools-2.4.6}/src/echotools/plat/runtime/__init__.py +0 -0
  188. {echotools-2.4.4 → echotools-2.4.6}/src/echotools/plat/runtime/collector.py +0 -0
  189. {echotools-2.4.4 → echotools-2.4.6}/src/echotools/plat/scheduler/__init__.py +0 -0
  190. {echotools-2.4.4 → echotools-2.4.6}/src/echotools/plat/scheduler/scheduler.py +0 -0
  191. {echotools-2.4.4 → echotools-2.4.6}/src/echotools/plat/sdk/__init__.py +0 -0
  192. {echotools-2.4.4 → echotools-2.4.6}/src/echotools/plat/sdk/facade.py +0 -0
  193. {echotools-2.4.4 → echotools-2.4.6}/src/echotools/version.py +0 -0
  194. {echotools-2.4.4 → echotools-2.4.6}/src/echotools.egg-info/dependency_links.txt +0 -0
  195. {echotools-2.4.4 → echotools-2.4.6}/src/echotools.egg-info/requires.txt +0 -0
  196. {echotools-2.4.4 → echotools-2.4.6}/src/echotools.egg-info/top_level.txt +0 -0
  197. {echotools-2.4.4 → echotools-2.4.6}/src/tests/_check_parity.py +0 -0
  198. {echotools-2.4.4 → echotools-2.4.6}/src/tests/bench_import.py +0 -0
  199. {echotools-2.4.4 → echotools-2.4.6}/src/tests/conftest.py +0 -0
  200. {echotools-2.4.4 → echotools-2.4.6}/src/tests/fixtures/__init__.py +0 -0
  201. {echotools-2.4.4 → echotools-2.4.6}/src/tests/fixtures/entml_golden.py +0 -0
  202. {echotools-2.4.4 → echotools-2.4.6}/src/tests/fixtures/entml_golden_update.py +0 -0
  203. {echotools-2.4.4 → echotools-2.4.6}/src/tests/fixtures/simulated_fake_history_markup_responses.py +0 -0
  204. {echotools-2.4.4 → echotools-2.4.6}/src/tests/fixtures/simulated_fault_thinking_responses.py +0 -0
  205. {echotools-2.4.4 → echotools-2.4.6}/src/tests/fixtures/simulated_llm_tool_responses.py +0 -0
  206. {echotools-2.4.4 → echotools-2.4.6}/src/tests/test_adversarial_stream_splits.py +0 -0
  207. {echotools-2.4.4 → echotools-2.4.6}/src/tests/test_cache_retry.py +0 -0
  208. {echotools-2.4.4 → echotools-2.4.6}/src/tests/test_completion.py +0 -0
  209. {echotools-2.4.4 → echotools-2.4.6}/src/tests/test_config.py +0 -0
  210. {echotools-2.4.4 → echotools-2.4.6}/src/tests/test_config_extended.py +0 -0
  211. {echotools-2.4.4 → echotools-2.4.6}/src/tests/test_console.py +0 -0
  212. {echotools-2.4.4 → echotools-2.4.6}/src/tests/test_coverage_core.py +0 -0
  213. {echotools-2.4.4 → echotools-2.4.6}/src/tests/test_dispatch.py +0 -0
  214. {echotools-2.4.4 → echotools-2.4.6}/src/tests/test_dispatch_extended.py +0 -0
  215. {echotools-2.4.4 → echotools-2.4.6}/src/tests/test_dispatch_race.py +0 -0
  216. {echotools-2.4.4 → echotools-2.4.6}/src/tests/test_entml_agent_output_formats.py +0 -0
  217. {echotools-2.4.4 → echotools-2.4.6}/src/tests/test_entml_bare_invoke_format.py +0 -0
  218. {echotools-2.4.4 → echotools-2.4.6}/src/tests/test_entml_batch_stream_comprehensive.py +0 -0
  219. {echotools-2.4.4 → echotools-2.4.6}/src/tests/test_entml_golden.py +0 -0
  220. {echotools-2.4.4 → echotools-2.4.6}/src/tests/test_entml_invoke_known_tool_gate.py +0 -0
  221. {echotools-2.4.4 → echotools-2.4.6}/src/tests/test_entml_parser_comprehensive.py +0 -0
  222. {echotools-2.4.4 → echotools-2.4.6}/src/tests/test_entml_stream_json.py +0 -0
  223. {echotools-2.4.4 → echotools-2.4.6}/src/tests/test_entml_stream_json_exhaustive.py +0 -0
  224. {echotools-2.4.4 → echotools-2.4.6}/src/tests/test_entml_thinking_history.py +0 -0
  225. {echotools-2.4.4 → echotools-2.4.6}/src/tests/test_entml_thinking_parse.py +0 -0
  226. {echotools-2.4.4 → echotools-2.4.6}/src/tests/test_entml_tool_parse_leak.py +0 -0
  227. {echotools-2.4.4 → echotools-2.4.6}/src/tests/test_entml_tool_pipeline.py +0 -0
  228. {echotools-2.4.4 → echotools-2.4.6}/src/tests/test_entml_tools.py +0 -0
  229. {echotools-2.4.4 → echotools-2.4.6}/src/tests/test_errors.py +0 -0
  230. {echotools-2.4.4 → echotools-2.4.6}/src/tests/test_errors_common.py +0 -0
  231. {echotools-2.4.4 → echotools-2.4.6}/src/tests/test_events.py +0 -0
  232. {echotools-2.4.4 → echotools-2.4.6}/src/tests/test_events_event.py +0 -0
  233. {echotools-2.4.4 → echotools-2.4.6}/src/tests/test_facade.py +0 -0
  234. {echotools-2.4.4 → echotools-2.4.6}/src/tests/test_fake_history_markup_batch.py +0 -0
  235. {echotools-2.4.4 → echotools-2.4.6}/src/tests/test_fake_history_markup_invoke_preserve.py +0 -0
  236. {echotools-2.4.4 → echotools-2.4.6}/src/tests/test_fake_history_markup_reply_protect.py +0 -0
  237. {echotools-2.4.4 → echotools-2.4.6}/src/tests/test_fake_history_markup_stream.py +0 -0
  238. {echotools-2.4.4 → echotools-2.4.6}/src/tests/test_fault_thinking_close_batch.py +0 -0
  239. {echotools-2.4.4 → echotools-2.4.6}/src/tests/test_fault_thinking_close_stream.py +0 -0
  240. {echotools-2.4.4 → echotools-2.4.6}/src/tests/test_fncall.py +0 -0
  241. {echotools-2.4.4 → echotools-2.4.6}/src/tests/test_fncall_stream_thinking.py +0 -0
  242. {echotools-2.4.4 → echotools-2.4.6}/src/tests/test_history_markup_filter.py +0 -0
  243. {echotools-2.4.4 → echotools-2.4.6}/src/tests/test_imports.py +0 -0
  244. {echotools-2.4.4 → echotools-2.4.6}/src/tests/test_io.py +0 -0
  245. {echotools-2.4.4 → echotools-2.4.6}/src/tests/test_keys.py +0 -0
  246. {echotools-2.4.4 → echotools-2.4.6}/src/tests/test_lifecycle.py +0 -0
  247. {echotools-2.4.4 → echotools-2.4.6}/src/tests/test_logger.py +0 -0
  248. {echotools-2.4.4 → echotools-2.4.6}/src/tests/test_merge.py +0 -0
  249. {echotools-2.4.4 → echotools-2.4.6}/src/tests/test_model_branch_matrix.py +0 -0
  250. {echotools-2.4.4 → echotools-2.4.6}/src/tests/test_multiline_parameter_comprehensive.py +0 -0
  251. {echotools-2.4.4 → echotools-2.4.6}/src/tests/test_plugin.py +0 -0
  252. {echotools-2.4.4 → echotools-2.4.6}/src/tests/test_printstream.py +0 -0
  253. {echotools-2.4.4 → echotools-2.4.6}/src/tests/test_protocols.py +0 -0
  254. {echotools-2.4.4 → echotools-2.4.6}/src/tests/test_proxy.py +0 -0
  255. {echotools-2.4.4 → echotools-2.4.6}/src/tests/test_proxy_selector.py +0 -0
  256. {echotools-2.4.4 → echotools-2.4.6}/src/tests/test_runtime.py +0 -0
  257. {echotools-2.4.4 → echotools-2.4.6}/src/tests/test_scheduler.py +0 -0
  258. {echotools-2.4.4 → echotools-2.4.6}/src/tests/test_schema_validate.py +0 -0
  259. {echotools-2.4.4 → echotools-2.4.6}/src/tests/test_simulated_llm_tool_parse.py +0 -0
  260. {echotools-2.4.4 → echotools-2.4.6}/src/tests/test_stream_partial_json_parity.py +0 -0
  261. {echotools-2.4.4 → echotools-2.4.6}/src/tests/test_stream_realtime_parse.py +0 -0
  262. {echotools-2.4.4 → echotools-2.4.6}/src/tests/test_tracing.py +0 -0
  263. {echotools-2.4.4 → echotools-2.4.6}/src/tests/test_ui_bridge.py +0 -0
  264. {echotools-2.4.4 → echotools-2.4.6}/src/tests/test_usage.py +0 -0
  265. {echotools-2.4.4 → echotools-2.4.6}/src/tests/test_web.py +0 -0
  266. {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.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.4**(详见 [CHANGELOG](docs/CHANGELOG.md))。
61
+ 完全项目无关,兼容 Python 3.8–3.14。当前版本:**2.4.6**(详见 [CHANGELOG](docs/CHANGELOG.md))。
62
62
 
63
63
  ## 安装
64
64
 
@@ -2,7 +2,7 @@
2
2
 
3
3
  通用基础设施 SDK:配置、日志、事件、调度、插件、调用链,以及 **entml** LLM 工具调用协议与终端 Console UI。
4
4
 
5
- 完全项目无关,兼容 Python 3.8–3.14。当前版本:**2.4.4**(详见 [CHANGELOG](docs/CHANGELOG.md))。
5
+ 完全项目无关,兼容 Python 3.8–3.14。当前版本:**2.4.6**(详见 [CHANGELOG](docs/CHANGELOG.md))。
6
6
 
7
7
  ## 安装
8
8
 
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "echotools"
7
- version = "2.4.4"
7
+ version = "2.4.6"
8
8
  description = "通用基础设施 SDK:配置、日志、事件、调度、插件、协议、调用链"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.8"
@@ -0,0 +1,7 @@
1
+ from __future__ import annotations
2
+
3
+ """ids 模块导出。"""
4
+
5
+ from echotools.base.ids.generator import gen_tool_id, short_id, span_id, trace_id, uuid7
6
+
7
+ __all__ = ["uuid7", "short_id", "trace_id", "span_id", "gen_tool_id"]
@@ -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: Your turn ends immediately at the closing tag of the last <entml:invoke> block you emit. Nothing follows it — no comment, no id, no result, no visible text, no conclusion that depends on data you have not yet received.
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
 
@@ -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.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.4**(详见 [CHANGELOG](docs/CHANGELOG.md))。
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"
@@ -1,7 +0,0 @@
1
- from __future__ import annotations
2
-
3
- """ids 模块导出。"""
4
-
5
- from echotools.base.ids.generator import short_id, span_id, trace_id, uuid7
6
-
7
- __all__ = ["uuid7", "short_id", "trace_id", "span_id"]
File without changes