Persona Generator logo

Persona Generator

OrganizationPopular
Prismer-AI
persona-generator

Given a Council Brief, produce persona-ROLE instance definitions: real, publicly-verifiable people who occupy distinct stakeholder positions on the issue — each a persona-flavored role template (lens / voice / SOUL + the persona-skill capability boundary + icon + an ASCII usernameSlug), handed to convene (council-creator) to be instantiated as a REAL agent. (Search grounding of each person is done by the cloud /councils/plan handler, not by this skill.) Use when the workspace orchestrator needs to convene an expert roundtable ("帮我找几个人聊聊这个 idea"). Personas are LENSES distilled from public records, not the real people — never assert private facts, never impersonate. This skill produces the persona-role DEFINITIONS (who speaks); it does NOT create the group and does NOT drive the discussion — that is council-creator.

Overview

PublisherPrismer-AI
RepositoryPrismerCloud
Skill namepersona-generator
Stars
1.6K
Forks
17
Bundled files
Instructions only
LicenseMIT
Links
  • Markdown instructions

    A SKILL.md file the model loads on demand, so it only costs tokens when a request actually matches.

  • Works with any LLM

    AI skills are plain Markdown, not provider-specific code, so this works with GPT, Claude, Gemini, Grok, or a local model.

  • Self-contained

    Everything the model needs lives in the instructions — no extra files to sync.

  • Open source

    Published by Prismer-AI on GitHub. Read the source before you install it.

Installation

Install the Persona Generator AI skill in TypingMind to use it with any LLM, or drop it into another agent that reads SKILL.md.

1

Install in TypingMind

TypingMind installs a skill straight from its GitHub folder — it reads SKILL.md, bundles the resource files, and stores the result locally.

  1. Open the app and go to Plugins → Skills.
  2. Choose "Install from GitHub".
  3. Paste the skill folder URL below and confirm.
    https://github.com/Prismer-AI/PrismerCloud/tree/main/sdk/cloud/catalog/skills/persona-generator
  4. Enable the skill in any chat where you want it available.
Plugins → Skills → Add skill → From GitHub URL, then paste the folder URL and press Continue.
2

Install in another agent

Any agent that reads the Agent Skills format can use this skill — copy the folder into that agent's skills directory.

Claude Code — .claude/skills
git clone --depth 1 https://github.com/Prismer-AI/PrismerCloud.git /tmp/PrismerCloud
mkdir -p .claude/skills
cp -r /tmp/PrismerCloud/sdk/cloud/catalog/skills/persona-generator .claude/skills/persona-generator
Restart Claude Code after copying so it picks up the new skill.

Use it in TypingMind

Enable Persona Generator in any TypingMind chat and the model takes it from there. Its name and description sit in the system prompt, and the moment a request matches, the model loads the full instructions itself — you never invoke it by hand, and it costs no tokens until it is actually used.

The model loads Persona Generator on its own as soon as a request matches it.

Works with any AI model

AI skills are plain Markdown instructions rather than provider-specific code, so Persona Generator is not tied to the model it was written for. Install it once in TypingMind and use it with GPT-5, Claude, Gemini, Grok, DeepSeek, Mistral, Llama, or a local model you run yourself — all on your own API keys.

  • Loaded only when it is needed

    The system prompt carries just the name and description. The instructions are fetched on the first matching request, so an idle skill costs nothing.

  • Switch models mid-chat

    Because the skill is instructions rather than code, changing model does not break it — the next model reads the same SKILL.md.

Skill instructions

This is the SKILL.md content the model loads. Read it before installing — a skill is instructions your model will follow.

Persona Generator

