Documentation

Agent

laya.Agent charge un checkpoint et répond à des questions typées sur un état. laya.load est un raccourci pour Agent(...), et laya.RLAgent est un alias de Agent. ONNXAgent exécute un modèle ONNX exporté sur CPU ; importe-le depuis laya.onnx_agent.

Les noms, types, valeurs par défaut et le code restent en anglais ; le reste est traduit (les entrées non encore traduites s'affichent dans l'original anglais).

Agent

Agent(
    model_id_or_path: str = "convaiinnovations/laya",
    device: Optional[str] = None,
    token: Optional[str] = None,
    subfolder: Optional[str] = None,
    fast: bool = False,
    compile: bool = False,
    revision: Optional[str] = None,
    expected_sha256: Optional[Dict[str, str]] = None,
    lang_temperatures: Optional[Dict[str, Dict[str, Any]]] = None,
    hooks=None,
    on_predict_start=None,
    on_predict_end=None,
    hooks_raise: bool = True,
    hooks_concurrent: bool = True,
    hooks_timeout: Optional[float] = None,
    calibration: Optional[str] = None,
    backend: Optional[str] = None,
    compile_warmup: bool = True,
    compile_cache: bool = False,
    compile_mode: str = "default",
)

Classes de base: HookRegistry

Runtime du modèle de décision System One : décisions rapides, non autorégressives et calibrées.

dtype est la cible de l’autocast, pas la précision de chaque appel. Sur MPS un appel ne fait de l’autocast qu’à partir de mps_amp_min_rows lignes, donc dtype peut indiquer float16 alors qu’un appel tourne en float32. dtype_for(rows) renvoie la précision d’un appel avec rows lignes.

Charge un checkpoint de Laya.

backend sélectionne « eager », « auto », « compile » ou « tilelang » ; voir laya.backends. Il a la priorité sur fast et compile. Omets-le pour conserver ces flags hérités. Pour ONNX, utilise plutôt load(backend="onnx").

revision épingle éventuellement le téléchargement depuis le Hub à un commit SHA/branche/tag explicite ; si on l’omet, le défaut normal de huggingface_hub et le cache hors ligne existant sont utilisés. expected_sha256 ({path relative to the checkpoint dir: hexdigest}) vérifie l’intégrité des artefacts avant qu’aucun poids ne soit analysé ou exécuté ; il est optionnel et s’applique aussi aux répertoires locaux. Un artefact manquant lève FileNotFoundError et une divergence d’empreinte lève ValueError ; l’une ou l’autre de ces erreurs refuse le chargement.

fast=True remplace la passe avant de l’encodeur/de la tête par le chemin rapide TileLang (CUDA uniquement, nécessite pip install laya[fast]) ; voir Agent.accelerate.

compile=True exécute le modèle sous torch.compile et active reference_compile de l’encodeur de ModernBERT. torch.compile se spécialise par forme d’entrée et Laya en voit une nouvelle à presque chaque requête, donc ces graphes coûtent souvent plus qu’ils ne rapportent ; utilise-le quand le trafic est répétitif. fast=True a la priorité, car le chemin TileLang remplace la passe avant qui serait compilée. Les agents compilés exécutent warmup() avant de revenir ; compile_warmup=False reporte ce travail aux requêtes ou à un appel manuel à warmup(). Les agents eager et fast restent inchangés. compile_cache=True active un répertoire Laya Inductor persistant (à l’échelle du processus), en respectant un TORCHINDUCTOR_CACHE_DIR existant ; voir les notes d’ingénierie de compilation. compile_mode="reduce-overhead" active les graphes CUDA. Il peut retenir plus de mémoire GPU et enregistre chaque nouvelle forme séparément. Les sorties CUDA sont copiées avant la relecture suivante ; les passes avant de graphes CUDA compilés sont sérialisées. Le mode par défaut reste « default ».

subfolder sélectionne un checkpoint dans un dépôt qui en regroupe plusieurs, p. ex. Agent("convaiinnovations/laya", subfolder="multilingual"). Seul ce sous-dossier est téléchargé, donc le regroupement ne coûte pas toute la famille à chaque utilisateur.

calibration est un chemin JSON optionnel avec temperature et temperature_by_options. Il est appliqué après la configuration du checkpoint, donc une table ajustée écrase les scalaires livrés sans réécrire model.safetensors.

hooks / on_predict_start / on_predict_end observent ou façonnent chaque prédiction ; voir laya.hooks. hooks_raise=False avertit et continue quand un hook échoue, hooks_concurrent=False sérialise les hooks qui ne sont pas sûrs à exécuter en parallèle, et hooks_timeout borne chaque appel de hook en secondes (None signifie aucune limite).

Paramètres

model_id_or_pathstr= "convaiinnovations/laya"
deviceOptional[str]= None
tokenOptional[str]= None
subfolderOptional[str]= None
fastbool= False
compilebool= False
revisionOptional[str]= None
expected_sha256Optional[Dict[str, str]]= None
lang_temperaturesOptional[Dict[str, Dict[str, Any]]]= None
hooks= None
on_predict_start= None
on_predict_end= None
hooks_raisebool= True
hooks_concurrentbool= True
hooks_timeoutOptional[float]= None
calibrationOptional[str]= None
backendOptional[str]= None
compile_warmupbool= True
compile_cachebool= False
compile_modestr= "default"

backend

backend: str

Le backend d’inférence actif, y compris les flags hérités compile et fast.

