Software development · Applied AI · Science
I work on AI tools and software systems. My interests include model training, agents, and software design.
In my free time, I explore liquid crystals and molecular self-assembly.
- Website: https://esmirnov.ai
- Email: eduard@esmirnov.ai
- NematicLab: https://nematiclab.com
| Repository | What it does |
|---|---|
| TinyTask | Train local text classifiers and route uncertain requests to review. Measure accepted accuracy, coverage, and unknown acceptance with TF-IDF or SetFit. Python. |
| Nematic game | Explore liquid crystals, material structures, ions, fields, and local brushes. TypeScript. Demo · @esmirnov.ai/nematic-game on npm. |
| DNA damage lab | Explore UV, X-rays, heat, electric fields, and oxidants. Add antioxidants, filters, and repair. TypeScript. Demo · @esmirnov.ai/dna-mutation-explorer on npm. |
| Sperm Lab | Explore sperm movement, anatomy, and DNA with 12 independent factors. TypeScript. Demo · @esmirnov.ai/sperm-lab on npm. |
| TableProof | Find suspected errors in extracted PDF tables with source evidence, HTML reports, and optional local vision models. Python. |
| ToolBoundary | Find changes to AI tool arguments, results, and errors across MCP and agent framework boundaries. Python and Node.js. |
| Workflow engine: Python services | Runs parallel JSON workflows with an API, orchestrator, workers, PostgreSQL, and Redis Streams. |
| Workflow engine: Go monolith | Runs durable JSON workflows in one Go app with PostgreSQL, retries, and recovery. |
| Workflow engine: LangGraph monolith | Runs JSON workflows with FastAPI and LangGraph. PostgreSQL stores state and checkpoints. |
| Skills | Reusable Markdown skills for science research and controlled LLM experiments. Check everyday science evidence or test what changes a model's answer. |
Python on PyPI · Support inbox demo · Comparison with Prompt2Model and SetFit · MVP plan
TinyTask is an alpha Python library. It trains a classifier for a stable label set and routes uncertain requests to review. Its acceptance report helps examine a local candidate before deployment.
Use Python 3.11 or later in a virtual environment. Install the package, then run the offline demo.
python -m pip install tiny-task-py
tiny-task demo --output tiny-task-demo
tiny-task predict --model tiny-task-demo/model --text "Please cancel my subscription"Open tiny-task-demo/index.html to examine the report. The demo trains, exports, and loads a local model without an API key or model download.
The package also accepts a CSV inbox with id and text columns.
tiny-task predict --model tiny-task-demo/model --input inbox.csv --output predictions.jsonlUse a new output path for each run. The small demo reports needs_data because its test set cannot support release approval.
For the optional SetFit backend, install the neural dependencies:
python -m pip install 'tiny-task-py[neural]'The Python import is tiny_task. Read the training instructions for your own label set and data.
The three science packages use the @esmirnov.ai npm scope.
Open the lab · npm package · Read the component API
Nematic game supplies a reusable React component and a standalone demo. Explore Liquid, Nematic, and Solid structures with ions, fields, and local brushes. The model uses relative scales for play and explanation.
On desktop, the field uses about 52% of the component width. The controls appear beside the field. On narrow screens, the controls appear below it.
Install the component in a React app.
npm install @esmirnov.ai/nematic-game@0.3.1Import the component and its stylesheet.
import { NematicLab } from "@esmirnov.ai/nematic-game";
import "@esmirnov.ai/nematic-game/styles.css";
<NematicLab
initialMaterial={{ heat: 0.15, density: 0.65 }}
theme={{ sample: "#172D42", rodHigh: "#91DCE5" }}
/>The component supplies defaults for the other settings.
Reset sample restores the initial configuration.
Use @esmirnov.ai/nematic-game/core for the engine and canvas renderer without React.
You can change the source to add your own tools and visual effects.
Open the lab · npm package · Read the component API
Expose flexible DNA to UV, X-rays, heat, electric fields, or oxidants. Add antioxidants, filters, shields, and repair. The atomic view shows electron excitation, ionization, and bond changes. The model uses illustrative settings. It does not predict physical doses or health effects.
Install the package in a React app.
npm install @esmirnov.ai/dna-mutation-explorer@0.4.1Import the component and its stylesheet.
import { DnaDamageLab } from "@esmirnov.ai/dna-mutation-explorer/react";
import "@esmirnov.ai/dna-mutation-explorer/styles.css";
<DnaDamageLab />The package also supplies a TypeScript engine without React. All sequence data stays in the browser.
Open the lab · npm package · Read the component API
Change 12 factors in one live sample. Inspect heads, tails, midpieces, DNA, and movement. The model uses synthetic cells. Its illustrative settings do not predict personal fertility.
Install the package in a React app.
npm install @esmirnov.ai/sperm-lab@0.4.1Import the component and its stylesheet.
import { SpermLab } from "@esmirnov.ai/sperm-lab";
import "@esmirnov.ai/sperm-lab/styles.css";
<SpermLab initialFactors={{ smoking: 0.5, heat: 0.3 }} />The component runs in the browser without a backend.
Use @esmirnov.ai/sperm-lab/core for the simulation without React.
Python on PyPI · Node.js on npm · Examples and explanation
ToolBoundary compares what a tool parser expects with what a framework delivers to a handler or client. Use it to check input defaults, structured results, and error messages.
For Python 3.11 or later, install the MCP adapter in a virtual environment.
python -m pip install 'tool-boundary-py[mcp-v1]'Save this as check_tool.py. It checks that the default limit: 10 reaches a test handler and that its result reaches the MCP client.
import asyncio
from pydantic import BaseModel
from tool_boundary import probe_mcp_tool, report_to_json
class Input(BaseModel):
limit: int = 10
def count(limit: int = 10) -> dict[str, int]:
return {"count": limit}
def register(server, handler):
server.tool()(handler)
report = asyncio.run(probe_mcp_tool(
case_id="python.default",
tool_name="count",
arguments={},
reference=Input.model_validate,
register=register,
stub_handler=count,
expected_structured={"count": 10},
))
print(report_to_json(report))Run python check_tool.py. The JSON report includes an outcome and the expected and observed values. This example should return pass; a mismatch returns fail with the field path. unsupported and harness_error mean the check could not complete.
Use a stub handler when adapting the example to your own tool registration. The probe runs locally and needs no API key.
For Node.js 22 or later, install the package and the MCP adapter dependencies.
npm install @esmirnov.ai/tool-boundary @modelcontextprotocol/sdk zodFollow the MCP Node.js example to check structured output. The WorkflowAgent example checks parser defaults and transforms through a separate adapter.
Python on PyPI · Regression example · Benchmark evidence
TableProof is an alpha Python library that finds suspected errors in extracted PDF tables. It compares cell text and row or column positions with the original PDF regions.
Use Python 3.11 or later in a virtual environment. Install the package, then audit a digital PDF and its Docling JSON export.
python -m pip install table-proof-py
table-proof source.pdf docling-export.json --html report.html --json report.jsonsource.pdf is the original PDF. docling-export.json must contain the extracted table cells and their source coordinates. Open report.html to inspect findings beside source evidence, or use report.json in your own workflow.
You can also run an audit from Python.
import json
from pathlib import Path
from table_proof import audit_tables
document = json.loads(Path("docling-export.json").read_text())
report = audit_tables("source.pdf", document)
print(report.status)
report.export_json("report.json")
report.export_html("report.html", source_pdf="source.pdf")The CLI returns 0 for no_findings, 1 for suspected errors (review), 3 for missing or ambiguous evidence (uncertain), and 2 for an execution error. no_findings means the selected checks found no error; it does not prove semantic accuracy.
To try it with supplied files, follow the recorded regression case. The affected fixture reports two swapped row labels and exits with code 1; the fixed control exits with code 0.
Science Research checks everyday science questions, with evidence notes and a separate report of personal experiences.
LLM Counterfactual Lab designs controlled experiments for evidence use, rule transfer, and LLM judge bias. Change decisive evidence and irrelevant cues independently, then score correct answer changes and stability together.
git clone --depth 1 https://github.com/eduard-s/skills.git ai-skillsAdd the complete individual skill folder, including references/, to your assistant's supported skills location. Both skills are static Markdown. The LLM Counterfactual Lab README explains its use and limits.
Example request:
Use llm-counterfactual-lab.
Design a small experiment to test whether my document assistant follows
the supplied evidence. Include changed-evidence and missing-evidence cases.
I do not have a target model interface here.
The skill can design a protocol or analyze supplied responses without a model API. Its six-call worked example is unrun, and its response patterns are synthetic. Native imports and live target-model execution have not been tested for this skill.