pykel 1.0.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 (185) hide show
  1. pykel-1.0.0/.github/ISSUE_TEMPLATE/bug_report.md +29 -0
  2. pykel-1.0.0/.github/ISSUE_TEMPLATE/config.yml +5 -0
  3. pykel-1.0.0/.github/ISSUE_TEMPLATE/feature_request.md +23 -0
  4. pykel-1.0.0/.github/PULL_REQUEST_TEMPLATE.md +16 -0
  5. pykel-1.0.0/.github/dependabot.yml +12 -0
  6. pykel-1.0.0/.github/workflows/ci.yml +46 -0
  7. pykel-1.0.0/.github/workflows/security.yml +92 -0
  8. pykel-1.0.0/.gitignore +8 -0
  9. pykel-1.0.0/CHANGELOG.md +33 -0
  10. pykel-1.0.0/CODE_OF_CONDUCT.md +54 -0
  11. pykel-1.0.0/CONTRIBUTING.md +51 -0
  12. pykel-1.0.0/DESIGN.md +347 -0
  13. pykel-1.0.0/LICENSE +21 -0
  14. pykel-1.0.0/PKG-INFO +202 -0
  15. pykel-1.0.0/README.md +99 -0
  16. pykel-1.0.0/SECURITY.md +46 -0
  17. pykel-1.0.0/USAGE.md +749 -0
  18. pykel-1.0.0/examples/01_tool_and_rag_agent.py +94 -0
  19. pykel-1.0.0/examples/02_multi_agent_pipeline.py +52 -0
  20. pykel-1.0.0/pyproject.toml +129 -0
  21. pykel-1.0.0/src/kel/__init__.py +47 -0
  22. pykel-1.0.0/src/kel/agents/__init__.py +14 -0
  23. pykel-1.0.0/src/kel/agents/agent.py +160 -0
  24. pykel-1.0.0/src/kel/agents/events.py +18 -0
  25. pykel-1.0.0/src/kel/agents/orchestration.py +133 -0
  26. pykel-1.0.0/src/kel/agents/tool.py +20 -0
  27. pykel-1.0.0/src/kel/brain/__init__.py +16 -0
  28. pykel-1.0.0/src/kel/brain/brain.py +56 -0
  29. pykel-1.0.0/src/kel/brain/loop_control.py +22 -0
  30. pykel-1.0.0/src/kel/brain/router.py +75 -0
  31. pykel-1.0.0/src/kel/brain/scheduler.py +44 -0
  32. pykel-1.0.0/src/kel/brain/types.py +12 -0
  33. pykel-1.0.0/src/kel/budget/__init__.py +15 -0
  34. pykel-1.0.0/src/kel/budget/budgeted.py +55 -0
  35. pykel-1.0.0/src/kel/budget/errors.py +11 -0
  36. pykel-1.0.0/src/kel/budget/pricing.py +29 -0
  37. pykel-1.0.0/src/kel/budget/tracker.py +74 -0
  38. pykel-1.0.0/src/kel/budget/types.py +27 -0
  39. pykel-1.0.0/src/kel/caching/__init__.py +11 -0
  40. pykel-1.0.0/src/kel/caching/cache.py +53 -0
  41. pykel-1.0.0/src/kel/caching/cached.py +101 -0
  42. pykel-1.0.0/src/kel/caching/key.py +36 -0
  43. pykel-1.0.0/src/kel/context/__init__.py +18 -0
  44. pykel-1.0.0/src/kel/context/errors.py +19 -0
  45. pykel-1.0.0/src/kel/context/eviction.py +41 -0
  46. pykel-1.0.0/src/kel/context/loop.py +64 -0
  47. pykel-1.0.0/src/kel/context/tokens.py +26 -0
  48. pykel-1.0.0/src/kel/context/window.py +51 -0
  49. pykel-1.0.0/src/kel/heal/__init__.py +15 -0
  50. pykel-1.0.0/src/kel/heal/diagnoser.py +51 -0
  51. pykel-1.0.0/src/kel/heal/errors.py +12 -0
  52. pykel-1.0.0/src/kel/heal/healer.py +74 -0
  53. pykel-1.0.0/src/kel/heal/learning.py +19 -0
  54. pykel-1.0.0/src/kel/heal/types.py +20 -0
  55. pykel-1.0.0/src/kel/memory/__init__.py +18 -0
  56. pykel-1.0.0/src/kel/memory/consolidation.py +29 -0
  57. pykel-1.0.0/src/kel/memory/episodic.py +53 -0
  58. pykel-1.0.0/src/kel/memory/memory.py +33 -0
  59. pykel-1.0.0/src/kel/memory/procedural.py +30 -0
  60. pykel-1.0.0/src/kel/memory/semantic.py +70 -0
  61. pykel-1.0.0/src/kel/memory/working.py +13 -0
  62. pykel-1.0.0/src/kel/models/__init__.py +57 -0
  63. pykel-1.0.0/src/kel/models/base.py +88 -0
  64. pykel-1.0.0/src/kel/models/errors.py +31 -0
  65. pykel-1.0.0/src/kel/models/providers/__init__.py +0 -0
  66. pykel-1.0.0/src/kel/models/providers/anthropic.py +277 -0
  67. pykel-1.0.0/src/kel/models/providers/cohere.py +399 -0
  68. pykel-1.0.0/src/kel/models/providers/gemini.py +347 -0
  69. pykel-1.0.0/src/kel/models/providers/mistral.py +266 -0
  70. pykel-1.0.0/src/kel/models/providers/openai.py +380 -0
  71. pykel-1.0.0/src/kel/models/registry.py +191 -0
  72. pykel-1.0.0/src/kel/models/structured.py +132 -0
  73. pykel-1.0.0/src/kel/models/types.py +126 -0
  74. pykel-1.0.0/src/kel/monitoring/__init__.py +4 -0
  75. pykel-1.0.0/src/kel/monitoring/dashboard.py +139 -0
  76. pykel-1.0.0/src/kel/monitoring/metrics.py +116 -0
  77. pykel-1.0.0/src/kel/observability/__init__.py +17 -0
  78. pykel-1.0.0/src/kel/observability/instrumented.py +59 -0
  79. pykel-1.0.0/src/kel/observability/otel.py +58 -0
  80. pykel-1.0.0/src/kel/observability/sinks.py +43 -0
  81. pykel-1.0.0/src/kel/observability/tracer.py +93 -0
  82. pykel-1.0.0/src/kel/observability/types.py +17 -0
  83. pykel-1.0.0/src/kel/prompting/__init__.py +13 -0
  84. pykel-1.0.0/src/kel/prompting/cot.py +23 -0
  85. pykel-1.0.0/src/kel/prompting/few_shot.py +29 -0
  86. pykel-1.0.0/src/kel/prompting/react.py +30 -0
  87. pykel-1.0.0/src/kel/py.typed +0 -0
  88. pykel-1.0.0/src/kel/ratelimit/__init__.py +4 -0
  89. pykel-1.0.0/src/kel/ratelimit/limiter.py +71 -0
  90. pykel-1.0.0/src/kel/ratelimit/rate_limited.py +43 -0
  91. pykel-1.0.0/src/kel/realtime/__init__.py +9 -0
  92. pykel-1.0.0/src/kel/realtime/dual_path.py +31 -0
  93. pykel-1.0.0/src/kel/realtime/providers.py +26 -0
  94. pykel-1.0.0/src/kel/retrieval/__init__.py +20 -0
  95. pykel-1.0.0/src/kel/retrieval/chroma_store.py +99 -0
  96. pykel-1.0.0/src/kel/retrieval/embeddings.py +47 -0
  97. pykel-1.0.0/src/kel/retrieval/loaders.py +40 -0
  98. pykel-1.0.0/src/kel/retrieval/pgvector_store.py +131 -0
  99. pykel-1.0.0/src/kel/retrieval/pinecone_store.py +110 -0
  100. pykel-1.0.0/src/kel/retrieval/qdrant.py +133 -0
  101. pykel-1.0.0/src/kel/retrieval/retriever.py +73 -0
  102. pykel-1.0.0/src/kel/retrieval/splitter.py +78 -0
  103. pykel-1.0.0/src/kel/retrieval/store.py +71 -0
  104. pykel-1.0.0/src/kel/retrieval/types.py +17 -0
  105. pykel-1.0.0/src/kel/retrieval/weaviate_store.py +123 -0
  106. pykel-1.0.0/src/kel/runtime/__init__.py +16 -0
  107. pykel-1.0.0/src/kel/runtime/checkpoint.py +41 -0
  108. pykel-1.0.0/src/kel/runtime/executor.py +141 -0
  109. pykel-1.0.0/src/kel/runtime/graph.py +57 -0
  110. pykel-1.0.0/src/kel/runtime/interrupt.py +16 -0
  111. pykel-1.0.0/src/kel/sdk/__init__.py +11 -0
  112. pykel-1.0.0/src/kel/sdk/banner.py +44 -0
  113. pykel-1.0.0/src/kel/sdk/build.py +32 -0
  114. pykel-1.0.0/src/kel/sdk/cli.py +91 -0
  115. pykel-1.0.0/src/kel/sdk/serve.py +84 -0
  116. pykel-1.0.0/src/kel/specs/__init__.py +22 -0
  117. pykel-1.0.0/src/kel/specs/eval.py +40 -0
  118. pykel-1.0.0/src/kel/specs/frontmatter.py +21 -0
  119. pykel-1.0.0/src/kel/specs/llm_eval.py +63 -0
  120. pykel-1.0.0/src/kel/specs/loader.py +47 -0
  121. pykel-1.0.0/src/kel/specs/types.py +35 -0
  122. pykel-1.0.0/src/kel/storage/__init__.py +10 -0
  123. pykel-1.0.0/src/kel/storage/artifacts.py +47 -0
  124. pykel-1.0.0/src/kel/storage/blob.py +50 -0
  125. pykel-1.0.0/src/kel/storage/checkpoint_store.py +98 -0
  126. pykel-1.0.0/src/kel/storage/s3.py +58 -0
  127. pykel-1.0.0/src/kel/testing/__init__.py +23 -0
  128. pykel-1.0.0/src/kel/testing/assertions.py +44 -0
  129. pykel-1.0.0/src/kel/testing/cassette.py +29 -0
  130. pykel-1.0.0/src/kel/testing/recording.py +38 -0
  131. pykel-1.0.0/src/kel/testing/replay.py +42 -0
  132. pykel-1.0.0/src/kel/tools/__init__.py +33 -0
  133. pykel-1.0.0/src/kel/tools/code_exec.py +61 -0
  134. pykel-1.0.0/src/kel/tools/search_registry.py +62 -0
  135. pykel-1.0.0/src/kel/tools/shell_tool.py +57 -0
  136. pykel-1.0.0/src/kel/tools/sql_tool.py +68 -0
  137. pykel-1.0.0/src/kel/tools/web_fetch.py +99 -0
  138. pykel-1.0.0/src/kel/tools/web_search.py +340 -0
  139. pykel-1.0.0/tests/helpers.py +60 -0
  140. pykel-1.0.0/tests/providers/test_anthropic.py +207 -0
  141. pykel-1.0.0/tests/providers/test_cohere.py +200 -0
  142. pykel-1.0.0/tests/providers/test_gemini.py +124 -0
  143. pykel-1.0.0/tests/providers/test_mistral.py +116 -0
  144. pykel-1.0.0/tests/providers/test_openai.py +292 -0
  145. pykel-1.0.0/tests/test_agent.py +68 -0
  146. pykel-1.0.0/tests/test_agent_streaming.py +69 -0
  147. pykel-1.0.0/tests/test_brain.py +157 -0
  148. pykel-1.0.0/tests/test_budget.py +89 -0
  149. pykel-1.0.0/tests/test_caching.py +149 -0
  150. pykel-1.0.0/tests/test_chroma_store.py +90 -0
  151. pykel-1.0.0/tests/test_cli.py +100 -0
  152. pykel-1.0.0/tests/test_context_window.py +45 -0
  153. pykel-1.0.0/tests/test_credentials_optional.py +62 -0
  154. pykel-1.0.0/tests/test_heal.py +114 -0
  155. pykel-1.0.0/tests/test_instrumented.py +121 -0
  156. pykel-1.0.0/tests/test_interrupt.py +110 -0
  157. pykel-1.0.0/tests/test_llm_eval.py +54 -0
  158. pykel-1.0.0/tests/test_loaders.py +39 -0
  159. pykel-1.0.0/tests/test_loop.py +47 -0
  160. pykel-1.0.0/tests/test_memory.py +111 -0
  161. pykel-1.0.0/tests/test_monitoring.py +158 -0
  162. pykel-1.0.0/tests/test_orchestration.py +94 -0
  163. pykel-1.0.0/tests/test_pgvector_store.py +99 -0
  164. pykel-1.0.0/tests/test_pinecone_store.py +63 -0
  165. pykel-1.0.0/tests/test_prompting.py +65 -0
  166. pykel-1.0.0/tests/test_qdrant.py +128 -0
  167. pykel-1.0.0/tests/test_ratelimit.py +86 -0
  168. pykel-1.0.0/tests/test_realtime.py +64 -0
  169. pykel-1.0.0/tests/test_registry.py +129 -0
  170. pykel-1.0.0/tests/test_retrieval.py +165 -0
  171. pykel-1.0.0/tests/test_runtime.py +153 -0
  172. pykel-1.0.0/tests/test_serve.py +56 -0
  173. pykel-1.0.0/tests/test_specs.py +114 -0
  174. pykel-1.0.0/tests/test_storage.py +187 -0
  175. pykel-1.0.0/tests/test_structured.py +69 -0
  176. pykel-1.0.0/tests/test_testing.py +108 -0
  177. pykel-1.0.0/tests/test_tools_code_exec.py +62 -0
  178. pykel-1.0.0/tests/test_tools_search_registry.py +49 -0
  179. pykel-1.0.0/tests/test_tools_shell.py +44 -0
  180. pykel-1.0.0/tests/test_tools_sql.py +57 -0
  181. pykel-1.0.0/tests/test_tools_web_fetch.py +121 -0
  182. pykel-1.0.0/tests/test_tools_web_search.py +211 -0
  183. pykel-1.0.0/tests/test_tracer.py +56 -0
  184. pykel-1.0.0/tests/test_types.py +33 -0
  185. pykel-1.0.0/tests/test_weaviate_store.py +132 -0