backend_object

backend_object

L’objet Backend installé, ou None pour un runtime hérité.

set_backend

set_backend(name: str = "auto", strict: bool = False, options) -> str

Change de backend ; les backends indisponibles avertissent et utilisent eager sauf si strict=True.

Les options vont au constructeur du backend, p. ex. warmup=False pour compile ou use_graphs=False pour tilelang. Le changement attend l’inférence en cours.

Paramètres

namestr= "auto"
strictbool= False
options

accelerate

accelerate(use_graphs: bool = True, strict: bool = False)

Remplace la passe avant du modèle par le chemin rapide TileLang (kernels fusionnés GEMM/GEGLU/LayerNorm/RoPE, flash attention à fenêtre glissante, poids résidents en 16 bits, graphes CUDA par bucket de forme).

Le chemin rapide s’exécute dans le dtype d’autocast de l’agent au moment de l’appel (bf16 ou fp16), donc il correspond à la passe avant standard qu’il remplace à l’arrondi près (voir benchmarks/parity_fast.py). Après avoir changé agent.dtype, appelle deaccelerate() puis accelerate() pour le reconstruire. Renvoie True si il est activé. Avec strict=False, toute défaillance (pas de CUDA, tilelang absent) laisse le chemin standard en place.

Paramètres

use_graphsbool= True
strictbool= False

warmup

warmup(shapes=None) -> float

Exécute dès maintenant la passe avant sur une entrée synthétique de chaque forme et renvoie les secondes que cela a pris.

compile=True appelle ceci au chargement, sauf si compile_warmup=False. Des formes supplémentaires peuvent toujours être préchauffées manuellement. fast=True construit ses kernels et ses graphes CUDA par bucket de forme au premier usage ; appeler ceci avant de servir sort ce coût des premières requêtes. Avec la passe avant standard, ce sont quelques passes avant ordinaires. shapes est une liste de (rows, tokens, markers) ; les jetons sont plafonnés au max_len de l’agent. Rien n’est renvoyé à un appelant ni enregistré pour lui, et les hooks ne s’exécutent pas.

Paramètres

shapes= None

deaccelerate

deaccelerate()

Restaure la passe avant standard.

dtype_for

dtype_for(rows: int) -> torch.dtype

Précision dans laquelle tourne une passe avant avec rows lignes de question.

dtype est la cible de l’autocast, fixée une fois au chargement. Le fait qu’une passe avant fasse de l’autocast se décide par appel : sur MPS uniquement à partir de mps_amp_min_rows lignes. Ceci renvoie dtype quand une passe avant avec rows lignes fait de l’autocast, et torch.float32 sinon. Un appel predict traite une ligne par question.

Paramètres

rowsint

predict_batch

predict_batch(
    states: List[Union[str, dict, list]],
    questions: Dict[str, Dict[str, Any]],
    batch_size: Optional[int] = None,
    lang: Optional[str] = None,
    hooks=None,
    on_predict_start=None,
    on_predict_end=None,
    hooks_raise: Optional[bool] = None,
    hooks_timeout: Optional[float] = None,
    max_len: Optional[int] = None,
    head_max_len: Optional[int] = None,
    sort_by_length: bool = False,
    min_confidence: Optional[float] = None,
) -> List[Dict[str, Any]]

Évalue les mêmes questions sur de nombreux états, en les regroupant dans des passes avant partagées.

C’est le chemin de débit. system_one/predict traitent un état par passe avant ; sur un GPU cela laisse la majeure partie de la dimension de lot inactive. predict_batch rassemble les lignes de question de plusieurs états dans un seul tenseur, donc un appel qui prendrait N passes avant séquentielles en prend une (ou ceil(len(states) / batch_size)), ce qui est plusieurs fois plus rapide par décision sur GPU.

Paramètres

statesList[Union[str, dict, list]]

Une liste d’états (chacun une chaîne de texte, un dict JSON ou une liste de tours de conversation). Les mêmes questions sont évaluées contre chaque état.

questionsDict[str, Dict[str, Any]]

Définitions de questions, exactement comme les accepte system_one.

batch_sizeOptional[int]= None

Plafond optionnel du nombre d’états par passe avant. None les envoie tous en une seule passe ; fixe-le pour borner la mémoire de pointe quand tu regroupes beaucoup d’états ou des états longs.

langOptional[str]= None
hooksHookArg= None

Hooks par appel, ajoutés après ceux installés sur l’Agent. Voir laya.hooks.

on_predict_startPredictHookArg= None

Un hook de début par appel. Il peut réécrire l’état/les questions ou appeler ctx.skip(...) pour court-circuiter l’inférence.

on_predict_endPredictHookArg= None

Un hook de fin par appel. Il peut réécrire les résultats.

hooks_raiseOptional[bool]= None

Remplace le hooks_raise de l’Agent pour cet appel.

hooks_timeoutOptional[float]= None

Remplace le hooks_timeout de l’Agent pour cet appel.

max_lenOptional[int]= None

Remplace le max_len de la config de l’agent pour cet appel. Un hook de début peut aussi fixer ctx.max_len pour façonner le budget de jetons.

head_max_lenOptional[int]= None

Remplace le head_max_len de la config de l’agent pour cet appel. Un hook de début peut aussi fixer ctx.head_max_len.

sort_by_lengthbool= False

