vibesketch.document.model

The vibe-sketch document, schema version 1.

A .vsk file is one JSON object. It carries the canvas state verbatim, in the engine’s own format (KET), so a drawing survives a round trip without loss, and a normalized layer the compute side reads: species with their identifiers, charge, multiplicity and 3D conformers; reactions with roles, arrows and conditions; program-neutral job specifications; the figure style; and provenance. The design is roadmap section 3.1; docs/document.md describes every field.

The model is strict. Unknown fields are refused rather than ignored, and the cross-references (a reaction’s species, a job’s species) must resolve, so an agent that writes a document gets told what is wrong instead of having its data silently dropped. schema/vibe-sketch-1.schema.json is generated from these classes (vibe-sketch schema) and must not be edited by hand.

Module Attributes

SCHEMA_ID

The value of a version-1 document's schema field.

Arrow

The arrows a reaction can carry (roadmap WP 3.1).

Task

the structure only.

MAX_HELM

The longest HELM a species records, or CXSMILES a generic structure has: well beyond the longest sequence vibe-sketch lays out.

NanoGroup

an edge or end termination or a sidewall group.

TubeEnd

terminated by a group, or closed with a fullerene hemisphere.

State

IUPAC's (s), (l), (g), (aq), and (ads) for an adsorbed species, also written with an asterisk.

ReferenceElectrode

The reference electrodes a potential can be stated against.

HighlightColour

Okabe and Ito's colour-universal-design palette, by name (see vibesketch.document.highlights).

Classes

Amount(*, species[, coefficient, ...])

What was entered for one participant of a reaction; nothing is inferred from the drawing.

BindingAnalysis(*, kind, cluster, adsorbate, ...)

Finite-cluster binding, with explicit free fragments and complex.

CalculationStage(*, program, spec)

One ordinary writer job, including combined optimisation/frequencies.

CampaignRecord(*, id, directory[, ...])

A vibe-queue campaign compiled from a recipe: where it is and what its nodes are.

Canvas(*, format[, data])

The drawing as the canvas engine stores it, embedded verbatim.

Capping(*, generic, cxsmiles, cap, labels)

