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.
Files changed (82) hide show
  1. ragxpy-0.1.0/.github/ISSUE_TEMPLATE/bug_report.yml +70 -0
  2. ragxpy-0.1.0/.github/ISSUE_TEMPLATE/feature_request.yml +47 -0
  3. ragxpy-0.1.0/.github/PULL_REQUEST_TEMPLATE.md +20 -0
  4. ragxpy-0.1.0/.github/workflows/ci.yml +61 -0
  5. ragxpy-0.1.0/.github/workflows/release.yml +67 -0
  6. ragxpy-0.1.0/.gitignore +18 -0
  7. ragxpy-0.1.0/.readthedocs.yml +17 -0
  8. ragxpy-0.1.0/CHANGELOG.md +72 -0
  9. ragxpy-0.1.0/CODE_OF_CONDUCT.md +26 -0
  10. ragxpy-0.1.0/CONTRIBUTING.md +75 -0
  11. ragxpy-0.1.0/LICENSE +21 -0
  12. ragxpy-0.1.0/PKG-INFO +226 -0
  13. ragxpy-0.1.0/README.md +164 -0
  14. ragxpy-0.1.0/SECURITY.md +33 -0
  15. ragxpy-0.1.0/TRACKER.md +72 -0
  16. ragxpy-0.1.0/docs/api/config.md +35 -0
  17. ragxpy-0.1.0/docs/api/rag.md +20 -0
  18. ragxpy-0.1.0/docs/changelog.md +23 -0
  19. ragxpy-0.1.0/docs/contributing.md +40 -0
  20. ragxpy-0.1.0/docs/getting-started.md +189 -0
  21. ragxpy-0.1.0/docs/guides/agent-tools.md +216 -0
  22. ragxpy-0.1.0/docs/guides/cli.md +134 -0
  23. ragxpy-0.1.0/docs/guides/evaluation.md +149 -0
  24. ragxpy-0.1.0/docs/guides/hybrid-search.md +93 -0
  25. ragxpy-0.1.0/docs/guides/streaming.md +128 -0
  26. ragxpy-0.1.0/docs/index.md +88 -0
  27. ragxpy-0.1.0/docs/stores.md +86 -0
  28. ragxpy-0.1.0/mkdocs.yml +67 -0
  29. ragxpy-0.1.0/pyproject.toml +92 -0
  30. ragxpy-0.1.0/src/cli/__init__.py +3 -0
  31. ragxpy-0.1.0/src/cli/main.py +62 -0
  32. ragxpy-0.1.0/src/cli/serve.py +98 -0
  33. ragxpy-0.1.0/src/ragxpy/__init__.py +21 -0
  34. ragxpy-0.1.0/src/ragxpy/agent.py +88 -0
  35. ragxpy-0.1.0/src/ragxpy/config.py +54 -0
  36. ragxpy-0.1.0/src/ragxpy/embedding/__init__.py +4 -0
  37. ragxpy-0.1.0/src/ragxpy/embedding/base.py +42 -0
  38. ragxpy-0.1.0/src/ragxpy/embedding/local.py +27 -0
  39. ragxpy-0.1.0/src/ragxpy/embedding/openai.py +46 -0
  40. ragxpy-0.1.0/src/ragxpy/eval/__init__.py +6 -0
  41. ragxpy-0.1.0/src/ragxpy/eval/chunks.py +75 -0
  42. ragxpy-0.1.0/src/ragxpy/eval/metrics.py +78 -0
  43. ragxpy-0.1.0/src/ragxpy/eval/schema.py +22 -0
  44. ragxpy-0.1.0/src/ragxpy/eval/tracer.py +64 -0
  45. ragxpy-0.1.0/src/ragxpy/generation/__init__.py +15 -0
  46. ragxpy-0.1.0/src/ragxpy/generation/cache.py +69 -0
  47. ragxpy-0.1.0/src/ragxpy/generation/llm.py +161 -0
  48. ragxpy-0.1.0/src/ragxpy/generation/prompts.py +56 -0
  49. ragxpy-0.1.0/src/ragxpy/indexing/__init__.py +4 -0
  50. ragxpy-0.1.0/src/ragxpy/indexing/base.py +48 -0
  51. ragxpy-0.1.0/src/ragxpy/indexing/lance.py +133 -0
  52. ragxpy-0.1.0/src/ragxpy/indexing/memory.py +91 -0
  53. ragxpy-0.1.0/src/ragxpy/indexing/pgvector.py +136 -0
  54. ragxpy-0.1.0/src/ragxpy/ingestion/__init__.py +22 -0
  55. ragxpy-0.1.0/src/ragxpy/ingestion/chunker.py +281 -0
  56. ragxpy-0.1.0/src/ragxpy/ingestion/document.py +28 -0
  57. ragxpy-0.1.0/src/ragxpy/ingestion/loader.py +154 -0
  58. ragxpy-0.1.0/src/ragxpy/pipeline.py +363 -0
  59. ragxpy-0.1.0/src/ragxpy/retrieval/__init__.py +4 -0
  60. ragxpy-0.1.0/src/ragxpy/retrieval/reranker.py +50 -0
  61. ragxpy-0.1.0/src/ragxpy/retrieval/search.py +74 -0
  62. ragxpy-0.1.0/src/ragxpy/retrieval/sufficiency.py +28 -0
  63. ragxpy-0.1.0/src/ragxpy/utils/__init__.py +4 -0
  64. ragxpy-0.1.0/src/ragxpy/utils/rrf.py +23 -0
  65. ragxpy-0.1.0/src/ragxpy/utils/tokens.py +38 -0
  66. ragxpy-0.1.0/tests/conftest.py +36 -0
  67. ragxpy-0.1.0/tests/fixtures/docs/guide.md +19 -0
  68. ragxpy-0.1.0/tests/fixtures/docs/sample.txt +5 -0
  69. ragxpy-0.1.0/tests/test_agent.py +59 -0
  70. ragxpy-0.1.0/tests/test_chunkers.py +260 -0
  71. ragxpy-0.1.0/tests/test_config.py +69 -0
  72. ragxpy-0.1.0/tests/test_document.py +67 -0
  73. ragxpy-0.1.0/tests/test_e2e.py +136 -0
  74. ragxpy-0.1.0/tests/test_embedders.py +107 -0
  75. ragxpy-0.1.0/tests/test_generation.py +291 -0
  76. ragxpy-0.1.0/tests/test_indexing.py +141 -0
  77. ragxpy-0.1.0/tests/test_loaders.py +268 -0
  78. ragxpy-0.1.0/tests/test_pipeline.py +567 -0
  79. ragxpy-0.1.0/tests/test_retrieval.py +100 -0
  80. ragxpy-0.1.0/tests/test_rrf.py +70 -0
  81. ragxpy-0.1.0/tests/test_scaffold.py +29 -0
  82. 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
@@ -0,0 +1,18 @@
1
+ __pycache__/
2
+ *.py[cod]
3
+ *.egg-info/
4
+ dist/
5
+ build/
6
+ .venv/
7
+ venv/
8
+ .env
9
+ *.env
10
+ .mypy_cache/
11
+ .ruff_cache/
12
+ .pytest_cache/
13
+ htmlcov/
14
+ .coverage
15
+ ragx-index/
16
+ *.lance/
17
+ .claude/
18
+ ragx_config.py
@@ -0,0 +1,17 @@
1
+ version: 2
2
+
3
+ build:
4
+ os: ubuntu-24.04
5
+ tools:
6
+ python: "3.11"
7
+
8
+ mkdocs:
9
+ configuration: mkdocs.yml
10
+
11
+ python:
12
+ install:
13
+ - method: pip
14
+ path: .
15
+ extra_requirements:
16
+ - docs
17
+ - dev
@@ -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.