Regroupe les états encodés de taille similaire dans des fenêtres de huit lots pour réduire le padding. Nécessite un batch_size explicite supérieur à un et inférieur au nombre d’états ; sinon cela n’a aucun effet. Les résultats conservent l’ordre d’entrée. Cela met en tampon jusqu’à huit lots d’états tokenisés au lieu d’un. Changer les formes de lots peut légèrement modifier les prédictions en virgule flottante.

min_confidenceOptional[float]= None

Renvoie

Une liste de dicts de résultat par état, chacun de forme identique à la sortie de system_one et aligné avec states par indice.

predict_long

predict_long(
    state: Union[str, dict, list],
    questions: Dict[str, Dict[str, Any]],
    window: Optional[int] = None,
    stride: Optional[int] = None,
    aggregate: str = "auto",
    batch_size: Optional[int] = None,
    lang: Optional[str] = None,
    hooks=None,
    on_predict_start=None,
    on_predict_end=None,
    hooks_raise: Optional[bool] = None,
    hooks_timeout: Optional[float] = None,
) -> Dict[str, Any]

Évalue des questions sur un état plus long que la fenêtre de contexte, en le parcourant en fenêtres chevauchantes et en agrégeant par question.

system_one/predict tronquent un état qui dépasse max_len à une seule fenêtre (la première, ou pour une liste de conversation la dernière), en abandonnant le reste en silence. predict_long tokenise l’état une fois, le découpe en fenêtres de jetons chevauchantes, score chaque fenêtre dans des passes avant partagées (via predict_batch), et combine les réponses par fenêtre :

  • noul -> P(true) est le max sur les fenêtres (l’énoncé tient si une fenêtre le soutient)
  • choice-> la réponse de la fenêtre la plus confiante, pour qu’un signal localisé ne soit pas mis en minorité par les nombreuses fenêtres neutres dont un long document est majoritairement fait (la moyenne le noie -- la majorité neutre domine)
  • score -> le niveau de la fenêtre la plus confiante, de même

La probabilité/confiance renvoyée est celle de la fenêtre décisive, pas un nombre calibré pour tout le document : un max noul sur beaucoup de fenêtres dérive vers le haut avec le nombre de fenêtres même sans signal, et choice peut tomber sur une fenêtre résolument neutre quand rien dans le document n’est décisif. Chaque réponse porte donc answer["window"] — l’index de la fenêtre décisive, token_start/token_end dans l’état tokenisé, et le count de fenêtres — pour qu’un appelant puisse inspecter l’intervalle d’où vient la réponse plutôt que de faire confiance au nombre brut. Cette plage est celle que le modèle a lue, pas seulement celle demandée : la fenêtre est plafonnée à la place que laissent les questions, donc ce qui est transmis à predict_batch n’est pas tronqué une seconde fois.

Un état qui tient déjà dans une seule fenêtre est passé directement à system_one (sortie identique).

Les hooks enveloppent l’inférence qui répond à l’état, laquelle, pour un document nécessitant plusieurs fenêtres, est l’unique predict_batch partagé sur elles : on_predict_start se déclenche une fois, et ctx.states contient les textes de fenêtre décodés dans l’ordre de parcours -- pas le state de l’appelant, qui a été tokenisé pour les produire. Trois issues découlent de ce que la chaîne laisse derrière elle :

  • ctx.skip([result]) répond au document : la charge revient sans attribution de fenêtre et avec usage["windows"] à 0, parce que rien n’a été scoré
  • un parcours laissé tel que cette méthode l’a construit : chaque fenêtre est scorée, chaque réponse porte answer["window"], et usage["windows"] est le nombre de fenêtres
  • un parcours réécrit (ctx.states remplacé, de quelque façon que ce soit) : les réponses sont agrégées sur les états qui ont été scorés, mais aucune réponse ne porte answer["window"] -- les décalages ci-dessus décrivent les fenêtres de cette méthode, pas le texte que le modèle a lu

Paramètres

stateUnion[str, dict, list]
questionsDict[str, Dict[str, Any]]
windowOptional[int]= None

jetons d’état par fenêtre. Par défaut le budget d’état du checkpoint (max_len - head_max_len - 8), et dans tous les cas plafonné à la place que les questions laissent pour l’état dans max_len -- la plus petite de ces places, car une même liste de fenêtres est scorée pour chaque question. Une fenêtre plus large est re-tronquée sur le chemin vers le modèle, donc elle est plutôt ramenée à la limite, avec un RuntimeWarning quand c’est l’appelant qui l’a demandée. Les options sont ce qui réduit la place : sur le checkpoint anglais une question à 2 options laisse 483 jetons pour l’état et une à 100 options en laisse 100. Une fenêtre plus petite isole mieux un signal localisé (un court intervalle décisif représente une plus grande fraction de sa fenêtre, donc cette fenêtre le classe clairement), au prix de plus de fenêtres ; la grande valeur par défaut favorise le contexte et le débit. noul est robuste à cela, choice/score bénéficient d’une fenêtre plus petite quand l’intervalle décisif est une petite partie d’un document long et par ailleurs neutre.

strideOptional[int]= None

pas de jetons entre les fenêtres. Par défaut la moitié de la fenêtre effective (50 % de chevauchement), pour qu’un intervalle proche d’une frontière tombe encore entier dans une fenêtre. Un pas au-delà de la fenêtre effective est refusé plutôt que ramené : les jetons entre chaque paire de fenêtres ne seraient lus par aucune fenêtre, ce qui est l’échec que cette méthode existe pour empêcher.