How a labelled generic structure became a calculable species: its cap (#139).

Chirality(*, n[, m])

A nanotube wall's chiral indices (n, m), with 0 <= m <= n.

CitedValue(*, value, source)

An explicit thermodynamic choice; units are supplied by its field name.

Coefficient(*, species, value)

A participant's stoichiometric coefficient as drawn, such as the 2 of 2H2O (#141).

Conformer(*, method, symbols, xyz_angstrom)

One 3D structure of a species: element symbols and Cartesian coordinates.

ConformerSource(*, program[, version, ...])

Application provenance of an imported geometry; relaxation is opaque JSON.

Constraint(*, kind, atoms[, value])

A coordinate an optimisation holds fixed.

Defect(*, kind, site)

A lattice defect: a missing carbon, or a C-C bond turned by 90 degrees (Stone-Wales).

DftOptimization(*[, surface, optimizer, ...])

A geometry optimisation on a Kohn-Sham surface.

DftSurface(*[, functional, basis, ...])

A molecular Kohn-Sham surface: what energies, gradients and Hessians are taken on.

DlpnoOptions(*[, method, ...])

A DLPNO coupled-cluster single point at the parent's accepted geometry.

Document(*[, schema, revision, canvas, ...])

A vibe-sketch document, schema version 1.

Edit(*, revision, at, actor[, client])

One revision of the document: who changed it, through what, and why.

Electrons(*, side, count)

The electrons a half-reaction takes up or gives off, as drawn: 2e⁻ (#141).

Fullerene(*, kind, size)

Buckminsterfullerene C60 (Ih) or C70 (D5h).

Generic(*, id, kind, cxsmiles[, label, ...])

A structure in the drawing that is not one species (#90).

GeometryRef(*[, stage, conformer])

Where a stage takes its starting geometry.

Graphene(*, kind, width_nm, length_nm[, ...])

A rectangular graphene flake: zigzag edges along its width, armchair along its length.

HessianOptions(*[, surface, ...])

A finite-difference Hessian on a Kohn-Sham surface, at the parent's accepted geometry.

Highlight(*, species, atoms[, colour])

Atoms of a species marked in a colour, in every drawing and figure of it.

Job(*, id, species, program, spec[, runs])

A calculation to run on one species with one program.

JobSpec(*, task[, method, basis, aux_basis, ...])

A program-neutral description of a calculation.

MaceOptions(*[, model, weight_sha256, ...])

A MACE optimisation: the model, its device and precision, the convergence.

Name(*, value, source, confidence)

A name for a species, with where it came from and how sure it is.

NanoSite(*, along[, around, across])

Where on a nanostructure a group or defect goes; the nearest carbon is taken.

Nanoribbon(*, kind, edge, width, periods[, ...])

A graphene nanoribbon, N-AGNR or N-ZGNR, a whole number of periods long.

Nanostructure(*, parameters, identity, key, ...)

How a generated species was made: the parameters, and the graph its coordinates lack.

Nanotube(*, kind, walls[, length_nm, ...])

A single- or multi-walled carbon nanotube segment.

PeriodicCell(*[, axis])

The one-dimensional cell a finite segment repeats, recorded for periodic models.

Provenance(*, app[, created, edits])

Where the document came from.

Quantity(*, kind, value, unit[, reference, ...])

A condition at the arrow read with its unit: potential, pH, temperature, time (#141).

RGroup(*, number, substituents[, ...])

An R-group's definition: its substituents and conditions (#90).

Reaction(*, id, reactants[, reagents, ...])

One step of a scheme: who reacts, under which conditions, to give what.

Recipe(*, id[, name, runtime_version, ...])

A saved, reviewable staged workflow for species of the document.

RedoxAnalysis(*, kind, reaction, ...[, ...])

Reduction thermodynamics at 298.15 K, with explicit electron/proton conventions.

Resources(*[, nprocs, maxcore_mb])

What a job may use on the machine that runs it.

ResultEnergy(*, value[, units])

An absolute energy, with its location in the source output.

ResultExcitedStates(*, source, method[, ...])

The excited states a result lists, with their absorption lines.

ResultFile(*, name, sha256)

A content-addressed result artifact, never a client-controlled server path.

ResultMode(*, mode, wavenumber[, ...])

One harmonic vibration; an intensity the output does not give is null, never zero.

ResultNucleus(*, atom, element, isotropic[, ...])

One nucleus's isotropic shielding, by its atom index in the job's input.

ResultShieldings(*, source[, units])

Absolute NMR shieldings of every nucleus, as the program printed them.

ResultState(*, state, energy[, ...])

One excited state; an oscillator strength the output does not give is null.

ResultThermochemistry(*, temperature_k, ...)

Absolute thermal energies at one stated temperature and pressure.

ResultVibrations(*, source[, ...])

The harmonic vibrations a frequency result lists, with their IR and Raman lines.

Run(*[, queue, host, directory, container, ...])

One submission of a job to a queue.

RunResult(*, retrieved, parser, ...[, ...])

Verified output bound to the job and input species, not a reaction delta.

Sequence(*, helm, inchikey)

The monomer form of a peptide or nucleic acid the species was built from (#98).

SidewallGroup(*, group, site)

A group bonded to a basal-plane carbon, which becomes sp3.

SolidFormula(*, text, formula, key[, ...])

A solid given by its formula, without a molecular graph (#142).

Solvent(*, model, name)

An implicit solvation model and the solvent it describes.

Species(*, id[, label, smiles, inchikey, ...])

A molecule or ion that appears in the drawing.

Stage(*, id, kind[, label, parent, mace, ...])

One step of a recipe: what runs, after which stage, from which geometry.

StateLabel(*, species, state)

A participant's state as drawn beside it, such as Pb(s) or H+(aq) (#141).

Style(*[, preset])

How exported figures look.

Surface(*, id[, kind, facet, layers, ...])

A schematic surface, not a physical atomistic or periodic model (#140).

SurfaceAnchor(*[, u, v, dx, dy, site, ...])

A schematic attachment point, fractions of the image box; y runs down.

vibesketch.document.model.MAX_HELM = 50000

The longest HELM a species records, or CXSMILES a generic structure has: well beyond the longest sequence vibe-sketch lays out.

vibesketch.document.model.SCHEMA_ID: Final = 'vibe-sketch/1'

The value of a version-1 document’s schema field.

vibesketch.document.model.Arrow

The arrows a reaction can carry (roadmap WP 3.1).

alias of Literal[‘forward’, ‘equilibrium’, ‘retrosynthetic’, ‘resonance’]

class vibesketch.document.model.Canvas(*, format, data=<factory>)[source]

Bases: _Strict

The drawing as the canvas engine stores it, embedded verbatim.

Parameters:
format: Literal['ket']
data: dict[str, JsonValue]
model_config = {'extra': 'forbid', 'populate_by_name': True, 'validate_assignment': True}

Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].

class vibesketch.document.model.Capping(*, generic, cxsmiles, cap, labels)[source]

Bases: _Strict

How a labelled generic structure became a calculable species: its cap (#139).

Each attachment atom (CNT, Au, …) of the generic structure cxsmiles was replaced by cap, as the user chose; nothing is capped unasked.

Parameters:
  • generic (Annotated[str, StringConstraints(strip_whitespace=None, to_upper=None, to_lower=None, strict=None, min_length=None, max_length=None, pattern=^[A-Za-z][A-Za-z0-9_-]{0,63}$, ascii_only=None)])

  • cxsmiles (Annotated[str, StringConstraints(strip_whitespace=None, to_upper=None, to_lower=None, strict=None, min_length=None, max_length=50000, pattern=^\S+( \|[^\n]*\|)?$, ascii_only=None)])

  • cap (Literal['H', 'CH3'])

  • labels (Annotated[list[Annotated[str, StringConstraints(strip_whitespace=None, to_upper=None, to_lower=None, strict=None, min_length=1, max_length=500, pattern=None, ascii_only=None)]], MinLen(min_length=1)])

generic: _Identifier
cxsmiles: _CXSmiles
cap: Literal['H', 'CH3']
labels: list[_Text]
model_config = {'extra': 'forbid', 'populate_by_name': True, 'validate_assignment': True}

Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].

class vibesketch.document.model.SolidFormula(*, text, formula, key, polymorph=None, state=None, composition, molar_mass_g_mol=None)[source]

Bases: _Strict

A solid given by its formula, without a molecular graph (#142).

Oxides, salts, catalysts and scales: Fe2O3, Pb3(CO3)2(OH)2, CuSO4·5H2O, Fe3−xCrxO4, γ-Al2O3. key (the canonical formula with polymorph and state) identifies it instead of an InChIKey. Nothing is calculated for it: that needs its structure (roadmap Phase 5).

Parameters:
  • text (Annotated[str, StringConstraints(strip_whitespace=None, to_upper=None, to_lower=None, strict=None, min_length=1, max_length=500, pattern=None, ascii_only=None)])

  • formula (Annotated[str, StringConstraints(strip_whitespace=None, to_upper=None, to_lower=None, strict=None, min_length=1, max_length=200, pattern=None, ascii_only=None)])

  • key (Annotated[str, StringConstraints(strip_whitespace=None, to_upper=None, to_lower=None, strict=None, min_length=1, max_length=220, pattern=None, ascii_only=None)])

  • polymorph (Annotated[str, StringConstraints(strip_whitespace=None, to_upper=None, to_lower=None, strict=None, min_length=1, max_length=1, pattern=None, ascii_only=None)] | None)

  • state (Literal['s', 'l', 'g', 'aq', 'ads'] | None)

  • composition (dict[str, float | str])

  • molar_mass_g_mol (Annotated[float | None, Gt(gt=0), AllowInfNan(allow_inf_nan=False)])

text: _Text
formula: Annotated[str, StringConstraints(min_length=1, max_length=200)]
key: Annotated[str, StringConstraints(min_length=1, max_length=220)]
polymorph: Annotated[str, StringConstraints(min_length=1, max_length=1)] | None
state: Literal['s', 'l', 'g', 'aq', 'ads'] | None
composition: dict[str, float | str]
molar_mass_g_mol: float | None
model_config = {'extra': 'forbid', 'populate_by_name': True, 'validate_assignment': True}

Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].

class vibesketch.document.model.Coefficient(*, species, value)[source]

Bases: _Strict

A participant’s stoichiometric coefficient as drawn, such as the 2 of 2H2O (#141).

Parameters:
  • species (Annotated[str, StringConstraints(strip_whitespace=None, to_upper=None, to_lower=None, strict=None, min_length=None, max_length=None, pattern=^[A-Za-z][A-Za-z0-9_-]{0,63}$, ascii_only=None)])

  • value (Annotated[float, Gt(gt=0), AllowInfNan(allow_inf_nan=False)])

species: _Identifier
value: _Positive
model_config = {'extra': 'forbid', 'populate_by_name': True, 'validate_assignment': True}

Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].

class vibesketch.document.model.Electrons(*, side, count)[source]

Bases: _Strict

The electrons a half-reaction takes up or gives off, as drawn: 2e⁻ (#141).

Electrons are no species, as SMILES cannot write one; they are counted in the charge balance on their side.

Parameters:
side: Literal['reactants', 'products']
count: int
model_config = {'extra': 'forbid', 'populate_by_name': True, 'validate_assignment': True}

Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].

class vibesketch.document.model.Quantity(*, kind, value, unit, reference=None, kcl_mol_l=None, text)[source]

Bases: _Strict

A condition at the arrow read with its unit: potential, pH, temperature, time (#141).

Parameters:
  • kind (Literal['potential', 'ph', 'temperature', 'time'])

  • value (Annotated[float, AllowInfNan(allow_inf_nan=False)])

  • unit (Literal['V', 'pH', '°C', 'K', 's', 'min', 'h', 'd'])

  • reference (Literal['SHE', 'NHE', 'SCE', 'RHE', 'Ag/AgCl'] | None)

  • kcl_mol_l (Annotated[float, FieldInfo(annotation=NoneType, required=True, metadata=[Gt(gt=0), AllowInfNan(allow_inf_nan=False)])] | None)

  • text (Annotated[str, StringConstraints(strip_whitespace=None, to_upper=None, to_lower=None, strict=None, min_length=1, max_length=500, pattern=None, ascii_only=None)])

kind: Literal['potential', 'ph', 'temperature', 'time']
value: float
unit: Literal['V', 'pH', '°C', 'K', 's', 'min', 'h', 'd']
reference: ReferenceElectrode | None
kcl_mol_l: _Positive | None
text: _Text
model_config = {'extra': 'forbid', 'populate_by_name': True, 'validate_assignment': True}

Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].

vibesketch.document.model.ReferenceElectrode

The reference electrodes a potential can be stated against.

alias of Literal[‘SHE’, ‘NHE’, ‘SCE’, ‘RHE’, ‘Ag/AgCl’]

vibesketch.document.model.State

IUPAC’s (s), (l), (g), (aq), and (ads) for an adsorbed species, also written with an asterisk.

Type:

The states a participant’s label can give

alias of Literal[‘s’, ‘l’, ‘g’, ‘aq’, ‘ads’]

class vibesketch.document.model.StateLabel(*, species, state)[source]

Bases: _Strict

A participant’s state as drawn beside it, such as Pb(s) or H+(aq) (#141).

Parameters:
  • species (Annotated[str, StringConstraints(strip_whitespace=None, to_upper=None, to_lower=None, strict=None, min_length=None, max_length=None, pattern=^[A-Za-z][A-Za-z0-9_-]{0,63}$, ascii_only=None)])

  • state (Literal['s', 'l', 'g', 'aq', 'ads'])

species: _Identifier
state: State
model_config = {'extra': 'forbid', 'populate_by_name': True, 'validate_assignment': True}

Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].

class vibesketch.document.model.Chirality(*, n, m=0)[source]

Bases: _Strict

A nanotube wall’s chiral indices (n, m), with 0 <= m <= n.

Parameters:
n: int
m: int
model_config = {'extra': 'forbid', 'populate_by_name': True, 'validate_assignment': True}

Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].

class vibesketch.document.model.Conformer(*, method, symbols, xyz_angstrom, source=None)[source]

Bases: _Strict

One 3D structure of a species: element symbols and Cartesian coordinates.

Parameters:
  • method (Annotated[str, StringConstraints(strip_whitespace=None, to_upper=None, to_lower=None, strict=None, min_length=None, max_length=None, pattern=^[a-z0-9][a-z0-9_.:+-]{0,63}$, ascii_only=None)])

  • symbols (Annotated[list[str], MinLen(min_length=1)])

  • xyz_angstrom (list[list[float]])

  • source (ConformerSource | None)

method: _Token
symbols: list[str]
xyz_angstrom: list[list[float]]
source: ConformerSource | None
electron_count(charge)[source]

Electrons in the neutral atoms, less the charge.

Parameters:

charge (int)

Return type:

int

model_config = {'extra': 'forbid', 'populate_by_name': True, 'validate_assignment': True}

Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].

class vibesketch.document.model.Defect(*, kind, site)[source]

Bases: _Strict

A lattice defect: a missing carbon, or a C-C bond turned by 90 degrees (Stone-Wales).

Parameters:
kind: Literal['vacancy', 'stone-wales']
site: NanoSite
model_config = {'extra': 'forbid', 'populate_by_name': True, 'validate_assignment': True}

Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].

class vibesketch.document.model.Fullerene(*, kind, size)[source]

Bases: _Strict

Buckminsterfullerene C60 (Ih) or C70 (D5h).

Parameters:
kind: Literal['fullerene']
size: Literal[60, 70]
model_config = {'extra': 'forbid', 'populate_by_name': True, 'validate_assignment': True}

Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].

class vibesketch.document.model.Graphene(*, kind, width_nm, length_nm, edges='H', sidewall=<factory>, defects=<factory>)[source]

Bases: _Strict

A rectangular graphene flake: zigzag edges along its width, armchair along its length.

Parameters:
kind: Literal['graphene']
width_nm: float
length_nm: float
edges: NanoGroup
sidewall: list[SidewallGroup]
defects: list[Defect]
model_config = {'extra': 'forbid', 'populate_by_name': True, 'validate_assignment': True}

Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].

vibesketch.document.model.NanoGroup

an edge or end termination or a sidewall group.

Type:

A group bonded to a nanostructure’s carbon

alias of Literal[‘H’, ‘OH’, ‘COOH’]

class vibesketch.document.model.NanoSite(*, along, around=None, across=None)[source]

Bases: _Strict

Where on a nanostructure a group or defect goes; the nearest carbon is taken.

along is the fraction of the length; around is the angle about a nanotube’s axis in degrees, across the fraction of a sheet’s or ribbon’s width.

Parameters:
  • along (Annotated[float, Ge(ge=0), Le(le=1), AllowInfNan(allow_inf_nan=False)])

  • around (Annotated[float | None, Ge(ge=0), Lt(lt=360), AllowInfNan(allow_inf_nan=False)])

  • across (Annotated[float | None, Ge(ge=0), Le(le=1), AllowInfNan(allow_inf_nan=False)])

along: float
around: float | None
across: float | None
model_config = {'extra': 'forbid', 'populate_by_name': True, 'validate_assignment': True}

Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].

