L4.1 : expose query_type sur les outils de requête (D25)
QueryType était figé à 0 en dur dans executeQuery/executeScalarQuery : le modèle Writing, opérationnel et mesuré, était inatteignable. Paramètre query_type (défaut 0) sur call_query_api, query_wms_entities, count_wms_entities — get_entity_schema et search_wms_data restent des raccourcis Reading. D3 reste la règle par défaut : la bascule est un opt-in, avertie dans les descriptions d'outils (statuts en énumérations en Writing). Garde de valeur assertValidQueryType dans le code (le wrapper D23 ne valide pas les valeurs), avant tout réseau. En query_type != 0, un nom inconnu du Metadata Reading passe tel quel avec warning (allowUnknown du resolver) — conservé aussi dans la réponse d'erreur si le WMS échoue ensuite. Acté en D25 ; CLAUDE.md nuancé, L4.1 retiré de la ROADMAP (reliquat : exploration Metrics, rapport à part). Vérifications rejouées via le protocole (LIMAGRAIN / LIMAGRAI2512) : - call_query_api(Products, query_type:1, limit:1) -> success, 1 ligne, queryType:1 dans la réponse. - call_query_api(Products, query_type:3) -> erreur structurée contenant 'ApplicationMetricDataContext' ne contient pas de définition pour 'Products'. - call_query_api(Products, query_type:7) -> erreur locale nommant les 4 contextes, aucun [API] POST/GET dans stderr. - query_wms_entities(Container, limit:1) sans query_type -> comportement inchangé (resolvedTableName Containers, Reading, pas de champ queryType). - call_query_api(FooBar123, query_type:1) -> transmis tel quel (payload QueryType:1 Expression Context.FooBar123...), erreur WMS ApplicationWritingRepository + warning de résolution dans la réponse. - count_wms_entities(Product, query_type:1) -> count 51145 (~51160). Baseline : tools/list 23, resources 6, rejet D23 d'un paramètre inconnu OK. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
@@ -119,15 +119,22 @@ function suggestClosest(input, limit = 5) {
|
||||
* Résout un nom d'entité vers son TableName.
|
||||
*
|
||||
* @param {string} entityType - Name AD ou TableName, insensible à la casse
|
||||
* @param {object} [options]
|
||||
* @param {boolean} [options.allowUnknown=false] - Un nom inconnu du Reading
|
||||
* passe tel quel avec un warning au lieu d'échouer. Utilisé quand
|
||||
* query_type != 0 (D25) : la table est construite sur le Metadata Reading,
|
||||
* or le modèle Writing/Metrics peut contenir des entités hors Reading.
|
||||
* @returns {Promise<{tableName: string, warning?: string}>}
|
||||
* - nom connu : { tableName } (le TableName exact)
|
||||
* - Metadata injoignable : { tableName: entityType, warning } — on laisse
|
||||
* passer le nom tel quel (comportement historique) plutôt que de tout
|
||||
* bloquer, et on le dit dans la réponse
|
||||
* @throws {Error} nom inconnu du modèle Reading — AVANT tout appel réseau de
|
||||
* requête, avec suggestions proches et renvoi vers get_entity_metadata
|
||||
* @throws {Error} nom inconnu du modèle Reading (sauf allowUnknown) — AVANT
|
||||
* tout appel réseau de requête, avec suggestions proches et renvoi vers
|
||||
* get_entity_metadata
|
||||
*/
|
||||
async function resolveEntityType(entityType) {
|
||||
async function resolveEntityType(entityType, options = {}) {
|
||||
const { allowUnknown = false } = options;
|
||||
if (!entityType || typeof entityType !== 'string' || entityType.trim() === '') {
|
||||
throw new Error('entity_type est requis. Utilisez get_entity_metadata pour la liste des entités interrogeables.');
|
||||
}
|
||||
@@ -150,6 +157,15 @@ async function resolveEntityType(entityType) {
|
||||
|
||||
const suggestions = suggestClosest(trimmed);
|
||||
const closest = suggestions.length > 0 ? ` Proches : ${suggestions.join(', ')}.` : '';
|
||||
|
||||
if (allowUnknown) {
|
||||
console.error(`[EntityResolver] "${trimmed}" unknown to Reading metadata, passing through (allowUnknown)`);
|
||||
return {
|
||||
tableName: trimmed,
|
||||
warning: `"${trimmed}" est inconnu du modèle Reading (Metadata) ; il est transmis tel quel car query_type != 0 — le contexte demandé peut contenir des entités hors Reading.${closest}`,
|
||||
};
|
||||
}
|
||||
|
||||
throw new Error(
|
||||
`"${trimmed}" n'existe pas dans le modèle Reading.${closest} ` +
|
||||
`${tableNames.length} entités disponibles — utilisez get_entity_metadata pour la liste.`
|
||||
|
||||
Reference in New Issue
Block a user