AIArtificial IntelligenceTrends

Synthetic Sciences Releases OpenScience: An Open-Source, Model-Agnostic AI Workbench for Machine Learning, Biology, Physics, and Chemistry Research

Views: 2
0 0
Read Time:16 Minute, 15 Second

  

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.

npm install -g @synsci/openscience
openscience

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>
“>


Check out the GitHub Repo here. Also, feel free to follow us on Twitter and don’t forget to join our 150k+ML SubReddit and Subscribe to our Newsletter. Wait! are you on telegram? now you can join us on telegram as well.

Need to partner with us for promoting your GitHub Repo OR Hugging Face Page OR Product Release OR Webinar etc.? Connect with us

The post Synthetic Sciences Releases OpenScience: An Open-Source, Model-Agnostic AI Workbench for Machine Learning, Biology, Physics, and Chemistry Research appeared first on MarkTechPost.

 

​MarkTechPost

Happy
Happy
0 %
Sad
Sad
0 %
Excited
Excited
0 %
Sleepy
Sleepy
0 %
Angry
Angry
0 %
Surprise
Surprise
0 %

Average Rating

5 Star
0%
4 Star
0%
3 Star
0%
2 Star
0%
1 Star
0%

Leave a Reply

Latest news