synaptic-core
synaptic-core v0.4.0 ships a clean canonical API for graph memory:
- Client:
Synaptic(async) - Core methods:
remember,recall,set,get,find,delete,clear,connect,related - Session persistence:
store_session,retrieve_session,update_session - Session-first helpers:
client.session("...") - Structured errors:
SynapticError { code, message, hint }
Install
pip install synaptic-core
Happy Path (Async, Session-First)
import asyncio
from synaptic_core import Synaptic, SynapticError
from synaptic_core.types import OutcomeSignalType
def embed(text: str) -> list[float]:
normalized = text.lower().strip()
return [
float(len(normalized.split())),
float(len(normalized)) / 100.0,
float(sum(ord(ch) for ch in normalized) % 257) / 257.0,
]
async def main() -> None:
client = Synaptic(db_path="synaptic.db", embedding_fn=embed)
session = client.session("chat-42")
await session.remember("Customer asked for monthly usage CSV export")
recall = await session.recall("How do I export monthly usage as CSV?", top_k=5)
if recall.nodes:
await session.feedback(
recall.query_id,
outcome=OutcomeSignalType.EXPLICIT_POSITIVE,
provider="app",
)
print("nodes", [str(node.id) for node in recall.nodes])
print("stats", await client.stats())
try:
asyncio.run(main())
except SynapticError as exc:
print(exc.as_dict())
Constructor Runtime Options Contract
Synaptic(...) now validates runtime options before engine initialization:
- Unknown option names raise
SynapticErrorwith codeINVALID_CONSTRUCTOR_OPTIONS. - Invalid option values raise
SynapticErrorwith codeINVALID_CONSTRUCTOR_OPTIONS. - Conflicting alias/canonical pairs raise
SynapticErrorwith codeINVALID_CONSTRUCTOR_OPTIONS(pass only one name per canonical option). - Legacy aliases are accepted:
retrieval_top_k->top_k_retrievalactivation_seed_top_k->top_k_activation_seedsweekly_digest_ttl_seconds->weekly_digest_cache_ttl_secondsgraph_confidence_refresh_interval->graph_confidence_refresh_query_interval
Supported runtime options:
backendclassifiercross_tier_similarity_thresholdcross_tier_initial_weightcross_tier_seed_top_kcross_tier_seed_max_edgestop_k_retrievaltop_k_activation_seedstelemetry_collectoractivation_engineoutcome_detectorconnection_learnerdeployment_idweekly_digest_cache_ttl_secondsgraph_confidence_refresh_query_intervalgraduation_enginegraduation_scheduler_enabledgraduation_check_interval_queriesgraduation_check_interval_secondsgraduation_min_access_countgraduation_min_positive_outcome_ratiograduation_min_age_hoursgraduation_min_reinforced_edgesgraduation_reinforced_edge_weight_thresholdgraduation_edge_transfer_thresholdinstance_optimizerinstance_optimizer_enabledinstance_optimizer_step_sizeinstance_optimizer_min_sample_countinstance_optimizer_update_intervalsession_deserializer
Practical invalid-option example:
from synaptic_core import Synaptic, SynapticError
try:
Synaptic(db_path="synaptic.db", unknown_runtime_option=True)
except SynapticError as exc:
assert exc.code == "INVALID_CONSTRUCTOR_OPTIONS"
Canonical API
remember(content, *, session_id="default", memory_type=None, external_id=None, source_type=None, metadata=None) -> Noderecall(query, *, session_id="default", top_k=None) -> RetrievalResultfeedback(query_id, outcome, *, session_id=None, agent_response=None, user_next_message=None, dwell_time_ms=None, active_nodes=None, corrected_nodes=None, provider="unknown") -> CompositeOutcomeset(key, value, *, namespace=None, metadata=None, ttl=None) -> Noneget(key, *, namespace=None) -> Any | Nonedelete(key, *, namespace=None) -> boolclear(*, namespace=None) -> intstore_session(session) -> Anyretrieve_session(session_id) -> Any | Noneupdate_session(session) -> Anyfind(query, *, namespace=None, limit=10, filters=None) -> list[dict]connect(node_a_id, node_b_id, *, weight=0.3, connection_type="excitatory", formation_trigger="explicit", is_cross_tier=None) -> dictrelated(node_id, *, limit=None) -> list[dict]stats() -> dictgraph_status() -> dictweekly_digest(force_refresh=False) -> dictsession_summary(session_id) -> dictsessions_recent(limit=20) -> list[dict]queries_recent(session_id=None, limit=20) -> list[dict]outcomes_recent(session_id=None, limit=20) -> list[dict]
Session-First Helpers
client.session(session_id).remember(...)client.session(session_id).recall(...)client.session(session_id).feedback(...)client.session(session_id).summary()client.session(session_id).queries_recent(limit=20)client.session(session_id).outcomes_recent(limit=20)
First-Party Axis Interop
axis-core consumes the public synaptic_core.Synaptic client only. The maintained interop
surface for axis_core.adapters.memory.synaptic.SynapticMemory is:
Synaptic(...)client.session("...")set,get,find,delete,clearstore_session,retrieve_session,update_session
Axis declares support for synaptic-core>=0.3.0,<0.4.0 through the optional
axis-core[synaptic] extra.
Source-tree validation against sibling checkouts:
# from axis-core/
PYTHONPATH="$(cd ../synaptic-core/src && pwd)" \
./scripts/test.sh tests/adapters/memory/test_synaptic.py tests/adapters/memory/test_synaptic_integration.py
# from synaptic-core/
.venv/bin/python -m pytest tests/synaptic_core/test_api_v03.py tests/synaptic_core/test_core_integration.py -q
The Axis command intentionally imports from ../synaptic-core/src so the first-party contract is
validated against the sibling source tree instead of an installed wheel.
CLI
synaptic doctor --db-path synaptic.db
synaptic stats --db-path synaptic.db --json
synaptic graph status --db-path synaptic.db --json
synaptic sessions recent --db-path synaptic.db --limit 20 --json
synaptic queries recent --db-path synaptic.db --session-id chat-42 --limit 20 --json
synaptic outcomes recent --db-path synaptic.db --session-id chat-42 --limit 20 --json
synaptic weekly-digest --db-path synaptic.db --json
Test Marker Presets
Use marker-driven subsets for faster local validation loops:
.venv/bin/python -m pytest tests/synaptic_core -m public_api -q
.venv/bin/python -m pytest tests/synaptic_core -m service_unit -q
.venv/bin/python -m pytest tests/synaptic_core -m engine_contract -q
.venv/bin/python -m pytest tests/synaptic_core -m integration -q
.venv/bin/python -m pytest tests/synaptic_core -m durability -q
Metadata
Release files for synaptic-core 0.4.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | Actions |
|---|---|---|---|---|
| synaptic_core-0.4.0.tar.gz | 88.4 kB | Without provenance | Details for synaptic_core-0.4.0.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| synaptic_core-0.4.0-py3-none-any.whl | Python 3 | none | any | Details for synaptic_core-0.4.0-py3-none-any.whl |
Total release size: 189.0 kB
Release files / synaptic_core-0.4.0.tar.gz
| Download URL | synaptic_core-0.4.0.tar.gz |
|---|---|
| Size | 88.4 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
cb184368ee94f8d1686e704bfe9b367e8be2d4351c76f59f6b4178a402de06fc
|
|
BLAKE2b-256 checksum How to use checksums |
54233ca6b0875acccc1ff3ed347db848fe8a6ed18ac70c481cb989109052564c
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.8.18
|
Release files / synaptic_core-0.4.0-py3-none-any.whl
| Download URL | synaptic_core-0.4.0-py3-none-any.whl |
|---|---|
| Size | 100.6 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
1b65bdc356e5b489b570969e5067b0c0c196debca11568691038bca0202e464c
|
|
BLAKE2b-256 checksum How to use checksums |
ac10d02370e09f76a3a926d610a3cb7b6c3217ee794aa54f64f8e2c94241a84f
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.8.18
|
Security for synaptic-core 0.4.0
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.