Local branch had diverged from origin/master (sibling commits on the same base). Rewrote local history linearly on top of origin/master, folding in all local content: exa/hot-platform discovery hunters, leaks ledger, nightly sweep orchestrator, updated .gitignore and skill docs, plus the latest hunt output and vault state. Remote-only files (vault keys, channel scripts) were restored rather than dropped, so the resulting tree is a full union of both sides.
1 line
22 KiB
JSON
1 line
22 KiB
JSON
{"repo": "arareusername/tbats-dev", "files": {".agent/skills/agentic-awesome-skills-main/plugins/agentic-awesome-skills-claude/skills/llm-council/SKILL.md": {"226af8defbca0d0d35a681ecdb5b2797a58a7286": {"t": 1786068572.9889946, "n": 20583, "h": "f42f6cd0db2e7248", "c": "---\nname: llm-council\ndescription: \"Run Fireworks-hosted open-weight model councils that compare responses and synthesize a final answer.\"\nallowed-tools: Read, Write, Bash, AskUserQuestion\ncategory: \"ai-agents\"\nrisk: \"safe\"\nsource: \"official\"\nsource_repo: \"dair-ai/dair-academy-plugins\"\nsource_type: \"official\"\ndate_added: \"2026-06-19\"\nauthor: \"DAIR.AI\"\nlicense: \"MIT\"\nlicense_source: \"https://github.com/dair-ai/dair-academy-plugins/blob/main/README.md#license\"\ntags:\n - dair-academy\n - ai\n - workflow\ntools:\n - claude-code\n - codex-cli\n - cursor\n---\n\n# LLM Council (Fireworks AI)\n\n## When to Use\n\nUse when this workflow matches the user request: Use this skill for its documented workflow.\n\n\n_Source: [dair-ai/dair-academy-plugins](https://github.com/dair-ai/dair-academy-plugins) (MIT)._\n\nThis skill implements Karpathy's LLM Council concept where multiple open-weight LLMs deliberate on a query, powered entirely by Fireworks AI:\n\n1. **Phase 1**: All models respond to the query independently (parallel)\n2. **Phase 2**: Models rank each other's anonymized responses\n3. **Phase 3**: A Chairman LLM synthesizes the final answer\n\nAll inference runs through **Fireworks AI** using open-weight models. The speed and pricing of Fireworks makes it practical to run multi-model deliberation that would be slow or expensive on other providers.\n\n## CRITICAL RULES\n\n1. **ALWAYS use AskUserQuestion** to let the user select council models (multiselect) and the Chairman model\n2. **ALWAYS save raw responses to files** - never summarize or truncate API outputs\n3. **ALWAYS show full transparency** - display all individual responses, all rankings, AND the final synthesis\n4. **NEVER skip the ranking phase** - it is essential to the council deliberation process\n5. **Read from files for display** - ensures content is shown unmodified\n6. **ALWAYS display the final output to the user** after Phase 3 completes\n\n## Pre-flight Check\n\nBefore running any phase, verify the Fireworks API key is set:\n\n```bash\nif [ -z \"$FIREWORKS_API_KEY\" ]; then\n echo \"ERROR: FIREWORKS_API_KEY is not set.\"\n echo \"Create a Fireworks AI account at: https://fireworks.ai/\"\n echo \"Then export it in your shell profile (~/.zshrc or ~/.bashrc):\"\n echo ' read -rsp \"Fireworks API key: \" FIREWORKS_API_KEY; echo; export FIREWORKS_API_KEY'\n exit 1\nfi\necho \"FIREWORKS_API_KEY is set.\"\n```\n\n## Available Models\n\nPresent these options to the user via AskUserQuestion (multiselect):\n\n| Model | Fireworks ID | Provider |\n|-------|-------------|----------|\n| GLM 5 | accounts/fireworks/models/glm-5 | Z.ai |\n| DeepSeek V3.1 | accounts/fireworks/models/deepseek-v3p1 | DeepSeek |\n| DeepSeek V3.2 | accounts/fireworks/models/deepseek-v3p2 | DeepSeek |\n| MiniMax M2.1 | accounts/fireworks/models/minimax-m2p1 | MiniMax |\n| Kimi K2.5 | accounts/fireworks/models/kimi-k2p5 | Moonshot |\n| Qwen3 235B | accounts/fireworks/models/qwen3-235b-a22b | Alibaba |\n| Llama 4 Maverick | accounts/fireworks/models/llama4-maverick-instruct-basic | Meta |\n\n## Workflow\n\n### Step 1: Gather User Input\n\nUse AskUserQuestion to get:\n1. The query/question for the council (or accept it from the conversation)\n2. Which models to include (multiselect, recommend 3-5 models)\n3. Which model should be the Chairman (single select)\n\nNote: AskUserQuestion supports max 4 options per question. Since there are 7 models, split model selection across two questions, or show the most popular 4 and let the user type \"Other\" for the rest. A good default is to show 4 models in the first question and note the others are available via \"Other\". Rotate which models are shown based on variety.\n\nExample AskUserQuestion for model selection (show 4, mention others):\n```\nquestion: \"Which models should participate in the LLM Council? (Also available via Other: Llama 4 Maverick, Qwen3 235B, GLM 5)\"\nheader: \"Models\"\nmultiSelect: true\noptions:\n - label: \"DeepSeek V3.2\"\n description: \"DeepSeek's newest and most capable model\"\n - label: \"MiniMax M2.1\"\n description: \"MiniMax's strong open-weight model\"\n - label: \"Kimi K2.5\"\n description: \"Moonshot's strong open-weight model\"\n - label: \"DeepSeek V3.1\"\n description: \"DeepSeek's proven reasoning model\"\n```\n\nExample AskUserQuestion for chairman:\n```\nquestion: \"Which model should be the Chairman (synthesizes the final answer)?\"\nheader: \"Chairman\"\nmultiSelect: false\noptions:\n - label: \"DeepSeek V3.2 (Recommended)\"\n description: \"Newest DeepSeek, strong at comprehensive analysis\"\n - label: \"GLM 5\"\n description: \"Strong reasoning for synthesis\"\n - label: \"Kimi K2.5\"\n description: \"Strong at structured synthesis\"\n - label: \"MiniMax M2.1\"\n description: \"Strong open-weight model for synthesis\"\n```\n\n### Model Name to ID Mapping\n\nUse this mapping to convert user selections to Fireworks model IDs:\n\n```python\nMODEL_MAP = {\n \"GLM 5\": \"accounts/fireworks/models/glm-5\",\n \"DeepSeek V3.1\": \"accounts/fireworks/models/deepseek-v3p1\",\n \"DeepSeek V3.2\": \"accounts/fireworks/models/deepseek-v3p2\",\n \"MiniMax M2.1\": \"accounts/fireworks/models/minimax-m2p1\",\n \"Kimi K2.5\": \"accounts/fireworks/models/kimi-k2p5\",\n \"Qwen3 235B\": \"accounts/fireworks/models/qwen3-235b-a22b\",\n \"Llama 4 Maverick\": \"accounts/fireworks/models/llama4-maverick-instruct-basic\",\n}\n```\n\n### Step 2: Run Phase 1 - Individual Responses\n\nAfter gathering input, run this script to get responses from all selected models in parallel:\n\n```bash\nQUERY=\"USER_QUERY_HERE\"\nMODELS='[\"accounts/fireworks/models/glm-5\", \"accounts/fireworks/models/deepseek-v3p1\"]'\n\npython3 << 'PYEOF'\nimport os\nimport json\nimport requests\nimport time\nfrom concurrent.futures import ThreadPoolExecutor, as_completed\n\nFIREWORKS_API_KEY = os.environ.get(\"FIREWORKS_API_KEY\")\nAPI_URL = \"https://api.fireworks.ai/inference/v1/chat/completions\"\n\nQUERY = os.environ.get(\"QUERY\", \"\")\nMODELS = json.loads(os.environ.get(\"MODELS\", \"[]\"))\n\n# Create session directory\ntimestamp = time.strftime(\"%Y%m%d-%H%M%S\")\nSESSION_DIR = f\"/tmp/llm-council/{timestamp}\"\nos.makedirs(SESSION_DIR, exist_ok=True)\n\n# Save config\nconfig = {\"query\": QUERY, \"models\": MODELS, \"timestamp\": timestamp}\nwith open(f\"{SESSION_DIR}/config.json\", \"w\") as f:\n json.dump(config, f, indent=2)\n\ndef call_model(model_id, query):\n \"\"\"Call a single model via Fireworks AI\"\"\"\n try:\n start = time.time()\n response = requests.post(\n API_URL,\n headers={\n \"Authorization\": f\"Bearer {FIREWORKS_API_KEY}\",\n \"Content-Type\": \"application/json\"\n },\n json={\n \"model\": model_id,\n \"messages\": [\n {\"role\": \"system\", \"content\": \"You are participating in an LLM council deliberation. Provide your best, most thoughtful response to the query. Be comprehensive but focused.\"},\n {\"role\": \"user\", \"content\": query}\n ],\n \"max_tokens\": 4000,\n \"temperature\": 1\n },\n timeout=120\n )\n response.raise_for_status()\n elapsed = time.time() - start\n data = response.json()\n usage = data.get(\"usage\", {})\n return {\n \"success\": True,\n \"content\": data[\"choices\"][0][\"message\"][\"content\"],\n \"model\": model_id,\n \"latency_seconds\": round(elapsed, 2),\n \"tokens\": {\n \"prompt\": usage.get(\"prompt_tokens\", 0),\n \"completion\": usage.get(\"completion_tokens\", 0),\n \"total\": usage.get(\"total_tokens\", 0)\n }\n }\n except Exception as e:\n return {\n \"success\": False,\n \"content\": f\"[ERROR: {str(e)}]\",\n \"model\": model_id,\n \"latency_seconds\": 0,\n \"tokens\": {\"prompt\": 0, \"completion\": 0, \"total\": 0}\n }\n\nprint(f\"\\n{'='*60}\")\nprint(\"PHASE 1: Collecting Individual Responses\")\nprint(f\"{'='*60}\")\nprint(f\"Query: {QUERY[:200]}...\")\nprint(f\"Models: {', '.join([m.split('/')[-1] for m in MODELS])}\")\nprint(f\"Session: {SESSION_DIR}\")\nprint()\n\n# Parallel execution\nresults = {}\nwith ThreadPoolExecutor(max_workers=len(MODELS)) as executor:\n futures = {executor.submit(call_model, m, QUERY): m for m in MODELS}\n for future in as_completed(futures):\n model = futures[future]\n result = future.result()\n results[model] = result\n status = \"OK\" if result[\"success\"] else \"FAILED\"\n latency = f\"{result['latency_seconds']}s\" if result[\"success\"] else \"N/A\"\n print(f\" [{status}] {model.split('/')[-1]} ({latency})\")\n\n# Save raw results\nwith open(f\"{SESSION_DIR}/phase1_responses.json\", \"w\") as f:\n json.dump(results, f, indent=2)\n\nprint(f\"\\nPhase 1 complete. Results saved to: {SESSION_DIR}/phase1_responses.json\")\nprint(f\"SESSION_DIR={SESSION_DIR}\")\nPYEOF\n```\n\n### Step 3: Run Phase 2 - Cross-Model Ranking\n\nEach model reviews and ranks the anonymized responses from Phase 1:\n\n```bash\nSESSION_DIR=\"/tmp/llm-council/TIMESTAMP_HERE\"\n\npython3 << 'PYEOF'\nimport os\nimport json\nimport requests\nimport time\nfrom concurrent.futures import ThreadPoolExecutor, as_completed\n\nFIREWORKS_API_KEY = os.environ.get(\"FIREWORKS_API_KEY\")\nAPI_URL = \"https://api.fireworks.ai/inference/v1/chat/completions\"\nSESSION_DIR = os.environ.get(\"SESSION_DIR\")\n\n# Load Phase 1 results\nwith open(f\"{SESSION_DIR}/config.json\") as f:\n config = json.load(f)\nwith open(f\"{SESSION_DIR}/phase1_responses.json\") as f:\n phase1_results = json.load(f)\n\nQUERY = config[\"query\"]\nMODELS = config[\"models\"]\n\n# Create anonymized mapping\nlabels = [\"A\", \"B\", \"C\", \"D\", \"E\", \"F\", \"G\"][:len(MODELS)]\nmodel_to_label = dict(zip(MODELS, labels))\nlabel_to_model = {v: k for k, v in model_to_label.items()}\n\n# Format anonymized responses\nanonymized_responses = []\nfor model_id in MODELS:\n label = model_to_label[model_id]\n content = phase1_results[model_id][\"content\"]\n anonymized_responses.append(f\"=== Response {label} ===\\n{content}\")\n\nanonymized_text = \"\\n\\n\".join(anonymized_responses)\n\ndef get_rankings(model_id, query, anonymized, own_label):\n \"\"\"Get rankings from a single model\"\"\"\n ranking_prompt = f\"\"\"You are evaluating responses from multiple AI models to this query:\n\nQUERY: {query}\n\nHere are the anonymized responses:\n\n{anonymized}\n\nPlease rank these responses from BEST to WORST. For each ranking:\n1. State the response letter (A, B, C, etc.)\n2. Give a brief reason (1-2 sentences)\n3. You may skip ranking your own response (labeled {own_label}) or rank it fairly\n\nFormat your response EXACTLY as:\nRANKINGS:\n1. [Letter] - [Brief reason]\n2. [Letter] - [Brief reason]\n3. [Letter] - [Brief reason]\n...\"\"\"\n\n try:\n start = time.time()\n response = requests.post(\n API_URL,\n headers={\n \"Authorization\": f\"Bearer {FIREWORKS_API_KEY}\",\n \"Content-Type\": \"application/json\"\n },\n json={\n \"model\": model_id,\n \"messages\": [\n {\"role\": \"system\", \"content\": f\"You are ranking AI responses objectively. Your own response is labeled '{own_label}'.\"},\n {\"role\": \"user\", \"content\": ranking_prompt}\n ],\n \"max_tokens\": 1000,\n \"temperature\": 1\n },\n timeout=90\n )\n response.raise_for_status()\n elapsed = time.time() - start\n return {\n \"success\": True,\n \"content\": response.json()[\"choices\"][0][\"message\"][\"content\"],\n \"model\": model_id,\n \"latency_seconds\": round(elapsed, 2)\n }\n except Exception as e:\n return {\n \"success\": False,\n \"content\": f\"[ERROR: {str(e)}]\",\n \"model\": model_id,\n \"latency_seconds\": 0\n }\n\nprint(f\"\\n{'='*60}\")\nprint(\"PHASE 2: Cross-Model Ranking\")\nprint(f\"{'='*60}\")\nprint(f\"Label mapping: {json.dumps({v: k.split('/')[-1] for k, v in model_to_label.items()})}\")\nprint()\n\n# Collect rankings from all models in parallel\nrankings = {}\nwith ThreadPoolExecutor(max_workers=len(MODELS)) as executor:\n futures = {\n executor.submit(get_rankings, mid, QUERY, anonymized_text, model_to_label[mid]): mid\n for mid in MODELS\n }\n for future in as_completed(futures):\n model = futures[future]\n result = future.result()\n rankings[model] = result\n status = \"OK\" if result[\"success\"] else \"FAILED\"\n latency = f\"{result['latency_seconds']}s\" if result[\"success\"] else \"N/A\"\n print(f\" [{status}] {model.split('/')[-1]} ({latency})\")\n\n# Save rankings\noutput = {\n \"label_mapping\": label_to_model,\n \"model_to_label\": model_to_label,\n \"rankings\": rankings\n}\nwith open(f\"{SESSION_DIR}/phase2_rankings.json\", \"w\") as f:\n json.dump(output, f, indent=2)\n\nprint(f\"\\nPhase 2 complete. Rankings saved to: {SESSION_DIR}/phase2_rankings.json\")\nPYEOF\n```\n\n### Step 4: Run Phase 3 - Chairman Synthesis\n\nThe Chairman model receives all responses and rankings, then produces the final synthesis:\n\n```bash\nSESSION_DIR=\"/tmp/llm-council/TIMESTAMP_HERE\"\nCHAIRMAN_MODEL=\"accounts/fireworks/models/glm-5\"\n\npython3 << 'PYEOF'\nimport os\nimport json\nimport requests\nimport time\n\nFIREWORKS_API_KEY = os.environ.get(\"FIREWORKS_API_KEY\")\nAPI_URL = \"https://api.fireworks.ai/inference/v1/chat/completions\"\nSESSION_DIR = os.environ.get(\"SESSION_DIR\")\nCHAIRMAN_MODEL = os.environ.get(\"CHAIRMAN_MODEL\")\n\n# Load all previous results\nwith open(f\"{SESSION_DIR}/config.json\") as f:\n config = json.load(f)\nwith open(f\"{SESSION_DIR}/phase1_responses.json\") as f:\n phase1 = json.load(f)\nwith open(f\"{SESSION_DIR}/phase2_rankings.json\") as f:\n phase2 = json.load(f)\n\nQUERY = config[\"query\"]\nlabel_to_model = phase2[\"label_mapping\"]\nmodel_to_label = phase2[\"model_to_label\"]\n\n# Format responses with model names revealed\nresponses_text = []\nfor model_id, result in phase1.items():\n label = model_to_label.get(model_id, \"?\")\n model_name = model_id.split(\"/\")[-1]\n responses_text.append(f\"=== {label}: {model_name} ===\\n{result['content']}\")\n\n# Format rankings\nrankings_text = []\nfor model_id, result in phase2[\"rankings\"].items():\n model_name = model_id.split(\"/\")[-1]\n rankings_text.append(f\"[{model_name}'s Rankings]\\n{result['content']}\")\n\nsynthesis_prompt = f\"\"\"You are the Chairman of an LLM Council. Your task is to synthesize the best possible answer from multiple AI responses.\n\nORIGINAL QUERY:\n{QUERY}\n\nINDIVIDUAL RESPONSES:\n{chr(10).join(responses_text)}\n\nMODEL RANKINGS:\n{chr(10).join(rankings_text)}\n\nAs Chairman, produce a FINAL SYNTHESIS that:\n1. Incorporates the strongest elements from the best-ranked responses\n2. Resolves any contradictions between responses\n3. Addresses aspects that multiple models agreed on\n4. Corrects any errors identified through cross-ranking\n5. Provides the most complete, accurate, and helpful answer\n\nBegin your synthesis:\"\"\"\n\nprint(f\"\\n{'='*60}\")\nprint(\"PHASE 3: Chairman Synthesis\")\nprint(f\"{'='*60}\")\nprint(f\"Chairman: {CHAIRMAN_MODEL.split('/')[-1]}\")\nprint()\n\ntry:\n start = time.time()\n response = requests.post(\n API_URL,\n headers={\n \"Authorization\": f\"Bearer {FIREWORKS_API_KEY}\",\n \"Content-Type\": \"application/json\"\n },\n json={\n \"model\": CHAIRMAN_MODEL,\n \"messages\": [\n {\"role\": \"system\", \"content\": \"You are the Chairman of an LLM Council. Synthesize multiple AI perspectives into a definitive, comprehensive response.\"},\n {\"role\": \"user\", \"content\": synthesis_prompt}\n ],\n \"max_tokens\": 4000,\n \"temperature\": 1\n },\n timeout=180\n )\n response.raise_for_status()\n elapsed = time.time() - start\n synthesis = response.json()[\"choices\"][0][\"message\"][\"content\"]\n\n with open(f\"{SESSION_DIR}/phase3_synthesis.txt\", \"w\") as f:\n f.write(synthesis)\n\n print(f\"Phase 3 complete ({elapsed:.2f}s). Synthesis saved to: {SESSION_DIR}/phase3_synthesis.txt\")\n\nexcept Exception as e:\n print(f\"ERROR: {e}\")\n synthesis = f\"[ERROR: {str(e)}]\"\n with open(f\"{SESSION_DIR}/phase3_synthesis.txt\", \"w\") as f:\n f.write(synthesis)\n\n# Update config with chairman\nconfig[\"chairman\"] = CHAIRMAN_MODEL\nwith open(f\"{SESSION_DIR}/config.json\", \"w\") as f:\n json.dump(config, f, indent=2)\nPYEOF\n```\n\n### Step 5: Display Full Results\n\nRead all saved files and display the complete council deliberation:\n\n```bash\nSESSION_DIR=\"/tmp/llm-council/TIMESTAMP_HERE\"\n\npython3 << 'PYEOF'\nimport os\nimport json\n\nSESSION_DIR = os.environ.get(\"SESSION_DIR\")\n\n# Load all data\nwith open(f\"{SESSION_DIR}/config.json\") as f:\n config = json.load(f)\nwith open(f\"{SESSION_DIR}/phase1_responses.json\") as f:\n phase1 = json.load(f)\nwith open(f\"{SESSION_DIR}/phase2_rankings.json\") as f:\n phase2 = json.load(f)\nwith open(f\"{SESSION_DIR}/phase3_synthesis.txt\") as f:\n synthesis = f.read()\n\nmodel_to_label = phase2[\"model_to_label\"]\nlabel_to_model = phase2[\"label_mapping\"]\n\n# Build formatted output\noutput = []\noutput.append(\"=\" * 70)\noutput.append(\" LLM COUNCIL DELIBERATION\")\noutput.append(\" Powered by Fireworks AI\")\noutput.append(\"=\" * 70)\noutput.append(\"\")\noutput.append(f\"QUERY: {config['query']}\")\noutput.append(f\"COUNCIL: {', '.join([m.split('/')[-1] for m in config['models']])}\")\noutput.append(f\"CHAIRMAN: {config.get('chairman', 'N/A').split('/')[-1]}\")\noutput.append(\"\")\n\n# Phase 1: Individual Responses\noutput.append(\"-\" * 70)\noutput.append(\" PHASE 1: INDIVIDUAL RESPONSES\")\noutput.append(\"-\" * 70)\noutput.append(\"\")\n\nfor model_id, result in phase1.items():\n model_name = model_id.split(\"/\")[-1]\n label = model_to_label.get(model_id, \"?\")\n latency = result.get(\"latency_seconds\", \"N/A\")\n tokens = result.get(\"tokens\", {})\n output.append(f\"[{label}] {model_name} (latency: {latency}s, tokens: {tokens.get('total', 'N/A')})\")\n output.append(\"-\" * 40)\n output.append(result[\"content\"])\n output.append(\"\")\n\n# Phase 2: Cross-Model Rankings\noutput.append(\"-\" * 70)\noutput.append(\" PHASE 2: CROSS-MODEL RANKINGS\")\noutput.append(\"-\" * 70)\noutput.append(\"\")\noutput.append(f\"Label mapping: {json.dumps({v: k.split('/')[-1] for k, v in model_to_label.items()}, indent=2)}\")\noutput.append(\"\")\n\nfor model_id, result in phase2[\"rankings\"].items():\n model_name = model_id.split(\"/\")[-1]\n output.append(f\"[{model_name}'s Rankings]\")\n output.append(result[\"content\"])\n output.append(\"\")\n\n# Phase 3: Chairman Synthesis\noutput.append(\"-\" * 70)\noutput.append(\" PHASE 3: CHAIRMAN'S SYNTHESIS\")\noutput.append(\"-\" * 70)\noutput.append(\"\")\nchairman_name = config.get(\"chairman\", \"Chairman\").split(\"/\")[-1]\noutput.append(f\"[{chairman_name} - Chairman]\")\noutput.append(\"\")\noutput.append(synthesis)\noutput.append(\"\")\noutput.append(\"=\" * 70)\noutput.append(f\"Session files: {SESSION_DIR}/\")\n\n# Save formatted output\nfinal_output = \"\\n\".join(output)\nwith open(f\"{SESSION_DIR}/final_output.md\", \"w\") as f:\n f.write(final_output)\n\nprint(final_output)\nprint(f\"\\nFull output saved to: {SESSION_DIR}/final_output.md\")\nPYEOF\n```\n\n## Important Notes\n\n1. **Session Directory**: Each run creates a unique session in `/tmp/llm-council/{timestamp}/`\n2. **Raw Data Preserved**: All API responses are saved as-is to JSON files for full transparency\n3. **Cost**: Fireworks pricing is per-token. More models and longer queries cost more. Check current pricing at https://fireworks.ai/pricing\n4. **Latency Tracking**: Each API call tracks latency so you can see Fireworks' speed in action\n5. **Token Usage**: Phase 1 responses include token counts for cost awareness\n6. **Rate Limits**: If you hit rate limits, wait briefly and retry\n7. **Model Availability**: Check https://app.fireworks.ai/ for current model status\n\n## Setup\n\n1. Create a Fireworks AI account at https://fireworks.ai/ and grab your API key from the dashboard\n2. Export it in your shell profile:\n ```bash\n read -rsp \"Fireworks API key: \" FIREWORKS_API_KEY\n echo\n export FIREWORKS_API_KEY\n ```\n3. Restart your terminal or run `source ~/.zshrc`\n4. Invoke this skill when you want multiple open-weight AI perspectives on a question\n\n\n## Limitations\n\n- Requires the upstream tool, account, API key, or local setup when the workflow names one.\n- Does not authorize destructive, production, paid, or external-message actions without explicit user approval.\n- Validate generated artifacts or recommendations against the user's real sources before treating them as final.\n"}}}} |