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:
@@ -13,7 +13,7 @@ function listTools() {
|
||||
{
|
||||
name: 'query_wms_entities',
|
||||
description: `Query WMS entities using LINQ expressions. Returns rows (up to 1000).
|
||||
Uses QueryExecute with QueryType=Reading — status fields are STRINGS (enum names, not integers).
|
||||
Uses QueryExecute with QueryType=Reading by default — status fields are STRINGS (enum names, not integers). Other contexts via query_type (opt-in, see the parameter warning).
|
||||
Common entities: Products, Containers, Tasks, Stocks, ProductLocations, Locations, InboundOrders, OutboundOrders, Receptions, Accounts, Suppliers, Kits, Alias. Full list via get_entity_metadata.
|
||||
entity_type accepts the AD entity name (Container) or the TableName (Containers), case-insensitive — resolved via the Metadata API.
|
||||
|
||||
@@ -44,6 +44,11 @@ Never guess enum string values — they differ between Reading and Writing model
|
||||
description: 'Maximum results to return (default: 100, max: 1000)',
|
||||
default: 100,
|
||||
},
|
||||
query_type: {
|
||||
type: 'number',
|
||||
description: 'QueryContextType (default: 0 = Reading — status fields are strings, keep it unless you know why). Opt-in: 1 = Writing (status fields become ENUMS — string comparisons like == "Release" FAIL), 2 = DataWarehouse (often not configured), 3 = Metrics (different data model). Entity names unknown to the Reading metadata are passed through as-is with a warning when query_type != 0.',
|
||||
default: 0,
|
||||
},
|
||||
},
|
||||
required: ['entity_type'],
|
||||
},
|
||||
@@ -96,6 +101,11 @@ Verified values (curl-tested):
|
||||
type: 'string',
|
||||
description: 'Optional LINQ filter condition. Status fields are strings (enum names from Reading model). Always verify enum values via docs://entities/ before use.',
|
||||
},
|
||||
query_type: {
|
||||
type: 'number',
|
||||
description: 'QueryContextType (default: 0 = Reading — status fields are strings, keep it unless you know why). Opt-in: 1 = Writing (status fields become ENUMS — string comparisons like == "Release" FAIL), 2 = DataWarehouse (often not configured), 3 = Metrics (different data model). Entity names unknown to the Reading metadata are passed through as-is with a warning when query_type != 0.',
|
||||
default: 0,
|
||||
},
|
||||
},
|
||||
required: ['entity_type'],
|
||||
},
|
||||
@@ -169,15 +179,16 @@ async function executeTool(name, args) {
|
||||
* Tool: query_wms_entities
|
||||
*/
|
||||
async function queryWmsEntities(args) {
|
||||
const { entity_type, select_expression = 'z => z', filter, limit = 100 } = args;
|
||||
const { entity_type, select_expression = 'z => z', filter, limit = 100, query_type = 0 } = args;
|
||||
|
||||
console.error(`[WMSQueryTools] Querying ${entity_type}: limit=${limit}`);
|
||||
console.error(`[WMSQueryTools] Querying ${entity_type}: limit=${limit} query_type=${query_type}`);
|
||||
|
||||
const result = await wmsQueryService.queryEntities(
|
||||
entity_type,
|
||||
select_expression,
|
||||
filter,
|
||||
limit
|
||||
limit,
|
||||
query_type
|
||||
);
|
||||
|
||||
return {
|
||||
@@ -195,11 +206,11 @@ async function queryWmsEntities(args) {
|
||||
* Tool: count_wms_entities
|
||||
*/
|
||||
async function countWmsEntities(args) {
|
||||
const { entity_type, filter } = args;
|
||||
const { entity_type, filter, query_type = 0 } = args;
|
||||
|
||||
console.error(`[WMSQueryTools] Counting ${entity_type}${filter ? ` where ${filter}` : ''}`);
|
||||
console.error(`[WMSQueryTools] Counting ${entity_type}${filter ? ` where ${filter}` : ''} query_type=${query_type}`);
|
||||
|
||||
const result = await wmsQueryService.countEntities(entity_type, filter || null);
|
||||
const result = await wmsQueryService.countEntities(entity_type, filter || null, query_type);
|
||||
|
||||
return {
|
||||
content: [{
|
||||
|
||||
Reference in New Issue
Block a user