backend updates on recommendation system
This commit is contained in:
@@ -27,13 +27,15 @@ mcp = FastMCP(
|
||||
"Every product is confirmed by real listings on at least two retail platforms; "
|
||||
"prices, ratings and reviews come with the page they were read from. Prices are "
|
||||
"rupee strings. Use search_products to find products, then get_product for "
|
||||
"per-platform offers, specs, images, rating and reviews."
|
||||
"per-platform offers, specs, images, rating and reviews, and recommend_products "
|
||||
"for similar alternatives."
|
||||
),
|
||||
)
|
||||
|
||||
_SEARCH_FIELDS = (
|
||||
"product_id", "brand", "category", "display_name", "ram_gb", "storage_gb",
|
||||
"best_price", "best_price_site", "platform_count", "sold_by_tn_retailer", "image_url",
|
||||
"rating", "rating_count",
|
||||
)
|
||||
|
||||
|
||||
@@ -71,7 +73,8 @@ async def search_products(
|
||||
limit: Maximum products to return (1-100).
|
||||
|
||||
Returns the total match count and, per product: id, name, variant, best price (rupee
|
||||
string) and the platform offering it, number of platforms, and an image URL (or null).
|
||||
string) and the platform offering it, number of platforms, an image URL (or null), and the
|
||||
overall rating and rating count (null when no platform publishes a rating).
|
||||
"""
|
||||
limit = max(1, min(int(limit), 100))
|
||||
result = await _run(
|
||||
@@ -115,6 +118,36 @@ async def get_product(product_id: int) -> Dict[str, Any]:
|
||||
}
|
||||
|
||||
|
||||
@mcp.tool
|
||||
async def recommend_products(product_id: int, kind: str = "similar", limit: int = 6) -> Dict[str, Any]:
|
||||
"""Alternatives to suggest for one product (by its product_id).
|
||||
|
||||
Args:
|
||||
product_id: The product to find alternatives for.
|
||||
kind: "similar" - closest specs, ranked by spec similarity, rating (weighted by how
|
||||
many people rated it) and price closeness; when few exist, the best-rated in the
|
||||
category fill the list. "better_rated" - products rated higher than this one by
|
||||
at least 5 people.
|
||||
limit: Maximum products to return (1-12).
|
||||
|
||||
Always same category, in stock, within a similar price (+/-30% for similar, +/-20% for
|
||||
better_rated), with other variants of the same model left out. Each item has a short
|
||||
reason (e.g. "Similar specs · 4.5★ vs 4.1★"). The same model's other RAM/storage
|
||||
variants are listed separately under other_variants.
|
||||
"""
|
||||
if kind not in ("similar", "better_rated"):
|
||||
raise ToolError('kind must be "similar" or "better_rated"')
|
||||
d = await _run(elec.recommendations, int(product_id), kind, max(1, min(int(limit), 12)), False)
|
||||
return {
|
||||
"items": [
|
||||
{k: i.get(k) for k in ("product_id", "brand", "display_name", "ram_gb", "storage_gb",
|
||||
"best_price", "best_price_site", "rating", "rating_count", "reason")}
|
||||
for i in d["items"]
|
||||
],
|
||||
"other_variants": d["other_variants"],
|
||||
}
|
||||
|
||||
|
||||
@mcp.tool
|
||||
async def price_history(product_id: int) -> List[Dict[str, Any]]:
|
||||
"""Every price observed for a product, per platform, oldest first (rupee strings, ISO times)."""
|
||||
|
||||
Reference in New Issue
Block a user