Skill instructions
get-started3.26 KB
View saved version →
---
name: get-started
description: Set up Hermoso for a new user. Use right after the plugin is installed, or when the user asks how to start, what Hermoso can do, or to set up their brand. Checks for a saved brand profile, drafts one from the user's website or description if there is none, shows which accounts are connected, and suggests a first task.
---
# Get started with Hermoso
Use this skill to get a new user from "just installed" to a first useful result in a few messages.
Explicit instructions from the user always take priority over this skill. If they already know what they want
("show me my competitors' ads", "make an ad"), skip the setup and do that instead.
## What you need from the user
- Nothing to begin with. Ask for their website (or a one-line description of the brand) only if no brand is saved.
## Steps
1. Call `get_brand`. It is free and changes nothing.
- If a brand is saved, greet the user by the brand name, summarise in two or three lines what Hermoso knows
(what it sells, main products, positioning), and go to step 3.
- If no brand is saved, go to step 2.
2. Ask for the brand's website. If they have none, ask for a short description of what they sell and who it is for.
Call `draft_brand` with the domain (or the description) and `save` set to false.
- Show the user the drafted name and summary and ask whether it is the right company. A domain can resolve to a
different business with a similar name; never assume it matched.
- When the user confirms, call `draft_brand` again with `save` set to true. If they say it is wrong, ask for the
correct website or a description and draft again.
3. Call `list_connectors` to see which social and ad accounts are connected to this workspace.
- List the connected ones by name. If none are connected, say that posting and campaign reviews need an account
connected in the Hermoso workspace (Settings, then Connectors), and that research and creating ads work
without one.
- Never ask the user for a password or an access token in the chat. Accounts are connected in Hermoso itself.
4. If there are several brands on the account, call `list_brands` and ask which one to work on, then `use_brand`
with the brand the user picks. Skip this when there is only one brand.
5. Offer three first tasks, matched to what is set up, and let the user pick:
- "Show me the ads my competitors are running" (research, works with no connected account).
- "Make an Instagram ad for <brand>" (create, uses the saved brand).
- "What's scheduled this week?" or "Which of my posts did best?" (only if a social account is connected).
## Output
A short welcome: the brand Hermoso will work on, what is connected, and three suggested next steps as plain
sentences the user can send back. Keep it under ten lines.
## Do not
- Do not invent brand details. Only repeat what `get_brand` or `draft_brand` returned.
- Do not save a drafted brand before the user confirms it is the right company.
- Do not start research or create anything during setup unless the user asks. Those use credits from the user's
Hermoso account.
- Do not discuss plans, prices or purchases. If the user asks about their credit balance, `hermoso_credits`
reports it; plans and billing are managed in their Hermoso account outside ChatGPT.
Referenced files: 1 — file references are metadata, not package contents.
make-an-ad4.96 KB
View saved version →
---
name: make-an-ad
description: Create an image or video ad for the user's brand with Hermoso. Use when the user asks to make, design or render an ad, a social post visual, a product shot, a video ad, a UGC-style ad, a clone of an ad they like, cut-ins of their own screens over a video, a longer version of a clip, or variations of an ad they already have.
---
# Make an ad
Use this skill to turn a request like "make an Instagram ad for our summer sale" into a finished file in the
user's Hermoso Library. Explicit instructions from the user always take priority over this skill: their format,
size, length, wording, product and style choices win over any default below.
## Before you start
- Hermoso reads the saved brand profile (products, logo, colours, voice) by itself. Call `get_brand` only if you
do not yet know whether a brand is saved. If none is saved, use the get-started skill first.
- You need to know: image or video, and where it will run (for example an Instagram feed post is square, a Reel
or TikTok is vertical 9:16). If the user did not say and it matters, ask one short question. If they say "you
choose", pick and say what you picked.
## Choose the route
- **An image ad** (a feed post, a banner, a product visual): call `generate_image` with a clear prompt that names
the product, the scene, the offer and the text to show, plus `aspectRatio` (1:1 square, 4:5 portrait, 9:16
vertical, 16:9 landscape).
- **A video ad**: call `plan_ad` with the product, format and, if the user named one, the length in seconds. Show
the user the concept and script in a few lines. When they are happy (or asked you not to check), call
`render_ad` with the plan's full output as `creative`. Pass the length the user asked for; never shorten it.
- **A quick short video from a description** (no script needed): `generate_video` with a prompt, `aspectRatio` and
`durationSeconds`.
- **A simple native format** (for example a photo slideshow or a text-led post): `make_template_ad`.
- **Copy the structure of an ad they like, for their brand**: for a video link (TikTok, Reel, Facebook, X, YouTube)
call `remake_video_for_brand`, then `render_ad` with the creative it returns. For a static image ad call `clone_static` with
the image URL. The result keeps the structure and pacing and uses the user's own product and words, never the
original brand's.
- **Cut-ins of the user's own screens** (an app, a web page, a dashboard, a review or a chart shown for a beat as a
card while the footage keeps playing): pass the pictures as `inserts` to `plan_ad` and `render_ad`. Keep them few
and short, on the line that talks about them. A photo is not laid over the video.
- **A longer version of a clip**: `generate_video` with `extend` set to true, the clip as `refVideo`, and a prompt for
what happens next. By default it cuts to a new shot of the same scene rather than stretching the old one.
- **Variations of an ad they already have**: different headlines on a static ad with `headline_variants`, new
opening hooks on a video with `hook_variants`, or more versions of a winning ad with `multiply_ad`. For a small
change to an image (swap the background, fix a word) use `edit_image`.
For the opening of a video, the hook mechanics in `references/hooks.md` help you pick one that fits the product.
Read it when you are writing or choosing a hook.
## Long renders
Video renders usually take a few minutes. When a tool returns a job id instead of a file, call `get_job` with that
id until it reports done or error. Several checks are normal; do not start the render again, because that would
charge twice. If the user asks later where a render went, `list_jobs` and `list_library` show recent jobs and
finished files.
## Files from the user
If the user wants to use their own photo or video, and gives you a public link, `upload_file` turns it into a URL
the other tools accept.
## Saving the file
Finished files are in the user's Hermoso Library already. If they want a copy in Google Drive, `save_to_drive` saves
it (with `folder` when they name one). It needs Google Drive connected in the Hermoso workspace.
## Output
Show the finished image or video (the Hermoso card displays it) with one line on what it is, and offer one useful
next step: a variation, a different size, or scheduling it (the schedule-posts skill).
## Do not
- Do not add prices, discounts, ratings, awards or claims the user or the saved brand did not state.
- Do not write health, medical, financial or other claims the product cannot back up (for example "cures" a
disease). Offer an honest alternative instead.
- Do not add an end card, captions or music unless the user asks for them.
- Do not use another company's logo, trademark or a real person's likeness without the user confirming they have
the rights.
- Creating ads uses credits from the user's Hermoso account, and each paid reply says what it charged: pass that on
in one line rather than estimating it. Make what the user asked for; do not render extra versions they did not
ask for.
Referenced files: 2 — file references are metadata, not package contents.
research-competitor-ads3.41 KB
View saved version →
---
name: research-competitor-ads
description: Research the ads other brands are running and turn them into ideas. Use when the user asks what ads a named brand is running, who their competitors are, what is working in their market, how a competitor's ad strategy is built, or which angles and hooks to use based on what customers say.
---
# Research competitor ads
Use this skill to answer questions about other brands' advertising with real ads from public ad libraries, then
turn what you found into something the user can act on. Explicit instructions from the user always take priority
over this skill (for example a country, a platform or how many ads to show).
## Pick the right tool for the question
- **One named brand's ads** ("show me Liquid Death's ads"): call `pull_competitor_ads` with the brand name, and its
website if you know it. It returns that brand's live Meta (Facebook and Instagram) ads in a few seconds. This is
the default for any request that names a brand.
- **Who the competitors are** ("who competes with oatly.com?"): call `find_competitors` with the domain. Ask for the
website if the user only gave a name and it is ambiguous.
- **How a competitor's strategy works** ("break down Athletic Greens' ads", "where is the white space?"): call
`competitor_teardown` with the competitor's name and website. If you already pulled their ads in this
conversation, pass those ads so they are not fetched again.
- **An open question across the market** ("what angles are working for oat milk brands?", "who else advertises
like this?"): call `research_ads` with the question. It runs several searches and writes a synthesis, so it takes
30 to 60 seconds. Do not use it when the user named one brand.
- **Angles from real customer language** ("what do customers actually say about us?", "give me hooks from our
reviews"): call `mine_angles`. If the user pastes reviews or gives a file or review page, pass them.
## Steps
1. Work out which of the questions above the user is asking. If they named nothing (no brand, no domain, no
market), ask one question to find out whose ads they want to see.
2. Call the one tool that answers it. Do not chain every research tool by default.
3. Summarise what came back in plain language: the recurring hooks, offers, formats and how long the ads have been
running (long-running ads are the ones the advertiser keeps paying for). Name specific ads when you point at a
pattern.
4. Offer one next step that fits: break the strategy down (`competitor_teardown`), mine angles for their own brand
(`mine_angles`), or make an ad that uses what they learned (the make-an-ad skill).
## Output
Lead with the answer to the question, then the evidence. Keep the ads in the cards the tool returns rather than
re-listing every field. Close with the one suggested next step.
## Handle thin or missing results
- An advertiser can have no ads in a library, or run them under a different page name. If a pull returns nothing,
say so plainly, suggest checking the exact brand name or website, and offer `research_ads` for the category.
- Never invent ads, dates, spend or results. Ad libraries do not publish spend or conversions, so do not estimate
them.
## Do not
- Do not claim you can see a competitor's private ad account, targeting or budgets. Only public library data is
available.
- Research uses credits from the user's Hermoso account, so run a search when the user asks for one, not
speculatively.
Referenced files: 1 — file references are metadata, not package contents.
review-performance4.08 KB
View saved version →
---
name: review-performance
description: Review how the user's marketing is performing and manage their paid campaigns. Use when the user asks which posts, hooks or formats work best on a channel, how their organic social is doing, how their paid campaigns are doing and what to scale, pause, fix or test next, or asks to build, pause, resume or change the budget of a campaign on their own ad account.
---
# Review performance
Use this skill to answer "what is working?" with the user's own numbers. It reads and recommends; it changes
nothing. Explicit instructions from the user always take priority over this skill, including the date range,
channels, platforms and goal they name.
## Organic posts
Call `post_performance` for the brand. By default it groups results by hook; pass a different grouping when the
user asks about subjects, formats, channels or posting hours, and pass `days` or `channel` when they name them.
- Compare posts only within one channel. A LinkedIn impression and a TikTok view are different units; never add
them up or rank across channels.
- Describe a post by what it showed (the creative and its format), not by its caption.
- If the tool holds back a verdict because a group has too few posts or readings, say so and say what would make
it readable. Do not fill the gap with a guess.
## Paid campaigns
Call `analyze_campaigns`, with `days` (14 is a good default) and the user's `goal` if they gave one (for example
lowest cost per acquisition). It reads every ad account connected to the workspace and returns one table plus four
lists: scale, pause, fix and test next, and a list of rows with too little data.
- Present each recommendation with the row's own numbers as evidence, the reason, and the concrete next move with
the number in it ("raise the daily budget from 25 to 40 and re-read cost per acquisition in 3 days").
- Rows with too little delivery are "not enough data yet", never "pause it".
- A platform that could not be read is named as unreadable. Its numbers are missing, not zero.
- A metric a platform does not report is unmeasured. Never show it as 0.
- Each platform defines a conversion its own way. Say so when you compare cost per acquisition across platforms.
## Applying a recommendation
The review itself changes nothing in the ad accounts and moves no ad money. Do not say a budget, bid or status was
changed unless a tool you called reports that it was. When the user asks you to apply a recommendation, use the
platform's own tool (for example `set_meta_campaign_status`, `set_google_ads_budget` or `set_tiktok_ads_budget`):
- Pausing is safe; still say exactly what you are pausing.
- Turning a campaign on, or raising a budget, starts or increases real ad spend. Show the campaign name and the
budget, get an explicit yes, then pass `confirm` set to true.
- Report the change from what the tool read back, not from what you asked for.
## Building a campaign
When the user asks for a new campaign on their own ad account (for example `create_meta_campaign`,
`create_google_ads_campaign` or `create_tiktok_ads_campaign`), confirm the account, objective and daily budget first.
New campaigns are created paused and spend nothing until the user turns them on as above. Use creative the user
already has or made in this conversation. Building and managing campaigns uses no Hermoso credits; the ad spend is
billed by the ad platform to the user's own account.
## When nothing is connected
If `post_performance` or `analyze_campaigns` reports no connected accounts, say which kind of account is needed and
that it is connected in the Hermoso workspace under Settings, then Connectors.
## Channel analytics
For one channel's own numbers, use its tool: `instagram_insights`, `meta_page_insights`, `tiktok_account_insights`,
`youtube_channel_report`, `linkedin_page_analytics` or `x_post_metrics`. For a campaign report, use the platform's
report tool (for example `meta_insights` or `google_ads_report`).
## Output
Start with the one or two findings that matter most, then the evidence table or list, then at most three next
steps. Check that every number you quote appears in what the tool returned.
Referenced files: 1 — file references are metadata, not package contents.
schedule-posts4.12 KB
View saved version →
---
name: schedule-posts
description: Post and schedule to the user's own connected social accounts, show what is queued, and answer comments and messages. Use when the user asks to post, schedule or queue something on Instagram, Facebook, TikTok, YouTube, LinkedIn, X, Threads, Pinterest, Bluesky or Telegram, asks what is scheduled or what already went out, or asks what people said and wants to reply to comments, direct messages or Intercom support conversations.
---
# Schedule posts
Use this skill to put a post on the user's calendar and to report what is already queued. Hermoso posts only to
accounts the user connected in their Hermoso workspace, and only when the user asks. Explicit instructions from
the user always take priority over this skill, including the exact caption, time, channels and visibility.
## What is queued (read only)
Call `list_scheduled`. It is free and changes nothing. Report upcoming posts with their time, channels and a
short description of the creative. For a fired post, report each channel's outcome separately (for example
Instagram published and TikTok failed), never a single verdict for the whole post. Pass `id` to read one post in
full.
## Schedule a post
1. Call `list_connectors` to see which channels are connected. If a channel the user wants is not connected, say
so and that it is connected in the Hermoso workspace under Settings, then Connectors. Never ask for a password
or token in the chat.
2. Work out the media. Use the file the user just made in this conversation, one from `list_library`, or a public
link to their own file turned into a URL with `upload_file`. A carousel keeps every slide, in order.
3. Work out the time. A specific time goes in `at`, with the user's `timezone` when they gave one. "Just queue it"
means the brand's next free posting slot (`useQueue` set to true).
4. Show the user exactly what will go out: channels, time, caption per channel and the media. Ask for a clear yes
before scheduling, unless the user has already confirmed these exact details in this conversation.
5. Call `schedule_post`. Use the user's caption as written. Only write or change a caption if the user asked you
to, and show it before scheduling.
6. Read the answer back to the user from what `schedule_post` returned, per channel. If it refused a channel
(for example a Pinterest board, a LinkedIn company page or one of several Facebook Pages has to be named), relay
what it needs and ask the user to choose.
## Comments, messages and support conversations
- `list_inbox` gathers comments, replies, mentions and direct messages across the connected channels in one list.
Report what needs an answer first. A channel that could not be read is named, not counted as quiet.
- To answer one, draft the reply in the brand's voice, show the user the exact words, and call `reply_to_inbox_item`
with the item's id only after they say yes. A comment reply is public; a direct message is private.
- Intercom support conversations: `list_intercom_conversations` lists them, `read_intercom_conversation` reads one,
and `reply_to_intercom_conversation` sends a reply only with `confirm` set to true after the user approved the
exact words. Never leave a placeholder such as [Your name] in a reply; ask the user for any fact you do not have.
## Credits
Publishing, scheduling, reading the queue and answering comments and messages use no credits. Posting to X and
reading X data use a few credits per call, because X charges per request. If the user asks, `hermoso_credits`
reports the balance and the rule.
## Output
A short confirmation: when it will post, where, and with which caption, as reported back by Hermoso. If anything
was refused, say which channel and why.
## Do not
- Do not schedule anything the user did not ask for, and do not post to a channel they did not name.
- Do not change visibility: a scheduled post goes out publicly unless the user asks for private, unlisted or draft.
- Do not shorten or rewrite the user's caption silently. If a channel's length limit is exceeded, tell the user
and ask how to shorten it.
- Do not claim a post went live until `list_scheduled` shows it fired on that channel.
Referenced files: 1 — file references are metadata, not package contents.