add_garment_from_link
ChatGPTPut the garment behind a link into their wardrobe, without rendering. Either kind of link works. A product page is read for the photograph it advertises; a direct image link is taken as it is. The shopper does not have to know which one they copied, and should not be asked. Use it when they send a link and the next thing is not necessarily a try-on — "save this for later", "add these two to my wardrobe" — and to check a link is usable before spending a render on it. The answer carries an `asset_id that try_on takes as garment_asset_id, so wearing it afterwards costs no second fetch. name` is optional: the shop's own name for the garment is read off the page when there is one. Pass it only if they said what to call it. Some shops refuse to be read by anything that is not a browser. When that happens the error says so and says what to do about it — pass that on as it is written rather than rewording it into "that link is broken", because the link is not broken and the fix is one they can do.
get_my_measurements
ChatGPTFetch the signed-in shopper's body measurements (girths/lengths in cm). Use this whenever sizing, fit, or "my measurements" come up — it returns the person's stored body measurements (chest_cm, waist_cm, hip_cm, ...), plus gender and weight when available — the same numbers their Polypo profile shows. `shape`, when present, is their body shape in the profile's own words; quote it rather than describing the numbers yourself. Requires sign-in; the access token arrives automatically on the connector's Authorization header.
get_try_on_result
ChatGPTCheck a try-on that was still rendering. The result card polls this on its own, so you rarely need to: call it only when the user asks about a render again in a later turn. Takes the `job_id from try_on and returns succeeded (the card draws the image), running, or failed` with the reason.
list_my_garments
ChatGPTEvery garment brain holds for this shopper, newest-worn first. Not only the named ones: anything they have uploaded, or you have fetched for a try-on, is kept and listed here. Each entry carries an `asset_id — what try_on takes as garment_asset_id — so putting one back on costs no upload at all. Call this whenever they refer to something they have worn or sent before ("the COS trousers", "that jacket from yesterday", "what have I got?"). saved says whether they ever gave it a name. A named one carries name, usually brand, and a garment_id; an unnamed one reads as "Garment you sent" with the date it arrived. When they reach for one of those, offer to name it — save_garment`, with the brand if they know it — so next time they can ask for it in words.
list_my_photos
ChatGPTThe photos of the user we can put clothes on. Their Polypo avatar's shots (front, back, selfie) plus any full-body photo they have sent us. Each one has a `photo_id that try_on takes as person_photo_id, and one is marked is_default — that is the one a try-on uses when you don't say otherwise. models is a separate list: Polypo's house models, the same for everybody, for someone who has no avatar and would rather not send a photo of themselves yet. Their ids look like model:w-mint-set and go in the same person_photo_id` argument. Offer one when they have no photos — it is the difference between trying something on now and being asked for a picture of their body first. Call this when they ask which photos we have, want to change the one being used, or say the render doesn't look like the photo they meant. The card lays them out and lets them tap one, so you don't need to describe them.
list_my_sizes
ChatGPTEvery size we have worked out for this shopper, newest first. Use it for "what did you say I was in Zara", "what size did I buy last time", or before recommending a brand they have already been sized for. Each entry carries the garment, the size, the confidence and when it was, and `recheckable counts the ones still holding their size chart — those can be run again against today's measurements, which is what answers "has my size changed". The card draws the list and does the rest in place: re-checking one, and taking the shopper's verdict on how it actually fitted. So say one short line rather than reading the list out, and **do not** go through it asking how each one fitted — record_fit` says why.
list_my_try_ons
ChatGPTThe shopper's past try-ons, newest first — drawn as a gallery. Their renders are kept, so this is where "show me the one from last week" is answered. Each entry has a freshly signed `image_url (the one stored with the job lapses after a day), the job_id, when it was, and which slots were worn. Use it for "what did I try on?", to re-show something they liked, or before suggesting something new so you don't repeat a garment. The card shows the pictures — say something brief rather than listing them out. Quote count: it is the number of pictures the card draws beside you, and the only number the shopper can check. total also counts the rows with no picture — a render that failed, and one they removed (removed: true) — so saying that instead claims a try-on they cannot see. Don't call it "all of them" when more is true. Leave limit` alone unless they asked for just the last few.
open_polypo
ChatGPTOpen Polypo in the conversation. Call this first, on hello. Any opening turn — "hi", "what can you do", "what are your tools", or a bare mention of Polypo with nothing asked yet — should be this call and one short line, nothing else. It draws a card with the three things a shopper can do (try something on, their profile, their measurements), each showing live status, and the card takes it from there. Do NOT answer those turns by listing tool names in prose. A shopper who opened a wardrobe app wants to see themselves in clothes; a bulleted inventory of our plumbing is not that, and it leaves them to guess the wording that gets them somewhere. `open_on opens the card straight on one page instead of the tiles. Use profile whenever they ask about their account, their avatar, or the photos it was built from — that page exists only inside this card, so it is the one surface with no tool of its own. The other values (photos, garments, measurements, composer) work too, but prefer the dedicated tool where there is one: list_my_photos, list_my_garments, get_my_measurements, open_try_on fetch their data up front instead of making the card ask for it. Returns the signed-in account — their **name** when we hold a real one, their email, whether there is an avatar and how many photos it has, and whether measurements are on file — so you can answer a follow-up without calling anything else. account.name` is absent when nobody ever told us their name; say nothing about it rather than reading out the address.
open_size_check
ChatGPTOpen the size check in the conversation, ready to be filled in. This is the answer to "what size am I", "will this fit me", "which size should I buy" and anything like them when you are not already holding the garment's size chart. The card does the whole job in one turn: it takes the size chart pasted in whatever shape the product page had it, takes the brand and what the garment is, asks how they like things to sit, and works the size out itself. Do not narrate the form, and do not ask for their measurements — those come from their Polypo profile and the card already knows whether they are there. Say one short line and stop. If you ALREADY hold the size chart, call `recommend_size directly instead; opening a form to paste in a table you are holding is a step backwards. **A screenshot of a size guide counts as holding it** — read the table out of the picture and go straight to recommend_size. If what they actually want is their own body measurements rather than a garment's size, that is get_my_measurements`. The card reads a screenshot itself, too — it has a drop zone, and an image pasted into its chart box goes to the same reader. So a shopper who has not sent you the picture yet does not need to: opening this is enough, and it puts the table in front of them to check before any size is worked out.
open_try_on
ChatGPTOpen the try-on in the conversation, ready to be filled in. This is the answer to "let me try something on" and anything like it when you do not already have a garment image URL in hand. The card it draws does the whole job without another turn: it shows the photos of them we can dress and lets them pick one, takes a product link, takes a photo off their device, holds a top and a bottom at once, stacks accessories on top of them — a bag, a belt, a scarf, each with how it is worn — and runs the try-on itself. Do not narrate the form or ask which piece it is — the card asks. Say one short line and stop. If you ALREADY have a garment image URL and know what it is, call `try_on` directly instead; opening a form to paste in a link you are holding is a step backwards.
recommend_size
ChatGPTWork out which size of a specific garment fits the signed-in shopper. Reach for this the moment there is a size chart in hand and the question is what to buy — a table pasted from a product page, numbers read off a size guide, measurements the shopper typed out. Their body comes from their Polypo profile automatically: never ask them for measurements, and never put measurements in the arguments. `size_chart is the **garment's** measurements per size. Send it the way you have it: * **as the table itself, copied verbatim** — the tab-separated rows a product page gives when its size guide is selected and copied, a markdown table, a CSV, or rows of numbers under a heading line. Sizes down the side and sizes across the top both read, and so do inches, ranges ("36-38") and headings with units in them. Prefer this whenever the chart reached you as text: handing it over unchanged is the one form that cannot go wrong, because there is no number for you to retype. * **read out of a screenshot of the size guide.** A shopper whose chart is a picture has nothing to copy, so read the table yourself and pass the rows here as text. **Several images are one chart**: a guide split across two shots, a centimetre table and an inch table of the same garment, a chart photographed alongside its key — merge them into a single table before sending it, and pass unit for the one you transcribed. Transcribe only what you can actually read: a digit you are unsure of is a row to leave out, not one to guess at, and a size the chart does not cover is a size that does not exist. Say which columns you took, so the shopper can correct you. * or keyed by size label: {"S": {"chest": 104, "waist": 92}, "M": {…}}, or a list of {"size": "S", "chest": 104} objects. Column names are matched generously — chest/bust/pit-to-pit, hip/seat, back width, arm width, inside leg all resolve — and anything unrecognised is reported back rather than silently dropped. **Never invent a number the shopper did not give you.** If you only have some of the chart, send what you have; a partial chart is scored on what it has and says so. category is what the garment is: shirt, t_shirt, polo, blouse, dress, jacket, blazer, coat, bomber, hoodie, sweatshirt, sweatpants, sweatshorts, tracksuit_set, pullover, trousers, jeans, shorts, skirt, leggings, sport_top, tank_top. Ordinary wording is understood ("linen summer shirt", "chinos", "joggers" and "track pants" are sweatpants). The optional inputs genuinely change the answer, so pass them when you know them and leave them out when you are guessing: brand (Zara, H&M, Uniqlo, Lacoste and Loro Piana have their own tuned ease rules; anything else falls back to standard ranges and the answer says so), fit_preference — how *they* like clothes to sit — tight/regular/relaxed, ONLY when they say so in this chat: left out, the fit they saved in their Polypo profile is used (and their between-sizes and rise choices with it; preferences_used in the answer says which), garment_fit — how the garment is *cut* — slim/regular/relaxed/oversized, brand_fit runs_small/true_to_size/runs_large only when a review or the page says so, and fabric as the composition string ("95% cotton, 5% elastane") because stretch moves the answer by a whole size on knits. unit (cm/in) and measure (girth/flat) are for when you are certain: a chart where chest reads 52 rather than 104 is measured flat, and one reading 41 is inches. Left out, both are worked out from the numbers and the answer reports what it decided — pass them explicitly if it got it wrong. Read out recommended_size and explanation.headline, and stop there. Quote confidence as it comes; never soften a "low" into "should be fine". Two answers are not recommendations and must not be presented as one: outcome "no_size_fits" means nothing in this chart works — say so plainly and name closest_size as the nearest thing, not as the pick — and outcome "no_measurements"` means they ha…
record_fit
ChatGPTRecord how a garment actually fitted, in the shopper's own words. Call this whenever they volunteer a fit outcome — "the M was tight across the chest", "sent it back, too long", "that one's perfect". It attaches itself to their most recent size recommendation, so you never need an id. `verdict is one of too_small, slightly_small, perfect, slightly_large, too_large. area is where it went wrong, when they said: chest, waist, hip, shoulder, sleeve, length, rise, overall. comment` is whatever else they said about it, in their words rather than yours — the verdict is a label and this is the part that explains it, so quote them and do not tidy it up. Pass whichever parts they actually gave you and leave the rest out. A note with no verdict is a real answer ("it dug in at the shoulder") and is recorded as one. Re-stating something for the same garment corrects the record rather than adding a second one, and a later call only touches the fields it carries — so attaching a note to a verdict you already sent is safe, and does not overwrite it. Do not go fishing for this. Never open a turn by asking how something fitted, and never run a little survey to fill the fields in — pass what they actually said and leave the rest empty. Acknowledge in one short line and carry on; do not read the record back to them.
remove_garment
ChatGPTDrop one garment out of the shopper's library. Pass the `asset_id from list_my_garments — every garment has one, named or not. garment_id` also works for a named one and does the same thing: the name and the image both go. Past try-ons keep their images and still say what they wore. The answer carries the library that is left, so there is never a follow-up call.
remove_my_photo
ChatGPTDelete a photo the user sent us, by `photo_id from list_my_photos. Only photos they sent here can go. Their Polypo avatar's own shots (front, back, selfie) belong to the avatar and are refused with a note saying where to change them — do not present those as removable. The image is deleted and every link to it stops working; past try-ons keep their own result images and still say what they were wearing. The answer contains the gallery that is left, so you never need to call list_my_photos` after this.
remove_my_try_on
ChatGPTDelete one past render, by `job_id from list_my_try_ons`. The picture of them wearing it goes; the record that a try-on happened stays, so nothing they were told about it becomes untrue. Renders are kept indefinitely now, so this is how someone takes one back — do it whenever they ask, without arguing for keeping it.
save_garment
ChatGPTKeep a garment the user has just tried on, under a name they choose. Offer this after a try-on they liked, in one short line — "want me to save that so you can wear it again?" — and take the name (and the brand, when they say one) from their answer. Saving means the next try-on with it is a `saved_garment_id instead of another upload, and a name plus a brand is what makes it findable later; an unnamed garment is an image id nobody can ask for. asset_id comes from garment_asset_ids in the try_on` answer — the images the user actually supplied. Only a garment can be saved: a photo of the person, or the finished render, is refused. Saving the same image again updates its name and brand rather than making a second entry, so "call it the navy one instead" just works.
start_garment_upload
ChatGPTOpen a drop zone in the conversation so the user can hand us a photo. Call this as soon as a try-on is wanted and you don't already have a garment image URL. That includes a bare "let me try something on" with no image yet, and it includes the case where the user has attached a photo to this conversation — you can see that attachment, Polypo cannot. Do NOT answer such a request in prose by asking them to upload or attach a photo. A tool call cannot carry image bytes and ChatGPT does not hand attachments to apps, so that reply leaves the user holding a photo that has nowhere to go. This tool is the way in: it draws a card they drop the photo onto without leaving the chat, and for a garment or an accessory that card then runs the try-on and shows the result itself. So: call this, say one short line ("drop it here"), and stop. Don't paste the link, don't ask them to tell you when they're done, and don't follow up with `try_on — you'll be told if something needs you. kind is garment (default), accessory, or person_photo when it's a full-body photo of the user to wear the clothes instead of their avatar. label is what you asked them for ("the red jacket") — it's shown on the card so they send the right thing. garment_role and garment_image_shows carry what the user already told you ("just the top", "it's a whole outfit") through to the try-on the card runs — they mean exactly what they mean on try_on`. The link is single-use and expires; if it lapses, just call this again.
try_on
ChatGPTShow the signed-in shopper wearing a garment. The person comes from their Polypo profile automatically — you never need a photo of them or any catalog reference. By default that is their avatar's front photo, and the answer says which one it used in `person_photo: tell them, rather than leaving them to recognise their own picture. To wear it on a different photo, pass person_photo_id from list_my_photos — use that whenever they ask for "the other one", "my back photo", or a photo they sent earlier. The same argument takes a house model id (model:w-mint-set), which is what to use when they have no photos of their own. You only supply the garment: * **A link you already have** → pass garment_image_url. Either kind works: a product page, which is read for the photograph it advertises the way a link preview reads one, or a direct image link taken as it is. Do not ask the shopper which kind they copied. A few shops block everything that is not a browser; when that happens the error says so and says what to do about it, so pass it on as written rather than rewording it into "that link is broken". To put a link in their wardrobe WITHOUT rendering it, use add_garment_from_link. * **A garment we already hold** → pass garment_asset_id from list_my_garments (and bottom_garment_asset_id for the second slot). That list is every garment of theirs, whether or not they ever named it, so reach for this the moment they refer to something they have sent before ("that jacket again", "the one from yesterday") rather than asking for the photo a second time. If they named it, it remembers whether it is a top, a bottom or a whole look, so garment_role is optional — pass it only to override. * saved_garment_id still works for a named garment and does the same thing; garment_asset_id is the id every garment has. * **Nothing yet, or a photo on the user's device — including one they just attached to this conversation** → call start_garment_upload and stop there. Never ask them to attach a photo here instead. ChatGPT does not pass attachments through to apps, so the file has to reach us separately; the card that appears takes the photo inline and runs the try-on itself. Do not ask the user to confirm the upload, do not repeat the link, and do not call this tool again for that photo. Two separate things to tell us, and they matter most when a photo shows a whole look: * garment_role — what to put on them: top, bottom, outfit or accessory. **Pass it explicitly whenever you know it.** auto does not look at the picture: it reads description and the image URL for words like "trousers" or "jacket", and falls back to a top when neither says anything — which is how a photo of jeans gets worn as a shirt. The answer reports role_used and role_assumed; when it was assumed, say which way you took it so the user can correct you in one line. * garment_image_shows — what the picture contains: item (one garment, the default) or full_outfit (a whole look on a person). You do not have to get garment_image_shows right for the render to be right. Whether a photo is a whole look is decided from the photo: a garment image asked for as a top or a bottom is checked for a full-body pose, and one that has it is cut at the waist so only the piece named by garment_role reaches the renderer. Ask for the top of a head-to-toe photo and the top is what goes on. Ask for the outfit and the photo is never separated: the model's head is cut off and the whole look goes on as one garment, exactly as it comes — the answer's outfit_split says "worn whole". Saying full_outfit explicitly only changes the reporting for a top or a bottom — the answer then also tells you when a photo could not be cut, instead of staying quiet about an ordinary product shot that never needed cutting. One thing it cannot see is a garment with no halves. A dress, a jumpsuit or an abaya covers the whole body and must not be cut, and the only clue is what it is called — so put the word in …
whoami
ChatGPTVerify the signed-in Polypo user and return who they are. NOT the opening move — open_polypo proves sign-in just as well and draws the app while it does it. Use this when sign-in itself is the question ("am I connected?", "which account is this?"). The access token arrives automatically on the connector's Authorization header. `name is null unless the token itself names the person, which it does not for an email/password account. The name on their customer profile comes back from open_polypo`; an email address is never a substitute for it.