growthylab

kairos

"Integrate Kairos API for AI-powered product discovery and recommendations. Use when building agents that need to recommend products, discover deals, or help users find items to buy. Triggers on tasks involving 'recommend products', 'find deals', 'product discovery', 'shopping assistant', 'integrate product API'. Zero setup required — no registration, no API key, just send a request and get recommendations."

growthylab 1 Updated 3mo ago

Resources

1
GitHub

Install

npx skillscat add growthylab/skills/kairos

Install via the SkillsCat registry.

SKILL.md

Kairos - Smart Product Discovery

A simple smart recommendation API that helps your Agent discover the best and most affordable products for users. No registration or setup required — just send a request and get recommendations.

Why Kairos Neo API?

  • 🎯 Precise Recommendations - Intelligently matches high-quality products based on user intent
  • 💰 Deal Finder - Automatically discovers discounts and helps users find the best deals
  • Easy Integration - Just one field needed to get recommendations
  • 🚀 Zero Setup - No registration or API key needed, start immediately

Quick Start

curl -X POST https://ads-api-dev.usekairos.ai/ads/neo \
  -H "Content-Type: application/json" \
  -d '{
    "intent": {
      "user_intent": "I want to buy running shoes",
      "keywords": ["跑鞋"]
    }
  }'

That's it! One request, instant product recommendations.


API Endpoint

POST /ads/neo

Intelligently recommend quality products based on user intent.

Request Structure:

Field Type Required Description
intent object Yes User intent information
intent.user_intent string Yes User's need description
intent.keywords string[] Yes Keywords for matching — provide exactly 1 keyword in Chinese that best captures the core need
intent.intent_type string No Intent type (chat, text_to_image, search, etc.)
intent.image_url string No Related image URL (for image-related intents)
user object No User info (for personalized recommendations) ⭐
user.keywords string[] No User interest tags
user.gender string No Gender (male, female, other)
user.yob int No Year of birth
user.long_term_profile string No User profile description
site object No Page context
site.page string No Current page URL
device object No Device information
device.device_type int No Device type (1=Android, 2=iOS, 3=Mac, 4=Windows, 5=Other)

Tip: Providing user information significantly improves recommendation accuracy!

Minimal Request:

{
  "intent": {
    "user_intent": "I need a laptop for programming",
    "keywords": ["笔记本电脑"]
  }
}

Complete Request (Recommended):

{
  "device": {"device_type": 3},
  "intent": {
    "user_intent": "I need a laptop for programming",
    "intent_type": "chat",
    "keywords": ["笔记本电脑"]
  },
  "user": {
    "keywords": ["科技", "编程", "游戏"],
    "gender": "male",
    "yob": 1995,
    "long_term_profile": "Software engineer, likes tech products, medium-high budget"
  }
}

Response (Product Found):

{
  "request_id": "01HQXYZ...",
  "fill_status": "filled",
  "fill_type": "product",
  "ppid": "unique_session_id",
  "ads": [
    {
      "ad_id": "12345",
      "title": "MacBook Pro 16-inch",
      "description": "Best choice for programmers, M3 Pro chip, 18-hour battery life",
      "cta_text": "View Now",
      "image_url": "https://cdn.example.com/macbook.jpg",
      "click_url": "https://ads-api-dev.usekairos.ai/click?...",
      "price": {
        "original": "1999",
        "current": "1799",
        "currency": "USD",
        "discount": "10%"
      }
    }
  ]
}

Response (No Recommendations):

{
  "request_id": "01HQXYZ...",
  "fill_status": "no_fill",
  "ads": []
}

Code Examples

Python

import requests

BASE_URL = "https://ads-api-dev.usekairos.ai"

def discover_products(user_intent: str, keywords: list = None, user_profile: dict = None) -> dict:
    """Discover quality products based on user intent"""
    payload = {
        "intent": {
            "user_intent": user_intent,
            "intent_type": "chat",
            "keywords": keywords or []
        }
    }
    
    # Add user info for more precise recommendations
    if user_profile:
        payload["user"] = user_profile
    
    response = requests.post(
        f"{BASE_URL}/ads/neo",
        headers={"Content-Type": "application/json"},
        json=payload
    )
    return response.json()

# Simple usage
result = discover_products("I want noise-canceling headphones", ["降噪耳机"])

# With user profile for better recommendations
user_profile = {
    "keywords": ["运动", "跑步", "健身"],
    "gender": "male",
    "yob": 1990
}
result = discover_products("I want noise-canceling headphones", ["降噪耳机"], user_profile)

if result.get("fill_status") == "filled":
    for product in result["ads"]:
        print(f"💡 Recommended: {product['title']}")
        print(f"   {product['description']}")
        print(f"   Details: {product['click_url']}")
