maximem-synap-smolagents
Synap memory integration for Smolagents
— give a CodeAgent / ToolCallingAgent persistent memory through Synap.
pip install maximem-synap-smolagents smolagents
Surfaces
Smolagents keeps its own fixed step log (no pluggable memory backend), so Synap plugs into the two extension points it does expose, plus static instructions:
| Surface | Smolagents extension point | Purpose |
|---|---|---|
create_synap_tools |
@tool |
Explicit search_memory / store_memory the model can call |
synap_step_callbacks |
step_callbacks={MemoryStep: ...} |
Record the user and assistant turns as a Synap conversation, and report tool calls and reasoning on the live stream |
attach_synap_history |
agent.write_memory_to_messages |
Send Synap's compaction instead of the agent's earlier steps (applied by synap_step_callbacks) |
synap_st_instructions |
CodeAgent(instructions=...) |
Fold Synap's compaction block into the agent's instructions (for an agent with no recorder) |
Example
from smolagents import CodeAgent, InferenceClientModel
from maximem_synap import MaximemSynapSDK
from synap_smolagents import create_synap_tools, synap_step_callbacks, synap_st_instructions
sdk = MaximemSynapSDK(api_key="sk-...")
agent = CodeAgent(
model=InferenceClientModel(),
tools=create_synap_tools(sdk, user_id="alice", customer_id="acme"),
instructions=synap_st_instructions(
sdk, conversation_id="conv_abc",
instructions="You are a concise, friendly assistant.",
),
step_callbacks=synap_step_callbacks(
sdk, user_id="alice", conversation_id="conv_abc", customer_id="acme"
),
)
agent.run("Remind me what plan I'm on and my open ticket.")
Because CodeAgent calls tools as plain Python, search_memory / store_memory
compose naturally into agent-written code.
Notes
- Synchronous framework. Smolagents runs synchronously and its tools do not
support
async, so every surface bridges to the async Synap SDK internally. Run the agent on its own thread if your app is otherwise async. - Error policy. The
search_memorytool degrades (returns a not-found message);store_memoryraisesSynapIntegrationError; the recorder logs and never raises — it runs inside the agent loop, where a raising callback would abort the run. - Turns are conversation messages. The user's task and the assistant's final
answer are written to the conversation
conversation_idnames: on the gRPC stream (the first turn opens it; you do not calllisten()), otherwise withsdk.conversation.record_message, never both.SYNAP_AUTO_LISTEN=false(orset_auto_listen(sdk, False)fromsynap_integrations_common) keeps turns on REST. The server compacts that conversation and promotes it to long-term memory, and the SDK's local history search can find old turns after compaction. Reuse oneconversation_idacrossagent.run()calls that belong together. - No per-step documents by default. Earlier versions ingested every step's
model output with
memories.create, which left no conversation on the server. That is now off (ingest_steps=Trueturns it back on): with the turns recorded, it would extract the final answer twice. - Live stream. On the stream the recorder also reports every tool call and its result, and the model's plan and step output as reasoning. Without a stream those are dropped.
- Synap's compaction replaces the agent's earlier steps. Smolagents builds the
model's input in
write_memory_to_messagesand has no compaction of its own. The recorder wraps that method on the agent it is handed: once Synap has compacted the conversation, the model sees the compaction block, Synap's turns after it and the current task, instead of the earlier steps inagent.memory(which is never edited). Until then, and if Synap cannot answer, the agent's messages are untouched. The conversation is read once per run. Smolagents has no hook before a model call, so the recorder attaches after the first step; callattach_synap_history(agent, sdk, conversation_id)right after building the agent to cover the first step of a resumed conversation.compact_history=Falseturns it off. - Register against
MemoryStep.synap_step_callbacksdoes this for you. Registering the recorder againstActionStepalone (what earlier versions of this README showed) never delivers the final answer, and the assistant turn is the one event anticipation acts on. - Two gaps, on purpose. Smolagents never passes its
TaskStepto a callback, so the user turn is read fromagent.taskand written at the end of the first step rather than before it (report_user_task=Falseturns it off). And a step with several parallel tool calls merges their outputs into oneobservationsstring, so that result is reported with notool_call_idrather than being attributed to a guessed call.
Requires Python 3.11+ and smolagents>=1.26.
Metadata
Release files for maximem-synap-smolagents 0.1.3
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 |
|---|---|---|---|---|
| maximem_synap_smolagents-0.1.3.tar.gz | 20.4 kB | Without provenance | Details for maximem_synap_smolagents-0.1.3.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| maximem_synap_smolagents-0.1.3-py3-none-any.whl | Python 3 | none | any | Details for maximem_synap_smolagents-0.1.3-py3-none-any.whl |
Total release size: 36.3 kB
Release files / maximem_synap_smolagents-0.1.3.tar.gz
| Download URL | maximem_synap_smolagents-0.1.3.tar.gz |
|---|---|
| Size | 20.4 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
aa4f84a9350c3afd7d2ae593a53e406bcccae4ce31ec44f2115cc856c7805467
|
|
BLAKE2b-256 checksum How to use checksums |
0e7e0d29ff1d4cd5e60debc38c3649c2f119850b65eb0ab3e5351799510efda7
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.14.2
|
Release files / maximem_synap_smolagents-0.1.3-py3-none-any.whl
| Download URL | maximem_synap_smolagents-0.1.3-py3-none-any.whl |
|---|---|
| Size | 15.9 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
c4efc30abf158589170fa5f7ec73a5cfb0ec19d3a5274c9eae1c64c04174a201
|
|
BLAKE2b-256 checksum How to use checksums |
0358c1596f4521c21a7263190a30f91db4aa894dfd1359f0c9af806cc7632705
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.14.2
|
Security for maximem-synap-smolagents 0.1.3
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.