{
  "schemaVersion": "1.0",
  "item": {
    "slug": "igpt-email-ask",
    "name": "iGPT email ask",
    "source": "tencent",
    "type": "skill",
    "category": "开发工具",
    "sourceUrl": "https://clawhub.ai/Sammy-spk/igpt-email-ask",
    "canonicalUrl": "https://clawhub.ai/Sammy-spk/igpt-email-ask",
    "targetPlatform": "OpenClaw"
  },
  "install": {
    "downloadMode": "redirect",
    "downloadUrl": "/downloads/igpt-email-ask",
    "sourceDownloadUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=igpt-email-ask",
    "sourcePlatform": "tencent",
    "targetPlatform": "OpenClaw",
    "installMethod": "Manual import",
    "extraction": "Extract archive",
    "prerequisites": [
      "OpenClaw"
    ],
    "packageFormat": "ZIP package",
    "includedAssets": [
      "SKILL.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",
      "status": "healthy",
      "reason": "direct_download_ok",
      "recommendedAction": "download",
      "checkedAt": "2026-05-07T17:22:31.273Z",
      "expiresAt": "2026-05-14T17:22:31.273Z",
      "httpStatus": 200,
      "finalUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=afrexai-annual-report",
      "contentType": "application/zip",
      "probeMethod": "head",
      "details": {
        "probeUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=afrexai-annual-report",
        "contentDisposition": "attachment; filename=\"afrexai-annual-report-1.0.0.zip\"",
        "redirectLocation": null,
        "bodySnippet": null
      },
      "scope": "source",
      "summary": "Source download looks usable.",
      "detail": "Yavira can redirect you to the upstream package for this source.",
      "primaryActionLabel": "Download for OpenClaw",
      "primaryActionHref": "/downloads/igpt-email-ask"
    },
    "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/igpt-email-ask",
    "agentPageUrl": "https://openagent3.xyz/skills/igpt-email-ask/agent",
    "manifestUrl": "https://openagent3.xyz/skills/igpt-email-ask/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/igpt-email-ask/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": "iGPT Email Ask",
        "body": "Ask questions about a user's email and get reasoned, structured answers. Powered by iGPT's Context Engine, which reconstructs conversations, decisions, ownership, and intent across time."
      },
      {
        "title": "What This Skill Does",
        "body": "This skill queries iGPT's recall/ask endpoint to generate answers grounded in a user's connected email data. Unlike basic retrieval, the Context Engine:\n\nReconstructs full conversation threads across replies, forwards, and CCs\nIdentifies who decided what, who owns what, and what's still open\nExtracts structured data (tasks, deadlines, contacts, risks) from unstructured email\nSupports multiple quality tiers for different complexity levels\nReturns text, JSON, or schema-validated structured output\nSupports streaming (SSE) for real-time responses"
      },
      {
        "title": "When to Use This Skill",
        "body": "Summarize what happened in a thread or across threads\nExtract action items, decisions, or open questions\nAnalyze sentiment or risk in deal/customer threads\nAnswer questions that require understanding context across multiple emails\nGenerate structured data from email content (JSON, schema-validated)\nPrepare briefings before meetings based on recent correspondence"
      },
      {
        "title": "Prerequisites",
        "body": "An iGPT API key (get one at https://igpt.ai/hub/apikeys/)\nA connected email datasource -- the user must have completed OAuth authorization via connectors/authorize before ask will return results. You can check connection status with datasources.list().\nPython >= 3.8 with the igptai package installed"
      },
      {
        "title": "Setup",
        "body": "pip install igptai\n\nSet your API key as an environment variable:\n\nexport IGPT_API_KEY=\"your-api-key-here\""
      },
      {
        "title": "Basic: Ask a question",
        "body": "from igptai import IGPT\nimport os\n\nigpt = IGPT(api_key=os.environ[\"IGPT_API_KEY\"], user=\"user_123\")\n\nres = igpt.recall.ask(input=\"Summarize key risks, decisions, and next steps from this week's meetings.\")\nif res is not None and res.get(\"error\"):\n    print(\"iGPT error:\", res)\nelse:\n    print(res)"
      },
      {
        "title": "Get JSON output",
        "body": "Pass output_format=\"json\" for unstructured JSON, or provide a schema for validated structured output:\n\n# Simple JSON output\nres = igpt.recall.ask(\n    input=\"What are the open action items from this week?\",\n    output_format=\"json\"\n)\n\n# Schema-validated structured output\nres = igpt.recall.ask(\n    input=\"Open action items from this week\",\n    quality=\"cef-1-normal\",\n    output_format={\n        \"strict\": True,\n        \"schema\": {\n            \"type\": \"object\",\n            \"required\": [\"action_items\"],\n            \"additionalProperties\": False,\n            \"properties\": {\n                \"action_items\": {\n                    \"type\": \"array\",\n                    \"items\": {\n                        \"type\": \"object\",\n                        \"required\": [\"title\", \"owner\", \"due_date\"],\n                        \"properties\": {\n                            \"title\": {\"type\": \"string\"},\n                            \"owner\": {\"type\": \"string\"},\n                            \"due_date\": {\"type\": \"string\"}\n                        }\n                    }\n                }\n            }\n        }\n    }\n)\nprint(res)\n\nExample response:\n\n{\n    \"action_items\": [\n        {\n            \"title\": \"Approve revised Q1 budget allocation\",\n            \"owner\": \"Dvir Ben-Aroya\",\n            \"due_date\": \"2026-01-15\"\n        },\n        {\n            \"title\": \"Approve final FY2026 strategic priorities\",\n            \"owner\": \"Board of Directors\",\n            \"due_date\": \"2026-01-31\"\n        }\n    ]\n}"
      },
      {
        "title": "Use quality tiers",
        "body": "iGPT's Context Engine has three quality tiers:\n\n# Normal: fast, good for straightforward questions\nres = igpt.recall.ask(\n    input=\"When is my next meeting with Acme Corp?\",\n    quality=\"cef-1-normal\"\n)\n\n# High: deeper reasoning, better for complex multi-thread analysis\nres = igpt.recall.ask(\n    input=\"What is the current negotiation status with Acme Corp and what leverage do we have?\",\n    quality=\"cef-1-high\"\n)\n\n# Reasoning: maximum depth, for complex cross-thread synthesis\nres = igpt.recall.ask(\n    input=\"Across all communication with Acme over the past quarter, what patterns suggest risk and what should we do about it?\",\n    quality=\"cef-1-reasoning\"\n)"
      },
      {
        "title": "Stream responses",
        "body": "Streaming returns parsed JSON chunks (dicts), not raw text. Extract content from each chunk:\n\nstream = igpt.recall.ask(\n    input=\"Walk me through the timeline of the Acme deal from first contact to now.\",\n    stream=True\n)\n\nfor chunk in stream:\n    if isinstance(chunk, dict) and chunk.get(\"error\"):\n        print(\"Stream error:\", chunk)\n        break\n    # Each chunk is a parsed JSON dict\n    print(chunk)\n\nStreaming is resilient: if the connection breaks, the iterator yields an error chunk and finishes rather than throwing."
      },
      {
        "title": "Check datasource connection before asking",
        "body": "# Verify user has a connected datasource\nstatus = igpt.datasources.list()\nif status is not None and not status.get(\"error\"):\n    print(\"Connected datasources:\", status)\nelse:\n    # Connect a datasource first\n    auth = igpt.connectors.authorize(service=\"spike\", scope=\"messages\")\n    print(\"Open this URL to authorize:\", auth.get(\"url\"))"
      },
      {
        "title": "Parameters",
        "body": "ParameterTypeRequiredDescriptioninputstringYesThe prompt or question to ask.userstringYes (or set in constructor)Unique user identifier scoping the query to their connected data. Per-call value overrides constructor default.streambooleanNo (default: false)If true, returns a generator yielding parsed JSON dicts via SSE.qualitystringNoContext Engine quality tier: \"cef-1-normal\", \"cef-1-high\", or \"cef-1-reasoning\".output_formatstring or objectNo\"text\" (default), \"json\", or {\"strict\": true, \"schema\": <JSON Schema>} for validated structured output."
      },
      {
        "title": "Error Handling",
        "body": "The SDK does not throw exceptions. It returns normalized error objects:\n\nres = igpt.recall.ask(input=\"What happened in yesterday's board meeting?\")\n\nif res is not None and res.get(\"error\"):\n    error = res[\"error\"]\n    if error == \"auth\":\n        print(\"Check your API key\")\n    elif error == \"params\":\n        print(\"Check your request parameters\")\n    elif error == \"network_error\":\n        print(\"Network issue -- the SDK retries with exponential backoff (3 attempts by default) before returning this\")\nelse:\n    print(res)"
      },
      {
        "title": "External Endpoints",
        "body": "This skill communicates exclusively with:\n\nhttps://api.igpt.ai/v1/recall/ask/ -- the reasoning endpoint\nhttps://api.igpt.ai/v1/connectors/authorize/ -- only during initial datasource connection setup\nhttps://api.igpt.ai/v1/datasources/list/ -- to check connection status\n\nNo other external endpoints are contacted. No data is sent to any third-party service. The igptai PyPI package source is available at https://github.com/igptai/igpt-python."
      },
      {
        "title": "Security & Privacy",
        "body": "API-key scoped: All requests authenticate via IGPT_API_KEY sent as a Bearer token over HTTPS. No shell access, no filesystem access, no system commands.\nPer-user isolation: Every query is scoped to a specific user identifier. User A cannot access User B's email data. Isolation is enforced at the index and execution level, not as a filter layer.\nOAuth read-only: The email datasource connection uses OAuth with read-only scopes. The skill does not send, modify, or delete emails.\nNo data retention: Prompts are discarded after execution. Memory is reconstructed on-demand, not stored.\nTransport encryption: All communication occurs over HTTPS. No plaintext endpoints.\nNo local persistence: This skill does not write to disk, modify environment files, or create persistent configuration outside of the standard IGPT_API_KEY environment variable.\nBuilt-in retries: The SDK retries failed requests with exponential backoff (default: 3 attempts, 100ms base, 2x factor) before returning a network_error.\n\nFor the full security model, see https://docs.igpt.ai/docs/security/model."
      },
      {
        "title": "What This Skill Does NOT Do",
        "body": "Does not send, modify, forward, or delete emails\nDoes not access the filesystem or execute shell commands\nDoes not install persistent services or scheduled tasks\nDoes not contact endpoints other than api.igpt.ai\nDoes not store API keys or OAuth tokens outside the environment variable"
      },
      {
        "title": "Example Questions",
        "body": "These all work as natural language prompts:\n\n\"Summarize key risks from this week's email threads\" -- cross-thread analysis\n\"What are the open action items from yesterday's board meeting?\" -- task extraction\n\"What's the current status of the Acme deal?\" -- deal intelligence\n\"Who owns the budget approval and when is it due?\" -- ownership and deadline extraction\n\"Are there any threads where tone has shifted negatively in the last 7 days?\" -- sentiment analysis\n\"Generate a briefing for my meeting with Sarah tomorrow\" -- meeting prep"
      },
      {
        "title": "Resources",
        "body": "Get API Key: https://igpt.ai/hub/apikeys/\nDocumentation: https://docs.igpt.ai\nAPI Reference: https://docs.igpt.ai/docs/api-reference/ask\nPlayground: https://igpt.ai/hub/playground/\nPython SDK: https://pypi.org/project/igptai/\nNode.js SDK: https://www.npmjs.com/package/igptai\nGitHub: https://github.com/igptai/igpt-python"
      }
    ],
    "body": "iGPT Email Ask\n\nAsk questions about a user's email and get reasoned, structured answers. Powered by iGPT's Context Engine, which reconstructs conversations, decisions, ownership, and intent across time.\n\nWhat This Skill Does\n\nThis skill queries iGPT's recall/ask endpoint to generate answers grounded in a user's connected email data. Unlike basic retrieval, the Context Engine:\n\nReconstructs full conversation threads across replies, forwards, and CCs\nIdentifies who decided what, who owns what, and what's still open\nExtracts structured data (tasks, deadlines, contacts, risks) from unstructured email\nSupports multiple quality tiers for different complexity levels\nReturns text, JSON, or schema-validated structured output\nSupports streaming (SSE) for real-time responses\nWhen to Use This Skill\nSummarize what happened in a thread or across threads\nExtract action items, decisions, or open questions\nAnalyze sentiment or risk in deal/customer threads\nAnswer questions that require understanding context across multiple emails\nGenerate structured data from email content (JSON, schema-validated)\nPrepare briefings before meetings based on recent correspondence\nPrerequisites\nAn iGPT API key (get one at https://igpt.ai/hub/apikeys/)\nA connected email datasource -- the user must have completed OAuth authorization via connectors/authorize before ask will return results. You can check connection status with datasources.list().\nPython >= 3.8 with the igptai package installed\nSetup\npip install igptai\n\n\nSet your API key as an environment variable:\n\nexport IGPT_API_KEY=\"your-api-key-here\"\n\nUsage\nBasic: Ask a question\nfrom igptai import IGPT\nimport os\n\nigpt = IGPT(api_key=os.environ[\"IGPT_API_KEY\"], user=\"user_123\")\n\nres = igpt.recall.ask(input=\"Summarize key risks, decisions, and next steps from this week's meetings.\")\nif res is not None and res.get(\"error\"):\n    print(\"iGPT error:\", res)\nelse:\n    print(res)\n\nGet JSON output\n\nPass output_format=\"json\" for unstructured JSON, or provide a schema for validated structured output:\n\n# Simple JSON output\nres = igpt.recall.ask(\n    input=\"What are the open action items from this week?\",\n    output_format=\"json\"\n)\n\n# Schema-validated structured output\nres = igpt.recall.ask(\n    input=\"Open action items from this week\",\n    quality=\"cef-1-normal\",\n    output_format={\n        \"strict\": True,\n        \"schema\": {\n            \"type\": \"object\",\n            \"required\": [\"action_items\"],\n            \"additionalProperties\": False,\n            \"properties\": {\n                \"action_items\": {\n                    \"type\": \"array\",\n                    \"items\": {\n                        \"type\": \"object\",\n                        \"required\": [\"title\", \"owner\", \"due_date\"],\n                        \"properties\": {\n                            \"title\": {\"type\": \"string\"},\n                            \"owner\": {\"type\": \"string\"},\n                            \"due_date\": {\"type\": \"string\"}\n                        }\n                    }\n                }\n            }\n        }\n    }\n)\nprint(res)\n\n\nExample response:\n\n{\n    \"action_items\": [\n        {\n            \"title\": \"Approve revised Q1 budget allocation\",\n            \"owner\": \"Dvir Ben-Aroya\",\n            \"due_date\": \"2026-01-15\"\n        },\n        {\n            \"title\": \"Approve final FY2026 strategic priorities\",\n            \"owner\": \"Board of Directors\",\n            \"due_date\": \"2026-01-31\"\n        }\n    ]\n}\n\nUse quality tiers\n\niGPT's Context Engine has three quality tiers:\n\n# Normal: fast, good for straightforward questions\nres = igpt.recall.ask(\n    input=\"When is my next meeting with Acme Corp?\",\n    quality=\"cef-1-normal\"\n)\n\n# High: deeper reasoning, better for complex multi-thread analysis\nres = igpt.recall.ask(\n    input=\"What is the current negotiation status with Acme Corp and what leverage do we have?\",\n    quality=\"cef-1-high\"\n)\n\n# Reasoning: maximum depth, for complex cross-thread synthesis\nres = igpt.recall.ask(\n    input=\"Across all communication with Acme over the past quarter, what patterns suggest risk and what should we do about it?\",\n    quality=\"cef-1-reasoning\"\n)\n\nStream responses\n\nStreaming returns parsed JSON chunks (dicts), not raw text. Extract content from each chunk:\n\nstream = igpt.recall.ask(\n    input=\"Walk me through the timeline of the Acme deal from first contact to now.\",\n    stream=True\n)\n\nfor chunk in stream:\n    if isinstance(chunk, dict) and chunk.get(\"error\"):\n        print(\"Stream error:\", chunk)\n        break\n    # Each chunk is a parsed JSON dict\n    print(chunk)\n\n\nStreaming is resilient: if the connection breaks, the iterator yields an error chunk and finishes rather than throwing.\n\nCheck datasource connection before asking\n# Verify user has a connected datasource\nstatus = igpt.datasources.list()\nif status is not None and not status.get(\"error\"):\n    print(\"Connected datasources:\", status)\nelse:\n    # Connect a datasource first\n    auth = igpt.connectors.authorize(service=\"spike\", scope=\"messages\")\n    print(\"Open this URL to authorize:\", auth.get(\"url\"))\n\nParameters\nParameter\tType\tRequired\tDescription\ninput\tstring\tYes\tThe prompt or question to ask.\nuser\tstring\tYes (or set in constructor)\tUnique user identifier scoping the query to their connected data. Per-call value overrides constructor default.\nstream\tboolean\tNo (default: false)\tIf true, returns a generator yielding parsed JSON dicts via SSE.\nquality\tstring\tNo\tContext Engine quality tier: \"cef-1-normal\", \"cef-1-high\", or \"cef-1-reasoning\".\noutput_format\tstring or object\tNo\t\"text\" (default), \"json\", or {\"strict\": true, \"schema\": <JSON Schema>} for validated structured output.\nError Handling\n\nThe SDK does not throw exceptions. It returns normalized error objects:\n\nres = igpt.recall.ask(input=\"What happened in yesterday's board meeting?\")\n\nif res is not None and res.get(\"error\"):\n    error = res[\"error\"]\n    if error == \"auth\":\n        print(\"Check your API key\")\n    elif error == \"params\":\n        print(\"Check your request parameters\")\n    elif error == \"network_error\":\n        print(\"Network issue -- the SDK retries with exponential backoff (3 attempts by default) before returning this\")\nelse:\n    print(res)\n\nExternal Endpoints\n\nThis skill communicates exclusively with:\n\nhttps://api.igpt.ai/v1/recall/ask/ -- the reasoning endpoint\nhttps://api.igpt.ai/v1/connectors/authorize/ -- only during initial datasource connection setup\nhttps://api.igpt.ai/v1/datasources/list/ -- to check connection status\n\nNo other external endpoints are contacted. No data is sent to any third-party service. The igptai PyPI package source is available at https://github.com/igptai/igpt-python.\n\nSecurity & Privacy\nAPI-key scoped: All requests authenticate via IGPT_API_KEY sent as a Bearer token over HTTPS. No shell access, no filesystem access, no system commands.\nPer-user isolation: Every query is scoped to a specific user identifier. User A cannot access User B's email data. Isolation is enforced at the index and execution level, not as a filter layer.\nOAuth read-only: The email datasource connection uses OAuth with read-only scopes. The skill does not send, modify, or delete emails.\nNo data retention: Prompts are discarded after execution. Memory is reconstructed on-demand, not stored.\nTransport encryption: All communication occurs over HTTPS. No plaintext endpoints.\nNo local persistence: This skill does not write to disk, modify environment files, or create persistent configuration outside of the standard IGPT_API_KEY environment variable.\nBuilt-in retries: The SDK retries failed requests with exponential backoff (default: 3 attempts, 100ms base, 2x factor) before returning a network_error.\n\nFor the full security model, see https://docs.igpt.ai/docs/security/model.\n\nWhat This Skill Does NOT Do\nDoes not send, modify, forward, or delete emails\nDoes not access the filesystem or execute shell commands\nDoes not install persistent services or scheduled tasks\nDoes not contact endpoints other than api.igpt.ai\nDoes not store API keys or OAuth tokens outside the environment variable\nExample Questions\n\nThese all work as natural language prompts:\n\n\"Summarize key risks from this week's email threads\" -- cross-thread analysis\n\"What are the open action items from yesterday's board meeting?\" -- task extraction\n\"What's the current status of the Acme deal?\" -- deal intelligence\n\"Who owns the budget approval and when is it due?\" -- ownership and deadline extraction\n\"Are there any threads where tone has shifted negatively in the last 7 days?\" -- sentiment analysis\n\"Generate a briefing for my meeting with Sarah tomorrow\" -- meeting prep\nResources\nGet API Key: https://igpt.ai/hub/apikeys/\nDocumentation: https://docs.igpt.ai\nAPI Reference: https://docs.igpt.ai/docs/api-reference/ask\nPlayground: https://igpt.ai/hub/playground/\nPython SDK: https://pypi.org/project/igptai/\nNode.js SDK: https://www.npmjs.com/package/igptai\nGitHub: https://github.com/igptai/igpt-python"
  },
  "trust": {
    "sourceLabel": "tencent",
    "provenanceUrl": "https://clawhub.ai/Sammy-spk/igpt-email-ask",
    "publisherUrl": "https://clawhub.ai/Sammy-spk/igpt-email-ask",
    "owner": "Sammy-spk",
    "version": "1.0.0",
    "license": null,
    "verificationStatus": "Indexed source record"
  },
  "links": {
    "detailUrl": "https://openagent3.xyz/skills/igpt-email-ask",
    "downloadUrl": "https://openagent3.xyz/downloads/igpt-email-ask",
    "agentUrl": "https://openagent3.xyz/skills/igpt-email-ask/agent",
    "manifestUrl": "https://openagent3.xyz/skills/igpt-email-ask/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/igpt-email-ask/agent.md"
  }
}