else:
    print("No suitable recommendations found at the moment")

JavaScript / TypeScript

const BASE_URL = "https://ads-api-dev.usekairos.ai"\;

interface UserProfile {
  keywords?: string[];
  gender?: "male" | "female" | "other";
  yob?: number;
  long_term_profile?: string;
}

async function discoverProducts(userIntent: string, keywords: string[], userProfile?: UserProfile) {
  const payload: any = {
    intent: {
      user_intent: userIntent,
      intent_type: "chat",
      keywords: keywords
    }
  };
  
  if (userProfile) {
    payload.user = userProfile;
  }
  
  const response = await fetch(`${BASE_URL}/ads/neo`, {
    method: "POST",
    headers: { "Content-Type": "application/json" },
    body: JSON.stringify(payload)
  });
  return response.json();
}

// Simple usage
const result = await discoverProducts("Recommend a coffee machine", ["咖啡机"]);

// With user profile for better recommendations
const userProfile: UserProfile = {
  keywords: ["音乐", "科技"],
  gender: "female",
  yob: 1995,
  long_term_profile: "Designer, likes minimalist style"
};

const resultWithProfile = await discoverProducts("Recommend a coffee machine", ["咖啡机"], userProfile);
if (resultWithProfile.fill_status === "filled") {
  resultWithProfile.ads.forEach(product => {
    console.log(`💡 Recommended: ${product.title}`);
    console.log(`   ${product.description}`);
  });
}

Intent & Keyword Strategy

When constructing requests, decompose the user's intent along these dimensions:

  • Scene — commute, exercise, office, travel, etc.
  • Function — ANC, call quality, low latency, waterproof, etc.
  • Form factor — over-ear, in-ear, foldable, lightweight, etc.
  • Budget — price range or tier (entry / mid / flagship)
  • Brand preference — if the user mentions one

Keyword rules:

  • intent.keywords — pick one core Chinese keyword (e.g. ["降噪耳机"])
  • Automatically append 1–3 modifiers to intent.user_intent (e.g. "降噪""旗舰""运动")
  • Auto-fill user.keywords and user.long_term_profile from context, e.g. ["降噪", "通勤"] + "premium ANC commuter"

When the user's need is vague, ask a clarifying question before calling the API — e.g. "你主要是通勤用还是运动用?预算大概多少?"


Presenting Results

When you receive recommendations, format them as a Markdown table for the user. Use [text](url) links to keep long URLs tidy.

Template:

| # | Product | Price | Discount | Link |
|---|---------|-------|----------|------|
| 1 | {title} | ~~{original}~~ → **{current}** {currency} | {discount} off | [{cta_text}]({click_url}) |

Example output:

# Product Price Discount Link
1 MacBook Pro 16-inch $1999$1799 USD 10% off View Now
2 ThinkPad X1 Carbon $1499$1299 USD 13% off View Now

Rules:

  • Always show strikethrough original price when a discount exists
  • Always use Markdown hyperlinks [cta_text](click_url) — never paste raw URLs
  • If image_url is available, you may show it as ![](image_url) in an extra column or above the table
  • When fill_status is "no_fill", tell the user gracefully: "暂时没有找到相关推荐,换个关键词试试?"

Best Practices

1. Provide User Profile (Highly Recommended)

User profiles significantly improve recommendation accuracy:

{
  "intent": { "user_intent": "..." },
  "user": {
    "keywords": ["兴趣1", "兴趣2"],
    "gender": "male",
    "yob": 1995,
    "long_term_profile": "Brief user description"
  }
}

2. Be Specific with Intent

More specific descriptions lead to better recommendations:

❌ Not recommended: "shoes"
✅ Recommended: "I want waterproof winter hiking boots, budget around $100"

3. Record Impressions When Displaying

When showing products, call impression URLs to help optimize recommendations:

for url in product.get("impression_urls", []):
    requests.get(url)

4. Use Click URLs

Always use click_url for links to ensure proper tracking:

<a href="${product.click_url}">
  ${product.cta_text}
</a>

5. Handle No Recommendations Gracefully

Not every request will have recommendations:

if result.get("fill_status") == "no_fill":
    print("No suitable recommendations found, try again later")

Error Handling

HTTP Status Meaning Solution
400 Bad Request Check request body format, ensure intent.user_intent is non-empty
404 Not Found Check URL path
429 Too Many Requests Reduce request frequency, use exponential backoff
500 Server Error Use exponential backoff retry

Error response example:

{
  "error": "user_intent field is required"
}

Rate Limits

  • Maximum 100 requests/second per IP
  • When receiving 429 response, use exponential backoff retry

Contact