aggregatestr= "auto"

« auto » (les règles par type ci-dessus) est le seul mode pour l’instant.

batch_sizeOptional[int]= None

plafond du nombre de fenêtres par passe avant, pour borner la mémoire sur de très longs états.

langOptional[str]= None

sélection de température par langue, comme dans system_one.

hooksHookArg= None

Hooks par appel, ajoutés après ceux installés sur l’Agent. Voir laya.hooks.

on_predict_startPredictHookArg= None

Un hook de début par appel, comme dans system_one.

on_predict_endPredictHookArg= None

Un hook de fin par appel, comme dans system_one.

hooks_raiseOptional[bool]= None

Remplace le hooks_raise de l’Agent pour cet appel.

hooks_timeoutOptional[float]= None

Remplace le hooks_timeout de l’Agent pour cet appel.

Exceptions

ValueError : aggregate est autre chose que « auto » ; les options des questions remplissent toute la séquence, ne laissant aucune place pour l’état ; ou stride dépasse la fenêtre effective, donc les jetons entre deux fenêtres ne seraient lus par rien.

Renvoie un seul dict de résultat, de même forme que system_one, avec usage["windows"] ajouté. La clé est toujours présente et compte les fenêtres que le modèle a scorées pour produire la réponse : 1 pour un état qui tenait dans une fenêtre, N pour un document parcouru en N fenêtres chevauchantes (ou le N auquel un hook de début les a réécrites), et 0 quand un hook de début a répondu au document, ou n’a laissé aucun état à scorer, avant qu’aucune fenêtre ne soit lue -- sur l’un ou l’autre chemin, pour qu’une réponse en cache ne se lise jamais comme une fenêtre que le modèle a lue.

Sur plusieurs fenêtres, les clés de troncature sont combinées comme tout autre champ de usage : truncated, state_tokens et state_tokens_dropped sont sommés (donc truncated est le nombre de fenêtres qui ont été coupées, et les comptes de jetons incluent le chevauchement), et truncated_questions est la liste de la dernière fenêtre. Les deux peuvent diverger : quand seule une fenêtre antérieure a été coupée, truncated est supérieur à 0 et truncated_questions est vide. Une fenêtre est coupée quand elle est plus grande que la place que laisse la tête d’une question. Teste usage["truncated"] > 0 ici, pas is True.

system_one

system_one(
    state: Union[str, dict, list],
    questions: Dict[str, Dict[str, Any]],
    lang: Optional[str] = None,
    hooks=None,
    on_predict_start=None,
    on_predict_end=None,
    hooks_raise: Optional[bool] = None,
    hooks_timeout: Optional[float] = None,
    max_len: Optional[int] = None,
    head_max_len: Optional[int] = None,
    min_confidence: Optional[float] = None,
) -> Dict[str, Any]

Évalue des questions typées sur un état en une seule passe avant parallèle.

Paramètres

stateUnion[str, dict, list]

Chaîne de texte, dict JSON ou liste de tours de conversation.

questionsDict[str, Dict[str, Any]]

Dictionnaire associant question_id -> définition de question.

  • choice: {"type": "choice", "instructions": "...", "criteria": {"optA": "...", ...}}

  • score: {"type": "score", "instructions": "...", "criteria": ["lvl0", "lvl1", ...]}

  • noul: {"type": "noul", "instructions": "...", "criteria": {"false": "...", "true": "..."}, "labels": {"false": "B", "true": "A"}}

    Les criteria et labels de Noul sont optionnels. Les labels ne contrôlent que le texte montré au modèle ; leurs clés gardent la sémantique false/true, et la valeur noul renvoyée est toujours P(true). Par compatibilité, les labels valent false/true par défaut.

langOptional[str]= None
hooks= None
on_predict_start= None
on_predict_end= None
hooks_raiseOptional[bool]= None
hooks_timeoutOptional[float]= None
max_lenOptional[int]= None
head_max_lenOptional[int]= None
min_confidenceOptional[float]= None

Renvoie

Dictionnaire avec les réponses, les probabilités, la confiance calibrée et l’usage de jetons. Les questions vides renvoient des réponses vides et un usage de jetons nul, sans tokenisation ni passe avant du modèle.

Quand le budget de la tête laisse deux options avec le même intervalle de jetons, usage porte une entrée options pour chaque question concernée -- total, distinct et tokens_per_option -- parce qu’une réponse choisie parmi 42 intervalles distinguables sur 58 a un plafond qui est celui du budget et non celui du modèle. Les questions dont les options survivent toutes sont absentes, donc une requête qui ne réduit rien reste inchangée.

usage indique aussi si l’état tenait : truncated, state_tokens, state_tokens_dropped, et truncated_questions (les questions dont la tête a laissé trop peu de place). Un appelant qui se soucie de savoir si la réponse a vu tout l’état devrait lire usage["truncated"] plutôt qu’estimer d’après la longueur de ce qu’il a envoyé.

Pour scorer beaucoup d’états à la fois, voir predict_batch, qui partage les passes avant entre eux.

decide

decide(
    state: Union[str, dict, list],
    schema: Any = None,
    questions: Optional[Dict[str, Any]] = None,
    return_details: bool = False,
    min_confidence: Optional[float] = None,
    predict_kwargs,
) -> Any

Répond à state contre un schéma (schéma JSON ou modèle pydantic) et renvoie des valeurs typées.

Voir laya.structured. Passe exactement l’un de schema ou questions ; les arguments nommés supplémentaires sont transmis à predict / system_one.

