Thank you for your interest in contributing. SynapseKit is an open source project and contributions of all kinds are welcome — bug reports, documentation improvements, new features, and code reviews.
- Code of Conduct
- Ways to Contribute
- Development Setup
- Project Structure
- Making Changes
- Pull Request Guidelines
- Coding Standards
- Writing Tests
- Commit Message Format
This project follows our Code of Conduct. By participating, you agree to uphold it.
Not sure where to start? Look for issues tagged good first issue or help wanted.
| Type | How |
|---|---|
| 🐛 Bug report | Open an issue |
| 💡 Feature request | Open an issue |
| 📖 Documentation | Edit docs in synapsekit-docs or fix docstrings here |
| 🔌 New LLM provider | See Adding a Provider |
| 🗄️ New vector store | See Adding a Vector Store |
| 🛠️ New tool | See Adding a Tool |
SynapseKit uses uv for dependency management.
# 1. Fork and clone
git clone https://github.com/<your-username>/SynapseKit
cd SynapseKit
# 2. Install dependencies
uv sync --group dev
# 3. Run the test suite
uv run pytest tests/ -q
# 4. Create a branch
git checkout -b feat/my-featureAll 267 tests should pass before you start. If any are failing, open an issue.
synapsekit/
├── _compat.py # run_sync() — works inside/outside event loops
├── agents/ # ReActAgent, FunctionCallingAgent, AgentExecutor, tools
├── embeddings/ # SynapsekitEmbeddings (sentence-transformers backend)
├── graph/ # StateGraph, CompiledGraph, graph workflows
├── llm/ # BaseLLM + provider implementations (openai, anthropic, …)
├── loaders/ # Document loaders (pdf, html, csv, json, web, directory)
├── memory/ # ConversationMemory
├── observability/ # TokenTracer
├── parsers/ # JSONParser, ListParser, PydanticParser
├── prompts/ # PromptTemplate, ChatPromptTemplate, FewShotPromptTemplate
├── rag/ # RAGPipeline, TextSplitter
├── retrieval/ # VectorStore ABC, InMemoryVectorStore, Chroma, FAISS, Qdrant, Pinecone
tests/
├── test_*.py # One file per module
-
Start with an issue. For anything beyond a typo fix, open an issue first to discuss the approach. This avoids wasted effort.
-
Keep changes focused. One logical change per pull request. Don't refactor unrelated code alongside a bug fix.
-
Write tests. All new code must be covered by tests. See Writing Tests.
-
Update docs. If you add a public API, update the docs site.
- Target the
mainbranch - Fill in the pull request template completely
- Link the related issue with
Closes #<issue> - All tests must pass:
uv run pytest tests/ -q - Keep the PR description clear — explain why, not just what
- Request review from a maintainer once ready
- Async-first. Public APIs must be
async. Provide sync wrappers viarun_sync()where appropriate. - Type hints. All public functions and methods must be fully typed.
- No new hard dependencies. Core functionality must work with
numpyandrank-bm25only. New providers and backends go behind optional extras. - No magic. No monkey-patching, hidden callbacks, or implicit global state.
- Python 3.10+. Use modern syntax freely.
Tests live in tests/. One file per module, named test_<module>.py.
# Run all tests
uv run pytest tests/ -q
# Run a specific file
uv run pytest tests/test_graph_run.py -v
# Run a specific test
uv run pytest tests/test_graph_run.py::test_linear_two_nodes -v- Use
pytest-asynciofor async tests — mark withasync def test_...(auto mode is on) - Mock external APIs — no test should require an API key or network access
- Test both the happy path and error cases
- Keep tests fast — the full suite should run in under 5 seconds
We use a simplified Conventional Commits format:
<type>: <short description>
[optional body]
| Type | When to use |
|---|---|
feat |
New feature |
fix |
Bug fix |
docs |
Documentation only |
test |
Adding or updating tests |
refactor |
Code change that is not a fix or feature |
chore |
Build tooling, dependencies, CI |
Examples:
feat(graph): add ConditionalEdge async condition support
fix(llm): handle empty response from Anthropic stream
docs: add Graph Workflows section to README
test(agents): add FunctionCallingAgent multi-tool tests
- Create
synapsekit/llm/<provider>.py— subclassBaseLLM, implementstream() - Add to
_make_llm()insynapsekit/__init__.py - Add optional dependency to
pyproject.toml - Add tests in
tests/test_llm_providers.py - Add a doc page in
synapsekit-docs/docs/llms/<provider>.md
- Create
synapsekit/retrieval/<backend>.py— subclassVectorStore, implementadd(),search(),save(),load() - Add optional dependency to
pyproject.toml - Add tests in
tests/test_vectorstore_backends.py
- Create a class in
synapsekit/agents/tools.py— subclassBaseTool, implementrun() - Export from
synapsekit/agents/__init__.pyandsynapsekit/__init__.py - Add tests in
tests/test_tools.py
Open a discussion or issue. We're happy to help.