Synthetic Sciences Releases OpenScience: An Open-Source, Model-Agnostic AI Workbench for Machine Learning, Biology, Physics, and Chemistry Research
Skip to main content
Synthetic Sciences has released OpenScience, an open-source AI workbench for scientific research. It is licensed under Apache 2.0 and runs on your own infrastructure. The research team frames it as an open alternative to Anthropic’s Claude Science, launched in late June 2026.
The pitch is direct. Scientific AI tooling should not be owned by one vendor. OpenScience keeps the workflow open, the models swappable, and the data local. It is an independent project, not affiliated with or endorsed by Anthropic.
TL;DR
OpenScience is an Apache-2.0, model-agnostic AI workbench for machine learning, biology, physics, and chemistry.
It runs the full loop: literature, hypothesis, code, experiment, analysis, and write-up.
Any model works (Claude, GPT, Gemini, GLM, Kimi, DeepSeek, local fine-tunes); switching is per-request.
It ships 250+ editable skills, plus databases (UniProt, PDB, ChEMBL, arXiv, and ~30 more) as agent tools.
It runs on your infrastructure with your keys; bring-your-own-key usage is free and never gated.
What is OpenScience
OpenScience is a browser-based workspace backed by a local agent runtime. You give it a research goal. It then works through the loop a capable collaborator would follow.
It reads relevant papers, forms a hypothesis, writes and runs code, and runs experiments. It queries major scientific databases and writes up the result. All of this happens in one continuous session.
The tool is model-agnostic by design. It works with any frontier or open-weight model, using your own API keys. No account is required to start.
Installation uses npm. The command is openscience, and it opens the workspace in your browser.
The first run offers three options: Atlas managed models, your own provider keys, or free demo models. You can also skip a global install. Running npx synsci does the same thing in one step.
How It Works
OpenScience runs a local server. That server hosts the workspace UI, the agent runtime, and the tool layer. The agent plans with a research harness and calls tools.
Those tools include the shell, editor, LSP, MCP servers, scientific connectors, and skills. The agent streams its work back to the browser as it runs.
Models are routed per request. You pick the model from the model selector in the workspace. So you can switch providers or run local models without changing anything else.
# Bring your own key; requests go straight to the provider
export ANTHROPIC_API_KEY=sk-ant-...
openscience
# Or open a specific project directory
openscience ~/code/my-project
Your keys stay on your machine. Sessions, artifacts, and provenance are stored on disk. They can be shared as links.
Four things make the runtime useful for real work:
Research agents: A research agent runs by default. Specialist biology, physics, and ml agents exist too. Critique and literature-review sub-agents and a read-only plan mode round it out.
250+ skills: These cover training (DeepSpeed, PEFT, TRL), evaluation, dataset work, and cheminformatics. They also cover molecular and clinical biology, papers, LaTeX, figures, and cloud compute.
Scientific databases as tools: UniProt, PDB, Ensembl, ChEMBL, PubChem, arXiv, OpenAlex, and Semantic Scholar are queryable. Around 30 more are included.
A real workspace: It has a file tree, editor, terminal, and session history. It renders molecules, structures, genomes, and plots inline.
Extensibility is a first-class feature. OpenScience supports LSP integration, MCP servers, plugins, and custom agents. It also ships a TypeScript SDK.
There is an optional managed layer called Atlas. Atlas gives a curated set of frontier models billed from a prepaid wallet. It also adds a persistent research graph and cloud compute. OpenScience works with Atlas but never requires it.
OpenScience vs Claude Science
Both tools target the same job. Both run the loop, render science inline, and prioritize reproducibility. The core difference is openness and model choice.
Dimension
OpenScience
Claude Science
Vendor
Synthetic Sciences
Anthropic
License
Open source, Apache 2.0
Proprietary product
Models
Any provider or local fine-tune
Anthropic Claude models only
Model switching
Per-request, via model selector
Fixed to Claude
Keys / cost
Your keys; BYOK free, never gated
Paid Claude subscription required
Skills / tools
250+ editable, extensible skills
60+ curated skills and connectors
Where it runs
Your infrastructure, browser workspace
Lab machines; beta on macOS and Linux
Sub-agents
research, biology, physics, ml + critique
Coordinating agent + specialists + reviewer
Databases
UniProt, PDB, ChEMBL, arXiv, ~30 more
UniProt, PDB, ChEMBL, GEO, and others
Special models
Uses whatever model you pick
Taps NVIDIA BioNeMo (Evo 2, Boltz-2, OpenFold3)
Claude Science is a polished, standalone product with curated integrations. OpenScience trades some polish for openness, auditability, and provider freedom.
Use Cases With Examples
Machine learning research: An ML engineer wants to test a fine-tuning idea. The ml agent pulls related arXiv papers, then uses PEFT and TRL skills. It writes a training script, runs it, and drafts a short report.
Computational biology: A data scientist studies a protein target. The biology agent queries UniProt and PDB, then renders the structure inline. It proposes candidate mutations and logs the provenance.
Cheminformatics: A chemist screens small molecules. The agent queries ChEMBL and PubChem for bioactivity data. It runs a filter in code and returns ranked candidates with plots.
Model comparison on a budget: A team runs the same task on Claude, then GLM, then a local fine-tune. Switching is one selection, not a rewrite. They compare cost and quality on their own data.
Strengths and Weaknesses
Strengths:
Fully open source under Apache 2.0, so skills and agents are readable and editable.
Model-agnostic routing removes single-vendor lock-in for scientific workflows.
Runs on your infrastructure, so private datasets can stay on your systems.
Broad tool coverage: 250+ skills and dozens of scientific databases as tools.
Extensible through LSP, MCP servers, plugins, and a TypeScript SDK.
Weaknesses:
The agent is not sandboxed; the permission system is not an isolation boundary.
You should run it inside a container or VM if you need isolation.
It is a young project, so expect rough edges versus a mature product.
Bring-your-own-key means you manage provider costs and rate limits yourself.
Quality depends heavily on which model you route each request to.
Interactive Explainer
Run research loop</button>
<button class="os-btn os-reset" id="os-reset">Reset</button>
</div>
</div>
<div class="os-stages" id="os-stages"></div>
<div class="os-main">
<div class="os-console">
<div class="os-console-bar">
<div class="os-dot" style="background:#e05a5a"></div>
<div class="os-dot" style="background:#e0b400"></div>
<div class="os-dot" style="background:#76B900"></div>
<span class="os-mono">openscience · agent runtime</span>
</div>
<div class="os-log" id="os-log">
<div class="os-idle">Choose a model and a goal, then run the loop. The agent streams each step here.</div>
</div>
</div>
<div class="os-side">
<div class="os-card">
<h4>Skills fired</h4>
<div id="os-skills"><span class="os-idle">Idle</span></div>
</div>
<div class="os-card">
<h4>Databases queried</h4>
<div id="os-dbs"><span class="os-idle">Idle</span></div>
</div>
<div class="os-card">
<h4>Inline render</h4>
<div class="os-render" id="os-render"><div class="os-empty">Output appears after the experiment step.</div></div>
</div>
</div>
</div>
<div class="os-foot">
<div class="os-note">Illustrative demo. Steps, skills, and renders are simulated to show the OpenScience loop. Real runs depend on the model and data you provide.</div>
<div class="os-mtp">Marktechpost</div>
</div>
</div>
<script>
(function(){
var MODELS = [
{id:"claude-opus", label:"Claude"},
{id:"gpt-5", label:"GPT"},
{id:"gemini", label:"Gemini"},
{id:"glm", label:"GLM"},
{id:"kimi", label:"Kimi"},
{id:"deepseek", label:"DeepSeek"},
{id:"local-ft", label:"Local fine-tune"}
];
var STAGES = ["Literature","Hypothesis","Code","Experiment","Analysis","Write-up"];
var GOALS = {
ml: {
label:"ML", agent:"ml",
desc:"Goal: PEFT fine-tune a small model and report the loss.",
skills:["arxiv-search","peft-lora","trl-sft","eval-harness","figures-matplotlib"],
dbs:["arXiv","OpenAlex","Semantic Scholar"],
lit:"Retrieved 7 arXiv papers on parameter-efficient fine-tuning.",
hyp:"LoRA rank 16 should match full fine-tune within 2% at lower cost.",
code:"Wrote train.py using PEFT + TRL SFTTrainer on a 1.3B base model.",
exp:"Ran 3 epochs; logged train/val loss per step to disk.",
ana:"Val loss fell 2.41 -> 0.88; LoRA within 1.6% of full fine-tune.",
write:"Drafted a short report with the loss curve and a methods note.",
render:"loss"
},
bio: {
label:"Biology", agent:"biology",
desc:"Goal: inspect a protein target and propose mutations.",
skills:["uniprot-fetch","pdb-structure","structure-viewer","variant-scan","figures"],
dbs:["UniProt","PDB","Ensembl"],
lit:"Pulled target entry from UniProt and 4 related structures.",
hyp:"A binding-pocket residue swap may raise ligand affinity.",
code:"Loaded PDB structure; mapped conserved residues in the pocket.",
exp:"Rendered the structure inline and scored 5 candidate mutations.",
ana:"Two mutations improved the predicted pocket score; logged provenance.",
write:"Summarized candidates with the structure figure and citations.",
render:"protein"
},
chem: {
label:"Chemistry", agent:"research",
desc:"Goal: screen small molecules for a target activity.",
skills:["chembl-query","pubchem-fetch","rdkit-filter","admet-flags","figures"],
dbs:["ChEMBL","PubChem","arXiv"],
lit:"Queried ChEMBL for known actives against the target.",
hyp:"Scaffold with a polar substituent should keep activity, lower logP.",
code:"Wrote an RDKit filter over 1,200 candidate SMILES.",
exp:"Applied activity and ADMET filters; ranked the survivors.",
ana:"Kept 38 candidates; top scaffold plotted by activity vs logP.",
write:"Produced a ranked table and an activity plot with sources.",
render:"molecule"
}
};
var state = { model:"claude-opus", goal:"ml", running:false };
var $ = function(id){ return document.getElementById(id); };
var modelsEl=$("os-models"), goalsEl=$("os-goals"), stagesEl=$("os-stages"),
logEl=$("os-log"), skillsEl=$("os-skills"), dbsEl=$("os-dbs"), renderEl=$("os-render"),
flagEl=$("os-flagcode"), goalDescEl=$("os-goaldesc"), runBtn=$("os-run"), resetBtn=$("os-reset");
// build model pills
MODELS.forEach(function(m){
var p=document.createElement("div");
p.className="os-pill"+(m.id===state.model?" on":"");
p.textContent=m.label; p.dataset.id=m.id;
p.onclick=function(){ if(state.running) return;
state.model=m.id; syncPills(modelsEl,m.id);
flagEl.textContent=m.id; };
modelsEl.appendChild(p);
});
// build goal pills
Object.keys(GOALS).forEach(function(g){
var p=document.createElement("div");
p.className="os-pill"+(g===state.goal?" on":"");
p.textContent=GOALS[g].label; p.dataset.id=g;
p.onclick=function(){ if(state.running) return;
state.goal=g; syncPills(goalsEl,g); goalDescEl.textContent=GOALS[g].desc; };
goalsEl.appendChild(p);
});
// build stages
STAGES.forEach(function(s,i){
var d=document.createElement("div"); d.className="os-stage"; d.id="os-stg-"+i;
d.innerHTML="<span class='n'>0"+(i+1)+"</span>"+s; stagesEl.appendChild(d);
});
goalDescEl.textContent=GOALS[state.goal].desc;
function syncPills(container,id){
Array.prototype.forEach.call(container.children,function(c){
c.classList.toggle("on", c.dataset.id===id); });
}
function line(html){
if(logEl.querySelector(".os-idle")) logEl.innerHTML="";
var d=document.createElement("div"); d.className="os-line os-mono"; d.innerHTML=html;
logEl.appendChild(d); logEl.scrollTop=logEl.scrollHeight;
}
function chip(container, items, i){
if(i===0) container.innerHTML="";
var c=document.createElement("span"); c.className="os-chip"; c.textContent=items[i];
container.appendChild(c);
setTimeout(function(){ c.classList.add("fire"); },40);
}
function modelLabel(){ for(var i=0;i<MODELS.length;i++) if(MODELS[i].id===state.model) return MODELS[i].label; return state.model; }
function setStage(i){
for(var k=0;k<STAGES.length;k++){
var el=$("os-stg-"+k); el.classList.remove("active");
if(k<i) el.classList.add("done");
if(k===i) el.classList.add("active");
}
}
var timers=[];
function schedule(fn,ms){ timers.push(setTimeout(fn,ms)); }
function run(){
if(state.running) return;
reset(true); state.running=true; runBtn.disabled=true;
var g=GOALS[state.goal], ml=modelLabel(), t=0, step=520;
schedule(function(){ line("<span class='p'>openscience</span> <span class='t'>agent="+g.agent+" · routed to "+ml+"</span>"); },t+=120);
schedule(function(){ setStage(0); line("<span class='t'>[01] literature</span> "+g.lit); chip(dbsEl,g.dbs,0); },t+=step);
schedule(function(){ chip(dbsEl,g.dbs,1); chip(skillsEl,g.skills,0); },t+=step);
schedule(function(){ if(g.dbs[2]) chip(dbsEl,g.dbs,2); },t+=step);
schedule(function(){ setStage(1); line("<span class='t'>[02] hypothesis</span> "+g.hyp); },t+=step);
schedule(function(){ setStage(2); line("<span class='t'>[03] code</span> <span class='k'>"+g.code+"</span>"); chip(skillsEl,g.skills,1); chip(skillsEl,g.skills,2); },t+=step);
schedule(function(){ setStage(3); line("<span class='t'>[04] experiment</span> "+g.exp); chip(skillsEl,g.skills,3); drawRender(g.render); },t+=step);
schedule(function(){ setStage(4); line("<span class='t'>[05] analysis</span> <span class='s'>"+g.ana+"</span>"); chip(skillsEl,g.skills,4); },t+=step);
schedule(function(){ setStage(5); line("<span class='t'>[06] write-up</span> "+g.write); },t+=step);
schedule(function(){
setStage(6);
line("<span class='ok'>✓ loop complete</span> <span class='t'>· session + provenance saved to disk</span>");
state.running=false; runBtn.disabled=false;
},t+=step);
}
function reset(keepSelection){
timers.forEach(clearTimeout); timers=[];
state.running=false; runBtn.disabled=false;
logEl.innerHTML="<div class='os-idle'>Choose a model and a goal, then run the loop. The agent streams each step here.</div>";
skillsEl.innerHTML="<span class='os-idle'>Idle</span>";
dbsEl.innerHTML="<span class='os-idle'>Idle</span>";
renderEl.innerHTML="<div class='os-empty'>Output appears after the experiment step.</div>";
for(var k=0;k<STAGES.length;k++){ var el=$("os-stg-"+k); el.classList.remove("active","done"); }
}
// ---- inline SVG renders ----
function drawRender(kind){
if(kind==="loss") renderEl.innerHTML=svgLoss();
else if(kind==="protein") renderEl.innerHTML=svgProtein();
else renderEl.innerHTML=svgMolecule();
}
function svgLoss(){
var pts="0,10 22,34 44,58 66,78 88,96 110,112 132,122 154,130 176,135 198,138 220,140";
return "<svg viewBox='0 0 240 160' width='240'>"+
"<line x1='24' y1='6' x2='24' y2='150' stroke='#2b2f2b'/><line x1='24' y1='150' x2='234' y2='150' stroke='#2b2f2b'/>"+
"<polyline points='"+shift(pts)+"' fill='none' stroke='#76B900' stroke-width='2.5' stroke-linecap='round'>"+
"<animate attributeName='stroke-dasharray' from='0,400' to='400,0' dur='1.1s' fill='freeze'/></polyline>"+
"<text x='30' y='16' fill='#8b968a' font-size='9' font-family='monospace'>val loss</text>"+
"<text x='120' y='159' fill='#8b968a' font-size='8' font-family='monospace'>steps</text></svg>";
}
function shift(p){ return p.split(" ").map(function(pair){ var a=pair.split(","); return (+a[0]+24)+","+(+a[1]+8); }).join(" "); }
function svgProtein(){
var s="<svg viewBox='0 0 220 160' width='210'>";
for(var i=0;i<22;i++){
var x=20+i*8.6, y=80+Math.sin(i*0.9)*38, r=(i%2? 5:4);
s+="<circle cx='"+x.toFixed(1)+"' cy='"+y.toFixed(1)+"' r='"+r+"' fill='"+(i%3===0?'#76B900':'#3f5a1a')+"'>"+
"<animate attributeName='opacity' from='0' to='1' begin='"+(i*0.045)+"s' dur='0.3s' fill='freeze'/></circle>";
if(i>0){ var px=20+(i-1)*8.6, py=80+Math.sin((i-1)*0.9)*38;
s+="<line x1='"+px.toFixed(1)+"' y1='"+py.toFixed(1)+"' x2='"+x.toFixed(1)+"' y2='"+y.toFixed(1)+"' stroke='#4f7d00' stroke-width='2'/>"; }
}
s+="<text x='16' y='150' fill='#8b968a' font-size='9' font-family='monospace'>PDB structure (illustrative)</text></svg>";
return s;
}
function svgMolecule(){
var cx=110,cy=78,R=34, s="<svg viewBox='0 0 220 160' width='200'>", pts=[];
for(var i=0;i<6;i++){ var a=Math.PI/3*i-Math.PI/2; pts.push([cx+R*Math.cos(a), cy+R*Math.sin(a)]); }
for(var i=0;i<6;i++){ var p=pts[i], q=pts[(i+1)%6];
s+="<line x1='"+p[0].toFixed(1)+"' y1='"+p[1].toFixed(1)+"' x2='"+q[0].toFixed(1)+"' y2='"+q[1].toFixed(1)+"' stroke='#76B900' stroke-width='2.4'/>"; }
for(var i=0;i<6;i++){ var p=pts[i];
s+="<circle cx='"+p[0].toFixed(1)+"' cy='"+p[1].toFixed(1)+"' r='6' fill='#111' stroke='#76B900' stroke-width='2'>"+
"<animate attributeName='r' from='0' to='6' begin='"+(i*0.06)+"s' dur='0.25s' fill='freeze'/></circle>"; }
s+="<circle cx='"+(cx+R+18)+"' cy='"+cy+"' r='7' fill='#3f5a1a' stroke='#76B900' stroke-width='1.5'/>";
s+="<line x1='"+(pts[1][0]).toFixed(1)+"' y1='"+(pts[1][1]).toFixed(1)+"' x2='"+(cx+R+11)+"' y2='"+cy+"' stroke='#4f7d00' stroke-width='2'/>";
s+="<text x='24' y='150' fill='#8b968a' font-size='9' font-family='monospace'>candidate scaffold (illustrative)</text></svg>";
return s;
}
runBtn.onclick=run;
resetBtn.onclick=function(){ reset(); };
// auto-resize for WordPress iframe embed
function postHeight(){
var el=document.getElementById("os-demo");
var h=(el?el.offsetHeight:document.body.offsetHeight)+40;
if(window.parent) window.parent.postMessage({osDemoHeight:h},"*");
}
window.addEventListener("load",postHeight);
var mo=new MutationObserver(postHeight);
mo.observe(document.getElementById("os-log"),{childList:true});
mo.observe(document.getElementById("os-render"),{childList:true});
setInterval(postHeight,1200);
})();
</script>
</body>
</html>
">
Microsoft Research proposes BitNet Distillation , a pipeline that converts existing full precision LLMs into 1.58 bit BitNet students for specific tasks, while keeping accuracy close to the FP16 teacher and improving CPU efficiency. The method combines SubLN based architectural refinement , continued pre training , and dual signal distillation from logits and multi head attention relations. Reported results show up to 10× memory savings and about 2.65× faster CPU inference , with task metrics comparable to FP16 across multiple sizes. What BitNet Distillation changes? The community already showed that BitNet b1.58 can match full precision quality when trained from scratch, but converting a pretrained FP16 model directly to 1.58 bit often loses accuracy, and the gap grows as model size increases. BitNet Distillation targets this conversion problem for practical downstream deployment. It is designed to preserve accuracy while delivering CPU friendly ternary weights with INT8 activa...
Table of contents Introduction What Is MCP- RL? ART: The Agent Reinforcement Trainer Code Walkthrough: Specializing LLMs with MCP- RL Explanation: Under the Hood: How MCP- RL Generalizes Real-World Impact and Benchmarks Architectural Overview Practical Integration Summary Introduction Empowering large language models (LLMs) to fluidly interact with dynamic, real-world environments is a new frontier for AI engineering. The Model Context Protocol (MCP) specification offers a standardized gateway through which LLMs can interface with arbitrary external systems—APIs, file systems, databases, applications, or tools—without needing custom glue code or brittle prompt hacks each time. Still, leveraging such toolsets programmatically, with robust reasoning across multi-step tasks, remains a formidable challenge. This is where the recent combination of MCP- RL (a reinforcement learning loop targeting MCP servers) and the open-source ART (Agent Reinforcement Trainer) library ...
In today’s data-driven world, valuable insights are often buried in unstructured text—be it clinical notes, lengthy legal contracts, or customer feedback threads. Extracting meaningful, traceable information from these documents is both a technical and practical challenge. Google AI’s new open-source Python library, LangExtract , is designed to address this gap directly, using LLMs like Gemini to deliver powerful, automated extraction with traceability and transparency at its core. Key Innovations of LangExtract 1. Declarative and Traceable Extraction LangExtract lets users define custom extraction tasks using natural language instructions and high-quality “few-shot” examples. This empowers developers and analysts to specify exactly which entities, relationships, or facts to extract, and in what structure . Crucially, every extracted piece of information is tied directly back to its source text —enabling validation, auditing, and end-to-end traceability. 2....
Comments
Post a Comment