@@ -0,0 +1,29 @@
1
+ ---
2
+ name: Bug report
3
+ about: Report something that isn't working as expected
4
+ title: "[Bug] "
5
+ labels: bug
6
+ assignees: ''
7
+ ---
8
+
9
+ **Describe the bug**
10
+ A clear, concise description of what's wrong.
11
+
12
+ **To Reproduce**
13
+ Minimal code to reproduce the behavior:
14
+
15
+ ```python
16
+ # your repro here
17
+ ```
18
+
19
+ **Expected behavior**
20
+ What you expected to happen instead.
21
+
22
+ **Environment**
23
+ - kel version: `python -c "import kel; print(kel.__version__)"`
24
+ - Python version:
25
+ - OS:
26
+ - Relevant extras installed (e.g. `kel[qdrant]`):
27
+
28
+ **Additional context**
29
+ Anything else that might help — logs, tracebacks, related issues.
@@ -0,0 +1,5 @@
1
+ blank_issues_enabled: true
2
+ contact_links:
3
+ - name: Security vulnerability
4
+ url: https://github.com/kprasad7/kel/security/advisories/new
5
+ about: Please report security vulnerabilities privately, not as a public issue.
@@ -0,0 +1,23 @@
1
+ ---
2
+ name: Feature request
3
+ about: Suggest a new capability or improvement
4
+ title: "[Feature] "
5
+ labels: enhancement
6
+ assignees: ''
7
+ ---
8
+
9
+ **What problem does this solve?**
10
+ Describe the use case — what are you trying to build, and what's missing?
11
+
12
+ **Proposed solution**
13
+ What would the API/behavior look like? A sketch is great:
14
+
15
+ ```python
16
+ # how you'd want to use it
17
+ ```
18
+
19
+ **Alternatives considered**
20
+ Any workarounds you're using today, or other approaches you thought about.
21
+
22
+ **Additional context**
23
+ Links to similar features in other frameworks, related issues, etc.
@@ -0,0 +1,16 @@
1
+ ## Summary
2
+
3
+ <!-- What does this PR change, and why? -->
4
+
5
+ ## Checklist
6
+
7
+ - [ ] `ruff check src tests` passes
8
+ - [ ] `mypy src` passes
9
+ - [ ] `pytest -q` passes
10
+ - [ ] New/changed provider or vector-store adapters remain credentials-optional (work via env vars / ambient cloud credentials with no explicit key)
11
+ - [ ] Tests added or updated for the change
12
+ - [ ] Docs (`README.md`/`USAGE.md`/`CHANGELOG.md`) updated if user-facing behavior changed
13
+
14
+ ## Related issues
15
+
16
+ <!-- e.g. Closes #123 -->
@@ -0,0 +1,12 @@
1
+ version: 2
2
+ updates:
3
+ - package-ecosystem: "pip"
4
+ directory: "/"
5
+ schedule:
6
+ interval: "weekly"
7
+ open-pull-requests-limit: 10
8
+
9
+ - package-ecosystem: "github-actions"
10
+ directory: "/"
11
+ schedule:
12
+ interval: "weekly"
@@ -0,0 +1,46 @@
1
+ name: CI
2
+
3
+ on:
4
+ push:
5
+ branches: [develop, main]
6
+ pull_request:
7
+ branches: [develop, main]
8
+
9
+ jobs:
10
+ lint:
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.12"
18
+
19
+ - name: Install kel (dev)
20
+ run: pip install -e ".[dev]"
21
+
22
+ - name: Ruff lint
23
+ run: ruff check src tests
24
+
25
+ - name: mypy
26
+ run: mypy src
27
+
28
+ test:
29
+ strategy:
30
+ fail-fast: false
31
+ matrix:
32
+ os: [ubuntu-latest, windows-latest, macos-latest]
33
+ python-version: ["3.10", "3.11", "3.12"]
34
+ runs-on: ${{ matrix.os }}
35
+ steps:
36
+ - uses: actions/checkout@v4
37
+
38
+ - uses: actions/setup-python@v5
39
+ with:
40
+ python-version: ${{ matrix.python-version }}
41
+
42
+ - name: Install kel (dev)
43
+ run: pip install -e ".[dev]"
44
+
45
+ - name: Run tests
46
+ run: pytest -q
@@ -0,0 +1,92 @@
1
+ name: DevSecOps
2
+
3
+ on:
4
+ push:
5
+ branches: [develop, main]
6
+ pull_request:
7
+ branches: [develop, main]
8
+ schedule:
9
+ # weekly, so newly-disclosed CVEs in already-merged dependencies get
10
+ # caught even when nobody pushes new code that week
11
+ - cron: "0 6 * * 1"
12
+
13
+ permissions:
14
+ contents: read
15
+ security-events: write
16
+
17
+ jobs:
18
+ trivy-scan:
19
+ name: Trivy (vulnerabilities, secrets, misconfig)
20
+ runs-on: ubuntu-latest
21
+ steps:
22
+ - uses: actions/checkout@v4
23
+
24
+ - name: Trivy filesystem scan (report, non-blocking)
25
+ uses: aquasecurity/trivy-action@master
26
+ with:
27
+ scan-type: fs
28
+ scan-ref: .
29
+ scanners: vuln,secret,misconfig
30
+ format: sarif
31
+ output: trivy-results.sarif
32
+ severity: CRITICAL,HIGH,MEDIUM
33
+ exit-code: "0"
34
+
35
+ - name: Upload results to GitHub Security tab
36
+ uses: github/codeql-action/upload-sarif@v3
37
+ with:
38
+ sarif_file: trivy-results.sarif
39
+
40
+ - name: Fail build on CRITICAL findings
41
+ uses: aquasecurity/trivy-action@master
42
+ with:
43
+ scan-type: fs
44
+ scan-ref: .
45
+ scanners: vuln,secret
46
+ severity: CRITICAL
47
+ exit-code: "1"
48
+
49
+ pip-audit:
50
+ name: pip-audit (known CVEs in dependencies)
51
+ runs-on: ubuntu-latest
52
+ steps:
53
+ - uses: actions/checkout@v4
54
+
55
+ - uses: actions/setup-python@v5
56
+ with:
57
+ python-version: "3.12"
58
+
59
+ - name: Upgrade pip
60
+ run: pip install --upgrade pip
61
+
62
+ - name: Install kel with all extras
63
+ run: pip install -e ".[all]"
64
+
65
+ - name: Install pip-audit
66
+ run: pip install pip-audit
67
+
68
+ - name: Run pip-audit
69
+ # GHSA-f4j7-r4q5-qw2c / PYSEC-2026-311 (chromadb): pre-auth code
70
+ # injection in a *running Chroma server* via trust_remote_code=true
71
+ # on the collections endpoint. kel only ships a chromadb client
72
+ # adapter (kel.retrieval.chroma_store) — it never runs a Chroma
73
+ # server or sets that flag — so this finding doesn't apply here.
74
+ # No fixed chromadb version exists yet (affects 1.0.0 through
75
+ # latest); revisit and drop this ignore once one ships.
76
+ run: pip-audit --ignore-vuln GHSA-f4j7-r4q5-qw2c
77
+
78
+ bandit:
79
+ name: Bandit (Python SAST)
80
+ runs-on: ubuntu-latest
81
+ steps:
82
+ - uses: actions/checkout@v4
83
+
84
+ - uses: actions/setup-python@v5
85
+ with:
86
+ python-version: "3.12"
87
+
88
+ - name: Install Bandit
89
+ run: pip install bandit
90
+
91
+ - name: Run Bandit (medium severity and above)
92
+ run: bandit -r src/kel -ll -f txt
pykel-1.0.0/.gitignore ADDED
@@ -0,0 +1,8 @@
1
+ __pycache__/
2
+ *.pyc
3
+ .pytest_cache/
4
+ *.egg-info/
5
+ build/
6
+ dist/
7
+ .venv/
8
+ .env
@@ -0,0 +1,33 @@
1
+ # Changelog
2
+
3
+ All notable changes to this project are documented in this file.
4
+
5
+ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
6
+ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
+
8
+ ## [Unreleased]
9
+
10
+ ### Added
11
+ - PEP 561 `py.typed` marker and dynamic single-sourced versioning.
12
+ - PyPI metadata: classifiers, keywords, `project.urls`.
13
+ - Ruff lint and mypy type-check jobs in CI.
14
+ - ASCII banner shown by the `kel` CLI (`kel --version` / bare `kel`).
15
+ - CHANGELOG, CONTRIBUTING, CODE_OF_CONDUCT, SECURITY docs and GitHub issue/PR templates.
16
+
17
+ ## [0.1.0] - 2026-07-24
18
+
19
+ ### Added
20
+ - Core model gateway with Anthropic, OpenAI, Cohere, Gemini, and Mistral adapters — all credentials-optional by design (env vars / ambient cloud credentials work with no explicit key).
21
+ - Observability (tracer, spans, sinks), budget tracking, rate limiting, and response caching.
22
+ - Context window management and memory (episodic + semantic) subsystems.
23
+ - Retrieval: Qdrant, Pinecone, Weaviate, Chroma, and pgvector vector stores; recursive text splitter; PDF loader.
24
+ - Agent runtime with graph-based execution, streaming, human-in-the-loop interrupts, and structured output.
25
+ - Tooling: web fetch (SSRF-hardened), web search, SQL, and shell tools.
26
+ - Testing utilities: cassette recording/replay, LLM-graded evals, span/trace assertions.
27
+ - Storage: file/S3 blob storage, checkpointing (hardened against unsafe deserialization).
28
+ - Lightweight, stdlib-only monitoring dashboard with live-refreshing metrics.
29
+ - `.md`-based agent specs, CLI (`run`/`eval`/`trace`), and `serve()` HTTP runtime.
30
+ - DevSecOps pipeline: Trivy, pip-audit, and Bandit scanning; Dependabot.
31
+
32
+ [Unreleased]: https://github.com/kprasad7/kel/compare/v0.1.0...HEAD
33
+ [0.1.0]: https://github.com/kprasad7/kel/releases/tag/v0.1.0
@@ -0,0 +1,54 @@
1
+ # Contributor Covenant Code of Conduct
2
+
3
+ ## Our Pledge
4
+
5
+ We as members, contributors, and leaders pledge to make participation in
6
+ our community a harassment-free experience for everyone, regardless of
7
+ age, body size, visible or invisible disability, ethnicity, sex
8
+ characteristics, gender identity and expression, level of experience,
9
+ education, socio-economic status, nationality, personal appearance,
10
+ race, religion, or sexual identity and orientation.
11
+
12
+ ## Our Standards
13
+
14
+ Examples of behavior that contributes to a positive environment:
15
+
16
+ - Demonstrating empathy and kindness toward other people
17
+ - Being respectful of differing opinions, viewpoints, and experiences
18
+ - Giving and gracefully accepting constructive feedback
19
+ - Focusing on what is best for the community
20
+
21
+ Examples of unacceptable behavior:
22
+
23
+ - The use of sexualized language or imagery, and sexual attention or advances
24
+ - Trolling, insulting or derogatory comments, and personal or political attacks
25
+ - Public or private harassment
26
+ - Publishing others' private information without explicit permission
27
+
28
+ ## Enforcement Responsibilities
29
+
30
+ Project maintainers are responsible for clarifying and enforcing standards
31
+ of acceptable behavior and will take appropriate, fair corrective action
32
+ in response to any behavior deemed inappropriate, threatening, offensive,
33
+ or harmful.
34
+
35
+ ## Scope
36
+
37
+ This Code of Conduct applies within all community spaces (issues, pull
38
+ requests, discussions) and when an individual is officially representing
39
+ the project in public spaces.
40
+
41
+ ## Enforcement
42
+
43
+ Instances of abusive, harassing, or otherwise unacceptable behavior may be
44
+ reported to the maintainers via a GitHub issue marked confidential or by
45
+ contacting the repository owner directly through GitHub. All complaints
46
+ will be reviewed and investigated promptly and fairly.
47
+
48
+ ## Attribution
49
+
50
+ This Code of Conduct is adapted from the [Contributor Covenant][homepage],
51
+ version 2.1, available at
52
+ https://www.contributor-covenant.org/version/2/1/code_of_conduct.html.
53
+
54
+ [homepage]: https://www.contributor-covenant.org
@@ -0,0 +1,51 @@
1
+ # Contributing to kel
2
+
3
+ Thanks for considering a contribution. This project is young, so small,
4
+ focused pull requests are the easiest to review and merge.
5
+
6
+ ## Getting set up
7
+
8
+ ```bash
9
+ git clone https://github.com/kprasad7/kel.git
10
+ cd kel
11
+ python -m venv .venv
12
+ . .venv/Scripts/activate # Windows; use `source .venv/bin/activate` on macOS/Linux
13
+ pip install -e ".[dev]"
14
+ ```
15
+
16
+ ## Before opening a PR
17
+
18
+ Run the same checks CI runs:
19
+
20
+ ```bash
21
+ ruff check src tests
22
+ mypy src
23
+ pytest -q
24
+ ```
25
+
26
+ All three must pass. If you touch a provider or vector-store adapter that
27
+ requires a third-party SDK, install it via the relevant extra (e.g.
28
+ `pip install -e ".[qdrant]"`) and add tests against an injected fake
29
+ client — tests should never require live credentials or a live account.
30
+
31
+ ## Guidelines
32
+
33
+ - **Credentials stay optional.** Every provider/store adapter must work
34
+ when no explicit API key is passed, falling back to environment
35
+ variables or ambient cloud credentials (IAM role, Workload Identity,
36
+ IRSA). Don't add a required-key check that breaks that path.
37
+ - **No new abstractions for their own sake.** kel's whole pitch is fewer
38
+ layers than the alternatives — prefer a direct implementation over a new
39
+ interface unless at least two call sites need it.
40
+ - **Security-sensitive changes** (deserialization, subprocess/shell
41
+ execution, URL fetching, SQL construction) need a one-line comment
42
+ explaining why the operation is safe, not just that it works.
43
+ - **Docstrings over comments** for adapters: explain what real-world
44
+ deployment scenario a design choice serves (e.g. "works under EKS IRSA
45
+ with no key at all"), not what the code does line by line.
46
+
47
+ ## Reporting bugs / requesting features
48
+
49
+ Open a [GitHub issue](https://github.com/kprasad7/kel/issues). For
50
+ security vulnerabilities, see [SECURITY.md](SECURITY.md) instead of
51
+ filing a public issue.