fix(mcp): make local-endpoint budgets configurable - #1856
Conversation
|
✅ Health of changed files: 3.2 → 3.6 (+0.3) 📋 At a glance Files & modules (2)
✅ Health gate: passed 📌 Before you merge
🔎 More signals (3)🗺️ Change map flowchart LR
subgraph PR ["Changed in this PR (4 with dependents)"]
f_packages_server_src_repowise_server_mcp_server__answer_pipeline_py[".../mcp_server/_answer_pipeline.py 🔥"]:::changed
f_packages_server_src_repowise_server_mcp_server__helpers_py[".../mcp_server/_helpers.py 🔥"]:::changed
f_packages_server_src_repowise_server_mcp_server_tool_answer_config_py[".../tool_answer/config.py 🔥"]:::changed
f_packages_server_src_repowise_server_mcp_server_tool_answer_synthesis_py[".../tool_answer/synthesis.py 🔥"]:::changed
end
f_packages_server_src_repowise_server_mcp_server__neighbor_rerank_py[".../mcp_server/_neighbor_rerank.py"]
f_packages_server_src_repowise_server_mcp_server__answer_pipeline_py --> f_packages_server_src_repowise_server_mcp_server__neighbor_rerank_py
f_packages_server_src_repowise_server_mcp_server_tool_answer_answer_py[".../tool_answer/answer.py"]
f_packages_server_src_repowise_server_mcp_server__answer_pipeline_py --> f_packages_server_src_repowise_server_mcp_server_tool_answer_answer_py
f_packages_server_src_repowise_server_mcp_server_tool_search_py[".../mcp_server/tool_search.py"]
f_packages_server_src_repowise_server_mcp_server__answer_pipeline_py --> f_packages_server_src_repowise_server_mcp_server_tool_search_py
f_packages_server_src_repowise_server_mcp_server__prose_symbols_py[".../mcp_server/_prose_symbols.py"]
f_packages_server_src_repowise_server_mcp_server__helpers_py --> f_packages_server_src_repowise_server_mcp_server__prose_symbols_py
f_packages_server_src_repowise_server_mcp_server__helpers_py --> f_packages_server_src_repowise_server_mcp_server_tool_answer_answer_py
f_packages_server_src_repowise_server_mcp_server_tool_answer_cache_py[".../tool_answer/cache.py"]
f_packages_server_src_repowise_server_mcp_server__helpers_py --> f_packages_server_src_repowise_server_mcp_server_tool_answer_cache_py
f_packages_server_src_repowise_server_mcp_server_tool_answer_evidence_py[".../tool_answer/evidence.py"]
f_packages_server_src_repowise_server_mcp_server__helpers_py --> f_packages_server_src_repowise_server_mcp_server_tool_answer_evidence_py
f_packages_server_src_repowise_server_mcp_server_tool_answer_config_py --> f_packages_server_src_repowise_server_mcp_server_tool_answer_answer_py
f_packages_server_src_repowise_server_mcp_server_tool_answer_bodies_py[".../tool_answer/bodies.py"]
f_packages_server_src_repowise_server_mcp_server_tool_answer_config_py --> f_packages_server_src_repowise_server_mcp_server_tool_answer_bodies_py
f_packages_server_src_repowise_server_mcp_server_tool_answer_config_py --> f_packages_server_src_repowise_server_mcp_server_tool_answer_cache_py
f_packages_server_src_repowise_server_mcp_server_tool_answer_confidence_py[".../tool_answer/confidence.py"]
f_packages_server_src_repowise_server_mcp_server_tool_answer_config_py --> f_packages_server_src_repowise_server_mcp_server_tool_answer_confidence_py
f_packages_server_src_repowise_server_mcp_server__server_py[".../mcp_server/_server.py"]
f_packages_server_src_repowise_server_mcp_server_tool_answer_synthesis_py --> f_packages_server_src_repowise_server_mcp_server__server_py
f_packages_server_src_repowise_server_mcp_server_tool_answer_synthesis_py --> f_packages_server_src_repowise_server_mcp_server_tool_answer_answer_py
more(["+24 more dependents"])
PR --> more
w_packages_server_src_repowise_server_mcp_server_tool_answer_answer_py(["⚠️ .../tool_answer/answer.py changed together 23×, not in PR"]):::warn
f_packages_server_src_repowise_server_mcp_server_tool_answer_config_py -.- w_packages_server_src_repowise_server_mcp_server_tool_answer_answer_py
w_packages_server_src_repowise_server_mcp_server_tool_answer_symbols_py(["⚠️ .../tool_answer/symbols.py changed together 10×, not in PR"]):::warn
f_packages_server_src_repowise_server_mcp_server_tool_answer_config_py -.- w_packages_server_src_repowise_server_mcp_server_tool_answer_symbols_py
t_tests_unit_server_mcp_test_answer_agreement_py(["✅ .../mcp/test_answer_agreement.py"]):::guard
t_tests_unit_server_mcp_test_answer_agreement_py -.-> f_packages_server_src_repowise_server_mcp_server__answer_pipeline_py
t_tests_unit_server_mcp_test_decision_hygiene_py(["✅ .../mcp/test_decision_hygiene.py"]):::guard
t_tests_unit_server_mcp_test_decision_hygiene_py -.-> f_packages_server_src_repowise_server_mcp_server__helpers_py
t_tests_unit_server_mcp_test_answer_cache_py(["✅ .../mcp/test_answer_cache.py"]):::guard
t_tests_unit_server_mcp_test_answer_cache_py -.-> f_packages_server_src_repowise_server_mcp_server_tool_answer_config_py
classDef changed fill:#dbeafe,stroke:#1d4ed8,color:#1e3a5f
classDef warn fill:#fef3c7,stroke:#b45309,color:#78350f
classDef guard fill:#dcfce7,stroke:#15803d,color:#14532d
Solid arrows: code that imports the changed files (33 direct dependents, from the last indexed snapshot). Dashed: history/tests. 🔥 Hotspots touched (5)
2 more
🔗 Hidden coupling (1 file)
👀 Suggested reviewers @RaghavChamadiya 📊 See the full report for this PR |
Ayush7614
left a comment
There was a problem hiding this comment.
Verified: pytest tests/unit/server/mcp/test_answer_synthesis_timeout.py tests/unit/server/mcp/test_embed_timeout.py -q 76 passed. Makes two hardcoded budgets configurable (REPOWISE_SYNTHESIS_MAX_TOKENS for reasoning models spending budget on hidden thinking, REPOWISE_EMBED_TIMEOUT_S via embed_timeout_s() mirroring vector_search_timeout_s()) with validate-and-warn fallback, correct 120s cap, and updated degraded message advertising the env var. Hotspot history (config.py 11.7 fixes) matches the bug-prone area being fixed — not a new risk. LGTM.
Summary
tool_answer/config.py:_SYNTHESIS_MAX_TOKENS(1024, hardcoded) now readsREPOWISE_SYNTHESIS_MAX_TOKENS. A reasoning model spends its whole budget on hidden thinking before emitting an answer token, so the call comes back empty at the old cap; measured against nanbeige, 1024 tokens returned nothing, 8192 produced a correct, cited answer._answer_pipeline.py/_helpers.py:_EMBED_TIMEOUT_S(8.0, hardcoded) now readsREPOWISE_EMBED_TIMEOUT_Svia a newembed_timeout_s(), mirroring the siblingvector_search_timeout_s(). A cold-loading local embedding model blows the old 8s budget;get_answerstill exits 0 with the semantic leg silently dropped, visible only at WARNING.REPOWISE_EMBEDDING_TIMEOUT/REPOWISE_VECTOR_SEARCH_TIMEOUT_S: an unparseable or non-positive override warns and keeps the default.Related Issues
None.
Test Plan
uv run pytest tests/unit/ -q— 14242 passed, 12 skipped, 2 xfailed. 2 failures, both pre-existing on unmodifiedmainand unrelated to this change: a git-rebase test that depends on local git config, and a timezone-sensitive episode-dating test.uv run ruff check .uv run repowise risk main..HEAD:config.pyalone shows a recency-weighted 11.7). That matches the PR's own premise — this is a bug-prone area — rather than indicating a new problem in this diff; the full-suite result above is the direct check on that.(
impacted-tests/health --fileneed a completedrepowise initagainst this clone; that indexing run did not finish in time and is omitted rather than faked.)Checklist
Written with AI assistance; measurements and tests were run and verified locally.