Paramètres

stateUnion[str, dict, list]
schemaAny= None
questionsOptional[Dict[str, Any]]= None
return_detailsbool= False
min_confidenceOptional[float]= None
predict_kwargs

decide_batch

decide_batch(
    states: List[Union[str, dict, list]],
    schema: Any = None,
    questions: Optional[Dict[str, Any]] = None,
    return_details: bool = False,
    min_confidence: Optional[float] = None,
    predict_kwargs,
) -> List[Any]

Répond à de nombreux états contre un seul schéma (schéma JSON ou modèle pydantic) en un appel par lots.

La forme haut débit de :meth:decide : le schéma est planifié une fois et ses questions tournent sur chaque état via :meth:predict_batch (passes avant partagées, résultats dans l’ordre d’entrée), puis les réponses de chaque état sont projetées comme le fait decide. Les arguments nommés supplémentaires (batch_size=, lang=, hooks=, ...) sont transmis à predict_batch. Voir laya.structured.

Paramètres

statesList[Union[str, dict, list]]
schemaAny= None
questionsOptional[Dict[str, Any]]= None
return_detailsbool= False
min_confidenceOptional[float]= None
predict_kwargs

fit_temperatures

fit_temperatures(records, compute_ece: bool = False, seed: int = 0) -> Dict[str, Any]

Ajuste des températures par bucket à partir d’enregistrements CPU et les stocke sur cet agent.

records sont (qtype, logits, target, k). Construis-les avec laya.calibrate.records_from_labeled quand tu as des passes avant étiquetées ; cette méthode ne télécharge pas de poids ni n’écrit model.safetensors. seed n’affecte que la partition ECE réservée quand compute_ece est true. Le cfg du checkpoint est laissé tel que chargé.

Paramètres

records
compute_ecebool= False
seedint= 0

fit_binning

fit_binning(
    records,
    min_bucket_n: int = MIN_BINNING_BUCKET_N,
    MIN_BINNING_BUCKET_N,
) -> Dict[str, Any]

Ajuste une table de binning par histogramme par-dessus les températures ajustées de cet agent et la stocke.

records sont les mêmes tuples (qtype, logits, target[, k]) que ceux consommés par fit_temperatures. La table est indexée exactement comme temperature_by_options, se compose par-dessus les températures actuelles, et save_calibration l’écrit sous le nom binning_map.

Paramètres

records
min_bucket_nint= MIN_BINNING_BUCKET_N
MIN_BINNING_BUCKET_N

save_calibration

save_calibration(path: str) -> None

Écrit les températures et le checkpoint pour lequel elles ont été ajustées. N’écrit pas les poids.

Paramètres

pathstr

load_calibration

load_calibration(path: str) -> None

Lit sur cet agent une table JSON écrite par save_calibration.

Un fichier sans version est traité comme la version 1 et se charge quand même. Un fichier plus récent dont le checkpoint enregistré ne correspond pas à cet agent avertit et se charge quand même. Les valeurs qui ne sont pas des nombres, ou qui sortent de [TEMP_MIN, TEMP_MAX], sont bornées avec clamp_temperature de la même façon qu’au chargement d’un checkpoint.

Paramètres

pathstr

load

load(
    model_id_or_path: str = "convaiinnovations/laya",
    device: Optional[str] = None,
    token: Optional[str] = None,
    subfolder: Optional[str] = None,
    fast: bool = False,
    compile: bool = False,
    revision: Optional[str] = None,
    expected_sha256: Optional[Dict[str, str]] = None,
    lang_temperatures: Optional[Dict[str, Dict[str, Any]]] = None,
    hooks=None,
    on_predict_start=None,
    on_predict_end=None,
    hooks_raise: bool = True,
    hooks_concurrent: bool = True,
    hooks_timeout: Optional[float] = None,
    calibration: Optional[str] = None,
    backend: Optional[str] = None,
    onnx_path: Optional[str] = None,
    compile_warmup: bool = True,
    compile_cache: bool = False,
    compile_mode: str = "default",
) -> Agent

Charge un agent Laya.

subfolder choisit un checkpoint dans un dépôt qui en regroupe plusieurs :

laya.load("convaiinnovations/laya")                           # English (repo root)
laya.load("convaiinnovations/laya", subfolder="multilingual")
laya.load("convaiinnovations/laya", fast=True)                # TileLang GPU fast path
laya.load("convaiinnovations/laya", compile=True)              # torch.compile the model

model_id_or_path accepte aussi un nom de checkpoint ou un alias -- les mêmes que résout Router, donc les deux points d’entrée lisent une seule table :

laya.load("typed-decisions")
laya.load("ml")                                               # multilingual

Tout le reste (un id de dépôt Hub, un répertoire local) est transmis à Agent inchangé.

backend sélectionne « auto », « eager », « compile », « tilelang » ou « onnx ». ONNX renvoie l’ONNXAgent existant, avec onnx_path (par défaut « laya.onnx »). Les autres backends utilisent Agent ; un backend explicite a la priorité sur les flags hérités.

revision/expected_sha256 épinglent et vérifient les artefacts téléchargés ; voir Agent. hooks / on_predict_start / on_predict_end observent ou façonnent chaque prédiction ; voir laya.hooks. calibration est le même chemin JSON optionnel accepté par Agent.

Paramètres