Who speaks. Given a Council Brief (assembled by the orchestrator from the Team Manager's materials + memory), produce cast: PersonaDef[] — 3–5 people occupying distinct stakeholder positions, each contributing the one thing only their position lets them see. This is a capability skill: the orchestrator calls it to produce data — a set of persona-role instance definitions. Each cast member is a persona-flavored role template def (lens / voice / SOUL + the persona-skill capability boundary + icon + an ASCII usernameSlug) that convene will instantiate as a real agent (createAgentForWorkspace + applyToAgent, M2). It is not a virtual im_users mask — persona = role instance.

DoDo NOT
Enumerate stakeholder positions for the issueCreate the council group (council-creator)
Pick one real person per positionDrive or moderate the discussion (council-creator)
Produce seesWhatOthersDont per personWrite memory (settle phase, via memory skill)
Emit voice (per-turn instructions) per personParse / extract materials (orchestrator tool-skills)
Hand the cast to cloud /councils/plan for groundingRun search verification / supply quotes yourself (cloud does it)
Read droppedCast[] and substitute for dropped peopleInvent people, quotes, or citations — ever

Meta-goal (iron rule — supersedes any "debate" framing)

A discussion is a plurality of viewpoints, not a positive-vs-negative game. Convene people of different identities, professions and stakes; each speaks from their own position. If disagreement emerges it is the natural result of plural perspectives — it is never something you construct. Do not hunt for "an opposing side"; a target function of "construct opposition" structurally excludes the two most valuable classes of people: insiders (dismissed as same-camp) and people who reject the axis entirely (nowhere to stand on it). The UI language is "讨论组" (discussion group), never "吵一架".

Core procedure

Step 0 — List stakeholder positions first (not "axes of disagreement")

Before picking anyone, enumerate the positions whose duty / expertise / stake touches this issue:

运营执行者 / 出资人 / 监管者 / 同行实践者 / 下游客户 / 一线员工 / 被影响的第三方 …

Step 1 — One REAL person per position

  • Pick the person whose real public track record naturally puts them in that position. If no fitting famous person exists for a position (e.g. "this company's own CTO"), pick a real person who once held the equivalent position elsewhere (e.g. another rocket company's former CTO).
  • Never invent a name. Prefer swapping to a position where a real person exists.
  • Do not require them to disagree with each other. They may all agree and still each fill in a piece the Team Manager cannot see.
  • Forbidden: inserting an artificial "opposing side" to manufacture conflict.

For every person you MUST state seesWhatOthersDont — not "which side they are on", but "standing here, they can see X that nobody else at the table can". This field is the core output of the skill.

Step 2 — Attach the persona (who arrives at the table)

  • Enough verifiable public record and a good fit → real name (displayName: "Elon Musk", subtitle: "SpaceX CEO"). Compliance is carried by the disclaimer, never by renaming — "Elon-style Strategy Lens" style abstractions are forbidden (nobody wants to chat with a concept). Internal terms (persona, lens) never surface in UI copy.
  • Otherwise → a role label ("一位持保守立场的航天投资人") — still a person, not a concept.
  • usernameSlug (load-bearing — this is the persona-agent's @-handle): ascii [a-zA-Z0-9_-], 3–20 chars, lowercase slug of the person (e.g. elon-musk). It must NOT start with the reserved prismer- segment. Final uniqueness (<slug>-<conv8> + dedupe suffix) is enforced by the cloud at convene time — you only produce the candidate slug. Why it MUST be ASCII: once instantiated (M2), the persona-agent is addressed in the group only by @<usernameSlug>. The mention router (agent-dispatcher.ts MENTION_RE) is strict ASCII — a bare @中文displayName matches nothing and is silently dropped, so a non-ASCII slug would leave the persona unreachable (0 dispatches, the exact 0/5 failure). The Chinese displayName is display-only; it never routes.

Step 2.5 — Search grounding is done by the CLOUD, not by you

You only produce candidates — position + real person + seesWhatOthersDont

  • candidate usernameSlug. Do NOT run search verification yourself and do NOT supply any realCredential / whySelected quotes. Grounding is performed by the cloud /api/im/councils/plan handler after you hand over the cast.
  • Why cloud, not you (architectural, 04 §2.5): the anti-fabrication defense requires a verbatim substring of a real search snippet, checked in code against full-text search (/api/search). The daemon web_search tool you can reach routes through /api/context/load→/api/compress, so it returns LLM-rewritten prose, not the original text — you physically cannot obtain the verbatim snippet the substring check needs. Any quote you write from memory would be a fabrication that the cloud check exists to reject.
  • What the cloud does with your cast: for each candidate it searches "<displayName> <topic terms>" and requires the person's name + a topic term to co-occur inside the same sentence ("some results exist" / "snippet contains the keyword" passes off-topic celebrities — 04 §2.5 实测: 李开复+商业航天 returned 5 named-but-off-topic hits). Grounded → the persona is kept with groundingSource='searched' and verbatim quote evidence. 0 co-occurrence → the person is dropped from the cast and returned in the plan response's droppedCast[] — read it and substitute someone else for that position (do NOT patch up the quote).
  • You still MUST NOT invent people. Pick a real, publicly verifiable person for each position (swap positions rather than inventing a name) — but leave the evidence to the cloud. Your job ends at "who plausibly sits here"; the cloud decides "is this person actually on-topic".
  • groundingTerms (optional but recommended for mixed-language topics): you MAY attach a short groundingTerms: string[] per candidate — the topic keywords in the language this person's public record is in (English for "Elon Musk", 中文 for a 中文人物). The cloud grounds against these instead of naively tokenizing the question. Without them, a Chinese question ("2026年商业航天进展") tokenizes to CJK bigrams that won't match an English-record person → that person is wrongly dropped. So for an English-record person on a Chinese topic, supply e.g. ["commercial spaceflight", "launch cost"].
  • 🚫 Never use self-critique as fact-checking. Asked to "verify the citations are real", an LLM does not admit it cannot find them — it invents a more specific fake source ("引自2021年新浪财经专访"). Self-critique is allowed only for structural checks (two people on one position? invented names? missing insider view?), never for factual ones.

Step 3 — Handle grounding failures (current searched-only contract)

⚠️ This tiering is applied by the cloud grounding step, not by you — it is shown here so you understand what happens to your candidates. You never set groundingSource yourself. In the current implementation a candidate that is not searched is returned in droppedCast[] for you to substitute.

The criterion is "can it be found by search?" — programmatically checkable — never "does the model know enough?" (unverifiable; models claim they do).

ConditionStrategygroundingSource
Name + topic co-occur in one sentence of a snippetUse its verbatim substring as the quotesearched
Not searchable, including user-material-only candidatesReturned in droppedCast[]; propose a different verifiable candidate or ask for a changed rosternot accepted
No candidate can be verifiedStop the proposal and explain the missing evidence; do not fabricate personasnot accepted

user_materials and role_label are not current accepted fallback tiers. Do not set either yourself or claim the cloud accepted them. A conceptual role-label discussion can be separately requested, but is not this real-agent council workflow. Never fabricate quotes to keep a famous name.

Step 4 — Icon acquisition (cloud-executed; you only reference the result)

Icon fetching and cropping run as pure code on the cloud (Serper image search → Content-Type + magic-bytes double gate → aspect-ratio cull only (0.6 ≤ ar ≤ 1.7, never re-rank by squareness — Google's own ranking encodes "this is the standard portrait") → top-edge square crop, no face-detect). Your responsibility is only to carry the resulting iconAssetRef (an im_assets id) into the PersonaDef, or null when nothing usable was found — the frontend degrades to a monogram. Never inline image bytes or hotlink URLs.

Step 5 — Voice

voice = the persona-role's speaking instructions (markdown): the position, speaking style, and disclaimer discipline. Because persona is now a role instance (not a mask), voice — together with lens and a SOUL 特例档 — is what convene bakes into the persona-agent's role template at instantiation, so the agent speaks in-character from its own session (no one plays five roles). Write voice as durable, self-contained instructions the standalone agent can carry across turns, not one-off remarks. At convene time the cloud persists it onto the persona-agent so later @<usernameSlug> follow-ups reuse it.

Output shape (wire contract — aligns with POST /api/im/councils/plan cast)

jsonc
{
  "cast": [
    {
      "id": "elon-musk",                  // slug — also the personaId in council metadata
      "displayName": "Elon Musk",         // REAL name; compliance rides the disclaimer
      "subtitle": "SpaceX 创始人兼 CEO",   // who this person IS — from primary sources only
      "usernameSlug": "elon-musk",        // ascii @-handle 3-20, no 'prismer-'; cloud dedupes — the ONLY way to reach this persona
      "iconAssetRef": null,               // im_assets id from the cloud icon service, or null
      "position": "同行实践者(已量产的商业航天创始人)",
      "seesWhatOthersDont": "复用一子级的真实成本曲线与产线爬坡节奏",
      // ⚠️ Do NOT supply realCredential / groundingSource — the cloud fills these
      //    from live search after grounding (step 2.5). Omit them from your output.
      "voice": "Speak as a first-principles propulsion founder. Terse. Numbers first. 你是公开资料蒸馏的视角,非本人;Brief 未提供的公司事实一律说「Brief 未提供」。",
      "disclaimer": "公开资料蒸馏视角,非本人"
    }
  ]
}

No stance field (the meta-goal is plural viewpoints, not sides). No lens field (a stance is the runtime product of facts × issue, not a stored attribute). Input: { brief, requestedPersonas?, n? } (default n = 3–5).

Iron principle: persona = lens, Brief = facts (负控 N8)

A persona never carries company facts of its own. Everything about the company comes from the Council Brief the orchestrator assembled. If a persona is asked to assert a company fact the Brief does not provide, it must say "Brief 未提供" or mark needsVerification — never improvise. This is the architectural cure for "stylized bubbles making things up", not a disclaimer. Bake this discipline into every voice you emit.

At settle, council-creator turns this discipline into a wire contract: the report's claims[] each carry sourceRefs[] (the real material a fact stands on) + needsVerification, and unanswerable facts land in gaps[]. So your voice must instruct the persona to speak in grounded, attributable claims — tie each factual statement to the Brief fact it uses, and say "缺数据" (→ needsVerification=true, sourceRefs=[]) rather than inventing a number, so council-creator can emit an honest structured report downstream.

Generator-level eval

Eval judges the generator (input: a Brief; assertions over the cast as a set), never a single persona. Code-enforceable oracles are the two grounding checks (substring + same-sentence co-occurrence); the set-level assertions below are eval judgements (semantic classification):

AssertionCriterion
Positions distinctN personas occupy N different stakeholder positions; no two share one
Insider view present≥1 person sits where outsiders cannot see (operator / front-line / former insider)
No fabricated peopleevery displayName is real and publicly verifiable (realCredential non-empty)
Risk coveragecast covers ≥3 of: capital / tech / market / org / compliance
Grounding realevery quote is a snippet substring + same-sentence co-occurrence (code check)
Brief boundaryno persona asserts company facts beyond the Brief
Honest degradationunsearchable → droppedCast[], substitute or stop; never fabricate a quote

Promote escape hatch

An exceptionally good cast can be saved as a persona-pack skill (static snapshot, metadata.category: council, personaPolicy: public_distillation, disclaimerRequired: true) and published to the marketplace for fork / rate / compose. This is a third, non-default path — the default is always fresh generation against the current Brief.

Configuration

N/A. This skill declares no config: block. Grounding credentials (search API keys) live cloud-side as Nacos global config consumed by the /api/im/councils/plan handler and /api/search — they are never agent-bound, so there is nothing for the skill-config binding system to carry (product204/09 boundary ruling, CONFLICT-7).

Anti-patterns

  • ❌ Inventing a person because a position "needs" someone famous (the documented failure: Will Smith as Relativity's CEO — the real CEO is Tim Ellis). Swap positions instead.
  • ❌ Filling the cast with five competitor CEOs (letting competitors judge your valuation) — that is the retired adversarial framing.
  • ❌ Writing quotes from memory, or "verifying" them by self-critique.
  • ❌ Renaming a real person into a concept ("工程激进视角") to dodge compliance — the disclaimer carries compliance.
  • ❌ Emitting stance / picking a side for anyone.
  • ❌ Creating the group, posting messages, or driving rounds — hand the cast to council-creator.

Frequently asked questions

What does the Persona Generator AI skill do?

Given a Council Brief, produce persona-ROLE instance definitions: real, publicly-verifiable people who occupy distinct stakeholder positions on the issue — each a persona-flavored role template (lens / voice / SOUL + the persona-skill capability boundary + icon + an ASCII usernameSlug), handed to convene (council-creator) to be instantiated as a REAL agent. (Search grounding of each person is done by the cloud /councils/plan handler, not by this skill.) Use when the workspace orchestrator needs to convene an expert roundtable ("帮我找几个人聊聊这个 idea"). Personas are LENSES distilled from public re...

Why use Persona Generator on TypingMind?

Because you install it once and use it with any model. Persona Generator is plain Markdown rather than provider-specific code, so the same skill runs on GPT-5, Claude, Gemini, Grok, or a local model — and you can switch model mid-chat without it breaking. TypingMind runs on your own API keys, so you pay providers directly instead of a per-seat subscription, and your skills and chats stay in your own storage.

How do I install Persona Generator in TypingMind?

Open Plugins → Skills → Install from GitHub in TypingMind and paste https://github.com/Prismer-AI/PrismerCloud/tree/main/sdk/cloud/catalog/skills/persona-generator. TypingMind reads its SKILL.md and installs it as a skill you can enable per chat.

Which AI models can use Persona Generator?

Any model you connect in TypingMind. AI skills are plain Markdown instructions rather than provider-specific code, so GPT, Claude, Gemini, Grok, and local models can all load this skill when a request matches it.

How many AI models can I use with Persona Generator?

As many as you like. As long as a model supports skills, you can use Persona Generator with it — GPT, Claude, Gemini, Grok, DeepSeek, Mistral, Llama and more — all on TypingMind with your own API keys.

Is the Persona Generator AI skill free?

Yes. It is published on GitHub by Prismer-AI under the MIT license. You only pay your own AI provider for the tokens you use.

What are AI skills?

An AI skill is a reusable instruction bundle that teaches an AI model how to do one specific task. It follows the open Agent Skills format: a SKILL.md file with a name and description, plus any scripts, templates or reference files the model may need. The model reads the instructions only when your request matches the skill, so an installed skill costs nothing until it is used.

How are AI skills different from plugins or MCP servers?

A plugin or MCP server gives a model new tools to call — code that runs somewhere and returns a result. An AI skill gives the model knowledge and process instead: how to approach a task, which steps to follow, what good output looks like. Skills are plain Markdown, so they need no server, no API key and no runtime, and they work with any model.

View all

Set up your own AI workspace now

Get notified about new features and future giveaways by subscribing to our newsletter 👇