File size: 11,736 Bytes
edf6940 75f5dad edf6940 7480421 75f5dad a05cc02 edf6940 8ba1576 edf6940 75f5dad edf6940 75f5dad edf6940 75f5dad 8ba1576 edf6940 8ba1576 bdfbcee 8ba1576 75f5dad 8ba1576 03755da bdfbcee 03755da bdfbcee 75f5dad b60320f edf6940 8ba1576 03755da edf6940 8ba1576 edf6940 8ba1576 edf6940 8ba1576 edf6940 8ba1576 7480421 8ba1576 75f5dad 7480421 75f5dad 7480421 75f5dad 7480421 75f5dad 7480421 edf6940 8ba1576 75f5dad 7480421 aef6bb5 75f5dad 7480421 75f5dad 7480421 75f5dad 7480421 75f5dad 7480421 aef6bb5 8ba1576 75f5dad edf6940 8ba1576 edf6940 8ba1576 edf6940 8ba1576 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 |
"""Smart warehouse stock finder using GPT-5's intelligence"""
import requests
import re
import os
import json
def get_warehouse_stock_smart(user_message, previous_result=None):
"""Let GPT-5 intelligently find products or filter by warehouse"""
OPENAI_API_KEY = os.getenv("OPENAI_API_KEY")
# Check if user is asking about specific warehouse
warehouse_keywords = {
'caddebostan': 'Caddebostan',
'ortaköy': 'Ortaköy',
'ortakoy': 'Ortaköy',
'alsancak': 'Alsancak',
'izmir': 'Alsancak',
'bahçeköy': 'Bahçeköy',
'bahcekoy': 'Bahçeköy'
}
user_lower = user_message.lower()
asked_warehouse = None
for keyword, warehouse in warehouse_keywords.items():
if keyword in user_lower:
asked_warehouse = warehouse
break
# Get XML data with retry
xml_text = None
for attempt in range(3): # Try 3 times
try:
url = 'https://video.trek-turkey.com/bizimhesap-warehouse-xml-b2b-api-v2.php'
timeout_val = 10 + (attempt * 5) # Increase timeout on each retry: 10, 15, 20
response = requests.get(url, verify=False, timeout=timeout_val)
xml_text = response.text
print(f"DEBUG - XML fetched: {len(xml_text)} characters (attempt {attempt+1})")
break
except requests.exceptions.Timeout:
print(f"XML fetch timeout (attempt {attempt+1}/3, timeout={timeout_val}s)")
if attempt == 2:
print("All attempts failed - timeout")
return None
except Exception as e:
print(f"XML fetch error: {e}")
return None
# Extract just product blocks to reduce token usage
product_pattern = r'<Product>(.*?)</Product>'
all_products = re.findall(product_pattern, xml_text, re.DOTALL)
# Create a simplified product list for GPT
products_summary = []
for i, product_block in enumerate(all_products):
name_match = re.search(r'<ProductName><!\[CDATA\[(.*?)\]\]></ProductName>', product_block)
variant_match = re.search(r'<ProductVariant><!\[CDATA\[(.*?)\]\]></ProductVariant>', product_block)
if name_match:
# Check warehouse stock for this product
warehouses_with_stock = []
warehouse_regex = r'<Warehouse>.*?<Name><!\[CDATA\[(.*?)\]\]></Name>.*?<Stock>(.*?)</Stock>.*?</Warehouse>'
warehouses = re.findall(warehouse_regex, product_block, re.DOTALL)
for wh_name, wh_stock in warehouses:
try:
if int(wh_stock.strip()) > 0:
warehouses_with_stock.append(wh_name)
except:
pass
product_info = {
"index": i,
"name": name_match.group(1),
"variant": variant_match.group(1) if variant_match else "",
"warehouses": warehouses_with_stock
}
products_summary.append(product_info)
# If user is asking about specific warehouse, include that in prompt
warehouse_filter = ""
if asked_warehouse:
warehouse_filter = f"\nIMPORTANT: User is asking specifically about {asked_warehouse} warehouse. Only return products available in that warehouse."
# Let GPT-5 find ALL matching products
smart_prompt = f"""User is asking: "{user_message}"
Find ALL products that match this query from the list below.
If user asks about specific size (S, M, L, XL, XXL, SMALL, MEDIUM, LARGE, X-LARGE), return only that size.
If user asks generally (without size), return ALL variants of the product.
{warehouse_filter}
IMPORTANT BRAND AND PRODUCT TYPE RULES:
- GOBIK: Spanish textile brand we import. When user asks about "gobik", return ALL products with "GOBIK" in the name.
- Product names contain type information: FORMA (jersey/cycling shirt), TAYT (tights), İÇLİK (base layer), YAĞMURLUK (raincoat), etc.
- Understand Turkish/English terms:
* "erkek forma" / "men's jersey" -> Find products with FORMA in name
* "tayt" / "tights" -> Find products with TAYT in name
* "içlik" / "base layer" -> Find products with İÇLİK in name
* "yağmurluk" / "raincoat" -> Find products with YAĞMURLUK in name
- Gender: UNISEX means for both men and women. If no gender specified, it's typically men's.
- Be smart: "erkek forma" should find all FORMA products (excluding women-specific if any)
Products list (with warehouse availability):
{json.dumps(products_summary, ensure_ascii=False, indent=2)}
Return index numbers of ALL matching products as comma-separated list (e.g., "5,8,12,15").
If no products found, return: -1
Examples:
- "madone sl 6 var mı" -> Return ALL Madone SL 6 variants
- "erkek forma" -> Return all products with FORMA in name
- "gobik tayt" -> Return all GOBIK products with TAYT in name
- "içlik var mı" -> Return all products with İÇLİK in name
- "gobik erkek forma" -> Return all GOBIK products with FORMA in name
- "yağmurluk medium" -> Return all YAĞMURLUK products in MEDIUM size"""
headers = {
"Content-Type": "application/json",
"Authorization": f"Bearer {OPENAI_API_KEY}"
}
payload = {
"model": "gpt-5-chat-latest",
"messages": [
{"role": "system", "content": "You are a product matcher. Find ALL matching products. Return only index numbers."},
{"role": "user", "content": smart_prompt}
],
"temperature": 0,
"max_tokens": 100
}
try:
response = requests.post(
"https://api.openai.com/v1/chat/completions",
headers=headers,
json=payload,
timeout=10
)
if response.status_code == 200:
result = response.json()
indices_str = result['choices'][0]['message']['content'].strip()
if indices_str == "-1":
return ["Ürün bulunamadı"]
try:
# Parse multiple indices
indices = [int(idx.strip()) for idx in indices_str.split(',')]
# Collect all matching products
all_variants = []
warehouse_stock = {}
for idx in indices:
if 0 <= idx < len(all_products):
product_block = all_products[idx]
# Get product name and variant
name_match = re.search(r'<ProductName><!\[CDATA\[(.*?)\]\]></ProductName>', product_block)
variant_match = re.search(r'<ProductVariant><!\[CDATA\[(.*?)\]\]></ProductVariant>', product_block)
if name_match:
product_name = name_match.group(1)
variant = variant_match.group(1) if variant_match else ""
# Track this variant
variant_info = {
'name': product_name,
'variant': variant,
'warehouses': []
}
# Get warehouse stock
warehouse_regex = r'<Warehouse>.*?<Name><!\[CDATA\[(.*?)\]\]></Name>.*?<Stock>(.*?)</Stock>.*?</Warehouse>'
warehouses = re.findall(warehouse_regex, product_block, re.DOTALL)
for wh_name, wh_stock in warehouses:
try:
stock = int(wh_stock.strip())
if stock > 0:
display_name = format_warehouse_name(wh_name)
variant_info['warehouses'].append({
'name': display_name,
'stock': stock
})
# Track total stock per warehouse
if display_name not in warehouse_stock:
warehouse_stock[display_name] = 0
warehouse_stock[display_name] += stock
except:
pass
if variant_info['warehouses']: # Only add if has stock
all_variants.append(variant_info)
# Format result
result = []
if asked_warehouse:
# Filter for specific warehouse
warehouse_variants = []
for variant in all_variants:
for wh in variant['warehouses']:
if asked_warehouse in wh['name']:
warehouse_variants.append({
'name': variant['name'],
'variant': variant['variant'],
'stock': wh['stock']
})
if warehouse_variants:
result.append(f"{format_warehouse_name(asked_warehouse)} mağazasında mevcut:")
for v in warehouse_variants:
result.append(f"• {v['name']} ({v['variant']})")
else:
result.append(f"{format_warehouse_name(asked_warehouse)} mağazasında bu ürün mevcut değil")
else:
# Show all variants and warehouses
if all_variants:
result.append(f"Bulunan {len(all_variants)} varyant:")
# Show ALL variants (not just first 5)
for variant in all_variants:
variant_text = f" ({variant['variant']})" if variant['variant'] else ""
result.append(f"• {variant['name']}{variant_text}")
result.append("")
result.append("Mağaza stok durumu:")
for warehouse, total_stock in sorted(warehouse_stock.items()):
result.append(f"• {warehouse}: Mevcut")
else:
result.append("Hiçbir mağazada stok yok")
return result
except (ValueError, IndexError) as e:
print(f"DEBUG - Error parsing indices: {e}")
return None
else:
print(f"GPT API error: {response.status_code}")
return None
except Exception as e:
print(f"Error calling GPT: {e}")
return None
def format_warehouse_name(wh_name):
"""Format warehouse name nicely"""
if "CADDEBOSTAN" in wh_name:
return "Caddebostan mağazası"
elif "ORTAKÖY" in wh_name:
return "Ortaköy mağazası"
elif "ALSANCAK" in wh_name:
return "İzmir Alsancak mağazası"
elif "BAHCEKOY" in wh_name or "BAHÇEKÖY" in wh_name:
return "Bahçeköy mağazası"
else:
return wh_name.replace("MAGAZA DEPO", "").strip() |