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.
- {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/PKG-INFO +1 -1
- {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/pyproject.toml +1 -1
- {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon/agent/summarization_utils.py +2 -0
- {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon/llm/llm_with_token_tracking.py +25 -0
- {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon/llm/usage_token.py +23 -0
- sycommon_python_lib-0.2.5a17/src/sycommon/tests/test_dynamic_max_tokens.py +372 -0
- {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon_python_lib.egg-info/PKG-INFO +1 -1
- {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon_python_lib.egg-info/SOURCES.txt +1 -0
- {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/README.md +0 -0
- {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/setup.cfg +0 -0
- {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/command/__init__.py +0 -0
- {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/command/cli.py +0 -0
- {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/command/core/__init__.py +0 -0
- {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/command/core/console.py +0 -0
- {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/command/core/models.py +0 -0
- {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/command/core/project.py +0 -0
- {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/command/core/utils.py +0 -0
- {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/command/templates/__init__.py +0 -0
- {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/command/templates/agent/README.md.tpl +0 -0
- {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/command/templates/agent/__init__.py +0 -0
- {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/command/templates/agent/agent/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/command/templates/agent/agent/main_agent.py.tpl +0 -0
- {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/command/templates/agent/agent/nodes/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/command/templates/agent/agent/nodes/example_node.py.tpl +0 -0
- {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/command/templates/agent/agent/states/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/command/templates/agent/agent/states/agent_state.py.tpl +0 -0
- {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/command/templates/agent/api/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/command/templates/agent/api/query.py.tpl +0 -0
- {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/command/templates/agent/api/sse/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/command/templates/agent/api/sse/agent.py.tpl +0 -0
- {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/command/templates/agent/app.py.tpl +0 -0
- {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/command/templates/agent/client/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/command/templates/agent/db/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/command/templates/agent/db/model/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/command/templates/agent/db/model/entity.py.tpl +0 -0
- {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/command/templates/agent/db/service.py.tpl +0 -0
- {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/command/templates/agent/model/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/command/templates/agent/model/parse.py.tpl +0 -0
- {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/command/templates/agent/tools/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/command/templates/agent/tools/mq.py.tpl +0 -0
- {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/command/templates/base/.env.tpl +0 -0
- {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/command/templates/base/.gitignore.tpl +0 -0
- {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/command/templates/base/Dockerfile.tpl +0 -0
- {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/command/templates/base/README.md.tpl +0 -0
- {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/command/templates/base/__init__.py +0 -0
- {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/command/templates/base/app.py.tpl +0 -0
- {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/command/templates/base/app.yaml.tpl +0 -0
- {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/command/templates/base/client/FileServiceClient.py.tpl +0 -0
- {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/command/templates/base/client/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/command/templates/base/model/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/command/templates/base/model/file_info.py.tpl +0 -0
- {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/command/templates/base/requirements.txt.tpl +0 -0
- {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/command/templates/cli/README.md.tpl +0 -0
- {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/command/templates/cli/__init__.py +0 -0
- {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/command/templates/cli/app.py.tpl +0 -0
- {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/command/templates/cli/commands/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/command/templates/cli/commands/hello.py.tpl +0 -0
- {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/command/templates/cli/pyproject.toml.tpl +0 -0
- {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/command/templates/cli/tools/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/command/templates/web/README.md.tpl +0 -0
- {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/command/templates/web/__init__.py +0 -0
- {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/command/templates/web/api/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/command/templates/web/api/echo.py.tpl +0 -0
- {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/command/templates/web/api/sse/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/command/templates/web/api/sse/echo.py.tpl +0 -0
- {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/command/templates/web/app.py.tpl +0 -0
- {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/command/templates/web/client/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/command/templates/web/model/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/command/templates/web/tools/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/command/templates/web/tools/mq.py.tpl +0 -0
- {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/nexus/__init__.py +0 -0
- {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycli/__init__.py +0 -0
- {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycli/__main__.py +0 -0
- {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycli/agents/__init__.py +0 -0
- {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycli/agents/factory.py +0 -0
- {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycli/agents/prompts.py +0 -0
- {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycli/cdp/__init__.py +0 -0
- {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycli/cdp/browser.py +0 -0
- {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycli/cdp/capabilities/__init__.py +0 -0
- {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycli/cdp/capabilities/console.py +0 -0
- {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycli/cdp/capabilities/dom.py +0 -0
- {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycli/cdp/capabilities/network.py +0 -0
- {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycli/cdp/capabilities/page_errors.py +0 -0
- {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycli/cdp/capabilities/performance.py +0 -0
- {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycli/cdp/capabilities/screenshot.py +0 -0
- {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycli/cdp/client.py +0 -0
- {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycli/cdp/protocol.py +0 -0
- {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycli/cdp/repl.py +0 -0
- {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycli/cli.py +0 -0
- {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycli/commands/__init__.py +0 -0
- {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycli/commands/cdp_cmd.py +0 -0
- {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycli/commands/chat_cmd.py +0 -0
- {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycli/commands/create_cmd.py +0 -0
- {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycli/commands/evaluate_cmd.py +0 -0
- {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycli/commands/init_cmd.py +0 -0
- {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycli/commands/memory_cmd.py +0 -0
- {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycli/commands/resume_cmd.py +0 -0
- {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycli/commands/rollback_cmd.py +0 -0
- {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycli/commands/run_cmd.py +0 -0
- {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycli/core/__init__.py +0 -0
- {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycli/core/backend.py +0 -0
- {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycli/core/config.py +0 -0
- {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycli/core/display.py +0 -0
- {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycli/core/git_integration.py +0 -0
- {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycli/core/llm.py +0 -0
- {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycli/core/state.py +0 -0
- {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycli/evaluate/__init__.py +0 -0
- {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycli/evaluate/api_evaluator.py +0 -0
- {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycli/memory/__init__.py +0 -0
- {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycli/memory/compressor.py +0 -0
- {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycli/memory/full.py +0 -0
- {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycli/memory/hot.py +0 -0
- {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycli/memory/manager.py +0 -0
- {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycli/memory/warm.py +0 -0
- {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycli/mode/__init__.py +0 -0
- {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycli/mode/create.py +0 -0
- {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycli/mode/optimize.py +0 -0
- {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycli/models/__init__.py +0 -0
- {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycli/models/config_models.py +0 -0
- {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycli/rl/__init__.py +0 -0
- {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycli/rl/baseline_tests.py +0 -0
- {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycli/rl/checkpoint.py +0 -0
- {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycli/rl/convergence.py +0 -0
- {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycli/rl/diagnosis.py +0 -0
- {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycli/rl/engine.py +0 -0
- {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycli/rl/environment.py +0 -0
- {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycli/rl/experience.py +0 -0
- {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycli/rl/harness_prompts.py +0 -0
- {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycli/rl/history.py +0 -0
- {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycli/rl/optimization_logger.py +0 -0
- {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycli/rl/pre_validation.py +0 -0
- {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycli/rl/reward.py +0 -0
- {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycli/rl/strategy_bandit.py +0 -0
- {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycli/rl/strategy_generator.py +0 -0
- {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycli/rl/strategy_prompts.py +0 -0
- {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycli/skills/__init__.py +0 -0
- {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon/__init__.py +0 -0
- {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon/agent/__init__.py +0 -0
- {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon/agent/agent_manager.py +0 -0
- {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon/agent/chat_events.py +0 -0
- {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon/agent/deep_agent.py +0 -0
- {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon/agent/mcp/__init__.py +0 -0
- {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon/agent/mcp/models.py +0 -0
- {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon/agent/mcp/tool_loader.py +0 -0
- {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon/agent/multi_agent_team.py +0 -0
- {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon/agent/sandbox/__init__.py +0 -0
- {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon/agent/sandbox/file_ops.py +0 -0
- {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon/agent/sandbox/http_sandbox_backend.py +0 -0
- {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon/agent/sandbox/minio_sync.py +0 -0
- {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon/agent/sandbox/sandbox_pool.py +0 -0
- {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon/agent/sandbox/sandbox_recovery.py +0 -0
- {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon/agent/sandbox/session.py +0 -0
- {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon/auth/__init__.py +0 -0
- {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon/auth/ldap_service.py +0 -0
- {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon/auth/oa_cache.py +0 -0
- {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon/auth/oa_crypto.py +0 -0
- {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon/auth/oa_service.py +0 -0
- {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon/auth/wecom_ldap_service.py +0 -0
- {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon/config/Config.py +0 -0
- {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon/config/DatabaseConfig.py +0 -0
- {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon/config/ElasticsearchConfig.py +0 -0
- {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon/config/EmbeddingConfig.py +0 -0
- {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon/config/LLMConfig.py +0 -0
- {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon/config/LangfuseConfig.py +0 -0
- {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon/config/MQConfig.py +0 -0
- {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon/config/PgConfig.py +0 -0
- {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon/config/RedisConfig.py +0 -0
- {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon/config/RerankerConfig.py +0 -0
- {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon/config/SentryConfig.py +0 -0
- {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon/config/XxlJobConfig.py +0 -0
- {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon/config/__init__.py +0 -0
- {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon/database/async_base_db_service.py +0 -0
- {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon/database/async_database_service.py +0 -0
- {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon/database/base_db_service.py +0 -0
- {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon/database/database_service.py +0 -0
- {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon/database/elasticsearch_service.py +0 -0
- {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon/database/pg_checkpoint_service.py +0 -0
- {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon/database/redis_service.py +0 -0
- {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon/database/token_usage_db_service.py +0 -0
- {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon/health/__init__.py +0 -0
- {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon/health/health_check.py +0 -0
- {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon/health/metrics.py +0 -0
- {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon/health/ping.py +0 -0
- {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon/heartbeat_process/__init__.py +0 -0
- {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon/heartbeat_process/heartbeat_config.py +0 -0
- {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon/heartbeat_process/heartbeat_process_manager.py +0 -0
- {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon/heartbeat_process/heartbeat_process_worker.py +0 -0
- {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon/llm/__init__.py +0 -0
- {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon/llm/embedding.py +0 -0
- {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon/llm/get_llm.py +0 -0
- {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon/llm/llm_logger.py +0 -0
- {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon/llm/llm_tokens.py +0 -0
- {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon/llm/native_with_fallback_runnable.py +0 -0
- {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon/llm/output_fixing_runnable.py +0 -0
- {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon/llm/struct_token.py +0 -0
- {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon/llm/sy_langfuse.py +0 -0
- {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon/llm/tiktoken_cache/9b5ad71b2ce5302211f9c61530b329a4922fc6a4 +0 -0
- {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon/llm/tiktoken_cache/fb374d419588a4632f3f557e76b4b70aebbca790 +0 -0
- {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon/llm/token_usage_es_service.py +0 -0
- {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon/llm/token_usage_mysql_service.py +0 -0
- {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon/logging/__init__.py +0 -0
- {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon/logging/async_sql_logger.py +0 -0
- {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon/logging/kafka_log.py +0 -0
- {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon/logging/logger_levels.py +0 -0
- {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon/logging/logger_wrapper.py +0 -0
- {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon/logging/process_logger.py +0 -0
- {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon/logging/sql_logger.py +0 -0
- {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon/mcp_server/__init__.py +0 -0
- {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon/mcp_server/server.py +0 -0
- {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon/middleware/__init__.py +0 -0
- {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon/middleware/context.py +0 -0
- {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon/middleware/cors.py +0 -0
- {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon/middleware/docs.py +0 -0
- {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon/middleware/exception.py +0 -0
- {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon/middleware/middleware.py +0 -0
- {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon/middleware/monitor_memory.py +0 -0
- {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon/middleware/mq.py +0 -0
- {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon/middleware/sandbox.py +0 -0
- {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon/middleware/timeout.py +0 -0
- {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon/middleware/token_tracking.py +0 -0
- {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon/middleware/tool_result_truncation.py +0 -0
- {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon/middleware/traceid.py +0 -0
- {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon/models/__init__.py +0 -0
- {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon/models/base_http.py +0 -0
- {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon/models/log.py +0 -0
- {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon/models/mcp_server_config.py +0 -0
- {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon/models/mqlistener_config.py +0 -0
- {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon/models/mqmsg_model.py +0 -0
- {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon/models/mqsend_config.py +0 -0
- {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon/models/sandbox.py +0 -0
- {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon/models/sso_user.py +0 -0
- {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon/models/token_usage.py +0 -0
- {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon/models/token_usage_mysql.py +0 -0
- {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon/models/xxljob_handler_config.py +0 -0
- {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon/notice/__init__.py +0 -0
- {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon/notice/uvicorn_monitor.py +0 -0
- {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon/notice/wecom_message.py +0 -0
- {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon/rabbitmq/process_pool_consumer.py +0 -0
- {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon/rabbitmq/rabbitmq_client.py +0 -0
- {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon/rabbitmq/rabbitmq_pool.py +0 -0
- {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon/rabbitmq/rabbitmq_service.py +0 -0
- {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon/rabbitmq/rabbitmq_service_client_manager.py +0 -0
- {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon/rabbitmq/rabbitmq_service_connection_monitor.py +0 -0
- {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon/rabbitmq/rabbitmq_service_consumer_manager.py +0 -0
- {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon/rabbitmq/rabbitmq_service_core.py +0 -0
- {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon/rabbitmq/rabbitmq_service_producer_manager.py +0 -0
- {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon/sentry/__init__.py +0 -0
- {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon/sentry/sy_sentry.py +0 -0
- {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon/services.py +0 -0
- {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon/sse/__init__.py +0 -0
- {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon/sse/event.py +0 -0
- {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon/sse/sse.py +0 -0
- {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon/synacos/__init__.py +0 -0
- {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon/synacos/example.py +0 -0
- {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon/synacos/example2.py +0 -0
- {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon/synacos/feign.py +0 -0
- {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon/synacos/feign_client.py +0 -0
- {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon/synacos/nacos_client_base.py +0 -0
- {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon/synacos/nacos_config_manager.py +0 -0
- {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon/synacos/nacos_heartbeat_manager.py +0 -0
- {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon/synacos/nacos_service.py +0 -0
- {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon/synacos/nacos_service_discovery.py +0 -0
- {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon/synacos/nacos_service_registration.py +0 -0
- {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon/synacos/param.py +0 -0
- {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon/tests/deep_agent_server.py +0 -0
- {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon/tests/test_consumer_recovery.py +0 -0
- {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon/tests/test_deep_agent.py +0 -0
- {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon/tests/test_email.py +0 -0
- {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon/tests/test_encoding_cache.py +0 -0
- {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon/tests/test_mcp_server.py +0 -0
- {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon/tests/test_minimax_reasoning.py +0 -0
- {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon/tests/test_mq.py +0 -0
- {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon/tests/test_oa_login.py +0 -0
- {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon/tests/test_real_summarization.py +0 -0
- {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon/tests/test_summarization_config.py +0 -0
- {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon/tests/test_summarization_real.py +0 -0
- {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon/tools/__init__.py +0 -0
- {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon/tools/async_utils.py +0 -0
- {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon/tools/docs.py +0 -0
- {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon/tools/env.py +0 -0
- {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon/tools/merge_headers.py +0 -0
- {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon/tools/snowflake.py +0 -0
- {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon/tools/syemail.py +0 -0
- {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon/tools/timing.py +0 -0
- {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon/xxljob/__init__.py +0 -0
- {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon/xxljob/xxljob_service.py +0 -0
- {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon_python_lib.egg-info/dependency_links.txt +0 -0
- {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon_python_lib.egg-info/entry_points.txt +0 -0
- {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon_python_lib.egg-info/requires.txt +0 -0
- {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon_python_lib.egg-info/top_level.txt +0 -0
- {sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/tests/test_sycli.py +0 -0
|
@@ -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
|
|
{sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/sycommon/llm/usage_token.py
RENAMED
|
@@ -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"])
|
|
@@ -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
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/command/templates/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/command/templates/agent/app.py.tpl
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/command/templates/base/.env.tpl
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/command/templates/base/__init__.py
RENAMED
|
File without changes
|
{sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/command/templates/base/app.py.tpl
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/command/templates/cli/__init__.py
RENAMED
|
File without changes
|
{sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/command/templates/cli/app.py.tpl
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{sycommon_python_lib-0.2.5a16 → sycommon_python_lib-0.2.5a17}/src/command/templates/web/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|