class vibesketch.document.model.Nanoribbon(*, kind, edge, width, periods, edges='H', sidewall=<factory>, defects=<factory>)[source]

Bases: _Strict

A graphene nanoribbon, N-AGNR or N-ZGNR, a whole number of periods long.

Parameters:
kind: Literal['nanoribbon']
edge: Literal['armchair', 'zigzag']
width: int
periods: int
edges: NanoGroup
sidewall: list[SidewallGroup]
defects: list[Defect]
model_config = {'extra': 'forbid', 'populate_by_name': True, 'validate_assignment': True}

Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].

class vibesketch.document.model.Nanostructure(*, parameters, identity, key, description, formula, bonds, periodic=None)[source]

Bases: _Strict

How a generated species was made: the parameters, and the graph its coordinates lack.

The atoms are the species’ first conformer (method nanostructure); bonds connect them. A nanostructure has no SMILES or InChI; key identifies it instead, from the parameters alone.

Parameters:
  • parameters (Nanotube | Graphene | Nanoribbon | Fullerene)

  • identity (Annotated[str, StringConstraints(strip_whitespace=None, to_upper=None, to_lower=None, strict=None, min_length=1, max_length=4000, pattern=None, ascii_only=None)])

  • key (Annotated[str, StringConstraints(strip_whitespace=None, to_upper=None, to_lower=None, strict=None, min_length=None, max_length=None, pattern=^NANO-[0-9A-F]{20}$, ascii_only=None)])

  • description (Annotated[str, StringConstraints(strip_whitespace=None, to_upper=None, to_lower=None, strict=None, min_length=1, max_length=500, pattern=None, ascii_only=None)])

  • formula (Annotated[str, StringConstraints(strip_whitespace=None, to_upper=None, to_lower=None, strict=None, min_length=None, max_length=None, pattern=^([A-Z][a-z]?[0-9]*)+$, ascii_only=None)])

  • bonds (list[tuple[Annotated[int, FieldInfo(annotation=NoneType, required=True, metadata=[Ge(ge=0)])], Annotated[int, FieldInfo(annotation=NoneType, required=True, metadata=[Ge(ge=0)])], float]])

  • periodic (PeriodicCell | None)

