* feat(memory): implement Tier 2 structural organization Add four independent modules for memory structural organization: - H-MEM hierarchical directory routing (hierarchy.py) - A-MEM semantic linking via BM25 (semantic_links.py) - Auto-compression pipeline via TF-IDF (compression.py) - FTS5 full-text search index (search_index.py) Integration: - 4 feature flags in MemoryConfig (default: disabled) - MemoryEntry extended with category + compression_level fields - persistent.py wired with hierarchy routing, FTS5 search, link expansion - lifecycle.py triggers compression in GC cycle - remember_tool.py attaches related links in recall results - FTS5 CJK bigram+unigram indexing for better Chinese recall - Lazy auto-rebuild on first FTS5 search Testing: - 163 unit tests + 9 integration tests + 23 benchmarks (all passing) - Benchmark evaluated on 200 real production memories + 50 labeled queries - Compression retention: daily 91.4%, digest 97.1% - Hierarchy routing: 93.3% P@5 parity with full scan Closes #732 (Tier 2 scope) Signed-off-by: shadowinlife <shadowinlife@gmail.com> Co-Authored-By: Qoder <noreply@qoder.com> AI-Contributed/Feature: 1582/1871 AI-Contributed/UT: 2123/2159 * feat(memory): add VT_MEMORY=off|on|full business-friendly preset Simplify memory configuration from 7 individual boolean flags to a single business-friendly environment variable: - off: all features disabled (default, backward compatible) - on: Tier 1 quality + decay + garbage collection - full: Tier 1 + Tier 2 hierarchy + links + compression + FTS Individual VT_MEMORY_* flags still work as explicit overrides with higher priority than the preset baseline. Also adds a dependency-conflict warning in lifecycle.py when compression is enabled without GC. Signed-off-by: shadowinlife <shadowinlife@gmail.com> AI-Contributed/Feature: 0/138 AI-Contributed/UT: 0/0 * docs: add Memory Tier 2 and VT_MEMORY preset to CHANGELOG Document the new structural organization features (hierarchy, semantic links, compression, FTS5) and the business-friendly VT_MEMORY=off|on|full configuration preset. Signed-off-by: shadowinlife <shadowinlife@gmail.com> AI-Contributed/Feature: 0/15 AI-Contributed/UT: 0/0 --------- Co-authored-by: Qoder <noreply@qoder.com>
274 lines
12 KiB
Bash
274 lines
12 KiB
Bash
# NOTE: All defaults are defined in agent/src/config/env_schema.py (EnvConfig).
|
|
# ============================================================================
|
|
# LLM Provider (LLMConfig) — uncomment ONE provider block below
|
|
# ============================================================================
|
|
|
|
# --- OpenRouter (recommended, multi-model gateway) ---
|
|
LANGCHAIN_PROVIDER=openrouter
|
|
LANGCHAIN_MODEL_NAME=deepseek/deepseek-v4-pro
|
|
OPENROUTER_API_KEY=sk-or-...here
|
|
OPENROUTER_BASE_URL=https://openrouter.ai/api/v1
|
|
|
|
# --- Requesty (OpenAI-compatible multi-model gateway) ---
|
|
# Same provider/model naming as OpenRouter. Get a key at https://app.requesty.ai/api-keys
|
|
# EU endpoint: https://router.eu.requesty.ai/v1
|
|
# LANGCHAIN_PROVIDER=requesty
|
|
# LANGCHAIN_MODEL_NAME=openai/gpt-4o-mini
|
|
# REQUESTY_API_KEY=xxx
|
|
# REQUESTY_BASE_URL=https://router.requesty.ai/v1
|
|
|
|
# --- OpenAI ---
|
|
# LANGCHAIN_PROVIDER=openai
|
|
# LANGCHAIN_MODEL_NAME=gpt-5.5-instant
|
|
# OPENAI_API_KEY=sk-xxx
|
|
# OPENAI_BASE_URL=https://api.openai.com/v1
|
|
|
|
# --- Anthropic Messages API / compatible proxy ---
|
|
# LANGCHAIN_PROVIDER=anthropic
|
|
# LANGCHAIN_MODEL_NAME=claude-sonnet-4-6
|
|
# ANTHROPIC_API_KEY=sk-ant-xxx
|
|
# ANTHROPIC_BASE_URL=https://api.anthropic.com
|
|
# ANTHROPIC_MAX_TOKENS=16384 # Recommended for proxy model names unknown to LangChain
|
|
|
|
# --- OpenAI Codex (ChatGPT OAuth; not the OpenAI API key path) ---
|
|
# Login first: vibe-trading provider login openai-codex
|
|
# Requires a ChatGPT account with Codex access. OAuth tokens are stored by oauth-cli-kit.
|
|
# LANGCHAIN_PROVIDER=openai-codex
|
|
# LANGCHAIN_MODEL_NAME=openai-codex/gpt-5.4
|
|
# OPENAI_CODEX_BASE_URL=https://chatgpt.com/backend-api/codex/responses
|
|
|
|
# --- DeepSeek ---
|
|
# LANGCHAIN_PROVIDER=deepseek
|
|
# LANGCHAIN_MODEL_NAME=deepseek-v4-pro
|
|
# DEEPSEEK_API_KEY=sk-xxx
|
|
# DEEPSEEK_BASE_URL=https://api.deepseek.com/v1
|
|
# DeepSeek adapter selection: auto (default; use langchain-deepseek if installed),
|
|
# native (require langchain-deepseek, error if missing), or openai-compatible
|
|
# (force the legacy ChatOpenAI path). Install the adapter with:
|
|
# pip install "vibe-trading-ai[deepseek]"
|
|
# VIBE_TRADING_DEEPSEEK_ADAPTER=auto
|
|
|
|
# --- NVIDIA NIM (hosted API catalog) ---
|
|
# LANGCHAIN_PROVIDER=nvidia
|
|
# LANGCHAIN_MODEL_NAME=nvidia/nemotron-3-ultra-550b-a55b
|
|
# NVIDIA_API_KEY=nvapi-xxx
|
|
# NVIDIA_BASE_URL=https://integrate.api.nvidia.com/v1
|
|
|
|
# --- Gemini ---
|
|
# LANGCHAIN_PROVIDER=gemini
|
|
# LANGCHAIN_MODEL_NAME=gemini-3.5-flash
|
|
# GEMINI_API_KEY=xxx
|
|
# GEMINI_BASE_URL=https://generativelanguage.googleapis.com/v1beta/openai/
|
|
|
|
# --- Groq ---
|
|
# LANGCHAIN_PROVIDER=groq
|
|
# LANGCHAIN_MODEL_NAME=meta-llama/llama-4-maverick-17b-128e-instruct
|
|
# GROQ_API_KEY=gsk_xxx
|
|
# GROQ_BASE_URL=https://api.groq.com/openai/v1
|
|
|
|
# --- DashScope / Qwen ---
|
|
# LANGCHAIN_PROVIDER=dashscope
|
|
# LANGCHAIN_MODEL_NAME=qwen-plus-latest
|
|
# DASHSCOPE_API_KEY=sk-xxx
|
|
# DASHSCOPE_BASE_URL=https://dashscope.aliyuncs.com/compatible-mode/v1
|
|
|
|
# --- Zhipu ---
|
|
# LANGCHAIN_PROVIDER=zhipu
|
|
# LANGCHAIN_MODEL_NAME=glm-5.1
|
|
# ZHIPU_API_KEY=xxx
|
|
# ZHIPU_BASE_URL=https://open.bigmodel.cn/api/paas/v4
|
|
|
|
# --- Moonshot / Kimi (open platform, pay-as-you-go) ---
|
|
# LANGCHAIN_PROVIDER=moonshot
|
|
# LANGCHAIN_MODEL_NAME=kimi-k2.6
|
|
# MOONSHOT_API_KEY=sk-xxx
|
|
# MOONSHOT_BASE_URL=https://api.moonshot.ai/v1
|
|
|
|
# --- Kimi for Coding (subscription plan; NOT the open platform above) ---
|
|
# Create the key in the Kimi Code console (kimi.com/code/docs). A coding-plan
|
|
# key is rejected by api.moonshot.ai and vice-versa. temperature is forced to 1.
|
|
# LANGCHAIN_PROVIDER=kimi-coding
|
|
# LANGCHAIN_MODEL_NAME=kimi-for-coding
|
|
# KIMI_CODING_API_KEY=sk-kimi-xxx
|
|
# KIMI_CODING_BASE_URL=https://api.kimi.com/coding/v1
|
|
|
|
# --- MiniMax ---
|
|
# LANGCHAIN_PROVIDER=minimax
|
|
# LANGCHAIN_MODEL_NAME=MiniMax-M3 # or MiniMax-M2.7 / MiniMax-M2.7-highspeed
|
|
# MINIMAX_API_KEY=xxx
|
|
# MINIMAX_BASE_URL=https://api.minimax.io/v1 # Global
|
|
# MINIMAX_BASE_URL=https://api.minimaxi.com/v1 # China
|
|
# Note: MiniMax requires temperature > 0. Set LANGCHAIN_TEMPERATURE=1.0 (default when using MiniMax)
|
|
|
|
# --- Xiaomi MIMO ---
|
|
# LANGCHAIN_PROVIDER=mimo
|
|
# LANGCHAIN_MODEL_NAME=MiMo-72B-A27B
|
|
# MIMO_API_KEY=xxx
|
|
# MIMO_BASE_URL=https://api.xiaomimimo.com/v1
|
|
|
|
# --- iFlytek Spark ---
|
|
# APIPassword from the iFlytek console (https://console.xfyun.cn), sent as a Bearer token.
|
|
# LANGCHAIN_PROVIDER=spark
|
|
# LANGCHAIN_MODEL_NAME=4.0Ultra # or generalv3.5 / pro-128k / lite
|
|
# SPARK_API_KEY=xxx
|
|
# SPARK_BASE_URL=https://spark-api-open.xf-yun.com/v1
|
|
|
|
# --- Z.ai (for Coding Plan) ---
|
|
# LANGCHAIN_PROVIDER=zai
|
|
# LANGCHAIN_MODEL_NAME=glm-5.1
|
|
# ZAI_API_KEY=xxx
|
|
# ZAI_BASE_URL=https://api.z.ai/api/coding/paas/v4
|
|
|
|
# --- Ollama (local) ---
|
|
# LANGCHAIN_PROVIDER=ollama
|
|
# LANGCHAIN_MODEL_NAME=qwen2.5:32b
|
|
# OLLAMA_BASE_URL=http://localhost:11434
|
|
|
|
# LLM parameters
|
|
LANGCHAIN_TEMPERATURE=0.0
|
|
TIMEOUT_SECONDS=120
|
|
MAX_RETRIES=2
|
|
|
|
# Enable reasoning on relays that require opt-in (e.g. OpenRouter thinking models).
|
|
# Forwarded as extra_body.reasoning.effort = low / medium / high / max.
|
|
# Leave unset for Moonshot / DeepSeek official APIs — they return reasoning_content by default.
|
|
# LANGCHAIN_REASONING_EFFORT=medium
|
|
|
|
# ============================================================================
|
|
# Data Sources (DataConfig)
|
|
# ============================================================================
|
|
# A-shares: Tushare Pro token (https://tushare.pro)
|
|
TUSHARE_TOKEN=your-tushare-token
|
|
# HK/US equities: yfinance (free, no config needed)
|
|
# Crypto: OKX public API (free, no config needed)
|
|
# Crypto fallback exchange (default: binance). Change if OKX is blocked:
|
|
# CCXT_EXCHANGE=binance
|
|
# HK / A-share equities via Futu OpenAPI (optional, requires FutuOpenD running locally)
|
|
# Download FutuOpenD: https://www.futunn.com/download/openAPI
|
|
# FUTU_HOST=127.0.0.1
|
|
# FUTU_PORT=11111
|
|
# US / HK equities via LongPort OpenAPI (optional, requires LongPort developer account)
|
|
# Sign up: https://open.longbridge.com
|
|
# LONGBRIDGE_APP_KEY=your-app-key
|
|
# LONGBRIDGE_APP_SECRET=your-app-secret
|
|
# LONGBRIDGE_ACCESS_TOKEN=your-access-token
|
|
# Install the optional SDK before using Longbridge:
|
|
# pip install "vibe-trading-ai[longbridge]"
|
|
# To force Longbridge for a backtest, set "source": "longbridge" in config.json.
|
|
# In an Agent conversation, ask: "Use Longbridge to fetch QQQ.US historical data."
|
|
# Free direct-API sources need NO key and auto-join the fallback chain: Eastmoney / Sina / Stooq / Yahoo.
|
|
|
|
# Optional API-key data sources (enabled only when the key is set; silently skipped otherwise)
|
|
# FINNHUB_API_KEY=xxx # optional US-equity OHLCV fallback provider (selectable get_market_data source)
|
|
# ALPHAVANTAGE_API_KEY=xxx # optional US-equity OHLCV fallback provider (selectable get_market_data source)
|
|
# TIINGO_API_KEY=xxx # optional US-equity OHLCV fallback provider (selectable get_market_data source)
|
|
# FMP_API_KEY=xxx # optional US-equity OHLCV fallback provider (selectable get_market_data source)
|
|
# FRED_API_KEY=xxx # macro series (get_macro_series tool)
|
|
# VIBE_TRADING_IWENCAI_KEY=xxx # A-share natural-language research search (iwencai_search tool)
|
|
# VIBE_TRADING_SEC_UA="Your Name your@email.com" # SEC EDGAR compliant contact User-Agent (optional; a built-in default UA also works)
|
|
# Optional per-source request-spacing overrides for batch jobs — VIBE_TRADING_{EASTMONEY,SINA,STOOQ,YAHOO,SEC,FINNHUB,ALPHAVANTAGE,TIINGO,FMP,FRED,IWENCAI,THS}_MIN_INTERVAL (seconds).
|
|
|
|
# OCR engine for scanned PDF pages and images (auto by default).
|
|
# auto — local engines only (privacy: never sends pages to cloud)
|
|
# rapid — force RapidOCR (local, ONNX; pip install rapidocr_onnxruntime)
|
|
# llm-vision — force LLM vision OCR (cloud; any OpenAI-compatible vision model)
|
|
# none — disable OCR entirely
|
|
# VIBE_TRADING_OCR_ENGINE=auto
|
|
# Override the model used for LLM vision OCR (defaults to LANGCHAIN_MODEL_NAME).
|
|
# Example: qwen3.7-plus, gpt-5.5, gemini-3.5-flash, claude-sonnet-4.6
|
|
# VIBE_TRADING_OCR_LLM_MODEL=
|
|
|
|
# Opt-in local market-data cache for backtest loaders (off by default).
|
|
# When enabled, every data source caches settled historical bars under
|
|
# ~/.vibe-trading/cache/loaders/ so repeated/long-horizon backtests skip the
|
|
# network. Only fully-elapsed days are cached (ranges ending today are always
|
|
# re-fetched). Clear it any time with: rm -rf ~/.vibe-trading/cache
|
|
# VIBE_TRADING_DATA_CACHE=1
|
|
|
|
# Opt-in background scheduler for saved research jobs (off by default).
|
|
# When enabled, the API server runs a background poller that fires due
|
|
# interval/cron scheduled-research jobs through the session runtime.
|
|
# VIBE_TRADING_ENABLE_SCHEDULER=1
|
|
|
|
# ============================================================================
|
|
# API Server (APIConfig, optional)
|
|
# ============================================================================
|
|
# Bearer token for API auth.
|
|
# Empty dev mode is loopback-only. Set this before exposing port 8899 beyond localhost.
|
|
# API_AUTH_KEY=
|
|
# CORS allowed origins (comma-separated)
|
|
# CORS_ORIGINS=http://localhost:3000,http://localhost:5173,http://localhost:8000
|
|
# Enable session runtime
|
|
# ENABLE_SESSION_RUNTIME=true
|
|
# Docker compose sets this together with a 127.0.0.1 port bind so browser
|
|
# requests from the host machine still count as local dev-mode access.
|
|
# Do not enable this when publishing port 8899 on 0.0.0.0 without API_AUTH_KEY.
|
|
# VIBE_TRADING_TRUST_DOCKER_LOOPBACK=0
|
|
# Advanced local-only opt-in: expose shell execution tools to the agent.
|
|
# VIBE_TRADING_ENABLE_SHELL_TOOLS=0
|
|
# Optional import roots for read_document/analyze_trade_journal.
|
|
# Use comma-separated absolute paths. Defaults include agent/uploads, agent/runs,
|
|
# ./uploads, ./data, ~/.vibe-trading/uploads, and ~/.vibe-trading/imports.
|
|
# VIBE_TRADING_ALLOWED_FILE_ROOTS=
|
|
# Optional run roots for generated-code tools such as write_file/backtest.
|
|
# Defaults include agent/runs, ./runs, and ~/.vibe-trading/shadow_runs.
|
|
# VIBE_TRADING_ALLOWED_RUN_ROOTS=
|
|
|
|
# ============================================================================
|
|
# Agent Tuning (AgentTuningConfig, optional, defaults are sensible)
|
|
# ============================================================================
|
|
# SWARM_WORKER_TIMEOUT=300
|
|
# SWARM_WORKER_MAX_ITER=50
|
|
# SWARM_MAX_WORKERS=4
|
|
# SWARM_TIMEOUT=1800
|
|
# SUBAGENT_TIMEOUT=300
|
|
# SUBAGENT_MAX_ITER=25
|
|
# TOKEN_THRESHOLD=40000
|
|
# Hard timeout (seconds) for read-only tool execution; write tools only warn.
|
|
# Default 1800; set 0 to disable.
|
|
# VIBE_TRADING_TOOL_TIMEOUT_SECONDS=1800
|
|
# Frontend SSE idle timeout in seconds before showing "Execution timed out".
|
|
# Increase when using slow local models (e.g. Ollama on CPU/limited VRAM).
|
|
# VIBE_TRADING_SSE_TIMEOUT=90
|
|
# Content filter warning threshold (default: 0.05 = 5%)
|
|
# When the ratio of LLM responses blocked by content moderation exceeds this
|
|
# threshold, the run card will warn you to switch providers.
|
|
# CONTENT_FILTER_WARNING_THRESHOLD=0.05
|
|
|
|
# ============================================================================
|
|
# Memory System (optional, OFF by default)
|
|
# ============================================================================
|
|
# One-line preset (recommended):
|
|
# off = no lifecycle management (default)
|
|
# on = quality scoring + auto-decay + garbage collection
|
|
# full = on + hierarchy + semantic links + compression + FTS search
|
|
# VT_MEMORY=off
|
|
|
|
# Advanced: override individual features (takes priority over VT_MEMORY)
|
|
# VT_MEMORY_QUALITY=true
|
|
# VT_MEMORY_DECAY=true
|
|
# VT_MEMORY_GC=true
|
|
# VT_MEMORY_HIERARCHY=true
|
|
# VT_MEMORY_LINKS=true
|
|
# VT_MEMORY_COMPRESSION=true
|
|
# VT_MEMORY_FTS_INDEX=true
|
|
|
|
# ============================================================================
|
|
# TAP Mode — credential isolation for broker orders (optional, OFF by default)
|
|
# ============================================================================
|
|
# Route Alpaca order placement through the TAP proxy (https://tap.human.tech)
|
|
# instead of the local broker SDK: the agent process holds no Alpaca key, and
|
|
# every order is held for HUMAN APPROVAL before it reaches the broker. Leave
|
|
# these unset for the default (direct broker SDK) behaviour.
|
|
#
|
|
# Setup: in the TAP dashboard create a multi-secret credential named `alpaca`
|
|
# with fields `key_id` + `secret_key`, allowed host `paper-api.alpaca.markets`,
|
|
# assigned to your agent. See the README "TAP Mode" section for details.
|
|
#
|
|
# TAP_PROXY_URL=https://proxy.tap.human.tech
|
|
# TAP_AGENT_KEY=your-tap-agent-key
|
|
# Credential name configured in TAP (default: alpaca)
|
|
# TAP_ALPACA_CREDENTIAL=alpaca
|
|
# Seconds to wait for a human approval decision (default: 300)
|
|
# TAP_APPROVAL_TIMEOUT=300
|