Classifica els moviments amb un LLM¶
Aquesta pàgina tracta el flux de treball de classificació assistida per LLM: configurar un proveïdor, previsualitzar un suggeriment per a un moviment, el bucle de revisió (aplicar, rebutjar o sobreescriure), saturar els camps fiscals d’IVA i llegir una factura adjunta amb un model, a la teva pròpia màquina o, amb consentiment explícit, mitjançant un proveïdor al núvol. El suggeriment sempre és un punt de partida: el confirmes o el corregeixes, i el model mai no estableix cap import en euros.
La classificació no contacta amb l’AEAT i no envia res. La CLI del proveïdor pot contactar amb el seu propi servei extern segons la configuració del proveïdor; consulta el límit de privadesa abans d’utilitzar dades reals de contribuent.
Les ordres d’LLM i de visió d’aquesta pàgina necessiten una CLI de proveïdor o un model de visió local que l’entorn de proves de la documentació no executa, de manera que es mostren com a marcs de només visualització. Les ordres locals que les envolten s’executen en directe en el moment de la compilació.
Abans de començar¶
Necessita:
Un perfil actiu, consulta configura el teu perfil de contribuent, i com a mínim un moviment al seu ledger per classificar. Consulta Importa i gestiona els moviments.
La contrasenya de la clau mestra. L’ordre obre el ledger xifrat, de manera que et demana la contrasenya.
Una CLI de proveïdor instal·lada, al
PATHi amb la sessió iniciada.
El runtime emet l’ajuda, els avisos i els missatges en castellà.
Configura un proveïdor¶
aeat no emmagatzema credencials d’LLM i no té cap configuració de compte d’LLM separada. Executa una CLI de proveïdor que ja està instal·lada i autenticada al teu sistema. L’ordre de classificació accepta noms de proveïdor com ara claude, antigravity i codex; antigravity utilitza la CLI agy de Google, el successor admès de la CLI autònoma gemini, ja retirada.
Comproveu quines CLI de proveïdors són visibles a PATH amb aeat config check. Mostra cada proveïdor com a disponible o ausente amb la solució per a cada problema, al costat de les capacitats del servei de perfil. Això només informa de la detecció, no de l’inici de sessió del compte. El lector de visió local també hi apareix: mostra ausente fins que l’entorn d’execució respon. aeat config provision status informa amb detall de l’entorn d’execució i de cada model lector.
Instal·la i autentica el proveïdor amb la seva pròpia CLI o flux de compte. L’ordre d’inici de sessió i la configuració de retenció de dades pertanyen al proveïdor, no a aeat. Després fes una prova ràpida amb una previsualització, que no desa res:
aeat app ledger classify <transaction-id> --llm claudeaeat app ledger classify <transaction-id> --llm claudeUn proveïdor amb la sessió tancada fa que l’ordre es negui i transmeti l’error propi del proveïdor (per exemple La clasificacion por LLM fallo: claude CLI exited with 1: 'Not logged in ...'). Completa l’inici de sessió d’aquell proveïdor i torna-ho a provar.
Demana un suggeriment¶
Troba una fila que encara necessiti classificació i inspecciona-la. Després envia aquella fila al proveïdor per a una previsualització:
aeat app ledger list --filter classification=NOT_YET_PROCESSEDaeat app ledger list --filter classification=NOT_YET_PROCESSEDACCOUNTING LEDGER TRANSACTIONS id full_id date amount description IVA category review_status 71a5db2b 71a5db2bb891df295bee72544c40497d24d5c8cfc7edab745ce7339dcf8d6518 2026-02-10 1210 Cobro factura F-2026-001 servicios de consultoria pending e3eeac5e e3eeac5e306efe4e82a72896e92e7c236245ec85348834b2c10b120c67fe087d 2026-02-11 605 Compra de material de oficina proveedor local pending
aeat --format json app ledger view e3eeac5eaeat --format json app ledger view e3eeac5e{ "active_profile": "docs-sequence-sandbox", "command": "ledger.view", "notices": [], "result": { "bucket_id": "<bucket-id>", "review_status": "pending", "transaction": { "amount": "605", "attachment_ids": [], "booked_date": "2026-02-11", "business_classification": "NOT_YET_PROCESSED", "business_pct": null, "category_id": null, "classification_confidence": null, "classification_reason": "", "classified_at": null, "classified_by": "auto", "counterparty": "", "counterparty_country": null, "counterparty_identification_state": null, "created_at": "2026-04-01T09:00:00+00:00", "currency": "EUR", "date": "2026-02-11", "description": "Compra de material de oficina proveedor local", "direction": "OUTGOING", "fx_rate": null, "invoice_id": null, "irpf_category": null, "iva_amount": null, "iva_category": null, "iva_rate": null, "lifecycle_state": "ACTIVE", "m210_income_classification": null, "modified_at": "2026-04-01T09:00:00+00:00", "notes": "", "prorrata_reference": null, "purchase_invoice_evidence_id": null, "source_jurisdiction": null, "taxable_base": null, "transaction_id": "e3eeac5e306efe4e82a72896e92e7c236245ec85348834b2c10b120c67fe087d", "usage_ratio_id": null, "value_date": "2026-02-11", "value_in_eur": null }, "transaction_id": "e3eeac5e306efe4e82a72896e92e7c236245ec85348834b2c10b120c67fe087d" }, "schema_version": "2", "status": "success" }
Confirm the unclassified row is ready to send for a suggestion.
aeat app ledger classify e3eeac5e --llm claudeaeat app ledger classify e3eeac5e --llm claudeaeat envia aquella fila a la CLI del proveïdor seleccionat, que suggereix una classificació (BUSINESS, PERSONAL o MIXED), una categoria de despesa quan en pot triar una de la llista permesa, una confiança i una raó breu. En mode de previsualització no es desa res. Per obtenir el registre complet llegible per màquina, inclosos els camps provenance (llm:<provider>) i persisted, posa l’indicador JSON global abans de la subordre:
aeat --format json app ledger classify <transaction-id> --llm claudeaeat --format json app ledger classify <transaction-id> --llm claudeUtilitza la descripció, l’import, la direcció, la contrapart i els documents font de la fila per decidir si el suggeriment té sentit. Per als conceptes manuals subjacents, consulta Classifica els moviments.
Revisa, aplica, rebutja o sobreescriu¶
El bucle de revisió té quatre terminals:
Revisar. Previsualitza sense
--apply. No es desa res; si marxes, la fila queda inalterada.Aplicar. Persisteix el suggeriment després de revisar-lo. La sortida d’aplicar mostra l’id del moviment,
clasificado-por llm:<provider>i el nou estat de revisió; la procedència, la confiança i la raó es registren amb l’esdeveniment de classificació.Rebutjar. Registra que el model s’equivocava, amb la teva raó, com a esdeveniment d’auditoria; la fila queda sense classificar i el registre resta a l’historial.
--rejectno es pot combinar amb--apply. Previsualitzar i marxar tampoc no canvia res, però--rejectés el que escriu el rastre d’auditoria.Sobreescriure. Classifica manualment sempre que el suggeriment sigui incorrecte o incomplet. La classificació manual sempre guanya i preval sobre un valor derivat o aplicat pel model.
Aplicar i rebutjar executen tots dos el proveïdor, de manera que es mostren com a marcs de només visualització:
aeat app ledger classify <transaction-id> --llm claude --applyaeat app ledger classify <transaction-id> --llm claude --applyaeat app ledger classify <transaction-id> --llm claude --reject --reason \
this is personalaeat app ledger classify <transaction-id> --llm claude --reject --reason `
this is personalSobreescriure s’executa completament a la teva màquina. Classifica la fila a mà amb la classificació i la categoria que tries:
aeat --format json app ledger classify e3eeac5e --classification BUSINESS --category-id \
material_oficinaaeat --format json app ledger classify e3eeac5e --classification BUSINESS --category-id `
material_oficina{ "active_profile": "docs-sequence-sandbox", "command": "ledger.classify", "notices": [], "result": { "bucket_event_ids": [ "cf03296ca740dd5d6130ecd3349d24ea25d09a125819597f400d0489945da3ab" ], "bucket_id": "<bucket-id>", "review_status": "reviewed", "transaction": { "amount": "605", "attachment_ids": [], "booked_date": "2026-02-11", "business_classification": "BUSINESS", "business_pct": null, "category_id": "material_oficina", "classification_confidence": "1", "classification_reason": "aeat app ledger classify", "classified_at": "2026-04-01T09:00:00+00:00", "classified_by": "manual", "counterparty": "", "counterparty_country": null, "counterparty_identification_state": null, "created_at": "2026-04-01T09:00:00+00:00", "currency": "EUR", "date": "2026-02-11", "description": "Compra de material de oficina proveedor local", "direction": "OUTGOING", "fx_rate": null, "invoice_id": null, "irpf_category": null, "iva_amount": null, "iva_category": null, "iva_rate": null, "lifecycle_state": "ACTIVE", "m210_income_classification": null, "modified_at": "2026-04-01T09:00:00+00:00", "notes": "", "prorrata_reference": null, "purchase_invoice_evidence_id": null, "source_jurisdiction": null, "taxable_base": null, "transaction_id": "e3eeac5e306efe4e82a72896e92e7c236245ec85348834b2c10b120c67fe087d", "usage_ratio_id": null, "value_date": "2026-02-11", "value_in_eur": null }, "transaction_id": "e3eeac5e306efe4e82a72896e92e7c236245ec85348834b2c10b120c67fe087d" }, "schema_version": "2", "status": "success" }
Confirm the manual override classifies the row.
Si la fila és d’ús mixt, el suggeriment de l’LLM per si sol no n’hi ha prou; proporciona la proporció de negoci mitjançant el flux de treball d’ús mixt habitual. Després de correccions importants, torna a executar el preflight per al període:
aeat --format json app ledger preflight --year 2026 --period 1Taeat --format json app ledger preflight --year 2026 --period 1T{ "active_profile": "docs-sequence-sandbox", "command": "ledger.preflight", "notices": [], "result": { "bucket_id": "<bucket-id>", "checked_transaction_count": 2, "issues": [], "period": { "code": "1T", "filing_year": 2026 }, "ready": true }, "schema_version": "2", "status": "success" }
Confirm the period preflight reads ready after corrections.
Emplena els camps fiscals automàticament¶
Un suggeriment aplicat sense més desa la classificació i la categoria de despesa; no emplena els camps fiscals regulats. Afegeix --saturate per seleccionar també una categoria d’IVA i derivar la base imposable, el tipus d’IVA i l’import d’IVA. El model mai no inventa cap número: només selecciona la categoria d’IVA; el tipus prové del registre, i la base i l’import d’IVA es calculen a partir del total del moviment:
aeat app ledger classify <transaction-id> --llm claude --saturateaeat app ledger classify <transaction-id> --llm claude --saturateaeat app ledger classify <transaction-id> --llm claude --saturate --applyaeat app ledger classify <transaction-id> --llm claude --saturate --applyLa previsualització afegeix la categoria d’IVA seleccionada i, quan la categoria té un tipus espanyol, les xifres derivades; la base i l’IVA sempre sumen el total del moviment. Una categoria sense un tipus espanyol simple (una entrega intracomunitària, una compra amb inversió del subjecte passiu) mostra una nota en lloc de números, i les completes a mà. El model també pot declinar i retornar unknown en lloc d’endevinar; torna-ho a executar o tria tu mateix la categoria.
Quan ja coneixes la categoria d’IVA, o el model ha retornat unknown, classifica primer la fila com a negoci i després deixa que el sistema derivi els números sense cap --llm. Això deriva les xifres del tipus oficial exactament com ho fa la via del model i les registra com a derivades pel sistema. Només toca els camps d’IVA, i la fila ja ha d’estar classificada com a negoci o mixta:
aeat --format json app ledger classify e3eeac5e --iva-category domestic_general \
--saturateaeat --format json app ledger classify e3eeac5e --iva-category domestic_general `
--saturate{ "active_profile": "docs-sequence-sandbox", "command": "ledger.classify", "notices": [], "result": { "bucket_event_ids": [ "61e7203679a2689c9a11cf6a24ddaa370cfcbd16cad1a677ef3aa2dc14e52433", "017f5fb8270351a164fc4a36993989c06504305ae5dcf0d07335084d30267c75" ], "bucket_id": "<bucket-id>", "review_status": "reviewed", "transaction": { "amount": "605", "attachment_ids": [], "booked_date": "2026-02-11", "business_classification": "BUSINESS", "business_pct": null, "category_id": "material_oficina", "classification_confidence": "1", "classification_reason": "aeat app ledger classify --iva-category --saturate", "classified_at": "2026-04-01T09:00:00+00:00", "classified_by": "derived:iva-category", "counterparty": "", "counterparty_country": null, "counterparty_identification_state": null, "created_at": "2026-04-01T09:00:00+00:00", "currency": "EUR", "date": "2026-02-11", "description": "Compra de material de oficina proveedor local", "direction": "OUTGOING", "fx_rate": null, "invoice_id": null, "irpf_category": null, "iva_amount": "105", "iva_category": "domestic_general", "iva_rate": "0.21", "lifecycle_state": "ACTIVE", "m210_income_classification": null, "modified_at": "2026-04-01T09:00:00+00:00", "notes": "", "prorrata_reference": null, "purchase_invoice_evidence_id": null, "source_jurisdiction": null, "taxable_base": "500", "transaction_id": "e3eeac5e306efe4e82a72896e92e7c236245ec85348834b2c10b120c67fe087d", "usage_ratio_id": null, "value_date": "2026-02-11", "value_in_eur": null }, "transaction_id": "e3eeac5e306efe4e82a72896e92e7c236245ec85348834b2c10b120c67fe087d" }, "schema_version": "2", "status": "success" }
Confirm the derived IVA fields land without any provider.
Per sobreescriure qualsevol camp a mà, classifica manualment amb les xifres tu mateix. La base imposable més l’IVA ha de ser igual al total del moviment fins al cèntim:
aeat --format json app ledger classify {transaction_id} --classification BUSINESS \
--iva-category domestic_reduced --taxable-base 110.00 --iva-rate 0.10 --iva-amount \
11.00aeat --format json app ledger classify {transaction_id} --classification BUSINESS `
--iva-category domestic_reduced --taxable-base 110.00 --iva-rate 0.10 --iva-amount `
11.00{ "active_profile": "docs-sequence-sandbox", "command": "ledger.classify", "notices": [], "result": { "bucket_event_ids": [ "4709827e7a2d385fce18501344d5594c060f64e17ce7aefa6b7aa52adbb1a268", "2e292ca6b3c73c0340365ffeadcb123a7e8b8993a025610e198a38e59902c2d9" ], "bucket_id": "<bucket-id>", "review_status": "reviewed", "transaction": { "amount": "121", "attachment_ids": [], "booked_date": "2026-03-10", "business_classification": "BUSINESS", "business_pct": null, "category_id": null, "classification_confidence": "1", "classification_reason": "aeat app ledger classify", "classified_at": "2026-04-01T09:00:00+00:00", "classified_by": "manual", "counterparty": "", "counterparty_country": null, "counterparty_identification_state": null, "created_at": "2026-04-01T09:00:00+00:00", "currency": "EUR", "date": "2026-03-10", "description": "Compra tipo reducido", "direction": "OUTGOING", "fx_rate": null, "invoice_id": null, "irpf_category": null, "iva_amount": "11", "iva_category": "domestic_reduced", "iva_rate": "0.1", "lifecycle_state": "ACTIVE", "m210_income_classification": null, "modified_at": "2026-04-01T09:00:00+00:00", "notes": "", "prorrata_reference": null, "purchase_invoice_evidence_id": null, "source_jurisdiction": "ES", "taxable_base": "110", "transaction_id": "b0a6349c28d268e65a577b9709ab304661cd8f8a3f29a7acd5527adfd1f8740c", "usage_ratio_id": null, "value_date": null, "value_in_eur": null }, "transaction_id": "b0a6349c28d268e65a577b9709ab304661cd8f8a3f29a7acd5527adfd1f8740c" }, "schema_version": "2", "status": "success" }
Confirm the hand-entered IVA figures land on the row.
La categoria d’IRPF encara s’introdueix manualment a Classifica els moviments. Utilitza Revisa i proporciona les dades de càlcul quan un model informi més endavant de valors que falten.
Llegeix la factura adjunta¶
Adjunta una factura de compra o un rebut a un moviment (consulta Adjunta factures i rebuts) i, tot seguit, deixa que el model la llegeixi mentre classifica amb --read-evidence. El model tria la categoria de despesa i la situació d’IVA a partir del que llegeix; aeat deriva del registre cada import en euros. Com es llegeix el document depèn del fitxer:
Un PDF escanejat o una imatge el llegeix a la teva pròpia màquina un model de visió local. No surt res de la màquina, no cal cap reconeixement, no cal cap proveïdor
--llmi funciona en desplegaments de gestor i professionals.Un PDF amb capa de text té el seu text extret i enviat a un proveïdor al núvol (els mateixos proveïdors
--llm). Això envia el text fora de la teva màquina, de manera que està desactivat per defecte, barrat per als desplegaments de gestor i condicionat a un reconeixement explícit per execució.
Preferiu la via local a l’equip. Proveïu primer l’entorn d’execució local: instal·leu-lo amb aeat config provision install, inicieu-lo amb aeat config provision start i descarregueu el model de visió amb aeat config provision pull, limitat al rol de visió amb --role. Consulteu Configurar una estació de treball per veure la seqüència completa.
El model de visió predeterminat, qwen3-vl:2b, ocupa uns 2 GB i funciona en una GPU de consum o en CPU. Per fer servir un model més gran en una GPU amb prou espai, indiqueu-lo amb l’opció --model de l’ordre de descàrrega. Després classifiqueu a partir de la imatge adjunta, amb una previsualització primer. Anul·leu el model de visió per a una sola execució amb --vision-model qwen2.5vl:7b:
aeat app ledger classify <transaction-id> --read-evidence --saturateaeat app ledger classify <transaction-id> --read-evidence --saturateaeat app ledger classify <transaction-id> --read-evidence --saturate --applyaeat app ledger classify <transaction-id> --read-evidence --saturate --applyLes evidències es llegeixen només a l’equip. No hi ha cap ruta que enviï una factura fora de la màquina: una transacció sense evidència adjunta tampoc no envia res addicional, de manera que el proveïdor rep únicament la fila de la transacció, igual que en el flux de suggeriment simple.
Divideix una factura de múltiples línies automàticament¶
Quan el model llegeix una factura amb diverses línies a tipus o categories diferents, la previsualització afegeix una nota split recommended amb l’ordre exacta per separar-les. Cada línia ha d’esdevenir la seva pròpia entrada perquè el seu IVA deduïble i la despesa segons el tipus base es presentin de manera independent. Per actuar-hi en un sol pas, afegeix --auto-split. --auto-split requereix --read-evidence i no es pot combinar amb els indicadors de sobreescriptura manual:
aeat app ledger classify <transaction-id> --read-evidence --auto-splitaeat app ledger classify <transaction-id> --read-evidence --auto-splitaeat app ledger classify <transaction-id> --read-evidence --auto-split --applyaeat app ledger classify <transaction-id> --read-evidence --auto-split --applyUna factura de múltiples línies previsualitza un moviment fill per línia, cadascun amb la seva pròpia categoria, categoria d’IVA i base i IVA derivats del registre; els fills sumen exactament l’import original. Una factura d’una sola línia es classifica al mateix lloc sense divisió.
Com protegeix aeat els documents que llegeix¶
Els bytes de la factura viuen només en emmagatzematge segur xifrat. La lectura els desxifra a la memòria per a l’única crida i mai no els escriu en un fitxer temporal, un registre ni una memòria cau.
Una lectura escanejada o d’imatge envia la imatge només al model local mitjançant una connexió de loopback a la teva màquina. No surt res de la màquina.
Una lectura amb capa de text envia només el text extret, i només a un proveïdor al núvol que hagis permès i reconegut explícitament. Mai no envia els bytes del PDF.
El model selecciona només la classificació, la categoria, la categoria d’IVA i una proporció de divisió.
aeatderiva del registre cada tipus, base i import d’IVA, i es nega a persistir un resultat les parts del qual no quadren. Quan l’IVA imprès no coincideix amb l’IVA calculat, la revisió mostra un avís perquè puguis comprovar-ho abans de presentar.
Configuració de desplegament de l’evidència¶
El consentiment i la configuració del model són configuració de desplegament, desactivats per defecte i administrats fora d’aquest flux de treball. La llista completa és a la referència de sobreescriptures d’entorn.
Consulta com s’ha produït cada suggeriment¶
Cada resultat aplicat registra com s’ha produït, de manera que una revisió posterior mostra la font:
llm:local-vision:<model>: llegit a la mateixa màquina pel model de visió local.llm:<provider>:<model>: classificat per un proveïdor al núvol.derived:iva-category: has triat la categoria d’IVA iaeatha derivat la resta.manual: has establert la classificació a mà.
Inspecciona un moviment i el seu historial en qualsevol moment:
aeat app ledger view e3eeac5eaeat app ledger view e3eeac5eID e3eeac5e306efe4e82a72896e92e7c236245ec85348834b2c10b120c67fe087d Date 2026-02-11 Value date 2026-02-11 Amount 605 Currency EUR Direction OUTGOING Description Compra de material de oficina proveedor local Counterparty - Classification NOT_YET_PROCESSED Business % - Category - Usage ratio id - Taxable base - IVA rate - IVA amount - IVA category - Established in - VAT identified in - IRPF category - Notes - Purchase invoice evidence - Attachments - Lifecycle state ACTIVE Classified by auto Classified at - Classification confidence - Classification reason - Review status pending
aeat --format json app ledger history e3eeac5eaeat --format json app ledger history e3eeac5e{ "active_profile": "docs-sequence-sandbox", "command": "ledger.history", "notices": [], "result": { "bucket_id": "<bucket-id>", "event_count": 1, "events": [ { "actor": "<profile-id>", "bucket_id": "<bucket-id>", "event_id": "216049abc14de7287f01ae4f31b75e164a3ae520c7ae88ea7bc6b9ac017cef30", "event_type": "ledger.transaction.imported", "object_id": "e3eeac5e306efe4e82a72896e92e7c236245ec85348834b2c10b120c67fe087d", "object_type": "ledger_transaction", "occurred_at": "2026-04-01T09:00:00Z", "payload": { "import_batch_id": "644ceb0a0aa9829b9cd0bf4d3a2ba43ce73f7ab6b333d46776496818650a0816", "imported_count": "2", "provider_name": "CSV provider", "skipped_count": "0", "source_command": "aeat app ledger import", "source_format": "csv", "source_row_index": "3" }, "payload_version": 1 } ], "transaction_id": "e3eeac5e306efe4e82a72896e92e7c236245ec85348834b2c10b120c67fe087d" }, "schema_version": "2", "status": "success" }
Confirm the transaction's history records its events.
Límits i alternatives per lots¶
La ruta amb LLM funciona només amb una transacció; no es pot combinar amb --file ni amb indicadors manuals --classification. Per a treball per lots feu servir la ruta manual basada en CSV (aeat app ledger classify --file ./classifications.csv) o regles deterministes desades (aeat app ledger rule add, després rule apply --dry-run i tot seguit rule apply); totes dues s’expliquen a Classificar transaccions.
Límit de privadesa¶
La classificació per LLM crida la CLI del proveïdor seleccionat a la teva màquina. Aquesta CLI pot enviar dades del prompt al servei al núvol del proveïdor, segons com funcioni aquell proveïdor i com estigui configurat el teu compte. Tracta les descripcions de moviments, les contraparts, els imports, les categories i qualsevol context de perfil del prompt com a dades de contribuent. No utilitzis dades de producció amb un proveïdor d’LLM tret que la configuració del teu proveïdor i la política de privadesa ho permetin.