parameters: NanostructureParameters
identity: Annotated[str, StringConstraints(min_length=1, max_length=4000)]
key: Annotated[str, StringConstraints(pattern='^NANO-[0-9A-F]{20}$')]
description: _Text
formula: Annotated[str, StringConstraints(pattern='^([A-Z][a-z]?[0-9]*)+$')]
bonds: list[tuple[Annotated[int, Field(ge=0)], Annotated[int, Field(ge=0)], float]]
periodic: PeriodicCell | None
model_config = {'extra': 'forbid', 'populate_by_name': True, 'validate_assignment': True}

Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].

class vibesketch.document.model.Nanotube(*, kind, walls, length_nm=None, periods=None, ends=('H', 'H'), sidewall=<factory>, defects=<factory>)[source]

Bases: _Strict

A single- or multi-walled carbon nanotube segment.

Parameters:
kind: Literal['nanotube']
walls: list[Chirality]
length_nm: float | None
periods: int | None
ends: tuple[TubeEnd, TubeEnd]
sidewall: list[SidewallGroup]
defects: list[Defect]
model_config = {'extra': 'forbid', 'populate_by_name': True, 'validate_assignment': True}

Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].

class vibesketch.document.model.PeriodicCell(*, axis='z', translation_angstrom, carbons_per_period)[source]

Bases: _Strict

The one-dimensional cell a finite segment repeats, recorded for periodic models.

Nothing writes it yet; it is what a periodic calculation of the infinite structure needs (roadmap Phase 5).

Parameters:
axis: Literal['z']
translation_angstrom: float
carbons_per_period: int
model_config = {'extra': 'forbid', 'populate_by_name': True, 'validate_assignment': True}

Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].

class vibesketch.document.model.SidewallGroup(*, group, site)[source]

Bases: _Strict

A group bonded to a basal-plane carbon, which becomes sp3.

Parameters:
group: NanoGroup
site: NanoSite
model_config = {'extra': 'forbid', 'populate_by_name': True, 'validate_assignment': True}

Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].

vibesketch.document.model.TubeEnd

terminated by a group, or closed with a fullerene hemisphere.

Type:

How a nanotube end is finished

alias of Literal[‘H’, ‘OH’, ‘COOH’, ‘capped’]

class vibesketch.document.model.Generic(*, id, kind, cxsmiles, label=None, rgroups=<factory>, labels=<factory>)[source]

Bases: _Strict

