refactor(agents): migrate .agent/ planning tree to .agents/
Standardize on the .agents/ directory (shared with project skills): phases/, user_stories/, reports/, screenshots/, validate.sh, and phase-sessions/ + pipeline.log all move to .agents/ (git mv preserves history; runtime artifacts move alongside). Updates every reference in AGENTS.md, README.md, .gitignore, app docstrings, and test story headers. Historical KB content in data/ and the runtime pipeline.log transcript are left untouched.
This commit is contained in:
@@ -0,0 +1,52 @@
|
||||
# Phase 11 — Long Answers (No Truncation)
|
||||
|
||||
**Story:** `.agents/user_stories/long-answers.md`
|
||||
**Context:** owner report 2026-08-22 — "responses keep getting cut off.
|
||||
It should be allowed to respond up to 32768 tokens."
|
||||
|
||||
## Goal
|
||||
Remove the hard 700-token output cap on chat answers; the model may
|
||||
respond up to **32 768** tokens (`BOR_MAX_OUTPUT_TOKENS`, default
|
||||
32 768).
|
||||
|
||||
## Diagnosis
|
||||
`app/rag/llm.py::chat_stream` calls `chat.completions.create(...,
|
||||
max_tokens=700, ...)`. Long answers die mid-sentence at ~700 tokens.
|
||||
|
||||
## Implementation steps
|
||||
1. **Config** (`app/config.py`): `max_output_tokens: int = 32_768` in the
|
||||
RAG-tuning section (env `BOR_MAX_OUTPUT_TOKENS`); document in
|
||||
`.env.example`.
|
||||
2. **LLM client** (`app/rag/llm.py`): `chat_stream` passes
|
||||
`max_tokens=self.settings.max_output_tokens`.
|
||||
3. **E2E mock** (`tests/e2e/mock_llm.py`):
|
||||
- Honor `max_tokens` deterministically: token ≈ whitespace word; if
|
||||
the composed answer is longer, truncate to the first N words.
|
||||
(With the old 700 cap a long answer loses its tail — the mock now
|
||||
behaves like the real endpoint.)
|
||||
- New trigger: user message containing `write a long answer` →
|
||||
deterministic ~4 000-word numbered answer ending in a unique final
|
||||
line (`LONG-ANSWER-END`).
|
||||
- No behavior change for existing (short) answers: they fit under any
|
||||
sane cap.
|
||||
4. **Tests:**
|
||||
- Unit: settings default + env override (`test_config.py`);
|
||||
`chat_stream` forwards the configured `max_tokens` (fake client in
|
||||
`test_llm_client.py`).
|
||||
- E2E: `tests/e2e/test_long_answers.py` per the story mapping.
|
||||
|
||||
## Locked decisions
|
||||
None touched. A5 (aipi endpoint) unchanged; `turbo` accepts the larger
|
||||
cap per owner instruction.
|
||||
|
||||
## Testing & Quality
|
||||
- Unit + integration green; `uv run pytest --cov=app --cov-report=term-missing`
|
||||
**>90%**; E2E in isolation:
|
||||
`uv run pytest tests/e2e/test_long_answers.py -v --no-cov`.
|
||||
- No regressions: `test_chat_rag.py` + `test_chat_api.py` green
|
||||
(short answers unaffected by the mock's new `max_tokens` honoring).
|
||||
|
||||
## Commit
|
||||
```bash
|
||||
git add -A .agents/ app/ tests/ .env.example && git commit --no-gpg-sign -m "fix(rag): lift chat output cap to 32768 tokens — long answers no longer cut off"
|
||||
```
|
||||
Reference in New Issue
Block a user