Skip to content
Secciones de la documentación

Registro de cambios de la API

Cada cambio de la API pública que un cliente podría notar, del más reciente al más antiguo. Cada entrada lleva la fecha en que se anunció aquí; un cambio que rompe la compatibilidad con los clientes existentes se anuncia como muy tarde con la versión que lo introduce y se marca como Incompatible. 29 de las 81 entradas siguientes son incompatibles.

  1. rf-link-budget toma 0,5 dB de pérdida atmosférica cuando se omite atmosphericLoss

    • POST /api/py/v1/calculate
    • POST /api/py/v1/calculate/batch

    Una llamada que omitía atmosphericLoss se calculaba con 0 dB mientras su provenance.inputs informaba del valor predeterminado documentado, 0,5 dB. Ahora se calcula con 0,5 dB, como indican la página de la calculadora y la procedencia, de modo que rxPower, linkMargin y maxRangeKm se desplazan ese medio decibelio en una llamada así. Una llamada que envía la entrada no cambia.

    Todas las demás entradas de todas las calculadoras se comprobaron de la misma manera: si se omiten, o se rechazan (400, sin cobro) o se calculan con su valor predeterminado documentado.

  2. GET /v1/usage puede devolver las llamadas por día

    • GET /api/py/v1/usage

    Pase ?days=N, de 1 a 90, y la respuesta incluye daily: una entrada {date, calls} por cada uno de los últimos N días en UTC, de la más antigua a hoy. Las calls de un día se suman en todas las claves de la cuenta, descontadas las llamadas devueltas, y un día sin ninguna muestra 0. Los días anteriores al 2026-09-24, cuando empezó el recuento por horas, muestran 0.

    Sin days, la respuesta no cambia. Consultar el uso sigue sin contabilizarse nunca.

  3. El número de puertos de una carga Touchstone se lee de sus filas antes que de su nombre

    • rf_cascade
    • sparam_pipeline
    • impedance_match
    • eye_diagram

    Cuando el número de valores de un archivo admite más de un número de puertos, deciden sus filas antes que su extensión: tres puntos de un puerto en un archivo llamado .s2p son un puerto, no un punto de dos puertos, y se informa de un nombre que los datos contradicen (port_count_mismatch en rf_cascade). Una palabra clave [Number of Ports] sigue decidiendo primero.

    El diagrama de ojo ya no falla con un archivo cuya extensión nombra más puertos de los que contienen sus datos.

  4. El Monte Carlo de filtros ejecuta hasta 1000 pruebas gratis y 100.000 en Pro y API, dentro de un presupuesto de trabajo

    • POST /api/py/v1/jobs (filter_monte_carlo)
    • POST /api/py/v1/jobs/estimate
    • GET /api/py/v1/jobs/types
    • MCP simulate_filter_monte_carlo
    • rftools-io SDK

    monteCarloIterations llega a 1000 en el plan Free (antes 500) y a 100.000 en Pro y API (antes 10.000). El tiempo máximo del trabajo es de 180 s (antes 120 s).

    El coste de una ejecución son sus pruebas multiplicadas por las evaluaciones de la red en escalera que necesita cada una, determinadas por sus componentes y por passCriteria. Una ejecución cuya predicción supera el presupuesto de su entorno (120 s en el de pago, 60 s en el gratuito) se rechaza al enviarse y en la estimación con errorKind: "too_large", antes de cobrar nada. El detalle nombra monteCarloIterations y da el coste, el límite y, en allowed.max, el máximo de pruebas que caben. Caben 100.000 pruebas de una escalera de 5 componentes con tres criterios; una escalera de 20 componentes con ocho criterios cabe hasta 53.304.

    La estimación informa de withinBudget, un budget de tipo ladderEvaluations y work como trials y ladderEvaluationsPerTrial, que también registra computeCost.work de un trabajo.

  5. La lista de etapas de una cascada de RF se comprueba al enviarse

    • POST /api/py/v1/jobs
    • POST /api/py/v1/jobs/estimate
    • rf_cascade

    Un stages mal formado (no es JSON, está vacío, una etapa que no es un objeto, un valor que no es un número finito) se rechaza con un 400 que nombra la etapa y la clave, antes de cobrar nada. Antes se aceptaba y luego fallaba como fallo interno (fault).

    Los valores de las etapas están acotados: gain_db ±1000 dB, nf_db de 0 a 1000 dB, iip3_dbm y p1db_dbm ±1000 dBm, y la ganancia de la cadena tras cada etapa dentro de ±1000 dB. NaN, Infinity y true/false se rechazan; los números escritos como texto se siguen leyendo.

    Una clave de etapa que solo difiere de una conocida en mayúsculas y minúsculas (gain_dB, IIP3_dbm, Name) se rechaza, nombrando la etapa y la clave correcta; antes se ignoraba y la etapa se ejecutaba con el valor predeterminado. Cualquier otra clave que una etapa no acepta (notes, part) se ignora con una advertencia unknown_stage_key.

    Una etapa cuyo sparamFile no se cargó con el trabajo se rechaza, en lugar de calcularse con la ganancia escrita.

  6. Sin punto de intercepción, el valor es null, no 99 dBm

    • POST /api/py/v1/jobs
    • rf_cascade

    El IIP3 de una etapa pasiva, y el IIP3, el OIP3, el P1dB y el SFDR de una cadena en la que ninguna etapa los limita, son null (eran 99 dBm y 99 + ganancia). Los percentiles y el histograma Monte Carlo del IIP3 son null en ese caso y el rendimiento del IIP3 es del 100 %.

    Una etapa pasiva ya no añade una intercepción de 99 dBm: un atenuador de 150 dB delante de un amplificador con 0 dBm de IIP3 da ahora 150 dBm, no 99.

  7. Cascada de RF: ruido pasivo desde archivos, signo del Monte Carlo, intercepciones exactas, advertencias

    • rf_cascade

    Una etapa pasiva cuya ganancia procede de un archivo toma su figura de ruido de esa ganancia.

    El Monte Carlo mueve la figura de ruido de una etapa pasiva con su pérdida; el signo estaba invertido.

    El IIP3 y el P1dB de entrada se calculan exactamente por bajos que sean (tres amplificadores de 300 dB: −600 dBm y −610 dBm, que antes daban −270 dBm); un suelo de −270 dBm solo queda como salvaguarda donde la suma detrás de un punto no es un número positivo y finito, algo que los límites de las etapas hacen inalcanzable, así que un P1dB ya no hace fallar el trabajo.

    Advertencias unknown_stage_type, unknown_stage_key y file_not_uploaded.

  8. La adaptación de impedancias ajusta en escala logarítmica y usa la reflexión de onda de potencia en el barrido

    • POST /api/py/v1/jobs
    • impedance_match

    Los componentes E12, E24 y E96 son el valor normalizado más cercano en escala logarítmica, como están espaciadas las series; justo a mitad de camino, el menor. 2,099 nH es ahora 2,2 nH, no 2,0 nH. Donde las dos reglas difieren, pueden cambiar los componentes, la pérdida de retorno y la rama que elige auto.

    |S11|, la trayectoria en la carta de Smith, la pérdida de retorno en el peor caso y el ancho de banda usan la reflexión de onda de potencia (Z − Zs*)/(Z + Zs), como ya hacen los valores en f0. Una fuente real no cambia; una fuente compleja, escrita o leída de un archivo, da un |S11| distinto.

  9. La adaptación de impedancias indica su frecuencia de diseño, el modelo en frecuencia de su carga y sus valores en f0

    • POST /api/py/v1/jobs
    • POST /api/py/v1/jobs/estimate
    • impedance_match

    Cada parámetro nuevo es opcional; una solicitud sin ellos obtiene la respuesta que obtenía antes.

    designFreq (Hz): f0, indicada aparte de freqStart–freqStop y dentro de ese intervalo; si falta, el centro de la banda.

    loadModel: constant (si falta), series_rc o series_rl (ajustados en f0; se rechaza una reactancia de signo incorrecto) o file (los propios puntos de frecuencia de la carga cargada). branchPreference: any, lowpass o highpass, con una advertencia branch_preference_unmet donde no existe esa rama. Se acepta un archivo de carga .s1p.

    Resultados nuevos: designFreqHz, loadModel, unmatchedLoad, performance.ideal y .standard (pérdida de retorno, VSWR, pérdida por desajuste eliminada y el ancho de banda con RL ≥ 10 dB con sus bordes y su fracción de f0, resuelto por bisección), branch y qDefinitions.

  10. El diagrama de ojo acepta una excursión de transmisión, un CTLE y una máscara

    • POST /api/py/v1/jobs (eye_diagram)
    • MCP simulate_eye_diagram

    Cada parámetro nuevo es opcional, y una solicitud sin ellos obtiene la respuesta que obtenía antes.

    launchSwing (mV pico a pico, valor predeterminado 2000, los ±1 V que suponía todo resultado anterior) escala cada tensión; eyeHeightPctOfSwing da la altura del ojo como fracción de ella.

    equalization: ctle aplica el filtro de tiempo continuo del anexo 93A de IEEE 802.3. ctleDcGain (de −12 a 0 dB) fija su ganancia; en blanco se queda con la mejor entre −12 y 0 dB en pasos de 1 dB. ctle informa de la ganancia, el realce en Nyquist, el barrido y el ojo anterior.

    maskType (hexagon o rectangle), maskHalfHeight (mV) y maskWidth (UI) dan mask.pass, margin_mV y las violaciones. samplingPhase (UI después del cruce) y lossFrequency (Hz) añaden sampling y lossAtFrequency.

    Cada resultado lleva channelFile, uiMeasured y traceCount.

  11. La detección radar acepta una semilla aleatoria

    • POST /api/py/v1/jobs (radar_detection)
    • provenance.seed

    randomSeed (un número entero, 0 o mayor) sustituye la semilla fija 42 del Monte Carlo y se registra como provenance.seed, de modo que una ejecución puede repetirse y una variante hipotética reenviarse con los mismos sorteos. Sin ella, todo resultado queda igual.

  12. El Monte Carlo de filtros ejecuta una escalera tal como se construyó, contra los criterios que usted fija, e indica qué tolerancias ajustar

    • POST /api/py/v1/jobs (filter_monte_carlo)
    • MCP simulate_filter_monte_carlo
    • rftools-io SDK

    Cada parámetro nuevo es opcional, y una solicitud sin ellos obtiene la respuesta que obtenía antes, con campos de resultado nuevos al lado.

    parts (de 1 a 20, de la fuente a la carga: ref, kind L o C, position series o shunt, value en H o F, tolerance opcional en %) simula la escalera tal como se da, sin redondeo a E24. passCriteria (de 1 a 8: insertionLoss en fStart–fStop como máximo maxDb, cutoff3dB dentro de fMin–fMax, attenuation en freq o en fStart–fStop al menos minDb) sustituye a rippleSpec_db y rejectionSpec_db. yieldTarget (%, 95 si está en blanco).

    Resultados nuevos: circuit, yieldTarget con un veredicto respecto al intervalo del 95 %, criteria con estadísticas, histogramas y el varianceShare (r²) de cada componente, failingTrials (las 200 primeras), sampleTrials y, con criterios introducidos, whatIfs: los componentes que determinan el criterio más incumplido, con una tolerancia un escalón más estricta, recalculados sobre las mismas pruebas. Reenviar con la randomSeed de la ejecución y esas tolerancias da el mismo rendimiento.

  13. El lazo de control de la fuente conmutada acepta su compensador por componentes, resuelve una frecuencia de cruce y da un veredicto

    • POST /api/py/v1/jobs
    • POST /api/py/v1/jobs/estimate
    • smps_control_loop result

    Cada entrada nueva es opcional, y una solicitud sin ella obtiene la respuesta que obtenía antes.

    compensatorType: type2_ota con compRc, compCc, compChf, compGm y compVref describe un compensador de tipo II de transconductancia por sus componentes, transformado exactamente en K, f_z y f_p. Se rechaza un compVref por encima de Vout.

    solveFor: crossover con targetCrossover (Hz, valor predeterminado Fsw/10), resistorSeries (E96) y capacitorSeries (E12) coloca R_c, C_c y C_hf en modo de corriente de pico e informa de lo que consiguen.

    minPhaseMargin (45°) y minGainMargin (10 dB) fijan el veredicto y el rendimiento del Monte Carlo.

    Resultados nuevos: verdict, polesZeros, nominal.phaseCrossoverHz, nominal.loopGainAt100HzDb, compensatorParts, solve, runSummary y bodeAboveHalfFsw, las respuestas hasta 2·Fsw, donde no se lee ningún margen.

  14. Dieciséis calculadoras de temporización evalúan su temporización frente a un presupuesto

    • POST /api/py/v1/calculate
    • POST /api/py/v1/calculate/{slug}
    • POST /api/py/v1/calculate/batch
    • provenance.validRange

    Cada entrada nueva es opcional, y una solicitud sin ella obtiene la respuesta que obtenía antes, salvo donde las entradas siguientes digan otra cosa.

    uart-baud-rate: oversampling (16 u 8), divisorFraction (0 un divisor entero, 1 una fracción en pasos de 1/oversampling) y errorBudget (%, 2, al que sigue la advertencia de error de baudios); divisorSet, baudError_pct (con signo) y stopSampleOffset_bits.

    can-bus-timing: sjw (tq, 1); bitRateActual, bitRateError_pct, samplePointActual y oscTolerance_pct, la tolerancia de reloj que ISO 11898-1 permite a cada nodo.

    lin-bus-timing: slotTime (ms, 10); frameTimeMax, 1,4 × la trama nominal (LIN 2.x). modbus-frame-timing: charGap (ms, 0), que ahora cuenta en el tiempo de trama; t15, charGapChars y t15Chars.

    spi-timing: riseTime (2,2τ) y edgeShare_pct. i2s-timing: mclk (MHz, 16,9344) y rateBudget (%, 0,1); mclkDivider, bclkActual, sampleRateActual y sampleRateError_pct. pwm-duty-cycle: timerClock (MHz, 16) y requiredBits (8); periodCounts, onCounts, dutyActual, frequencyActual y dutyResolution_bits.

    555-timer: targetTime (ms, 2), errorBudget (%, 5), rTolerance y cTolerance (%, 0); timeMin, timeMax y timingError_pct. rc-time-constant: rTolerance (%, 1), cTolerance (%, 5) y tauBudget (%, 10), con una advertencia por encima; tauMinUs, tauMaxUs y tauErrorPct.

    inductor-energy: requiredTime (µs, 20). battery-charge-time: requiredTime (h, 3). supercapacitor-backup: holdUpTime (s, 60). motor-inrush-current: dipLimit (%, 10). via-step-response: slowdownBudget (%, 10), al que ahora sigue la advertencia de ralentización. Cada uno se rechaza en 0 o por debajo.

    inrush-current-limiter: ntcR25 (Ω, 0 para el valor necesario) y ntcTolerance (%, 20); peakInrushMax. Con ntcR25 fijado, peakInrush, timeConstant y limitingResistor siguen al termistor ajustado. pid-tuning: overshootBudget (%, 25); overshootPct y settlingTime a partir de un escalón simulado en lazo cerrado.

  15. Catorce calculadoras de frecuencia cuentan sus productos dentro de una banda

    • POST /api/py/v1/calculate
    • POST /api/py/v1/calculate/{slug}
    • POST /api/py/v1/calculate/batch
    • provenance.validRange

    Cada entrada nueva es opcional, y una solicitud sin ella obtiene la respuesta que obtenía antes, salvo donde las entradas siguientes digan otra cosa.

    mixer-spur-calculator: rfBandLow/rfBandHigh (MHz, 902/928), ifBandwidth (MHz, 10) y nearMargin (MHz, 50); spursInBand, spursNearBand, nearestSpur, imageFreq, imageToBand y loToBand, a partir de cada entrada de RF que se convierte a la FI, f_RF = (m·f_LO ± f_IF)/n (m el armónico del OL, n el armónico de RF, como en el recuento anterior), m + n hasta maxOrder.

    intermodulation-distortion: bandLow/bandHigh (MHz, 88/108); productsInBand. vibration-phase-noise: offsetBandLow/offsetBandHigh (Hz, 1000/10000); sidebandsInBand. phase-noise-to-jitter: pointsIntegrated.

    ism-coexistence: channelWidth1_MHz/channelWidth2_MHz (20/2); overlappingChannels, con los canales repartidos uniformemente por la banda. channels1 y channels2 están limitados a 100.

    via-stub-resonance: dataRate (Gb/s, 10); nyquistFreq, resonancesInBand y resonancesNearBand. chassis-resonance: bandLow/bandHigh (MHz, 30/1000); f011MHz y modesInBand. room-modes: bandLow/bandHigh (Hz, 20/200); modesInBand, modesNearBand y modalBandwidth.

    sampling-nyquist: harmonicOrder (5); aliasesInBand (el propio tono replegado en la banda de señal), harmonicAliasesInBand (sus armónicos replegados en ella, que importan hasta el SFDR del convertidor) y lowestAliasingInput. fft-bin-resolution: toneFreq (Hz, 1000) y sidebandSpacing (Hz, 100); toneBin, toneLevelError, resolutionBandwidth y sidebandsUnresolved (null para un tono por encima de f_s/2).

    am-modulation-index: channelWidth (kHz, 10); powerInChannel, sidebandsInChannel y sidebandsOutside. fm-modulation-index: channelLow/channelHigh (kHz, 98000/98200); occupiedBandwidth, powerInChannel, sidebandsInChannel y sidebandsOutside (null por encima de β = 1000, con una advertencia).

    oversampling-snr: signalBandwidth (Hz, 24000); modulatorRate, outOfBandNoise y foldBands. digital-filter-order: toneFreq (Hz, 1000) y maxHarmonic (5); harmonicsInPassband, harmonicsInTransition, nearestHarmonic, butterworthAttenuation y chebyshevAttenuation.

  16. can-bus-timing: el preescalador y los cuantos más cercanos a la tasa de bits

    • POST /api/py/v1/calculate
    • POST /api/py/v1/calculate/{slug}
    • POST /api/py/v1/calculate/batch

    De cada bit de 8 a 25 cuantos de tiempo (CAN 2.0), con el preescalador a ambos lados del que pide, el más cercano a la tasa de bits; luego el punto de muestreo más cercano al pedido (CiA 601-3); luego 16 cuantos; luego el preescalador más pequeño. Antes tomaba el preescalador más cercano a 16 cuantos, diera la tasa que diera: 36 MHz a 500 kbps eran 5 × 14 cuantos, un 2,86 % rápido, y ahora son 3 × 24, exacto. prescaler, nominalBitTime, tq y los segmentos cambian donde existe un ajuste exacto o más cercano; todos los valores predeterminados y preajustes quedan igual.

    El punto de muestreo queda como mucho un cuanto antes del final del bit, de modo que los segmentos suman hasta él (8 cuantos al 95 % eran 9).

  17. modbus-frame-timing: temporizadores fijos por encima de 19 200 Bd

    • POST /api/py/v1/calculate
    • POST /api/py/v1/calculate/{slug}
    • POST /api/py/v1/calculate/batch

    Por encima de 19 200 Bd, t35 vale fijo 1,75 ms (Modbus over Serial Line V1.02, sección 2.5.1.1), ya no 3,5 caracteres (0,334 ms a 115 200 Bd 8E1), y maxFrameRate lo sigue; el nuevo t15 vale ahí fijo 750 µs.

  18. intermodulation-distortion: im3High es una magnitud

    • POST /api/py/v1/calculate
    • POST /api/py/v1/calculate/{slug}
    • POST /api/py/v1/calculate/batch

    im3High es |2f₂ − f₁|, como ya lo era im3Low: por debajo de f₂ = f₁/2 era negativo (100 y 40 MHz: −20, ahora 20 MHz).

  19. chassis-resonance: c exacta y el modo (0,1,1)

    • POST /api/py/v1/calculate
    • POST /api/py/v1/calculate/{slug}
    • POST /api/py/v1/calculate/batch

    La velocidad de la luz es exacta, 29 979 245 800 cm/s, no 3 × 10¹⁰: fLowest, f101MHz y f110MHz bajan un 0,07 % (901,39 → 900,76 MHz con los valores predeterminados).

    fLowest incluye (0,1,1), el modo más bajo cuando la longitud es el lado más corto (Pozar, Microwave Engineering, 4.ª ed., sección 6.3): una caja de 10 × 30 × 20 cm daba 1581 MHz y da 900,76 MHz; wavelengthAtResonance lo sigue.

  20. phase-noise-to-jitter: el perfil se integra como leyes de potencia

    • POST /api/py/v1/calculate
    • POST /api/py/v1/calculate/{slug}
    • POST /api/py/v1/calculate/batch

    Con profileMode 1, el perfil se integra como leyes de potencia entre sus puntos, rectas en ejes log-log (Drakhlis, Microwaves & RF, enero de 2001), y la banda termina en el propio nivel del perfil en ese punto. Un trapecio lineal sobrestimaba un perfil descendente, y L₄ se mantenía hasta el final de la banda incluso cuando queda más allá: el perfil predeterminado a 100 MHz daba 0,166 ps y da 0,084 ps. rmsJitter, cycleToCycleJitter, phaseNoisePower, rmsPhaseError y adcSnrLimit cambian en ese modo; el modo de un solo nivel no cambia.

  21. sampling-nyquist: el alias se repliega al múltiplo de f_s más cercano

    • POST /api/py/v1/calculate
    • POST /api/py/v1/calculate/{slug}
    • POST /api/py/v1/calculate/batch

    aliasFreq_Hz es |f − k·f_s| con k el entero más cercano a f/f_s (Kester, MT-002). Era |f_s − f|, correcto solo hasta 1,5·f_s: 10 kHz a 4 kSa/s daban 6000 Hz y dan 2000 Hz.

  22. fm-modulation-index: el ancho de banda de Bessel a partir de las funciones de Bessel

    • POST /api/py/v1/calculate
    • POST /api/py/v1/calculate/{slug}
    • POST /api/py/v1/calculate/batch

    besselBandwidth abarca las bandas laterales por encima del 1 % de la portadora sin modular, 2·n·f_m (Haykin, Communication Systems): era 2(β + 1)·f_m, otra vez la regla de Carson. Con β = 5 era 180 kHz y es 240 kHz. Por encima de β = 1000 es null, con una advertencia.

  23. digital-filter-order: el orden elíptico exacto

    • POST /api/py/v1/calculate
    • POST /api/py/v1/calculate/{slug}
    • POST /api/py/v1/calculate/batch

    ellipticOrder resuelve la ecuación de grado K(k)·K′(k₁)/(K′(k)·K(k₁)), con k = f_p/f_s y k₁ = ε_p/ε_s. Era el orden de Chebyshev dividido entre 1,5, demasiado alto en la mayoría de los diseños y demasiado bajo en algunos: los valores predeterminados necesitan 3, no 4; una transición 2:1 a 1 y 20 dB necesita 3, no 2.

  24. via-stub-resonance: sin stub, sin resonancia

    • POST /api/py/v1/calculate
    • POST /api/py/v1/calculate/{slug}
    • POST /api/py/v1/calculate/batch

    Con la salida en la última capa no hay stub: resonantFreq y backdrillBenefit son null (una resonancia ilimitada), ya no 0.

  25. room-modes e inductor-energy: rechazos que nombran lo que está mal

    • POST /api/py/v1/calculate
    • POST /api/py/v1/calculate/{slug}
    • POST /api/py/v1/calculate/batch

    room-modes rechaza una velocidad del sonido o un tiempo de reverberación de 0 o menos con su propio mensaje, y no devuelve valores junto a un rechazo; antes devolvía ceros y nombraba las dimensiones de la sala.

    inductor-energy rechaza una resistencia en serie de 0 o menos, como el sitio hizo siempre; la API fallaba con ella.

  26. Ocho calculadoras más de convertidores y controladores aceptan un rango de funcionamiento, eligen sus componentes y añaden un modelo de pérdidas

    • POST /api/py/v1/calculate
    • POST /api/py/v1/calculate/{slug}
    • POST /api/py/v1/calculate/batch
    • provenance.validRange

    Como hace buck-converter: cada entrada que varía en servicio es un par <input>Min y <input>Max, donde 0 (el valor predeterminado) significa la entrada nominal. Cada peor caso es una salida, con los valores de entrada en que ocurre como salidas propias (rippleWorstA en rippleWorstVin). Los componentes se eligen iguales o superiores a lo que pide la esquina más desfavorable: un inductor de la serie E12 y una tensión nominal igual al siguiente valor normalizado a partir de 1,5 veces la peor tensión (el interruptor del flyback, a partir de su pico de drenador limitado). Las entradas del modelo de pérdidas tienen valores predeterminados típicos; sus pérdidas se dan en el punto nominal, en W, y se suman a lossTotal. Una solicitud sin las entradas nuevas obtiene la respuesta que obtenía antes, salvo donde las entradas siguientes digan otra cosa.

    boost-converter: inputVoltageMin/inputVoltageMax; coutEach, y rdsOn, tSwitch, qg, vGate, vDiode, qrr, dcr, coreLoss, esrOut del modelo de pérdidas. Entre las salidas nuevas están dutyMin/dutyMax, inductorMinWorstUH e inductorChosenUH, ilPeakWorst, inputCurrentWorst, q1RmsA, coutRmsA, outputRippleMV, vdsRating, ocho pérdidas y efficiencyLossModel; la entrada efficiency sigue fijando las corrientes.

    flyback-converter: vinMin/vinMax, calculados en cada esquina con el transformador nominal; rdsOn, tFall, qg, vGate, vDiode, rPri, rSec, coreLoss, leakageInductance (µH, valor predeterminado 2,6) y clampRatio (valor predeterminado 2, desde 1,1) del modelo de pérdidas, con la pérdida del limitador RCD ½·L_lk·I_pk²·f·k/(k − 1). Entre las salidas nuevas están las corrientes de pico y eficaces de ambos devanados, reflectedVoltage, clampVoltage, vdsPeakWorst, vdsRating, diodeVrWorst, diodeVrRating, siete pérdidas y efficiencyLossModel.

    charge-pump-voltage: inputVoltageMin/inputVoltageMax y pumpCurrentMin/pumpCurrentMax; switchResistance (Ω, valor predeterminado 1) y esr (mΩ, valor predeterminado 10), sumadas a la resistencia de reparto de carga como lo está la R_O de la hoja de datos del ICL7660. Entre las salidas nuevas están loadedVoltageMin/loadedVoltageMax, outputResistance, loadedVoltageWithLosses, los valores nominales de condensadores e interruptores, tres pérdidas y efficiencyLossModel (igual a efficiency con componentes ideales).

    switching-regulator-ripple: outputCurrent (A, valor predeterminado 2), inputVoltageMin/inputVoltageMax, y el modelo de pérdidas del convertidor reductor sobre sus propios componentes (su esr es el del condensador de salida). Entre las salidas nuevas están los rizados y las corrientes eficaces en el peor caso, vdsRating, ocho pérdidas y efficiency.

    mosfet-power-dissipation: drainCurrentMin/drainCurrentMax y tAmbientMin/tAmbientMax (cualquier valor salvo 0, que es el nominal); rdsonTempco (%/°C, valor predeterminado 0), resuelto hasta la unión en forma cerrada, coss (pF, valor predeterminado 0), qg y vGate. Entre las salidas nuevas están junctionTempWorst con su corriente y su temperatura ambiente, totalLossWorst, efficiencyWorst, vdsRating, cuatro pérdidas y efficiencyLossModel.

    h-bridge-selection y motor-driver-power: motorCurrentMin/motorCurrentMax y el rango de la alimentación (motorVoltageMin/motorVoltageMax, supplyVoltageMin/supplyVoltageMax); el tiempo muerto tDead y la vBody del diodo intrínseco (TI SLVA504A) y, en el puente H, dutyCycle (%, valor predeterminado 75), tSwitch, qg y vGate. Entre las salidas nuevas están la peor pérdida del puente, el FET más caliente, vdsRating, las pérdidas y efficiencyLossModel.

    class-d-efficiency: outputPowerMin/outputPowerMax y supplyVoltageMin/supplyVoltageMax; switchingFreq (kHz, valor predeterminado 400), filterCutoff (kHz, valor predeterminado 40), tSwitch, coss, qg, vGate, y la dcr y la coreLoss del inductor del filtro. Entre las salidas nuevas están el filtro de salida (TI SLAA701B) calculado y elegido, cinco pérdidas, loadPower, efficiencyLossModel, la peor eficiencia y la peor pérdida con sus esquinas, headroomWorst (negativo donde el puente no puede dar a la salida la excursión necesaria), las corrientes de rizado y de pico del filtro, y los valores nominales.

  27. boost-converter: el ciclo de trabajo es el de TI SLVA372D

    • POST /api/py/v1/calculate
    • POST /api/py/v1/calculate/{slug}
    • POST /api/py/v1/calculate/batch

    El ciclo de trabajo era 1 − V_in/(V_out·η), de modo que las pérdidas lo acortaban, en contradicción con la propia corriente de entrada de la calculadora. Ahora es la ecuación 1 de TI SLVA372D, D = 1 − V_in·η/V_out. Con los valores predeterminados (5 V a 12 V, 0,5 A, 100 kHz, 88 %), dutyCycle pasa de 52,65 % a 63,33 %, inductorValue de 64,35 µH a 77,41 µH y outputCapacitor de 4,388 µF a 5,278 µF.

    El rechazo y la advertencia se desplazan con él: una entrada entre η·V_out y V_out, antes rechazada, ahora se calcula (solo se rechaza V_out ≤ V_in), y la advertencia del 95 % de ciclo de trabajo aparece en V_in·η/V_out ≤ 0,05.

  28. switching-regulator-ripple: se rechaza una salida igual o superior a la entrada

    • POST /api/py/v1/calculate
    • POST /api/py/v1/calculate/{slug}
    • POST /api/py/v1/calculate/batch

    La calculadora es un reductor. Con outputVoltage igual o superior a inputVoltage devolvía un ciclo de trabajo del 99 % y un rizado negativo; ahora rechaza con «Output voltage must be less than input voltage» y no devuelve valores.

  29. buck-converter: un rango de entrada, los componentes elegidos y sus esfuerzos, y un modelo de pérdidas con la eficiencia

    • POST /api/py/v1/calculate
    • POST /api/py/v1/calculate/{slug}
    • POST /api/py/v1/calculate/batch
    • provenance.validRange

    vinMin y vinMax dan la entrada como un rango (0, el valor predeterminado, es la vin nominal). El inductor se dimensiona donde su rizado es mayor y se elige igual o superior en la serie E12 (inductorMinWorstUH, inductorChosenUH); cada esfuerzo se indica donde es mayor, con la tensión de entrada en que ocurre: rippleWorstA/rippleWorstVin, ilPeakWorst/ilPeakWorstVin, outputRippleMV/outputRippleVin, cinMinWorstUF, cinRmsA, q1RmsA, q2RmsA (cada uno con su …Vin), y dutyMin, dutyMax. El banco de salida son coutCount condensadores de coutEach µF; las tensiones nominales de los componentes son vdsRating, cinVoltageRating, coutVoltageRating (el valor comercial igual o superior a 1,5 veces la tensión).

    Un modelo de pérdidas, con todas las entradas opcionales: rdsOnHigh, rdsOnLow, tSwitch, qg, vGate, tDead, vBody, dcr, coreLoss, esrOut, esrIn. Con la entrada y la carga nominales, las pérdidas son lossDcr, lossCore, lossHsConduction, lossLsConduction, lossHsSwitching, lossGateDrive, lossDeadTime, lossCapEsr y lossTotal (W), con outputPower y efficiency (%). Una solicitud sin las entradas nuevas obtiene las cinco salidas que obtenía antes, salvo cinUF (consulte buck-converter-input-capacitance).

  30. buck-converter: el condensador de entrada se dimensiona para el rizado de la entrada

    • POST /api/py/v1/calculate
    • POST /api/py/v1/calculate/{slug}
    • POST /api/py/v1/calculate/batch

    cinUF dividía entre la tensión de rizado de la salida (deltaVout de vout). Ahora toma el propio rizado de la entrada, la nueva entrada deltaVin (% de vin, valor predeterminado 1), como en la ecuación 12 de TI SLVA477B: C_in = I_out·D·(1 − D)/(f_sw·ΔV_in). Con los valores predeterminados (12 V a 5 V, 1 A, 500 kHz), 9,72 µF pasa a 4,05 µF.

  31. Veintitrés calculadoras más aceptan una serie de componentes e informan del diseño tal como se construye

    • POST /api/py/v1/calculate
    • POST /api/py/v1/calculate/{slug}
    • POST /api/py/v1/calculate/batch
    • provenance.validRange

    eSeries (0 para valores ideales, o 12, 24, 48, 96) redondea cada resistencia, condensador o inductor que la calculadora diseña o lee al valor más cercano de esa serie, y cada salida pasa a ser la del diseño redondeado. Su valor predeterminado deja a una solicitud sin él la respuesta que obtenía antes: 24 en attenuator-designer, led-resistor y zener-diode, cuyas salidas E24 (piR1Nearest a tR2Nearest, rNearest, iActual, pNearest, e24Resistor) ahora lo siguen, y 0 en voltage-divider, opamp-gain, comparator-hysteresis, schmitt-trigger, transistor-switch, current-mirror, crystal-load-capacitance, photodiode-transimpedance, lm317-resistors, rs485-termination, pll-loop-filter, wilkinson-power-divider, rc-snubber, rcd-clamp-snubber, emi-filter-lc, power-supply-ripple-filter, conducted-emissions-filter, differential-mode-filter, speaker-crossover y tweeter-capacitor. Los componentes de directional-coupler son líneas y no lo aceptan.

    Las salidas nuevas describen el diseño redondeado: attenuator-designer piAttenuationBuilt (dB) y piInputImpedanceBuilt (Ω); wilkinson-power-divider isolationBuilt (dB en f₀, null con la resistencia exacta, donde es ilimitado); rcd-clamp-snubber clampVoltageBuilt, rippleVoltageBuilt, clampPowerBuilt y peakDrainVoltageBuilt; pll-loop-filter crossoverBuilt (kHz, el cruce por 0 dB del lazo; pmActual es el margen allí); rs485-termination failsafeVoltage (mV, la tensión A–B del bus en reposo); emi-filter-lc insertionLossBuilt (dB a 10·f_c); conducted-emissions-filter cornerBuilt, attenuationBuilt y outputLevelBuilt; speaker-crossover wooferCutoffBuilt y tweeterCutoffBuilt; tweeter-capacitor crossoverBuilt; zener-diode zenerCurrentBuilt (mA) y zenerPowerBuilt (mW) a plena carga a través de la resistencia elegida, con la corriente negativa donde la resistencia no puede soportar la carga.

    Etiquetas, con las claves sin cambios: las resistencias redondeadas del atenuador se llaman «(rounded)» en lugar de «(E24)»; rNearest «Nearest Series Value», pNearest «Power (series R)», e24Resistor «Nearest Series Resistor»; el error de current-mirror «Output Current Error», el déficit frente a N·I_ref (con una serie incluye el redondeo, y una salida Widlar se resuelve a partir de V_T·ln(I_ref/I) = I·R_E con la R_E redondeada).

    Para que se pueda resolver un componente para una salida objetivo, estas entradas declaran ahora un máximo (un valor por encima se sigue calculando, con la advertencia de la procedencia): comparator-hysteresis r1 y r2 10 000 kΩ; photodiode-transimpedance feedbackResistance 1e7 kΩ y feedbackCapacitance 100 000 pF; differential-mode-filter inductance 100 000 µH y capacitance 1 000 µF; power-supply-ripple-filter inductance 100 000 µH y capacitance 100 000 µF.

  32. schmitt-trigger: umbrales por superposición en la entrada +

    • POST /api/py/v1/calculate
    • POST /api/py/v1/calculate/{slug}
    • POST /api/py/v1/calculate/batch

    La banda era V_cc·R2/(R2 + R3), que omite R1, colocada simétricamente en torno a la tensión del divisor. Los umbrales se obtienen ahora por superposición en el nodo + (TI SNOA997A): V_TH+ = V_cc·R1/(R1 + R2∥R3) y V_TH− = V_cc·(R1∥R3)/(R2 + R1∥R3); centerVoltage es el centro de la banda. Con los valores predeterminados (5 V, 10, 10 y 100 kΩ), vth_high, vth_low e hysteresis pasan de 2,727, 2,273 y 0,4545 V a 2,6190, 2,3810 y 0,2381 V. El circuito es un disparador inversor; la descripción lo llamaba no inversor.

  33. conducted-emissions-filter: L y C se adaptan a la carga

    • POST /api/py/v1/calculate
    • POST /api/py/v1/calculate/{slug}
    • POST /api/py/v1/calculate/batch

    L y C se repartían como √(LC·Z) y √(LC/Z), lo que fijaba √(L/C) en √Z (7,07 Ω sobre 50 Ω; el filtro tenía un pico de 17 dB a 47 kHz desde una fuente de tensión). Ahora son L = Z/ω₀ y C = 1/(ω₀·Z). Con los valores predeterminados (80 dBµV a 150 kHz, 20 dB, 50 Ω), lValue pasa de 23,7 µH a 167,8 µH y cValue de 0,475 µF a 0,0671 µF. La frecuencia de corte, y por tanto la atenuación de 40 dB/década, no cambia.

  34. attenuator-designer, led-resistor, zener-diode: valores E24 por debajo de 10 Ω

    • POST /api/py/v1/calculate
    • POST /api/py/v1/calculate/{slug}
    • POST /api/py/v1/calculate/batch

    Sus búsquedas E24 empezaban en 10 Ω, así que un componente por debajo de 10 Ω se ajustaba a 10 Ω: las resistencias en serie de 2,875 Ω de un atenuador en T de 1 dB y 50 Ω salían de 10 Ω (el atenuador construido daba 1,336 dB y 54 Ω), y una resistencia de LED de 5 Ω, de 10 Ω. Las búsquedas empiezan ahora en 0,10 Ω (3,0 Ω y 5,1 Ω). Por encima de 10 Ω no cambia nada.

  35. pll-loop-filter y class-d-efficiency: un rechazo no devuelve valores

    • POST /api/py/v1/calculate
    • POST /api/py/v1/calculate/{slug}
    • POST /api/py/v1/calculate/batch

    pll-loop-filter (en cada rechazo) y class-d-efficiency (en la API) devolvían ceros junto al error. Ya no devuelven valores, como las demás calculadoras.

  36. filter-designer: la respuesta de la escalera tal como se construye, un desplazamiento exacto del corte y cortes hasta 1 GHz

    • POST /api/py/v1/calculate
    • POST /api/py/v1/calculate/{slug}
    • POST /api/py/v1/calculate/batch
    • provenance.validRange

    Seis salidas nuevas describen la escalera que forman los valores de los componentes, resuelta como una cascada de matrices ABCD entre Z₀ y su carga: loadImpedance (Z₀, o Z₀/g_{N+1} en un Chebyshev de orden par, g_{N+1}·Z₀ en el paso alto), cutoffBuilt_Hz (la frecuencia de −3 dB, paso bajo y paso alto), fLowBuilt_Hz y fHighBuilt_Hz (los bordes de −3 dB de un paso banda), passbandLoss_dB (la peor pérdida hasta 0,8·f_c, por encima de 1,25·f_c o en el 80 % central de una banda) y stopbandBuilt_dB (la pérdida donde el prototipo alcanza el doble de su corte). Con eSeries fijado son las del diseño redondeado; con componentes ideales, la banda de rechazo es igual a attenuation_at_2fc.

    fcShiftPercent era la mitad del mayor error de componente. Ahora indica cuánto desplazó el redondeo la frecuencia de −3 dB de la escalera construida (en un paso banda, el centro de su banda de −3 dB) respecto a la de la escalera ideal: el Butterworth de 5.º orden de 100 MHz con componentes E24 da +0,997 %, donde la estimación daba +1,31 %. Con eSeries 0 es 0, como antes.

    fc acepta hasta 1 GHz (antes se detenía en 10 MHz).

  37. voltage-drop: todos los calibres se calculan, y el aluminio es el de IEC 60889

    • POST /api/py/v1/calculate
    • POST /api/py/v1/calculate/{slug}
    • POST /api/py/v1/calculate/batch

    Un wireGauge que la tabla no recoge (un calibre impar o fraccionario) se calculaba con la resistencia de 12 AWG. Ahora usa la misma fórmula que la tabla, cobre según IEC 60028 (1/58 Ω·mm²/m) sobre la sección del calibre según ASTM B258; los calibres de la tabla no cambian.

    conductorType 1 (aluminio) tomaba 1,61 veces la resistencia del cobre. Ahora toma los 0,028264 Ω·mm²/m de IEC 60889, 1,6393 veces el cobre, de modo que cada caída en aluminio es un 1,8 % mayor: 10 AWG a 15 A en 30 m a 120 V cae un 4,03 %, donde antes indicaba 3,96 %.

  38. coax-loss: atenuación a partir de los datos de los fabricantes; ocho cables más, potencia de entrada y de salida

    • POST /api/py/v1/calculate
    • POST /api/py/v1/calculate/{slug}
    • POST /api/py/v1/calculate/batch
    • provenance.validRange

    La tabla de cables daba unas 1,7 veces los dB/100 ft de las hojas de datos, así que la pérdida de cada cable era demasiado baja. La atenuación por 100 m es ahora k₁√f + k₂f con f en MHz: los coeficientes publicados por Times Microwave (25 °C) para los cables LMR, y un ajuste por mínimos cuadrados a las tablas de Belden y CommScope (20 °C) para los demás. lossPer100m antiguo → nuevo a 100, 435 y 2400 MHz: LMR-400 2,15 → 4,10, 4,62 → 8,74, 11,50 → 21,70; LMR-240 3,60 → 8,05, 7,69 → 17,04, 19,40 → 41,51; LMR-200 4,80 → 10,64, 10,35 → 22,43, 26,00 → 54,18; LMR-100A 10,80 → 23,84, 23,45 → 51,01, 61,00 → 127,68; RG-58/U 10,00 → 12,45, 22,65 → 28,77, 64,00 → 84,61; RG-8X 6,10 → 10,10, 13,50 → 22,74, 38,00 → 63,62; RG-213/U 4,70 → 6,30, 10,35 → 15,21, 28,50 → 48,34; RG-174/U 19,00 → 28,12, 43,33 → 65,75, 120,00 → 197,64; Belden 9913 2,50 → 4,34, 5,42 → 9,23, 13,70 → 22,75; Andrew LDF4-50A 0,70 → 2,17, 1,53 → 4,66, 3,95 → 11,81. attenuation_dB y las fracciones de potencia y tensión lo siguen. Andrew LDF4-50A es el cable de 1/2 in; estaba etiquetado como 7/8 in.

    cableIndex 0–9 conservan sus cables y ahora llega hasta 17: LMR-600, LMR-195, LMR-400-UltraFlex, LMR-400-LLPL (plenum), RG-316, RG-6 (75 Ω), Andrew LDF5-50A (7/8 in) y LMR-900. Nueva entrada opcional inputPower (dBm, valor predeterminado 30); nuevas salidas powerOut_dBm, powerOut_W y lossPerMeter. Una frecuencia por encima del máximo nominal de un cable, más allá del último punto de una tabla ajustada, o por debajo de la frecuencia a partir de la cual un ajuste es válido con un 10 % de precisión, recibe una advertencia, no un rechazo.

  39. Dieciocho calculadoras aceptan listas: etapas, pérdidas, términos, capas, cargas, componentes y superficies

    • POST /api/py/v1/calculate
    • POST /api/py/v1/calculate/{slug}
    • POST /api/py/v1/calculate/batch
    • provenance.validRange

    Cada lista es un recuento y unas entradas indexadas (numLoads con load1Current, load2Current, …), de modo que una solicitud sigue siendo un objeto plano. Cada recuento tiene como valor predeterminado la lista que la calculadora tenía antes, así que una solicitud sin las entradas nuevas obtiene la respuesta que obtenía antes (comprobado con 201 solicitudes por calculadora, rechazos incluidos). Una entrada indexada más allá del recuento se ignora.

    noise-figure-cascade: numStages llega ahora a 10 (llegaba a 4), con stage5Gain, stage5NF, stage5IIP3 hasta stage10IIP3, y un bandwidth opcional (MHz, valor predeterminado 1); salidas nuevas cascadedGain, noiseTemperature (290 K × (F − 1)) y noiseFloor (kT₀B más la figura de ruido en cascada).

    lora-link-budget, ble-link-budget, 5g-nr-link-budget: extraLossCount (0–6) de extraLoss1 a extraLoss6 (dB), y totalLoss. clock-jitter: jitterTerms (0–6) de term{n}Jitter_ps, sumados en cuadratura. emi-margin-budget: marginTerms (0–6) de term{n}Allowance, y totalAllowance. sensor-accuracy-budget: errorTerms (0–6) de term{n}Error, en cuadratura. 4-20ma-transmitter: loopElements (0–6) de element{n}Resistance, y totalLoopResistance.

    heatsink-calculator, heatsink-selection, thermal-resistance-network, junction-temperature: numLayers (0–6) de layer{n}Theta (°C/W), en serie entre el encapsulado y el disipador; las dos calculadoras de disipadores devuelven además thetaJS y heatsinkTemp.

    battery-life: numLoads (0–7) de load{n}Current y load{n}Duty, y selfDischargeCurrent. battery-runtime-motor: motorDuty (%, valor predeterminado 100) y numLoads (0–5) de load{n}Current, load{n}Duty y load{n}Efficiency, y batteryCurrent. solar-panel-sizing: loadHours (h al día, valor predeterminado 24) y numLoads (0–9) de load{n}Power y load{n}Hours.

    gear-ratio: extraStages (0–5) de stage{n}Driver, stage{n}Driven y stage{n}Efficiency, y totalEfficiency. series-parallel-resistor: numParts (1–8, valor predeterminado 4) con r5 a r8, y sumOfValues; r1 puede ser 0, un componente no montado, como ya podían las demás posiciones. rt60-reverberation: numSurfaces (0–8) de surface{n}Area y surface{n}Alpha, y otherArea y meanAbsorption.

  40. Los presupuestos de enlace responden a una distancia de 0 sin pérdida de trayecto

    • POST /api/py/v1/calculate
    • POST /api/py/v1/calculate/{slug}
    • POST /api/py/v1/calculate/batch

    lora-link-budget, ble-link-budget y 5g-nr-link-budget rechazaban una distancia de 0. Ahora la responden con 0 dB de pérdida de trayecto: el enlace sin trayecto, que las páginas usan para mostrar el presupuesto antes del trayecto. Una distancia negativa se sigue rechazando.

  41. clock-jitter: sin presupuesto de temporización restante, la fracción es ilimitada, no 0 %

    • POST /api/py/v1/calculate
    • POST /api/py/v1/calculate/{slug}
    • POST /api/py/v1/calculate/batch

    Cuando los tiempos de setup y hold ocupan todo el período del reloj, budgetUsed_pct era 0, que se lee como ausencia total de jitter. Ahora es null (una fracción ilimitada), con una advertencia de que no queda presupuesto de temporización cuando no hay ninguna violación de setup que informar.

  42. series-parallel-resistor: la relación del divisor usa los dos componentes montados

    • POST /api/py/v1/calculate
    • POST /api/py/v1/calculate/{slug}
    • POST /api/py/v1/calculate/batch

    Con exactamente dos componentes montados, voltDividerRatio era R2/(R1 + R2) fueran cuales fueran, así que valía 0 con R1 y R3 montados. Ahora es el segundo componente montado dividido entre la suma de ambos, lo que no cambia cuando son R1 y R2.

  43. optical-sensor-range: un rechazo no devuelve valores

    • POST /api/py/v1/calculate
    • POST /api/py/v1/calculate/{slug}
    • POST /api/py/v1/calculate/batch

    Un factor de seguridad de 0 o menos se rechazaba con maxRange y normalizedRange a 0 junto al error. El rechazo ya no devuelve valores, como todos los demás rechazos.

  44. broadside-coupled-pair: sin planos no hay impedancia de modo común ni desacoplada ni altura sobre el plano

    • POST /api/py/v1/calculate
    • POST /api/py/v1/calculate/{slug}
    • POST /api/py/v1/calculate/batch

    Un par sin blindaje (shielded 0) no tiene planos de referencia, así que commonImpedance, uncoupledImpedance y heightToPlane no están definidos, como ya decía la advertencia. Valían 0 y ahora son null.

  45. rise-time-bandwidth: sin reloj no hay número de armónico

    • POST /api/py/v1/calculate
    • POST /api/py/v1/calculate/{slug}
    • POST /api/py/v1/calculate/batch

    Con clockFrequency 0, que la entrada permite para prescindir del reloj, harmonicNumber valía 0, un valor que ningún reloj da. Ahora es null, como otras salidas donde un valor no existe.

  46. Trece calculadoras evalúan su resultado frente a una norma publicada

    • POST /api/py/v1/calculate
    • POST /api/py/v1/calculate/{slug}
    • POST /api/py/v1/calculate/batch

    Cada una acepta la norma (y, cuando corresponde, la clase) como entrada opcional, y devuelve el límite, el resultado como porcentaje de él (por encima de 100 no cumple) y el valor de una entrada con el que cumpliría. Los límites se calculan en el propio cálculo, así que la API da el veredicto de la página. Cada entrada nueva es opcional y, con su valor predeterminado, ninguna salida existente cambia, salvo donde una entrada siguiente diga otra cosa.

    power-density: standard (0 FCC 47 CFR §1.1310, 1 ICNIRP 2020), exposureClass, groundReflection; devuelve limitDensity, limitPercent, minDistance, maxEirp. trace-width-current: standard (lee el traceWidth dibujado que la API ya acepta); limitCurrent, limitPercent, minTraceWidth. microvia-current-capacity: standard, conductorClass; limitCurrent, limitPercent, minVias, minViaDiameter. pcb-trace-temp: standard, laminate; chartRise, limitRise, limitPercent, minTraceWidth, maxCurrent.

    minimum-conductor-spacing: conductorSpacing; spacingPercent, maxVoltage (el límite es spacing). padstack-annular-ring: standard, padDiameter, producibilityLevel; minLandDiameter, landPercent, maxDrillDiameter. solder-paste-volume: releaseCriterion; maxStencilThickness, stencilPercent, maxApertureReduction. bga-land-pad: ballType, landDiameter; ipcLand, landDeviation, landTolerance, landPercent, compliantLand.

    i2c-pullup: pullup; riseTime, riseTimePercent, maxBusCap (el límite es riseTimeTarget_ns, el modo es speedMode). usb-termination: impedanceError, impedanceTolerance, impedancePercent, compliantImpedance (la norma es usbVersion). esd-tvs-diode: standard, testLevel, esdRating; testVoltage, limitPercent. esd-clamp-selection: standard, testLevel; testVoltage, limitPercent. radiated-emission-estimate: standard, emissionClass; eFieldUvm, limitField, limitPercent, maxCurrent, maxLoopArea.

    Donde una norma no fija límite (ICNIRP por debajo de 30 MHz, CISPR 32 fuera de 30 MHz–6 GHz, anillos anulares de IPC-6012 clase 2, una separación A6 por encima de 3050 m), las salidas nuevas son NaN, devueltas como null, con una advertencia que explica por qué.

  47. Once calculadoras de líneas de transmisión devuelven la longitud de onda guiada

    • POST /api/py/v1/calculate
    • POST /api/py/v1/calculate/{slug}
    • POST /api/py/v1/calculate/batch

    microstrip-impedance, controlled-impedance, asymmetric-stripline, dual-stripline, differential-pair, edge-coupled-internal-symmetric, edge-coupled-internal-asymmetric, edge-coupled-embedded, broadside-coupled-pair, coplanar-waveguide y coax-impedance aceptan una frequency opcional (GHz, valor predeterminado 2,4) y devuelven guidedWavelength y quarterWavelength (mm), λg = c/(f·√εeff), las líneas acopladas a partir de su εeff de modo impar. Una solicitud sin frequency devuelve todas las salidas existentes sin cambios, más las dos nuevas a 2,4 GHz.

  48. radiated-emission-estimate: el margen sigue la norma y la clase elegidas

    • POST /api/py/v1/calculate
    • POST /api/py/v1/calculate/{slug}
    • POST /api/py/v1/calculate/batch

    margin es el límite de la norma y la clase elegidas a la frecuencia y la distancia de la solicitud, menos el campo: standard 0 es CISPR 32 y 1 es FCC Part 15, sección 15.109, emissionClass 0 es la clase B y 1 la clase A. Una solicitud sin ellos obtiene CISPR 32 clase B, como antes, así que su margen no cambia. Los límites de la FCC se aplican de 30 MHz a 40 GHz, y el margen es null fuera del rango de su norma. La etiqueta de la salida es ahora «Margin to Limit».

  49. minimum-conductor-spacing añade las columnas A6 y A7 de terminales de componentes, y una salida B4

    • POST /api/py/v1/calculate
    • POST /api/py/v1/calculate/{slug}
    • POST /api/py/v1/calculate/batch

    condition 4 es A6 (terminal externo o terminación de componente, sin recubrir, desde el nivel del mar hasta 3050 m) y 5 es A7 (terminal externo o terminación de componente, con recubrimiento conformado), ambas de la tabla 6-1 de IPC-2221B. Por encima de 3050 m, una solicitud A6 devuelve una separación null con una advertencia, ya que la tabla solo da A6 hasta 3050 m. La nueva salida spacingB4 es la columna B4 (conductores externos, recubrimiento polimérico permanente), junto a spacingB1, spacingB2 y spacingB3. Las condiciones 0 a 3 y las salidas existentes no cambian.

  50. bga-land-pad dimensiona el pad según el diámetro de la bola, como hace IPC-7351B

    • POST /api/py/v1/calculate
    • POST /api/py/v1/calculate/{slug}
    • POST /api/py/v1/calculate/batch

    El pad era el diámetro de la bola × 1,0, 0,9 o 0,8 según el nivel de densidad, algo que no da ninguna tabla de IPC. Ahora sigue IPC-7351B: para una bola que colapsa, un 25, 20 o 15 % más pequeño que la bola según su tamaño. Con los valores predeterminados, padDia pasa de 0,55 a 0,45 mm, y las salidas derivadas lo siguen. La entrada densityLevel se retira, ya que IPC-7351B no aplica niveles de densidad a un pad de BGA: una solicitud que la envía se responde, con una advertencia de que el valor no se leyó.

  51. bldc-winding: una bobina abarca al menos una ranura

    • POST /api/py/v1/calculate
    • POST /api/py/v1/calculate/{slug}
    • POST /api/py/v1/calculate/batch

    Cuando el número de ranuras dividido entre el de polos se redondeaba a 0 (6 ranuras con 14 polos, por ejemplo), el paso de bobina era 0, el factor de devanado 0, y actualKv y deltaEquivKv eran null. Una bobina concentrada se devana alrededor de un diente, así que el paso es ahora de al menos una ranura y esas salidas son números.

  52. Los trabajos emi_radiated aplican el límite más estricto en un borde de banda

    • POST /api/py/v1/jobs

    Exactamente a 88, 216 y 960 MHz (FCC Part 15) y a 230 MHz (CISPR 32) se usaba el más laxo de los dos límites contiguos. 47 CFR 15.109(c) establece que en los bordes de banda se aplica el límite más estricto, y CISPR 32 aplica el límite más bajo en una frecuencia de transición; ahora se aplican ambos criterios.

  53. Rangos de entrada en 31 calculadoras

    • POST /api/py/v1/calculate
    • POST /api/py/v1/calculate/{slug}
    • POST /api/py/v1/calculate/batch
    • provenance.validRange

    Las entradas de 30 calculadoras han ganado un máximo, la mayoría de geometría (líneas, pads, antenas, guías de onda), para que la página pueda resolver para ellas, y la capacidad del bus de i2c-pullup llega ahora a 550 pF, el límite de Fast-mode Plus. La API no rechaza un valor fuera del rango de una entrada; provenance.validRange lo indica como fuera.

  54. Doce calculadoras de sensores ganan una etapa de entrada: su tensión, el código del ADC y la resolución

    • POST /api/py/v1/calculate
    • POST /api/py/v1/calculate/{slug}

    ntc-thermistor, rtd-temperature, pt100-resistance, thermocouple-voltage, wheatstone-bridge, strain-gauge-bridge, pressure-bridge-output, load-cell-amplifier, hall-effect-sensor, current-shunt, accelerometer-sensitivity y lvdt-sensitivity aceptan entradas opcionales de la etapa de entrada y devuelven tres salidas nuevas. Las entradas son un divisor (fixedResistor, sensorPosition o ntcPosition) o un amplificador (frontGain), y un ADC (adcRef, adcBits), reutilizando una entrada que la calculadora ya tenía (gain, amplifierGain, adcVoltage, supplyVoltage). Las salidas son la tensión de la etapa de entrada (dividerVoltage o amplifiedVoltage), adcCode (un código unipolar de N bits, mantenido entre 0 y 2^N − 1) y resolution (la magnitud física por paso del ADC en ese punto).

    load-cell-amplifier acepta la carga sobre la célula (appliedLoad) y devuelve su salida (bridgeOutputMv); accelerometer-sensitivity acepta acceleration y devuelve outputVoltage.

    Cada entrada nueva es opcional y, con su valor predeterminado, ninguna salida existente cambia: una solicitud escrita antes de este cambio devuelve los valores que devolvía, más las salidas nuevas.

  55. current-shunt: la ganancia del amplificador tiene como valor predeterminado 20

    • POST /api/py/v1/calculate
    • POST /api/py/v1/calculate/{slug}

    Cuando una solicitud omite amplifierGain, current-shunt usa ahora 20 donde usaba 50. Con los demás valores predeterminados (10 A a través de 10 mΩ, un ADC de 3,3 V), la ganancia 50 ponía 5 V en el ADC, por encima de su referencia. La ganancia 20 da 2 V. amplifiedVoltage y adcResolutionCurrent cambian en esas solicitudes; una solicitud que indica amplifierGain no se ve afectada.

  56. hall-effect-sensor: se rechaza un campo de cero o menos

    • POST /api/py/v1/calculate
    • POST /api/py/v1/calculate/{slug}

    hall-effect-sensor devuelve ahora un error para un Bfield de 0 mT o menos, como ya hacía el sitio, donde la API devolvía valores calculados con él.

  57. frequency-ppm-tolerance: las advertencias citan las tolerancias de reloj aplicables

    • POST /api/py/v1/calculate
    • POST /api/py/v1/calculate/{slug}

    Las advertencias de frequency-ppm-tolerance citaban un presupuesto UART de ±50 ppm (un UART tolera alrededor de un 2 %) y consideraban ±100 ppm demasiado laxo para USB, que permite ±2500 ppm a velocidad completa. Por encima de ±50 ppm, la advertencia cita ahora Ethernet 100BASE-TX y el reloj de radio de Bluetooth LE. Por encima de ±100 ppm cita todos los relojes Ethernet, y por encima de ±500 ppm USB 2.0 de alta velocidad. Los umbrales de 50 y 100 ppm no cambian; el de 500 ppm es nuevo.

  58. Ancho de pista y aumento de temperatura propios de la placa, según el modelo térmico de rftools

    • POST /api/py/v1/calculate (trace-width-current, pcb-trace-temp)
    • POST /api/py/v1/calculate/batch
    • POST /api/py/v1/calculate/solve
    • MCP run_calculation
    • rftools-io SDK

    trace-width-current añade widthBoardMm, el ancho mínimo para esta placa, y pcb-trace-temp añade tempRiseBoard y maxTempBoard, el aumento y la temperatura máxima en ella; ambas añaden inModelRange. Proceden del modelo térmico propio de rftools, nunca etiquetado como IPC-2152: una red térmica de forma cerrada ajustada a un solucionador bidimensional de volúmenes finitos, solo para pruebas, de la pista, el laminado, el plano y el aire en reposo (convección y radiación), comprobado frente a mediciones publicadas (condiciones de IPC-TM-650 2.5.4.1A, los ajustes de Brooks & Adam a las gráficas de IPC-2152 y otros) y que aplica al aumento un margen del 15 % tomado del peor de ellos. Dentro de su rango validado (ancho de pista 0,25–5,1 mm, placa 1,4–3,2 mm, una pista interna desde 1,27 mm de ancho, un aumento de 5–100 °C, un plano a 0,1 mm o más) el ajuste queda dentro del 2,81 % del solucionador.

    Entradas nuevas, añadidas con valores predeterminados para que una solicitud existente calcule igual: boardThickness (mm, valor predeterminado 1,6), planeDistance (mm hasta un plano de cobre, 0 si no hay) y planeCopperWeight (oz, valor predeterminado 0,5) en ambas calculadoras, e isExternal en pcb-trace-temp. Ninguna salida existente cambia. Con los valores predeterminados, widthBoardMm es 0,30212 mm, junto a los 0,78144 mm de Figure 5-1, y tempRiseBoard 10,2818 °C.

    Fuera del rango validado el resultado se sigue indicando, con inModelRange a 0 y una advertencia que nombra el límite; una placa de menos de 1,4 mm remite a Figure 5-1, donde el modelo y los datos de espesor publicados en IPC-2152 discrepan. Una fuga térmica devuelve null para el aumento propio de la placa. provenance.validRange añade models en estas dos calculadoras, cada modelo ajustado con su propio inside: primero el ajuste de IPC-2152 Figure 5-1, luego el modelo térmico, y status es outside si lo es cualquiera de los dos. Una solicitud a estas calculadoras con una corriente, un aumento, un peso de cobre o una longitud de cero o negativos se rechaza en el navegador igual que en la API, y una corriente negativa se rechaza en lugar de responderse con 500.

  59. Se eliminan siete salidas que las calculadoras no podían calcular

    • POST /api/py/v1/calculate (differential-via, usb-termination, parabolic-dish-antenna)
    • POST /api/py/v1/calculate/batch
    • MCP run_calculation
    • rftools-io SDK

    differential-via ya no devuelve diffImpedance, commonImpedance, oddImpedance, evenImpedance ni singleEndedImpedance. Una solución de campo (un solucionador cuasiestático 3D validado con cuatro formas cerradas y contrastado en onda completa con openEMS al 0,4 %) mostró que la impedancia de un par de vías depende de la separación de los planos que atraviesa, que no es una entrada: con los valores predeterminados es de 85,6 Ω con 0,1 mm entre planos y de 96,0 Ω con 1,0 mm, donde la calculadora daba 44,10 Ω. Ninguna relación entre las entradas de la calculadora se acerca al 10 % en todos los casos, y la impedancia de modo común depende además de por dónde circula la corriente de retorno. La resonancia del stub y las pérdidas se siguen devolviendo; consulte la entrada de correcciones.

    usb-termination ya no devuelve eyeOpening, una heurística que ninguna especificación USB define. parabolic-dish-antenna ya no devuelve noiseTemperature, que era 290·(1 − η): la temperatura de ruido de una antena depende de su elevación, de su desbordamiento y del cielo, y la calculadora no recibe ninguno de ellos.

    Un cliente que lea una de estas claves debe dejar de hacerlo: la clave falta, no es null. Todas las demás salidas de las tres calculadoras se siguen devolviendo.

  60. Los valores que no existen faltan o son null, no cero ni un valor centinela

    • POST /api/py/v1/calculate
    • POST /api/py/v1/calculate/batch
    • POST /api/py/v1/calculate/solve
    • MCP run_calculation
    • rftools-io SDK

    Estas salidas son ahora null donde la magnitud no está definida, donde antes eran un número: la signalRiseTime de usb-termination para USB 3.0, que no especifica tiempo de subida del transmisor (USB 2.0 da su mínimo de 500 ps, T_HSR); las salidas de acoplamiento de pcb-crosstalk-emc por encima del límite de acoplamiento débil, (x_C + x_L)/2 = 0,1, donde el modelo concentrado no es válido; vbSealed y f3Sealed de subwoofer-box para Qts ≥ 0,707, donde no existe alineación en caja cerrada (daban 2·Vas); el qFactor de planar-spiral-inductor en la autorresonancia o por encima; la broca y la fresa de cobertura de aperture-diagonal cuando no cabe ninguna herramienta disponible (daban 0); el qFactor de lc-resonance sin resistencia, la Q ilimitada de un circuito sin pérdidas (daba 9999, y el ancho de banda f₀/9999; el ancho de banda es ahora 0); y la stubResonance de differential-via cuando no hay stub (daba 0 GHz). Cada null llega con una advertencia que explica por qué.

    Una entrada rechazada ya no devuelve valores, solo su error, donde estas calculadoras devolvían ceros o valores parciales: power-density, thermal-via-array, bga-breakout-width sin canal, dual-stripline con h₂ ≤ 0, fresnel-zone, y todos los rechazos de doppler-shift, reactance-calculator, broadside-coupled-pair, fusing-current, rise-time-bandwidth, current-divider, delta-wye-conversion, voltage-drop, rt60-reverberation y vfd-motor-speed. Un cero junto a un error se leía como un resultado.

    Un cliente que trataba estos valores como números debe comprobar si son null, o si falta la clave junto a un error. /calculate/solve ya omite los puntos sin la salida.

  61. Calculadoras corregidas según sus referencias, con tres entradas nuevas y salidas nuevas

    • POST /api/py/v1/calculate
    • POST /api/py/v1/calculate/batch
    • POST /api/py/v1/calculate/solve
    • POST /api/py/v1/jobs (emi_radiated)
    • MCP run_calculation
    • MCP simulate_emi_radiated
    • rftools-io SDK

    Constantes. La resistividad del cobre es en todas partes la de IEC 60028, 1/58 Ω·mm²/m (trace-resistance 100,217 → 100,458 mΩ con sus valores predeterminados; las demás calculadoras de cobre se desplazan un 0,008 %, la profundidad de penetración un 0,004 %). El motor de microstrip usa η₀/2π donde usaba 60, y la velocidad exacta de la luz, de modo que toda impedancia basada en microstrip se desplaza un −0,069 % (microstrip-impedance 80,954 → 80,898 Ω, differential-pair 99,983 → 99,914 Ω, y con ellas los anchos resueltos). Todas las calculadoras comparten ahora un mismo η₀ = µ₀·c (CODATA 2018). La impedancia de onda de power-density es µ₀·c, 376,730 Ω (era 120π). El retardo de controlled-impedance es √εeff/0,299792458 ps/mm (6,52995 → 6,53447). El trabajo emi_radiated usa π·µ₀/c y µ₀ para sus campos, así que ahora coincide con radiated-emission-estimate (daba 0,021 dB y 0,023 dB de más).

    Modelos. planar-spiral-inductor toma los parásitos de Jow & Ghovanloo y la longitud de pista de su forma: autorresonancia 68,0 → 601,7 MHz y Q a 100 MHz 814,5 → 116,8 con los valores predeterminados, con la nueva entrada opcional frequency (MHz, valor predeterminado 100) para Q. pcb-crosstalk-emc es el modelo de dos extremos de Paul: las claves existentes son por extremo (la mitad de las cifras antiguas), farEndCrosstalk es nueva y los valores predeterminados son un reloj de 3,3 V y 25 MHz. subwoofer-box sintoniza el puerto según Margolis & Small (20,246 → 40,273 Hz) y añade f3Vented. pcb-crosstalk funciona con el motor de microstrip acoplado, con la nueva entrada dielectricConst (valor predeterminado 4,5; acoplamiento 6,77 → 5,72 %). La resistencia de borde de patch-antenna es el modelo de ranuras radiantes de Balanis con el η₀ exacto, sin recortar (306,80 → 321,22 Ω; la resistencia de alimentación y la inserción de 50 Ω lo siguen). lc-resonance toma su resistencia en serie como pérdida en serie en ambas topologías, Q = Z₀/R (el modo paralelo calculaba R/Z₀), y añade impedanceAtResonance_ohm: R en serie, L/(C·R) en paralelo. La resonancia del stub de differential-via se etiqueta como cota superior sin carga, y su pérdida en el conductor es la cota superior para planos densos (0,030 → 0,011 dB).

    Reglas. Una matriz de microvías se dimensiona por su sección sumada, nota 5 de IPC-2221 (diez vías 2,762 → 1,466 A). El autocalentamiento de una vía es el máximo del barril, P·L/(8kAN), en via-voltage-drop (0,2506 → 0,0313 °C) y microvia-current-capacity. bga-breakout-width cuenta la fila exterior (escapeRows 1 → 2). padstack-annular-ring evalúa la relación de aspecto según la tabla 9-4 de IPC-2222, 8:1 en todas las clases, con una comprobación de taladro mínimo según la tabla 9-6, y el anillo interno de la clase 3 es de 0,025 mm. thermal-via-array cuenta vías enteras. i2c-pullup y rs485-termination devuelven sus resistencias sin redondear (la presentación sigue redondeando). aperture-diagonal acepta la nueva entrada routerBit.

    Una solicitud que omite una de las entradas nuevas obtiene su valor predeterminado.

  62. Se eliminan cuatro salidas que tenían un solo valor con cualquier entrada

    • POST /api/py/v1/calculate (balun-transformer, opamp-bandwidth, capacitor-code)
    • POST /api/py/v1/calculate/batch
    • MCP run_calculation
    • rftools-io SDK

    Cada una de estas salidas devolvía el mismo valor fueran cuales fueran las entradas, y ninguna era un resultado: vswr (1,0, «VSWR (ideal)») e insertionLoss (0,3 dB, «Typical Insertion Loss») de balun-transformer; slewLimited de opamp-bandwidth (0, un marcador para una comprobación que necesita entradas de velocidad de subida y amplitud que la calculadora no tiene); y voltageCode de capacitor-code (0 V, una tensión nominal que un código de 3 dígitos no codifica). Ya no se devuelven, ni siquiera junto a un rechazo.

    Un cliente que lea una de estas claves debe dejar de hacerlo: la clave falta, no es null. Lo que representaba cada valor se indica ahora en provenance.assumptions: ideal-transformer en balun-transformer (adaptado por construcción; las pérdidas del núcleo y de los devanados no se modelan, y un balun de ferrita suele perder entre 0,1 y 1 dB) y capacitance-only en capacitor-code. Todas las demás salidas de las tres calculadoras no cambian.

  63. La ganancia de loop-antenna incluye su eficiencia de radiación

    • POST /api/py/v1/calculate (loop-antenna, capacitor-code)
    • POST /api/py/v1/calculate/batch
    • POST /api/py/v1/calculate/solve
    • MCP run_calculation
    • rftools-io SDK

    La gain de loop-antenna era de 1,76 dBi con cualquier entrada: la directividad de un lazo pequeño, 3/2, sin ninguna de sus pérdidas. Ahora es esa directividad multiplicada por la eficiencia de radiación e = R_rad/(R_rad + R_loss), a partir de las dos resistencias que la calculadora ya devuelve: G = 10·log₁₀(1,5·e) (Balanis, Antenna Theory, 4.ª ed., capítulo 2 y sección 5.2). Con los valores predeterminados, un lazo de 1 m de cobre de 10 mm a 7 MHz, da −9,4043 dBi, 11,2 dB por debajo de la cifra antigua; un lazo cuya pérdida es pequeña frente a su resistencia de radiación sigue dando cerca de 1,76 dBi. La eficiencia es la nueva salida radiationEfficiency (%), 7,6467 % con los valores predeterminados.

    capacitor-code en la API redondeaba un código fraccionario al par más cercano donde la página redondea hacia arriba, de modo que 104,5 se decodificaba como 100 nF en la API y como 1 µF en la página. Ambas dan ahora 1 µF.

  64. Ocho entradas que no cambiaban ningún resultado ahora fijan uno; once salidas nuevas

    • POST /api/py/v1/calculate
    • POST /api/py/v1/calculate/batch
    • POST /api/py/v1/calculate/solve
    • MCP run_calculation
    • rftools-io SDK

    Cada entrada de las siguientes estaba declarada y ninguna salida la leía. Ahora fija una salida nueva, añadida tras las existentes y calculada a partir de una relación que la calculadora ya establece; ninguna salida existente cambia con ninguna entrada. patch-antenna: feedOffset fija feedResistance_ohm, R_edge·cos²(π·y₀/L) (Balanis, Antenna Theory, 4.ª ed., sección 14.2.1, ec. 14-20a), 306,795 Ω con la alimentación en el borde predeterminada y 65,501 Ω a 10 mm, e insetFeedPosition_mm es la inserción que da 50 Ω, 10,594 mm. flyback-converter: fsw fija primaryInductance (µH), Vin·D/(fsw·Ipk) para la propia corriente de pico en conducción crítica de la calculadora, 130,56 µH. solar-panel-sizing: batteryCapacity fija batteryAutonomyDays, C·V·0,5/(P·24 h) con la profundidad de descarga del 50 % que supone la capacidad requerida, 0,25 días. rs485-termination: baudRate fija baudRateUtilisation (%), la tasa como fracción del máximo de 10⁸ bit·m, 11,52 %. adc-snr: samplingFreq fija nyquistZone, ⌊f_in/(f_s/2)⌋ + 1, y aliasFrequency (MHz), |f_in − f_s·round(f_in/f_s)| (Kester, Analog Devices MT-002): zona 1 y 1 MHz con los valores predeterminados, zona 2 y 30 MHz para 70 MHz a 100 MSPS. bldc-thermal: continuousCurrent fija ratedCurrentShare (%), la corriente de funcionamiento frente a la nominal, 75 %. bldc-winding: supplyVoltage fija noLoadSpeed (rpm), Kv·V, 11.406,44 rpm. Las cifras corresponden a los valores predeterminados de cada calculadora.

    Otras dos salidas nuevas: assumedBoomLength (m) en yagi-antenna, el boom que implica su separación de elementos de 0,2λ, (N − 1)·0,2λ, 1,6655 m con los valores predeterminados, que sustituye a su entrada retirada de longitud del boom (consulte esa entrada); y radiationEfficiency (%) en loop-antenna (consulte la entrada de su ganancia). Solo en el sitio, el widget normativo en vivo de ism-coexistence muestra ahora la banda que selecciona su bandIndex; su resultado no cambia.

    Una solicitud que omite una de estas entradas obtiene su valor predeterminado. patch-antenna sin feedOffset y solar-panel-sizing sin batteryCapacity se respondían hasta ahora con 400; ambas se responden.

  65. Se retiran doce entradas que nunca cambiaron un resultado; una solicitud que envía una recibe una advertencia

    • POST /api/py/v1/calculate
    • POST /api/py/v1/calculate/batch
    • POST /api/py/v1/calculate/solve
    • MCP run_calculation
    • MCP get_calculator_schema
    • rftools-io SDK

    Estas entradas estaban declaradas, pero ningún valor suyo cambiaba ninguna salida, advertencia ni rechazo: smith-chart frequency, via-calculator signalLayer, stackup-builder layerCount (el modelo es un apilamiento fijo de cuatro capas, como ahora dice su título), i2c-pullup numDevices, fm-modulation-index carrierFreq, quantization-noise frequency, 555-timer vcc, bldc-efficiency polePairs, opamp-bandwidth phase_margin, battery-internal-resistance temperature, rs485-termination numNodes y yagi-antenna boomLength. Salen del catálogo, de los límites de la procedencia y del esquema MCP; cada calculadora las enumera en retiredInputs, con la fecha.

    Una solicitud que todavía envía una se responde con los mismos valores que antes y la advertencia existente «Input '<key>' is not read by this calculator and was ignored.». Nunca se rechaza. POST /calculate/solve se niega a resolver para una de ellas, como para cualquier entrada no declarada; ninguna rejilla de ella podría haber movido una salida. Una solicitud a yagi-antenna sin boomLength, respondida hasta ahora con 400, se responde.

    La próxima versión de rftools-io conserva cada palabra clave retirada: pasar una lanza una DeprecationWarning que nombra la clave y su fecha de retirada, y la clave no se envía.

  66. trace-width-current lee su ancho IPC-2152 en IPC-2152 Figure 5-1; pcb-trace-temp informa del aumento según IPC-2152

    • POST /api/py/v1/calculate
    • POST /api/py/v1/calculate/batch
    • POST /api/py/v1/calculate/solve
    • MCP run_calculation
    • rftools-io SDK

    El width2152mm de trace-width-current, etiquetado como IPC-2152, era el ancho de IPC-2221 × 0,75 en una capa externa y × 0,85 en una interna, un factor que IPC-2152 no contiene y más estrecho que cualquier lectura de IPC-2152 a partir de 2 A. Ahora es IPC-2152 (2009) Figure 5-1, la gráfica que IPC-2152 recomienda para conductores internos y externos en todos los entornos, mediante el ajuste publicado I = 0,024·ΔT^0,44·A^0,725, igual en ambas capas: 0,7814 mm con los valores predeterminados, antes 0,2266 mm; a 5 A, con un aumento de 10 °C y 1 oz en una capa exterior, 7,194 mm, antes 2,086 mm. Reproduce las lecturas de Olson (2010) en Figure 5-1 de 300 y 680 sq mil con un margen del 5 %. La clave no cambia; su etiqueta es ahora «Min Width (IPC-2152 Fig. 5-1)».

    Ambas calculadoras toman el cobre como 35 µm por onza, de modo que width2221mm se desplaza un −0,58 % (0,3004 mm con los valores predeterminados, antes 0,3021 mm). resistance, voltageDrop y powerDiss de trace-width-current se calculan para una entrada nueva, el ancho de pista dibujado, donde usaban el mínimo de IPC-2221, con el cobre según IEC 60028 de 1/58 Ω·mm²/m: 0,10433 Ω con los valores predeterminados, antes 0,17326 Ω.

    Nueva entrada opcional, añadida; una solicitud que la omite obtiene su valor predeterminado: traceWidth en trace-width-current (mm, 0,5). Salidas nuevas: inChartRange en ambas calculadoras (1 dentro del rango que dibuja IPC-2152 Figure 5-1, 0 fuera, trasladado a provenance.validRange con el peor residuo del ajuste), y tempRise2152 y maxTemp2152 en pcb-trace-temp, el aumento según Figure 5-1 (k = 0,024, cualquier capa) junto al aumento externo de IPC-2221: 25,815 °C con los valores predeterminados, junto a 5,342 °C. Las salidas existentes de pcb-trace-temp conservan sus claves y valores.

    Los resultados fuera de las gráficas se indican y se marcan, nunca se rechazan: una advertencia nombra la magnitud y el límite de la gráfica, para las curvas de 10 a 45 °C y 700 sq mil de Figure 5-1, los 10 a 100 °C y 700 sq mil de la gráfica A de IPC-2221 en una capa exterior, y los ½ a 3 oz de la gráfica B; más allá de Figure 5-1, provenance.validRange.status es outside.

    Citas: trace-width-current, pcb-trace-temp, microvia-current-capacity y via-calculator citaban IPC-2221B para la gráfica de corriente, que esa edición (2012) no contiene. Ahora citan IPC-2221A (2003) Figure 6-4, la gráfica de IPC-2221 (1998), e IPC-2152 (2009) Figure 5-1; ningún valor de las dos últimas cambia.

  67. Doce calculadoras usan el modelo que describen su página y su referencia

    • POST /api/py/v1/calculate
    • POST /api/py/v1/calculate/batch
    • POST /api/py/v1/calculate/solve
    • MCP run_calculation
    • rftools-io SDK

    Cada calculadora de las siguientes calculaba un modelo que se quedaba corto respecto a lo que describen su página y su referencia, igual en el navegador, en la API y en el servidor MCP. Cada una calcula ahora el modelo publicado y se prueba frente a un caso publicado, y la comprobación de paridad mantiene el navegador y la API en las mismas cifras. Los cálculos guardados almacenan entradas, así que se recalculan. bldc-winding, parte del mismo cambio, tiene su propia entrada del 2026-10-11.

    Los valores cambian en: cable-shield-effectiveness (impedancia de transferencia R_T + jωM_T y eficacia de blindaje frente a la impedancia de la línea, Hähner & Mund 1998: 64,95 dB con los valores predeterminados, antes 30,97 dB frente a 1 Ω, sin suelo en 0 dB), ferrite-bead (R_DC + (R_AC ∥ L ∥ C) de Analog Devices AN-1368, anclada a la impedancia introducida a 100 MHz, y la pérdida de inserción compleja entre fuente y carga: la ferrita predeterminada de 600 Ω da 94,9 Ω a 1 GHz, antes 1897 Ω), mosfet-operating-point (el punto de funcionamiento sobre la recta de carga del drenador, Sedra & Smith 7e sección 5.3; consulte la entrada incompatible siguiente), bldc-motor (el empuje a la velocidad en que se equilibran los pares del motor y de la hélice, Drela 2007, con C_P 0,047: 140,91 g con los valores predeterminados, antes 80,43 g a un 75 % fijo de la velocidad en vacío), ethernet-cable (pérdida de inserción del cable según ANSI/TIA-568-C.2 a la frecuencia de señalización de cada PHY, 31,25, 62,5 o 400 MHz: 7,69 dB con los valores predeterminados, antes 16,5 dB; la categoría 8 es un canal de 30 m a cualquier velocidad), radar-range-equation (el alcance con la SNR que exige la ecuación de Albersheim para P_d y P_fa: 35,23 km con los valores predeterminados, antes 74,96 km con SNR = 1, y snrAtMaxRange informa de esa SNR, donde valía 0), bldc-efficiency (pérdida en el cobre I²·R con la resistencia entre terminales, Drela 2007 y el maxon Formulae Handbook: 4,500 W con los valores predeterminados, antes 6,750 W), bldc-thermal (la resistencia del devanado a la temperatura que alcanza, maxon Formulae Handbook sección 9.2, con la misma pérdida en el cobre: 207,61 °C con los valores predeterminados, antes 184,47 °C; consulte la entrada incompatible siguiente), class-d-efficiency (conducción a través de los FET que llevan la carga a la vez, I²·R_DS(on)·N/2: 0,625 W con los valores predeterminados, antes 1,250 W), motor-driver-power (dos FET en conducción y uno en conmutación dura, TI SLVA504A: un puente de 0,1440 W con los valores predeterminados, antes 0,2088 W), y coax-impedance y via-calculator (Z₀ a partir de η₀/2π = 59,9585 Ω con las constantes de CODATA 2018, donde usaban 60: 47,990 Ω y 35,2243 Ω con los valores predeterminados, antes 48,023 Ω y 35,2487 Ω).

    Entradas opcionales nuevas, añadidas; una solicitud que omite una obtiene su valor predeterminado: transferInductance (nH/m, 0,159155, que reproduce la impedancia de transferencia anterior con 10 mΩ/m) y lineImpedance (Ω, 50) en cable-shield-effectiveness; beadInductance (µH, 1,208), parasiticCapacitance (pF, 1,678) y sourceImpedance (Ω, 0) en ferrite-bead; biasMode (0 resuelve la recta de carga, 1 toma V_DS tal como se introduce; valor predeterminado 0) en mosfet-operating-point; pd (0,9), pfa (1×10⁻⁶) y pulses (1, integrados de forma no coherente) en radar-range-equation; transitionTime (ns, 50) en motor-driver-power.

    Salidas nuevas: vdsOperating en mosfet-operating-point, loadedRpm y loadedCurrent en bldc-motor, y gateDriveLoss (2·Q_g·V·f, disipada en el controlador de puerta) en motor-driver-power.

    Claves conservadas, con significados que ahora coinciden con sus etiquetas: el conductionLoss de motor-driver-power es la pérdida de una posición en conducción (I²·R), switchingLoss la del único FET en conmutación dura, totalLossPerFet el FET más caliente, y efficiency se toma frente a V·I·D e incluye la excitación de puerta. La entrada phaseResistance de bldc-efficiency y bldc-thermal se etiqueta como la resistencia entre terminales, medida entre dos bornes, que es lo que siempre fue.

    La pérdida de inserción de la categoría 8 usa los coeficientes provisionales que el modelo de canal de IEEE 802.3bq cita para la categoría 8 de TIA (borrador d0.7: 1,8·√f + 0,005·f + 0,25/√f dB por 100 m), y cada resultado de la categoría 8 lo indica, ya que no se dispone de la tabla publicada de TIA-568.2-D.

    Rechazos y advertencias nuevos: ferrite-bead rechaza una impedancia a 100 MHz que sus L y C no pueden alcanzar, indicando la mayor posible; radar-range-equation rechaza una P_d que ningún detector alcanza con esa P_fa y advierte fuera del rango declarado por Albersheim; cable-shield-effectiveness advierte cuando el cable mide más de un sexto de longitud de onda o el acoplamiento deja de ser débil; ethernet-cable advierte cuando una categoría se evalúa más allá de la frecuencia para la que está especificada.

  68. mosfet-operating-point resuelve la recta de carga por defecto; bldc-thermal devuelve null donde el devanado entra en fuga térmica

    • POST /api/py/v1/calculate (mosfet-operating-point, bldc-thermal)
    • POST /api/py/v1/calculate/batch
    • POST /api/py/v1/calculate/solve
    • MCP run_calculation
    • rftools-io SDK

    mosfet-operating-point resuelve ahora por defecto la ley cuadrática junto con la recta de carga del drenador V_DS = V_DD − I_D·R_D (Sedra & Smith, Microelectronic Circuits, 7.ª ed., sección 5.3, ejemplo 5.5), de modo que vdd y rdLoad fijan el punto de funcionamiento y un vds introducido ya no lo hace. Con los valores predeterminados da 11,96 mA en la región de tríodo con V_DS de 0,0401 V, donde daba 450 mA, que la carga de 1 kΩ no puede dejar pasar desde 12 V. Un cliente que dependa del vds introducido debe enviar biasMode: 1, que conserva el cálculo anterior y advierte cuando V_DS + I_D·R_D se aleja más de un 1 % de V_DD. La nueva salida vdsOperating da la V_DS del punto de funcionamiento en cualquiera de los dos modos.

    bldc-thermal incluye ahora el aumento de la resistencia del devanado con la temperatura (maxon Formulae Handbook, 2012, sección 9.2). Donde α·Rθ·R₂₅·I² ≥ 1 no hay estado estacionario: la pérdida en el cobre crece con la temperatura más deprisa de lo que la evacúa el camino térmico. Ahí tempRise, steadyStateTemp, thermalMargin y hotResistance son null, con una advertencia que indica la corriente por debajo de la cual el devanado se estabiliza; antes eran números (467,97 °C a 25 A en el motor predeterminado, que ahora entra en fuga por encima de 23,21 A). Un cliente que los lea como números debe tratar null. deratedCurrent y timeToLimit son siempre números.

    El timeToLimit de bldc-thermal es null, con una advertencia, cuando la corriente de pico estabiliza el devanado por debajo de su límite, de modo que nunca se alcanza. Antes era el valor centinela 9999 s, que se leía como un tiempo real.

  69. bldc-winding: el factor de llenado cuenta ambos lados de la bobina, y el factor de devanado de la estrella de ranuras

    • POST /api/py/v1/calculate (bldc-winding)
    • POST /api/py/v1/calculate/batch
    • POST /api/py/v1/calculate/solve
    • MCP run_calculation
    • rftools-io SDK

    fillFactor cuenta ahora ambos lados de bobina en cada ranura, 2·N·A_wire/A_slot (Pyrhönen, Jokinen & Hrabovcová, Design of Rotating Electrical Machines, 2008, sección 2.9): una bobina en cada diente pone dos lados de bobina en cada ranura. Antes contaba uno, así que todo factor de llenado se duplica. Ya no se limita al 100 %: un devanado que no cabe devuelve su cifra real, con las advertencias del 75 % y el 90 % como antes.

    windingFactor toma su factor de distribución del método de la estrella de ranuras, k_d = sin(π/6)/(z·sin(π/(6z))) para q = S/(3P) = z/n en forma irreducible (Bianchi & Dai Pré, 2006). Era 1 para todo q que se redondeaba a 1, así que los devanados de ranura fraccionaria daban de más: 12 ranuras y 14 polos dan ahora 0,93301 (antes 0,96593), 18 ranuras y 16 polos 0,94521 (antes 0,98481). Los devanados de ranura entera no cambian. turnsPerCoil, actualKv, deltaEquivKv y phaseResistance lo siguen: el devanado predeterminado de 935 Kv se queda en 4 vueltas y alcanza 1027,61 Kv (antes 992,59), y 920 Kv en un estátor de 23 × 10 mm requiere 6 vueltas (antes 5).

    El maxCurrent predeterminado de la calculadora es 5 A (antes 10 A), de modo que su devanado predeterminado del EMAX MT2213 se puede construir: 4 vueltas de AWG 18 con un 47,24 % de llenado. A 10 A necesita AWG 14 y un 119,44 %. La API no aplica valores predeterminados, así que una solicitud que envía maxCurrent se calcula con el valor enviado.

  70. Treinta calculadoras corregidas según la relación que citan

    • POST /api/py/v1/calculate
    • POST /api/py/v1/calculate/batch
    • POST /api/py/v1/calculate/solve
    • MCP run_calculation
    • rftools-io SDK

    Cada calculadora de las siguientes calculaba algo distinto de su referencia citada, igual en el navegador, en la API y en el servidor MCP. Cada una calcula ahora la relación de la referencia y se prueba frente a un valor publicado. Los cálculos guardados almacenan entradas, así que se recalculan.

    Los valores cambian en: equalizer-q-factor (ancho de banda en octavas con Q constante), capacitor-code (un dígito multiplicador 8 significa ×0,01 y 9 significa ×0,1), opamp-gain (el ancho de banda es GBW dividido entre la ganancia de ruido), coax-impedance (corte TE11 sobre la circunferencia media), h-bridge-selection (conducen dos FET a la vez), bldc-winding (el factor √3 corresponde a la estrella; nuevos valores predeterminados de un motor 12N14P real), speaker-crossover (inductores de 2.º orden √2·R/ω_c, el doble del valor anterior, también en la exportación a KiCad), esd-tvs-diode (el nivel de IEC 61000-4-2 toma el primer pico de la norma, 3,75 A/kV), common-mode-choke (una impedancia en serie compleja en un sistema de 50 Ω/50 Ω), uart-baud-rate (la paridad mark y space cuenta un bit), bldc-motor (empuje estático C_T·ρ·n²·D⁴ con C_T 0,11), resistor-color-code (naranja ±0,05 %, amarillo ±0,02 %; se rechaza una banda de tolerancia blanca), pt100-resistance (la C de IEC 60751 por debajo de 0 °C, y la pendiente completa), torque-units, energy-units y torque-unit-converter (factores exactos de NIST SP 811), via-thermal-resistance (capacidad de corriente a partir del ajuste de IPC-2221), thermal-via-array (el barril metalizado es de cobre sea cual sea el relleno), stackup-builder (L3 resuelta como stripline, L1 con el espesor de cobre, el cobre contado en el total), coplanar-waveguide (el CPW con plano de tierra sigue siendo finito para pistas anchas), i2c-pullup (V_OL es 0,2·V_DD a 2 V o menos), vibration-phase-noise (el término aleatorio cae con el desplazamiento; la desviación es la de pico), inrush-current-limiter (el pico en arranque en frío es V/R_cold), shielding-effectiveness (la pérdida por reflexión incluye η₀; se añaden las reflexiones múltiples), ethernet-cable (la categoría 5e a 10 Gb/s no cumple), ground-plane-impedance (inductancia µ₀·h·l/w; resistencia en CA por una sola cara) y minimum-conductor-spacing (tabla 6-1 de IPC-2221B por banda, con sus tasas por voltio por encima de 500 V).

    Entradas opcionales nuevas: separation en ground-plane-impedance (mm, valor predeterminado 1) y tempRise en via-thermal-resistance (°C, valor predeterminado 10). Una solicitud que las omite obtiene el valor predeterminado, que reproduce los ejemplos resueltos publicados.

    Salidas nuevas: hotRestartInrush en inrush-current-limiter y multipleReflectionLoss en shielding-effectiveness.

    Las salidas que no tienen valor se devuelven ahora como null con una advertencia, donde antes eran un número: la longitud de onda guiada y las velocidades de fase y de grupo de waveguide-cutoff por debajo del corte, y el ancho de stackup-builder para una impedancia objetivo que la capa no puede alcanzar.

    comparator-hysteresis y pcb-trace-temp solo cambian sus etiquetas y la fórmula declarada: no cambia ninguna cifra.

    POST /api/py/v1/calculate/solve rechaza un grid más fino que 1×10⁻¹² de la magnitud del rango con un rechazo grid 400, antes de cualquier evaluación y sin cobro. Una rejilla así podía retener una solicitud hasta agotar el tiempo.

  71. radiated-emission-estimate: margen frente a CISPR 32 clase B, null donde no fija límite

    • POST /api/py/v1/calculate (radiated-emission-estimate)
    • POST /api/py/v1/calculate/batch
    • MCP run_calculation
    • rftools-io SDK

    El margen se toma ahora frente al límite de CISPR 32 clase B a la distancia de medición: tablas A.4 y A.5, la fila de 3 m por debajo de √30 m y la de 10 m por encima hasta 1 GHz, las filas de promedio a 3 m de 1 a 6 GHz, 20 dB/década desde la distancia tabulada y el límite más bajo en un borde de banda. Antes era un valor fijo de 40 dBµV/m a cualquier frecuencia y distancia.

    Por debajo de 30 MHz y por encima de 6 GHz, CISPR 32 no fija límite de emisión radiada, así que margin es null ahí, con una advertencia. Antes era un número. Un cliente que lea margin como número debe tratar null.

    El campo es la estimación de lazo pequeño en espacio libre, ahora con la constante exacta π·µ₀/c. Una medición sobre un plano de tierra puede dar hasta 6 dB más, como indica la página.

  72. filter-designer y seis calculadoras de RF corregidas

    • POST /api/py/v1/calculate
    • MCP run_calculation
    • rftools-io SDK

    filter-designer: los valores del prototipo de Chebyshev eran erróneos a partir del orden 4 (g3 1,5733, ahora 2,3661), un Butterworth de primer orden daba g1 = 1 (ahora 2), y los valores de los elementos del paso banda eran diez veces demasiado pequeños con Q = 10. Los valores se calculan ahora, no se tabulan.

    waveguide-cutoff, free-space-path-loss, rf-link-budget, fresnel-zone, link-margin y radar-range-equation usan la velocidad exacta de la luz, no 3×10⁸: las longitudes se desplazan alrededor de un 0,07 % y la pérdida de trayecto 0,006 dB. radar-range-equation usa además la constante de Boltzmann exacta.

    planar-spiral-inductor rechaza un diámetro interior igual o superior al exterior en lugar de devolver NaN.

    El 2026-10-05 y el 2026-10-06 se añadieron catorce calculadoras, incluida la nueva categoría iot; consulte el catálogo con GET o list_calculators para verlas.

  73. Impedancia de PDN: un modelo de planos convergente, un puerto derivado y dos parámetros nuevos

    • POST /api/py/v1/jobs (pdn_impedance)
    • POST /api/py/v1/jobs/estimate
    • MCP simulate_pdn_impedance
    • rftools-io SDK

    Si se omiten portX_mm y portY_mm, el puerto se coloca ahora en el punto de un tercio de la placa (a/3, b/3) en lugar de en su centro. El centro es un nulo de todos los modos de cavidad de índice impar, así que las primeras resonancias nunca aparecían en una ejecución con los valores predeterminados. Una solicitud que indica el puerto obtiene el puerto que pidió.

    Dos parámetros opcionales: portSize_mm (valor predeterminado 1 mm, 0,25–20), el lado del cuadrado por el que la corriente del CI entra en los planos, y boardInductance_nh (valor predeterminado 1 nH, 0–20), la inductancia entre el regulador y los planos, que estaba fija en 1 nH. Se acepta un puerto que sobresale de un borde de la placa y se modela con su imagen; se rechaza un puerto cuyo centro queda fuera de la placa o que es más grande que la placa.

    Los resultados cambian. La suma modal del plano se truncaba en función de freqMax_hz y, con un puerto puntual, nunca convergía, así que los resultados se movían con el barrido. Ahora converge y no depende del barrido por debajo del primer modo. En el puerto predeterminado, la inductancia de dispersión del plano es de unos 1,5 nH donde daba unos 0,2 nH, de modo que la resonancia serie del plano desnudo baja de unos 550 a unos 210 MHz, y cambian los conjuntos de condensadores recomendados. Los resultados anteriores no se recalculan.

    El veredicto y summary.maxZPdnDb abarcan ahora toda la banda de desacoplo, que termina en 0,8 × el primer modo de cavidad de la placa, con el peor caso refinado entre los puntos de la rejilla. Campos de resultado nuevos: summary.band, summary.worstHz, summary.unreachable, resonances[].portCoupling, y el puerto, el tamaño del puerto y la inductancia de la placa usados, en params. Se conservan todos los campos existentes.

  74. Una llamada de resolución para un valor objetivo: buscar una entrada de la calculadora para una salida objetivo

    • POST /api/py/v1/calculate/solve

    POST /api/py/v1/calculate/solve halla el valor de una entrada de la calculadora que lleva una de sus salidas a un objetivo —el ancho de pista que da 50 Ω, la separación que da una impedancia diferencial objetivo— y lo devuelve con el resultado directo exactamente en ese valor: values, warnings, errors y provenance, exactamente lo que /calculate devuelve para esas entradas. Una sola llamada contabilizada sustituye a las varias llamadas directas que un cliente gastaría buscando a mano.

    La búsqueda recorre los límites declarados de la entrada, acotados por un range opcional; una entrada sin límite declarado necesita uno. Un grid opcional redondea el valor devuelto a su múltiplo más cercano dentro del rango, junto a la solución sin redondear. Un objetivo que la búsqueda no puede alcanzar se responde igualmente con éxito, con reached: false y el valor más cercano encontrado, y se cobra igualmente. Los rechazos —una calculadora desconocida, un nombre de entrada o salida que la calculadora no declara, un valor no finito, un rango ausente en una entrada sin límites— no cuestan nada, como en cualquier otra ruta de calculadora.

    El Client.solve() del SDK de Python (rftools-io 0.4.0) y la herramienta solve_calculation del servidor MCP (2.2.0) ofrecen la misma llamada.

  75. Una cuota agotada en las rutas de calculadoras es 402, no 401

    • POST /api/py/v1/calculate
    • POST /api/py/v1/calculate/batch

    Las rutas de calculadoras respondían 401 «Invalid or quota-exceeded API key» tanto a una clave no válida como a una cuota agotada, así que un script no podía distinguir una clave errónea de un mes de mucho uso. Una cuota agotada es ahora 402, como ya respondía la ruta de trabajos, con errorKind: "rate_limited", reason, limit, used, resetAt, upgradeUrl, overageUrl y una cabecera Retry-After.

    401 significa ahora solo que la clave falta, está mal formada, es desconocida o está revocada, y nunca menciona una cuota. Una solicitud sin ninguna clave recibe un 401 con una keyUrl donde obtener una clave gratuita.

    Una llamada se comprueba antes de contarse: una calculadora desconocida (404) o una entrada que no es un número finito (400) no cuestan nada, y un cálculo que falla se devuelve. En un lote, solo se cuentan los elementos que superan esas comprobaciones, y se devuelven los elementos cuyo cálculo falla. Base su lógica en el estado y en errorKind, nunca en el texto del mensaje.

  76. La cuota mensual pertenece a la cuenta y la comparten todas sus claves

    • POST /api/py/v1/calculate
    • POST /api/py/v1/calculate/batch
    • POST /api/py/v1/jobs

    Antes, cada clave tenía su propia cuota mensual, de modo que una cuenta con varias claves podía gastar su cuota una vez por clave. Ahora la cuota es de la cuenta: las llamadas de cada una de sus claves, incluidas las revocadas, se descuentan de una única cifra mensual, que se restablece al inicio de cada mes natural en UTC.

    Una cuenta con una sola clave no nota ninguna diferencia. Las llamadas se siguen atribuyendo a la clave que las hizo, y el panel y GET /api/py/v1/usage las enumeran por clave.

  77. Un endpoint de uso, y cabeceras de uso en cada respuesta contabilizada

    • GET /api/py/v1/usage
    • X-Usage-Allowance
    • X-Usage-Used
    • X-Usage-Reset
    • X-Usage-Overage

    GET /api/py/v1/usage responde a una clave (X-API-Key o Authorization: Bearer rfc_…) o a una sesión iniciada con el plan, la cuota, lo usado y lo que queda, cuándo se restablece, el estado del excedente y las llamadas atribuidas a cada una de las claves de la cuenta. Consultarlo nunca se cuenta.

    Cada respuesta contabilizada lleva X-Usage-Allowance, X-Usage-Used (incluida esa llamada) y X-Usage-Reset, y X-Usage-Overage cuando se contó excedente. Los navegadores pueden leerlas.

  78. Cada resultado indica cómo se calculó

    • POST /api/py/v1/calculate
    • POST /api/py/v1/calculate/batch
    • GET /api/py/v1/jobs/{jobId}

    Los resultados de las calculadoras y cada elemento de un lote llevan un objeto provenance con nueve miembros: method, version, formulaRef, assumptions, validRange, computedAt, inputs, seed y elapsedSeconds. Los resultados de los trabajos ya llevaban provenance; gana formulaRef, assumptions, validRange y computedAt en lugar de un segundo objeto, y su version se escribe worker@<revision> en lugar de la revisión sola.

    Una entrada fuera del rango para el que está indicada una calculadora se calcula igualmente: validRange la nombra y se añade una advertencia. Un resultado guardado antes de este cambio conserva los miembros que tenía; trate uno ausente como desconocido.

  79. Los programas pueden obtener una clave mediante la autorización de dispositivo

    • POST /api/py/v1/oauth/device/code
    • POST /api/py/v1/oauth/device/token
    • /device/

    Un programa sin navegador propio puede obtener una clave sin que su usuario la pegue (autorización de dispositivo de OAuth 2.0, RFC 8628). Pide un código a /oauth/device/code, muestra a su usuario el código y la dirección https://rftools.io/device/, y consulta /oauth/device/token con el intervalo que recibió. Una vez que el usuario inicia sesión y aprueba el código, la siguiente consulta devuelve una clave de API normal, una sola vez.

    La clave se contabiliza, se lista y se puede revocar como cualquier otra, y cuenta para el límite de claves de la cuenta.

  80. Enlaces de clave para clientes, y etiquetas en las claves

    • POST /api/py/v1/apikeys
    • /dashboard/?newKey=1

    POST /api/py/v1/apikeys acepta un cuerpo opcional {"label", "client"} y devuelve ambos; sin cuerpo funciona como antes. Un cliente puede enviar a su usuario a https://rftools.io/dashboard/?newKey=1&client=<clientId> para crear una clave etiquetada para él, que se muestra una sola vez.

  81. Los rechazos nombran el límite y la manera de superarlo

    • 429 responses
    • 402 from POST /api/py/v1/jobs
    • Authorization: Bearer rfc_…

    El 429 por minuto lleva errorKind: "rate_limited", limit, windowSeconds y upgradeUrl junto a detail, como cualquier otro rechazo lleva su errorKind. El 402 de la ruta de trabajos por cuota agotada gana reason, limit, used, upgradeUrl y overageUrl, y el 402 por cuota agotada de los modos de resolución de fdtd_sparam lleva reason: "solve_mode". Los campos existentes no cambian.

    Las rutas de calculadoras aceptan una clave como Authorization: Bearer rfc_… además de como X-API-Key, como ya hacían las rutas de trabajos.

La referencia completa es la documentación de la API; la descripción legible por máquina son el playground de OpenAPI y el documento OpenAPI.