A structure in the drawing that is not one species (#90).

An R-group core, whose R-group atoms are labelled _R1 and so on, a group in polymer brackets (SRU, COP, MUL or GEN), or a structure bonded to labelled attachment atoms that stand for a material, such as CNT or Au (#139), as CXSMILES without coordinates. Derived from the drawing like species; the drawing is the source of truth.

Parameters:
  • id (Annotated[str, StringConstraints(strip_whitespace=None, to_upper=None, to_lower=None, strict=None, min_length=None, max_length=None, pattern=^[A-Za-z][A-Za-z0-9_-]{0,63}$, ascii_only=None)])

  • kind (Literal['rgroup-core', 'bracketed', 'labelled'])

  • cxsmiles (Annotated[str, StringConstraints(strip_whitespace=None, to_upper=None, to_lower=None, strict=None, min_length=None, max_length=50000, pattern=^\S+( \|[^\n]*\|)?$, ascii_only=None)])

  • label (Annotated[str, StringConstraints(strip_whitespace=None, to_upper=None, to_lower=None, strict=None, min_length=1, max_length=500, pattern=None, ascii_only=None)] | None)

  • rgroups (list[Annotated[int, FieldInfo(annotation=NoneType, required=True, metadata=[Ge(ge=1)])]])

  • labels (list[Annotated[str, StringConstraints(strip_whitespace=None, to_upper=None, to_lower=None, strict=None, min_length=1, max_length=500, pattern=None, ascii_only=None)]])

id: _Identifier
kind: Literal['rgroup-core', 'bracketed', 'labelled']
cxsmiles: _CXSmiles
label: _Text | None
rgroups: list[Annotated[int, Field(ge=1)]]
labels: list[_Text]
model_config = {'extra': 'forbid', 'populate_by_name': True, 'validate_assignment': True}

Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].

class vibesketch.document.model.Constraint(*, kind, atoms, value=None)[source]

Bases: _Strict

A coordinate an optimisation holds fixed.

Atoms are 0-based indices into the species’ conformer: the drawing’s atoms first, then the hydrogens.

Parameters:
  • kind (Literal['distance', 'angle', 'dihedral', 'position'])

  • atoms (list[Annotated[int, FieldInfo(annotation=NoneType, required=True, metadata=[Ge(ge=0)])]])

  • value (float | None)

kind: Literal['distance', 'angle', 'dihedral', 'position']
atoms: list[Annotated[int, Field(ge=0)]]
value: float | None
model_config = {'extra': 'forbid', 'populate_by_name': True, 'validate_assignment': True}

Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].

class vibesketch.document.model.Document(*, schema='vibe-sketch/1', revision=0, canvas=<factory>, species=<factory>, reactions=<factory>, jobs=<factory>, recipes=<factory>, highlights=<factory>, generics=<factory>, rgroups=<factory>, surfaces=<factory>, style=<factory>, provenance)[source]

Bases: _Strict

A vibe-sketch document, schema version 1.

Parameters:
model_config = {'extra': 'forbid', 'json_schema_extra': {'description': 'A .vsk file: a drawing and what to compute from it.'}, 'populate_by_name': True, 'title': 'vibe-sketch document', 'validate_assignment': True}

Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].

schema_id: Literal['vibe-sketch/1']
revision: int
canvas: Canvas
species: list[Species]
reactions: list[Reaction]
jobs: list[Job]
recipes: list[Recipe]
highlights: list[Highlight]
generics: list[Generic]
rgroups: list[RGroup]
surfaces: list[Surface]
style: Style
provenance: Provenance
species_by_id(identifier)[source]

The species with identifier; raises KeyError when there is none.

Parameters:

identifier (str)

Return type:

Species

job_by_id(identifier)[source]

The job with identifier; raises KeyError when there is none.

Parameters:

identifier (str)

Return type:

Job

to_json_data()[source]

The document as JSON-compatible data, in the field order of the schema.

Unset optional fields are left out; the canvas data is kept exactly as it came, nulls included.

Return type:

dict[str, Any]

class vibesketch.document.model.Edit(*, revision, at, actor, client=None, summary)[source]

Bases: _Strict

One revision of the document: who changed it, through what, and why.

Parameters:
  • revision (Annotated[int, Ge(ge=1)])

  • at (AwareDatetime)

  • actor (Literal['human', 'agent', 'system'])

  • client (Annotated[str, StringConstraints(strip_whitespace=None, to_upper=None, to_lower=None, strict=None, min_length=None, max_length=None, pattern=^[a-z0-9][a-z0-9_.:+-]{0,63}$, ascii_only=None)] | None)

  • summary (Annotated[str, StringConstraints(strip_whitespace=None, to_upper=None, to_lower=None, strict=None, min_length=1, max_length=500, pattern=None, ascii_only=None)])

revision: int
at: AwareDatetime
actor: Literal['human', 'agent', 'system']
client: _Token | None
summary: _Text
model_config = {'extra': 'forbid', 'populate_by_name': True, 'validate_assignment': True}

Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].

class vibesketch.document.model.Job(*, id, species, program, spec, runs=None)[source]

Bases: _Strict

A calculation to run on one species with one program.

Parameters:
  • id (Annotated[str, StringConstraints(strip_whitespace=None, to_upper=None, to_lower=None, strict=None, min_length=None, max_length=None, pattern=^[A-Za-z][A-Za-z0-9_-]{0,63}$, ascii_only=None)])

  • species (Annotated[str, StringConstraints(strip_whitespace=None, to_upper=None, to_lower=None, strict=None, min_length=None, max_length=None, pattern=^[A-Za-z][A-Za-z0-9_-]{0,63}$, ascii_only=None)])

  • program (Annotated[str, StringConstraints(strip_whitespace=None, to_upper=None, to_lower=None, strict=None, min_length=None, max_length=None, pattern=^[a-z0-9][a-z0-9_.:+-]{0,63}$, ascii_only=None)])

  • spec (JobSpec)

  • runs (list[Run] | None)

id: _Identifier
species: _Identifier
program: _Token
spec: JobSpec
runs: list[Run] | None
model_config = {'extra': 'forbid', 'populate_by_name': True, 'validate_assignment': True}

Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].

