Endpoints: 28,729MCP servers: 18,413Payout addresses: 2,071Paid calls: 1,537Letters: 14Defects: 1,323counted 4 min ago
teppi

Server definition

Hash
sha256:e6cd09162b38140d1cdf5485e01de54f3430c4bf617982fd8c6019cfe002a904
What it is
What a remote MCP server returned when asked what it offers: 18 tools

The blob, as servednamed by its sha256

{ "instructions": "Experimental. Dive Kit: a Bühlmann ZH-L16C deco planner with gradient factors, gas blending, breathing-rate, gas-usage and weighting calculators, vetted references, cylinders and certifications. Numbers come from tool results. Cite lookup_references for theory and practice answers. With every plan, state the parameters (depth, time, gases, cylinders and fills, gradient factors, reserve) and any assumption. Relay each result's safety_notice with every plan, mix or fill; never call a result safe, verified or guaranteed. For trained divers only: say so if the user does not seem trained for the dive or gas work. You can misreport numbers: tell the user to check the plan in the Dive Kit app or a second source. Not a dive computer or medical advice. get_guide('start_here') opens the guide.", "tools": [ { "description": "Use this when the diver asks what gas to breathe at a depth or which deco gases to carry: returns the richest bottom mix within a PPO₂ limit (default 1.4 bar) and an END limit (default 30 m, 98 ft), the nearest standard fill inside the same limits, and the standard deco gas ladder for that depth with switch depths. Not for checking one named gas (gas_specs) or planning the dive (plan_dive).\n\nThe ladder is the common choice, not a prescription: none to 30 m, EANx50 to 45 m, EANx50 and oxygen to 60 m, and a travel gas deeper. A bottom mix under 18% O₂ needs descent_gas in plan_dive. No engine call.\n\nExample: {\"depth\":50}", "inputSchema": { "$schema": "https://json-schema.org/draft/2020-12/schema", "additionalProperties": false, "properties": { "altitude": { "description": "Surface altitude (m or ft, per units), 0 to 10000 m (32800 ft). Default 0.", "maximum": 32800, "minimum": 0, "type": "number" }, "depth": { "description": "Target (maximum) depth in m (metric) or ft (imperial). Required.", "maximum": 1000, "minimum": 0, "type": "number" }, "ppo2_max": { "description": "PPO₂ limit in bar at the target depth, 1.0 to 1.6. Default 1.4, a working bottom-gas limit.", "maximum": 1.6, "minimum": 1, "type": "number" }, "style": { "description": "auto (default): nitrox when it meets target_end, else trimix. nitrox: no helium, END reported but not enforced. trimix: the standard fill comes from the trimix list.", "enum": [ "auto", "nitrox", "trimix" ], "type": "string" }, "target_end": { "description": "Deepest equivalent narcotic depth (END) allowed at depth, in m or ft. Helium is added to meet it. Default 30 m (98 ft).", "maximum": 1000, "minimum": 0, "type": "number" }, "temperature": { "description": "Water temperature for gas density, in °C (metric, -2 to 40) or °F (imperial, 28 to 104). Default 15 °C.", "maximum": 104, "minimum": -2, "type": "number" }, "units": { "description": "metric (m, bar, L, °C) or imperial (ft, psi, ft³, °F): the unit system for every value in and out. Default metric.", "enum": [ "metric", "imperial" ], "type": "string" }, "water": { "description": "Water type, from its density: en13319 (EN 13319, the dive computer standard) 10.00 m per bar, salt 9.95, fresh 10.20, red_sea 9.92. Default en13319.", "enum": [ "salt", "fresh", "en13319", "red_sea" ], "type": "string" } }, "required": [ "depth" ], "type": "object" }, "name": "best_mix", "outputSchema": { "$schema": "https://json-schema.org/draft/2020-12/schema", "additionalProperties": false, "properties": { "best_mix": { "additionalProperties": false, "description": "Richest mix: O₂ floored to a whole percent, He rounded up to 0.1 (0 for nitrox).", "properties": { "density_g_l": { "description": "Gas density at the target depth, g/L to 0.1, at temperature (default 15 °C).", "type": "number" }, "end": { "description": "END at the target depth.", "type": "number" }, "helium_pct": { "description": "He %.", "type": "number" }, "helium_pct_for_density_limit": { "description": "Only when density is over 5.2 g/L: the total helium % (O₂ unchanged) that brings it to 5.2 g/L at the target depth. null when under 5.2, or when no helium fraction can.", "type": [ "number", "null" ] }, "mod": { "description": "MOD at cap_used_bar, whole m or ft, floored.", "type": "number" }, "oxygen_pct": { "description": "O₂ %.", "type": "number" } }, "required": [ "oxygen_pct", "helium_pct", "mod", "end", "density_g_l", "helium_pct_for_density_limit" ], "type": "object" }, "cap_used_bar": { "description": "PPO₂ limit used.", "type": "number" }, "deco_ladder": { "description": "Standard travel and deco gases for this depth; empty to 30 m (100 ft).", "items": { "additionalProperties": false, "properties": { "helium_pct": { "type": "number" }, "oxygen_pct": { "type": "number" }, "role": { "enum": [ "travel", "deco", "oxygen" ], "type": "string" }, "switch_depth": { "description": "travel: where to switch to the bottom mix on the descent. deco and oxygen: where to switch on the ascent.", "type": "number" }, "why": { "type": "string" } }, "required": [ "oxygen_pct", "helium_pct", "switch_depth", "role", "why" ], "type": "object" }, "type": "array" }, "depth": { "description": "Target depth, as given.", "type": "number" }, "safety_notice": { "type": "string" }, "spoken_summary": { "description": "A few plain sentences for a voice reply, ending with an offer: digits allowed, no symbols or notation.", "type": "string" }, "standard_mix": { "additionalProperties": false, "description": "Nearest standard fill (air, EANx28 to EANx50, 25/25 to 10/70) within the same PPO₂ and END limits at this depth.", "properties": { "density_g_l": { "description": "Gas density at the target depth, g/L to 0.1, at temperature (default 15 °C).", "type": "number" }, "end": { "description": "END at the target depth.", "type": "number" }, "helium_pct": { "description": "He %.", "type": "number" }, "helium_pct_for_density_limit": { "description": "Only when density is over 5.2 g/L: the total helium % (O₂ unchanged) that brings it to 5.2 g/L at the target depth. null when under 5.2, or when no helium fraction can.", "type": [ "number", "null" ] }, "mod": { "description": "MOD at cap_used_bar, whole m or ft, floored.", "type": "number" }, "oxygen_pct": { "description": "O₂ %.", "type": "number" } }, "required": [ "oxygen_pct", "helium_pct", "mod", "end", "density_g_l", "helium_pct_for_density_limit" ], "type": "object" }, "units": { "description": "metric (m, bar, L, °C) or imperial (ft, psi, ft³, °F): the unit system for every value in and out. Default metric.", "enum": [ "metric", "imperial" ], "type": "string" } }, "required": [ "units", "depth", "best_mix", "deco_ladder", "cap_used_bar", "spoken_summary", "safety_notice" ], "type": "object" } }, { "description": "Returns the settings for continuous-flow blending through a compressor intake: each feed gas's share of the intake flow, the analyzer readings to aim for after the first injection and at the end, and the pressure to bleed to first when the cylinder's gas is in the way. Use this when a blender fills with fixed air, oxygen and helium feeds (a nitrox stick or membrane) and asks what ratios or analyzer targets give a mix. Not for partial-pressure fills (plan_blend).\n\ncurrent is the cylinder now, as in plan_blend; target: oxygen_pct, helium_pct, pressure. injection_order he_first (default) or o2_first picks which intermediate analyzer reading the text leads with; both come back. bleed_step rounds the bleed down to a gauge mark, default 5 bar (100 psi). An impossible mix returns feasible false with the reason. No engine call.\n\nExample: {\"current\":{\"oxygen_pct\":21,\"pressure\":0},\"target\":{\"oxygen_pct\":32,\"pressure\":200}}", "inputSchema": { "$schema": "https://json-schema.org/draft/2020-12/schema", "additionalProperties": false, "properties": { "altitude": { "description": "Altitude (m or ft, per units), 0 to 10000 m (32800 ft). Lowers the surface pressure the math adds to gauge readings. Default 0.", "maximum": 32800, "minimum": 0, "type": "number" }, "bleed_step": { "description": "Gauge step the bleed pressure rounds down to (bar or psi). Default 5 bar (100 psi).", "maximum": 500, "minimum": 1, "type": "number" }, "current": { "additionalProperties": false, "description": "The cylinder now: analysed mix, gauge pressure and size.", "properties": { "cylinder_size": { "description": "Metric: water volume of ONE cylinder in litres, the number stamped on the neck. Imperial: rated capacity in ft³ at rated_pressure (an AL80 is 77.4). Default: the preset's, else an AL80 (11.1 L).", "maximum": 400, "minimum": 0.5, "type": "number" }, "helium_pct": { "description": "Helium % now, 0 to 100. Default 0.", "maximum": 100, "minimum": 0, "type": "number" }, "oxygen_pct": { "description": "Oxygen % of the gas in the cylinder now, as analysed, 0 to 100. Air is 21; an empty cylinder is 21 at pressure 0.", "maximum": 100, "minimum": 0, "type": "number" }, "preset": { "description": "A common cylinder instead of cylinder_size, as in plan_dive: al80, al40, al63, hp80, hp100, hp120, lp85, s80, single_10l, single_12l, single_15l, twin_10l, twin_12l, twin_15l, stage_11l, stage_7l, o2_3l, dil_3l. twin_ presets are a manifolded pair.", "enum": [ "al80", "al40", "al63", "hp80", "hp100", "hp120", "lp85", "s80", "single_10l", "single_12l", "single_15l", "twin_10l", "twin_12l", "twin_15l", "stage_11l", "stage_7l", "o2_3l", "dil_3l" ], "type": "string" }, "pressure": { "description": "Gauge pressure now (bar or psi, per units), 0 to 500 bar (7252 psi).", "maximum": 7252, "minimum": 0, "type": "number" }, "rated_pressure": { "description": "Imperial only: the psi the capacity is rated at. Default: the preset's, else 3000. Ignored on metric.", "maximum": 7252, "minimum": 725, "type": "number" }, "twinset": { "description": "true for two cylinders on a manifold, filled or breathed together: doubles the volume. Default: the preset's, else false.", "type": "boolean" } }, "required": [ "oxygen_pct", "pressure" ], "type": "object" }, "injection_order": { "description": "Order the feeds join the intake: he_first (helium, then oxygen; the default) or o2_first. Picks which intermediate analyzer reading the text leads with; both are returned.", "enum": [ "he_first", "o2_first" ], "type": "string" }, "target": { "additionalProperties": false, "description": "The mix and settled pressure to reach.", "properties": { "helium_pct": { "description": "Target helium %, 0 to 100. Default 0.", "maximum": 100, "minimum": 0, "type": "number" }, "oxygen_pct": { "description": "Target oxygen %, 0 to 100 (EANx32 is 32, trimix 21/35 is 21).", "maximum": 100, "minimum": 0, "type": "number" }, "pressure": { "description": "Target gauge pressure once the cylinder has cooled (bar or psi, per units).", "maximum": 7252, "minimum": 0, "type": "number" } }, "required": [ "oxygen_pct", "pressure" ], "type": "object" }, "units": { "description": "metric (m, bar, L, °C) or imperial (ft, psi, ft³, °F): the unit system for every value in and out. Default metric.", "enum": [ "metric", "imperial" ], "type": "string" } }, "required": [ "current", "target" ], "type": "object" }, "name": "blend_continuous", "outputSchema": { "$schema": "https://json-schema.org/draft/2020-12/schema", "additionalProperties": false, "properties": { "analyzer_final_pct": { "description": "Oxygen % the analyzer reads on the finished stream.", "type": "number" }, "analyzer_intermediate_he_first_pct": { "description": "He first: oxygen % after helium joins the air, before oxygen.", "type": "number" }, "analyzer_intermediate_o2_first_pct": { "description": "O₂ first: oxygen % after oxygen joins the air, before helium.", "type": "number" }, "bleed_pressure": { "description": "Bleed the cylinder to this gauge pressure first; absent when no bleed is needed.", "type": "number" }, "blend": { "additionalProperties": false, "description": "The intake stream the whole fill must be.", "properties": { "helium_pct": { "type": "number" }, "oxygen_pct": { "type": "number" } }, "required": [ "oxygen_pct", "helium_pct" ], "type": "object" }, "error": { "additionalProperties": false, "properties": { "code": { "type": "string" }, "key": { "type": "string" }, "reason": { "type": "string" } }, "required": [ "code", "key", "reason" ], "type": "object" }, "feasible": { "type": "boolean" }, "notes": { "items": { "type": "string" }, "type": "array" }, "ratios": { "description": "Share of the intake flow per feed.", "items": { "additionalProperties": false, "properties": { "fraction_pct": { "type": "number" }, "gas": { "enum": [ "air", "oxygen", "helium" ], "type": "string" } }, "required": [ "gas", "fraction_pct" ], "type": "object" }, "type": "array" }, "safety_notice": { "type": "string" }, "spoken_summary": { "description": "A few plain sentences for a voice reply, ending with an offer: digits allowed, no symbols or notation.", "type": "string" }, "units": { "description": "metric (m, bar, L, °C) or imperial (ft, psi, ft³, °F): the unit system for every value in and out. Default metric.", "enum": [ "metric", "imperial" ], "type": "string" } }, "required": [ "units", "feasible", "ratios", "notes", "spoken_summary", "safety_notice" ], "type": "object" } }, { "description": "Returns a weighting check for one rig: how much lead to add or remove to be neutral at the end of the dive, the net buoyancy at the start (full cylinders at the target depth) and the end (near-empty cylinders at 3 m), what a flooded drysuit, a failed wing or a dropped stage would do and how to recover, and advisories. Use this when a diver asks how much weight they need, whether a rig is balanced, or how a change of suit, cylinder or water moves it. Not for gas planning.\n\ncylinders take a role (single, twinset, sidemount, stage) and cylinder: a lookup_cylinders id (al80, steel12-232) or a plan_dive preset, or cylinder_size and empty_buoyancy for one not in the data. Weights are kg (lb imperial); gear weight is positive when it sinks. Omitted fields take Dive Kit defaults (en13319 water, 30 m, a 5 mm full wetsuit, a 16 kg wing, no body offset), listed in assumptions. An estimate to start from: confirm with an in-water weight check. Compare two setups with two calls. No engine call.\n\nExample: {\"cylinders\":[{\"role\":\"single\",\"cylinder\":\"al80\"}],\"exposure\":{\"type\":\"wetsuit\",\"thickness_mm\":7},\"gear\":[{\"label\":\"belt\",\"weight\":6,\"ditchable\":true}]}", "inputSchema": { "$schema": "https://json-schema.org/draft/2020-12/schema", "additionalProperties": false, "properties": { "cylinders": { "description": "Cylinders on the rig. Default one single AL80.", "items": { "additionalProperties": false, "properties": { "cylinder": { "description": "A lookup_cylinders id (al80, steel12-232, hp100) or a plan_dive preset (al80, twin_12l, stage_11l). For twinset and sidemount name ONE cylinder of the pair. Default al80.", "maxLength": 40, "type": "string" }, "cylinder_lead": { "description": "Lead fixed to each cylinder (a tail or V-weight), kg (lb). Default 0.", "maximum": 250, "minimum": -100, "type": "number" }, "cylinder_size": { "description": "For a cylinder not in the data: water litres of one cylinder, or ft³ at rated_pressure on imperial. Needs empty_buoyancy.", "maximum": 400, "minimum": 0.5, "type": "number" }, "empty_buoyancy": { "description": "For a cylinder not in the data: buoyancy of one empty cylinder with its valve, kg (lb imperial), negative when it sinks. From the maker's sheet.", "maximum": 250, "minimum": -100, "type": "number" }, "helium_pct": { "description": "Helium % of the gas in it. Default 0.", "maximum": 95, "minimum": 0, "type": "number" }, "oxygen_pct": { "description": "Oxygen % of the gas in it. Default 21.", "maximum": 100, "minimum": 5, "type": "number" }, "rated_pressure": { "description": "Imperial only, with cylinder_size: the psi its ft³ is rated at. Default 3000.", "maximum": 7252, "minimum": 725, "type": "number" }, "regulator": { "description": "Regulator on each cylinder: travel, standard, cold_water or none. Default by role: standard (single, sidemount), cold_water (twinset), travel (stage).", "enum": [ "travel", "standard", "cold_water", "none" ], "type": "string" }, "rigging": { "description": "Count bands, manifold or stage hardware. Default true for twinset, sidemount and stage.", "type": "boolean" }, "role": { "description": "single, twinset (two on a manifold), sidemount (a pair, one each side) or stage (one slung cylinder; one entry per stage).", "enum": [ "single", "twinset", "sidemount", "stage" ], "type": "string" }, "start_pressure": { "description": "Fill at the start (bar or psi). Default: the preset fill, else the dataset working pressure.", "maximum": 7252, "minimum": 0, "type": "number" } }, "required": [ "role" ], "type": "object" }, "maxItems": 6, "minItems": 1, "type": "array" }, "diver": { "additionalProperties": false, "description": "The diver. With no body_offset but height, weight, age and sex, body buoyancy is estimated; with neither it is taken as neutral.", "properties": { "age": { "description": "Age in years.", "maximum": 100, "minimum": 10, "type": "integer" }, "body_fat_pct": { "description": "Body fat %, else estimated from height and weight.", "maximum": 60, "minimum": 3, "type": "number" }, "body_offset": { "description": "Personal buoyancy from an in-water weight check, kg (lb), positive floats. Wins over the estimate.", "maximum": 250, "minimum": -100, "type": "number" }, "body_offset_water": { "description": "Water type, from its density: en13319 (EN 13319, the dive computer standard) 10.00 m per bar, salt 9.95, fresh 10.20, red_sea 9.92. Default en13319.", "enum": [ "salt", "fresh", "en13319", "red_sea" ], "type": "string" }, "height": { "description": "Height, cm (in imperial): 100 to 250 cm (39.4 to 98.4 in).", "maximum": 250, "minimum": 39, "type": "number" }, "sex": { "description": "male or female, for the lung and body-fat estimate.", "enum": [ "male", "female" ], "type": "string" }, "weight": { "description": "Body weight, kg (lb imperial): 20 to 250 kg (44.1 to 551.2 lb).", "maximum": 552, "minimum": 20, "type": "number" } }, "type": "object" }, "exposure": { "additionalProperties": false, "description": "Exposure suit. Default a 5 mm full wetsuit.", "properties": { "booties_mm": { "description": "Bootie thickness in mm; 0 or omitted for none.", "maximum": 10, "minimum": 0, "type": "number" }, "custom_lift": { "description": "Measured suit lift at the surface, kg (lb), instead of the model.", "maximum": 250, "minimum": -100, "type": "number" }, "cut": { "description": "Wetsuit cut: full (default), shorty or farmer_john.", "enum": [ "full", "shorty", "farmer_john" ], "type": "string" }, "gloves_mm": { "description": "Glove thickness in mm; 0 or omitted for none.", "maximum": 10, "minimum": 0, "type": "number" }, "hood_mm": { "description": "Hood thickness in mm; 0 or omitted for none.", "maximum": 10, "minimum": 0, "type": "number" }, "neoprene": { "description": "Wetsuit foam: soft (new, compresses most), standard (default) or old (about 20% less lift).", "enum": [ "soft", "standard", "old" ], "type": "string" }, "thickness_mm": { "description": "Wetsuit neoprene thickness in mm (both unit systems), 0 to 10. Default 5.", "maximum": 10, "minimum": 0, "type": "number" }, "type": { "description": "none, wetsuit or drysuit.", "enum": [ "none", "wetsuit", "drysuit" ], "type": "string" }, "undersuit": { "description": "Drysuit undersuit: light, medium (default) or heavy.", "enum": [ "light", "medium", "heavy" ], "type": "string" }, "vest_mm": { "description": "Vest or hooded vest thickness in mm; 0 or omitted for none.", "maximum": 10, "minimum": 0, "type": "number" } }, "required": [ "type" ], "type": "object" }, "gear": { "description": "Lead and other gear. Omit to get the lead the rig needs from zero.", "items": { "additionalProperties": false, "properties": { "ditchable": { "description": "Can be dropped in an emergency. Default false.", "type": "boolean" }, "label": { "description": "What it is: belt, trim pockets, backplate, torch.", "maxLength": 40, "type": "string" }, "weight": { "description": "In-water weight, kg (lb), positive when it sinks (a 6 kg belt is 6).", "maximum": 250, "minimum": -100, "type": "number" } }, "required": [ "label", "weight" ], "type": "object" }, "maxItems": 20, "type": "array" }, "target_depth": { "description": "Deepest point of the dive (m or ft), where full cylinders are checked. Default 30 m (98 ft).", "maximum": 1000, "minimum": 0, "type": "number" }, "units": { "description": "metric (m, bar, L, °C) or imperial (ft, psi, ft³, °F): the unit system for every value in and out. Default metric.", "enum": [ "metric", "imperial" ], "type": "string" }, "water": { "description": "Water type, from its density: en13319 (EN 13319, the dive computer standard) 10.00 m per bar, salt 9.95, fresh 10.20, red_sea 9.92. Default en13319.", "enum": [ "salt", "fresh", "en13319", "red_sea" ], "type": "string" }, "wing": { "additionalProperties": false, "description": "Buoyancy devices.", "properties": { "lift": { "description": "Wing lift, kg (lb). Default 16 kg.", "maximum": 250, "minimum": -100, "type": "number" }, "lift_bag_lift": { "description": "Emergency lift from a lift bag, kg (lb); omit for none.", "maximum": 250, "minimum": -100, "type": "number" }, "redundant_bladder_lift": { "description": "Second bladder lift, kg (lb); omit for none.", "maximum": 250, "minimum": -100, "type": "number" }, "smb_lift": { "description": "Emergency lift from an SMB, kg (lb); omit for none.", "maximum": 250, "minimum": -100, "type": "number" } }, "type": "object" } }, "type": "object" }, "name": "buoyancy_check", "outputSchema": { "$schema": "https://json-schema.org/draft/2020-12/schema", "additionalProperties": false, "properties": { "advisories": { "items": { "additionalProperties": false, "properties": { "detail": { "type": "string" }, "key": { "type": "string" }, "severity": { "enum": [ "critical", "warning" ], "type": "string" }, "title": { "type": "string" } }, "required": [ "key", "severity", "title", "detail" ], "type": "object" }, "type": "array" }, "assumptions": { "items": { "type": "string" }, "type": "array" }, "cylinders": { "items": { "additionalProperties": false, "properties": { "count": { "type": "number" }, "cylinder": { "type": "string" }, "helium_pct": { "type": "number" }, "name": { "type": "string" }, "oxygen_pct": { "type": "number" }, "role": { "type": "string" }, "start_pressure": { "type": "number" } }, "required": [ "role", "count", "cylinder", "name", "start_pressure", "oxygen_pct", "helium_pct" ], "type": "object" }, "type": "array" }, "end_of_dive": { "additionalProperties": false, "properties": { "action": { "type": "string" }, "breakdown": { "additionalProperties": false, "properties": { "body": { "type": "number" }, "cylinders": { "type": "number" }, "ditchable": { "type": "number" }, "gas": { "type": "number" }, "gear": { "type": "number" }, "suit_lift": { "type": "number" } }, "required": [ "gas", "suit_lift", "cylinders", "gear", "ditchable", "body" ], "type": "object" }, "depth": { "type": "number" }, "explanation": { "type": "string" }, "message": { "type": "string" }, "net_buoyancy": { "description": "Positive floats, negative sinks.", "type": "number" }, "status": { "enum": [ "pass", "warning", "fail" ], "type": "string" } }, "required": [ "status", "depth", "net_buoyancy", "breakdown", "message", "explanation" ], "type": "object" }, "failure_scenarios": { "items": { "additionalProperties": false, "properties": { "can_recover": { "type": "boolean" }, "ditch_required": { "type": "number" }, "explanation": { "type": "string" }, "message": { "type": "string" }, "name": { "type": "string" }, "recovery_options": { "items": { "type": "string" }, "type": "array" }, "scenario": { "enum": [ "flooded_suit", "wing_failure", "lost_stage" ], "type": "string" }, "status": { "enum": [ "pass", "warning", "fail" ], "type": "string" } }, "required": [ "scenario", "status", "can_recover", "name", "message", "explanation", "recovery_options" ], "type": "object" }, "type": "array" }, "flooded_suit_ditch": { "description": "Ditchable weight needed to recover from a flooded drysuit.", "type": "number" }, "safety_notice": { "type": "string" }, "spoken_summary": { "description": "A few plain sentences for a voice reply, ending with an offer: digits allowed, no symbols or notation.", "type": "string" }, "start_of_dive": { "additionalProperties": false, "properties": { "action": { "type": "string" }, "breakdown": { "additionalProperties": false, "properties": { "body": { "type": "number" }, "cylinders": { "type": "number" }, "ditchable": { "type": "number" }, "gas": { "type": "number" }, "gear": { "type": "number" }, "suit_lift": { "type": "number" } }, "required": [ "gas", "suit_lift", "cylinders", "gear", "ditchable", "body" ], "type": "object" }, "depth": { "type": "number" }, "explanation": { "type": "string" }, "message": { "type": "string" }, "net_buoyancy": { "description": "Positive floats, negative sinks.", "type": "number" }, "status": { "enum": [ "pass", "warning", "fail" ], "type": "string" } }, "required": [ "status", "depth", "net_buoyancy", "breakdown", "message", "explanation" ], "type": "object" }, "units": { "description": "metric (m, bar, L, °C) or imperial (ft, psi, ft³, °F): the unit system for every value in and out. Default metric.", "enum": [ "metric", "imperial" ], "type": "string" }, "water": { "description": "Water type, from its density: en13319 (EN 13319, the dive computer standard) 10.00 m per bar, salt 9.95, fresh 10.20, red_sea 9.92. Default en13319.", "enum": [ "salt", "fresh", "en13319", "red_sea" ], "type": "string" }, "weight_adjustment": { "additionalProperties": false, "description": "Lead to add or remove to be neutral at the end of the dive, to 0.5 kg.", "properties": { "action": { "enum": [ "add", "remove", "none" ], "type": "string" }, "weight": { "type": "number" } }, "required": [ "weight", "action" ], "type": "object" } }, "required": [ "units", "water", "weight_adjustment", "end_of_dive", "start_of_dive", "failure_scenarios", "advisories", "cylinders", "assumptions", "spoken_summary", "safety_notice" ], "type": "object" } }, { "description": "Use this when the diver asks how long they can stay at a depth without decompression stops (no-deco limit, NDL, no-stop time). Returns the minutes left after the descent at GF high, the PPO₂ of the gas there and its MOD at 1.4 bar, a safety-stop reminder and a Dive Kit share link. Suits beginners and recreational divers. Not for a full dive plan (plan_dive) or a gas-limited bottom time (find_max_bottom_time).\n\nComputed by the Dive Kit app's Bühlmann ZH-L16C engine; agency tables and dive computers differ. Default gas air, GF 50/80. For \"is 25 min at 30 m ok?\" send bottom_time_min: the answer says within or over, and by how much. For a repetitive dive pass the previous result's share link and the surface interval.\n\nExample: {\"depth\":18}", "inputSchema": { "$schema": "https://json-schema.org/draft/2020-12/schema", "additionalProperties": false, "properties": { "altitude": { "description": "Surface altitude (m or ft, per units), 0 to 10000 m (0 to 32800 ft). Default 0.", "maximum": 32800, "minimum": 0, "type": "number" }, "bottom_time_min": { "description": "Planned minutes at the depth after the descent, 1 to 300. When given, the answer says whether it is within the no-stop time and by how much. Example: 25 for \"is 25 min at 30 m ok?\".", "maximum": 300, "minimum": 1, "type": "number" }, "depth": { "description": "Depth in m (metric) or ft (imperial), 1 to 200 m (3 to 650 ft). Required.", "maximum": 1000, "minimum": 0, "type": "number" }, "gradient_factors": { "additionalProperties": false, "description": "Gradient factors. The no-stop time is computed at GF high.", "properties": { "high": { "description": "GF high, percent, 10 to 100. Sets the no-stop limit. Default 80.", "maximum": 100, "minimum": 10, "type": "number" }, "low": { "description": "GF low, percent, 10 to 100. Default 50.", "maximum": 100, "minimum": 10, "type": "number" } }, "type": "object" }, "helium_pct": { "description": "Helium percentage, 0 to 95. Default 0.", "maximum": 95, "minimum": 0, "type": "number" }, "oxygen_pct": { "description": "Oxygen percentage of the gas, 5 to 100. Default 21 (air). Example: 32 for EANx32.", "maximum": 100, "minimum": 5, "type": "number" }, "previous_share_url": { "description": "Repetitive dive: the share link of the previous dive's plan_dive or check_no_deco result. Send with surface_interval_min.", "maxLength": 8000, "type": "string" }, "surface_interval_min": { "description": "Repetitive dive: surface interval since the previous dive, 15 to 1440 minutes. Send with previous_share_url.", "maximum": 1440, "minimum": 15, "type": "number" }, "units": { "description": "metric (m, bar, L, °C) or imperial (ft, psi, ft³, °F): the unit system for every value in and out. Default metric.", "enum": [ "metric", "imperial" ], "type": "string" }, "water": { "description": "Water type, from its density: en13319 (EN 13319, the dive computer standard) 10.00 m per bar, salt 9.95, fresh 10.20, red_sea 9.92. Default en13319.", "enum": [ "salt", "fresh", "en13319", "red_sea" ], "type": "string" } }, "required": [ "depth" ], "type": "object" }, "name": "check_no_deco", "outputSchema": { "$schema": "https://json-schema.org/draft/2020-12/schema", "additionalProperties": false, "properties": { "depth": { "description": "Depth, as given.", "type": "number" }, "gf": { "description": "Gradient factors used, low/high.", "type": "string" }, "margin_min": { "description": "With bottom_time_min: minutes to spare (within) or over (over). null: no limit within the model.", "type": [ "number", "null" ] }, "mix": { "description": "Gas as O₂/He, e.g. 21/0.", "type": "string" }, "mod_1_4_bar": { "description": "MOD of the gas at 1.4 bar.", "type": "number" }, "no_stop_minutes": { "description": "Minutes at the depth after the descent before a stop is required, at GF high. 0: a stop is already required on arrival. null: no limit within the model.", "type": [ "number", "null" ] }, "planned_min": { "description": "bottom_time_min, as given.", "type": "number" }, "ppo2": { "description": "PPO₂ of the gas at the depth, bar.", "type": "number" }, "safety_notice": { "type": "string" }, "share_url": { "description": "Dive Kit link to a 1-minute plan at this depth.", "type": "string" }, "spoken_summary": { "description": "A few plain sentences for a voice reply, ending with an offer: digits allowed, no symbols or notation.", "type": "string" }, "units": { "description": "metric (m, bar, L, °C) or imperial (ft, psi, ft³, °F): the unit system for every value in and out. Default metric.", "enum": [ "metric", "imperial" ], "type": "string" }, "verdict": { "description": "With bottom_time_min: within or over the no-stop time.", "enum": [ "within", "over" ], "type": "string" }, "warnings": { "description": "Titles of the plan warnings at this depth (hyperoxia, hypoxia, density, END).", "items": { "type": "string" }, "type": "array" } }, "required": [ "units", "depth", "mix", "no_stop_minutes", "gf", "ppo2", "mod_1_4_bar", "warnings", "share_url", "spoken_summary", "safety_notice" ], "type": "object" } }, { "description": "Converts one diving figure between units: pressure (bar, psi, MPa), volume (L, ft³), depth (m, ft), temperature (°C, °F, K), weight (kg, lb) and breathing rate (L/min, ft³/min, bar/min, psi/min). Use this when a diver gives a figure in the other unit system or asks what it reads in another unit. Returns the converted value and the factor used. Not for depth to pressure (gas_specs) or a cylinder's capacity (lookup_cylinders).\n\nquantity names the kind; from and to take unit tokens: bar, psi, mpa; l, cuft; m, ft; c, f, k; kg, lb; l_min, cuft_min, bar_min, psi_min. Converting between a litres rate and bar_min or psi_min needs cylinder_size (water litres of the cylinder, both cylinders for a twinset), because a pressure drop per minute is litres only on one cylinder. Factors are Dive Kit's exact ones (1 bar = 14.5038 psi, 1 ft = 0.3048 m). No engine call.\n\nExample: {\"quantity\":\"pressure\",\"value\":3000,\"from\":\"psi\",\"to\":\"bar\"}", "inputSchema": { "$schema": "https://json-schema.org/draft/2020-12/schema", "additionalProperties": false, "properties": { "cylinder_size": { "description": "Water volume in litres of the cylinder a bar_min or psi_min rate is read on (both cylinders of a twinset, e.g. 24). Required to convert between a litres rate (l_min, cuft_min) and bar_min or psi_min; bar_min to psi_min needs none.", "maximum": 60, "minimum": 0.5, "type": "number" }, "from": { "description": "Unit of value: bar, psi, mpa (pressure); l, cuft (volume); m, ft (depth); c, f, k (temperature); kg, lb (weight); l_min, cuft_min, bar_min, psi_min (breathing_rate).", "enum": [ "bar", "psi", "mpa", "l", "cuft", "m", "ft", "c", "f", "k", "kg", "lb", "l_min", "cuft_min", "bar_min", "psi_min" ], "type": "string" }, "quantity": { "description": "Kind of figure: pressure, volume, depth, temperature, weight or breathing_rate.", "enum": [ "pressure", "volume", "depth", "temperature", "weight", "breathing_rate" ], "type": "string" }, "to": { "description": "Unit to convert to, from the same list as from: bar, psi, mpa, l, cuft, m, ft, c, f, k, kg, lb, l_min, cuft_min, bar_min, psi_min.", "enum": [ "bar", "psi", "mpa", "l", "cuft", "m", "ft", "c", "f", "k", "kg", "lb", "l_min", "cuft_min", "bar_min", "psi_min" ], "type": "string" }, "value": { "description": "The figure to convert: 0 or more, except a temperature.", "maximum": 1000000, "minimum": -1000000, "type": "number" } }, "required": [ "quantity", "value", "from", "to" ], "type": "object" }, "name": "convert_units", "outputSchema": { "$schema": "https://json-schema.org/draft/2020-12/schema", "additionalProperties": false, "properties": { "factor": { "description": "Multiply by this to convert (absent for temperature, which has an offset).", "type": "number" }, "from": { "enum": [ "bar", "psi", "mpa", "l", "cuft", "m", "ft", "c", "f", "k", "kg", "lb", "l_min", "cuft_min", "bar_min", "psi_min" ], "type": "string" }, "note": { "type": "string" }, "quantity": { "enum": [ "pressure", "volume", "depth", "temperature", "weight", "breathing_rate" ], "type": "string" }, "result": { "description": "The converted figure, to 4 decimals.", "type": "number" }, "safety_notice": { "type": "string" }, "spoken_summary": { "description": "A few plain sentences for a voice reply, ending with an offer: digits allowed, no symbols or notation.", "type": "string" }, "to": { "enum": [ "bar", "psi", "mpa", "l", "cuft", "m", "ft", "c", "f", "k", "kg", "lb", "l_min", "cuft_min", "bar_min", "psi_min" ], "type": "string" }, "value": { "type": "number" } }, "required": [ "quantity", "value", "from", "to", "result", "spoken_summary", "safety_notice" ], "type": "object" } }, { "description": "Returns what happens when two cylinders are joined with a transfill whip: the pressure both settle to, each cylinder's pressure and mix afterwards, and how much gas moved. With a target mix it also returns where to close the valve, the mix the receiver reaches and what the donor keeps, or why the target is out of reach. Use this when a diver tops up one cylinder from another (\"top my 50 bar EANx32 from a full EANx50\") or asks whether a decant reaches a mix. Not for bank fills (plan_blend).\n\nreceiver and donor as plan_blend's current: oxygen_pct, helium_pct, pressure, and preset or cylinder_size (default AL80 size). Gas flows from the higher pressure to the lower. The warm gas and the whip make the first gauge reading high: analyse after it cools. An unreachable target returns feasible false with the reason. No engine call.\n\nExample: {\"receiver\":{\"oxygen_pct\":32,\"pressure\":50,\"cylinder_size\":12},\"donor\":{\"oxygen_pct\":50,\"pressure\":200,\"cylinder_size\":12},\"target\":{\"oxygen_pct\":40}}", "inputSchema": { "$schema": "https://json-schema.org/draft/2020-12/schema", "additionalProperties": false, "properties": { "altitude": { "description": "Altitude (m or ft, per units), 0 to 10000 m (32800 ft). Lowers the surface pressure the math adds to gauge readings. Default 0.", "maximum": 32800, "minimum": 0, "type": "number" }, "donor": { "additionalProperties": false, "description": "The cylinder the gas comes from: analysed mix, gauge pressure, size.", "properties": { "cylinder_size": { "description": "Metric: water volume of ONE cylinder in litres, the number stamped on the neck. Imperial: rated capacity in ft³ at rated_pressure (an AL80 is 77.4). Default: the preset's, else an AL80 (11.1 L).", "maximum": 400, "minimum": 0.5, "type": "number" }, "helium_pct": { "description": "Helium % now, 0 to 100. Default 0.", "maximum": 100, "minimum": 0, "type": "number" }, "oxygen_pct": { "description": "Oxygen % of the gas in the cylinder now, as analysed, 0 to 100. Air is 21; an empty cylinder is 21 at pressure 0.", "maximum": 100, "minimum": 0, "type": "number" }, "preset": { "description": "A common cylinder instead of cylinder_size, as in plan_dive: al80, al40, al63, hp80, hp100, hp120, lp85, s80, single_10l, single_12l, single_15l, twin_10l, twin_12l, twin_15l, stage_11l, stage_7l, o2_3l, dil_3l. twin_ presets are a manifolded pair.", "enum": [ "al80", "al40", "al63", "hp80", "hp100", "hp120", "lp85", "s80", "single_10l", "single_12l", "single_15l", "twin_10l", "twin_12l", "twin_15l", "stage_11l", "stage_7l", "o2_3l", "dil_3l" ], "type": "string" }, "pressure": { "description": "Gauge pressure now (bar or psi, per units), 0 to 500 bar (7252 psi).", "maximum": 7252, "minimum": 0, "type": "number" }, "rated_pressure": { "description": "Imperial only: the psi the capacity is rated at. Default: the preset's, else 3000. Ignored on metric.", "maximum": 7252, "minimum": 725, "type": "number" }, "twinset": { "description": "true for two cylinders on a manifold, filled or breathed together: doubles the volume. Default: the preset's, else false.", "type": "boolean" } }, "required": [ "oxygen_pct", "pressure" ], "type": "object" }, "receiver": { "additionalProperties": false, "description": "The cylinder being topped up: analysed mix, gauge pressure, size.", "properties": { "cylinder_size": { "description": "Metric: water volume of ONE cylinder in litres, the number stamped on the neck. Imperial: rated capacity in ft³ at rated_pressure (an AL80 is 77.4). Default: the preset's, else an AL80 (11.1 L).", "maximum": 400, "minimum": 0.5, "type": "number" }, "helium_pct": { "description": "Helium % now, 0 to 100. Default 0.", "maximum": 100, "minimum": 0, "type": "number" }, "oxygen_pct": { "description": "Oxygen % of the gas in the cylinder now, as analysed, 0 to 100. Air is 21; an empty cylinder is 21 at pressure 0.", "maximum": 100, "minimum": 0, "type": "number" }, "preset": { "description": "A common cylinder instead of cylinder_size, as in plan_dive: al80, al40, al63, hp80, hp100, hp120, lp85, s80, single_10l, single_12l, single_15l, twin_10l, twin_12l, twin_15l, stage_11l, stage_7l, o2_3l, dil_3l. twin_ presets are a manifolded pair.", "enum": [ "al80", "al40", "al63", "hp80", "hp100", "hp120", "lp85", "s80", "single_10l", "single_12l", "single_15l", "twin_10l", "twin_12l", "twin_15l", "stage_11l", "stage_7l", "o2_3l", "dil_3l" ], "type": "string" }, "pressure": { "description": "Gauge pressure now (bar or psi, per units), 0 to 500 bar (7252 psi).", "maximum": 7252, "minimum": 0, "type": "number" }, "rated_pressure": { "description": "Imperial only: the psi the capacity is rated at. Default: the preset's, else 3000. Ignored on metric.", "maximum": 7252, "minimum": 725, "type": "number" }, "twinset": { "description": "true for two cylinders on a manifold, filled or breathed together: doubles the volume. Default: the preset's, else false.", "type": "boolean" } }, "required": [ "oxygen_pct", "pressure" ], "type": "object" }, "target": { "additionalProperties": false, "description": "A mix to aim the receiver at; the result says where to close the valve, or why it is out of reach.", "properties": { "helium_pct": { "description": "Helium % wanted in the receiver. Default 0.", "maximum": 100, "minimum": 0, "type": "number" }, "oxygen_pct": { "description": "Oxygen % wanted in the receiver.", "maximum": 100, "minimum": 0, "type": "number" } }, "required": [ "oxygen_pct" ], "type": "object" }, "units": { "description": "metric (m, bar, L, °C) or imperial (ft, psi, ft³, °F): the unit system for every value in and out. Default metric.", "enum": [ "metric", "imperial" ], "type": "string" } }, "required": [ "receiver", "donor" ], "type": "object" }, "name": "decant", "outputSchema": { "$schema": "https://json-schema.org/draft/2020-12/schema", "additionalProperties": false, "properties": { "donor": { "additionalProperties": false, "properties": { "helium_pct_after": { "type": "number" }, "oxygen_pct_after": { "type": "number" }, "pressure_after": { "type": "number" }, "pressure_before": { "type": "number" }, "role": { "enum": [ "received", "donated", "unchanged" ], "type": "string" } }, "required": [ "role", "pressure_before", "pressure_after", "oxygen_pct_after", "helium_pct_after" ], "type": "object" }, "equalized_mix": { "additionalProperties": false, "description": "The receiver's mix at full equalization.", "properties": { "helium_pct": { "type": "number" }, "oxygen_pct": { "type": "number" } }, "required": [ "oxygen_pct", "helium_pct" ], "type": "object" }, "feasible": { "type": "boolean" }, "gas_moved_pressure": { "description": "How far the receiver's gauge rose.", "type": "number" }, "notes": { "items": { "type": "string" }, "type": "array" }, "plan": { "additionalProperties": false, "properties": { "achieved": { "additionalProperties": false, "properties": { "helium_pct": { "type": "number" }, "oxygen_pct": { "type": "number" } }, "required": [ "oxygen_pct", "helium_pct" ], "type": "object" }, "donor_leftover": { "type": "number" }, "reachable": { "type": "boolean" }, "reason": { "type": "string" }, "reason_code": { "type": "string" }, "stop_pressure": { "description": "Close the valve when the receiver's gauge reads this.", "type": "number" } }, "required": [ "reachable", "reason_code", "reason", "stop_pressure", "achieved", "donor_leftover" ], "type": "object" }, "receiver": { "additionalProperties": false, "properties": { "helium_pct_after": { "type": "number" }, "oxygen_pct_after": { "type": "number" }, "pressure_after": { "type": "number" }, "pressure_before": { "type": "number" }, "role": { "enum": [ "received", "donated", "unchanged" ], "type": "string" } }, "required": [ "role", "pressure_before", "pressure_after", "oxygen_pct_after", "helium_pct_after" ], "type": "object" }, "safety_notice": { "type": "string" }, "settled_pressure": { "description": "Where both gauges meet if the valve stays open.", "type": "number" }, "spoken_summary": { "description": "A few plain sentences for a voice reply, ending with an offer: digits allowed, no symbols or notation.", "type": "string" }, "units": { "description": "metric (m, bar, L, °C) or imperial (ft, psi, ft³, °F): the unit system for every value in and out. Default metric.", "enum": [ "metric", "imperial" ], "type": "string" }, "warnings": { "items": { "type": "string" }, "type": "array" } }, "required": [ "units", "feasible", "settled_pressure", "receiver", "donor", "gas_moved_pressure", "equalized_mix", "warnings", "notes", "spoken_summary", "safety_notice" ], "type": "object" } }, { "description": "Finds the longest whole-minute bottom time on one level of an open-circuit plan: the longest that keeps every cylinder at or above its reserve (limit reserve), whose time to surface fits a budget (limit tts), or that needs no stop (limit no_deco). Use this when a diver asks how long they can stay at a depth before gas runs short, how long fits a TTS budget, or how long a level of a multi-level plan can last without stops. Not for CCR plans. For the no-stop time at one depth, check_no_deco is simpler.\n\nTakes the same fields as plan_dive, at the top level, plus the level to extend (default the deepest, last on a tie; the same level longer_3min lengthens). Cylinders as in plan_dive. On a level shallower than an earlier one the answer can be a window (\"from 7 min\"). The empty-cylinder setting is ignored: every cylinder is judged on its own reserve. The answer is a gas ceiling with no allowance for gas sharing, cold, current or work. Returns the answer, the plan table at that time and its Dive Kit share link.\n\nUnits and defaults as in plan_dive.\n\nExample: {\"plan_name\":\"45m on 21/35\",\"units\":\"metric\",\"levels\":[{\"depth\":45,\"bottom_time_min\":20}],\"cylinders\":[{\"id\":\"back\",\"oxygen_pct\":21,\"helium_pct\":35,\"preset\":\"twin_12l\",\"start_pressure\":220},{\"id\":\"deco\",\"oxygen_pct\":50,\"preset\":\"stage_11l\"}],\"limit\":\"reserve\",\"level_number\":1}", "inputSchema": { "$schema": "https://json-schema.org/draft/2020-12/schema", "additionalProperties": false, "properties": { "audience": { "description": "Optional: who the answer is for, from the conversation. beginner: new to deco, plain words. recreational (default): some training. technical: trained deco or CCR diver, terms and tables. Shapes the wording only, never a number.", "enum": [ "beginner", "recreational", "technical" ], "type": "string" }, "bailout": { "additionalProperties": false, "description": "ccr only: the bailout view.", "properties": { "depth": { "description": "For on_ascent: depth (m or ft) the diver leaves the loop on the final ascent.", "maximum": 660, "minimum": 0, "type": "number" }, "level_number": { "description": "For after_level: the level (1-based) the diver bails at the end of.", "maximum": 20, "minimum": 1, "type": "integer" }, "run_time_min": { "description": "For at_run_time: minutes on the Run clock.", "maximum": 1000, "minimum": 0, "type": "number" }, "view": { "description": "ccr: which ascent the table shows. loop (default), end_of_profile, after_level, at_run_time, on_ascent. The worst-case bailout check runs on every view.", "enum": [ "loop", "end_of_profile", "after_level", "at_run_time", "on_ascent" ], "type": "string" } }, "type": "object" }, "behavior": { "additionalProperties": false, "description": "Profile and model switches.", "properties": { "include_travel_in_level_time": { "description": "true: level time includes the descent to it (dive-computer runtime style). Default false.", "type": "boolean" }, "o2_narcotic": { "description": "Count oxygen in END. END and warnings only. Default false.", "type": "boolean" }, "stay_on_loop": { "description": "ccr: true (default) keeps the whole ascent on the loop; false lets an OC deco gas take over where its PPO₂ is higher. Not carried in share links.", "type": "boolean" } }, "type": "object" }, "ccr": { "additionalProperties": false, "description": "The rebreather (mode ccr only).", "properties": { "descent_switch_depth": { "description": "Depth (m or ft) where the descent setpoint hands over to bottom, first descent only. Default 18 m (60 ft).", "maximum": 660, "minimum": 0, "type": "number" }, "diluent_breathable_oc": { "description": "true if the BOV or a regulator can breathe the onboard diluent open circuit. It then joins the bailout pool last. Default false.", "type": "boolean" }, "diluent_helium_pct": { "description": "Onboard diluent helium percent. Default 0.", "maximum": 95, "minimum": 0, "type": "number" }, "diluent_oxygen_pct": { "description": "Onboard diluent oxygen percent. Default 21.", "maximum": 100, "minimum": 5, "type": "number" }, "diluent_size": { "description": "Diluent cylinder: litres (metric) or ft³ rated at 3000 psi (imperial). Default 3 L.", "maximum": 400, "minimum": 0, "type": "number" }, "diluent_start_pressure": { "description": "Diluent cylinder fill (bar or psi). Default 232 bar (3365 psi).", "maximum": 7252, "minimum": 0, "type": "number" }, "loop_volume": { "description": "Loop volume, litres in both unit systems, 2 to 15. Default 6.", "maximum": 15, "minimum": 2, "type": "number" }, "o2_size": { "description": "Oxygen cylinder: litres (metric) or ft³ rated at 3000 psi (imperial). Default 3 L.", "maximum": 400, "minimum": 0, "type": "number" }, "o2_start_pressure": { "description": "Oxygen cylinder fill (bar or psi). Default 232 bar (3365 psi).", "maximum": 7252, "minimum": 0, "type": "number" }, "setpoints": { "additionalProperties": false, "description": "Loop setpoints in bar.", "properties": { "bottom": { "description": "Bottom setpoint in bar, the level default. Default 1.0.", "maximum": 1.6, "minimum": 0.4, "type": "number" }, "deco": { "description": "Deco setpoint in bar, used where ccr_deco_schedule has no step. Default 1.4.", "maximum": 1.6, "minimum": 0.4, "type": "number" }, "descent": { "description": "Descent setpoint in bar. Default 0.7.", "maximum": 1.6, "minimum": 0.4, "type": "number" } }, "type": "object" } }, "type": "object" }, "ccr_deco_schedule": { "description": "ccr deco setpoint steps, up to 10. Default [40 m: 1.5, 23 m: 1.6]. Send [] for the single ccr.setpoints.deco.", "items": { "additionalProperties": false, "properties": { "depth": { "description": "Depth (m or ft): the step applies at this depth and shallower.", "maximum": 660, "minimum": 0, "type": "number" }, "setpoint": { "description": "Setpoint in bar.", "maximum": 1.6, "minimum": 0.4, "type": "number" } }, "required": [ "depth", "setpoint" ], "type": "object" }, "maxItems": 10, "type": "array" }, "ccr_dilout_switches": { "description": "ccr: at each depth and shallower, the loop breathes that cylinder as diluent (a dilout). Up to 6. Default none.", "items": { "additionalProperties": false, "properties": { "cylinder": { "description": "Cylinder id breathed as diluent, or \"onboard\" to switch back.", "maxLength": 12, "type": "string" }, "depth": { "description": "Depth (m or ft): the switch applies at this depth and shallower.", "maximum": 660, "minimum": 0, "type": "number" } }, "required": [ "depth", "cylinder" ], "type": "object" }, "maxItems": 6, "type": "array" }, "contingencies": { "description": "Custom contingencies, up to 6, each requested with scenarios \"custom:<name>\" (or \"all\").", "items": { "additionalProperties": false, "properties": { "deco_sac": { "description": "Deco SAC for this contingency only (L/min or ft³/min, per units). Default gas_consumption.deco_sac.", "maximum": 200, "minimum": 0, "type": "number" }, "delay_min": { "description": "A hold at depth before the ascent starts, 0 to 60 minutes. Moves the schedule. Default 0.", "maximum": 60, "minimum": 0, "type": "number" }, "depth_change": { "description": "Depth added to that level (m or ft, per units), -30 to 30 m (-100 to 100 ft). Default 0.", "maximum": 100, "minimum": -100, "type": "number" }, "fails_after_level": { "description": "Level number (1-based) after which the lost cylinders are gone. Omit: they are never carried.", "maximum": 20, "minimum": 1, "type": "integer" }, "level_number": { "description": "Level number (1-based) the depth and time changes apply to. Default the deepest (last on a tie).", "maximum": 20, "minimum": 1, "type": "integer" }, "lost_cylinders": { "description": "Cylinder ids lost in this contingency, comma-separated, e.g. \"s50,o2\". Default none.", "maxLength": 130, "type": "string" }, "name": { "description": "Name of this contingency, 1 to 24 characters. Request it with scenarios \"custom:<name>\". Unique.", "maxLength": 24, "minLength": 1, "type": "string" }, "stress_minutes": { "description": "Minutes the stress_sac burst lasts, 1 to 60.", "maximum": 60, "minimum": 1, "type": "number" }, "stress_sac": { "description": "Hard-breathing surface rate, SAC (L/min or ft³/min, per units), from the end of the bottom (on bailout: from leaving the loop), gas only. Needs stress_minutes or stress_whole_ascent.", "maximum": 200, "minimum": 0, "type": "number" }, "stress_whole_ascent": { "description": "true: the stress_sac burst lasts to the surface. Default false.", "type": "boolean" }, "time_change_min": { "description": "Minutes added to that level, -60 to 60. Default 0.", "maximum": 60, "minimum": -60, "type": "number" }, "working_sac": { "description": "Working SAC for this contingency only (L/min or ft³/min, per units). Default gas_consumption.working_sac.", "maximum": 200, "minimum": 0, "type": "number" } }, "required": [ "name" ], "type": "object" }, "maxItems": 6, "type": "array" }, "cylinders": { "description": "Every open-circuit cylinder carried: back gas, stages, deco gases; on ccr, bailout gases. 1 to 10. Give preset or cylinder_size and start_pressure when known; omitted ones default (an AL80, 11.1 L at 3000 psi) and the result marks them.", "items": { "additionalProperties": false, "properties": { "cylinder_size": { "description": "12 = one 12 L cylinder (metric). 77.4 = an AL80 in ft³ (imperial, with rated_pressure 3000). Metric: water volume of ONE cylinder in litres, the number stamped on the neck, 1 to 25.5. Imperial: rated capacity in ft³ from the spec sheet (an AL80 holds less than its name), 1 to 400. Or pass preset. Default with neither: an AL80 (11.1 L, 77.4 ft³ at 3000 psi).", "maximum": 400, "minimum": 0, "type": "number" }, "exclude_from_deco": { "description": "true keeps this cylinder out of automatic ascent switching (pony, buddy bottle). Still priced; a level can still name it. Default false.", "type": "boolean" }, "helium_pct": { "description": "Helium percent, 0 to 95, oxygen_pct + helium_pct at most 100. Trimix 18/45 is 45. Default 0.", "maximum": 95, "minimum": 0, "type": "number" }, "id": { "description": "Short name used by levels and contingencies, 1 to 12 letters, digits, _ or -, e.g. back, s50, o2. Unique.", "maxLength": 12, "minLength": 1, "type": "string" }, "oxygen_pct": { "description": "Oxygen percent, 5 to 100. Air is 21, EANx50 is 50, trimix 18/45 is 18.", "maximum": 100, "minimum": 5, "type": "number" }, "preset": { "description": "A common cylinder instead of cylinder_size, rated_pressure, twinset and the fill (explicit fields win). al80/s80: aluminium 80, 11.1 L, 3000 psi. al40, al63: aluminium 40/63, 3000 psi. hp80, hp100, hp120: US high-pressure steel, 3442 psi. lp85: US low-pressure steel, 2640 psi. single_10l, single_12l, single_15l: one EU steel cylinder at 232 bar. twin_10l, twin_12l, twin_15l: back-mounted doubles, 232 bar each. stage_11l: aluminium stage (AL80 size), 200 bar. stage_7l: 7 L stage, 200 bar. o2_3l, dil_3l: 3 L rebreather cylinder, 232 bar.", "enum": [ "al80", "al40", "al63", "hp80", "hp100", "hp120", "lp85", "s80", "single_10l", "single_12l", "single_15l", "twin_10l", "twin_12l", "twin_15l", "stage_11l", "stage_7l", "o2_3l", "dil_3l" ], "type": "string" }, "rated_pressure": { "description": "Imperial only: the working pressure the capacity is rated at, psi, 725 to 7252 (3000 for an AL80). Default: the preset's, else 3000. Ignored on metric.", "maximum": 7252, "minimum": 0, "type": "number" }, "reserve_pressure": { "description": "Custom reserve for this cylinder (bar or psi, per units), 5 to 300 bar (50 to 4351 psi). Default: the reserve rule. Moves warnings and find_max_bottom_time, never the stops.", "maximum": 4351, "minimum": 0, "type": "number" }, "start_pressure": { "description": "Pressure in the cylinder at the start of the dive (bar or psi, per units), 0 to 500 bar (0 to 7252 psi). Default: the preset's fill, else 206.84 bar (3000 psi).", "maximum": 7252, "minimum": 0, "type": "number" }, "twinset": { "description": "true for back-mounted doubles or a sidemount pair breathed as one supply: doubles the gas at the same pressure. Default: the preset's, else false.", "type": "boolean" } }, "required": [ "id", "oxygen_pct" ], "type": "object" }, "maxItems": 10, "minItems": 1, "type": "array" }, "descent_gas": { "description": "oc only. Cylinder id of a travel gas for the descent, for a hypoxic bottom mix (e.g. 12/60) that cannot be breathed near the surface. When level 1 is deeper than that gas's MOD, a 0-minute level on it at its MOD (whole m or ft) is added before level 1, and the result numbers that level first. Default none.", "maxLength": 12, "type": "string" }, "environment": { "additionalProperties": false, "description": "Water and altitude.", "properties": { "altitude": { "description": "Surface altitude (m or ft, per units), 0 to 10000 m (0 to 32800 ft). Default 0.", "maximum": 32800, "minimum": 0, "type": "number" }, "temperature": { "description": "Water temperature for gas density only, -2 to 40 °C (28 to 104 °F). Never moves stops. Default 15 °C (59 °F).", "maximum": 104, "minimum": -2, "type": "number" }, "water": { "description": "Water type, from its density: en13319 (EN 13319, the dive computer standard) 10.00 m per bar, salt 9.95, fresh 10.20, red_sea 9.92. Default en13319.", "enum": [ "salt", "fresh", "en13319", "red_sea" ], "type": "string" } }, "type": "object" }, "gas_consumption": { "additionalProperties": false, "description": "Breathing rates.", "properties": { "ccr_metabolic_o2": { "description": "ccr: oxygen the diver metabolises, L/min in both unit systems, 0.4 to 2.0. Default 0.85.", "maximum": 2, "minimum": 0.4, "type": "number" }, "deco_sac": { "description": "SAC from the first stop up (L/min or ft³/min). Default 15 L/min (0.53 ft³/min). Gas figures only.", "maximum": 200, "minimum": 0, "type": "number" }, "working_sac": { "description": "Surface air consumption (SAC, also called RMV) for descent, bottom and the deep ascent (L/min or ft³/min, per units), 1 to 200 L/min (0.05 to 7.1 ft³/min). Default 20 L/min (0.71 ft³/min). Gas figures only.", "maximum": 200, "minimum": 0, "type": "number" } }, "type": "object" }, "gas_switch": { "additionalProperties": false, "description": "Gas switching.", "properties": { "switch_at": { "description": "mod: switch at the deco gas MOD (default). stop: at the next stop.", "enum": [ "mod", "stop" ], "type": "string" }, "switch_time_s": { "description": "Seconds held at each OC switch on the old gas, 0 to 300 in 30 s steps. Default 0.", "maximum": 300, "minimum": 0, "type": "number" }, "when_cylinder_empty": { "description": "show_shortfall (default): stay on it and report how much more gas is needed. switch_gas: move to the richest safe gas left.", "enum": [ "show_shortfall", "switch_gas" ], "type": "string" } }, "type": "object" }, "gradient_factors": { "additionalProperties": false, "description": "Gradient factors. Lower is more conservative. Default 50/80. If high cannot surface the plan, the engine raises it and warns.", "properties": { "high": { "description": "GF high, percent, 10 to 100. Sets the shallow stops and surfacing margin. Default 80.", "maximum": 100, "minimum": 10, "type": "number" }, "low": { "description": "GF low, percent, 10 to 100. Sets the first stop depth. Default 50.", "maximum": 100, "minimum": 10, "type": "number" } }, "type": "object" }, "level_number": { "description": "1-based level to extend. Default the deepest (last on a tie).", "maximum": 20, "minimum": 1, "type": "integer" }, "levels": { "description": "Dive levels in the order dived, 1 to 20. The first is level_number 1.", "items": { "additionalProperties": false, "properties": { "bottom_time_min": { "description": "Minutes at this depth, excluding the descent to it (unless behavior.include_travel_in_level_time is true). 0 to 360. 0 = arrival only: passes through this depth on this gas, used for a no-stop check or a travel-gas leg. Required.", "maximum": 360, "minimum": 0, "type": "number" }, "breathe": { "description": "ccr only. loop (default) or oc: dive this level open circuit on `gas`.", "enum": [ "loop", "oc" ], "type": "string" }, "depth": { "description": "Level depth (m or ft, per units). 1 to 200 m (3 to 650 ft). Required.", "maximum": 700, "minimum": 0, "type": "number" }, "diluent": { "description": "ccr only. \"onboard\" (default) or a cylinder id to breathe through the loop as a dilout on this level.", "maxLength": 12, "type": "string" }, "gas": { "description": "Cylinder id this level breathes, or \"auto\" (default): the richest gas legal at this depth by PPO₂ cap, hypoxic floor and density limit. On ccr, auto means the loop on the onboard diluent.", "maxLength": 12, "type": "string" }, "setpoint": { "description": "ccr only. Loop PPO₂ for this level in bar, 0.4 to 1.6. Default ccr.setpoints.bottom.", "maximum": 1.6, "minimum": 0.4, "type": "number" } }, "required": [ "depth", "bottom_time_min" ], "type": "object" }, "maxItems": 20, "minItems": 1, "type": "array" }, "limit": { "description": "reserve (default): longest time that leaves every cylinder at or above its reserve. tts: longest time whose time to surface fits tts_budget_min. no_deco: longest time with no required stop at GF high (gas is not checked).", "enum": [ "reserve", "tts", "no_deco" ], "type": "string" }, "mode": { "description": "oc (open circuit, default) or ccr (closed-circuit rebreather). Set ccr for every rebreather plan: the ccr, ccr_deco_schedule, ccr_dilout_switches and bailout fields need it. On ccr, `cylinders` are the open-circuit bailout gases; the rig itself is in `ccr`.", "enum": [ "oc", "ccr" ], "type": "string" }, "modifiers": { "additionalProperties": false, "description": "Plan modifiers: a stress breathing burst (gas only) and a delay before the ascent (moves the schedule).", "properties": { "deco_sac": { "description": "Deco SAC override for the whole plan (L/min or ft³/min). Default gas_consumption.deco_sac.", "maximum": 200, "minimum": 0, "type": "number" }, "delay_min": { "description": "A hold at depth before the ascent starts, 0 to 60 minutes. Moves the schedule. Default 0.", "maximum": 60, "minimum": 0, "type": "number" }, "stress_minutes": { "description": "Minutes the stress_sac burst lasts, 1 to 60.", "maximum": 60, "minimum": 1, "type": "number" }, "stress_sac": { "description": "Hard-breathing surface rate, SAC (L/min or ft³/min, per units), from the end of the bottom (on bailout: from leaving the loop), gas only. Needs stress_minutes or stress_whole_ascent.", "maximum": 200, "minimum": 0, "type": "number" }, "stress_whole_ascent": { "description": "true: the stress_sac burst lasts to the surface. Default false.", "type": "boolean" }, "working_sac": { "description": "Working SAC override for the whole plan (L/min or ft³/min). Default gas_consumption.working_sac.", "maximum": 200, "minimum": 0, "type": "number" } }, "type": "object" }, "oxygen_breaks": { "additionalProperties": false, "description": "Oxygen breaks.", "properties": { "apply_on_loop": { "description": "ccr: also break on the loop. Not carried in share links. Default false.", "type": "boolean" }, "break_minutes": { "description": "Break length in minutes, 1 to 10. Default 5.", "maximum": 10, "minimum": 1, "type": "number" }, "enabled": { "description": "Insert oxygen breaks on high-PPO₂ stops. Default false.", "type": "boolean" }, "loop_setpoint": { "description": "ccr: loop setpoint in bar during a break. Default 0.7.", "maximum": 1.6, "minimum": 0.4, "type": "number" }, "min_ppo2": { "description": "PPO₂ in bar at or above which a stop counts toward the break clock, 0.8 to 1.8. Default 1.4.", "maximum": 1.8, "minimum": 0.8, "type": "number" }, "o2_minutes": { "description": "Minutes on high PPO₂ before a break, 5 to 30. Default 20.", "maximum": 30, "minimum": 5, "type": "number" } }, "type": "object" }, "plan_name": { "description": "Short human label shown in the approval card; fill it first, e.g. 40m 20min air+EANx50. Also titles the plan table and share link, which keep its first 24 characters (a longer name is cut, never refused).", "type": "string" }, "ppo2": { "additionalProperties": false, "description": "PPO₂ limits in bar.", "properties": { "max_28_to_44pct_o2": { "description": "PPO₂ cap in bar for gases from 28% to under 45% O₂, 1.0 to 1.6. Default 1.5.", "maximum": 1.6, "minimum": 1, "type": "number" }, "max_45pct_o2_and_up": { "description": "PPO₂ cap in bar for gases of 45% O₂ and over, 1.0 to 1.6. Default 1.6.", "maximum": 1.6, "minimum": 1, "type": "number" }, "max_all": { "description": "One PPO₂ cap in bar for every gas, 1.0 to 1.6 (e.g. 1.4 for recreational nitrox). Sets all three bands; a band field given too wins for its band.", "maximum": 1.6, "minimum": 1, "type": "number" }, "max_under_28pct_o2": { "description": "PPO₂ cap in bar for gases under 28% O₂, 1.0 to 1.6. Sets their MOD and switch depth. Default 1.4.", "maximum": 1.6, "minimum": 1, "type": "number" }, "min": { "description": "Lowest PPO₂ in bar before a hypoxia warning, 0.16 to 0.21. Warnings only. Default 0.18.", "maximum": 0.21, "minimum": 0.16, "type": "number" } }, "type": "object" }, "rates": { "additionalProperties": false, "description": "Ascent and descent rates, per units.", "properties": { "ascent_deep": { "description": "Ascent rate below rate_change_depth (m/min or ft/min), 1 to 100 m/min. Default 9 m/min (30 ft/min).", "maximum": 330, "minimum": 0, "type": "number" }, "ascent_shallow": { "description": "Ascent rate from rate_change_depth to the surface (m/min or ft/min), 1 to 100 m/min. Default 3 m/min (10 ft/min).", "maximum": 330, "minimum": 0, "type": "number" }, "descent": { "description": "Descent rate (m/min or ft/min), 1 to 100 m/min. Default 20 m/min (66 ft/min).", "maximum": 330, "minimum": 0, "type": "number" }, "rate_change_depth": { "description": "Depth where the ascent rate changes (m or ft), 3 to 200 m. Default 6 m (20 ft).", "maximum": 660, "minimum": 0, "type": "number" } }, "type": "object" }, "repetitive": { "additionalProperties": false, "description": "Repetitive dive: the previous dive and the surface interval.", "properties": { "previous_share_url": { "description": "The share link of the previous dive's plan_dive result. Its tissue loading seeds this dive.", "maxLength": 8000, "type": "string" }, "surface_interval_min": { "description": "Surface interval since the previous dive, 15 to 1440 minutes.", "maximum": 1440, "minimum": 15, "type": "number" } }, "required": [ "surface_interval_min" ], "type": "object" }, "reserve": { "additionalProperties": false, "description": "Gas reserve rule. Moves the gas status and warnings, never the stops.", "properties": { "fixed_pressure": { "description": "Reserve for rule fixed (bar or psi, per units). Default 50 bar (725 psi).", "maximum": 7252, "minimum": 0, "type": "number" }, "rule": { "description": "thirds, fourths, fifths, sixths or fixed. Default thirds. Below 50 bar (725 psi) is always critical.", "enum": [ "thirds", "fourths", "fifths", "sixths", "fixed" ], "type": "string" } }, "type": "object" }, "scenario": { "description": "Search so this one scenario still meets the limit: deeper_3m, deeper_5m (imperial: deeper_10ft, deeper_20ft), longer_3min, longer_5min, deeper_and_longer_3, deeper_and_longer_5, lost:<cylinder id>, custom:<name>, or a variant (gf:40/85, last_stop:3, stop_rounding:30s). Default base. The answer is still a base-plan bottom time.", "maxLength": 40, "type": "string" }, "stops": { "additionalProperties": false, "description": "Stop grid and stop-time rounding.", "properties": { "last_stop_depth": { "description": "Final stop depth: 3, 4.5 or 6 m; 10, 15 or 20 ft. Default 6 m (20 ft).", "type": "number" }, "stop_spacing": { "description": "Distance between stops: 3, 6 or 9 m; 10, 20 or 30 ft. Default 3 m (10 ft).", "type": "number" }, "time_rounding": { "description": "1s, 30s or 1min. Applied inside the engine; a stop is never shorter than the obligation. Default 1min.", "enum": [ "1s", "30s", "1min" ], "type": "string" } }, "type": "object" }, "table_columns": { "additionalProperties": false, "description": "Extra table columns. PPO₂ is always shown.", "properties": { "cns": { "description": "Add a running CNS column. Default false.", "type": "boolean" }, "gas_remaining": { "description": "Add a gas-remaining column (bar or psi). Default false.", "type": "boolean" } }, "type": "object" }, "tts_budget_min": { "description": "For limit tts: the longest acceptable time to surface, 5 to 360 minutes. Required with tts.", "maximum": 360, "minimum": 5, "type": "number" }, "units": { "description": "metric (m, bar, L, L/min, °C) or imperial (ft, psi, ft³, ft³/min, °F). Applies to every input and output value except PPO₂/setpoints (bar), mixes (%), density (g/L). Default metric.", "enum": [ "metric", "imperial" ], "type": "string" }, "warning_thresholds": { "additionalProperties": false, "description": "Warning thresholds. Warnings only, never the stops.", "properties": { "cns_pct": { "description": "CNS percent warning, 50 to 100. Default 80.", "maximum": 100, "minimum": 50, "type": "number" }, "density_critical": { "description": "Gas density critical in g/L, 3 to 8; also vetoes a gas in auto. Default 6.2.", "maximum": 8, "minimum": 3, "type": "number" }, "density_warning": { "description": "Gas density warning in g/L, 3 to 8. Default 5.2.", "maximum": 8, "minimum": 3, "type": "number" }, "end_max": { "description": "Highest END before a warning (m or ft, per units), 20 to 100 m. Default 30 m (100 ft).", "maximum": 330, "minimum": 0, "type": "number" }, "otu": { "description": "OTU warning, 200 to 500. Default 300.", "maximum": 500, "minimum": 200, "type": "number" } }, "type": "object" } }, "required": [ "levels", "cylinders" ], "type": "object" }, "name": "find_max_bottom_time", "outputSchema": { "$schema": "https://json-schema.org/draft/2020-12/schema", "additionalProperties": false, "properties": { "binding_cylinder_id": { "description": "Cylinder with the least headroom above its reserve.", "type": "string" }, "cns_flagged": { "description": "CNS or OTU crosses its warning threshold at the answer. Never caps it.", "type": "boolean" }, "delta_min": { "description": "time_min (or from_min) minus planned_min.", "type": "number" }, "from_min": { "description": "range: shortest bottom time whose TTS fits the budget.", "type": "number" }, "kind": { "enum": [ "solved", "range", "infeasible_at_minimum", "unbounded", "no_answer" ], "type": "string" }, "level_number": { "description": "1-based level searched.", "type": "number" }, "limit": { "enum": [ "reserve", "tts", "no_deco" ], "type": "string" }, "planned_min": { "description": "Bottom time on that level in the input.", "type": "number" }, "presentation": { "items": { "type": "string" }, "type": "array" }, "probes": { "description": "Engine runs spent.", "type": "number" }, "reserve_flagged": { "description": "tts mode: the answer leaves a cylinder under its reserve.", "type": "boolean" }, "safety_notice": { "type": "string" }, "share_url": { "description": "Dive Kit link to the plan at the answer.", "type": "string" }, "shortfall": { "description": "infeasible_at_minimum: how far below its reserve the binding cylinder ends (bar or psi).", "type": "number" }, "spoken_summary": { "description": "The answer and what sets it, to read aloud: no symbols or notation.", "type": "string" }, "table_markdown": { "description": "Plan table at the answer (solved: time_min; range: from_min).", "type": "string" }, "time_min": { "description": "solved: longest whole minute that meets the limit.", "type": "number" }, "tts_min": { "description": "TTS at the answer (or at the floor for infeasible_at_minimum).", "type": "number" }, "units": { "description": "metric (m, bar, L, °C) or imperial (ft, psi, ft³, °F): the unit system for every value in and out. Default metric.", "enum": [ "metric", "imperial" ], "type": "string" }, "up_to_bounded_by": { "enum": [ "gas", "ascent" ], "type": "string" }, "up_to_min": { "description": "range: longest bottom time that meets the budget and every reserve.", "type": "number" } }, "required": [ "units", "kind", "limit", "level_number", "planned_min", "probes", "presentation", "spoken_summary", "safety_notice" ], "type": "object" } }, { "description": "Returns the facts for one breathing gas: maximum operating depth (MOD) at its Dive Kit PPO₂ band cap and at 1.4 bar, minimum depth for hypoxic mixes and, at a depth, PPO₂, equivalent narcotic depth (END), equivalent air depth (EAD) and gas density. Use this when the diver asks whether a gas is OK at a depth, its MOD, END, EAD or density. Not for planning a dive (plan_dive) or picking a gas (best_mix).\n\nMixes are O₂ % and He %; depth follows units. The band cap is 1.4 bar under 28% O₂, 1.5 to under 45%, 1.6 at 45% and over, unless ppo2_max is given. No engine call.\n\nExample: {\"oxygen_pct\":32,\"depth\":35}", "inputSchema": { "$schema": "https://json-schema.org/draft/2020-12/schema", "additionalProperties": false, "properties": { "altitude": { "description": "Surface altitude (m or ft, per units), 0 to 10000 m (32800 ft). Lowers the surface pressure depths are measured from. Default 0.", "maximum": 32800, "minimum": 0, "type": "number" }, "depth": { "description": "Depth in m (metric) or ft (imperial) where to report PPO₂, END, EAD and gas density. Omit for MOD and minimum depth only.", "maximum": 1000, "minimum": 0, "type": "number" }, "helium_pct": { "description": "Helium percentage of the mix, 0 to 95. Default 0 (nitrox or air).", "maximum": 95, "minimum": 0, "type": "number" }, "o2_narcotic": { "description": "Count oxygen as narcotic in the END. Default false (Dive Kit default).", "type": "boolean" }, "oxygen_pct": { "description": "Oxygen percentage of the mix, 5 to 100. Example: 32 for EANx32, 18 for 18/45. Required.", "maximum": 100, "minimum": 5, "type": "number" }, "ppo2_max": { "description": "PPO₂ limit in bar for the MOD, 1.0 to 1.6. Default: the Dive Kit band cap for the mix (1.4 under 28% O₂, 1.5 to under 45%, 1.6 at 45% and over). The MOD at 1.4 bar is always shown too.", "maximum": 1.6, "minimum": 1, "type": "number" }, "temperature": { "description": "Water temperature for gas density, in °C (metric, -2 to 40) or °F (imperial, 28 to 104). Default 15 °C.", "maximum": 104, "minimum": -2, "type": "number" }, "units": { "description": "metric (m, bar, L, °C) or imperial (ft, psi, ft³, °F): the unit system for every value in and out. Default metric.", "enum": [ "metric", "imperial" ], "type": "string" }, "water": { "description": "Water type, from its density: en13319 (EN 13319, the dive computer standard) 10.00 m per bar, salt 9.95, fresh 10.20, red_sea 9.92. Default en13319.", "enum": [ "salt", "fresh", "en13319", "red_sea" ], "type": "string" } }, "required": [ "oxygen_pct" ], "type": "object" }, "name": "gas_specs", "outputSchema": { "$schema": "https://json-schema.org/draft/2020-12/schema", "additionalProperties": false, "properties": { "at_depth": { "additionalProperties": false, "properties": { "density_g_l": { "description": "Gas density in g/L.", "type": "number" }, "ead": { "description": "Equivalent air depth (nitrox only).", "type": "number" }, "end": { "description": "Equivalent narcotic depth.", "type": "number" }, "ppo2": { "description": "PPO₂ in bar.", "type": "number" } }, "required": [ "ppo2", "end", "density_g_l" ], "type": "object" }, "cap_used_bar": { "description": "PPO₂ limit the MOD uses.", "type": "number" }, "caution": { "description": "The most important caution at depth, if any.", "type": "string" }, "min_depth": { "description": "Shallowest depth where PPO₂ reaches 0.16 bar; 0 for normoxic mixes.", "type": "number" }, "mod": { "description": "Maximum operating depth at cap_used_bar, floored to 0.1.", "type": "number" }, "mod_1_4_bar": { "description": "MOD at 1.4 bar, the common working limit, when cap_used_bar is not 1.4.", "type": "number" }, "nearest_standard_mix": { "description": "Nearest standard trimix by composition (closest O₂ and He), for helium mixes. Not checked against any depth limit.", "type": "string" }, "notation": { "description": "Mix as O₂/He, e.g. 18/45.", "type": "string" }, "safety_notice": { "type": "string" }, "spoken_summary": { "description": "A few plain sentences for a voice reply, ending with an offer: digits allowed, no symbols or notation.", "type": "string" }, "units": { "description": "metric (m, bar, L, °C) or imperial (ft, psi, ft³, °F): the unit system for every value in and out. Default metric.", "enum": [ "metric", "imperial" ], "type": "string" } }, "required": [ "units", "notation", "mod", "min_depth", "cap_used_bar", "spoken_summary", "safety_notice" ], "type": "object" } }, { "description": "Returns the gas one open-circuit cylinder spends over a planned profile: per segment the gas used (volume and pressure), what is left, the runtime and a status, plus the reserve, the turn pressure and the first segment that drops below each. Use this when a diver asks whether a cylinder covers a no-stop or multilevel dive, how much gas a dive uses, or their turn pressure. Not for decompression dives (plan_dive charges deco gas) or measuring a breathing rate (rmv_sac).\n\nsac is the surface breathing rate in L/min (ft³/min imperial), default 20; rmv_sac's rmv and plan_dive's gas_consumption.working_sac are the same figure. Cylinder fields as in plan_dive (preset, cylinder_size, rated_pressure, twinset, start_pressure); default one AL80 at 3000 psi (206.84 bar). reserve as in plan_dive (thirds; fixed defaults to 50 bar, 725 psi). water defaults to en13319; altitude (m or ft) defaults to sea level. Real-gas volumes; the cylinder is assumed to hold air (plan_dive takes any mix). No engine call.\n\nExample: {\"preset\":\"al80\",\"segments\":[{\"depth\":18,\"duration_min\":40},{\"depth\":5,\"duration_min\":3}]}", "inputSchema": { "$schema": "https://json-schema.org/draft/2020-12/schema", "additionalProperties": false, "properties": { "altitude": { "description": "Altitude (m or ft, per units), 0 to 10000 m (32800 ft). Lowers the surface pressure the math adds to gauge readings. Default 0.", "maximum": 32800, "minimum": 0, "type": "number" }, "cylinder_size": { "description": "Metric: water volume of ONE cylinder in litres, the number stamped on the neck. Imperial: rated capacity in ft³ at rated_pressure (an AL80 is 77.4). Default: the preset's, else an AL80 (11.1 L).", "maximum": 400, "minimum": 0.5, "type": "number" }, "preset": { "description": "A common cylinder instead of cylinder_size, as in plan_dive: al80, al40, al63, hp80, hp100, hp120, lp85, s80, single_10l, single_12l, single_15l, twin_10l, twin_12l, twin_15l, stage_11l, stage_7l, o2_3l, dil_3l. twin_ presets are a manifolded pair.", "enum": [ "al80", "al40", "al63", "hp80", "hp100", "hp120", "lp85", "s80", "single_10l", "single_12l", "single_15l", "twin_10l", "twin_12l", "twin_15l", "stage_11l", "stage_7l", "o2_3l", "dil_3l" ], "type": "string" }, "rated_pressure": { "description": "Imperial only: the psi the capacity is rated at. Default: the preset's, else 3000. Ignored on metric.", "maximum": 7252, "minimum": 725, "type": "number" }, "reserve": { "additionalProperties": false, "description": "Reserve the cylinder must keep, as in plan_dive: rule thirds (default), fourths, fifths, sixths or fixed with fixed_pressure.", "properties": { "fixed_pressure": { "description": "Reserve for rule fixed (bar or psi, per units). Default 50 bar (725 psi).", "maximum": 7252, "minimum": 0, "type": "number" }, "rule": { "description": "thirds, fourths, fifths, sixths or fixed. Default thirds. Below 50 bar (725 psi) is always critical.", "enum": [ "thirds", "fourths", "fifths", "sixths", "fixed" ], "type": "string" } }, "type": "object" }, "sac": { "description": "Surface breathing rate, L/min (ft³/min imperial): the same figure as rmv_sac rmv and plan_dive gas_consumption.working_sac. Default 20 L/min (0.71 ft³/min).", "maximum": 200, "minimum": 0.03, "type": "number" }, "segments": { "description": "The profile in order, one entry per depth. Put descent and ascent time into the nearest segment.", "items": { "additionalProperties": false, "properties": { "depth": { "description": "Depth of this segment (m or ft).", "maximum": 1000, "minimum": 0, "type": "number" }, "duration_min": { "description": "Minutes at this depth, 0.1 to 600.", "maximum": 600, "minimum": 0.1, "type": "number" }, "sac": { "description": "This segment's breathing rate when it differs (hard work, a calm stop). Default: the top-level sac.", "maximum": 200, "minimum": 0.03, "type": "number" } }, "required": [ "depth", "duration_min" ], "type": "object" }, "maxItems": 20, "minItems": 1, "type": "array" }, "start_pressure": { "description": "Fill at the start (bar or psi, per units). Default: the preset's fill, else 206.84 bar (3000 psi).", "maximum": 7252, "minimum": 0, "type": "number" }, "twinset": { "description": "true for two cylinders on a manifold, filled or breathed together: doubles the volume. Default: the preset's, else false.", "type": "boolean" }, "units": { "description": "metric (m, bar, L, °C) or imperial (ft, psi, ft³, °F): the unit system for every value in and out. Default metric.", "enum": [ "metric", "imperial" ], "type": "string" }, "water": { "description": "Water type, from its density: en13319 (EN 13319, the dive computer standard) 10.00 m per bar, salt 9.95, fresh 10.20, red_sea 9.92. Default en13319.", "enum": [ "salt", "fresh", "en13319", "red_sea" ], "type": "string" } }, "required": [ "segments" ], "type": "object" }, "name": "gas_usage", "outputSchema": { "$schema": "https://json-schema.org/draft/2020-12/schema", "additionalProperties": false, "properties": { "assumptions": { "items": { "type": "string" }, "type": "array" }, "cylinder": { "additionalProperties": false, "properties": { "cylinder_size": { "description": "L of water (metric) or rated ft³ (imperial), one cylinder.", "type": "number" }, "free_gas_volume": { "description": "Gas the full cylinder delivers down to a gauge of 0, at the surface pressure for the altitude, real gas (L or ft³).", "type": "number" }, "preset": { "type": "string" }, "rated_pressure": { "type": "number" }, "start_pressure": { "type": "number" }, "twinset": { "type": "boolean" } }, "required": [ "cylinder_size", "twinset", "start_pressure", "free_gas_volume" ], "type": "object" }, "first_segment_below_reserve": { "description": "1-based segment that ends under the reserve.", "type": "number" }, "first_segment_below_turn": { "description": "1-based segment that ends under the turn pressure.", "type": "number" }, "minutes_left_at_last_depth": { "description": "More minutes at the last segment's depth and rate before the cylinder is empty (no reserve kept).", "type": "number" }, "remaining_pressure": { "type": "number" }, "reserve_pressure": { "type": "number" }, "sac": { "type": "number" }, "safety_notice": { "type": "string" }, "segments": { "items": { "additionalProperties": false, "properties": { "cumulative_volume": { "type": "number" }, "depth": { "type": "number" }, "duration_min": { "type": "number" }, "gas_used_pressure": { "type": "number" }, "gas_used_volume": { "type": "number" }, "remaining_pressure": { "type": "number" }, "runtime_min": { "type": "number" }, "sac": { "type": "number" }, "status": { "enum": [ "ok", "below_reserve", "critical", "out_of_gas" ], "type": "string" } }, "required": [ "depth", "duration_min", "sac", "gas_used_volume", "gas_used_pressure", "cumulative_volume", "remaining_pressure", "runtime_min", "status" ], "type": "object" }, "type": "array" }, "spoken_summary": { "description": "A few plain sentences for a voice reply, ending with an offer: digits allowed, no symbols or notation.", "type": "string" }, "status": { "enum": [ "ok", "below_reserve", "critical", "out_of_gas" ], "type": "string" }, "total_gas_pressure": { "type": "number" }, "total_gas_volume": { "type": "number" }, "turn_pressure": { "description": "There-and-back: turn when the gauge reads this; half the usable gas is then gone.", "type": "number" }, "units": { "description": "metric (m, bar, L, °C) or imperial (ft, psi, ft³, °F): the unit system for every value in and out. Default metric.", "enum": [ "metric", "imperial" ], "type": "string" }, "used_pct": { "type": "number" }, "water": { "description": "Water type, from its density: en13319 (EN 13319, the dive computer standard) 10.00 m per bar, salt 9.95, fresh 10.20, red_sea 9.92. Default en13319.", "enum": [ "salt", "fresh", "en13319", "red_sea" ], "type": "string" } }, "required": [ "units", "water", "cylinder", "sac", "segments", "total_gas_volume", "total_gas_pressure", "remaining_pressure", "used_pct", "reserve_pressure", "turn_pressure", "status", "minutes_left_at_last_depth", "assumptions", "spoken_summary", "safety_notice" ], "type": "object" } }, { "description": "Returns one section of the Dive Kit planning guide as markdown. Use this when you need to explain a term, a warning or deco theory, or to check what a planning conversation needs: workflow, tool chains, every input with unit, default and range (inputs_reference), deco theory, gradient factors, gas choice, gas planning, gas consumption, blending, weighting, CCR, bailout and contingencies, every warning, repetitive dives, worked examples, conventions, limits, sources; start_here is the index. Not for numbers: every figure comes from the planning tools.", "inputSchema": { "$schema": "https://json-schema.org/draft/2020-12/schema", "additionalProperties": false, "properties": { "topic": { "description": "Guide section to return. Pick glossary for what a word means, deco_theory for how the model works, limits_and_safety for \"is it safe\". start_here: index of the guide and tools. workflow: how a planning conversation runs and what plan_dive needs. tool_chains: how one tool's result feeds the next, six recipes. inputs_reference: every input with unit, default and range. glossary: diver words, abbreviations and plan-table marks mapped to plain meaning and to fields. glossary_equipment: cylinders, rigs and every cylinders[].preset id with its size and fill. deco_theory: Bühlmann ZH-L16C and decompression basics. gradient_factors: what GF low/high do. gas_selection: choosing bottom and deco gases. gas_planning: gas volumes, reserves and turn pressure. gas_consumption: breathing rate (SAC, RMV), rmv_sac and gas_usage. gas_blending: plan_blend, mix_result and fill-station practice. blending_continuous_and_decant: blend_continuous and decant. buoyancy_and_weighting: buoyancy_check, weighting and failure cases. ccr: closed-circuit rebreather planning. bailout_and_contingencies: bailout and lost-gas plans. warnings: every warning and what it means. repetitive_dives: surface intervals and residual loading. worked_examples: complete example plans. why_plans_differ: why planners disagree. conventions: why Dive Kit numbers differ from textbook formulas. limits_and_safety: what this server does not do. sources: references.", "enum": [ "start_here", "workflow", "tool_chains", "inputs_reference", "glossary", "glossary_equipment", "deco_theory", "gradient_factors", "gas_selection", "gas_planning", "gas_consumption", "gas_blending", "blending_continuous_and_decant", "buoyancy_and_weighting", "ccr", "bailout_and_contingencies", "warnings", "repetitive_dives", "worked_examples", "why_plans_differ", "conventions", "limits_and_safety", "sources" ], "type": "string" } }, "required": [ "topic" ], "type": "object" }, "name": "get_guide", "outputSchema": { "$schema": "https://json-schema.org/draft/2020-12/schema", "additionalProperties": false, "properties": { "markdown": { "type": "string" }, "topic": { "enum": [ "start_here", "workflow", "tool_chains", "inputs_reference", "glossary", "glossary_equipment", "deco_theory", "gradient_factors", "gas_selection", "gas_planning", "gas_consumption", "gas_blending", "blending_continuous_and_decant", "buoyancy_and_weighting", "ccr", "bailout_and_contingencies", "warnings", "repetitive_dives", "worked_examples", "why_plans_differ", "conventions", "limits_and_safety", "sources" ], "type": "string" } }, "required": [ "topic", "markdown" ], "type": "object" } }, { "description": "Returns diving certifications from Dive Kit's vetted open dataset of agencies and courses: prerequisites, equivalent courses at other agencies, depth and gas limits, notes and links. Use this when a diver asks what a course allows (\"what does PADI Tec 45 let me do\"), what they need before a course (\"what do I need before a trimix course\"), whether two courses are equivalent (\"is SSI X equivalent to PADI Y\"), or what an agency offers. Not for planning a dive.\n\nThis is Dive Kit's own curated data (CC BY 4.0, open.divekit.app), not a web search; agency rules change, so point the diver to the agency for the final word. No engine call.\n\nExample: {\"agency\":\"PADI\",\"query\":\"tec 45\"}", "inputSchema": { "$schema": "https://json-schema.org/draft/2020-12/schema", "additionalProperties": false, "properties": { "agency": { "description": "Agency abbreviation or id, any case: PADI, SSI, NAUI, SDI, TDI, CMAS, BSAC, RAID, IANTD, GUE, UTD, ANDI, NSS-CDS, ISE, and others. Alone, it returns the agency and a list of its courses.", "maxLength": 40, "type": "string" }, "category": { "description": "recreational, rescue, specialty, technical, rebreather, professional, cave, freediving or other.", "enum": [ "recreational", "rescue", "specialty", "technical", "rebreather", "professional", "cave", "freediving", "other" ], "type": "string" }, "id": { "description": "Exact certification id from an earlier result, e.g. cert-padi-tec-45.", "maxLength": 80, "type": "string" }, "query": { "description": "Free text against the course name, abbreviation, former names, notes and limits, e.g. \"tec 45\", \"trimix\", \"advanced nitrox\", \"cave\". Every word must match.", "maxLength": 100, "type": "string" } }, "type": "object" }, "name": "lookup_certifications", "outputSchema": { "$schema": "https://json-schema.org/draft/2020-12/schema", "additionalProperties": false, "properties": { "agency": { "additionalProperties": {}, "description": "The agency record when agency was given.", "propertyNames": { "type": "string" }, "type": "object" }, "attribution": { "description": "Credit line (CC BY 4.0); keep it with any figures you quote.", "type": "string" }, "certifications": { "description": "Matching records, at most 20, each with agency_abbr.", "items": { "additionalProperties": {}, "propertyNames": { "type": "string" }, "type": "object" }, "type": "array" }, "dataset_version": { "description": "Dataset release tag.", "type": "string" }, "total_matches": { "description": "Matches before the cap.", "type": "number" } }, "required": [ "dataset_version", "attribution", "total_matches", "certifications" ], "type": "object" } }, { "description": "Returns scuba cylinders from Dive Kit's vetted open cylinder dataset: water volume, rated capacity, working pressure, material, typical use and, for five or fewer matches, weight, buoyancy and brands. Each row gives the plan_dive cylinder fields (a preset or cylinder_size) that describe it. Use this when a diver asks which cylinder something is, what it holds (\"what's an HP100 in litres\", \"what does an AL80 hold\"), or names a cylinder you need to size for plan_dive. Not for gas mixes (gas_specs) or gas used on a dive (plan_dive).\n\nThis is Dive Kit's own curated data (CC BY 4.0, open.divekit.app), not a web search. No engine call.\n\nExample: {\"query\":\"hp100\",\"units\":\"imperial\"}", "inputSchema": { "$schema": "https://json-schema.org/draft/2020-12/schema", "additionalProperties": false, "properties": { "material": { "description": "aluminum or steel. Omit for both.", "enum": [ "aluminum", "steel" ], "type": "string" }, "query": { "description": "Free text: a name, brand or use, e.g. \"hp100\", \"al80\", \"luxfer\", \"sidemount\". A number matches the water volume in L, the rated ft³, the working pressure in bar or the number in the name: \"12\" finds 12 L cylinders, \"80\" finds the AL80 and HP80. Every word must match. Omit for every cylinder.", "maxLength": 100, "type": "string" }, "units": { "description": "metric (m, bar, L, °C) or imperial (ft, psi, ft³, °F): the unit system for every value in and out. Default metric.", "enum": [ "metric", "imperial" ], "type": "string" } }, "type": "object" }, "name": "lookup_cylinders", "outputSchema": { "$schema": "https://json-schema.org/draft/2020-12/schema", "additionalProperties": false, "properties": { "attribution": { "description": "Credit line (CC BY 4.0); keep it with any figures you quote.", "type": "string" }, "cylinders": { "description": "Matching dataset records (id, commonName, waterVolumeL, workingPressureBar, material, typicalUse, emptyWeightKg, buoyancyKg, brands, notes, ratedCapacityCuft), each with plan_dive: the plan_dive cylinder fields for it.", "items": { "additionalProperties": {}, "propertyNames": { "type": "string" }, "type": "object" }, "type": "array" }, "dataset_version": { "description": "Dataset release tag.", "type": "string" } }, "required": [ "dataset_version", "attribution", "cylinders" ], "type": "object" } }, { "description": "Returns vetted references from Dive Kit's open references dataset, with links. Use this when a diver asks for a source. Call it before answering any question about deco theory, physiology, gas limits, blending practice, standards or training, so the answer names its source. Not for calculations. If nothing matches, the result lists where to search next; say that source is not Dive Kit-vetted.\n\nEach reference gives title, authors, year, type, publisher, link or DOI, access, and what it is authoritative for (gradient factors, oxygen toxicity, gas density, blending and oxygen cleaning, real gas, buoyancy, gas management, training). Not for cylinders (lookup_cylinders) or courses (lookup_certifications).\n\ntopic narrows by subject and type by kind of source; the enums are in the input schema. query matches every word against the title, authors, publisher, notes and what the source is authoritative for. This is Dive Kit's own curated data (CC BY 4.0, open.divekit.app), not a web search. No engine call.\n\nExample: {\"topic\":\"gradient_factors\"}", "inputSchema": { "$schema": "https://json-schema.org/draft/2020-12/schema", "additionalProperties": false, "properties": { "limit": { "description": "Most references to return, 1 to 20. Default 10.", "maximum": 20, "minimum": 1, "type": "integer" }, "query": { "description": "Free text; every word must match the title, authors, publisher, notes or what the source is authoritative for, e.g. \"baker m-values\", \"oxygen cleaning\", \"neoprene\". Accents are ignored.", "maxLength": 100, "type": "string" }, "topic": { "description": "Subject: deco_theory, gradient_factors, oxygen_toxicity, gas_density, icd, hpns, ccr, gas_selection, gas_planning, gas_blending, oxygen_handling, real_gas, cylinders, buoyancy, breathing_rate, conventions, training, emergencies, cross_checks, community.", "enum": [ "deco_theory", "gradient_factors", "oxygen_toxicity", "gas_density", "icd", "hpns", "ccr", "gas_selection", "gas_planning", "gas_blending", "oxygen_handling", "real_gas", "cylinders", "buoyancy", "breathing_rate", "conventions", "training", "emergencies", "cross_checks", "community" ], "type": "string" }, "type": { "description": "Kind of source: paper, book, standard, manual, article, blog, thread, dataset, website, talk, software, video, podcast, course_material, report.", "enum": [ "paper", "book", "standard", "manual", "article", "blog", "thread", "dataset", "website", "talk", "software", "video", "podcast", "course_material", "report" ], "type": "string" } }, "type": "object" }, "name": "lookup_references", "outputSchema": { "$schema": "https://json-schema.org/draft/2020-12/schema", "additionalProperties": false, "properties": { "attribution": { "description": "Credit line (CC BY 4.0); keep it with any figures you quote.", "type": "string" }, "dataset_version": { "description": "Dataset release tag.", "type": "string" }, "references": { "description": "Matching records (id, title, authors, year, type, publisher, url, doi, access, topics, authoritative_for, notes, checked_at).", "items": { "additionalProperties": {}, "propertyNames": { "type": "string" }, "type": "object" }, "type": "array" }, "search_next": { "description": "Only when nothing matched: where to search next, in order. Anything found there is not Dive Kit-vetted; say so.", "items": { "additionalProperties": false, "properties": { "how_to_search": { "description": "How to search it, e.g. \"site:dan.org <question>\".", "type": "string" }, "name": { "type": "string" }, "url": { "type": "string" }, "use_for": { "type": "string" }, "vetted": { "description": "false: community content; verify against a vetted source.", "type": "boolean" } }, "required": [ "name", "url", "use_for", "vetted", "how_to_search" ], "type": "object" }, "type": "array" }, "total_matches": { "description": "Matches before the limit.", "type": "number" } }, "required": [ "dataset_version", "attribution", "total_matches", "references" ], "type": "object" } }, { "description": "Returns the mix and pressure a cylinder ends with after gases are added in order: each addition's pressure and mix before and after, the cooling step, and the final O₂ %, He % and pressure. Use this when a diver or blender asks what a fill produced (\"50 bar of air, 40 bar of oxygen, then air to 200\"), or to check a plan_blend plan: send its mix_result_current as current and its mix_result_additions as additions. Not for planning toward a target (plan_blend) or joining two cylinders with a whip (decant).\n\nPressures are gauge (bar or psi, per units); mixes are O₂ % and He %. environment sets altitude and the ambient and fill temperatures (defaults sea level, 20 °C, fill equal to ambient); a hot fill settles lower. Real-gas mixing. Analyse the cylinder once it has cooled: the analysed mix, not this one, goes into plan_dive. No engine call.\n\nExample: {\"current\":{\"oxygen_pct\":21,\"pressure\":50},\"additions\":[{\"oxygen_pct\":100,\"pressure_added\":35},{\"oxygen_pct\":21,\"pressure_added\":115}]}", "inputSchema": { "$schema": "https://json-schema.org/draft/2020-12/schema", "additionalProperties": false, "properties": { "additions": { "description": "Gases added, in order. plan_blend gives them as mix_result_additions.", "items": { "additionalProperties": false, "properties": { "helium_pct": { "description": "Helium % of the gas added: 100 for helium. Default 0.", "maximum": 100, "minimum": 0, "type": "number" }, "oxygen_pct": { "description": "Oxygen % of the gas added: 100 oxygen, 21 air, 0 helium, 32 a nitrox bank.", "maximum": 100, "minimum": 0, "type": "number" }, "pressure_added": { "description": "Gauge pressure this gas adds (bar or psi, per units): the cylinder gauge after minus before.", "maximum": 7252, "minimum": 0.1, "type": "number" } }, "required": [ "oxygen_pct", "pressure_added" ], "type": "object" }, "maxItems": 12, "minItems": 1, "type": "array" }, "current": { "additionalProperties": false, "description": "The cylinder before gas goes in. plan_blend gives it as mix_result_current.", "properties": { "helium_pct": { "description": "Helium % before the first addition. Default 0.", "maximum": 100, "minimum": 0, "type": "number" }, "oxygen_pct": { "description": "Oxygen % in the cylinder before the first addition, as analysed. Air is 21.", "maximum": 100, "minimum": 0, "type": "number" }, "pressure": { "description": "Gauge pressure before the first addition (bar or psi, per units); 0 for empty.", "maximum": 7252, "minimum": 0, "type": "number" } }, "required": [ "oxygen_pct", "pressure" ], "type": "object" }, "environment": { "additionalProperties": false, "description": "Altitude and temperatures. Default sea level, 20 °C, fill at ambient.", "properties": { "altitude": { "description": "Altitude (m or ft, per units), 0 to 10000 m (32800 ft). Lowers the surface pressure the math adds to gauge readings. Default 0.", "maximum": 32800, "minimum": 0, "type": "number" }, "ambient_temperature": { "description": "Temperature the cylinder cools to (°C or °F, per units), -50 to 100 °C. Default 20 °C (68 °F).", "maximum": 212, "minimum": -58, "type": "number" }, "fill_temperature": { "description": "Gas temperature right after filling (°C or °F). Above ambient, the plan fills to a hot pressure that settles to the target. Default: ambient.", "maximum": 212, "minimum": -58, "type": "number" } }, "type": "object" }, "units": { "description": "metric (m, bar, L, °C) or imperial (ft, psi, ft³, °F): the unit system for every value in and out. Default metric.", "enum": [ "metric", "imperial" ], "type": "string" } }, "required": [ "current", "additions" ], "type": "object" }, "name": "mix_result", "outputSchema": { "$schema": "https://json-schema.org/draft/2020-12/schema", "additionalProperties": false, "properties": { "final": { "additionalProperties": false, "description": "The mix and settled pressure; analyse to confirm.", "properties": { "helium_pct": { "type": "number" }, "notation": { "type": "string" }, "oxygen_pct": { "type": "number" }, "pressure": { "type": "number" } }, "required": [ "oxygen_pct", "helium_pct", "pressure", "notation" ], "type": "object" }, "notes": { "items": { "type": "string" }, "type": "array" }, "safety_notice": { "type": "string" }, "settle": { "additionalProperties": false, "description": "Cooling from the fill temperature to ambient.", "properties": { "hot_pressure": { "type": "number" }, "settled_pressure": { "type": "number" } }, "required": [ "hot_pressure", "settled_pressure" ], "type": "object" }, "spoken_summary": { "description": "A few plain sentences for a voice reply, ending with an offer: digits allowed, no symbols or notation.", "type": "string" }, "start": { "additionalProperties": false, "properties": { "helium_pct": { "type": "number" }, "oxygen_pct": { "type": "number" }, "pressure": { "type": "number" } }, "required": [ "oxygen_pct", "helium_pct", "pressure" ], "type": "object" }, "steps": { "items": { "additionalProperties": false, "properties": { "helium_pct_added": { "type": "number" }, "helium_pct_after": { "type": "number" }, "helium_pct_before": { "type": "number" }, "oxygen_pct_added": { "type": "number" }, "oxygen_pct_after": { "type": "number" }, "oxygen_pct_before": { "type": "number" }, "pressure_added": { "type": "number" }, "pressure_after": { "type": "number" }, "pressure_before": { "type": "number" } }, "required": [ "oxygen_pct_added", "helium_pct_added", "pressure_added", "pressure_before", "pressure_after", "oxygen_pct_before", "oxygen_pct_after", "helium_pct_before", "helium_pct_after" ], "type": "object" }, "type": "array" }, "units": { "description": "metric (m, bar, L, °C) or imperial (ft, psi, ft³, °F): the unit system for every value in and out. Default metric.", "enum": [ "metric", "imperial" ], "type": "string" } }, "required": [ "units", "start", "steps", "final", "notes", "spoken_summary", "safety_notice" ], "type": "object" } }, { "description": "Returns a partial-pressure blending plan from what a cylinder holds to a target mix and pressure: bleed, helium, oxygen and top-up steps with the gauge pressure to stop at, the mix after each step, the cooling step, the mix achieved, the gas drawn from each bank and alternative plans. Use this when a diver or blender asks how to fill nitrox or trimix (\"fill my twin 12s to 21/35 from 60 bar of 18/45\") or whether their banks can reach a mix. Not for a fill already done (mix_result), continuous-flow blending (blend_continuous) or decanting (decant).\n\ncurrent is the cylinder as analysed now: oxygen_pct, helium_pct, pressure, and preset or cylinder_size as in plan_dive (default AL80 size). target: oxygen_pct, helium_pct, pressure. banks default to unlimited air, oxygen and helium; a finite bank needs pressure and cylinder_size together. A target the banks cannot reach returns feasible false with the reason and the partial plan, not an error. To verify, send mix_result_current and mix_result_additions to mix_result; then gas_specs, and plan_dive with the analysed mix. Oxygen above 40% needs oxygen-clean equipment and blender training. No engine call.\n\nExample: {\"current\":{\"oxygen_pct\":21,\"pressure\":50,\"preset\":\"twin_12l\"},\"target\":{\"oxygen_pct\":21,\"helium_pct\":35,\"pressure\":220}}", "inputSchema": { "$schema": "https://json-schema.org/draft/2020-12/schema", "additionalProperties": false, "properties": { "banks": { "description": "Gas supplies in the order the blender lists them; bank numbers in the result count from 1. Default: unlimited air, oxygen and helium.", "items": { "additionalProperties": false, "properties": { "cylinder_size": { "description": "A cylinder bank's water volume in litres (metric) or rated ft³ at rated_pressure (imperial), given with pressure.", "maximum": 20000, "minimum": 0.5, "type": "number" }, "helium_pct": { "description": "Helium % of this supply: 100 for helium, or a premixed bank. Default 0.", "maximum": 100, "minimum": 0, "type": "number" }, "oxygen_pct": { "description": "Oxygen % of this supply: 21 air, 100 oxygen, 0 helium, 32 a nitrox bank.", "maximum": 100, "minimum": 0, "type": "number" }, "pressure": { "description": "A cylinder bank's gauge pressure now (bar or psi), given with cylinder_size. Omit both for an unlimited supply such as a compressor.", "maximum": 7252, "minimum": 0, "type": "number" }, "rated_pressure": { "description": "Imperial only: the psi the bank's ft³ is rated at. Default 3000.", "maximum": 7252, "minimum": 725, "type": "number" } }, "required": [ "oxygen_pct" ], "type": "object" }, "maxItems": 8, "minItems": 1, "type": "array" }, "current": { "additionalProperties": false, "description": "The cylinder now: analysed mix, gauge pressure and size (default AL80 size).", "properties": { "cylinder_size": { "description": "Metric: water volume of ONE cylinder in litres, the number stamped on the neck. Imperial: rated capacity in ft³ at rated_pressure (an AL80 is 77.4). Default: the preset's, else an AL80 (11.1 L).", "maximum": 400, "minimum": 0.5, "type": "number" }, "helium_pct": { "description": "Helium % now, 0 to 100. Default 0.", "maximum": 100, "minimum": 0, "type": "number" }, "oxygen_pct": { "description": "Oxygen % of the gas in the cylinder now, as analysed, 0 to 100. Air is 21; an empty cylinder is 21 at pressure 0.", "maximum": 100, "minimum": 0, "type": "number" }, "preset": { "description": "A common cylinder instead of cylinder_size, as in plan_dive: al80, al40, al63, hp80, hp100, hp120, lp85, s80, single_10l, single_12l, single_15l, twin_10l, twin_12l, twin_15l, stage_11l, stage_7l, o2_3l, dil_3l. twin_ presets are a manifolded pair.", "enum": [ "al80", "al40", "al63", "hp80", "hp100", "hp120", "lp85", "s80", "single_10l", "single_12l", "single_15l", "twin_10l", "twin_12l", "twin_15l", "stage_11l", "stage_7l", "o2_3l", "dil_3l" ], "type": "string" }, "pressure": { "description": "Gauge pressure now (bar or psi, per units), 0 to 500 bar (7252 psi).", "maximum": 7252, "minimum": 0, "type": "number" }, "rated_pressure": { "description": "Imperial only: the psi the capacity is rated at. Default: the preset's, else 3000. Ignored on metric.", "maximum": 7252, "minimum": 725, "type": "number" }, "twinset": { "description": "true for two cylinders on a manifold, filled or breathed together: doubles the volume. Default: the preset's, else false.", "type": "boolean" } }, "required": [ "oxygen_pct", "pressure" ], "type": "object" }, "environment": { "additionalProperties": false, "description": "Altitude and temperatures. Default sea level, 20 °C, fill at ambient.", "properties": { "altitude": { "description": "Altitude (m or ft, per units), 0 to 10000 m (32800 ft). Lowers the surface pressure the math adds to gauge readings. Default 0.", "maximum": 32800, "minimum": 0, "type": "number" }, "ambient_temperature": { "description": "Temperature the cylinder cools to (°C or °F, per units), -50 to 100 °C. Default 20 °C (68 °F).", "maximum": 212, "minimum": -58, "type": "number" }, "fill_temperature": { "description": "Gas temperature right after filling (°C or °F). Above ambient, the plan fills to a hot pressure that settles to the target. Default: ambient.", "maximum": 212, "minimum": -58, "type": "number" } }, "type": "object" }, "max_plans": { "description": "Plans to return, 1 to 5: the best one plus alternatives. Default 3.", "maximum": 5, "minimum": 1, "type": "integer" }, "target": { "additionalProperties": false, "description": "The mix and settled pressure to reach.", "properties": { "helium_pct": { "description": "Target helium %, 0 to 100. Default 0.", "maximum": 100, "minimum": 0, "type": "number" }, "oxygen_pct": { "description": "Target oxygen %, 0 to 100 (EANx32 is 32, trimix 21/35 is 21).", "maximum": 100, "minimum": 0, "type": "number" }, "pressure": { "description": "Target gauge pressure once the cylinder has cooled (bar or psi, per units).", "maximum": 7252, "minimum": 0, "type": "number" } }, "required": [ "oxygen_pct", "pressure" ], "type": "object" }, "units": { "description": "metric (m, bar, L, °C) or imperial (ft, psi, ft³, °F): the unit system for every value in and out. Default metric.", "enum": [ "metric", "imperial" ], "type": "string" } }, "required": [ "current", "target" ], "type": "object" }, "name": "plan_blend", "outputSchema": { "$schema": "https://json-schema.org/draft/2020-12/schema", "additionalProperties": false, "properties": { "achieved": { "additionalProperties": false, "properties": { "helium_error_pct": { "type": "number" }, "helium_pct": { "type": "number" }, "notation": { "type": "string" }, "oxygen_error_pct": { "type": "number" }, "oxygen_pct": { "type": "number" }, "pressure": { "type": "number" } }, "required": [ "oxygen_pct", "helium_pct", "pressure", "notation", "oxygen_error_pct", "helium_error_pct" ], "type": "object" }, "alternatives": { "items": { "additionalProperties": false, "properties": { "helium_pct": { "type": "number" }, "oxygen_pct": { "type": "number" }, "step_count": { "type": "number" }, "summary": { "type": "string" } }, "required": [ "summary", "step_count", "oxygen_pct", "helium_pct" ], "type": "object" }, "type": "array" }, "consumption": { "items": { "additionalProperties": false, "properties": { "bank": { "type": "number" }, "bank_gas": { "type": "string" }, "pressure": { "description": "Gauge pressure drawn (finite banks: the bank drop).", "type": "number" }, "volume": { "description": "Free gas drawn, L or ft³.", "type": "number" } }, "required": [ "bank", "bank_gas", "pressure", "volume" ], "type": "object" }, "type": "array" }, "error": { "additionalProperties": false, "properties": { "code": { "type": "string" }, "key": { "type": "string" }, "reason": { "type": "string" } }, "required": [ "code", "key", "reason" ], "type": "object" }, "feasible": { "type": "boolean" }, "mix_result_additions": { "description": "mix_result additions: every add step, in order.", "items": { "additionalProperties": false, "properties": { "helium_pct": { "type": "number" }, "oxygen_pct": { "type": "number" }, "pressure_added": { "type": "number" } }, "required": [ "oxygen_pct", "helium_pct", "pressure_added" ], "type": "object" }, "type": "array" }, "mix_result_current": { "additionalProperties": false, "description": "mix_result current: the cylinder after the last bleed.", "properties": { "helium_pct": { "type": "number" }, "oxygen_pct": { "type": "number" }, "pressure": { "type": "number" } }, "required": [ "oxygen_pct", "helium_pct", "pressure" ], "type": "object" }, "notes": { "items": { "type": "string" }, "type": "array" }, "partial_plan_steps": { "description": "feasible false: the steps that run before the plan gets stuck.", "items": { "additionalProperties": false, "properties": { "bank": { "description": "add: bank number from 1, in the order given.", "type": "number" }, "bank_gas": { "type": "string" }, "bank_helium_pct": { "type": "number" }, "bank_oxygen_pct": { "type": "number" }, "bank_pressure_after": { "description": "add from a finite bank: the bank gauge after.", "type": "number" }, "bank_pressure_before": { "description": "add from a finite bank: the bank gauge before.", "type": "number" }, "helium_pct_after": { "type": "number" }, "helium_pct_before": { "type": "number" }, "hot_pressure": { "type": "number" }, "instruction": { "description": "The step in one sentence.", "type": "string" }, "kind": { "description": "bleed down, add from a bank, or let the cylinder cool.", "enum": [ "bleed", "add", "settle" ], "type": "string" }, "oxygen_pct_after": { "type": "number" }, "oxygen_pct_before": { "type": "number" }, "settled_pressure": { "type": "number" }, "to_pressure": { "description": "bleed and add: gauge pressure to stop at.", "type": "number" } }, "required": [ "kind", "instruction" ], "type": "object" }, "type": "array" }, "safety_notice": { "type": "string" }, "spoken_summary": { "description": "A few plain sentences for a voice reply, ending with an offer: digits allowed, no symbols or notation.", "type": "string" }, "steps": { "description": "The best plan in order; empty when feasible is false.", "items": { "additionalProperties": false, "properties": { "bank": { "description": "add: bank number from 1, in the order given.", "type": "number" }, "bank_gas": { "type": "string" }, "bank_helium_pct": { "type": "number" }, "bank_oxygen_pct": { "type": "number" }, "bank_pressure_after": { "description": "add from a finite bank: the bank gauge after.", "type": "number" }, "bank_pressure_before": { "description": "add from a finite bank: the bank gauge before.", "type": "number" }, "helium_pct_after": { "type": "number" }, "helium_pct_before": { "type": "number" }, "hot_pressure": { "type": "number" }, "instruction": { "description": "The step in one sentence.", "type": "string" }, "kind": { "description": "bleed down, add from a bank, or let the cylinder cool.", "enum": [ "bleed", "add", "settle" ], "type": "string" }, "oxygen_pct_after": { "type": "number" }, "oxygen_pct_before": { "type": "number" }, "settled_pressure": { "type": "number" }, "to_pressure": { "description": "bleed and add: gauge pressure to stop at.", "type": "number" } }, "required": [ "kind", "instruction" ], "type": "object" }, "type": "array" }, "units": { "description": "metric (m, bar, L, °C) or imperial (ft, psi, ft³, °F): the unit system for every value in and out. Default metric.", "enum": [ "metric", "imperial" ], "type": "string" } }, "required": [ "units", "feasible", "steps", "achieved", "consumption", "mix_result_current", "mix_result_additions", "alternatives", "notes", "spoken_summary", "safety_notice" ], "type": "object" } }, { "description": "Computes the decompression plan for one dive, open circuit (OC) or closed-circuit rebreather (CCR): stop table, runtime, time to surface (TTS), gas used per cylinder, ascent pressure, CNS/OTU, gas density, warnings, contingencies, CCR bailout and a Dive Kit share link. Defaults unless given: GF 50/80, reserve thirds, SAC 20/15 L/min, last stop 6 m (20 ft), EN 13319 water, sea level. Use this when a diver wants a deco schedule, the gas a planned dive needs, or a what-if comparison (deeper, longer, a lost gas, other gradient factors) on air, nitrox or trimix. Not for: MOD, END or other gas facts at one depth (gas_specs), a best mix (best_mix), the longest bottom time the gas allows (find_max_bottom_time), no-stop time (check_no_deco), or dive logging.\n\nComputed by Dive Kit's Bühlmann ZH-L16C engine. Results are an experimental planning aid: relay the safety_notice.\n\nplan_name labels it (\"45m 20min 21/35+EANx50\"); audience (beginner, recreational, technical) tunes wording. A cylinder takes a preset (al80, twin_12l, stage_11l …; lookup_cylinders finds others) or cylinder_size and start_pressure; missing ones default to an AL80 (11.1 L at 3000 psi, 206.84 bar). descent_gas names a travel gas for a hypoxic bottom mix. scenarios compares what-ifs in one call: deeper_3m, longer_3min, lost:<id>, gf:40/85, last_stop:3.\n\n`units` sets every depth, pressure, volume, rate and temperature: metric (m, bar, L) or imperial (ft, psi, ft³). PPO₂ is always bar, mixes %, times minutes.\n\nOmit any other field for its Dive Kit default; the result lists each default it applied. get_guide('inputs_reference') lists every field, get_guide('workflow') the planning conversation. Stateless: send the whole plan every call.\n\nExample: {\"plan_name\":\"45m 20min 21/35+EANx50\",\"levels\":[{\"depth\":45,\"bottom_time_min\":20}],\"cylinders\":[{\"id\":\"back\",\"oxygen_pct\":21,\"helium_pct\":35,\"preset\":\"twin_12l\",\"start_pressure\":220},{\"id\":\"deco\",\"oxygen_pct\":50,\"preset\":\"stage_11l\"}],\"scenarios\":[\"base\",\"gf:40/85\"]}", "inputSchema": { "$schema": "https://json-schema.org/draft/2020-12/schema", "additionalProperties": false, "properties": { "audience": { "description": "Optional: who the answer is for, from the conversation. beginner: new to deco, plain words. recreational (default): some training. technical: trained deco or CCR diver, terms and tables. Shapes the wording only, never a number.", "enum": [ "beginner", "recreational", "technical" ], "type": "string" }, "bailout": { "additionalProperties": false, "description": "ccr only: the bailout view.", "properties": { "depth": { "description": "For on_ascent: depth (m or ft) the diver leaves the loop on the final ascent.", "maximum": 660, "minimum": 0, "type": "number" }, "level_number": { "description": "For after_level: the level (1-based) the diver bails at the end of.", "maximum": 20, "minimum": 1, "type": "integer" }, "run_time_min": { "description": "For at_run_time: minutes on the Run clock.", "maximum": 1000, "minimum": 0, "type": "number" }, "view": { "description": "ccr: which ascent the table shows. loop (default), end_of_profile, after_level, at_run_time, on_ascent. The worst-case bailout check runs on every view.", "enum": [ "loop", "end_of_profile", "after_level", "at_run_time", "on_ascent" ], "type": "string" } }, "type": "object" }, "behavior": { "additionalProperties": false, "description": "Profile and model switches.", "properties": { "include_travel_in_level_time": { "description": "true: level time includes the descent to it (dive-computer runtime style). Default false.", "type": "boolean" }, "o2_narcotic": { "description": "Count oxygen in END. END and warnings only. Default false.", "type": "boolean" }, "stay_on_loop": { "description": "ccr: true (default) keeps the whole ascent on the loop; false lets an OC deco gas take over where its PPO₂ is higher. Not carried in share links.", "type": "boolean" } }, "type": "object" }, "ccr": { "additionalProperties": false, "description": "The rebreather (mode ccr only).", "properties": { "descent_switch_depth": { "description": "Depth (m or ft) where the descent setpoint hands over to bottom, first descent only. Default 18 m (60 ft).", "maximum": 660, "minimum": 0, "type": "number" }, "diluent_breathable_oc": { "description": "true if the BOV or a regulator can breathe the onboard diluent open circuit. It then joins the bailout pool last. Default false.", "type": "boolean" }, "diluent_helium_pct": { "description": "Onboard diluent helium percent. Default 0.", "maximum": 95, "minimum": 0, "type": "number" }, "diluent_oxygen_pct": { "description": "Onboard diluent oxygen percent. Default 21.", "maximum": 100, "minimum": 5, "type": "number" }, "diluent_size": { "description": "Diluent cylinder: litres (metric) or ft³ rated at 3000 psi (imperial). Default 3 L.", "maximum": 400, "minimum": 0, "type": "number" }, "diluent_start_pressure": { "description": "Diluent cylinder fill (bar or psi). Default 232 bar (3365 psi).", "maximum": 7252, "minimum": 0, "type": "number" }, "loop_volume": { "description": "Loop volume, litres in both unit systems, 2 to 15. Default 6.", "maximum": 15, "minimum": 2, "type": "number" }, "o2_size": { "description": "Oxygen cylinder: litres (metric) or ft³ rated at 3000 psi (imperial). Default 3 L.", "maximum": 400, "minimum": 0, "type": "number" }, "o2_start_pressure": { "description": "Oxygen cylinder fill (bar or psi). Default 232 bar (3365 psi).", "maximum": 7252, "minimum": 0, "type": "number" }, "setpoints": { "additionalProperties": false, "description": "Loop setpoints in bar.", "properties": { "bottom": { "description": "Bottom setpoint in bar, the level default. Default 1.0.", "maximum": 1.6, "minimum": 0.4, "type": "number" }, "deco": { "description": "Deco setpoint in bar, used where ccr_deco_schedule has no step. Default 1.4.", "maximum": 1.6, "minimum": 0.4, "type": "number" }, "descent": { "description": "Descent setpoint in bar. Default 0.7.", "maximum": 1.6, "minimum": 0.4, "type": "number" } }, "type": "object" } }, "type": "object" }, "ccr_deco_schedule": { "description": "ccr deco setpoint steps, up to 10. Default [40 m: 1.5, 23 m: 1.6]. Send [] for the single ccr.setpoints.deco.", "items": { "additionalProperties": false, "properties": { "depth": { "description": "Depth (m or ft): the step applies at this depth and shallower.", "maximum": 660, "minimum": 0, "type": "number" }, "setpoint": { "description": "Setpoint in bar.", "maximum": 1.6, "minimum": 0.4, "type": "number" } }, "required": [ "depth", "setpoint" ], "type": "object" }, "maxItems": 10, "type": "array" }, "ccr_dilout_switches": { "description": "ccr: at each depth and shallower, the loop breathes that cylinder as diluent (a dilout). Up to 6. Default none.", "items": { "additionalProperties": false, "properties": { "cylinder": { "description": "Cylinder id breathed as diluent, or \"onboard\" to switch back.", "maxLength": 12, "type": "string" }, "depth": { "description": "Depth (m or ft): the switch applies at this depth and shallower.", "maximum": 660, "minimum": 0, "type": "number" } }, "required": [ "depth", "cylinder" ], "type": "object" }, "maxItems": 6, "type": "array" }, "contingencies": { "description": "Custom contingencies, up to 6, each requested with scenarios \"custom:<name>\" (or \"all\").", "items": { "additionalProperties": false, "properties": { "deco_sac": { "description": "Deco SAC for this contingency only (L/min or ft³/min, per units). Default gas_consumption.deco_sac.", "maximum": 200, "minimum": 0, "type": "number" }, "delay_min": { "description": "A hold at depth before the ascent starts, 0 to 60 minutes. Moves the schedule. Default 0.", "maximum": 60, "minimum": 0, "type": "number" }, "depth_change": { "description": "Depth added to that level (m or ft, per units), -30 to 30 m (-100 to 100 ft). Default 0.", "maximum": 100, "minimum": -100, "type": "number" }, "fails_after_level": { "description": "Level number (1-based) after which the lost cylinders are gone. Omit: they are never carried.", "maximum": 20, "minimum": 1, "type": "integer" }, "level_number": { "description": "Level number (1-based) the depth and time changes apply to. Default the deepest (last on a tie).", "maximum": 20, "minimum": 1, "type": "integer" }, "lost_cylinders": { "description": "Cylinder ids lost in this contingency, comma-separated, e.g. \"s50,o2\". Default none.", "maxLength": 130, "type": "string" }, "name": { "description": "Name of this contingency, 1 to 24 characters. Request it with scenarios \"custom:<name>\". Unique.", "maxLength": 24, "minLength": 1, "type": "string" }, "stress_minutes": { "description": "Minutes the stress_sac burst lasts, 1 to 60.", "maximum": 60, "minimum": 1, "type": "number" }, "stress_sac": { "description": "Hard-breathing surface rate, SAC (L/min or ft³/min, per units), from the end of the bottom (on bailout: from leaving the loop), gas only. Needs stress_minutes or stress_whole_ascent.", "maximum": 200, "minimum": 0, "type": "number" }, "stress_whole_ascent": { "description": "true: the stress_sac burst lasts to the surface. Default false.", "type": "boolean" }, "time_change_min": { "description": "Minutes added to that level, -60 to 60. Default 0.", "maximum": 60, "minimum": -60, "type": "number" }, "working_sac": { "description": "Working SAC for this contingency only (L/min or ft³/min, per units). Default gas_consumption.working_sac.", "maximum": 200, "minimum": 0, "type": "number" } }, "required": [ "name" ], "type": "object" }, "maxItems": 6, "type": "array" }, "cylinders": { "description": "Every open-circuit cylinder carried: back gas, stages, deco gases; on ccr, bailout gases. 1 to 10. Give preset or cylinder_size and start_pressure when known; omitted ones default (an AL80, 11.1 L at 3000 psi) and the result marks them.", "items": { "additionalProperties": false, "properties": { "cylinder_size": { "description": "12 = one 12 L cylinder (metric). 77.4 = an AL80 in ft³ (imperial, with rated_pressure 3000). Metric: water volume of ONE cylinder in litres, the number stamped on the neck, 1 to 25.5. Imperial: rated capacity in ft³ from the spec sheet (an AL80 holds less than its name), 1 to 400. Or pass preset. Default with neither: an AL80 (11.1 L, 77.4 ft³ at 3000 psi).", "maximum": 400, "minimum": 0, "type": "number" }, "exclude_from_deco": { "description": "true keeps this cylinder out of automatic ascent switching (pony, buddy bottle). Still priced; a level can still name it. Default false.", "type": "boolean" }, "helium_pct": { "description": "Helium percent, 0 to 95, oxygen_pct + helium_pct at most 100. Trimix 18/45 is 45. Default 0.", "maximum": 95, "minimum": 0, "type": "number" }, "id": { "description": "Short name used by levels and contingencies, 1 to 12 letters, digits, _ or -, e.g. back, s50, o2. Unique.", "maxLength": 12, "minLength": 1, "type": "string" }, "oxygen_pct": { "description": "Oxygen percent, 5 to 100. Air is 21, EANx50 is 50, trimix 18/45 is 18.", "maximum": 100, "minimum": 5, "type": "number" }, "preset": { "description": "A common cylinder instead of cylinder_size, rated_pressure, twinset and the fill (explicit fields win). al80/s80: aluminium 80, 11.1 L, 3000 psi. al40, al63: aluminium 40/63, 3000 psi. hp80, hp100, hp120: US high-pressure steel, 3442 psi. lp85: US low-pressure steel, 2640 psi. single_10l, single_12l, single_15l: one EU steel cylinder at 232 bar. twin_10l, twin_12l, twin_15l: back-mounted doubles, 232 bar each. stage_11l: aluminium stage (AL80 size), 200 bar. stage_7l: 7 L stage, 200 bar. o2_3l, dil_3l: 3 L rebreather cylinder, 232 bar.", "enum": [ "al80", "al40", "al63", "hp80", "hp100", "hp120", "lp85", "s80", "single_10l", "single_12l", "single_15l", "twin_10l", "twin_12l", "twin_15l", "stage_11l", "stage_7l", "o2_3l", "dil_3l" ], "type": "string" }, "rated_pressure": { "description": "Imperial only: the working pressure the capacity is rated at, psi, 725 to 7252 (3000 for an AL80). Default: the preset's, else 3000. Ignored on metric.", "maximum": 7252, "minimum": 0, "type": "number" }, "reserve_pressure": { "description": "Custom reserve for this cylinder (bar or psi, per units), 5 to 300 bar (50 to 4351 psi). Default: the reserve rule. Moves warnings and find_max_bottom_time, never the stops.", "maximum": 4351, "minimum": 0, "type": "number" }, "start_pressure": { "description": "Pressure in the cylinder at the start of the dive (bar or psi, per units), 0 to 500 bar (0 to 7252 psi). Default: the preset's fill, else 206.84 bar (3000 psi).", "maximum": 7252, "minimum": 0, "type": "number" }, "twinset": { "description": "true for back-mounted doubles or a sidemount pair breathed as one supply: doubles the gas at the same pressure. Default: the preset's, else false.", "type": "boolean" } }, "required": [ "id", "oxygen_pct" ], "type": "object" }, "maxItems": 10, "minItems": 1, "type": "array" }, "descent_gas": { "description": "oc only. Cylinder id of a travel gas for the descent, for a hypoxic bottom mix (e.g. 12/60) that cannot be breathed near the surface. When level 1 is deeper than that gas's MOD, a 0-minute level on it at its MOD (whole m or ft) is added before level 1, and the result numbers that level first. Default none.", "maxLength": 12, "type": "string" }, "environment": { "additionalProperties": false, "description": "Water and altitude.", "properties": { "altitude": { "description": "Surface altitude (m or ft, per units), 0 to 10000 m (0 to 32800 ft). Default 0.", "maximum": 32800, "minimum": 0, "type": "number" }, "temperature": { "description": "Water temperature for gas density only, -2 to 40 °C (28 to 104 °F). Never moves stops. Default 15 °C (59 °F).", "maximum": 104, "minimum": -2, "type": "number" }, "water": { "description": "Water type, from its density: en13319 (EN 13319, the dive computer standard) 10.00 m per bar, salt 9.95, fresh 10.20, red_sea 9.92. Default en13319.", "enum": [ "salt", "fresh", "en13319", "red_sea" ], "type": "string" } }, "type": "object" }, "gas_consumption": { "additionalProperties": false, "description": "Breathing rates.", "properties": { "ccr_metabolic_o2": { "description": "ccr: oxygen the diver metabolises, L/min in both unit systems, 0.4 to 2.0. Default 0.85.", "maximum": 2, "minimum": 0.4, "type": "number" }, "deco_sac": { "description": "SAC from the first stop up (L/min or ft³/min). Default 15 L/min (0.53 ft³/min). Gas figures only.", "maximum": 200, "minimum": 0, "type": "number" }, "working_sac": { "description": "Surface air consumption (SAC, also called RMV) for descent, bottom and the deep ascent (L/min or ft³/min, per units), 1 to 200 L/min (0.05 to 7.1 ft³/min). Default 20 L/min (0.71 ft³/min). Gas figures only.", "maximum": 200, "minimum": 0, "type": "number" } }, "type": "object" }, "gas_switch": { "additionalProperties": false, "description": "Gas switching.", "properties": { "switch_at": { "description": "mod: switch at the deco gas MOD (default). stop: at the next stop.", "enum": [ "mod", "stop" ], "type": "string" }, "switch_time_s": { "description": "Seconds held at each OC switch on the old gas, 0 to 300 in 30 s steps. Default 0.", "maximum": 300, "minimum": 0, "type": "number" }, "when_cylinder_empty": { "description": "show_shortfall (default): stay on it and report how much more gas is needed. switch_gas: move to the richest safe gas left.", "enum": [ "show_shortfall", "switch_gas" ], "type": "string" } }, "type": "object" }, "gradient_factors": { "additionalProperties": false, "description": "Gradient factors. Lower is more conservative. Default 50/80. If high cannot surface the plan, the engine raises it and warns.", "properties": { "high": { "description": "GF high, percent, 10 to 100. Sets the shallow stops and surfacing margin. Default 80.", "maximum": 100, "minimum": 10, "type": "number" }, "low": { "description": "GF low, percent, 10 to 100. Sets the first stop depth. Default 50.", "maximum": 100, "minimum": 10, "type": "number" } }, "type": "object" }, "levels": { "description": "Dive levels in the order dived, 1 to 20. The first is level_number 1.", "items": { "additionalProperties": false, "properties": { "bottom_time_min": { "description": "Minutes at this depth, excluding the descent to it (unless behavior.include_travel_in_level_time is true). 0 to 360. 0 = arrival only: passes through this depth on this gas, used for a no-stop check or a travel-gas leg. Required.", "maximum": 360, "minimum": 0, "type": "number" }, "breathe": { "description": "ccr only. loop (default) or oc: dive this level open circuit on `gas`.", "enum": [ "loop", "oc" ], "type": "string" }, "depth": { "description": "Level depth (m or ft, per units). 1 to 200 m (3 to 650 ft). Required.", "maximum": 700, "minimum": 0, "type": "number" }, "diluent": { "description": "ccr only. \"onboard\" (default) or a cylinder id to breathe through the loop as a dilout on this level.", "maxLength": 12, "type": "string" }, "gas": { "description": "Cylinder id this level breathes, or \"auto\" (default): the richest gas legal at this depth by PPO₂ cap, hypoxic floor and density limit. On ccr, auto means the loop on the onboard diluent.", "maxLength": 12, "type": "string" }, "setpoint": { "description": "ccr only. Loop PPO₂ for this level in bar, 0.4 to 1.6. Default ccr.setpoints.bottom.", "maximum": 1.6, "minimum": 0.4, "type": "number" } }, "required": [ "depth", "bottom_time_min" ], "type": "object" }, "maxItems": 20, "minItems": 1, "type": "array" }, "mode": { "description": "oc (open circuit, default) or ccr (closed-circuit rebreather). Set ccr for every rebreather plan: the ccr, ccr_deco_schedule, ccr_dilout_switches and bailout fields need it. On ccr, `cylinders` are the open-circuit bailout gases; the rig itself is in `ccr`.", "enum": [ "oc", "ccr" ], "type": "string" }, "modifiers": { "additionalProperties": false, "description": "Plan modifiers: a stress breathing burst (gas only) and a delay before the ascent (moves the schedule).", "properties": { "deco_sac": { "description": "Deco SAC override for the whole plan (L/min or ft³/min). Default gas_consumption.deco_sac.", "maximum": 200, "minimum": 0, "type": "number" }, "delay_min": { "description": "A hold at depth before the ascent starts, 0 to 60 minutes. Moves the schedule. Default 0.", "maximum": 60, "minimum": 0, "type": "number" }, "stress_minutes": { "description": "Minutes the stress_sac burst lasts, 1 to 60.", "maximum": 60, "minimum": 1, "type": "number" }, "stress_sac": { "description": "Hard-breathing surface rate, SAC (L/min or ft³/min, per units), from the end of the bottom (on bailout: from leaving the loop), gas only. Needs stress_minutes or stress_whole_ascent.", "maximum": 200, "minimum": 0, "type": "number" }, "stress_whole_ascent": { "description": "true: the stress_sac burst lasts to the surface. Default false.", "type": "boolean" }, "working_sac": { "description": "Working SAC override for the whole plan (L/min or ft³/min). Default gas_consumption.working_sac.", "maximum": 200, "minimum": 0, "type": "number" } }, "type": "object" }, "oxygen_breaks": { "additionalProperties": false, "description": "Oxygen breaks.", "properties": { "apply_on_loop": { "description": "ccr: also break on the loop. Not carried in share links. Default false.", "type": "boolean" }, "break_minutes": { "description": "Break length in minutes, 1 to 10. Default 5.", "maximum": 10, "minimum": 1, "type": "number" }, "enabled": { "description": "Insert oxygen breaks on high-PPO₂ stops. Default false.", "type": "boolean" }, "loop_setpoint": { "description": "ccr: loop setpoint in bar during a break. Default 0.7.", "maximum": 1.6, "minimum": 0.4, "type": "number" }, "min_ppo2": { "description": "PPO₂ in bar at or above which a stop counts toward the break clock, 0.8 to 1.8. Default 1.4.", "maximum": 1.8, "minimum": 0.8, "type": "number" }, "o2_minutes": { "description": "Minutes on high PPO₂ before a break, 5 to 30. Default 20.", "maximum": 30, "minimum": 5, "type": "number" } }, "type": "object" }, "plan_name": { "description": "Short human label shown in the approval card; fill it first, e.g. 40m 20min air+EANx50. Also titles the plan table and share link, which keep its first 24 characters (a longer name is cut, never refused).", "type": "string" }, "ppo2": { "additionalProperties": false, "description": "PPO₂ limits in bar.", "properties": { "max_28_to_44pct_o2": { "description": "PPO₂ cap in bar for gases from 28% to under 45% O₂, 1.0 to 1.6. Default 1.5.", "maximum": 1.6, "minimum": 1, "type": "number" }, "max_45pct_o2_and_up": { "description": "PPO₂ cap in bar for gases of 45% O₂ and over, 1.0 to 1.6. Default 1.6.", "maximum": 1.6, "minimum": 1, "type": "number" }, "max_all": { "description": "One PPO₂ cap in bar for every gas, 1.0 to 1.6 (e.g. 1.4 for recreational nitrox). Sets all three bands; a band field given too wins for its band.", "maximum": 1.6, "minimum": 1, "type": "number" }, "max_under_28pct_o2": { "description": "PPO₂ cap in bar for gases under 28% O₂, 1.0 to 1.6. Sets their MOD and switch depth. Default 1.4.", "maximum": 1.6, "minimum": 1, "type": "number" }, "min": { "description": "Lowest PPO₂ in bar before a hypoxia warning, 0.16 to 0.21. Warnings only. Default 0.18.", "maximum": 0.21, "minimum": 0.16, "type": "number" } }, "type": "object" }, "rates": { "additionalProperties": false, "description": "Ascent and descent rates, per units.", "properties": { "ascent_deep": { "description": "Ascent rate below rate_change_depth (m/min or ft/min), 1 to 100 m/min. Default 9 m/min (30 ft/min).", "maximum": 330, "minimum": 0, "type": "number" }, "ascent_shallow": { "description": "Ascent rate from rate_change_depth to the surface (m/min or ft/min), 1 to 100 m/min. Default 3 m/min (10 ft/min).", "maximum": 330, "minimum": 0, "type": "number" }, "descent": { "description": "Descent rate (m/min or ft/min), 1 to 100 m/min. Default 20 m/min (66 ft/min).", "maximum": 330, "minimum": 0, "type": "number" }, "rate_change_depth": { "description": "Depth where the ascent rate changes (m or ft), 3 to 200 m. Default 6 m (20 ft).", "maximum": 660, "minimum": 0, "type": "number" } }, "type": "object" }, "repetitive": { "additionalProperties": false, "description": "Repetitive dive: the previous dive and the surface interval.", "properties": { "previous_share_url": { "description": "The share link of the previous dive's plan_dive result. Its tissue loading seeds this dive.", "maxLength": 8000, "type": "string" }, "surface_interval_min": { "description": "Surface interval since the previous dive, 15 to 1440 minutes.", "maximum": 1440, "minimum": 15, "type": "number" } }, "required": [ "surface_interval_min" ], "type": "object" }, "reserve": { "additionalProperties": false, "description": "Gas reserve rule. Moves the gas status and warnings, never the stops.", "properties": { "fixed_pressure": { "description": "Reserve for rule fixed (bar or psi, per units). Default 50 bar (725 psi).", "maximum": 7252, "minimum": 0, "type": "number" }, "rule": { "description": "thirds, fourths, fifths, sixths or fixed. Default thirds. Below 50 bar (725 psi) is always critical.", "enum": [ "thirds", "fourths", "fifths", "sixths", "fixed" ], "type": "string" } }, "type": "object" }, "response_format": { "description": "concise: plan table, gas, warnings, scenario summary. detailed: adds every setting used, per-level NDL, full warning details and the bailout table. Default concise.", "enum": [ "concise", "detailed" ], "type": "string" }, "scenarios": { "description": "Which plans to compute, default [\"base\"]. base; deeper_3m, deeper_5m (imperial: deeper_10ft, deeper_20ft), longer_3min, longer_5min, deeper_and_longer_3, deeper_and_longer_5 (applied to the deepest level); lost:<cylinder id> (that cylinder never carried); custom:<name> (defined in contingencies); gf:<low>/<high> (e.g. gf:40/85), last_stop:<depth> (3, 4.5, 6 m or 10, 15, 20 ft) and stop_rounding:<1s|30s|1min> (the base plan with that one setting changed, to compare settings in one call); all (not the variants). Each one returns its own table and a comparison row. Up to 10. Ask for more in a later call.", "items": { "description": "One scenario key.", "maxLength": 40, "type": "string" }, "maxItems": 10, "type": "array" }, "stops": { "additionalProperties": false, "description": "Stop grid and stop-time rounding.", "properties": { "last_stop_depth": { "description": "Final stop depth: 3, 4.5 or 6 m; 10, 15 or 20 ft. Default 6 m (20 ft).", "type": "number" }, "stop_spacing": { "description": "Distance between stops: 3, 6 or 9 m; 10, 20 or 30 ft. Default 3 m (10 ft).", "type": "number" }, "time_rounding": { "description": "1s, 30s or 1min. Applied inside the engine; a stop is never shorter than the obligation. Default 1min.", "enum": [ "1s", "30s", "1min" ], "type": "string" } }, "type": "object" }, "table_columns": { "additionalProperties": false, "description": "Extra table columns. PPO₂ is always shown.", "properties": { "cns": { "description": "Add a running CNS column. Default false.", "type": "boolean" }, "gas_remaining": { "description": "Add a gas-remaining column (bar or psi). Default false.", "type": "boolean" } }, "type": "object" }, "units": { "description": "metric (m, bar, L, L/min, °C) or imperial (ft, psi, ft³, ft³/min, °F). Applies to every input and output value except PPO₂/setpoints (bar), mixes (%), density (g/L). Default metric.", "enum": [ "metric", "imperial" ], "type": "string" }, "warning_thresholds": { "additionalProperties": false, "description": "Warning thresholds. Warnings only, never the stops.", "properties": { "cns_pct": { "description": "CNS percent warning, 50 to 100. Default 80.", "maximum": 100, "minimum": 50, "type": "number" }, "density_critical": { "description": "Gas density critical in g/L, 3 to 8; also vetoes a gas in auto. Default 6.2.", "maximum": 8, "minimum": 3, "type": "number" }, "density_warning": { "description": "Gas density warning in g/L, 3 to 8. Default 5.2.", "maximum": 8, "minimum": 3, "type": "number" }, "end_max": { "description": "Highest END before a warning (m or ft, per units), 20 to 100 m. Default 30 m (100 ft).", "maximum": 330, "minimum": 0, "type": "number" }, "otu": { "description": "OTU warning, 200 to 500. Default 300.", "maximum": 500, "minimum": 200, "type": "number" } }, "type": "object" } }, "required": [ "levels", "cylinders" ], "type": "object" }, "name": "plan_dive", "outputSchema": { "$schema": "https://json-schema.org/draft/2020-12/schema", "additionalProperties": false, "properties": { "bailout_table_markdown": { "type": "string" }, "computed_with": { "additionalProperties": { "type": "string" }, "propertyNames": { "type": "string" }, "type": "object" }, "engine": { "additionalProperties": false, "properties": { "algorithm": { "type": "string" }, "core_version": { "type": "string" }, "engine_version": { "type": "number" }, "gf": { "type": "string" }, "server_version": { "type": "string" } }, "required": [ "algorithm", "gf", "core_version", "engine_version", "server_version" ], "type": "object" }, "gas": { "items": { "additionalProperties": false, "properties": { "ascent_pressure": { "type": "number" }, "cylinder_id": { "type": "string" }, "mix": { "type": "string" }, "ran_out_at_depth": { "type": "number" }, "remaining": { "type": "number" }, "reserve": { "type": "number" }, "shortfall": { "type": "number" }, "start": { "type": "number" }, "status": { "type": "string" }, "used": { "type": "number" }, "used_volume": { "type": "number" } }, "required": [ "cylinder_id", "mix", "start", "used", "used_volume", "remaining", "status" ], "type": "object" }, "type": "array" }, "levels": { "items": { "additionalProperties": false, "properties": { "breathing": { "type": "string" }, "depth": { "type": "number" }, "end": { "type": "number" }, "gas_density_g_l": { "type": "number" }, "issues": { "items": { "additionalProperties": false, "properties": { "code": { "type": "string" }, "detail": { "type": "string" }, "severity": { "type": "string" }, "title": { "type": "string" } }, "required": [ "code", "severity", "title", "detail" ], "type": "object" }, "type": "array" }, "level": { "type": "number" }, "ppo2": { "type": "number" } }, "required": [ "level", "depth", "breathing", "ppo2", "end", "gas_density_g_l", "issues" ], "type": "object" }, "type": "array" }, "loop_warnings": { "description": "ccr bailout views only: warnings for the loop plan the summary and main table show, with the per-level issues. warnings then covers the bailout view.", "items": { "additionalProperties": false, "properties": { "code": { "type": "string" }, "detail": { "type": "string" }, "level_number": { "description": "1-based level a per-level issue belongs to.", "type": "number" }, "severity": { "type": "string" }, "title": { "type": "string" } }, "required": [ "code", "severity", "title", "detail" ], "type": "object" }, "type": "array" }, "next_steps": { "items": { "type": "string" }, "type": "array" }, "presentation": { "items": { "type": "string" }, "type": "array" }, "safety_notice": { "type": "string" }, "scenarios": { "items": { "additionalProperties": false, "properties": { "cns_percent": { "type": "number" }, "delta_tts_min": { "type": "number" }, "gas_line": { "description": "response_format detailed: what each cylinder ends with in this scenario.", "type": "string" }, "key": { "type": "string" }, "label": { "type": "string" }, "runtime_min": { "type": "number" }, "shortfall": { "description": "Every cylinder that runs short and by how much (\"travel 41 bar\"), or \"none\".", "type": "string" }, "status": { "type": "string" }, "table_markdown": { "type": "string" }, "tightest_cylinder": { "type": "string" }, "tts_min": { "type": "number" }, "warnings": { "items": { "additionalProperties": false, "properties": { "code": { "type": "string" }, "detail": { "type": "string" }, "severity": { "type": "string" }, "title": { "type": "string" } }, "required": [ "code", "severity", "title", "detail" ], "type": "object" }, "type": "array" } }, "required": [ "key", "label", "runtime_min", "tts_min", "delta_tts_min", "cns_percent", "tightest_cylinder", "shortfall", "status", "warnings" ], "type": "object" }, "type": "array" }, "settings_table_markdown": { "description": "The Plan settings table (Setting | Value): every key variable the schedule used, \"(default)\" after each Dive Kit default.", "type": "string" }, "share_url": { "type": "string" }, "spoken_summary": { "description": "One paragraph to speak as a dive briefing in a voice conversation: the dive, GF and reserve rule, run time, the stops that matter, gas per key cylinder, every critical issue, an offer to re-run. Units in words, no symbols or notation, at most 700 characters.", "type": "string" }, "stops": { "items": { "additionalProperties": false, "properties": { "depth": { "type": "number" }, "gas": { "type": "string" }, "ppo2": { "type": [ "number", "null" ] }, "run_min": { "type": "number" }, "stop_min": { "type": "number" } }, "required": [ "depth", "stop_min", "run_min", "gas", "ppo2" ], "type": "object" }, "type": "array" }, "summary": { "additionalProperties": false, "properties": { "cns_percent": { "type": "number" }, "deco_time_min": { "type": "number" }, "effective_gf_high": { "type": "number" }, "first_stop_depth": { "type": "number" }, "gas_density_bottom_g_l": { "type": "number" }, "ndl_min_per_level": { "items": { "type": [ "number", "null" ] }, "type": "array" }, "otu": { "type": "number" }, "runtime_min": { "type": "number" }, "tts_min": { "type": "number" } }, "required": [ "runtime_min", "tts_min", "deco_time_min", "first_stop_depth", "cns_percent", "otu", "gas_density_bottom_g_l", "ndl_min_per_level" ], "type": "object" }, "table_markdown": { "type": "string" }, "truncated": { "items": { "type": "string" }, "type": "array" }, "units": { "enum": [ "metric", "imperial" ], "type": "string" }, "warnings": { "description": "Plan warnings, most severe first, including per-level issues (with level_number) not already stated.", "items": { "additionalProperties": false, "properties": { "code": { "type": "string" }, "detail": { "type": "string" }, "level_number": { "description": "1-based level a per-level issue belongs to.", "type": "number" }, "severity": { "type": "string" }, "title": { "type": "string" } }, "required": [ "code", "severity", "title", "detail" ], "type": "object" }, "type": "array" } }, "required": [ "units", "summary", "table_markdown", "stops", "gas", "warnings", "levels", "scenarios", "computed_with", "settings_table_markdown", "presentation", "next_steps", "share_url", "spoken_summary", "engine", "safety_notice" ], "type": "object" } }, { "description": "Decodes a Dive Kit share link (https://divekit.app/share/deco-plan/...) into the plan_dive input it carries: profile, gases, CCR rig, settings, custom contingencies, modifiers and repetitive tissue state, in the requested units. Use this when a diver pastes a Dive Kit link and wants the plan recomputed or changed. Not for links from other apps, and not a schedule: it returns inputs.\n\nResults baked into the link are ignored; plan_dive recomputes them. Links do not carry behavior.stay_on_loop or the loop oxygen-break toggle, so those return as defaults and the result says so.", "inputSchema": { "$schema": "https://json-schema.org/draft/2020-12/schema", "additionalProperties": false, "properties": { "units": { "description": "metric (m, bar, L, °C) or imperial (ft, psi, ft³, °F): the unit system for every value in and out. Default metric.", "enum": [ "metric", "imperial" ], "type": "string" }, "url": { "description": "The full Dive Kit share link, including anything after ?.", "maxLength": 8000, "minLength": 1, "type": "string" } }, "required": [ "url" ], "type": "object" }, "name": "read_share_link", "outputSchema": { "$schema": "https://json-schema.org/draft/2020-12/schema", "additionalProperties": false, "properties": { "app_version": { "description": "Dive Kit version that wrote the link.", "type": "string" }, "has_tissue_state": { "description": "The link carries a repetitive dive's starting tissue loading.", "type": "boolean" }, "notes": { "items": { "type": "string" }, "type": "array" }, "plan_input": { "additionalProperties": false, "description": "The plan_dive input the link carries, in the requested units.", "properties": { "audience": { "description": "Optional: who the answer is for, from the conversation. beginner: new to deco, plain words. recreational (default): some training. technical: trained deco or CCR diver, terms and tables. Shapes the wording only, never a number.", "enum": [ "beginner", "recreational", "technical" ], "type": "string" }, "bailout": { "additionalProperties": false, "description": "ccr only: the bailout view.", "properties": { "depth": { "description": "For on_ascent: depth (m or ft) the diver leaves the loop on the final ascent.", "maximum": 660, "minimum": 0, "type": "number" }, "level_number": { "description": "For after_level: the level (1-based) the diver bails at the end of.", "maximum": 20, "minimum": 1, "type": "integer" }, "run_time_min": { "description": "For at_run_time: minutes on the Run clock.", "maximum": 1000, "minimum": 0, "type": "number" }, "view": { "description": "ccr: which ascent the table shows. loop (default), end_of_profile, after_level, at_run_time, on_ascent. The worst-case bailout check runs on every view.", "enum": [ "loop", "end_of_profile", "after_level", "at_run_time", "on_ascent" ], "type": "string" } }, "type": "object" }, "behavior": { "additionalProperties": false, "description": "Profile and model switches.", "properties": { "include_travel_in_level_time": { "description": "true: level time includes the descent to it (dive-computer runtime style). Default false.", "type": "boolean" }, "o2_narcotic": { "description": "Count oxygen in END. END and warnings only. Default false.", "type": "boolean" }, "stay_on_loop": { "description": "ccr: true (default) keeps the whole ascent on the loop; false lets an OC deco gas take over where its PPO₂ is higher. Not carried in share links.", "type": "boolean" } }, "type": "object" }, "ccr": { "additionalProperties": false, "description": "The rebreather (mode ccr only).", "properties": { "descent_switch_depth": { "description": "Depth (m or ft) where the descent setpoint hands over to bottom, first descent only. Default 18 m (60 ft).", "maximum": 660, "minimum": 0, "type": "number" }, "diluent_breathable_oc": { "description": "true if the BOV or a regulator can breathe the onboard diluent open circuit. It then joins the bailout pool last. Default false.", "type": "boolean" }, "diluent_helium_pct": { "description": "Onboard diluent helium percent. Default 0.", "maximum": 95, "minimum": 0, "type": "number" }, "diluent_oxygen_pct": { "description": "Onboard diluent oxygen percent. Default 21.", "maximum": 100, "minimum": 5, "type": "number" }, "diluent_size": { "description": "Diluent cylinder: litres (metric) or ft³ rated at 3000 psi (imperial). Default 3 L.", "maximum": 400, "minimum": 0, "type": "number" }, "diluent_start_pressure": { "description": "Diluent cylinder fill (bar or psi). Default 232 bar (3365 psi).", "maximum": 7252, "minimum": 0, "type": "number" }, "loop_volume": { "description": "Loop volume, litres in both unit systems, 2 to 15. Default 6.", "maximum": 15, "minimum": 2, "type": "number" }, "o2_size": { "description": "Oxygen cylinder: litres (metric) or ft³ rated at 3000 psi (imperial). Default 3 L.", "maximum": 400, "minimum": 0, "type": "number" }, "o2_start_pressure": { "description": "Oxygen cylinder fill (bar or psi). Default 232 bar (3365 psi).", "maximum": 7252, "minimum": 0, "type": "number" }, "setpoints": { "additionalProperties": false, "description": "Loop setpoints in bar.", "properties": { "bottom": { "description": "Bottom setpoint in bar, the level default. Default 1.0.", "maximum": 1.6, "minimum": 0.4, "type": "number" }, "deco": { "description": "Deco setpoint in bar, used where ccr_deco_schedule has no step. Default 1.4.", "maximum": 1.6, "minimum": 0.4, "type": "number" }, "descent": { "description": "Descent setpoint in bar. Default 0.7.", "maximum": 1.6, "minimum": 0.4, "type": "number" } }, "type": "object" } }, "type": "object" }, "ccr_deco_schedule": { "description": "ccr deco setpoint steps, up to 10. Default [40 m: 1.5, 23 m: 1.6]. Send [] for the single ccr.setpoints.deco.", "items": { "additionalProperties": false, "properties": { "depth": { "description": "Depth (m or ft): the step applies at this depth and shallower.", "maximum": 660, "minimum": 0, "type": "number" }, "setpoint": { "description": "Setpoint in bar.", "maximum": 1.6, "minimum": 0.4, "type": "number" } }, "required": [ "depth", "setpoint" ], "type": "object" }, "maxItems": 10, "type": "array" }, "ccr_dilout_switches": { "description": "ccr: at each depth and shallower, the loop breathes that cylinder as diluent (a dilout). Up to 6. Default none.", "items": { "additionalProperties": false, "properties": { "cylinder": { "description": "Cylinder id breathed as diluent, or \"onboard\" to switch back.", "maxLength": 12, "type": "string" }, "depth": { "description": "Depth (m or ft): the switch applies at this depth and shallower.", "maximum": 660, "minimum": 0, "type": "number" } }, "required": [ "depth", "cylinder" ], "type": "object" }, "maxItems": 6, "type": "array" }, "contingencies": { "description": "Custom contingencies, up to 6, each requested with scenarios \"custom:<name>\" (or \"all\").", "items": { "additionalProperties": false, "properties": { "deco_sac": { "description": "Deco SAC for this contingency only (L/min or ft³/min, per units). Default gas_consumption.deco_sac.", "maximum": 200, "minimum": 0, "type": "number" }, "delay_min": { "description": "A hold at depth before the ascent starts, 0 to 60 minutes. Moves the schedule. Default 0.", "maximum": 60, "minimum": 0, "type": "number" }, "depth_change": { "description": "Depth added to that level (m or ft, per units), -30 to 30 m (-100 to 100 ft). Default 0.", "maximum": 100, "minimum": -100, "type": "number" }, "fails_after_level": { "description": "Level number (1-based) after which the lost cylinders are gone. Omit: they are never carried.", "maximum": 20, "minimum": 1, "type": "integer" }, "level_number": { "description": "Level number (1-based) the depth and time changes apply to. Default the deepest (last on a tie).", "maximum": 20, "minimum": 1, "type": "integer" }, "lost_cylinders": { "description": "Cylinder ids lost in this contingency, comma-separated, e.g. \"s50,o2\". Default none.", "maxLength": 130, "type": "string" }, "name": { "description": "Name of this contingency, 1 to 24 characters. Request it with scenarios \"custom:<name>\". Unique.", "maxLength": 24, "minLength": 1, "type": "string" }, "stress_minutes": { "description": "Minutes the stress_sac burst lasts, 1 to 60.", "maximum": 60, "minimum": 1, "type": "number" }, "stress_sac": { "description": "Hard-breathing surface rate, SAC (L/min or ft³/min, per units), from the end of the bottom (on bailout: from leaving the loop), gas only. Needs stress_minutes or stress_whole_ascent.", "maximum": 200, "minimum": 0, "type": "number" }, "stress_whole_ascent": { "description": "true: the stress_sac burst lasts to the surface. Default false.", "type": "boolean" }, "time_change_min": { "description": "Minutes added to that level, -60 to 60. Default 0.", "maximum": 60, "minimum": -60, "type": "number" }, "working_sac": { "description": "Working SAC for this contingency only (L/min or ft³/min, per units). Default gas_consumption.working_sac.", "maximum": 200, "minimum": 0, "type": "number" } }, "required": [ "name" ], "type": "object" }, "maxItems": 6, "type": "array" }, "cylinders": { "description": "Every open-circuit cylinder carried: back gas, stages, deco gases; on ccr, bailout gases. 1 to 10. Give preset or cylinder_size and start_pressure when known; omitted ones default (an AL80, 11.1 L at 3000 psi) and the result marks them.", "items": { "additionalProperties": false, "properties": { "cylinder_size": { "description": "12 = one 12 L cylinder (metric). 77.4 = an AL80 in ft³ (imperial, with rated_pressure 3000). Metric: water volume of ONE cylinder in litres, the number stamped on the neck, 1 to 25.5. Imperial: rated capacity in ft³ from the spec sheet (an AL80 holds less than its name), 1 to 400. Or pass preset. Default with neither: an AL80 (11.1 L, 77.4 ft³ at 3000 psi).", "maximum": 400, "minimum": 0, "type": "number" }, "exclude_from_deco": { "description": "true keeps this cylinder out of automatic ascent switching (pony, buddy bottle). Still priced; a level can still name it. Default false.", "type": "boolean" }, "helium_pct": { "description": "Helium percent, 0 to 95, oxygen_pct + helium_pct at most 100. Trimix 18/45 is 45. Default 0.", "maximum": 95, "minimum": 0, "type": "number" }, "id": { "description": "Short name used by levels and contingencies, 1 to 12 letters, digits, _ or -, e.g. back, s50, o2. Unique.", "maxLength": 12, "minLength": 1, "type": "string" }, "oxygen_pct": { "description": "Oxygen percent, 5 to 100. Air is 21, EANx50 is 50, trimix 18/45 is 18.", "maximum": 100, "minimum": 5, "type": "number" }, "preset": { "description": "A common cylinder instead of cylinder_size, rated_pressure, twinset and the fill (explicit fields win). al80/s80: aluminium 80, 11.1 L, 3000 psi. al40, al63: aluminium 40/63, 3000 psi. hp80, hp100, hp120: US high-pressure steel, 3442 psi. lp85: US low-pressure steel, 2640 psi. single_10l, single_12l, single_15l: one EU steel cylinder at 232 bar. twin_10l, twin_12l, twin_15l: back-mounted doubles, 232 bar each. stage_11l: aluminium stage (AL80 size), 200 bar. stage_7l: 7 L stage, 200 bar. o2_3l, dil_3l: 3 L rebreather cylinder, 232 bar.", "enum": [ "al80", "al40", "al63", "hp80", "hp100", "hp120", "lp85", "s80", "single_10l", "single_12l", "single_15l", "twin_10l", "twin_12l", "twin_15l", "stage_11l", "stage_7l", "o2_3l", "dil_3l" ], "type": "string" }, "rated_pressure": { "description": "Imperial only: the working pressure the capacity is rated at, psi, 725 to 7252 (3000 for an AL80). Default: the preset's, else 3000. Ignored on metric.", "maximum": 7252, "minimum": 0, "type": "number" }, "reserve_pressure": { "description": "Custom reserve for this cylinder (bar or psi, per units), 5 to 300 bar (50 to 4351 psi). Default: the reserve rule. Moves warnings and find_max_bottom_time, never the stops.", "maximum": 4351, "minimum": 0, "type": "number" }, "start_pressure": { "description": "Pressure in the cylinder at the start of the dive (bar or psi, per units), 0 to 500 bar (0 to 7252 psi). Default: the preset's fill, else 206.84 bar (3000 psi).", "maximum": 7252, "minimum": 0, "type": "number" }, "twinset": { "description": "true for back-mounted doubles or a sidemount pair breathed as one supply: doubles the gas at the same pressure. Default: the preset's, else false.", "type": "boolean" } }, "required": [ "id", "oxygen_pct" ], "type": "object" }, "maxItems": 10, "minItems": 1, "type": "array" }, "descent_gas": { "description": "oc only. Cylinder id of a travel gas for the descent, for a hypoxic bottom mix (e.g. 12/60) that cannot be breathed near the surface. When level 1 is deeper than that gas's MOD, a 0-minute level on it at its MOD (whole m or ft) is added before level 1, and the result numbers that level first. Default none.", "maxLength": 12, "type": "string" }, "environment": { "additionalProperties": false, "description": "Water and altitude.", "properties": { "altitude": { "description": "Surface altitude (m or ft, per units), 0 to 10000 m (0 to 32800 ft). Default 0.", "maximum": 32800, "minimum": 0, "type": "number" }, "temperature": { "description": "Water temperature for gas density only, -2 to 40 °C (28 to 104 °F). Never moves stops. Default 15 °C (59 °F).", "maximum": 104, "minimum": -2, "type": "number" }, "water": { "description": "Water type, from its density: en13319 (EN 13319, the dive computer standard) 10.00 m per bar, salt 9.95, fresh 10.20, red_sea 9.92. Default en13319.", "enum": [ "salt", "fresh", "en13319", "red_sea" ], "type": "string" } }, "type": "object" }, "gas_consumption": { "additionalProperties": false, "description": "Breathing rates.", "properties": { "ccr_metabolic_o2": { "description": "ccr: oxygen the diver metabolises, L/min in both unit systems, 0.4 to 2.0. Default 0.85.", "maximum": 2, "minimum": 0.4, "type": "number" }, "deco_sac": { "description": "SAC from the first stop up (L/min or ft³/min). Default 15 L/min (0.53 ft³/min). Gas figures only.", "maximum": 200, "minimum": 0, "type": "number" }, "working_sac": { "description": "Surface air consumption (SAC, also called RMV) for descent, bottom and the deep ascent (L/min or ft³/min, per units), 1 to 200 L/min (0.05 to 7.1 ft³/min). Default 20 L/min (0.71 ft³/min). Gas figures only.", "maximum": 200, "minimum": 0, "type": "number" } }, "type": "object" }, "gas_switch": { "additionalProperties": false, "description": "Gas switching.", "properties": { "switch_at": { "description": "mod: switch at the deco gas MOD (default). stop: at the next stop.", "enum": [ "mod", "stop" ], "type": "string" }, "switch_time_s": { "description": "Seconds held at each OC switch on the old gas, 0 to 300 in 30 s steps. Default 0.", "maximum": 300, "minimum": 0, "type": "number" }, "when_cylinder_empty": { "description": "show_shortfall (default): stay on it and report how much more gas is needed. switch_gas: move to the richest safe gas left.", "enum": [ "show_shortfall", "switch_gas" ], "type": "string" } }, "type": "object" }, "gradient_factors": { "additionalProperties": false, "description": "Gradient factors. Lower is more conservative. Default 50/80. If high cannot surface the plan, the engine raises it and warns.", "properties": { "high": { "description": "GF high, percent, 10 to 100. Sets the shallow stops and surfacing margin. Default 80.", "maximum": 100, "minimum": 10, "type": "number" }, "low": { "description": "GF low, percent, 10 to 100. Sets the first stop depth. Default 50.", "maximum": 100, "minimum": 10, "type": "number" } }, "type": "object" }, "levels": { "description": "Dive levels in the order dived, 1 to 20. The first is level_number 1.", "items": { "additionalProperties": false, "properties": { "bottom_time_min": { "description": "Minutes at this depth, excluding the descent to it (unless behavior.include_travel_in_level_time is true). 0 to 360. 0 = arrival only: passes through this depth on this gas, used for a no-stop check or a travel-gas leg. Required.", "maximum": 360, "minimum": 0, "type": "number" }, "breathe": { "description": "ccr only. loop (default) or oc: dive this level open circuit on `gas`.", "enum": [ "loop", "oc" ], "type": "string" }, "depth": { "description": "Level depth (m or ft, per units). 1 to 200 m (3 to 650 ft). Required.", "maximum": 700, "minimum": 0, "type": "number" }, "diluent": { "description": "ccr only. \"onboard\" (default) or a cylinder id to breathe through the loop as a dilout on this level.", "maxLength": 12, "type": "string" }, "gas": { "description": "Cylinder id this level breathes, or \"auto\" (default): the richest gas legal at this depth by PPO₂ cap, hypoxic floor and density limit. On ccr, auto means the loop on the onboard diluent.", "maxLength": 12, "type": "string" }, "setpoint": { "description": "ccr only. Loop PPO₂ for this level in bar, 0.4 to 1.6. Default ccr.setpoints.bottom.", "maximum": 1.6, "minimum": 0.4, "type": "number" } }, "required": [ "depth", "bottom_time_min" ], "type": "object" }, "maxItems": 20, "minItems": 1, "type": "array" }, "mode": { "description": "oc (open circuit, default) or ccr (closed-circuit rebreather). Set ccr for every rebreather plan: the ccr, ccr_deco_schedule, ccr_dilout_switches and bailout fields need it. On ccr, `cylinders` are the open-circuit bailout gases; the rig itself is in `ccr`.", "enum": [ "oc", "ccr" ], "type": "string" }, "modifiers": { "additionalProperties": false, "description": "Plan modifiers: a stress breathing burst (gas only) and a delay before the ascent (moves the schedule).", "properties": { "deco_sac": { "description": "Deco SAC override for the whole plan (L/min or ft³/min). Default gas_consumption.deco_sac.", "maximum": 200, "minimum": 0, "type": "number" }, "delay_min": { "description": "A hold at depth before the ascent starts, 0 to 60 minutes. Moves the schedule. Default 0.", "maximum": 60, "minimum": 0, "type": "number" }, "stress_minutes": { "description": "Minutes the stress_sac burst lasts, 1 to 60.", "maximum": 60, "minimum": 1, "type": "number" }, "stress_sac": { "description": "Hard-breathing surface rate, SAC (L/min or ft³/min, per units), from the end of the bottom (on bailout: from leaving the loop), gas only. Needs stress_minutes or stress_whole_ascent.", "maximum": 200, "minimum": 0, "type": "number" }, "stress_whole_ascent": { "description": "true: the stress_sac burst lasts to the surface. Default false.", "type": "boolean" }, "working_sac": { "description": "Working SAC override for the whole plan (L/min or ft³/min). Default gas_consumption.working_sac.", "maximum": 200, "minimum": 0, "type": "number" } }, "type": "object" }, "oxygen_breaks": { "additionalProperties": false, "description": "Oxygen breaks.", "properties": { "apply_on_loop": { "description": "ccr: also break on the loop. Not carried in share links. Default false.", "type": "boolean" }, "break_minutes": { "description": "Break length in minutes, 1 to 10. Default 5.", "maximum": 10, "minimum": 1, "type": "number" }, "enabled": { "description": "Insert oxygen breaks on high-PPO₂ stops. Default false.", "type": "boolean" }, "loop_setpoint": { "description": "ccr: loop setpoint in bar during a break. Default 0.7.", "maximum": 1.6, "minimum": 0.4, "type": "number" }, "min_ppo2": { "description": "PPO₂ in bar at or above which a stop counts toward the break clock, 0.8 to 1.8. Default 1.4.", "maximum": 1.8, "minimum": 0.8, "type": "number" }, "o2_minutes": { "description": "Minutes on high PPO₂ before a break, 5 to 30. Default 20.", "maximum": 30, "minimum": 5, "type": "number" } }, "type": "object" }, "plan_name": { "description": "Short human label shown in the approval card; fill it first, e.g. 40m 20min air+EANx50. Also titles the plan table and share link, which keep its first 24 characters (a longer name is cut, never refused).", "type": "string" }, "ppo2": { "additionalProperties": false, "description": "PPO₂ limits in bar.", "properties": { "max_28_to_44pct_o2": { "description": "PPO₂ cap in bar for gases from 28% to under 45% O₂, 1.0 to 1.6. Default 1.5.", "maximum": 1.6, "minimum": 1, "type": "number" }, "max_45pct_o2_and_up": { "description": "PPO₂ cap in bar for gases of 45% O₂ and over, 1.0 to 1.6. Default 1.6.", "maximum": 1.6, "minimum": 1, "type": "number" }, "max_all": { "description": "One PPO₂ cap in bar for every gas, 1.0 to 1.6 (e.g. 1.4 for recreational nitrox). Sets all three bands; a band field given too wins for its band.", "maximum": 1.6, "minimum": 1, "type": "number" }, "max_under_28pct_o2": { "description": "PPO₂ cap in bar for gases under 28% O₂, 1.0 to 1.6. Sets their MOD and switch depth. Default 1.4.", "maximum": 1.6, "minimum": 1, "type": "number" }, "min": { "description": "Lowest PPO₂ in bar before a hypoxia warning, 0.16 to 0.21. Warnings only. Default 0.18.", "maximum": 0.21, "minimum": 0.16, "type": "number" } }, "type": "object" }, "rates": { "additionalProperties": false, "description": "Ascent and descent rates, per units.", "properties": { "ascent_deep": { "description": "Ascent rate below rate_change_depth (m/min or ft/min), 1 to 100 m/min. Default 9 m/min (30 ft/min).", "maximum": 330, "minimum": 0, "type": "number" }, "ascent_shallow": { "description": "Ascent rate from rate_change_depth to the surface (m/min or ft/min), 1 to 100 m/min. Default 3 m/min (10 ft/min).", "maximum": 330, "minimum": 0, "type": "number" }, "descent": { "description": "Descent rate (m/min or ft/min), 1 to 100 m/min. Default 20 m/min (66 ft/min).", "maximum": 330, "minimum": 0, "type": "number" }, "rate_change_depth": { "description": "Depth where the ascent rate changes (m or ft), 3 to 200 m. Default 6 m (20 ft).", "maximum": 660, "minimum": 0, "type": "number" } }, "type": "object" }, "repetitive": { "additionalProperties": false, "description": "Repetitive dive: the previous dive and the surface interval.", "properties": { "previous_share_url": { "description": "The share link of the previous dive's plan_dive result. Its tissue loading seeds this dive.", "maxLength": 8000, "type": "string" }, "surface_interval_min": { "description": "Surface interval since the previous dive, 15 to 1440 minutes.", "maximum": 1440, "minimum": 15, "type": "number" } }, "required": [ "surface_interval_min" ], "type": "object" }, "reserve": { "additionalProperties": false, "description": "Gas reserve rule. Moves the gas status and warnings, never the stops.", "properties": { "fixed_pressure": { "description": "Reserve for rule fixed (bar or psi, per units). Default 50 bar (725 psi).", "maximum": 7252, "minimum": 0, "type": "number" }, "rule": { "description": "thirds, fourths, fifths, sixths or fixed. Default thirds. Below 50 bar (725 psi) is always critical.", "enum": [ "thirds", "fourths", "fifths", "sixths", "fixed" ], "type": "string" } }, "type": "object" }, "response_format": { "description": "concise: plan table, gas, warnings, scenario summary. detailed: adds every setting used, per-level NDL, full warning details and the bailout table. Default concise.", "enum": [ "concise", "detailed" ], "type": "string" }, "scenarios": { "description": "Which plans to compute, default [\"base\"]. base; deeper_3m, deeper_5m (imperial: deeper_10ft, deeper_20ft), longer_3min, longer_5min, deeper_and_longer_3, deeper_and_longer_5 (applied to the deepest level); lost:<cylinder id> (that cylinder never carried); custom:<name> (defined in contingencies); gf:<low>/<high> (e.g. gf:40/85), last_stop:<depth> (3, 4.5, 6 m or 10, 15, 20 ft) and stop_rounding:<1s|30s|1min> (the base plan with that one setting changed, to compare settings in one call); all (not the variants). Each one returns its own table and a comparison row. Up to 10. Ask for more in a later call.", "items": { "description": "One scenario key.", "maxLength": 40, "type": "string" }, "maxItems": 10, "type": "array" }, "stops": { "additionalProperties": false, "description": "Stop grid and stop-time rounding.", "properties": { "last_stop_depth": { "description": "Final stop depth: 3, 4.5 or 6 m; 10, 15 or 20 ft. Default 6 m (20 ft).", "type": "number" }, "stop_spacing": { "description": "Distance between stops: 3, 6 or 9 m; 10, 20 or 30 ft. Default 3 m (10 ft).", "type": "number" }, "time_rounding": { "description": "1s, 30s or 1min. Applied inside the engine; a stop is never shorter than the obligation. Default 1min.", "enum": [ "1s", "30s", "1min" ], "type": "string" } }, "type": "object" }, "table_columns": { "additionalProperties": false, "description": "Extra table columns. PPO₂ is always shown.", "properties": { "cns": { "description": "Add a running CNS column. Default false.", "type": "boolean" }, "gas_remaining": { "description": "Add a gas-remaining column (bar or psi). Default false.", "type": "boolean" } }, "type": "object" }, "units": { "description": "metric (m, bar, L, L/min, °C) or imperial (ft, psi, ft³, ft³/min, °F). Applies to every input and output value except PPO₂/setpoints (bar), mixes (%), density (g/L). Default metric.", "enum": [ "metric", "imperial" ], "type": "string" }, "warning_thresholds": { "additionalProperties": false, "description": "Warning thresholds. Warnings only, never the stops.", "properties": { "cns_pct": { "description": "CNS percent warning, 50 to 100. Default 80.", "maximum": 100, "minimum": 50, "type": "number" }, "density_critical": { "description": "Gas density critical in g/L, 3 to 8; also vetoes a gas in auto. Default 6.2.", "maximum": 8, "minimum": 3, "type": "number" }, "density_warning": { "description": "Gas density warning in g/L, 3 to 8. Default 5.2.", "maximum": 8, "minimum": 3, "type": "number" }, "end_max": { "description": "Highest END before a warning (m or ft, per units), 20 to 100 m. Default 30 m (100 ft).", "maximum": 330, "minimum": 0, "type": "number" }, "otu": { "description": "OTU warning, 200 to 500. Default 300.", "maximum": 500, "minimum": 200, "type": "number" } }, "type": "object" } }, "required": [ "levels", "cylinders" ], "type": "object" }, "plan_name": { "type": "string" }, "results_summary": { "additionalProperties": false, "description": "Base-plan runtime and TTS baked into the link. Informational: plan_dive recomputes them.", "properties": { "runtime_min": { "type": "number" }, "tts_min": { "type": "number" } }, "required": [ "runtime_min", "tts_min" ], "type": "object" }, "safety_notice": { "type": "string" } }, "required": [ "plan_input", "has_tissue_state", "notes", "safety_notice" ], "type": "object" } }, { "description": "Returns a diver's breathing rate measured from a logged dive: RMV (surface litres a minute, what plan_dive and gas_usage take) and SAC (pressure drop a minute on that cylinder), overall and per segment. Use this when a diver gives start and end pressures and asks their SAC, RMV or breathing rate. Give the cylinder's mix for trimix; air is assumed. Not for planning gas (gas_usage, plan_dive).\n\nEach segment is one stretch on one cylinder: depth, duration_min, start_pressure, end_pressure, the cylinder (preset, cylinder_size, rated_pressure, twinset; default AL80) and its mix (oxygen_pct, helium_pct; default air). RMV uses the same real-gas model as the planners: any RMV plans the same dive back to the measured end pressure in plan_dive, and an air RMV does in gas_usage, which assumes air (a trimix RMV reads about 1 to 2 bar optimistic there). SAC is the gauge drop over time and depth. Segments must not overlap in time; the tool cannot check that. sac is null when the segments used different cylinders, and sac_per_cylinder lists each, with the weighted average depth. plan_dive_gas_consumption.working_sac is ready to paste into plan_dive. water defaults to en13319. No engine call.\n\nExample: {\"segments\":[{\"depth\":20,\"duration_min\":20,\"start_pressure\":200,\"end_pressure\":140,\"preset\":\"single_12l\"}]}", "inputSchema": { "$schema": "https://json-schema.org/draft/2020-12/schema", "additionalProperties": false, "properties": { "segments": { "description": "Stretches of the logged dive, each on one cylinder, not overlapping in time.", "items": { "additionalProperties": false, "properties": { "cylinder_size": { "description": "Metric: water volume of ONE cylinder in litres, the number stamped on the neck. Imperial: rated capacity in ft³ at rated_pressure (an AL80 is 77.4). Default: the preset's, else an AL80 (11.1 L).", "maximum": 400, "minimum": 0.5, "type": "number" }, "depth": { "description": "Average depth of this stretch (m or ft).", "maximum": 1000, "minimum": 0, "type": "number" }, "duration_min": { "description": "Minutes of this stretch, 0.1 to 600.", "maximum": 600, "minimum": 0.1, "type": "number" }, "end_pressure": { "description": "Gauge reading at the end (bar or psi); lower than start_pressure.", "maximum": 7252, "minimum": 0, "type": "number" }, "helium_pct": { "description": "Helium % of the gas in the cylinder. Default 0.", "maximum": 95, "minimum": 0, "type": "number" }, "oxygen_pct": { "description": "Oxygen % of the gas in the cylinder. Default 21 (air). Give it with helium_pct for trimix.", "maximum": 100, "minimum": 5, "type": "number" }, "preset": { "description": "A common cylinder instead of cylinder_size, as in plan_dive: al80, al40, al63, hp80, hp100, hp120, lp85, s80, single_10l, single_12l, single_15l, twin_10l, twin_12l, twin_15l, stage_11l, stage_7l, o2_3l, dil_3l. twin_ presets are a manifolded pair.", "enum": [ "al80", "al40", "al63", "hp80", "hp100", "hp120", "lp85", "s80", "single_10l", "single_12l", "single_15l", "twin_10l", "twin_12l", "twin_15l", "stage_11l", "stage_7l", "o2_3l", "dil_3l" ], "type": "string" }, "rated_pressure": { "description": "Imperial only: the psi the capacity is rated at. Default: the preset's, else 3000. Ignored on metric.", "maximum": 7252, "minimum": 725, "type": "number" }, "start_pressure": { "description": "Gauge reading at the start of the stretch (bar or psi, per units).", "maximum": 7252, "minimum": 1, "type": "number" }, "twinset": { "description": "true for two cylinders on a manifold, filled or breathed together: doubles the volume. Default: the preset's, else false.", "type": "boolean" } }, "required": [ "depth", "duration_min", "start_pressure", "end_pressure" ], "type": "object" }, "maxItems": 12, "minItems": 1, "type": "array" }, "units": { "description": "metric (m, bar, L, °C) or imperial (ft, psi, ft³, °F): the unit system for every value in and out. Default metric.", "enum": [ "metric", "imperial" ], "type": "string" }, "water": { "description": "Water type, from its density: en13319 (EN 13319, the dive computer standard) 10.00 m per bar, salt 9.95, fresh 10.20, red_sea 9.92. Default en13319.", "enum": [ "salt", "fresh", "en13319", "red_sea" ], "type": "string" } }, "required": [ "segments" ], "type": "object" }, "name": "rmv_sac", "outputSchema": { "$schema": "https://json-schema.org/draft/2020-12/schema", "additionalProperties": false, "properties": { "assumptions": { "items": { "type": "string" }, "type": "array" }, "plan_dive_gas_consumption": { "additionalProperties": false, "description": "Ready for plan_dive gas_consumption.", "properties": { "working_sac": { "type": "number" } }, "required": [ "working_sac" ], "type": "object" }, "rmv": { "description": "Surface litres a minute (ft³/min imperial), load-weighted: the figure gas_usage sac and plan_dive working_sac take.", "type": "number" }, "sac": { "description": "Pressure drop a minute (bar/min or psi/min) on the one cylinder every segment used; null when they used different cylinders.", "type": [ "number", "null" ] }, "sac_per_cylinder": { "items": { "additionalProperties": false, "properties": { "cylinder": { "type": "string" }, "rmv": { "type": "number" }, "sac": { "type": "number" } }, "required": [ "cylinder", "rmv", "sac" ], "type": "object" }, "type": "array" }, "safety_notice": { "type": "string" }, "segments": { "items": { "additionalProperties": false, "properties": { "ambient_ata": { "type": "number" }, "depth": { "type": "number" }, "duration_min": { "type": "number" }, "gas_used_volume": { "type": "number" }, "rmv": { "type": "number" }, "sac": { "type": "number" } }, "required": [ "depth", "duration_min", "ambient_ata", "gas_used_volume", "rmv", "sac" ], "type": "object" }, "type": "array" }, "spoken_summary": { "description": "A few plain sentences for a voice reply, ending with an offer: digits allowed, no symbols or notation.", "type": "string" }, "total_gas_volume": { "type": "number" }, "total_time_min": { "type": "number" }, "units": { "description": "metric (m, bar, L, °C) or imperial (ft, psi, ft³, °F): the unit system for every value in and out. Default metric.", "enum": [ "metric", "imperial" ], "type": "string" }, "weighted_avg_ata": { "type": "number" }, "weighted_avg_depth": { "type": "number" } }, "required": [ "units", "rmv", "sac", "sac_per_cylinder", "segments", "total_gas_volume", "total_time_min", "weighted_avg_depth", "weighted_avg_ata", "plan_dive_gas_consumption", "assumptions", "spoken_summary", "safety_notice" ], "type": "object" } } ] }
Verify it yourselfcurl -s https://api.teppi.xyz/v1/evidence/sha256:e6cd09162b38140d1cdf5485e01de54f3430c4bf617982fd8c6019cfe002a904 | sha256sum