Python SDK

DishEmbedClient Reference

Constructor

from dish_embed.client import DishEmbedClient

client = DishEmbedClient(base_url, api_key)
ParameterTypeDefaultDescription
base_urlstrrequiredAPI base URL (e.g., "https://dish-embed.latimal.com")
api_keystrrequiredYour API key
timeoutint120Request timeout in seconds

Methods

health()

Check API availability.

result = client.health()
# {"status": "healthy", "biencoder": "loaded", ...}

Returns: dict with status and component info.


embed(items, dimension=128)

Generate embeddings for a list of items. Automatically chunks large lists into multiple requests (512 items per chunk).

embeddings = client.embed(["Butter Chicken", "Dal Tadka"], dimension=384)
# embeddings is a list of float lists, one per input item
ParameterTypeDefaultDescription
itemslist[str]requiredMenu items to embed (up to 512 per chunk)
dimensionint128Embedding dimension: 128, 256, or 384

Returns: list[list[float]] - one embedding vector per input item.

Auto-chunking: Lists longer than 512 items are transparently split into multiple HTTP requests. Results are concatenated in order.


embed_batch(items, dimension=128)

Embed up to 5,000 items in a single HTTP request. No chunking. Use this for bulk operations where you want one network round-trip.

result = client.embed_batch(large_menu, dimension=128)
ParameterTypeDefaultDescription
itemslist[str]requiredMenu items (up to 5,000)
dimensionint128Embedding dimension: 128, 256, or 384

Returns: Same as embed().


match(pairs, cosine_threshold=0.85)

Check if pairs of items are duplicates.

result = client.match(
    pairs=[("Butter Chicken", "Murgh Makhani"), ("Pizza", "Pasta")],
    cosine_threshold=0.85
)
for r in result["results"]:
    print(f"{r['text_a']} vs {r['text_b']}: {r['match']} (cosine: {r['cosine']:.3f})")
ParameterTypeDefaultDescription
pairslist[tuple]requiredPairs of (text_a, text_b) tuples to compare. The SDK converts these to {text_a, text_b} objects for the API.
cosine_thresholdfloat0.85Minimum similarity to consider a match

Returns: dict with results (list of match results including text_a, text_b, cosine, reranker_score, match, dietary_conflict, protein_conflict).


dedup(items, cosine_threshold=0.85)

Find and cluster duplicate items in a menu.

result = client.dedup(menu_items, cosine_threshold=0.85)
for cluster in result["clusters"]:
    print(f"Canonical: {cluster['canonical']}, Members: {cluster['members']}")
ParameterTypeDefaultDescription
itemslist[str]requiredMenu items (up to 2,000)
cosine_thresholdfloat0.85Similarity threshold for clustering

Returns: dict with clusters, singletons (items with no duplicates), total_items, duplicate_items (excess count), and processing_time_ms.


classify(items)

Classify items by cuisine.

results = client.classify(["Sushi Roll", "Butter Chicken", "Tacos"])
for c in results:
    print(f"{c['text']}: {c['cuisine']} ({c['confidence']:.2f})")
ParameterTypeDefaultDescription
itemslist[str]requiredMenu items (up to 512)

Returns: list of dicts, each with text, cuisine, confidence.


search(query, corpus, top_k=10)

Semantic search over a corpus of menu items.

result = client.search("spicy noodles", corpus=menu_items, top_k=5)
for r in result["results"]:
    print(f"{r['text']}: {r['score']:.3f}")
ParameterTypeDefaultDescription
querystrrequiredSearch query
corpuslist[str]requiredItems to search over
top_kint10Number of results to return

Returns: dict with results (list with text, score, reranker_score, is_fallback) and query_preprocessed.

Note: The SDK's search() does not support the corpus_embeddings parameter. For pre-computed embedding search, use the raw HTTP API directly.


report(items, restaurant_name="")

Generate a menu health report.

result = client.report(menu_items, restaurant_name="My Restaurant")
print(f"Quality score: {result['quality_score']}/100")
ParameterTypeDefaultDescription
itemslist[str]requiredFull menu (up to 2,000 items)
restaurant_namestr""Restaurant name for the report

Returns: dict with quality_score, noise_analysis, dedup_summary, non_food_items, cuisine_breakdown.


suggest(cart, menu, top_k=5)

Get upsell suggestions based on cart contents.

result = client.suggest(
    cart=["Chicken Biryani"],
    menu=restaurant_menu,
    top_k=3
)
for s in result["suggestions"]:
    print(f"{s['item']} - {s['reason']}")
ParameterTypeDefaultDescription
cartlist[str]requiredCurrent cart items (up to 50)
menulist[str]requiredFull restaurant menu (up to 500)
top_kint5Number of suggestions

Returns: dict with suggestions (list with item, category, reason, score, cuisine_match).


balance()

Check your API credit balance.

result = client.balance()
print(f"Credits remaining: {result['credits_remaining']}")

Returns: dict with credits_remaining and usage info.

Error handling

from dish_embed.client import DishEmbedError

try:
    result = client.dedup(items)
except DishEmbedError as e:
    print(e.status_code)  # HTTP status code (401, 422, 429, 500, etc.)
    print(e.detail)       # Error message from the API

Common errors:

StatusMeaning
401Invalid or missing API key
422Validation error (items too long, empty list, etc.)
429Concurrent request limit exceeded (not a per-second rate limit)
500Server error