class vibesketch.document.model.JobSpec(*, task, method=None, basis=None, aux_basis=None, approximation=None, dispersion=None, solvent=None, states=None, constraints=None, resources=None)[source]

Bases: _Strict

A program-neutral description of a calculation.

Writers translate it into one program’s input and refuse, with a reason, whatever they cannot express (AGENTS.md, ground rule 5). The model only checks that the specification is consistent in itself.

Parameters:
  • task (Literal['geometry', 'sp', 'opt', 'freq', 'opt+freq', 'tddft', 'nmr'])

  • method (Annotated[str, StringConstraints(strip_whitespace=None, to_upper=None, to_lower=None, strict=None, min_length=None, max_length=None, pattern=^[A-Za-z0-9][A-Za-z0-9()+*/,_.-]{0,63}$, ascii_only=None)] | None)

  • basis (Annotated[str, StringConstraints(strip_whitespace=None, to_upper=None, to_lower=None, strict=None, min_length=None, max_length=None, pattern=^[A-Za-z0-9][A-Za-z0-9()+*/_.-]{0,63}$, ascii_only=None)] | None)

  • aux_basis (Annotated[str, StringConstraints(strip_whitespace=None, to_upper=None, to_lower=None, strict=None, min_length=None, max_length=None, pattern=^[A-Za-z0-9][A-Za-z0-9()+*/_.-]{0,63}$, ascii_only=None)] | None)

  • approximation (Annotated[str, StringConstraints(strip_whitespace=None, to_upper=None, to_lower=None, strict=None, min_length=None, max_length=None, pattern=^[A-Za-z0-9][A-Za-z0-9()_-]{0,31}$, ascii_only=None)] | None)

  • dispersion (Annotated[str, StringConstraints(strip_whitespace=None, to_upper=None, to_lower=None, strict=None, min_length=None, max_length=None, pattern=^[A-Za-z0-9][A-Za-z0-9()_-]{0,31}$, ascii_only=None)] | None)

  • solvent (Solvent | None)

  • states (Annotated[int | None, Ge(ge=1), Le(le=200)])

  • constraints (list[Constraint] | None)

  • resources (Resources | None)

task: Task
method: _MethodName | None
basis: _BasisName | None
aux_basis: _BasisName | None
approximation: _Keyword | None
dispersion: _Keyword | None
solvent: Solvent | None
states: int | None
constraints: list[Constraint] | None
resources: Resources | None
static calculation_fields()[source]

The fields that only mean something for a calculation.

Return type:

tuple[str, …]

model_config = {'extra': 'forbid', 'populate_by_name': True, 'validate_assignment': True}

Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].

class vibesketch.document.model.Name(*, value, source, confidence)[source]

Bases: _Strict

A name for a species, with where it came from and how sure it is.

Parameters:
  • value (Annotated[str, StringConstraints(strip_whitespace=None, to_upper=None, to_lower=None, strict=None, min_length=1, max_length=500, pattern=None, ascii_only=None)])

  • source (Annotated[str, StringConstraints(strip_whitespace=None, to_upper=None, to_lower=None, strict=None, min_length=None, max_length=None, pattern=^[a-z0-9][a-z0-9_.:+-]{0,63}$, ascii_only=None)])

  • confidence (Literal['high', 'medium', 'low'])

value: _Text
source: _Token
confidence: Literal['high', 'medium', 'low']
model_config = {'extra': 'forbid', 'populate_by_name': True, 'validate_assignment': True}

Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].

class vibesketch.document.model.Provenance(*, app, created=<factory>, edits=<factory>)[source]

Bases: _Strict

Where the document came from.

Parameters:
  • app (Annotated[str, StringConstraints(strip_whitespace=None, to_upper=None, to_lower=None, strict=None, min_length=1, max_length=500, pattern=None, ascii_only=None)])

  • created (AwareDatetime)

  • edits (list[Edit])

app: _Text
created: AwareDatetime
edits: list[Edit]
model_config = {'extra': 'forbid', 'populate_by_name': True, 'validate_assignment': True}

Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].

class vibesketch.document.model.RGroup(*, number, substituents, occurrence=None, rest_h=False, if_then=None)[source]

Bases: _Strict

An R-group’s definition: its substituents and conditions (#90).

Parameters:
  • number (Annotated[int, Ge(ge=1)])

  • substituents (Annotated[list[Annotated[str, StringConstraints(strip_whitespace=None, to_upper=None, to_lower=None, strict=None, min_length=None, max_length=50000, pattern=^\S+( \|[^\n]*\|)?$, ascii_only=None)]], MinLen(min_length=1)])

  • occurrence (Annotated[str, StringConstraints(strip_whitespace=None, to_upper=None, to_lower=None, strict=None, min_length=1, max_length=500, pattern=None, ascii_only=None)] | None)

  • rest_h (bool)

  • if_then (Annotated[int | None, Ge(ge=1)])

number: int
substituents: list[_CXSmiles]
occurrence: _Text | None
rest_h: bool
if_then: int | None
model_config = {'extra': 'forbid', 'populate_by_name': True, 'validate_assignment': True}

Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].

class vibesketch.document.model.Reaction(*, id, reactants, reagents=<factory>, products, arrow='forward', conditions=<factory>, yield_=None, amounts=<factory>, coefficients=<factory>, electrons=None, states=<factory>, quantities=<factory>)[source]

Bases: _Strict

One step of a scheme: who reacts, under which conditions, to give what.

