Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Pharmacokinetic (PK) analysis of concentration-time data — non-compartmental analysis (NCA) for Cmax, Tmax, AUC (0-t and 0-∞), terminal half-life, clearance (CL), volume of distribution (Vd), MRT, and absolute bioavailability (F). Also one-compartment fitting. Use when you have plasma/serum drug concentrations over time after a dose and need PK parameters, or to compute bioavailability from IV + oral AUCs. NOT for ADMET property prediction from structure (use tooluniverse-admet-prediction).
.claude/skills/tooluniverse-pharmacokinetics/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-12 | ✗→✓ | ▲ Improved | — | — |
| case-22 | ✗→✓ | ▲ Improved | — | — |
| case-13 | ✗→✓ | ▲ Improved | — | — |
| case-11 | ✗→✓ | ▲ Improved | — | — |
| case-15 | ✗→✗ | = Same ✗ | — | — |
Turn a concentration-vs-time profile after a dose into the standard PK parameters, and compute bioavailability from IV + oral data. Non-compartmental analysis (NCA) is the model-independent workhorse used for most PK reporting.
This is measured-data PK. For predicting ADMET properties from a chemical structure, use tooluniverse-admet-prediction.
| Issue | What to do | |---|---| | Units — be consistent | One time unit (h), one concentration unit (mg/L or ng/mL), one dose unit (mg). Pass them as time_unit/conc_unit/dose_unit. CL and Vd come back in derived units (e.g. L/h, L). | | Route matters | Set route to iv or po/oral. CL and Vd are only directly interpretable for IV data; from oral data they are apparent (CL/F, Vd/F) because absorption is incomplete. | | Include t=0 | For IV bolus include the t=0 (back-extrapolated) point; for oral the pre-dose value is usually 0. | | BLQ (below limit of quantification) | Leading BLQs before the first measurable → treat as 0; BLQs in the terminal tail → drop them (don't set to 0, it corrupts the terminal slope). | | Sampling design | You need enough late points to define the terminal phase (≥3 points clearly in the log-linear decline) or the half-life and AUC0-∞ are unreliable. | | Single vs multiple dose | NCA here assumes a single dose. For steady-state, analyze one dosing interval (AUC0-τ) and say so. |
bashtu run NCA_compute_parameters '{ "times":[0,0.5,1,2,4,8,12,24], "concentrations":[0,2.5,4.8,6.1,4.2,2.1,1.0,0.2], "dose":100, "route":"iv", "dose_unit":"mg", "conc_unit":"mg/L", "time_unit":"h"}'
Returns Cmax, Tmax, Clast, Tlast, AUC0_last, AUC0-inf, AUC_extrapolation_pct, lambda_z, t_half, r_squared_terminal_fit, clearance_CL, volume_distribution_Vd, MRT_iv, with a units block. AUC uses the FDA/EMA linear-up / log-down trapezoidal method.
For a CSV profile (with BLQ handling), scripts/nca_from_csv.py computes the same parameters locally.
Other tools:
NCA_fit_one_compartment — fit a 1-compartment model (k, V, CL) when you want a parametric model instead of NCA.NCA_calculate_bioavailability — absolute F from auc_po, dose_po, auc_iv, dose_iv (see Step 4).| Parameter | Meaning | Notes / sanity | |---|---|---| | Cmax / Tmax | Peak concentration & time to peak — absorption rate/extent. | For IV bolus Cmax is at t=0; a later Tmax means absorption (oral) or distribution. | | AUC0-t / AUC0-∞ | Total exposure (area under the curve). The key exposure metric. | AUC0-∞ extrapolates the tail using Clast/lambda_z. | | AUC_extrapolation_pct | % of AUC0-∞ that was extrapolated beyond the last point. | >20% → AUC0-∞ (and anything derived from it) is unreliable; report AUC0-last instead and note insufficient sampling. | | lambda_z / t_half | Terminal elimination rate constant and half-life. | Trust only if r_squared_terminal_fit ≥ ~0.95 and ≥3 terminal points were used. | | CL (clearance) | Volume cleared per time = Dose/AUC0-∞ (IV). | From oral data this is CL/F (apparent). | | Vd | Volume of distribution = CL/lambda_z (IV). | From oral data this is Vd/F (apparent). | | MRT | Mean residence time. | Longer MRT = slower overall elimination. |
F needs the same drug given both IV and orally (ideally same subjects, dose-normalized):
bashtu run NCA_calculate_bioavailability '{"auc_po":35.0,"dose_po":200,"auc_iv":43.4,"dose_iv":100}'
F = (AUC_po / Dose_po) / (AUC_iv / Dose_iv). Report as a fraction or %. F near 1 = well absorbed; low F = poor absorption or high first-pass metabolism. F > 1 signals a data/dosing error (recheck units and doses).
r_squared_terminal_fit < 0.9, or <3 tail points) → half-life is unreliable.units block.NCA_fit_one_compartment or population PK for that.tooluniverse-admet-prediction — predict ADME properties from structure (no measured data).tooluniverse-dose-response — IC50/EC50 potency from concentration-response (not time-course).tooluniverse-statistical-modeling — compare PK parameters across groups.| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-15 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-09 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-21 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-12 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-18 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-02 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-22 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-01 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-13 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-04 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-05 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-08 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-20 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-10 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-07 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-17 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-03 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-11 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-14 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-06 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-16 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-19 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 22 cases were attempted. The headline lift of +18 percentage points is the difference between those two pass rates over the 22 comparable cases.
The per-case answers from this run were removed by the retention sweep, so the case table below shows the verdicts without the text either arm produced. The counts above were recorded at the time and are unaffected. Answers are now kept for 180 days.
Other measured skills in the registry, with their headline benchmark lift.