Skip to content

refactor(memory): rename to memory, OpenAI env, chunking, batching, dedup#75

Merged
slaid098 merged 9 commits into
mainfrom
refactor/memory/rename-openai-env-chunking
Jul 26, 2026
Merged

refactor(memory): rename to memory, OpenAI env, chunking, batching, dedup#75
slaid098 merged 9 commits into
mainfrom
refactor/memory/rename-openai-env-chunking

Conversation

@slaid098

Copy link
Copy Markdown
Owner

Что сделано

  • Переименование second-brain → memory (pyproject + cli prog)
  • OpenAI-совместимый env: OPENAI_BASE_URL/OPENAI_API_KEY/OPENAI_EMBEDDING_MODEL
  • Фикс trailing-slash бага (двойной //embeddings → 404)
  • Чанкирование с env-параметрами MEMORY_CHUNK_SIZE=512, MEMORY_CHUNK_OVERLAP=64
  • Batching через OPENAI_EMBEDDING_BATCH_SIZE=2048
  • Дедуп по source в top-K search
  • Live-тесты (skip без RUN_LIVE=1)
  • Edge case тесты для _chunk_text

Почему

Нейминг-путаница (3 разных имени), нестандартный env (AI_PROVIDER_API_URL ≠ AI_PROVIDER_BASE_URL), реальная 404-бага из-за trailing slash, грубый индекс (1 эмбеддинг на файл), отсутствие batching (риск упереться в OpenAI лимит), отсутствие дедупа в search. PR #1 в серии из 2 (PR #2 — интеграция в плагин через setup-memory.sh).

Closes #74

Closes #74

@slaid098

Copy link
Copy Markdown
Owner Author

Docs Review Summary

  • Project map: already updated in PR (src/memory/ cli/embedder/index/search descriptions reflect rename + OpenAI env + chunking + dedup; tests/test_chunking.py + tests/test_embedder_live.py listed) — no further edits needed
  • Handoff: valid (4 sections present and meaningful — Что сделано: 14 items, Почему: 7 problems, Pending: 3 items, Watch out: 7 items)
  • ADR: valid (032-pr-75-rename-openai-env-chunking.md, sequential after 031; 4 sections present — Статус: Accepted, Контекст: 7 problems + PR#1-in-series, Решение: 6 points, Альтернативы: 4 alternatives)

Spec Cleanup

  • Spec: n/a (docs/spec/roadmap.md does not exist)

Verdict: NO_CHANGES

@slaid098

Copy link
Copy Markdown
Owner Author

Code Review Summary

Чистый рефакторинг src/memory/ (RAG CLI): rename second-brainmemory, переход на OpenAI-совместимый env, фикс trailing-slash баги, chunking, batching, дедуп в search. Качество высокое — 9 логических коммитов, handoff + ADR-032 заполнены осмысленно, 31 тест (2 live skip), CI green. Архитектура embedder/index/search/cli сохранена, функции короткие (<30 строк), файлы <80 строк.

Positives

  • Trailing-slash фикс (embedder.py:9 API_URL.rstrip("/")) — реальная 404-бага воспроизведена и покрыта тестом test_embed_texts_trailing_slash.
  • Chunking edge cases (index.py:19-23) — graceful при size<=overlap (1 chunk, не infinite loop), покрыто 7 тестами в test_chunking.py включая unicode emoji.
  • Batching (embedder.py:48-57) — тест test_embed_texts_batches проверяет 3000 texts → 2 вызова [2048, 952], конкатенация результатов.
  • Дедуп в search (search.py:41-50) — highest score per source, тест test_dedup_by_source подтверждает.
  • Декомпозиция index.py_chunk_text, _file_entry, _build_file_map выделены (CI xenon fix → rank A).
  • Handoff/ADRdocs/handoff/pr-75-rename-openai-env-chunking.md и docs/decisions/032-pr-75-rename-openai-env-chunking.md содержательны, 4 альтернативы в ADR с обоснованием отклонения, секции Pending/Watch out с реальными рисками.
  • Env-only конфиг — все 6 переменных в .env.example, нет хардкоженных URL/key, API key не логируется.
  • Project-map обновлёнdocs/project-map/README.md отражает новые имена и функциональность.

Suggestions (info, not blocking)

  • embedder.py:6-12 [style] Module-level чтение env + importlib.reload в тестах — хрупкий паттерн (сам отмечен в handoff Watch out). Альтернатива (читать env в embed_texts) отклонена в ADR-032 по обоснованной причине (overhead). Оставлено осознанно — acceptable trade-off.
  • embedder.py:50,56 [style] Повтор payload = {"model": EMBEDDING_MODEL, "input": ...} в двух ветках — можно вынести в хелпер _make_payload(input_list), но при 2 вызовах DRY-нарушение минимально.
  • index.py:44 [style] chunks = _chunk_text(...) or [("", 0)] — empty files → 1 запись с пустым чанком. Поведение задокументировано в ADR (отклонена альтернатива дропать empty files), но or [("", 0)] неочевидно без контекста. Можно вынести в именованную константу или хелпер.
  • search.py:44 [style] src = str(r["source"])source уже str из JSON, str() избыточен, но безопасен для mypy strict (union str | float в типе dict).
  • test_embedder.py:88-109 [test] test_embed_texts_custom_model/test_embed_texts_trailing_slash — финальный reload после assert не в finally. Если assert упадёт — stale module state для следующего теста. Риск минимальный (assert в конце), отмечено в handoff Watch out. Для robustness можно обернуть в try/finally — не блокирующее.
  • .env.example:3-4 [docs] AI_PROVIDER_BASE_URL/AI_PROVIDER_API_KEY оставлены для LLM провайдера (opencode.json) — корректно, отдельный concern. Future PR для OpenAI-стандартизации LLM env упомянут в Pending.

Verdict: APPROVE

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

refactor(memory): rename to memory, OpenAI env, chunking, batching, dedup

1 participant