Parameters:
  • id (Annotated[str, StringConstraints(strip_whitespace=None, to_upper=None, to_lower=None, strict=None, min_length=None, max_length=None, pattern=^[A-Za-z][A-Za-z0-9_-]{0,63}$, ascii_only=None)])

  • reactants (Annotated[list[Annotated[str, StringConstraints(strip_whitespace=None, to_upper=None, to_lower=None, strict=None, min_length=None, max_length=None, pattern=^[A-Za-z][A-Za-z0-9_-]{0,63}$, ascii_only=None)]], MinLen(min_length=1)])

  • reagents (list[Annotated[str, StringConstraints(strip_whitespace=None, to_upper=None, to_lower=None, strict=None, min_length=None, max_length=None, pattern=^[A-Za-z][A-Za-z0-9_-]{0,63}$, ascii_only=None)]])

  • products (Annotated[list[Annotated[str, StringConstraints(strip_whitespace=None, to_upper=None, to_lower=None, strict=None, min_length=None, max_length=None, pattern=^[A-Za-z][A-Za-z0-9_-]{0,63}$, ascii_only=None)]], MinLen(min_length=1)])

  • arrow (Literal['forward', 'equilibrium', 'retrosynthetic', 'resonance'])

  • conditions (list[Annotated[str, StringConstraints(strip_whitespace=None, to_upper=None, to_lower=None, strict=None, min_length=1, max_length=500, pattern=None, ascii_only=None)]])

  • yield_ (Annotated[str, StringConstraints(strip_whitespace=None, to_upper=None, to_lower=None, strict=None, min_length=1, max_length=500, pattern=None, ascii_only=None)] | None)

  • amounts (list[Amount])

  • coefficients (list[Coefficient])

  • electrons (Electrons | None)

  • states (list[StateLabel])

  • quantities (list[Quantity])

id: _Identifier
reactants: list[_Identifier]
reagents: list[_Identifier]
products: list[_Identifier]
arrow: Arrow
conditions: list[_Text]
yield_: _Text | None
amounts: list[Amount]
coefficients: list[Coefficient]
electrons: Electrons | None
states: list[StateLabel]
quantities: list[Quantity]
species_ids()[source]
Return type:

list[str]

coefficient(species)[source]

The drawn coefficient of species, 1 when none is drawn.

Parameters:

species (str)

Return type:

float

model_config = {'extra': 'forbid', 'populate_by_name': True, 'validate_assignment': True}

Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].

class vibesketch.document.model.Resources(*, nprocs=1, maxcore_mb=None)[source]

Bases: _Strict

What a job may use on the machine that runs it.

Parameters:
nprocs: int
maxcore_mb: int | None
model_config = {'extra': 'forbid', 'populate_by_name': True, 'validate_assignment': True}

Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].

class vibesketch.document.model.Run(*, queue='vibe-queue', host='localhost', id, submitted, directory=None, container=None, group=None, result=None)[source]

Bases: _Strict

One submission of a job to a queue.

Parameters:
  • queue (Literal['vibe-queue'])

  • host (Annotated[str, StringConstraints(strip_whitespace=None, to_upper=None, to_lower=None, strict=None, min_length=None, max_length=None, pattern=^[A-Za-z0-9][A-Za-z0-9_.-]{0,63}$, ascii_only=None)])

  • id (Annotated[str, StringConstraints(strip_whitespace=None, to_upper=None, to_lower=None, strict=None, min_length=None, max_length=None, pattern=^[A-Za-z0-9_-]{1,64}$, ascii_only=None)])

  • submitted (AwareDatetime)

  • directory (Annotated[str, StringConstraints(strip_whitespace=None, to_upper=None, to_lower=None, strict=None, min_length=1, max_length=4096, pattern=None, ascii_only=None)] | None)

  • container (Annotated[str, StringConstraints(strip_whitespace=None, to_upper=None, to_lower=None, strict=None, min_length=1, max_length=4096, pattern=None, ascii_only=None)] | None)

  • group (Annotated[str, StringConstraints(strip_whitespace=None, to_upper=None, to_lower=None, strict=None, min_length=None, max_length=None, pattern=^[A-Za-z][A-Za-z0-9_-]{0,63}$, ascii_only=None)] | None)

  • result (RunResult | None)

queue: Literal['vibe-queue']
host: Annotated[str, StringConstraints(pattern='^[A-Za-z0-9][A-Za-z0-9_.-]{0,63}$')]
id: Annotated[str, StringConstraints(pattern='^[A-Za-z0-9_-]{1,64}$')]
submitted: AwareDatetime
directory: _Path | None
container: _Path | None
group: _Identifier | None
result: RunResult | None
model_config = {'extra': 'forbid', 'populate_by_name': True, 'validate_assignment': True}

Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].

class vibesketch.document.model.Sequence(*, helm, inchikey)[source]

Bases: _Strict

The monomer form of a peptide or nucleic acid the species was built from (#98).

It is trusted only for the structure it was built as, which inchikey names: a species whose drawing has changed loses it.

Parameters:
  • helm (Annotated[str, StringConstraints(strip_whitespace=None, to_upper=None, to_lower=None, strict=None, min_length=1, max_length=50000, pattern=None, ascii_only=None)])

  • inchikey (Annotated[str, StringConstraints(strip_whitespace=None, to_upper=None, to_lower=None, strict=None, min_length=None, max_length=None, pattern=^[A-Z]{14}-[A-Z]{10}-[A-Z]$, ascii_only=None)])

helm: Annotated[str, StringConstraints(min_length=1, max_length=MAX_HELM)]
inchikey: _InChIKey
model_config = {'extra': 'forbid', 'populate_by_name': True, 'validate_assignment': True}

Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].

class vibesketch.document.model.Solvent(*, model, name)[source]

Bases: _Strict

An implicit solvation model and the solvent it describes.

