ragxpy 0.1.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- ragxpy-0.1.0/.github/ISSUE_TEMPLATE/bug_report.yml +70 -0
- ragxpy-0.1.0/.github/ISSUE_TEMPLATE/feature_request.yml +47 -0
- ragxpy-0.1.0/.github/PULL_REQUEST_TEMPLATE.md +20 -0
- ragxpy-0.1.0/.github/workflows/ci.yml +61 -0
- ragxpy-0.1.0/.github/workflows/release.yml +67 -0
- ragxpy-0.1.0/.gitignore +18 -0
- ragxpy-0.1.0/.readthedocs.yml +17 -0
- ragxpy-0.1.0/CHANGELOG.md +72 -0
- ragxpy-0.1.0/CODE_OF_CONDUCT.md +26 -0
- ragxpy-0.1.0/CONTRIBUTING.md +75 -0
- ragxpy-0.1.0/LICENSE +21 -0
- ragxpy-0.1.0/PKG-INFO +226 -0
- ragxpy-0.1.0/README.md +164 -0
- ragxpy-0.1.0/SECURITY.md +33 -0
- ragxpy-0.1.0/TRACKER.md +72 -0
- ragxpy-0.1.0/docs/api/config.md +35 -0
- ragxpy-0.1.0/docs/api/rag.md +20 -0
- ragxpy-0.1.0/docs/changelog.md +23 -0
- ragxpy-0.1.0/docs/contributing.md +40 -0
- ragxpy-0.1.0/docs/getting-started.md +189 -0
- ragxpy-0.1.0/docs/guides/agent-tools.md +216 -0
- ragxpy-0.1.0/docs/guides/cli.md +134 -0
- ragxpy-0.1.0/docs/guides/evaluation.md +149 -0
- ragxpy-0.1.0/docs/guides/hybrid-search.md +93 -0
- ragxpy-0.1.0/docs/guides/streaming.md +128 -0
- ragxpy-0.1.0/docs/index.md +88 -0
- ragxpy-0.1.0/docs/stores.md +86 -0
- ragxpy-0.1.0/mkdocs.yml +67 -0
- ragxpy-0.1.0/pyproject.toml +92 -0
- ragxpy-0.1.0/src/cli/__init__.py +3 -0
- ragxpy-0.1.0/src/cli/main.py +62 -0
- ragxpy-0.1.0/src/cli/serve.py +98 -0
- ragxpy-0.1.0/src/ragxpy/__init__.py +21 -0
- ragxpy-0.1.0/src/ragxpy/agent.py +88 -0
- ragxpy-0.1.0/src/ragxpy/config.py +54 -0
- ragxpy-0.1.0/src/ragxpy/embedding/__init__.py +4 -0
- ragxpy-0.1.0/src/ragxpy/embedding/base.py +42 -0
- ragxpy-0.1.0/src/ragxpy/embedding/local.py +27 -0
- ragxpy-0.1.0/src/ragxpy/embedding/openai.py +46 -0
- ragxpy-0.1.0/src/ragxpy/eval/__init__.py +6 -0
- ragxpy-0.1.0/src/ragxpy/eval/chunks.py +75 -0
- ragxpy-0.1.0/src/ragxpy/eval/metrics.py +78 -0
- ragxpy-0.1.0/src/ragxpy/eval/schema.py +22 -0
- ragxpy-0.1.0/src/ragxpy/eval/tracer.py +64 -0
- ragxpy-0.1.0/src/ragxpy/generation/__init__.py +15 -0
- ragxpy-0.1.0/src/ragxpy/generation/cache.py +69 -0
- ragxpy-0.1.0/src/ragxpy/generation/llm.py +161 -0
- ragxpy-0.1.0/src/ragxpy/generation/prompts.py +56 -0
- ragxpy-0.1.0/src/ragxpy/indexing/__init__.py +4 -0
- ragxpy-0.1.0/src/ragxpy/indexing/base.py +48 -0
- ragxpy-0.1.0/src/ragxpy/indexing/lance.py +133 -0
- ragxpy-0.1.0/src/ragxpy/indexing/memory.py +91 -0
- ragxpy-0.1.0/src/ragxpy/indexing/pgvector.py +136 -0
- ragxpy-0.1.0/src/ragxpy/ingestion/__init__.py +22 -0
- ragxpy-0.1.0/src/ragxpy/ingestion/chunker.py +281 -0
- ragxpy-0.1.0/src/ragxpy/ingestion/document.py +28 -0
- ragxpy-0.1.0/src/ragxpy/ingestion/loader.py +154 -0
- ragxpy-0.1.0/src/ragxpy/pipeline.py +363 -0
- ragxpy-0.1.0/src/ragxpy/retrieval/__init__.py +4 -0
- ragxpy-0.1.0/src/ragxpy/retrieval/reranker.py +50 -0
- ragxpy-0.1.0/src/ragxpy/retrieval/search.py +74 -0
- ragxpy-0.1.0/src/ragxpy/retrieval/sufficiency.py +28 -0
- ragxpy-0.1.0/src/ragxpy/utils/__init__.py +4 -0
- ragxpy-0.1.0/src/ragxpy/utils/rrf.py +23 -0
- ragxpy-0.1.0/src/ragxpy/utils/tokens.py +38 -0
- ragxpy-0.1.0/tests/conftest.py +36 -0
- ragxpy-0.1.0/tests/fixtures/docs/guide.md +19 -0
- ragxpy-0.1.0/tests/fixtures/docs/sample.txt +5 -0
- ragxpy-0.1.0/tests/test_agent.py +59 -0
- ragxpy-0.1.0/tests/test_chunkers.py +260 -0
- ragxpy-0.1.0/tests/test_config.py +69 -0
- ragxpy-0.1.0/tests/test_document.py +67 -0
- ragxpy-0.1.0/tests/test_e2e.py +136 -0
- ragxpy-0.1.0/tests/test_embedders.py +107 -0
- ragxpy-0.1.0/tests/test_generation.py +291 -0
- ragxpy-0.1.0/tests/test_indexing.py +141 -0
- ragxpy-0.1.0/tests/test_loaders.py +268 -0
- ragxpy-0.1.0/tests/test_pipeline.py +567 -0
- ragxpy-0.1.0/tests/test_retrieval.py +100 -0
- ragxpy-0.1.0/tests/test_rrf.py +70 -0
- ragxpy-0.1.0/tests/test_scaffold.py +29 -0
- ragxpy-0.1.0/tests/test_tokens.py +51 -0
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
name: Bug Report
|
|
2
|
+
description: Something isn't working as expected
|
|
3
|
+
labels: ["bug"]
|
|
4
|
+
body:
|
|
5
|
+
- type: markdown
|
|
6
|
+
attributes:
|
|
7
|
+
value: "Thanks for taking the time to report a bug. Please fill in as much detail as possible."
|
|
8
|
+
|
|
9
|
+
- type: input
|
|
10
|
+
id: version
|
|
11
|
+
attributes:
|
|
12
|
+
label: ragx version
|
|
13
|
+
placeholder: "e.g. 0.1.0 — run: pip show ragx"
|
|
14
|
+
validations:
|
|
15
|
+
required: true
|
|
16
|
+
|
|
17
|
+
- type: input
|
|
18
|
+
id: python
|
|
19
|
+
attributes:
|
|
20
|
+
label: Python version
|
|
21
|
+
placeholder: "e.g. 3.11.9 — run: python --version"
|
|
22
|
+
validations:
|
|
23
|
+
required: true
|
|
24
|
+
|
|
25
|
+
- type: input
|
|
26
|
+
id: os
|
|
27
|
+
attributes:
|
|
28
|
+
label: Operating system
|
|
29
|
+
placeholder: "e.g. macOS 15, Ubuntu 24.04, Windows 11"
|
|
30
|
+
validations:
|
|
31
|
+
required: true
|
|
32
|
+
|
|
33
|
+
- type: dropdown
|
|
34
|
+
id: install
|
|
35
|
+
attributes:
|
|
36
|
+
label: How did you install ragx?
|
|
37
|
+
options:
|
|
38
|
+
- pip install ragx
|
|
39
|
+
- pip install -e . (editable)
|
|
40
|
+
- Other
|
|
41
|
+
validations:
|
|
42
|
+
required: true
|
|
43
|
+
|
|
44
|
+
- type: textarea
|
|
45
|
+
id: repro
|
|
46
|
+
attributes:
|
|
47
|
+
label: Minimal reproduction
|
|
48
|
+
description: The smallest snippet of code that reproduces the bug
|
|
49
|
+
render: python
|
|
50
|
+
placeholder: |
|
|
51
|
+
from ragx import RAG
|
|
52
|
+
async with RAG(llm="openai/gpt-4o-mini") as rag:
|
|
53
|
+
...
|
|
54
|
+
validations:
|
|
55
|
+
required: true
|
|
56
|
+
|
|
57
|
+
- type: textarea
|
|
58
|
+
id: expected
|
|
59
|
+
attributes:
|
|
60
|
+
label: Expected behaviour
|
|
61
|
+
validations:
|
|
62
|
+
required: true
|
|
63
|
+
|
|
64
|
+
- type: textarea
|
|
65
|
+
id: actual
|
|
66
|
+
attributes:
|
|
67
|
+
label: Actual behaviour
|
|
68
|
+
description: Include the full traceback if there is one
|
|
69
|
+
validations:
|
|
70
|
+
required: true
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
name: Feature Request
|
|
2
|
+
description: Suggest a new capability or improvement
|
|
3
|
+
labels: ["enhancement"]
|
|
4
|
+
body:
|
|
5
|
+
- type: markdown
|
|
6
|
+
attributes:
|
|
7
|
+
value: "Before opening a feature request, search existing issues and discussions to avoid duplicates."
|
|
8
|
+
|
|
9
|
+
- type: textarea
|
|
10
|
+
id: problem
|
|
11
|
+
attributes:
|
|
12
|
+
label: What problem does this solve?
|
|
13
|
+
description: Describe the gap or pain point you are experiencing
|
|
14
|
+
placeholder: "When I try to do X, I have to work around it by Y, which is tedious because..."
|
|
15
|
+
validations:
|
|
16
|
+
required: true
|
|
17
|
+
|
|
18
|
+
- type: textarea
|
|
19
|
+
id: solution
|
|
20
|
+
attributes:
|
|
21
|
+
label: Proposed solution
|
|
22
|
+
description: What API or behaviour would you like to see?
|
|
23
|
+
render: python
|
|
24
|
+
placeholder: |
|
|
25
|
+
async with RAG(chunker="contextual", ...) as rag:
|
|
26
|
+
...
|
|
27
|
+
validations:
|
|
28
|
+
required: true
|
|
29
|
+
|
|
30
|
+
- type: textarea
|
|
31
|
+
id: alternatives
|
|
32
|
+
attributes:
|
|
33
|
+
label: Alternatives considered
|
|
34
|
+
description: Other approaches you looked at and why they fell short
|
|
35
|
+
validations:
|
|
36
|
+
required: false
|
|
37
|
+
|
|
38
|
+
- type: dropdown
|
|
39
|
+
id: willing
|
|
40
|
+
attributes:
|
|
41
|
+
label: Would you be willing to implement this?
|
|
42
|
+
options:
|
|
43
|
+
- "Yes — I can open a PR"
|
|
44
|
+
- "Maybe — I could help if guided"
|
|
45
|
+
- "No — submitting for someone else to pick up"
|
|
46
|
+
validations:
|
|
47
|
+
required: true
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
## Summary
|
|
2
|
+
|
|
3
|
+
<!-- One or two sentences describing what this PR does and why. Link the related issue: "Closes #123" -->
|
|
4
|
+
|
|
5
|
+
Closes #
|
|
6
|
+
|
|
7
|
+
## Changes
|
|
8
|
+
|
|
9
|
+
<!-- Bullet list of what changed -->
|
|
10
|
+
|
|
11
|
+
-
|
|
12
|
+
|
|
13
|
+
## Checklist
|
|
14
|
+
|
|
15
|
+
- [ ] `pytest tests/ -x -q` passes locally
|
|
16
|
+
- [ ] `ruff check src/ --fix` — no remaining violations
|
|
17
|
+
- [ ] `mypy src/ragx/` — no errors
|
|
18
|
+
- [ ] New or changed behaviour has tests
|
|
19
|
+
- [ ] `CHANGELOG.md` updated under `[Unreleased]`
|
|
20
|
+
- [ ] Docstrings updated for any modified public API
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
name: CI
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
branches: [main]
|
|
6
|
+
pull_request:
|
|
7
|
+
branches: [main]
|
|
8
|
+
|
|
9
|
+
jobs:
|
|
10
|
+
test:
|
|
11
|
+
runs-on: ubuntu-latest
|
|
12
|
+
strategy:
|
|
13
|
+
matrix:
|
|
14
|
+
python-version: ["3.11", "3.12"]
|
|
15
|
+
|
|
16
|
+
steps:
|
|
17
|
+
- uses: actions/checkout@v4
|
|
18
|
+
|
|
19
|
+
- name: Set up Python ${{ matrix.python-version }}
|
|
20
|
+
uses: actions/setup-python@v5
|
|
21
|
+
with:
|
|
22
|
+
python-version: ${{ matrix.python-version }}
|
|
23
|
+
|
|
24
|
+
- name: Cache pip
|
|
25
|
+
uses: actions/cache@v4
|
|
26
|
+
with:
|
|
27
|
+
path: ~/.cache/pip
|
|
28
|
+
key: ${{ runner.os }}-pip-${{ hashFiles('pyproject.toml') }}
|
|
29
|
+
restore-keys: ${{ runner.os }}-pip-
|
|
30
|
+
|
|
31
|
+
- name: Install dependencies
|
|
32
|
+
run: pip install -e ".[dev]"
|
|
33
|
+
|
|
34
|
+
- name: Lint (ruff)
|
|
35
|
+
run: ruff check src/
|
|
36
|
+
|
|
37
|
+
- name: Type check (mypy)
|
|
38
|
+
run: mypy src/ragx/
|
|
39
|
+
|
|
40
|
+
- name: Test (pytest + coverage)
|
|
41
|
+
run: pytest tests/ -x -q --cov=src/ragx --cov-report=xml --cov-report=term-missing
|
|
42
|
+
|
|
43
|
+
- name: Upload coverage to Codecov
|
|
44
|
+
if: matrix.python-version == '3.11'
|
|
45
|
+
uses: codecov/codecov-action@v4
|
|
46
|
+
with:
|
|
47
|
+
file: coverage.xml
|
|
48
|
+
fail_ci_if_error: false
|
|
49
|
+
|
|
50
|
+
build:
|
|
51
|
+
runs-on: ubuntu-latest
|
|
52
|
+
needs: test
|
|
53
|
+
steps:
|
|
54
|
+
- uses: actions/checkout@v4
|
|
55
|
+
- uses: actions/setup-python@v5
|
|
56
|
+
with:
|
|
57
|
+
python-version: "3.11"
|
|
58
|
+
- name: Build wheel
|
|
59
|
+
run: pip install build && python -m build --wheel
|
|
60
|
+
- name: Check dist
|
|
61
|
+
run: pip install twine && twine check dist/*
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
name: Release
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
tags:
|
|
6
|
+
- "v*.*.*"
|
|
7
|
+
|
|
8
|
+
jobs:
|
|
9
|
+
build:
|
|
10
|
+
name: Build distribution
|
|
11
|
+
runs-on: ubuntu-latest
|
|
12
|
+
steps:
|
|
13
|
+
- uses: actions/checkout@v4
|
|
14
|
+
|
|
15
|
+
- uses: actions/setup-python@v5
|
|
16
|
+
with:
|
|
17
|
+
python-version: "3.11"
|
|
18
|
+
|
|
19
|
+
- name: Install build
|
|
20
|
+
run: pip install build
|
|
21
|
+
|
|
22
|
+
- name: Build wheel and sdist
|
|
23
|
+
run: python -m build
|
|
24
|
+
|
|
25
|
+
- name: Upload artifacts
|
|
26
|
+
uses: actions/upload-artifact@v4
|
|
27
|
+
with:
|
|
28
|
+
name: dist
|
|
29
|
+
path: dist/
|
|
30
|
+
|
|
31
|
+
publish-testpypi:
|
|
32
|
+
name: Publish to TestPyPI
|
|
33
|
+
needs: build
|
|
34
|
+
runs-on: ubuntu-latest
|
|
35
|
+
if: contains(github.ref, 'dev') || contains(github.ref, 'rc')
|
|
36
|
+
environment:
|
|
37
|
+
name: testpypi
|
|
38
|
+
url: https://test.pypi.org/p/ragx
|
|
39
|
+
permissions:
|
|
40
|
+
id-token: write
|
|
41
|
+
steps:
|
|
42
|
+
- uses: actions/download-artifact@v4
|
|
43
|
+
with:
|
|
44
|
+
name: dist
|
|
45
|
+
path: dist/
|
|
46
|
+
|
|
47
|
+
- uses: pypa/gh-action-pypi-publish@release/v1
|
|
48
|
+
with:
|
|
49
|
+
repository-url: https://test.pypi.org/legacy/
|
|
50
|
+
|
|
51
|
+
publish-pypi:
|
|
52
|
+
name: Publish to PyPI
|
|
53
|
+
needs: build
|
|
54
|
+
runs-on: ubuntu-latest
|
|
55
|
+
if: "!contains(github.ref, 'dev') && !contains(github.ref, 'rc')"
|
|
56
|
+
environment:
|
|
57
|
+
name: pypi
|
|
58
|
+
url: https://pypi.org/p/ragx
|
|
59
|
+
permissions:
|
|
60
|
+
id-token: write
|
|
61
|
+
steps:
|
|
62
|
+
- uses: actions/download-artifact@v4
|
|
63
|
+
with:
|
|
64
|
+
name: dist
|
|
65
|
+
path: dist/
|
|
66
|
+
|
|
67
|
+
- uses: pypa/gh-action-pypi-publish@release/v1
|
ragxpy-0.1.0/.gitignore
ADDED
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
All notable changes to ragx will be documented in this file.
|
|
4
|
+
|
|
5
|
+
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
|
|
6
|
+
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
7
|
+
|
|
8
|
+
## [Unreleased]
|
|
9
|
+
|
|
10
|
+
## [0.1.0] - 2026-04-16
|
|
11
|
+
|
|
12
|
+
### Added
|
|
13
|
+
|
|
14
|
+
**Hybrid search — on by default**
|
|
15
|
+
- `HybridSearcher` — fuses BM25 sparse search with dense vector search via Reciprocal Rank Fusion (RRF, k=60)
|
|
16
|
+
- `InMemoryStore` — numpy cosine + rank-bm25, zero dependencies, for development and tests
|
|
17
|
+
- `LanceDBStore` — embedded persistent store, no server required (`pip install ragx[lance]`)
|
|
18
|
+
- `PgVectorStore` — PostgreSQL + pgvector + native FTS hybrid search (`pip install ragx[postgres]`)
|
|
19
|
+
- `CrossEncoderReranker` — optional re-ranking step (`pip install ragx[local-emb]`)
|
|
20
|
+
- `SufficiencyChecker` — cosine-based check before calling the LLM
|
|
21
|
+
|
|
22
|
+
**Streaming**
|
|
23
|
+
- `rag.stream_query()` — async generator yielding tokens as they arrive; works with OpenAI, Anthropic, Ollama
|
|
24
|
+
- `StreamingLLMProtocol` — protocol for LLMs that support streaming; graceful fallback for custom LLMs
|
|
25
|
+
|
|
26
|
+
**Agent tools**
|
|
27
|
+
- `rag.search()` — public method returning raw `list[SearchResult]` for use as an agent tool
|
|
28
|
+
- `ragx.agent.as_claude_tool()` — Anthropic-compatible tool schema for Claude agents
|
|
29
|
+
- `ragx.agent.as_openai_tool()` — OpenAI-compatible function tool schema
|
|
30
|
+
- `SearchResult` exported from `ragx` top-level
|
|
31
|
+
|
|
32
|
+
**Multi-tenant isolation**
|
|
33
|
+
- `ingest(tenant_id=...)` — tag documents with a tenant identifier at ingest time
|
|
34
|
+
- `QueryConfig(tenant_id=..., allowed_sources=[...])` — filter results by tenant or source glob at query time
|
|
35
|
+
|
|
36
|
+
**Core pipeline**
|
|
37
|
+
- `RAG` async context manager — the 4-line API: `async with RAG(llm=...) as rag:`
|
|
38
|
+
- `RAGConfig`, `QueryConfig`, `Answer`, `IngestResult`, `Document`, `EvalSchema` typed dataclasses
|
|
39
|
+
- Incremental indexing — `ingest()` hashes each file and skips unchanged documents on re-runs
|
|
40
|
+
- `force=True` flag on `ingest()` to bypass incremental check
|
|
41
|
+
|
|
42
|
+
**Ingestion**
|
|
43
|
+
- `AutoLoader` — dispatches by file extension (`.txt`, `.md`, `.pdf`, `.html`)
|
|
44
|
+
- `TextLoader`, `MarkdownLoader` (extracts headings), `PDFLoader` (pypdf), `HTMLLoader` (bs4)
|
|
45
|
+
- Graceful per-file failure — a bad PDF is captured in `IngestResult.errors`, never raises
|
|
46
|
+
- `RecursiveChunker` — Chonkie-backed, 512-token default, benchmark winner (69% E2E accuracy, FloTorch Feb 2026)
|
|
47
|
+
- `StructureAwareChunker` — splits at Markdown/HTML headings before recursive chunking
|
|
48
|
+
- `ContextualChunker` — prepends LLM-generated context summary per chunk, bounded concurrency
|
|
49
|
+
- `HierarchicalChunker` — small child chunks for retrieval, parent text stored for generation
|
|
50
|
+
|
|
51
|
+
**Generation**
|
|
52
|
+
- `LLMProtocol` + `resolve_llm()` — string shorthand: `"openai/gpt-4o-mini"`, `"anthropic/claude-haiku-4-5"`, `"ollama/llama3"`
|
|
53
|
+
- `OpenAILLM`, `AnthropicLLM`, `OllamaLLM` — all async, lazy client init
|
|
54
|
+
- `LLMCache` — in-memory cache with optional Redis backend; SHA-256 keyed
|
|
55
|
+
|
|
56
|
+
**Evaluation**
|
|
57
|
+
- `EvalSchema` — unified dataclass: faithfulness, answer_relevance, context_recall, context_precision, latency_ms
|
|
58
|
+
- `rag.eval(dataset)` — RAGAS wrapper (`pip install ragx[eval]`)
|
|
59
|
+
- `assert_eval_passes(scores, ...)` — pytest helper for CI quality gates
|
|
60
|
+
- `LangfuseTracer` — production tracing via Langfuse (`pip install ragx[eval]`)
|
|
61
|
+
|
|
62
|
+
**Embedding**
|
|
63
|
+
- `OpenAIEmbedder` — async, batched, lazy client init
|
|
64
|
+
- `SentenceTransformerEmbedder` — offline, thread-pool inference (`pip install ragx[local-emb]`)
|
|
65
|
+
- `resolve_embedder()` — string shorthand: `"openai/text-embedding-3-small"`, `"local/all-MiniLM-L6-v2"`
|
|
66
|
+
|
|
67
|
+
**CLI**
|
|
68
|
+
- `ragxpy init` — generates `ragx_config.py` with typed defaults and inline comments
|
|
69
|
+
- `ragxpy serve` — Starlette HTTP API on `localhost:8000` with `/health`, `/query`, `/ingest` (`pip install ragx[serve]`)
|
|
70
|
+
|
|
71
|
+
[Unreleased]: https://github.com/laxmikanta415/ragx/compare/v0.1.0...HEAD
|
|
72
|
+
[0.1.0]: https://github.com/laxmikanta415/ragx/releases/tag/v0.1.0
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
# Code of Conduct
|
|
2
|
+
|
|
3
|
+
## Our commitment
|
|
4
|
+
|
|
5
|
+
ragx is an open, welcoming project. Everyone who participates — through issues, PRs, discussions, or any other channel — is expected to treat others with respect and good faith.
|
|
6
|
+
|
|
7
|
+
## Expected behaviour
|
|
8
|
+
|
|
9
|
+
- Be constructive and specific in feedback
|
|
10
|
+
- Assume good intent; ask for clarification before criticising
|
|
11
|
+
- Accept that maintainers have final say on design decisions
|
|
12
|
+
- Keep discussions focused on the technical matter at hand
|
|
13
|
+
|
|
14
|
+
## Unacceptable behaviour
|
|
15
|
+
|
|
16
|
+
- Personal attacks, insults, or harassment of any kind
|
|
17
|
+
- Posting others' private information without permission
|
|
18
|
+
- Sustained disruption of discussions
|
|
19
|
+
|
|
20
|
+
## Reporting
|
|
21
|
+
|
|
22
|
+
If you experience or witness behaviour that violates this policy, email **lax@insummary.com** with subject `[CoC] ragx`. All reports are handled confidentially. We aim to respond within 72 hours.
|
|
23
|
+
|
|
24
|
+
## Enforcement
|
|
25
|
+
|
|
26
|
+
Maintainers may remove comments, close issues, or ban contributors who repeatedly or severely violate these expectations.
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
# Contributing to ragx
|
|
2
|
+
|
|
3
|
+
Thank you for your interest in contributing! This guide covers everything you need to get started.
|
|
4
|
+
|
|
5
|
+
## Development setup
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
git clone https://github.com/laxmikanta415/ragx.git
|
|
9
|
+
cd ragx
|
|
10
|
+
python -m venv .venv && source .venv/bin/activate # Windows: .venv\Scripts\activate
|
|
11
|
+
pip install -e ".[dev]"
|
|
12
|
+
```
|
|
13
|
+
|
|
14
|
+
Verify your setup:
|
|
15
|
+
|
|
16
|
+
```bash
|
|
17
|
+
python -m pytest tests/ -x -q # all tests pass
|
|
18
|
+
python -m ruff check src/ # no lint errors
|
|
19
|
+
python -m mypy src/ragx/ # no type errors
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
## Branch naming
|
|
23
|
+
|
|
24
|
+
| Type | Prefix | Example |
|
|
25
|
+
|------|--------|---------|
|
|
26
|
+
| New feature | `feature/` | `feature/streaming-responses` |
|
|
27
|
+
| Bug fix | `fix/` | `fix/lance-fts-index` |
|
|
28
|
+
| Documentation | `docs/` | `docs/evaluation-guide` |
|
|
29
|
+
| Chore / deps | `chore/` | `chore/bump-chonkie` |
|
|
30
|
+
|
|
31
|
+
All PRs target `main`.
|
|
32
|
+
|
|
33
|
+
## Commit style
|
|
34
|
+
|
|
35
|
+
Use the imperative mood. Reference the issue number if one exists.
|
|
36
|
+
|
|
37
|
+
```
|
|
38
|
+
add HyPE pre-indexing to HybridSearcher (#42)
|
|
39
|
+
fix incremental ingest skipping on Windows paths (#38)
|
|
40
|
+
docs: add PostgreSQL production guide
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
## Before submitting a PR
|
|
44
|
+
|
|
45
|
+
- [ ] `pytest tests/ -x -q` passes
|
|
46
|
+
- [ ] `ruff check src/ --fix` — no remaining violations
|
|
47
|
+
- [ ] `mypy src/ragx/` — no errors
|
|
48
|
+
- [ ] New behaviour has tests
|
|
49
|
+
- [ ] `CHANGELOG.md` has an entry under `[Unreleased]`
|
|
50
|
+
- [ ] PR description links the related issue
|
|
51
|
+
|
|
52
|
+
## Adding a new store backend
|
|
53
|
+
|
|
54
|
+
1. Subclass `VectorStore` in `src/ragx/indexing/base.py`
|
|
55
|
+
2. Implement all five abstract methods: `upsert`, `dense_search`, `sparse_search`, `delete`, `get_indexed_sources`
|
|
56
|
+
3. Guard the optional import with `try/except ImportError`
|
|
57
|
+
4. Add a string shorthand to `_resolve_store()` in `src/ragx/pipeline.py`
|
|
58
|
+
5. Add tests in `tests/test_indexing.py`
|
|
59
|
+
6. Document the new store in `docs/stores.md`
|
|
60
|
+
|
|
61
|
+
## Running only specific tests
|
|
62
|
+
|
|
63
|
+
```bash
|
|
64
|
+
pytest tests/test_pipeline.py -x -q # pipeline only
|
|
65
|
+
pytest tests/ -k "test_rag_query" -v # by name pattern
|
|
66
|
+
pytest tests/ --co -q # list collected tests
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
## Reporting bugs
|
|
70
|
+
|
|
71
|
+
Please open an issue using the [bug report template](https://github.com/laxmikanta415/ragx/issues/new?template=bug_report.yml).
|
|
72
|
+
|
|
73
|
+
## Questions
|
|
74
|
+
|
|
75
|
+
Open a [GitHub Discussion](https://github.com/laxmikanta415/ragx/discussions) in the Q&A category.
|
ragxpy-0.1.0/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Laxmikanta (lax@insummary.com)
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|