Run extraction under the Max OAuth subscription via `claude -p` instead of the per-token Anthropic API. The new src/second_brain/llm/claude_cli.py spawns the CLI in a hermetic tempdir so the host project's CLAUDE.md, hooks, MCP config, and settings don't leak into the prompt. Uses --json-schema with LLMExtraction.model_json_schema() so the CLI guarantees valid structured output — replaces the brittle markdown-fence stripping in the old engine. The Anthropic SDK is preserved as an optional "api" backend selectable via config. While in here, fix a handful of blockers that the smoke test surfaced: - scheduler filtered ANALYZED instead of TRANSCRIBED, so it never actually advanced any sources - process command read sources in a closed session, raising DetachedInstanceError before any work happened - config.prompts_dir walked one parent too many, resolving outside the project and forcing the fallback prompt for every domain - compiler called git rev-parse against a vault that was never git-init'd; now auto-inits with an empty seed commit and skips empty commits cleanly - datetime.utcnow() deprecated in 3.12+ — single utcnow() helper in models.py keeps naive UTC semantics so no DB migration is needed - sess.query(...).get() deprecated in SA 2.x → sess.get(...) - dead `import anthropic` removed from compiler Smoke test (article → process → accept → compile) succeeds end-to-end with ANTHROPIC_API_KEY unset. a-review run saved under reviews/. Co-Authored-By: Claude Opus 4 <noreply@anthropic.com>
45 lines
1.4 KiB
TOML
45 lines
1.4 KiB
TOML
# second-brain runtime configuration
|
|
# Copy this file and edit paths to match your setup.
|
|
# Override the config file path with SECOND_BRAIN_CONFIG env var.
|
|
|
|
# Path to the SQLite database
|
|
db_path = "~/.local/share/second-brain/second_brain.db"
|
|
|
|
# Path to your Obsidian vault (git-managed directory)
|
|
vault_path = "~/Documents/second-brain-vault"
|
|
|
|
# Directory where downloaded media files are stored
|
|
media_dir = "~/.local/share/second-brain/media"
|
|
|
|
# Directory where Whisper SRT transcripts are stored
|
|
subtitles_dir = "~/.local/share/second-brain/subtitles"
|
|
|
|
# Whisper model size: tiny | base | small | medium | large
|
|
# small is a good balance of speed and accuracy
|
|
whisper_model = "small"
|
|
|
|
# Active knowledge domains
|
|
domains = ["development", "content", "business", "homelab"]
|
|
|
|
[extractor]
|
|
# "cli" → runs `claude -p` under your Max OAuth (no per-token billing).
|
|
# "api" → uses Anthropic SDK, requires ANTHROPIC_API_KEY.
|
|
backend = "cli"
|
|
model = "claude-sonnet-4-6"
|
|
cli_binary = "claude"
|
|
timeout_sec = 600
|
|
|
|
[scheduler]
|
|
# Time window for overnight processing (24h format, may cross midnight)
|
|
window_start = "22:00"
|
|
window_end = "06:00"
|
|
|
|
# CLI backend: cap calls per rolling hour (Max sub has 5h-window message caps).
|
|
max_calls_per_hour = 30
|
|
|
|
# Minimum seconds between extraction calls (rate-limit smoother)
|
|
min_gap_seconds = 120
|
|
|
|
# Legacy API-backend budget (only enforced when extractor.backend = "api").
|
|
max_tokens_per_hour = 100_000
|