sycommon-python-lib 0.2.5a16__tar.gz → 0.2.5a17__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 (291) hide show
  1. {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/PKG-INFO +1 -1
  2. {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/pyproject.toml +1 -1
  3. {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon/agent/summarization_utils.py +2 -0
  4. {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon/llm/llm_with_token_tracking.py +25 -0
  5. {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon/llm/usage_token.py +23 -0
  6. sycommon_python_lib-0.2.5a17/src/sycommon/tests/test_dynamic_max_tokens.py +372 -0
  7. {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon_python_lib.egg-info/PKG-INFO +1 -1
  8. {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon_python_lib.egg-info/SOURCES.txt +1 -0
  9. {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/README.md +0 -0
  10. {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/setup.cfg +0 -0
  11. {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/command/__init__.py +0 -0
  12. {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/command/cli.py +0 -0
  13. {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/command/core/__init__.py +0 -0
  14. {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/command/core/console.py +0 -0
  15. {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/command/core/models.py +0 -0
  16. {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/command/core/project.py +0 -0
  17. {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/command/core/utils.py +0 -0
  18. {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/command/templates/__init__.py +0 -0
  19. {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/command/templates/agent/README.md.tpl +0 -0
  20. {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/command/templates/agent/__init__.py +0 -0
  21. {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/command/templates/agent/agent/__init__.py.tpl +0 -0
  22. {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/command/templates/agent/agent/main_agent.py.tpl +0 -0
  23. {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/command/templates/agent/agent/nodes/__init__.py.tpl +0 -0
  24. {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/command/templates/agent/agent/nodes/example_node.py.tpl +0 -0
  25. {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/command/templates/agent/agent/states/__init__.py.tpl +0 -0
  26. {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/command/templates/agent/agent/states/agent_state.py.tpl +0 -0
  27. {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/command/templates/agent/api/__init__.py.tpl +0 -0
  28. {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/command/templates/agent/api/query.py.tpl +0 -0
  29. {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/command/templates/agent/api/sse/__init__.py.tpl +0 -0
  30. {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/command/templates/agent/api/sse/agent.py.tpl +0 -0
  31. {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/command/templates/agent/app.py.tpl +0 -0
  32. {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/command/templates/agent/client/__init__.py.tpl +0 -0
  33. {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/command/templates/agent/db/__init__.py.tpl +0 -0
  34. {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/command/templates/agent/db/model/__init__.py.tpl +0 -0
  35. {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/command/templates/agent/db/model/entity.py.tpl +0 -0
  36. {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/command/templates/agent/db/service.py.tpl +0 -0
  37. {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/command/templates/agent/model/__init__.py.tpl +0 -0
  38. {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/command/templates/agent/model/parse.py.tpl +0 -0
  39. {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/command/templates/agent/tools/__init__.py.tpl +0 -0
  40. {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/command/templates/agent/tools/mq.py.tpl +0 -0
  41. {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/command/templates/base/.env.tpl +0 -0
  42. {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/command/templates/base/.gitignore.tpl +0 -0
  43. {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/command/templates/base/Dockerfile.tpl +0 -0
  44. {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/command/templates/base/README.md.tpl +0 -0
  45. {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/command/templates/base/__init__.py +0 -0
  46. {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/command/templates/base/app.py.tpl +0 -0
  47. {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/command/templates/base/app.yaml.tpl +0 -0
  48. {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/command/templates/base/client/FileServiceClient.py.tpl +0 -0
  49. {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/command/templates/base/client/__init__.py.tpl +0 -0
  50. {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/command/templates/base/model/__init__.py.tpl +0 -0
  51. {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/command/templates/base/model/file_info.py.tpl +0 -0
  52. {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/command/templates/base/requirements.txt.tpl +0 -0
  53. {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/command/templates/cli/README.md.tpl +0 -0
  54. {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/command/templates/cli/__init__.py +0 -0
  55. {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/command/templates/cli/app.py.tpl +0 -0
  56. {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/command/templates/cli/commands/__init__.py.tpl +0 -0
  57. {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/command/templates/cli/commands/hello.py.tpl +0 -0
  58. {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/command/templates/cli/pyproject.toml.tpl +0 -0
  59. {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/command/templates/cli/tools/__init__.py.tpl +0 -0
  60. {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/command/templates/web/README.md.tpl +0 -0
  61. {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/command/templates/web/__init__.py +0 -0
  62. {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/command/templates/web/api/__init__.py.tpl +0 -0
  63. {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/command/templates/web/api/echo.py.tpl +0 -0
  64. {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/command/templates/web/api/sse/__init__.py.tpl +0 -0
  65. {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/command/templates/web/api/sse/echo.py.tpl +0 -0
  66. {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/command/templates/web/app.py.tpl +0 -0
  67. {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/command/templates/web/client/__init__.py.tpl +0 -0
  68. {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/command/templates/web/model/__init__.py.tpl +0 -0
  69. {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/command/templates/web/tools/__init__.py.tpl +0 -0
  70. {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/command/templates/web/tools/mq.py.tpl +0 -0
  71. {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/nexus/__init__.py +0 -0
  72. {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycli/__init__.py +0 -0
  73. {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycli/__main__.py +0 -0
  74. {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycli/agents/__init__.py +0 -0
  75. {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycli/agents/factory.py +0 -0
  76. {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycli/agents/prompts.py +0 -0
  77. {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycli/cdp/__init__.py +0 -0
  78. {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycli/cdp/browser.py +0 -0
  79. {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycli/cdp/capabilities/__init__.py +0 -0
  80. {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycli/cdp/capabilities/console.py +0 -0
  81. {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycli/cdp/capabilities/dom.py +0 -0
  82. {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycli/cdp/capabilities/network.py +0 -0
  83. {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycli/cdp/capabilities/page_errors.py +0 -0
  84. {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycli/cdp/capabilities/performance.py +0 -0
  85. {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycli/cdp/capabilities/screenshot.py +0 -0
  86. {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycli/cdp/client.py +0 -0
  87. {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycli/cdp/protocol.py +0 -0
  88. {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycli/cdp/repl.py +0 -0
  89. {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycli/cli.py +0 -0
  90. {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycli/commands/__init__.py +0 -0
  91. {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycli/commands/cdp_cmd.py +0 -0
  92. {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycli/commands/chat_cmd.py +0 -0
  93. {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycli/commands/create_cmd.py +0 -0
  94. {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycli/commands/evaluate_cmd.py +0 -0
  95. {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycli/commands/init_cmd.py +0 -0
  96. {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycli/commands/memory_cmd.py +0 -0
  97. {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycli/commands/resume_cmd.py +0 -0
  98. {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycli/commands/rollback_cmd.py +0 -0
  99. {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycli/commands/run_cmd.py +0 -0
  100. {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycli/core/__init__.py +0 -0
  101. {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycli/core/backend.py +0 -0
  102. {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycli/core/config.py +0 -0
  103. {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycli/core/display.py +0 -0
  104. {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycli/core/git_integration.py +0 -0
  105. {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycli/core/llm.py +0 -0
  106. {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycli/core/state.py +0 -0
  107. {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycli/evaluate/__init__.py +0 -0
  108. {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycli/evaluate/api_evaluator.py +0 -0
  109. {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycli/memory/__init__.py +0 -0
  110. {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycli/memory/compressor.py +0 -0
  111. {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycli/memory/full.py +0 -0
  112. {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycli/memory/hot.py +0 -0
  113. {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycli/memory/manager.py +0 -0
  114. {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycli/memory/warm.py +0 -0
  115. {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycli/mode/__init__.py +0 -0
  116. {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycli/mode/create.py +0 -0
  117. {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycli/mode/optimize.py +0 -0
  118. {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycli/models/__init__.py +0 -0
  119. {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycli/models/config_models.py +0 -0
  120. {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycli/rl/__init__.py +0 -0
  121. {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycli/rl/baseline_tests.py +0 -0
  122. {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycli/rl/checkpoint.py +0 -0
  123. {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycli/rl/convergence.py +0 -0
  124. {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycli/rl/diagnosis.py +0 -0
  125. {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycli/rl/engine.py +0 -0
  126. {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycli/rl/environment.py +0 -0
  127. {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycli/rl/experience.py +0 -0
  128. {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycli/rl/harness_prompts.py +0 -0
  129. {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycli/rl/history.py +0 -0
  130. {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycli/rl/optimization_logger.py +0 -0
  131. {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycli/rl/pre_validation.py +0 -0
  132. {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycli/rl/reward.py +0 -0
  133. {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycli/rl/strategy_bandit.py +0 -0
  134. {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycli/rl/strategy_generator.py +0 -0
  135. {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycli/rl/strategy_prompts.py +0 -0
  136. {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycli/skills/__init__.py +0 -0
  137. {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon/__init__.py +0 -0
  138. {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon/agent/__init__.py +0 -0
  139. {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon/agent/agent_manager.py +0 -0
  140. {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon/agent/chat_events.py +0 -0
  141. {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon/agent/deep_agent.py +0 -0
  142. {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon/agent/mcp/__init__.py +0 -0
  143. {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon/agent/mcp/models.py +0 -0
  144. {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon/agent/mcp/tool_loader.py +0 -0
  145. {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon/agent/multi_agent_team.py +0 -0
  146. {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon/agent/sandbox/__init__.py +0 -0
  147. {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon/agent/sandbox/file_ops.py +0 -0
  148. {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon/agent/sandbox/http_sandbox_backend.py +0 -0
  149. {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon/agent/sandbox/minio_sync.py +0 -0
  150. {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon/agent/sandbox/sandbox_pool.py +0 -0
  151. {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon/agent/sandbox/sandbox_recovery.py +0 -0
  152. {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon/agent/sandbox/session.py +0 -0
  153. {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon/auth/__init__.py +0 -0
  154. {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon/auth/ldap_service.py +0 -0
  155. {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon/auth/oa_cache.py +0 -0
  156. {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon/auth/oa_crypto.py +0 -0
  157. {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon/auth/oa_service.py +0 -0
  158. {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon/auth/wecom_ldap_service.py +0 -0
  159. {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon/config/Config.py +0 -0
  160. {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon/config/DatabaseConfig.py +0 -0
  161. {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon/config/ElasticsearchConfig.py +0 -0
  162. {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon/config/EmbeddingConfig.py +0 -0
  163. {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon/config/LLMConfig.py +0 -0
  164. {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon/config/LangfuseConfig.py +0 -0
  165. {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon/config/MQConfig.py +0 -0
  166. {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon/config/PgConfig.py +0 -0
  167. {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon/config/RedisConfig.py +0 -0
  168. {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon/config/RerankerConfig.py +0 -0
  169. {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon/config/SentryConfig.py +0 -0
  170. {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon/config/XxlJobConfig.py +0 -0
  171. {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon/config/__init__.py +0 -0
  172. {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon/database/async_base_db_service.py +0 -0
  173. {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon/database/async_database_service.py +0 -0
  174. {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon/database/base_db_service.py +0 -0
  175. {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon/database/database_service.py +0 -0
  176. {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon/database/elasticsearch_service.py +0 -0
  177. {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon/database/pg_checkpoint_service.py +0 -0
  178. {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon/database/redis_service.py +0 -0
  179. {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon/database/token_usage_db_service.py +0 -0
  180. {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon/health/__init__.py +0 -0
  181. {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon/health/health_check.py +0 -0
  182. {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon/health/metrics.py +0 -0
  183. {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon/health/ping.py +0 -0
  184. {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon/heartbeat_process/__init__.py +0 -0
  185. {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon/heartbeat_process/heartbeat_config.py +0 -0
  186. {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon/heartbeat_process/heartbeat_process_manager.py +0 -0
  187. {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon/heartbeat_process/heartbeat_process_worker.py +0 -0
  188. {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon/llm/__init__.py +0 -0
  189. {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon/llm/embedding.py +0 -0
  190. {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon/llm/get_llm.py +0 -0
  191. {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon/llm/llm_logger.py +0 -0
  192. {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon/llm/llm_tokens.py +0 -0
  193. {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon/llm/native_with_fallback_runnable.py +0 -0
  194. {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon/llm/output_fixing_runnable.py +0 -0
  195. {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon/llm/struct_token.py +0 -0
  196. {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon/llm/sy_langfuse.py +0 -0
  197. {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon/llm/tiktoken_cache/9b5ad71b2ce5302211f9c61530b329a4922fc6a4 +0 -0
  198. {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon/llm/tiktoken_cache/fb374d419588a4632f3f557e76b4b70aebbca790 +0 -0
  199. {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon/llm/token_usage_es_service.py +0 -0
  200. {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon/llm/token_usage_mysql_service.py +0 -0
  201. {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon/logging/__init__.py +0 -0
  202. {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon/logging/async_sql_logger.py +0 -0
  203. {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon/logging/kafka_log.py +0 -0
  204. {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon/logging/logger_levels.py +0 -0
  205. {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon/logging/logger_wrapper.py +0 -0
  206. {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon/logging/process_logger.py +0 -0
  207. {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon/logging/sql_logger.py +0 -0
  208. {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon/mcp_server/__init__.py +0 -0
  209. {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon/mcp_server/server.py +0 -0
  210. {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon/middleware/__init__.py +0 -0
  211. {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon/middleware/context.py +0 -0
  212. {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon/middleware/cors.py +0 -0
  213. {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon/middleware/docs.py +0 -0
  214. {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon/middleware/exception.py +0 -0
  215. {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon/middleware/middleware.py +0 -0
  216. {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon/middleware/monitor_memory.py +0 -0
  217. {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon/middleware/mq.py +0 -0
  218. {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon/middleware/sandbox.py +0 -0
  219. {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon/middleware/timeout.py +0 -0
  220. {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon/middleware/token_tracking.py +0 -0
  221. {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon/middleware/tool_result_truncation.py +0 -0
  222. {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon/middleware/traceid.py +0 -0
  223. {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon/models/__init__.py +0 -0
  224. {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon/models/base_http.py +0 -0
  225. {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon/models/log.py +0 -0
  226. {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon/models/mcp_server_config.py +0 -0
  227. {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon/models/mqlistener_config.py +0 -0
  228. {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon/models/mqmsg_model.py +0 -0
  229. {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon/models/mqsend_config.py +0 -0
  230. {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon/models/sandbox.py +0 -0
  231. {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon/models/sso_user.py +0 -0
  232. {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon/models/token_usage.py +0 -0
  233. {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon/models/token_usage_mysql.py +0 -0
  234. {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon/models/xxljob_handler_config.py +0 -0
  235. {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon/notice/__init__.py +0 -0
  236. {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon/notice/uvicorn_monitor.py +0 -0
  237. {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon/notice/wecom_message.py +0 -0
  238. {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon/rabbitmq/process_pool_consumer.py +0 -0
  239. {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon/rabbitmq/rabbitmq_client.py +0 -0
  240. {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon/rabbitmq/rabbitmq_pool.py +0 -0
  241. {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon/rabbitmq/rabbitmq_service.py +0 -0
  242. {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon/rabbitmq/rabbitmq_service_client_manager.py +0 -0
  243. {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon/rabbitmq/rabbitmq_service_connection_monitor.py +0 -0
  244. {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon/rabbitmq/rabbitmq_service_consumer_manager.py +0 -0
  245. {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon/rabbitmq/rabbitmq_service_core.py +0 -0
  246. {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon/rabbitmq/rabbitmq_service_producer_manager.py +0 -0
  247. {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon/sentry/__init__.py +0 -0
  248. {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon/sentry/sy_sentry.py +0 -0
  249. {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon/services.py +0 -0
  250. {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon/sse/__init__.py +0 -0
  251. {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon/sse/event.py +0 -0
  252. {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon/sse/sse.py +0 -0
  253. {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon/synacos/__init__.py +0 -0
  254. {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon/synacos/example.py +0 -0
  255. {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon/synacos/example2.py +0 -0
  256. {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon/synacos/feign.py +0 -0
  257. {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon/synacos/feign_client.py +0 -0
  258. {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon/synacos/nacos_client_base.py +0 -0
  259. {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon/synacos/nacos_config_manager.py +0 -0
  260. {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon/synacos/nacos_heartbeat_manager.py +0 -0
  261. {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon/synacos/nacos_service.py +0 -0
  262. {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon/synacos/nacos_service_discovery.py +0 -0
  263. {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon/synacos/nacos_service_registration.py +0 -0
  264. {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon/synacos/param.py +0 -0
  265. {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon/tests/deep_agent_server.py +0 -0
  266. {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon/tests/test_consumer_recovery.py +0 -0
  267. {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon/tests/test_deep_agent.py +0 -0
  268. {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon/tests/test_email.py +0 -0
  269. {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon/tests/test_encoding_cache.py +0 -0
  270. {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon/tests/test_mcp_server.py +0 -0
  271. {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon/tests/test_minimax_reasoning.py +0 -0
  272. {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon/tests/test_mq.py +0 -0
  273. {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon/tests/test_oa_login.py +0 -0
  274. {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon/tests/test_real_summarization.py +0 -0
  275. {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon/tests/test_summarization_config.py +0 -0
  276. {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon/tests/test_summarization_real.py +0 -0
  277. {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon/tools/__init__.py +0 -0
  278. {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon/tools/async_utils.py +0 -0
  279. {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon/tools/docs.py +0 -0
  280. {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon/tools/env.py +0 -0
  281. {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon/tools/merge_headers.py +0 -0
  282. {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon/tools/snowflake.py +0 -0
  283. {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon/tools/syemail.py +0 -0
  284. {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon/tools/timing.py +0 -0
  285. {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon/xxljob/__init__.py +0 -0
  286. {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon/xxljob/xxljob_service.py +0 -0
  287. {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon_python_lib.egg-info/dependency_links.txt +0 -0
  288. {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon_python_lib.egg-info/entry_points.txt +0 -0
  289. {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon_python_lib.egg-info/requires.txt +0 -0
  290. {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon_python_lib.egg-info/top_level.txt +0 -0
  291. {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/tests/test_sycli.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: sycommon-python-lib
3
- Version: 0.2.5a16
3
+ Version: 0.2.5a17
4
4
  Summary: Add your description here
5
5
  Requires-Python: >=3.11
6
6
  Description-Content-Type: text/markdown
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "sycommon-python-lib"
3
- version = "0.2.5a16"
3
+ version = "0.2.5a17"
4
4
  description = "Add your description here"
5
5
  readme = "README.md"
6
6
  requires-python = ">=3.11"
@@ -62,6 +62,7 @@ def _patched_compute_summarization_defaults(model):
62
62
 
63
63
  # 60% 触发(120K/200K):实测模型在 input≈137K 时开始退化,
64
64
  # 在 120K 触发压缩留 ~17K 安全余量给工具 schema 等未计入开销
65
+ # output 预算由 LLMWithTokenTracking._clamp_max_tokens 动态管理,不在此预留
65
66
  trigger = int(max_tokens * 0.60)
66
67
  keep = int(max_tokens * 0.10)
67
68
  return {
@@ -168,6 +169,7 @@ def build_summarization_middleware(
168
169
  except Exception:
169
170
  max_tokens = default_max_tokens
170
171
 
172
+ # output 预算由 LLMWithTokenTracking._clamp_max_tokens 动态管理,不在此预留
171
173
  trigger_tokens = int(max_tokens * trigger_fraction)
172
174
  keep_tokens = int(max_tokens * keep_fraction)
173
175
 
@@ -96,11 +96,35 @@ class LLMWithTokenTracking(BaseChatModel):
96
96
  from sycommon.logging.kafka_log import SYLogger
97
97
  SYLogger.warning(f"Token 使用量记录失败: {e}")
98
98
 
99
+ def _clamp_max_tokens(self, messages, **kwargs):
100
+ """动态调整 max_tokens,确保 input + max_output 不超过上下文窗口
101
+
102
+ 每次 LLM 调用前,估算当前 input tokens,
103
+ 将 max_tokens = min(配置的 maxOutputTokens, context_window - input - buffer)
104
+ """
105
+ if not self.llmConfig or not self.llmConfig.maxTokens:
106
+ return
107
+ max_output = getattr(self.llm, 'max_tokens', None)
108
+ if not max_output:
109
+ return
110
+
111
+ from langchain_core.messages.utils import count_tokens_approximately
112
+ try:
113
+ input_est = count_tokens_approximately(messages, chars_per_token=2.0)
114
+ except Exception:
115
+ return
116
+
117
+ buffer = 4096
118
+ available = self.llmConfig.maxTokens - input_est - buffer
119
+ dynamic_max = min(max_output, max(available, 1024))
120
+ self.llm.max_tokens = dynamic_max
121
+
99
122
  def _generate(self, messages, stop=None, run_manager=None, **kwargs):
100
123
  """
101
124
  同步生成 - 核心方法
102
125
  BaseChatModel 的 invoke/batch/stream 最终都会调用此方法
103
126
  """
127
+ self._clamp_max_tokens(messages, **kwargs)
104
128
  result = self.llm._generate(
105
129
  messages, stop=stop, run_manager=run_manager, **kwargs)
106
130
  return self._inject_token_usage(result, is_async=False)
@@ -110,6 +134,7 @@ class LLMWithTokenTracking(BaseChatModel):
110
134
  异步生成 - 核心方法
111
135
  BaseChatModel 的 ainvoke/abatch/astream 最终都会调用此方法
112
136
  """
137
+ self._clamp_max_tokens(messages, **kwargs)
113
138
  result = await self.llm._agenerate(messages, stop=stop, run_manager=run_manager, **kwargs)
114
139
  return self._inject_token_usage(result, is_async=True)
115
140
 
@@ -164,12 +164,35 @@ class LLMWithAutoTokenUsage(BaseChatModel):
164
164
  is_native_mode=False
165
165
  )
166
166
 
167
+ # ========== 动态 max_tokens 管理 ==========
168
+
169
+ def _clamp_max_tokens(self, messages, **kwargs):
170
+ """动态调整 max_tokens,确保 input + max_output 不超过上下文窗口"""
171
+ if not self.llmConfig or not self.llmConfig.maxTokens:
172
+ return
173
+ max_output = getattr(self.llm, 'max_tokens', None)
174
+ if not max_output:
175
+ return
176
+
177
+ from langchain_core.messages.utils import count_tokens_approximately
178
+ try:
179
+ input_est = count_tokens_approximately(messages, chars_per_token=2.0)
180
+ except Exception:
181
+ return
182
+
183
+ buffer = 4096
184
+ available = self.llmConfig.maxTokens - input_est - buffer
185
+ dynamic_max = min(max_output, max(available, 1024))
186
+ self.llm.max_tokens = dynamic_max
187
+
167
188
  # ========== 实现BaseChatModel抽象方法 ==========
168
189
  def _generate(self, messages, stop=None, run_manager=None, **kwargs):
190
+ self._clamp_max_tokens(messages, **kwargs)
169
191
  return self.llm._generate(messages, stop=stop, run_manager=run_manager, **kwargs)
170
192
 
171
193
  async def _agenerate(self, messages, stop=None, run_manager=None, **kwargs):
172
194
  """异步生成 - 委托给底层 LLM"""
195
+ self._clamp_max_tokens(messages, **kwargs)
173
196
  return await self.llm._agenerate(messages, stop=stop, run_manager=run_manager, **kwargs)
174
197
 
175
198
  def _stream(self, messages, stop=None, run_manager=None, **kwargs):
@@ -0,0 +1,372 @@
1
+ """
2
+ 测试动态 max_tokens 调整机制
3
+
4
+ 验证 LLMWithTokenTracking 和 LLMWithAutoTokenUsage 的 _clamp_max_tokens 逻辑:
5
+ - 每次 LLM 调用前动态计算 max_tokens = min(配置值, context_window - input - buffer)
6
+ - 确保 input + max_output 永远不超过模型上下文窗口
7
+
8
+ 同时验证通过 create_deep_agent 创建的 agent 能正常应用动态计算规则。
9
+ """
10
+
11
+ import asyncio
12
+ import sys
13
+ import os
14
+ import pytest
15
+
16
+ # 添加项目路径
17
+ sys.path.insert(0, os.path.join(os.path.dirname(__file__), ".."))
18
+
19
+ from unittest.mock import MagicMock, patch, AsyncMock
20
+ from langchain_core.messages import HumanMessage, AIMessage, SystemMessage
21
+ from langchain_core.language_models import BaseChatModel
22
+ from langchain_core.outputs import ChatResult, ChatGeneration
23
+
24
+ from sycommon.config.LLMConfig import LLMConfig
25
+ from sycommon.llm.llm_with_token_tracking import LLMWithTokenTracking
26
+ from sycommon.llm.usage_token import LLMWithAutoTokenUsage
27
+
28
+
29
+ def _make_llm_config(max_tokens=196608, max_output=128000):
30
+ return LLMConfig(
31
+ model="glm-5.1",
32
+ provider="openai",
33
+ baseUrl="http://10.10.6.132:3000/v1",
34
+ apiKey="sk-test",
35
+ maxTokens=max_tokens,
36
+ vision=False,
37
+ callFunction=True,
38
+ maxOutputTokens=max_output,
39
+ )
40
+
41
+
42
+ class MockChatModel(BaseChatModel):
43
+ """最小 mock,满足 pydantic 校验"""
44
+ max_tokens: int = 128000
45
+
46
+ @property
47
+ def _llm_type(self) -> str:
48
+ return "mock"
49
+
50
+ def _generate(self, messages, stop=None, run_manager=None, **kwargs):
51
+ return ChatResult(generations=[ChatGeneration(message=AIMessage(content="ok"))])
52
+
53
+ async def _agenerate(self, messages, stop=None, run_manager=None, **kwargs):
54
+ return ChatResult(generations=[ChatGeneration(message=AIMessage(content="ok"))])
55
+
56
+
57
+ def _make_long_messages(target_chars):
58
+ """生成指定字符数的消息列表(模拟大 input)"""
59
+ msg = "这是一段测试文本。" * (target_chars // 8)
60
+ return [
61
+ SystemMessage(content="你是一个智能助手"),
62
+ HumanMessage(content="你好"),
63
+ AIMessage(content=msg),
64
+ HumanMessage(content="请回答我"),
65
+ ]
66
+
67
+
68
+ # ============== LLMWithTokenTracking 测试 ==============
69
+
70
+
71
+ class TestLLMWithTokenTrackingClamp:
72
+ """测试 LLMWithTokenTracking._clamp_max_tokens"""
73
+
74
+ def test_small_input_keeps_max_output(self):
75
+ """input 小时,max_tokens 保持配置的 maxOutputTokens"""
76
+ llm = MockChatModel(max_tokens=128000)
77
+ config = _make_llm_config(max_tokens=196608, max_output=128000)
78
+ wrapper = LLMWithTokenTracking(llm=llm, llmConfig=config)
79
+
80
+ messages = [HumanMessage(content="你好")]
81
+ wrapper._clamp_max_tokens(messages)
82
+
83
+ # input 很小,available = 196608 - ~2 - 4096 ≈ 192510,min(128000, 192510) = 128000
84
+ assert llm.max_tokens == 128000
85
+
86
+ def test_large_input_reduces_max_output(self):
87
+ """input 大时,max_tokens 自动缩小"""
88
+ llm = MockChatModel(max_tokens=128000)
89
+ config = _make_llm_config(max_tokens=196608, max_output=128000)
90
+ wrapper = LLMWithTokenTracking(llm=llm, llmConfig=config)
91
+
92
+ # 模拟 ~100K 字符 ≈ ~50K tokens 的 input
93
+ messages = _make_long_messages(100000)
94
+ wrapper._clamp_max_tokens(messages)
95
+
96
+ # available = 196608 - ~50K - 4096 ≈ 142K, min(128000, 142K) = 128000
97
+ assert llm.max_tokens == 128000
98
+
99
+ def test_near_limit_input_clamps_hard(self):
100
+ """input 接近上限时,max_tokens 被大幅压缩"""
101
+ llm = MockChatModel(max_tokens=128000)
102
+ config = _make_llm_config(max_tokens=196608, max_output=128000)
103
+ wrapper = LLMWithTokenTracking(llm=llm, llmConfig=config)
104
+
105
+ # 模拟 ~160K 字符 ≈ ~80K tokens 的 input
106
+ messages = _make_long_messages(160000)
107
+ wrapper._clamp_max_tokens(messages)
108
+
109
+ # available = 196608 - ~80K - 4096 ≈ 112K, min(128000, 112K) = ~112K
110
+ assert llm.max_tokens < 128000
111
+ assert llm.max_tokens > 1024 # 至少保留 1024
112
+
113
+ def test_extremely_large_input_floors_at_1024(self):
114
+ """input 超过上限时,max_tokens 至少保留 1024"""
115
+ llm = MockChatModel(max_tokens=128000)
116
+ config = _make_llm_config(max_tokens=196608, max_output=128000)
117
+ wrapper = LLMWithTokenTracking(llm=llm, llmConfig=config)
118
+
119
+ # 模拟 ~400K 字符 ≈ ~200K tokens 的 input(超过上下文窗口)
120
+ messages = _make_long_messages(400000)
121
+ wrapper._clamp_max_tokens(messages)
122
+
123
+ assert llm.max_tokens == 1024
124
+
125
+ def test_no_max_output_configured_skips(self):
126
+ """没有配置 maxOutputTokens 时跳过调整"""
127
+ llm = MockChatModel(max_tokens=0)
128
+ config = _make_llm_config(max_tokens=196608, max_output=0)
129
+ wrapper = LLMWithTokenTracking(llm=llm, llmConfig=config)
130
+
131
+ original_max = llm.max_tokens
132
+ messages = [HumanMessage(content="你好")]
133
+ wrapper._clamp_max_tokens(messages)
134
+
135
+ assert llm.max_tokens == original_max
136
+
137
+ def test_generate_calls_clamp(self):
138
+ """_generate 调用前会触发 _clamp_max_tokens"""
139
+ llm = MockChatModel(max_tokens=128000)
140
+ config = _make_llm_config(max_tokens=196608, max_output=128000)
141
+ wrapper = LLMWithTokenTracking(llm=llm, llmConfig=config)
142
+
143
+ wrapper._generate([HumanMessage(content="测试")])
144
+
145
+ # _clamp_max_tokens 被调用,llm.max_tokens 可能被修改
146
+ # 关键是没抛异常
147
+ assert llm.max_tokens > 0
148
+
149
+
150
+ # ============== LLMWithAutoTokenUsage 测试 ==============
151
+
152
+
153
+ class TestLLMWithAutoTokenUsageClamp:
154
+ """测试 LLMWithAutoTokenUsage._clamp_max_tokens"""
155
+
156
+ def test_small_input_keeps_max_output(self):
157
+ llm = MockChatModel(max_tokens=128000)
158
+ config = _make_llm_config(max_tokens=196608, max_output=128000)
159
+ wrapper = LLMWithAutoTokenUsage(llm=llm, langfuse=None, llmConfig=config, summary_prompt=None)
160
+
161
+ messages = [HumanMessage(content="你好")]
162
+ wrapper._clamp_max_tokens(messages)
163
+
164
+ assert llm.max_tokens == 128000
165
+
166
+ def test_large_input_reduces_max_output(self):
167
+ llm = MockChatModel(max_tokens=128000)
168
+ config = _make_llm_config(max_tokens=196608, max_output=128000)
169
+ wrapper = LLMWithAutoTokenUsage(llm=llm, langfuse=None, llmConfig=config, summary_prompt=None)
170
+
171
+ messages = _make_long_messages(160000)
172
+ wrapper._clamp_max_tokens(messages)
173
+
174
+ assert llm.max_tokens < 128000
175
+ assert llm.max_tokens > 1024
176
+
177
+ def test_agenerate_calls_clamp(self):
178
+ llm = MockChatModel(max_tokens=128000)
179
+ config = _make_llm_config(max_tokens=196608, max_output=128000)
180
+ wrapper = LLMWithAutoTokenUsage(llm=llm, langfuse=None, llmConfig=config, summary_prompt=None)
181
+
182
+ asyncio.get_event_loop().run_until_complete(
183
+ wrapper._agenerate([HumanMessage(content="测试")])
184
+ )
185
+
186
+ assert llm.max_tokens > 0
187
+
188
+
189
+ # ============== create_deep_agent 集成测试 ==============
190
+
191
+
192
+ @pytest.mark.asyncio
193
+ async def test_deep_agent_dynamic_max_tokens():
194
+ """验证通过 create_deep_agent 创建的 agent 走 get_llm -> LLMWithTokenTracking 路径
195
+
196
+ 模拟场景:多轮对话后 input 累积到接近上下文窗口上限,
197
+ 验证 _clamp_max_tokens 能正确缩小 max_tokens,避免 400 报错。
198
+ """
199
+ from langchain.chat_models import init_chat_model
200
+
201
+ # 用真实 API 创建 model(和 create_deep_agent 内部一致)
202
+ model = init_chat_model(
203
+ model="glm-5.1",
204
+ model_provider="openai",
205
+ streaming=False,
206
+ base_url="http://10.10.6.132:3000/v1",
207
+ api_key="sk-3hXhO7uCG5CRi7t3THE2cWTKVJqesXJ38cKstHZhDVXHQOIn",
208
+ temperature=0.7,
209
+ max_tokens=128000,
210
+ )
211
+
212
+ # 包装为 LLMWithTokenTracking(和 get_llm(wrap_structured=False) 一致)
213
+ config = _make_llm_config(max_tokens=196608, max_output=128000)
214
+ wrapper = LLMWithTokenTracking(llm=model, llmConfig=config)
215
+
216
+ # 第一轮:小 input,max_tokens 应保持 128000
217
+ messages_1 = [
218
+ SystemMessage(content="你是智能助手"),
219
+ HumanMessage(content="你好,简单回答即可"),
220
+ ]
221
+ wrapper._clamp_max_tokens(messages_1)
222
+ max_tokens_1 = model.max_tokens
223
+ print(f"[轮次1] input 小, max_tokens = {max_tokens_1}")
224
+ assert max_tokens_1 == 128000, f"小 input 时 max_tokens 应保持 128000,实际 {max_tokens_1}"
225
+
226
+ # 第二轮:中等 input
227
+ messages_2 = messages_1 + [
228
+ AIMessage(content="你好!有什么可以帮助你的吗?"),
229
+ HumanMessage(content="请帮我写一首很长的诗"),
230
+ ]
231
+ wrapper._clamp_max_tokens(messages_2)
232
+ max_tokens_2 = model.max_tokens
233
+ print(f"[轮次2] input 中等, max_tokens = {max_tokens_2}")
234
+ assert max_tokens_2 == 128000, f"中等 input 时 max_tokens 应保持 128000,实际 {max_tokens_2}"
235
+
236
+ # 第三轮:模拟大 input(~200K 字符 ≈ 100K tokens,超过 context - max_output = 68K)
237
+ big_content = "这是一段很长的对话历史。" * 17000
238
+ messages_3 = messages_2 + [
239
+ AIMessage(content=big_content),
240
+ HumanMessage(content="请总结上面的内容"),
241
+ ]
242
+ wrapper._clamp_max_tokens(messages_3)
243
+ max_tokens_3 = model.max_tokens
244
+ print(f"[轮次3] input 大(~60K tokens), max_tokens = {max_tokens_3}")
245
+ assert max_tokens_3 < 128000, f"大 input 时 max_tokens 应缩小,实际 {max_tokens_3}"
246
+ assert max_tokens_3 > 1024, f"max_tokens 不应低于 1024,实际 {max_tokens_3}"
247
+
248
+ # 验证 input + max_tokens 不会超过 context window
249
+ from langchain_core.messages.utils import count_tokens_approximately
250
+ input_tokens = count_tokens_approximately(messages_3, chars_per_token=2.0)
251
+ total = input_tokens + max_tokens_3 + 4096
252
+ print(f"[轮次3] input_tokens ≈ {input_tokens}, max_output = {max_tokens_3}, total = {total}")
253
+ assert total <= 196608, f"input + max_output + buffer 不应超过 196608,实际 {total}"
254
+
255
+ print("\n所有本地计算测试通过!")
256
+
257
+
258
+ @pytest.mark.asyncio
259
+ async def test_real_api_small_input():
260
+ """真实 API 测试:小 input,正常调用不报错"""
261
+ from langchain.chat_models import init_chat_model
262
+
263
+ model = init_chat_model(
264
+ model="glm-5.1",
265
+ model_provider="openai",
266
+ streaming=False,
267
+ base_url="http://10.10.6.132:3000/v1",
268
+ api_key="sk-3hXhO7uCG5CRi7t3THE2cWTKVJqesXJ38cKstHZhDVXHQOIn",
269
+ temperature=0.7,
270
+ max_tokens=128000,
271
+ )
272
+ config = _make_llm_config(max_tokens=196608, max_output=128000)
273
+ wrapper = LLMWithTokenTracking(llm=model, llmConfig=config)
274
+
275
+ messages = [
276
+ SystemMessage(content="你是智能助手,用一句话回答"),
277
+ HumanMessage(content="1+1等于几?"),
278
+ ]
279
+ wrapper._clamp_max_tokens(messages)
280
+ print(f"[真实API-小input] max_tokens={model.max_tokens}")
281
+
282
+ result = await wrapper._agenerate(messages)
283
+ content = result.generations[0].message.content
284
+ print(f"[真实API-小input] 回复: {content}")
285
+ assert content, "小 input 应该正常返回"
286
+ assert model.max_tokens == 128000, "小 input 时 max_tokens 应保持 128000"
287
+
288
+
289
+ @pytest.mark.asyncio
290
+ async def test_real_api_large_input():
291
+ """真实 API 测试:大 input,动态缩小 max_tokens 后不 400"""
292
+ from langchain.chat_models import init_chat_model
293
+ from langchain_core.messages.utils import count_tokens_approximately
294
+
295
+ model = init_chat_model(
296
+ model="glm-5.1",
297
+ model_provider="openai",
298
+ streaming=False,
299
+ base_url="http://10.10.6.132:3000/v1",
300
+ api_key="sk-3hXhO7uCG5CRi7t3THE2cWTKVJqesXJ38cKstHZhDVXHQOIn",
301
+ temperature=0.7,
302
+ max_tokens=128000,
303
+ )
304
+ config = _make_llm_config(max_tokens=196608, max_output=128000)
305
+ wrapper = LLMWithTokenTracking(llm=model, llmConfig=config)
306
+
307
+ # 构造 ~100K tokens 的 input
308
+ big_content = "这是一段很长的对话历史。" * 17000
309
+ messages = [
310
+ SystemMessage(content="你是智能助手,用一句话回答"),
311
+ HumanMessage(content="你好"),
312
+ AIMessage(content=big_content),
313
+ HumanMessage(content="请用一句话总结上面的内容"),
314
+ ]
315
+
316
+ input_tokens = count_tokens_approximately(messages, chars_per_token=2.0)
317
+ print(f"[真实API-大input] input_tokens ≈ {input_tokens}")
318
+
319
+ wrapper._clamp_max_tokens(messages)
320
+ print(f"[真实API-大input] clamp后 max_tokens={model.max_tokens}")
321
+ assert model.max_tokens < 128000, f"大 input 时 max_tokens 应缩小,实际 {model.max_tokens}"
322
+
323
+ total = input_tokens + model.max_tokens + 4096
324
+ print(f"[真实API-大input] total = {input_tokens} + {model.max_tokens} + 4096 = {total}")
325
+ assert total <= 196608
326
+
327
+ result = await wrapper._agenerate(messages)
328
+ content = result.generations[0].message.content
329
+ print(f"[真实API-大input] 回复: {content[:100]}")
330
+ assert content, "大 input + 动态 max_tokens 应该正常返回,不应 400"
331
+
332
+
333
+ @pytest.mark.asyncio
334
+ async def test_real_api_without_clamp_would_fail():
335
+ """对比测试:同样的大 input,不用 _clamp_max_tokens 会 400 报错"""
336
+ from langchain.chat_models import init_chat_model
337
+ from openai import BadRequestError
338
+
339
+ model = init_chat_model(
340
+ model="glm-5.1",
341
+ model_provider="openai",
342
+ streaming=False,
343
+ base_url="http://10.10.6.132:3000/v1",
344
+ api_key="sk-3hXhO7uCG5CRi7t3THE2cWTKVJqesXJ38cKstHZhDVXHQOIn",
345
+ temperature=0.7,
346
+ max_tokens=128000,
347
+ )
348
+ # 不用 wrapper,直接裸调
349
+ big_content = "这是一段很长的对话历史。" * 17000
350
+ messages = [
351
+ SystemMessage(content="你是智能助手"),
352
+ HumanMessage(content="你好"),
353
+ AIMessage(content=big_content),
354
+ HumanMessage(content="总结一下"),
355
+ ]
356
+
357
+ try:
358
+ await model._agenerate(messages)
359
+ print("[对比测试] 未预期地成功了,可能模型上下文足够大或估算偏保守")
360
+ except (BadRequestError, Exception) as e:
361
+ error_msg = str(e)
362
+ print(f"[对比测试] 不 clamp 时果然报错: {error_msg[:200]}")
363
+ assert "400" in error_msg or "context length" in error_msg.lower() or "token" in error_msg.lower(), \
364
+ f"期望是 400 token 超限错误,实际: {error_msg[:200]}"
365
+
366
+
367
+ if __name__ == "__main__":
368
+ print("===== 单元测试 =====")
369
+ pytest.main([__file__, "-v", "-x", "-k", "not test_real_api"])
370
+
371
+ print("\n===== 真实 API 测试 =====")
372
+ pytest.main([__file__, "-v", "-s", "-k", "test_real_api"])
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: sycommon-python-lib
3
- Version: 0.2.5a16
3
+ Version: 0.2.5a17
4
4
  Summary: Add your description here
5
5
  Requires-Python: >=3.11
6
6
  Description-Content-Type: text/markdown
@@ -260,6 +260,7 @@ src/sycommon/synacos/param.py
260
260
  src/sycommon/tests/deep_agent_server.py
261
261
  src/sycommon/tests/test_consumer_recovery.py
262
262
  src/sycommon/tests/test_deep_agent.py
263
+ src/sycommon/tests/test_dynamic_max_tokens.py
263
264
  src/sycommon/tests/test_email.py
264
265
  src/sycommon/tests/test_encoding_cache.py
265
266
  src/sycommon/tests/test_mcp_server.py