Qwen/Qwen3-VL-2B-Instruct post-tuned (LoRA r=32, merged) on the full public
codebase and docs of
strands-agents and
strands-labs (12 repos, ~5.6M tokens), designed to be wrapped with the
strands-slm plastic self-learning
layer: surprise-gated weight updates at inference, EMA-bounded plasticity, and
a provable off-switch (
reset() is bit-identical to this base).
Code, demo notebook, and full experimental record:
github.com/cagataycali/slm
As a
Strands Agents model provider — every agent turn can change the weights:
1from strands import Agent
2from strands_tools import shell
3from slm import SLM
4
5model = SLM("cagataydev/strands-qwen3-vl-2b")
6agent = Agent(tools=[shell], model=model)
7agent("use the shell tool to run: echo hello") # this turn updated the weights
1from slm import StrandsPlasticQwen
2
3m = StrandsPlasticQwen.from_pretrained("cagataydev/strands-qwen3-vl-2b", device="cuda")
4print(m.chat("How do I create a custom tool in Strands Agents?"))
5
6for doc in your_stream:
7 m.observe(doc, learn=True) # predicts; if surprised, rewrites its fast weights
8m.reset() # bit-exact back to this base
1from transformers import AutoModelForImageTextToText, AutoProcessor
2model = AutoModelForImageTextToText.from_pretrained("cagataydev/strands-qwen3-vl-2b", dtype="bfloat16", device_map="cuda")
3proc = AutoProcessor.from_pretrained("cagataydev/strands-qwen3-vl-2b")
Measured on a single L40S, seed-replicated. The base is never updated by the plastic layer.
Full results, honest limitations, and the demo notebook:
github.com/cagataycali/slm
License: Apache-2.0 (inherits Qwen3-VL license terms).