model_id_or_pathstr= "convaiinnovations/laya"
deviceOptional[str]= None
tokenOptional[str]= None
subfolderOptional[str]= None
fastbool= False
compilebool= False
revisionOptional[str]= None
expected_sha256Optional[Dict[str, str]]= None
lang_temperaturesOptional[Dict[str, Dict[str, Any]]]= None
hooks= None
on_predict_start= None
on_predict_end= None
hooks_raisebool= True
hooks_concurrentbool= True
hooks_timeoutOptional[float]= None
calibrationOptional[str]= None
backendOptional[str]= None
onnx_pathOptional[str]= None
compile_warmupbool= True
compile_cachebool= False
compile_modestr= "default"

ONNXAgent

ONNXAgent(
    model_id_or_path: str,
    onnx_path: str = "laya.onnx",
    token: Optional[str] = None,
    subfolder: Optional[str] = None,
    revision: Optional[str] = None,
    expected_sha256: Optional[Dict[str, str]] = None,
    hooks=None,
    on_predict_start=None,
    on_predict_end=None,
    hooks_raise: bool = True,
    hooks_concurrent: bool = True,
    hooks_timeout: Optional[float] = None,
    lang_temperatures: Optional[Dict[str, Dict[str, Any]]] = None,
    calibration: Optional[str] = None,
)

Classes de base: HookRegistry

Runtime du modèle de décision System One via ONNX : décisions rapides optimisées pour CPU.

Charge un agent Laya propulsé par ONNX Runtime.

Paramètres

model_id_or_pathstr

ID HuggingFace Hub ou chemin local vers le checkpoint PyTorch d’origine (utilisé pour charger le tokenizer et la config).

onnx_pathstr= "laya.onnx"

Chemin vers le fichier .onnx exporté.

tokenOptional[str]= None

Jeton HuggingFace optionnel pour un checkpoint privé ou sous accès restreint ; retombe sur $HF_TOKEN, exactement comme le fait Agent. Seuls le tokenizer et la config sont récupérés -- le graphe lui-même est le onnx_path local.

subfolderOptional[str]= None

Sous-dossier optionnel si le téléchargement se fait depuis un dépôt groupé.

revisionOptional[str]= None

Révision Hub optionnelle (commit SHA/branche/tag). Si on l’omet, le défaut normal de huggingface_hub et le cache hors ligne existant sont utilisés.

expected_sha256Optional[Dict[str, str]]= None

{path relative to the checkpoint dir: hexdigest} optionnel, vérifié avant qu’aucun fichier de checkpoint ne soit analysé ; optionnel, et s’applique aussi aux répertoires locaux. Un artefact manquant lève FileNotFoundError et une divergence d’empreinte lève ValueError ; l’une ou l’autre de ces erreurs refuse le chargement.

hooksHookArg= None

Hooks de prédiction optionnels ; voir laya.hooks.

on_predict_startPredictHookArg= None

Un hook de début optionnel, exécuté avant l’inférence.

on_predict_endPredictHookArg= None

Un hook de fin optionnel, exécuté après l’inférence.

hooks_raisebool= True

Quand il vaut False, un hook qui échoue avertit et l’inférence continue.

hooks_concurrentbool= True

Quand il vaut False, les hooks sont sérialisés avec un verrou.

hooks_timeoutOptional[float]= None

Borne chaque appel de hook en secondes ; None signifie aucune limite.

lang_temperaturesOptional[Dict[str, Dict[str, Any]]]= None

Substitutions de température par langue optionnelles, indexées par code de langue, chacune {"temperature": [3 floats], "temperature_by_options": {}}. Appliquées quand un lang= est passé à system_one/predict, reproduisant l’Agent PyTorch ; sinon un changement de backend perd la calibration.

calibrationOptional[str]= None

load_calibration

load_calibration(path: str) -> None

Lit sur cet agent une table JSON écrite par save_calibration.

Paramètres

pathstr

system_one

system_one(
    state: Union[str, dict, list],
    questions: Dict[str, Dict[str, Any]],
    lang: Optional[str] = None,
    hooks=None,
    on_predict_start=None,
    on_predict_end=None,
    hooks_raise: Optional[bool] = None,
    hooks_timeout: Optional[float] = None,
    max_len: Optional[int] = None,
    head_max_len: Optional[int] = None,
    min_confidence: Optional[float] = None,
) -> Dict[str, Any]

Évalue des questions typées sur un état en une seule exécution de session ONNX Runtime.

lang sélectionne une substitution de température par langue (voir lang_temperatures), en accord avec la signature de Agent.system_one de PyTorch, de sorte que l’un ou l’autre backend remplace l’autre sans changement.

Défini en termes de predict_batch, exactement comme l’est Agent.system_one de PyTorch, pour que les chemins mono-état et par lots ne puissent pas diverger.

Paramètres

stateUnion[str, dict, list]

Chaîne de texte, dict JSON ou liste de tours de conversation.

questionsDict[str, Dict[str, Any]]

Définitions de questions, avec les formes qu’accepte Agent.system_one.

langOptional[str]= None

Substitution de température par langue (voir lang_temperatures).

hooksHookArg= None

Hooks par appel, ajoutés après ceux installés sur l’agent.

on_predict_startPredictHookArg= None

Un hook de début par appel. Il peut réécrire l’état/les questions ou appeler ctx.skip(...) pour court-circuiter l’inférence.

on_predict_endPredictHookArg= None

Un hook de fin par appel. Il peut réécrire les résultats.

