{
  "schemaVersion": "1.0",
  "item": {
    "slug": "faces",
    "name": "Faces",
    "source": "tencent",
    "type": "skill",
    "category": "AI 智能",
    "sourceUrl": "https://clawhub.ai/sybileak/faces",
    "canonicalUrl": "https://clawhub.ai/sybileak/faces",
    "targetPlatform": "OpenClaw"
  },
  "install": {
    "downloadMode": "redirect",
    "downloadUrl": "/downloads/faces",
    "sourceDownloadUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=faces",
    "sourcePlatform": "tencent",
    "targetPlatform": "OpenClaw",
    "installMethod": "Manual import",
    "extraction": "Extract archive",
    "prerequisites": [
      "OpenClaw"
    ],
    "packageFormat": "ZIP package",
    "includedAssets": [
      "SKILL.md",
      "references/REFERENCE.md",
      "references/SCOPE.md",
      "references/CONCEPTS.md",
      "references/OAUTH.md"
    ],
    "primaryDoc": "SKILL.md",
    "quickSetup": [
      "Download the package from Yavira.",
      "Extract the archive and review SKILL.md first.",
      "Import or place the package into your OpenClaw setup."
    ],
    "agentAssist": {
      "summary": "Hand the extracted package to your coding agent with a concrete install brief instead of figuring it out manually.",
      "steps": [
        "Download the package from Yavira.",
        "Extract it into a folder your agent can access.",
        "Paste one of the prompts below and point your agent at the extracted folder."
      ],
      "prompts": [
        {
          "label": "New install",
          "body": "I downloaded a skill package from Yavira. Read SKILL.md from the extracted folder and install it by following the included instructions. Tell me what you changed and call out any manual steps you could not complete."
        },
        {
          "label": "Upgrade existing",
          "body": "I downloaded an updated skill package from Yavira. Read SKILL.md from the extracted folder, compare it with my current installation, and upgrade it while preserving any custom configuration unless the package docs explicitly say otherwise. Summarize what changed and any follow-up checks I should run."
        }
      ]
    },
    "sourceHealth": {
      "source": "tencent",
      "slug": "faces",
      "status": "healthy",
      "reason": "direct_download_ok",
      "recommendedAction": "download",
      "checkedAt": "2026-05-01T10:48:09.557Z",
      "expiresAt": "2026-05-08T10:48:09.557Z",
      "httpStatus": 200,
      "finalUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=faces",
      "contentType": "application/zip",
      "probeMethod": "head",
      "details": {
        "probeUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=faces",
        "contentDisposition": "attachment; filename=\"faces-1.6.5.zip\"",
        "redirectLocation": null,
        "bodySnippet": null,
        "slug": "faces"
      },
      "scope": "item",
      "summary": "Item download looks usable.",
      "detail": "Yavira can redirect you to the upstream package for this item.",
      "primaryActionLabel": "Download for OpenClaw",
      "primaryActionHref": "/downloads/faces"
    },
    "validation": {
      "installChecklist": [
        "Use the Yavira download entry.",
        "Review SKILL.md after the package is downloaded.",
        "Confirm the extracted package contains the expected setup assets."
      ],
      "postInstallChecks": [
        "Confirm the extracted package includes the expected docs or setup files.",
        "Validate the skill or prompts are available in your target agent workspace.",
        "Capture any manual follow-up steps the agent could not complete."
      ]
    },
    "downloadPageUrl": "https://openagent3.xyz/downloads/faces",
    "agentPageUrl": "https://openagent3.xyz/skills/faces/agent",
    "manifestUrl": "https://openagent3.xyz/skills/faces/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/faces/agent.md"
  },
  "agentAssist": {
    "summary": "Hand the extracted package to your coding agent with a concrete install brief instead of figuring it out manually.",
    "steps": [
      "Download the package from Yavira.",
      "Extract it into a folder your agent can access.",
      "Paste one of the prompts below and point your agent at the extracted folder."
    ],
    "prompts": [
      {
        "label": "New install",
        "body": "I downloaded a skill package from Yavira. Read SKILL.md from the extracted folder and install it by following the included instructions. Tell me what you changed and call out any manual steps you could not complete."
      },
      {
        "label": "Upgrade existing",
        "body": "I downloaded an updated skill package from Yavira. Read SKILL.md from the extracted folder, compare it with my current installation, and upgrade it while preserving any custom configuration unless the package docs explicitly say otherwise. Summarize what changed and any follow-up checks I should run."
      }
    ]
  },
  "documentation": {
    "source": "clawhub",
    "primaryDoc": "SKILL.md",
    "sections": [
      {
        "title": "Faces Skill",
        "body": "You have access to the faces CLI. Use it to fulfill any Faces Platform request.\n\nAlways use --json when you need to extract values from command output."
      },
      {
        "title": "Current config",
        "body": "!faces config:show 2>/dev/null || echo \"(no config saved)\""
      },
      {
        "title": "Setup",
        "body": "Before running any command, verify credentials are available:\n\nfaces config:show          # see what's saved\nfaces auth:whoami          # confirm login works\n\nIf no credentials exist and the user hasn't provided a key:\n\nFor interactive sessions: run faces auth:login and prompt for email + password\nFor API-key-only context: tell the user to set FACES_API_KEY=<key> or run faces config:set api_key <key>\n\nInstall (if faces command not found):\n\nnpm install -g faces-cli"
      },
      {
        "title": "Auth rules",
        "body": "Command groupRequiresfaces auth:*, faces keys:*JWT only — run faces auth:login firstEverything elseJWT or API key"
      },
      {
        "title": "Core workflow",
        "body": "Create a Face: faces face:create --name \"Name\" --username slug\nCompile source material into it — local files or YouTube URLs\nSync to extract and embed cognitive primitives\nChat through the Face: faces chat:chat slug -m \"message\"\nCompare Faces: faces face:diff or faces face:neighbors\nCompose new Faces from boolean formulas: faces face:create --formula \"a | b\"\n\nBoolean operators: | (union), & (intersection), - (difference), ^ (symmetric difference). Parentheses supported: (a | b) - c."
      },
      {
        "title": "Compile a document into a face",
        "body": "DOC_ID=$(faces compile:doc:create <face_id> --label \"Notes\" --file notes.txt --json | jq -r '.id')\nfaces compile:doc:prepare \"$DOC_ID\"\nfaces compile:doc:sync \"$DOC_ID\" --yes"
      },
      {
        "title": "Upload a file (PDF, audio, video, text)",
        "body": "faces face:upload <face_id> --file report.pdf --kind document\nfaces face:upload <face_id> --file interview.mp4 --kind thread"
      },
      {
        "title": "Import a YouTube video",
        "body": "# Solo talk / monologue → document\nfaces compile:import <face_id> \\\n  --url \"https://www.youtube.com/watch?v=VIDEO_ID\" \\\n  --type document --perspective first-person\n\n# Then prepare and sync:\nfaces compile:doc:prepare <doc_id>\nfaces compile:doc:sync <doc_id> --yes\n\n# Multi-speaker → thread (no prepare step needed)\nfaces compile:import <face_id> \\\n  --url \"https://youtu.be/VIDEO_ID\" \\\n  --type thread --perspective first-person --face-speaker A\nfaces compile:thread:sync <thread_id>\n\nIf --type thread fails with a 422, retry with --type document."
      },
      {
        "title": "Create a composite face",
        "body": "faces face:create --name \"The Realist\" --username the-realist \\\n  --formula \"the-optimist | the-pessimist\"\n\n# Chat through it like any other face\nfaces chat:chat the-realist -m \"How do you approach risk?\"\n\nComposite faces are live: sync new knowledge into any component and the composite updates automatically. Components must be concrete (compiled) faces you own."
      },
      {
        "title": "Compare faces",
        "body": "faces face:diff --face aria --face marco --face jin\nfaces face:neighbors aria --k 3\nfaces face:neighbors aria --component beta --direction furthest --k 5"
      },
      {
        "title": "Chat with a specific LLM",
        "body": "faces chat:chat slug --llm claude-sonnet-4-6 -m \"message\"\nfaces chat:messages slug@claude-sonnet-4-6 -m \"message\" --max-tokens 512\nfaces chat:responses slug@gpt-4o -m \"message\""
      },
      {
        "title": "Billing and API keys",
        "body": "faces billing:balance --json\nfaces billing:subscription --json\nfaces keys:create --name \"Partner key\" --face slug --budget 10.00 --expires-days 30"
      },
      {
        "title": "Common errors",
        "body": "faces: command not found — Run npm install -g faces-cli.\n401 Unauthorized — Credentials missing or expired. Run faces auth:login or check FACES_API_KEY.\ncompile:doc:prepare returns \"processing\" — Extraction is async. Poll with faces compile:doc:get <doc_id> --json | jq '.status' until status is ready, then sync.\n422 on thread import — No speaker segments detected. Retry with --type document.\nface:diff or face:neighbors returns null components — The face hasn't been synced yet. Run the compile+sync workflow first."
      },
      {
        "title": "References",
        "body": "See references/REFERENCE.md for the full command reference, global flags, and environment variables.\nSee references/CONCEPTS.md for a detailed explanation of what Faces is, how it works, and example use cases.\nSee references/OAUTH.md for connecting a ChatGPT account (connect plan only).\nSee references/SCOPE.md for instruction scope and security boundaries."
      }
    ],
    "body": "Faces Skill\n\nYou have access to the faces CLI. Use it to fulfill any Faces Platform request.\n\nAlways use --json when you need to extract values from command output.\n\nCurrent config\n\n!faces config:show 2>/dev/null || echo \"(no config saved)\"\n\nSetup\n\nBefore running any command, verify credentials are available:\n\nfaces config:show          # see what's saved\nfaces auth:whoami          # confirm login works\n\n\nIf no credentials exist and the user hasn't provided a key:\n\nFor interactive sessions: run faces auth:login and prompt for email + password\nFor API-key-only context: tell the user to set FACES_API_KEY=<key> or run faces config:set api_key <key>\n\nInstall (if faces command not found):\n\nnpm install -g faces-cli\n\nAuth rules\nCommand group\tRequires\nfaces auth:*, faces keys:*\tJWT only — run faces auth:login first\nEverything else\tJWT or API key\nCore workflow\nCreate a Face: faces face:create --name \"Name\" --username slug\nCompile source material into it — local files or YouTube URLs\nSync to extract and embed cognitive primitives\nChat through the Face: faces chat:chat slug -m \"message\"\nCompare Faces: faces face:diff or faces face:neighbors\nCompose new Faces from boolean formulas: faces face:create --formula \"a | b\"\n\nBoolean operators: | (union), & (intersection), - (difference), ^ (symmetric difference). Parentheses supported: (a | b) - c.\n\nCommon tasks\nCompile a document into a face\nDOC_ID=$(faces compile:doc:create <face_id> --label \"Notes\" --file notes.txt --json | jq -r '.id')\nfaces compile:doc:prepare \"$DOC_ID\"\nfaces compile:doc:sync \"$DOC_ID\" --yes\n\nUpload a file (PDF, audio, video, text)\nfaces face:upload <face_id> --file report.pdf --kind document\nfaces face:upload <face_id> --file interview.mp4 --kind thread\n\nImport a YouTube video\n# Solo talk / monologue → document\nfaces compile:import <face_id> \\\n  --url \"https://www.youtube.com/watch?v=VIDEO_ID\" \\\n  --type document --perspective first-person\n\n# Then prepare and sync:\nfaces compile:doc:prepare <doc_id>\nfaces compile:doc:sync <doc_id> --yes\n\n# Multi-speaker → thread (no prepare step needed)\nfaces compile:import <face_id> \\\n  --url \"https://youtu.be/VIDEO_ID\" \\\n  --type thread --perspective first-person --face-speaker A\nfaces compile:thread:sync <thread_id>\n\n\nIf --type thread fails with a 422, retry with --type document.\n\nCreate a composite face\nfaces face:create --name \"The Realist\" --username the-realist \\\n  --formula \"the-optimist | the-pessimist\"\n\n# Chat through it like any other face\nfaces chat:chat the-realist -m \"How do you approach risk?\"\n\n\nComposite faces are live: sync new knowledge into any component and the composite updates automatically. Components must be concrete (compiled) faces you own.\n\nCompare faces\nfaces face:diff --face aria --face marco --face jin\nfaces face:neighbors aria --k 3\nfaces face:neighbors aria --component beta --direction furthest --k 5\n\nChat with a specific LLM\nfaces chat:chat slug --llm claude-sonnet-4-6 -m \"message\"\nfaces chat:messages slug@claude-sonnet-4-6 -m \"message\" --max-tokens 512\nfaces chat:responses slug@gpt-4o -m \"message\"\n\nBilling and API keys\nfaces billing:balance --json\nfaces billing:subscription --json\nfaces keys:create --name \"Partner key\" --face slug --budget 10.00 --expires-days 30\n\nCommon errors\nfaces: command not found — Run npm install -g faces-cli.\n401 Unauthorized — Credentials missing or expired. Run faces auth:login or check FACES_API_KEY.\ncompile:doc:prepare returns \"processing\" — Extraction is async. Poll with faces compile:doc:get <doc_id> --json | jq '.status' until status is ready, then sync.\n422 on thread import — No speaker segments detected. Retry with --type document.\nface:diff or face:neighbors returns null components — The face hasn't been synced yet. Run the compile+sync workflow first.\nReferences\nSee references/REFERENCE.md for the full command reference, global flags, and environment variables.\nSee references/CONCEPTS.md for a detailed explanation of what Faces is, how it works, and example use cases.\nSee references/OAUTH.md for connecting a ChatGPT account (connect plan only).\nSee references/SCOPE.md for instruction scope and security boundaries."
  },
  "trust": {
    "sourceLabel": "tencent",
    "provenanceUrl": "https://clawhub.ai/sybileak/faces",
    "publisherUrl": "https://clawhub.ai/sybileak/faces",
    "owner": "sybileak",
    "version": "1.4.0",
    "license": null,
    "verificationStatus": "Indexed source record"
  },
  "links": {
    "detailUrl": "https://openagent3.xyz/skills/faces",
    "downloadUrl": "https://openagent3.xyz/downloads/faces",
    "agentUrl": "https://openagent3.xyz/skills/faces/agent",
    "manifestUrl": "https://openagent3.xyz/skills/faces/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/faces/agent.md"
  }
}