Skip to content

feat: get_constraints compatto + search_constraint_values per ridurre consumo token #31

Description

@aborruso

@patrunomeister — per questa modifica aspetto il tuo consenso prima di procedere.

Problema

Quando un LLM chiede dati ISTAT, il tool get_constraints restituisce tutti i valori di tutte le dimensioni con descrizioni — per il dataflow coltivazioni sono ~14.7k token e 456 righe.

L'LLM ha bisogno solo di trovare 2-3 codici (es. "Sicilia" e "olio di oliva"), ma riceve l'intera lista di 143 territori, 244 colture, ecc. Questo:

  • Riempie il contesto rapidamente (warning "Large MCP response")
  • Costringe l'LLM a workaround per parsare risposte troppo grandi
  • Spreca token inutilmente

Soluzione proposta

Non cambia nulla lato API o cache — i dati vengono scaricati e cachati esattamente come ora. Cambia solo cosa mostriamo all'LLM.

Prima (attuale)

get_constraints("101_1015_DF_DCSP_COLTIVAZIONI_1")
→ 14.7k token, 456 righe con tutti i valori:

  REF_AREA: IT=Italia, IT108=Monza, IT109=Fermo, ITC=Nord-ovest, ITC1=Piemonte,
            ITC11=Torino, ITC12=Vercelli, ... (143 valori)
  TYPE_OF_CROP: APPLE=mele, BARLEY=orzo, CHERRY=ciliegie, ... (244 valori)
  ...

Dopo (proposta)

Step 1get_constraints restituisce solo un riepilogo compatto (~200 token):

{
  "dimensions": [
    {"dimension": "FREQ", "codelist": "CL_FREQ", "value_count": 1},
    {"dimension": "REF_AREA", "codelist": "CL_ITTER107", "value_count": 143},
    {"dimension": "DATA_TYPE", "codelist": "CL_TIPO_DATO5", "value_count": 8},
    {"dimension": "TYPE_OF_CROP", "codelist": "CL_AGRI_MADRE", "value_count": 244},
    {"dimension": "DESTINATION_WINEGRAPES", "codelist": "CL_DESTINAZIONEUVA", "value_count": 1},
    {"dimension": "TIME_PERIOD", "StartPeriod": "2000", "EndPeriod": "2024"}
  ]
}

Step 2 — L'LLM cerca solo quello che gli serve con il nuovo tool search_constraint_values:

search_constraint_values(dataflow_id="...", dimension="REF_AREA", search="sicil")
→ ITG1: Sicilia (~1 KB)

search_constraint_values(dataflow_id="...", dimension="TYPE_OF_CROP", search="oliv")
→ OLIVO: oil olives, PRESIL: olive oil (~1 KB)

Step 3get_data con i codici trovati (come prima).

Confronto token

Step Prima Dopo
get_constraints ~14.700 token ~200 token
Ricerca codici (inclusa sopra) ~500 token (2 search)
Totale metadati ~14.700 token ~700 token

Riduzione: ~95% del consumo token per i metadati.

Cosa NON cambia

  • La chiamata REST ad availableconstraint resta identica
  • La cache resta identica (tutti i valori vengono salvati)
  • get_data resta identico
  • get_structure, get_codelist_description restano identici

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions