addedInput schema / properties / api_key / description
Added value: +"API key for this call. Omit to fall back to the Authorization: Bearer / X-API-Key request header (streamable-HTTP only), then the VHGENGINE_API_KEY env var (the stdio default). No key resolvable -> unauthorized."
addedInput schema / properties / archetype
Added value: +{
+ "anyOf": [
+ {
+ "enum": [
+ "curiosity_gap",
+ "contrarian",
+ "data_shock",
+ "story",
+ "transformation",
+ "listicle",
+ "authority",
+ "urgency"
+ ],
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "default": null,
+ "description": "Alias for `target_archetype`, spelled the way every hook object in every response spells it. Send either one; sending both is fine only if they are equal, and a disagreement is a typed invalid_request rather than a silent winner.",
+ "enum": [
+ "curiosity_gap",
+ "contrarian",
+ "data_shock",
+ "story",
+ "transformation",
+ "listicle",
+ "authority",
+ "urgency",
+ null
+ ],
+ "title": "Archetype"
+}
addedInput schema / properties / count / description
Added value: +"How many variants to produce, 1-5, at 2 credits each. You are billed only for variants actually returned."
addedInput schema / properties / hook_id
Added value: +{
+ "anyOf": [
+ {
+ "maxLength": 64,
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "default": null,
+ "description": "Remix a hook you ALREADY bought, by the id a generate/batch/remix response returned (also listed by list_hooks): the stored text is looked up for you, so you do not have to carry it back. Account-scoped, so an unknown or foreign id is the same not_found get_hook returns. Pass this OR `text`, never both and never neither.",
+ "maxLength": 64,
+ "title": "Hook Id"
+}
addedInput schema / properties / idempotency_key / description
Added value: +"Caller-chosen replay key (any string, unique per intended effect). A repeat call with the SAME key returns the stored result and is NEVER charged twice; the same key with different arguments is an idempotency_conflict. Omit and every call is a fresh, separately charged operation."
addedInput schema / properties / platform
Added value: +{
+ "anyOf": [
+ {
+ "enum": [
+ "tiktok",
+ "instagram",
+ "youtube",
+ "x",
+ "linkedin"
+ ],
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "default": null,
+ "description": "The platform whose SCORING WINDOW grades these variants, as on generate_hooks and score_hook: LinkedIn's ideal hook length is 10-18 words against 8-14 elsewhere, so it moves both score.total and the rank order. Each variant's total is then reproducible through score_hook with the SAME platform, and the scale used is echoed back as `platform`. Omit for tiktok (unchanged behaviour).",
+ "enum": [
+ "tiktok",
+ "instagram",
+ "youtube",
+ "x",
+ "linkedin",
+ null
+ ],
+ "title": "Platform"
+}
changedInput schema / properties / tags / anyOf
Previous value: -[
- {
- "items": {
- "maxLength": 40,
- "minLength": 1,
- "pattern": "^[a-z0-9_-]+$",
- "type": "string"
- },
- "maxItems": 5,
- "minItems": 1,
- "type": "array"
- },
- {
- "type": "null"
- }
-]New value: +[
+ {
+ "items": {
+ "maxLength": 40,
+ "minLength": 1,
+ "pattern": "^[a-z0-9_-]+$",
+ "type": "string"
+ },
+ "maxItems": 5,
+ "type": "array"
+ },
+ {
+ "type": "null"
+ }
+]
addedInput schema / properties / tags / description
Added value: +"1-5 lowercase slug tags ([a-z0-9_-], <=40 chars) stamped on this call's usage event so a fleet can attribute spend per campaign. Omit for no tagging. Filter later with get_usage(tag=...) / list_hooks(tag=...)."
addedInput schema / properties / tags / items
Added value: +{
+ "maxLength": 40,
+ "minLength": 1,
+ "pattern": "^[a-z0-9_-]+$",
+ "type": "string"
+}
addedInput schema / properties / tags / maxItems
Added value: +5
addedInput schema / properties / target_archetype / anyOf
Added value: +[
+ {
+ "enum": [
+ "curiosity_gap",
+ "contrarian",
+ "data_shock",
+ "story",
+ "transformation",
+ "listicle",
+ "authority",
+ "urgency"
+ ],
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+]
addedInput schema / properties / target_archetype / default
Added value: +null
addedInput schema / properties / target_archetype / description
Added value: +"Archetype id to rewrite INTO (see list_archetypes for ids and their psychology). `archetype` is an accepted alias for this argument; one of the two is required, there is no default angle."
changedInput schema / properties / target_archetype / enum
Previous value: -[
- "curiosity_gap",
- "contrarian",
- "data_shock",
- "story",
- "transformation",
- "listicle",
- "authority",
- "urgency"
-]New value: +[
+ "curiosity_gap",
+ "contrarian",
+ "data_shock",
+ "story",
+ "transformation",
+ "listicle",
+ "authority",
+ "urgency",
+ null
+]
removedInput schema / properties / target_archetype / type
Removed value: -"string"
addedInput schema / properties / text / anyOf
Added value: +[
+ {
+ "maxLength": 300,
+ "minLength": 3,
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+]
addedInput schema / properties / text / default
Added value: +null
addedInput schema / properties / text / description
Added value: +"The existing hook to rewrite, 3-300 chars. Its subject is kept; only the angle moves to target_archetype. Pass this OR `hook_id`, never both and never neither."
removedInput schema / properties / text / type
Removed value: -"string"
addedInput schema / properties / topic
Added value: +{
+ "anyOf": [
+ {
+ "maxLength": 200,
+ "minLength": 3,
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "default": null,
+ "description": "The subject the hook was written FOR, scored as on score_hook: the verbatim-echo penalty only fires when the scorer is told the topic, so a hook (or a variant) that repeats its own subject scores up to 8 points higher without it and the rank order of the pack can differ. Only needed with `text`: a remix by `hook_id` reads the topic off the hook you bought. Sending both is fine when they are equal and a disagreement is a typed invalid_request rather than a silent winner. Omit for unchanged behaviour.",
+ "maxLength": 200,
+ "minLength": 3,
+ "title": "Topic"
+}
addedInput schema / properties / verbosity / description
Added value: +"How much of the response envelope to return: minimal (ids/text/totals only), standard (the default), full (adds per-dimension score attribution and timings). Shapes the RESPONSE only, never what is generated, persisted, hashed for idempotency, or charged."
removedInput schema / required
Removed value: -[
- "text",
- "target_archetype"
-]
addedOutput schema / description
Added value: +"The original plus its rewrites into the target archetype. 2 credits per variant."
addedOutput schema / properties
Added value: +{
+ "credits_charged": {
+ "description": "Credits this call actually cost.",
+ "type": [
+ "number",
+ "null"
+ ]
+ },
+ "credits_remaining": {
+ "description": "Your balance AFTER this charge.",
+ "type": [
+ "number",
+ "null"
+ ]
+ },
+ "llm_fallback": {
+ "description": "true when the LLM remixer was unavailable and the deterministic one ran; llm_fallback_reason says why. You are billed for what RAN.",
+ "type": [
+ "boolean",
+ "null"
+ ]
+ },
+ "llm_fallback_reason": {
+ "description": "Why the fallback happened, or null.",
+ "type": [
+ "string",
+ "null"
+ ]
+ },
+ "original": {
+ "description": "{text, score} of what you passed in.",
+ "type": [
+ "object",
+ "null"
+ ]
+ },
+ "platform": {
+ "description": "The platform scoring window every total above was produced on. Score a variant through score_hook with this SAME platform to reproduce its number; a different window gives a different total and a different rank. null when the request named none, which means the tiktok default.",
+ "type": [
+ "string",
+ "null"
+ ]
+ },
+ "reason": {
+ "description": "Why these rewrites fit the target archetype, or null.",
+ "type": [
+ "string",
+ "null"
+ ]
+ },
+ "remix_engine": {
+ "description": "Which remixer produced the variants.",
+ "type": [
+ "string",
+ "null"
+ ]
+ },
+ "remixes": {
+ "description": "The variants: {id, text, archetype, score, rank}. Billed per variant RETURNED, so this can be shorter than count.",
+ "type": [
+ "array",
+ "null"
+ ]
+ },
+ "replayed": {
+ "description": "true when an idempotency_key replayed a stored result, so nothing was charged again. The credits_charged below is what the ORIGINAL call cost.",
+ "type": [
+ "boolean",
+ "null"
+ ]
+ },
+ "replayed_at_charge": {
+ "description": "true when the replay was detected at the charge boundary rather than up front; either way you are billed exactly once.",
+ "type": [
+ "boolean",
+ "null"
+ ]
+ },
+ "request_id": {
+ "description": "Id of this call. Keep it: get_usage(request_id=...) itemises exactly what it charged, and it identifies the call in a support question.",
+ "type": [
+ "string",
+ "null"
+ ]
+ },
+ "score_disclaimer": {
+ "description": "The honest limits of the score attached above.",
+ "type": [
+ "string",
+ "null"
+ ]
+ },
+ "topic_core": {
+ "description": "The subject the remixer preserved from the original.",
+ "type": [
+ "string",
+ "null"
+ ]
+ }
+}
removedOutput schema / title
Removed value: -"remix_hookDictOutput"