Parameters:
  • model (Literal['CPCM', 'SMD'])

  • name (Annotated[str, StringConstraints(strip_whitespace=None, to_upper=None, to_lower=None, strict=None, min_length=None, max_length=None, pattern=^[A-Za-z0-9][A-Za-z0-9 ,()'-]{0,63}$, ascii_only=None)])

model: Literal['CPCM', 'SMD']
name: _SolventName
model_config = {'extra': 'forbid', 'populate_by_name': True, 'validate_assignment': True}

Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].

class vibesketch.document.model.Species(*, id, label=None, smiles=None, inchikey=None, charge=0, multiplicity=1, name=None, conformers=<factory>, sequence=None, nanostructure=None, capped=None, solid=None)[source]

Bases: _Strict

A molecule or ion that appears in the drawing.

Parameters:
  • id (Annotated[str, StringConstraints(strip_whitespace=None, to_upper=None, to_lower=None, strict=None, min_length=None, max_length=None, pattern=^[A-Za-z][A-Za-z0-9_-]{0,63}$, ascii_only=None)])

  • label (Annotated[str, StringConstraints(strip_whitespace=None, to_upper=None, to_lower=None, strict=None, min_length=1, max_length=500, pattern=None, ascii_only=None)] | None)

  • smiles (Annotated[str, StringConstraints(strip_whitespace=None, to_upper=None, to_lower=None, strict=None, min_length=None, max_length=None, pattern=^\S+$, ascii_only=None)] | None)

  • inchikey (Annotated[str, StringConstraints(strip_whitespace=None, to_upper=None, to_lower=None, strict=None, min_length=None, max_length=None, pattern=^[A-Z]{14}-[A-Z]{10}-[A-Z]$, ascii_only=None)] | None)

  • charge (int)

  • multiplicity (Annotated[int, Ge(ge=1)])

  • name (Name | None)

  • conformers (list[Conformer])

  • sequence (Sequence | None)

  • nanostructure (Nanostructure | None)

  • capped (Capping | None)

  • solid (SolidFormula | None)

id: _Identifier
label: _Text | None
smiles: _Smiles | None
inchikey: _InChIKey | None
charge: int
multiplicity: int
name: Name | None
conformers: list[Conformer]
sequence: Sequence | None
nanostructure: Nanostructure | None
capped: Capping | None
solid: SolidFormula | None
model_config = {'extra': 'forbid', 'populate_by_name': True, 'validate_assignment': True}

Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].

class vibesketch.document.model.Style(*, preset='acs-1996')[source]

Bases: _Strict

How exported figures look.

Parameters:

preset (Annotated[str, StringConstraints(strip_whitespace=None, to_upper=None, to_lower=None, strict=None, min_length=None, max_length=None, pattern=^[a-z0-9][a-z0-9_.:+-]{0,63}$, ascii_only=None)])

preset: _Token
model_config = {'extra': 'forbid', 'populate_by_name': True, 'validate_assignment': True}

Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].

class vibesketch.document.model.Surface(*, id, kind='surface', material, facet=None, layers=<factory>, diameter_nm=None, ligand_shell=None, nanotube=None, count=5, anchors=<factory>)[source]

Bases: _Strict

A schematic surface, not a physical atomistic or periodic model (#140).

Parameters:
  • id (Annotated[str, StringConstraints(strip_whitespace=None, to_upper=None, to_lower=None, strict=None, min_length=None, max_length=None, pattern=^[A-Za-z][A-Za-z0-9_-]{0,63}$, ascii_only=None)])

  • kind (Literal['surface', 'electrode', 'stack', 'nanoparticle', 'nanotube-array'])

  • material (Annotated[str, MinLen(min_length=1), MaxLen(max_length=80), _PydanticGeneralMetadata(pattern='^[A-Za-z0-9 ()/.,+-]+$')])

  • facet (Annotated[str | None, MaxLen(max_length=40), _PydanticGeneralMetadata(pattern='^[0-9 ()-]+$')])

  • layers (Annotated[list[str], MaxLen(max_length=12)])

  • diameter_nm (Annotated[float | None, Gt(gt=0), Le(le=100000), AllowInfNan(allow_inf_nan=False)])

  • ligand_shell (Annotated[str | None, MaxLen(max_length=80), _PydanticGeneralMetadata(pattern='^[A-Za-z0-9 ()/.,+-]+$')])

  • nanotube (Annotated[str, StringConstraints(strip_whitespace=None, to_upper=None, to_lower=None, strict=None, min_length=None, max_length=None, pattern=^[A-Za-z][A-Za-z0-9_-]{0,63}$, ascii_only=None)] | None)

  • count (Annotated[int, Ge(ge=1), Le(le=20)])

  • anchors (Annotated[dict[Annotated[str, StringConstraints(strip_whitespace=None, to_upper=None, to_lower=None, strict=None, min_length=None, max_length=None, pattern=^[A-Za-z][A-Za-z0-9_-]{0,63}$, ascii_only=None)], SurfaceAnchor], MaxLen(max_length=32)])

id: _Identifier
kind: Literal['surface', 'electrode', 'stack', 'nanoparticle', 'nanotube-array']
material: str
facet: str | None
layers: list[str]
diameter_nm: float | None
ligand_shell: str | None
nanotube: _Identifier | None
count: int
anchors: dict[_Identifier, SurfaceAnchor]
model_config = {'extra': 'forbid', 'populate_by_name': True, 'validate_assignment': True}

Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].

class vibesketch.document.model.SurfaceAnchor(*, u=0.5, v=0, dx=0, dy=1, site=None, repeat=1, generics=<factory>)[source]

Bases: _Strict

A schematic attachment point, fractions of the image box; y runs down.

Parameters:
  • u (Annotated[float, Ge(ge=0), Le(le=1)])

  • v (Annotated[float, Ge(ge=0), Le(le=1)])

  • dx (float)

  • dy (float)

  • site (Literal['top', 'bridge', 'hollow'] | None)

  • repeat (Annotated[int, Ge(ge=1), Le(le=10000)])

  • generics (list[Annotated[str, StringConstraints(strip_whitespace=None, to_upper=None, to_lower=None, strict=None, min_length=None, max_length=None, pattern=^[A-Za-z][A-Za-z0-9_-]{0,63}$, ascii_only=None)]])

u: float
v: float
dx: float
dy: float
site: Literal['top', 'bridge', 'hollow'] | None
repeat: int
generics: list[_Identifier]
model_config = {'extra': 'forbid', 'populate_by_name': True, 'validate_assignment': True}

Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].

vibesketch.document.model.Task

the structure only.

Type:

What a job computes. geometry is no calculation

alias of Literal[‘geometry’, ‘sp’, ‘opt’, ‘freq’, ‘opt+freq’, ‘tddft’, ‘nmr’]