Add store-server.gbai: barcode scan, image search, NCM, shipping, auto-register
This commit is contained in:
parent
c11160d37d
commit
d6b9016564
12 changed files with 179 additions and 20 deletions
12
store-server.gbai/store-server.gbdialog/auto-register.bas
Normal file
12
store-server.gbai/store-server.gbdialog/auto-register.bas
Normal file
|
|
@ -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
|
||||||
|
|
@ -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
|
||||||
13
store-server.gbai/store-server.gbdialog/classify-product.bas
Normal file
13
store-server.gbai/store-server.gbdialog/classify-product.bas
Normal file
|
|
@ -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
|
||||||
35
store-server.gbai/store-server.gbdialog/enrich-product.bas
Normal file
35
store-server.gbai/store-server.gbdialog/enrich-product.bas
Normal file
|
|
@ -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
|
||||||
14
store-server.gbai/store-server.gbdialog/get-ncm.bas
Normal file
14
store-server.gbai/store-server.gbdialog/get-ncm.bas
Normal file
|
|
@ -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
|
||||||
30
store-server.gbai/store-server.gbdialog/scan-barcode.bas
Normal file
30
store-server.gbai/store-server.gbdialog/scan-barcode.bas
Normal file
|
|
@ -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
|
||||||
|
|
@ -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
|
||||||
16
store-server.gbai/store-server.gbdialog/search-products.bas
Normal file
16
store-server.gbai/store-server.gbdialog/search-products.bas
Normal file
|
|
@ -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
|
||||||
6
store-server.gbai/store-server.gbot/config.csv
Normal file
6
store-server.gbai/store-server.gbot/config.csv
Normal file
|
|
@ -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
|
||||||
|
|
|
@ -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
|
|
||||||
|
|
@ -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
|
|
||||||
|
|
@ -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
|
|
||||||
Loading…
Add table
Reference in a new issue