diff --git a/store-server.gbai/store-server.gbdialog/auto-register.bas b/store-server.gbai/store-server.gbdialog/auto-register.bas new file mode 100644 index 0000000..1a98963 --- /dev/null +++ b/store-server.gbai/store-server.gbdialog/auto-register.bas @@ -0,0 +1,12 @@ +PARAM query AS STRING + +existing = SEARCH PRODUCTS query, 1 +IF LEN(existing) > 0 THEN + RETURN existing[0] +END IF + +info = LLM "Extract product info: " + query + ". Return JSON {name, category, brand, description}" +info.is_active = true + +SAVE "products", info +RETURN info diff --git a/store-server.gbai/store-server.gbdialog/calculate-shipping.bas b/store-server.gbai/store-server.gbdialog/calculate-shipping.bas new file mode 100644 index 0000000..41e34d8 --- /dev/null +++ b/store-server.gbai/store-server.gbdialog/calculate-shipping.bas @@ -0,0 +1,41 @@ +PARAM product_id AS STRING +PARAM quantity AS INTEGER + +product = PRODUCT product_id +IF NOT product THEN + RETURN {error: "Product not found"} +END IF + +IF NOT quantity THEN + quantity = 1 +END IF + +dimensions = { + length: product.length, + width: product.width, + height: product.height, + weight: product.gross_weight +} + +IF NOT dimensions.weight THEN + dimensions = LLM "Estimate shipping dimensions for: " + product.name + ". Return JSON {length_cm, width_cm, height_cm, weight_kg}" +END IF + +volume = dimensions.length * dimensions.width * dimensions.height * quantity +volumetric_weight = volume / 5000 +billable = MAX(dimensions.weight * quantity, volumetric_weight) + +shipping = { + product_id: product_id, + quantity: quantity, + dimensions: dimensions, + volume_cm3: volume, + billable_weight_kg: billable, + options: [ + {carrier: "Ground", days: "5-7", cost: 5.99 + billable * 1.5}, + {carrier: "Express", days: "2-3", cost: 12.99 + billable * 2.5}, + {carrier: "Overnight", days: "1", cost: 24.99 + billable * 4.0} + ] +} + +RETURN shipping diff --git a/store-server.gbai/store-server.gbdialog/classify-product.bas b/store-server.gbai/store-server.gbdialog/classify-product.bas new file mode 100644 index 0000000..9bf9b88 --- /dev/null +++ b/store-server.gbai/store-server.gbdialog/classify-product.bas @@ -0,0 +1,13 @@ +PARAM query AS STRING + +categories = FIND "categories" +similar = SEARCH PRODUCTS query, 5 +result = LLM "Classify '" + query + "' into: " + categories + ". Similar: " + similar + ". Return JSON {category_id, name, confidence, brand, type}" + +cached = FIND "product_cache", "query=" + query +IF cached THEN + RETURN cached.result +END IF + +SAVE "product_cache", {query: query, result: result} +RETURN result diff --git a/store-server.gbai/store-server.gbdialog/enrich-product.bas b/store-server.gbai/store-server.gbdialog/enrich-product.bas new file mode 100644 index 0000000..295ace4 --- /dev/null +++ b/store-server.gbai/store-server.gbdialog/enrich-product.bas @@ -0,0 +1,35 @@ +PARAM product_id AS STRING + +product = PRODUCT product_id +IF NOT product THEN + RETURN {error: "Product not found"} +END IF + +IF product.description AND product.brand THEN + RETURN product +END IF + +query = product.name + " " + product.category +links = SCRAPE_ALL "https://www.google.com/search?q=" + query, "a" +links = FIRST links, 10 + +enriched = [] +FOR i = 0 TO 2 + IF links[i] THEN + content = SCRAPE links[i], "body" + PUSH enriched, content + END IF +NEXT + +result = LLM "Analyze these product descriptions: " + enriched + ". Create best description for: " + product.name + ". Return JSON {description, brand, material, features}" + +UPDATE "products", product_id, { + description: result.description, + brand: result.brand, + material: result.material, + external_metadata: result +} + +product.description = result.description +product.brand = result.brand +RETURN product diff --git a/store-server.gbai/store-server.gbdialog/get-ncm.bas b/store-server.gbai/store-server.gbdialog/get-ncm.bas new file mode 100644 index 0000000..1ae6eae --- /dev/null +++ b/store-server.gbai/store-server.gbdialog/get-ncm.bas @@ -0,0 +1,14 @@ +PARAM product_id AS STRING + +product = PRODUCT product_id +IF NOT product THEN + RETURN {error: "Product not found"} +END IF + +IF product.tax_code THEN + RETURN {tax_code: product.tax_code, tax_class: product.tax_class} +END IF + +info = LLM "Get NCM/tax classification for: " + product.name + " " + product.category + ". Return JSON {tax_code, tax_class, description}" +UPDATE "products", product_id, {tax_code: info.tax_code, tax_class: info.tax_class} +RETURN info diff --git a/store-server.gbai/store-server.gbdialog/scan-barcode.bas b/store-server.gbai/store-server.gbdialog/scan-barcode.bas new file mode 100644 index 0000000..556caf1 --- /dev/null +++ b/store-server.gbai/store-server.gbdialog/scan-barcode.bas @@ -0,0 +1,30 @@ +PARAM image AS STRING + +barcode = SCAN BARCODE image +IF NOT barcode THEN + RETURN {error: "No barcode found"} +END IF + +ean = barcode.data +cached = FIND "products", "global_trade_number=" + ean +IF cached THEN + RETURN cached +END IF + +data = GET "https://world.openfoodfacts.org/api/v0/product/" + ean + ".json" +IF data.product THEN + product = { + name: data.product.product_name, + brand: data.product.brands, + global_trade_number: ean, + description: data.product.generic_name, + category: data.product.categories, + net_weight: data.product.quantity + } +ELSE + product = LLM "Search product info for EAN: " + ean + ". Return JSON {name, brand, description, category}" + product.global_trade_number = ean +END IF + +SAVE "products", product +RETURN product diff --git a/store-server.gbai/store-server.gbdialog/scan-product-image.bas b/store-server.gbai/store-server.gbdialog/scan-product-image.bas new file mode 100644 index 0000000..3f9072e --- /dev/null +++ b/store-server.gbai/store-server.gbdialog/scan-product-image.bas @@ -0,0 +1,12 @@ +PARAM image AS STRING + +description = SEE image +similar = SEARCH PRODUCTS description, 5 + +IF LEN(similar) > 0 THEN + RETURN similar[0] +END IF + +product = LLM "Extract product info from: " + description + ". Return JSON {name, brand, category, color, material}" +SAVE "products", product +RETURN product diff --git a/store-server.gbai/store-server.gbdialog/search-products.bas b/store-server.gbai/store-server.gbdialog/search-products.bas new file mode 100644 index 0000000..867d62b --- /dev/null +++ b/store-server.gbai/store-server.gbdialog/search-products.bas @@ -0,0 +1,16 @@ +PARAM query AS STRING + +cached = FIND "search_cache", "query=" + query +IF cached THEN + RETURN cached.result +END IF + +result = SEARCH PRODUCTS query, 10 +IF LEN(result) = 0 THEN + web = SCRAPE_ALL "https://www.google.com/search?q=" + query + "+product", ".g" + result = LLM "Extract products from: " + web + ". Return JSON [{name, price, description}]" +END IF + +enhanced = LLM "Add descriptions: " + result + ". Return JSON [{id, name, price, description, stock}]" +SAVE "search_cache", {query: query, result: enhanced} +RETURN enhanced diff --git a/store-server.gbai/store-server.gbot/config.csv b/store-server.gbai/store-server.gbot/config.csv new file mode 100644 index 0000000..1ba2d47 --- /dev/null +++ b/store-server.gbai/store-server.gbot/config.csv @@ -0,0 +1,6 @@ +name,value +bot-name,store-server +bot-description,Store Server API - Product search, classification, barcode scanning and enrichment +botmodels-enabled,true +llm-provider,openai +llm-model,gpt-4o diff --git a/store.gbai/store.gbdialog/calculate-shipping.bas b/store.gbai/store.gbdialog/calculate-shipping.bas deleted file mode 100644 index 787ac1d..0000000 --- a/store.gbai/store.gbdialog/calculate-shipping.bas +++ /dev/null @@ -1,7 +0,0 @@ -PARAM product_id AS INTEGER -PARAM quantity AS INTEGER OPTIONAL - -product = PRODUCT product_id -shipping = LLM "Calculate shipping for: " + product + ", qty: " + quantity + ". Return JSON {dimensions: {length_cm, width_cm, height_cm}, weight_kg, volume_cm3, shipping_options: [{carrier, cost, days}]}" - -RETURN shipping diff --git a/store.gbai/store.gbdialog/classify-product.bas b/store.gbai/store.gbdialog/classify-product.bas deleted file mode 100644 index 757fb74..0000000 --- a/store.gbai/store.gbdialog/classify-product.bas +++ /dev/null @@ -1,7 +0,0 @@ -PARAM query AS STRING - -categories = FIND "Categories.csv" -result = SEARCH PRODUCTS query, 5 -enhanced = LLM "Classify '" + query + "' into categories: " + categories + ". Similar products: " + result + ". Return JSON {category_id, category_name, confidence, attributes: {brand, type}}" - -RETURN enhanced diff --git a/store.gbai/store.gbdialog/search-products.bas b/store.gbai/store.gbdialog/search-products.bas deleted file mode 100644 index cb914f0..0000000 --- a/store.gbai/store.gbdialog/search-products.bas +++ /dev/null @@ -1,6 +0,0 @@ -PARAM query AS STRING - -result = SEARCH PRODUCTS query, 10 -enhanced = LLM "Enhance these product results with descriptions: " + result + ". Return JSON array with id, name, price, description" - -RETURN enhanced