Parser-backed code-context compression using Tree-sitter
Project description
HASTE
Parser-backed code-context compression for Python using Tree-sitter. It builds a structured index of functions/classes, ranks relevant functions for a free‑form query with lexical BM25 (optionally fused with semantic embeddings), expands along the call graph, then assembles a compact, LLM-ready payload. A minimal CLI is included for single-file workflows; the library API supports repository-level indexing and hybrid selection.
Import name is now haste.
Key features
- Hybrid retrieval: BM25 over rich function docs; optional semantic fusion
- Strict top‑k seed selection, BFS expansion over callers/callees
- Identifier TF‑IDF, PageRank on call graph, structure/complexity features
- CAST chunking: byte‑safe, newline‑aligned split/merge with token caps
- JSON payload with selected functions/classes and optional code blob
Installation
Using Poetry (recommended)
poetry install
Using pip
python -m venv .venv
. .venv/Scripts/Activate.ps1 # Windows PowerShell
pip install -e .
From PyPI (when published)
pip install haste
Python 3.11+ is required. Core runtime dependencies are declared in pyproject.toml (notably: tree-sitter, tree-sitter-language-pack, tiktoken, numpy, rank-bm25, openai).
Optional: set your OpenAI API key when using semantic reranking or embeddings-backed flows.
$env:OPENAI_API_KEY = "your_key_here" # Windows PowerShell
Quickstart (programmatic)
Use the single-import public API facade for end-to-end flows:
from haste import select_from_file, build_payload_from_repo
# Single file, mirrors CLI output structure (nodes/classes/selected/code)
out = select_from_file(
"path/to/file.py",
query="find dataloader and training loop",
top_k=6,
bfs_depth=1,
)
print(out["nodes"][:2])
print(out["code"][:500])
# Repository-level payload (index the tree and select relevant code)
payload = build_payload_from_repo(
"path/to/repo",
include_code=True,
top_k=50,
depth=1,
query="http handler metrics",
)
This reduces import boilerplate and keeps a stable, public surface.
CLI (single Python file)
The minimal CLI operates on a single .py file and prints JSON.
haste path\to\file.py --query "find dataloader and training loop" \
--top-k 6 --prefilter 300 --bfs-depth 1 --max-add 12 \
--hard-cap 1200 --soft-cap 1800 [--semantic] [--sem-model text-embedding-3-small]
Flags:
--query(required): free‑form text--top-k: seed size (default 6)--prefilter: lexical candidate pool before rerank (default 300)--bfs-depth: expansion hops over same‑module call edges (default 1)--max-add: cap on nodes added by BFS (default 12)--semantic: enable OpenAI embeddings rerank (requiresOPENAI_API_KEY)--sem-model: embeddings model (defaulttext-embedding-3-small)--hard-cap,--soft-cap: CAST token caps used during chunk split/merge
Example output shape:
{
"summary": {"total_functions": 12, "total_classes": 3},
"nodes": [ {"type": "function", "name": "train", "qname": "module::train", "path": "...", "lineno": 10, "end_lineno": 120, "signature": "train(cfg)", "docstring": "...", "score": 0.71} ],
"classes": [ {"type": "class", "name": "DataLoader", "qname": "module::DataLoader", "path": "..."} ],
"selected": {"roots": ["module::train"], "functions": ["module::train", "module::step"], "classes": ["module::DataLoader"]},
"code": "...stitched code under token caps..."
}
Also runnable from source without installing the script:
python -m haste.cli path\to\file.py --query "..."
Advanced usage (lower-level building blocks)
If you need full control, the lower-level modules remain available (indexing, metrics, selection, assembly). See haste.index, haste.metrics, and haste.selection for granular APIs.
How it works
- Index with Tree‑sitter: collect functions/classes, call edges, decorators, docstrings, variables, and module API hints
- Score: compute PageRank on the call graph; TF‑IDF over identifiers; cyclomatic complexity and structure richness
- Retrieve: BM25 over rich function docs; optionally fuse semantic rankings via embeddings + RRF
- Select: enforce strict top‑k seeds; expand via BFS over callers/callees; re‑rank by fused score
- Compress: CAST split/merge spans with hard/soft token caps; stitch to a contiguous code blob
Requirements & notes
- Python 3.11+
- Tree‑sitter runtime and
tree-sitter-language-packfor Python - OpenAI API key only needed for
--semanticor when usingOpenAIEmbedder - This README intentionally ignores
pipeline.py,reports/, and ad‑hoc test scripts, which were used only for internal metrics.
Contributing
PRs welcome. Use Poetry for the dev environment (poetry install). Run linters/formatters as you normally would; keep public API changes minimal and documented.
License
MIT. See file headers (SPDX identifiers). Add a LICENSE file if distributing publicly.
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file hastecontext-0.1.0.tar.gz.
File metadata
- Download URL: hastecontext-0.1.0.tar.gz
- Upload date:
- Size: 30.4 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.6
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
44aa45eb39525a10aeca2871675b5bf2780b2dcacdce944558b3ee021ecf3579
|
|
| MD5 |
aec9bf1a24787eb7626093f14019ff44
|
|
| BLAKE2b-256 |
ad8a48509e6610141a37348a8a3ade1b17f5169c889c86c3f3f155bccfbe9993
|
File details
Details for the file hastecontext-0.1.0-py3-none-any.whl.
File metadata
- Download URL: hastecontext-0.1.0-py3-none-any.whl
- Upload date:
- Size: 41.0 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.6
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
62223312b7e1b0ff78c09753b00b65add131a898102c979467a9091e837ea107
|
|
| MD5 |
faadce8a3606b5aeedb02d8ff82983bf
|
|
| BLAKE2b-256 |
77474cf0c9510e0d9260fd1bef683602a6182da32c9e55a57f312aed12369ad1
|