hooks_raiseOptional[bool]= None

Remplace le hooks_raise de l’agent pour cet appel.

hooks_timeoutOptional[float]= None

Remplace le hooks_timeout de l’agent pour cet appel.

max_lenOptional[int]= None

Remplace le max_len de la config pour cet appel.

head_max_lenOptional[int]= None

Remplace le head_max_len de la config pour cet appel.

min_confidenceOptional[float]= None

Seuil d’abstention optionnel sur answer_confidence (#361) ; une réponse en dessous est renvoyée marquée par low_confidence: True.

Renvoie

Dictionnaire avec les réponses, les probabilités, la confiance calibrée et l’usage de jetons.

Pour scorer beaucoup d’états à la fois, voir predict_batch, qui partage les exécutions de session entre eux.

predict_batch

predict_batch(
    states: List[Union[str, dict, list]],
    questions: Dict[str, Dict[str, Any]],
    batch_size: Optional[int] = None,
    lang: Optional[str] = None,
    hooks=None,
    on_predict_start=None,
    on_predict_end=None,
    hooks_raise: Optional[bool] = None,
    hooks_timeout: Optional[float] = None,
    max_len: Optional[int] = None,
    head_max_len: Optional[int] = None,
    sort_by_length: bool = False,
    min_confidence: Optional[float] = None,
) -> List[Dict[str, Any]]

Évalue les mêmes questions sur de nombreux états, en partageant les exécutions de session ONNX Runtime.

Le chemin de débit, calqué sur laya.agent.Agent.predict_batch : system_one rassemble les lignes de question d’un état par exécution de session, donc N états coûtent N exécutions. predict_batch rassemble les lignes de plusieurs états en une exécution -- ou ceil(len(states) / batch_size) d’entre elles -- ce qui est là où le parallélisme propre d’ONNX Runtime est payant sur CPU.

Paramètres

statesList[Union[str, dict, list]]

Une liste d’états (chacun une chaîne de texte, un dict JSON ou une liste de tours de conversation). Les mêmes questions sont évaluées contre chaque état.

questionsDict[str, Dict[str, Any]]

Définitions de questions, exactement comme les accepte system_one.

batch_sizeOptional[int]= None

Plafond optionnel du nombre d’états par exécution de session. None les envoie tous en une seule exécution ; fixe-le pour borner la mémoire de pointe quand tu regroupes beaucoup d’états ou des états longs.

langOptional[str]= None

Substitution de température par langue appliquée à chaque état ; voir lang_temperatures.

hooksHookArg= None

Hooks par appel, ajoutés après ceux installés sur l’agent.

on_predict_startPredictHookArg= None

Un hook de début par appel. Il peut réécrire les états/les questions ou appeler ctx.skip(...) pour court-circuiter l’inférence.

on_predict_endPredictHookArg= None

Un hook de fin par appel. Il peut réécrire les résultats.

hooks_raiseOptional[bool]= None

Remplace le hooks_raise de l’agent pour cet appel.

hooks_timeoutOptional[float]= None

Remplace le hooks_timeout de l’agent pour cet appel.

max_lenOptional[int]= None

Remplace le max_len de la config pour cet appel.

head_max_lenOptional[int]= None

Remplace le head_max_len de la config pour cet appel.

sort_by_lengthbool= False

Regroupe les états encodés de taille similaire dans des fenêtres de huit lots pour réduire le padding, exactement comme le fait Agent.predict_batch. Nécessite un batch_size explicite supérieur à un et inférieur au nombre d’états ; sinon cela n’a aucun effet. Les résultats conservent l’ordre d’entrée. Changer les formes de lots peut légèrement modifier les prédictions en virgule flottante près des seuils de décision.

min_confidenceOptional[float]= None

Seuil d’abstention optionnel sur answer_confidence (#361) ; les réponses en dessous sont renvoyées marquées par low_confidence: True.

Renvoie

Une liste de dicts de résultat par état, chacun de forme identique à la sortie de system_one et aligné avec states par indice.

predict_long

predict_long(
    state: Union[str, dict, list],
    questions: Dict[str, Dict[str, Any]],
    window: Optional[int] = None,
    stride: Optional[int] = None,
    aggregate: str = "auto",
    batch_size: Optional[int] = None,
    lang: Optional[str] = None,
    hooks=None,
    on_predict_start=None,
    on_predict_end=None,
    hooks_raise: Optional[bool] = None,
    hooks_timeout: Optional[float] = None,
) -> Dict[str, Any]

Évalue des questions sur un état plus long que la fenêtre de contexte, en le parcourant en fenêtres chevauchantes et en agrégeant par question.

Le portage ONNX de laya.agent.Agent.predict_long, avec les mêmes règles d’agrégation : system_one tronque un état qui dépasse max_len à une seule fenêtre, en abandonnant le reste en silence. predict_long tokenise l’état une fois, le découpe en fenêtres de jetons chevauchantes, score chaque fenêtre via predict_batch -- ainsi les fenêtres partagent des exécutions de session ONNX Runtime plutôt que d’en coûter une chacune -- et combine les réponses par fenêtre :

  • noul -> P(true) est le max sur les fenêtres (l’énoncé tient si une fenêtre le soutient)
  • choice-> la réponse de la fenêtre la plus confiante, pour qu’un signal localisé ne soit pas mis en minorité par les nombreuses fenêtres neutres dont un long document est majoritairement fait
  • score -> le niveau de la fenêtre la plus confiante, de même

La probabilité/confiance renvoyée est celle de la fenêtre décisive, pas un nombre calibré pour tout le document, pour les mêmes raisons que celles données par le docstring PyTorch. Chaque réponse porte answer["window"] -- l’index de la fenêtre décisive, token_start/token_end dans l’état tokenisé, et le count de fenêtres.

Un état qui tient déjà dans une seule fenêtre est passé directement à system_one (sortie identique).

Paramètres

stateUnion[str, dict, list]

Chaîne de texte, dict JSON ou liste de tours de conversation.

questionsDict[str, Dict[str, Any]]

Définitions de questions, exactement comme les accepte system_one.

windowOptional[int]= None

Jetons d’état par fenêtre. Par défaut le budget d’état par question (max_len - head_max_len - 8). Des fenêtres plus petites isolent mieux un signal localisé, au prix de plus de fenêtres, comme dans Agent.predict_long.

strideOptional[int]= None

Pas de jetons entre les fenêtres. Par défaut window // 2 (50 % de chevauchement).

aggregatestr= "auto"

« auto » (les règles par type ci-dessus) est le seul mode pour l’instant.

batch_sizeOptional[int]= None

Plafond du nombre de fenêtres par exécution de session, pour borner la mémoire de pointe sur de très longs états.

langOptional[str]= None

Sélection de température par langue, comme dans system_one.

hooksHookArg= None

Hooks par appel, ajoutés après ceux installés sur l’agent. Ils suivent le contrat de Agent.predict_long : ils enveloppent l’inférence qui répond à l’état, un hook de début qui répond avec ctx.skip(...) obtient usage["windows"] == 0 et aucune attribution de fenêtre, et un parcours réécrit est agrégé sans answer["window"].

on_predict_startPredictHookArg= None

Un hook de début par appel, comme dans system_one.

on_predict_endPredictHookArg= None

Un hook de fin par appel, comme dans system_one.

hooks_raiseOptional[bool]= None

Remplace le hooks_raise de l’agent pour cet appel.

hooks_timeoutOptional[float]= None

Remplace le hooks_timeout de l’agent pour cet appel.

Renvoie un seul dict de résultat, de même forme que system_one, avec usage["windows"] ajouté. Sur plusieurs fenêtres, les clés de troncature sont sommées ou portées de la même façon que dans Agent.predict_long : truncated est un nombre de fenêtres et truncated_questions est la liste de la dernière fenêtre, donc truncated peut être supérieur à 0 alors que la liste est vide.

decide

decide(
    state: Union[str, dict, list],
    schema: Any = None,
    questions: Optional[Dict[str, Dict[str, Any]]] = None,
    return_details: bool = False,
    min_confidence: Optional[float] = None,
    predict_kwargs,
) -> Any

Répond à state contre un schéma (schéma JSON ou modèle pydantic) et renvoie des valeurs typées.

Voir laya.structured. Passe exactement l’un de schema ou questions ; les arguments nommés supplémentaires sont transmis à predict / system_one.

Paramètres

stateUnion[str, dict, list]
schemaAny= None
questionsOptional[Dict[str, Dict[str, Any]]]= None
return_detailsbool= False
min_confidenceOptional[float]= None
predict_kwargs

decide_batch

decide_batch(
    states: List[Union[str, dict, list]],
    schema: Any = None,
    questions: Optional[Dict[str, Dict[str, Any]]] = None,
    return_details: bool = False,
    min_confidence: Optional[float] = None,
    predict_kwargs,
) -> List[Any]

Répond à de nombreux états contre un seul schéma via predict_batch ; voir laya.structured.

Paramètres

statesList[Union[str, dict, list]]
schemaAny= None
questionsOptional[Dict[str, Dict[str, Any]]]= None
return_detailsbool= False
min_confidenceOptional[float]= None
predict_kwargs

Export quantifié

scripts/export_onnx.py --quantize écrit une copie quantifiée INT8 (poids uniquement) à côté de l’export fp32 (laya.onnx produit aussi laya.int8.onnx). La quantification dynamique convertit les poids MatMul en int8 et calcule l’échelle d’activation par entrée à l’exécution, donc aucun jeu de données de calibration n’est nécessaire, et ONNXAgent charge le résultat en pointant onnx_path dessus. Sur CPU, c’est environ 2x plus rapide que le modèle eager et ~1.8x plus rapide que le graphe ONNX fp32, et 1.4-2.8x plus petit selon le checkpoint.

INT8 échange de la vraie précision, c’est donc une option de taille/latence, pas gratuite — ne l’utilise pas là où la probabilité ou la confiance calibrée compte. Les échelles sont par tenseur par défaut ; --per-channel active des poids par canal, mais sur le chemin dynamique, cela effondre le modèle de décision (l’accord avec le modèle eager est tombé à ~32% sur le checkpoint anglais et ~40% sur le multilingue, contre ~67% / ~83% par tenseur ; voir l’issue #790). Même par tenseur, la dérive reste notable sur le plus grand checkpoint ; un int8 sûr pour la précision nécessiterait du QAT ou un traitement des valeurs aberrantes à la SmoothQuant. Le graphe int8 est réservé au CPU : ONNX Runtime n’a pas de noyau INT8 MatMul sur le CUDAExecutionProvider, et un fournisseur GPU retombe silencieusement nœud par nœud.

python scripts/export_onnx.py --model convaiinnovations/laya --output laya.onnx --quantize