opencode-skills-collection 3.1.0 → 3.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bundled-skills/.antigravity-install-manifest.json +84 -1
- package/bundled-skills/android-ui-journey-testing/SKILL.md +191 -0
- package/bundled-skills/ask-matt/SKILL.md +92 -0
- package/bundled-skills/bugs-are-annoying/SKILL.md +137 -0
- package/bundled-skills/codebase-design/DEEPENING.md +37 -0
- package/bundled-skills/codebase-design/DESIGN-IT-TWICE.md +44 -0
- package/bundled-skills/codebase-design/SKILL.md +145 -0
- package/bundled-skills/competitor-analysis/LICENSE.txt +21 -0
- package/bundled-skills/competitor-analysis/SKILL.md +434 -0
- package/bundled-skills/competitor-analysis/references/battle-card-subagent.md +127 -0
- package/bundled-skills/competitor-analysis/references/battle-card.md +91 -0
- package/bundled-skills/competitor-analysis/references/example-research.md +130 -0
- package/bundled-skills/competitor-analysis/references/report-template.html +127 -0
- package/bundled-skills/competitor-analysis/references/research-patterns.md +217 -0
- package/bundled-skills/competitor-analysis/references/workflow.md +434 -0
- package/bundled-skills/competitor-analysis/scripts/capture_screenshots.mjs +142 -0
- package/bundled-skills/competitor-analysis/scripts/compile_report.mjs +929 -0
- package/bundled-skills/competitor-analysis/scripts/extract_vs_names.mjs +140 -0
- package/bundled-skills/competitor-analysis/scripts/gate_candidates.mjs +194 -0
- package/bundled-skills/competitor-analysis/scripts/list_urls.mjs +90 -0
- package/bundled-skills/competitor-analysis/scripts/md_utils.mjs +50 -0
- package/bundled-skills/competitor-analysis/scripts/merge_partials.mjs +291 -0
- package/bundled-skills/competitor-analysis/scripts/package.json +6 -0
- package/bundled-skills/design-it/3d-ui/SKILL.md +259 -0
- package/bundled-skills/design-it/SKILL.md +170 -0
- package/bundled-skills/design-it/ai-native-ui/SKILL.md +295 -0
- package/bundled-skills/design-it/aurora-ui/SKILL.md +307 -0
- package/bundled-skills/design-it/bento-ui/SKILL.md +314 -0
- package/bundled-skills/design-it/brutalism/SKILL.md +270 -0
- package/bundled-skills/design-it/brutalist-typography/SKILL.md +287 -0
- package/bundled-skills/design-it/card-based-design/SKILL.md +262 -0
- package/bundled-skills/design-it/claymorphism/SKILL.md +287 -0
- package/bundled-skills/design-it/color-blocking/SKILL.md +278 -0
- package/bundled-skills/design-it/command-center-ui/SKILL.md +345 -0
- package/bundled-skills/design-it/cyber-y2k/SKILL.md +312 -0
- package/bundled-skills/design-it/cyberpunk-ui/SKILL.md +262 -0
- package/bundled-skills/design-it/dark-mode/SKILL.md +289 -0
- package/bundled-skills/design-it/dashboard-design/SKILL.md +331 -0
- package/bundled-skills/design-it/data-dense-design/SKILL.md +322 -0
- package/bundled-skills/design-it/duotone-design/SKILL.md +248 -0
- package/bundled-skills/design-it/editorial-design/SKILL.md +328 -0
- package/bundled-skills/design-it/flat-design/SKILL.md +221 -0
- package/bundled-skills/design-it/flat-design-2/SKILL.md +240 -0
- package/bundled-skills/design-it/floating-ui/SKILL.md +299 -0
- package/bundled-skills/design-it/frutiger-aero/SKILL.md +274 -0
- package/bundled-skills/design-it/glassmorphism/SKILL.md +272 -0
- package/bundled-skills/design-it/gradient-design/SKILL.md +309 -0
- package/bundled-skills/design-it/high-contrast/SKILL.md +288 -0
- package/bundled-skills/design-it/holographic-ui/SKILL.md +310 -0
- package/bundled-skills/design-it/isometric-design/SKILL.md +228 -0
- package/bundled-skills/design-it/layered-design/SKILL.md +247 -0
- package/bundled-skills/design-it/material-design/SKILL.md +275 -0
- package/bundled-skills/design-it/maximalism/SKILL.md +297 -0
- package/bundled-skills/design-it/minimalism/SKILL.md +267 -0
- package/bundled-skills/design-it/monochromatic-ui/SKILL.md +296 -0
- package/bundled-skills/design-it/neo-brutalism/SKILL.md +270 -0
- package/bundled-skills/design-it/neumorphism/SKILL.md +248 -0
- package/bundled-skills/design-it/retro-design/SKILL.md +283 -0
- package/bundled-skills/design-it/retro-futurism/SKILL.md +259 -0
- package/bundled-skills/design-it/sci-fi-interface/SKILL.md +309 -0
- package/bundled-skills/design-it/skeuomorphism/SKILL.md +280 -0
- package/bundled-skills/design-it/soft-pastel/SKILL.md +307 -0
- package/bundled-skills/design-it/spatial-computing-ui/SKILL.md +300 -0
- package/bundled-skills/design-it/spatial-design/SKILL.md +268 -0
- package/bundled-skills/design-it/swiss-design/SKILL.md +293 -0
- package/bundled-skills/design-it/synthwave/SKILL.md +257 -0
- package/bundled-skills/design-it/tile-design/SKILL.md +297 -0
- package/bundled-skills/design-it/typography-first/SKILL.md +247 -0
- package/bundled-skills/design-it/vaporwave/SKILL.md +331 -0
- package/bundled-skills/design-it/vibrant-maximalism/SKILL.md +291 -0
- package/bundled-skills/design-it/widget-based-design/SKILL.md +274 -0
- package/bundled-skills/design-it/y2k-design/SKILL.md +268 -0
- package/bundled-skills/diagnosing-bugs/SKILL.md +165 -0
- package/bundled-skills/diagnosing-bugs/scripts/hitl-loop.template.sh +41 -0
- package/bundled-skills/docs/contributors/skill-scoring.md +235 -0
- package/bundled-skills/docs/integrations/jetski-cortex.md +3 -3
- package/bundled-skills/docs/integrations/jetski-gemini-loader/README.md +1 -1
- package/bundled-skills/docs/maintainers/repo-growth-seo.md +3 -3
- package/bundled-skills/docs/maintainers/skills-update-guide.md +1 -1
- package/bundled-skills/docs/users/bundles.md +1 -1
- package/bundled-skills/docs/users/claude-code-skills.md +1 -1
- package/bundled-skills/docs/users/gemini-cli-skills.md +1 -1
- package/bundled-skills/docs/users/getting-started.md +1 -1
- package/bundled-skills/docs/users/kiro-integration.md +1 -1
- package/bundled-skills/docs/users/usage.md +4 -4
- package/bundled-skills/docs/users/visual-guide.md +4 -4
- package/bundled-skills/domain-modeling/ADR-FORMAT.md +47 -0
- package/bundled-skills/domain-modeling/CONTEXT-FORMAT.md +60 -0
- package/bundled-skills/domain-modeling/SKILL.md +105 -0
- package/bundled-skills/grill-me/SKILL.md +36 -0
- package/bundled-skills/grill-with-docs/SKILL.md +36 -0
- package/bundled-skills/grilling/SKILL.md +39 -0
- package/bundled-skills/handoff/SKILL.md +45 -0
- package/bundled-skills/image-generator/.env.example +7 -0
- package/bundled-skills/image-generator/SKILL.md +509 -0
- package/bundled-skills/improve-codebase-architecture/HTML-REPORT.md +123 -0
- package/bundled-skills/improve-codebase-architecture/SKILL.md +97 -0
- package/bundled-skills/learn/SKILL.md +156 -0
- package/bundled-skills/lesson-generator/SKILL.md +90 -0
- package/bundled-skills/llm-council/.env.example +7 -0
- package/bundled-skills/llm-council/SKILL.md +602 -0
- package/bundled-skills/loop-library/SKILL.md +205 -0
- package/bundled-skills/loop-library/agents/openai.yaml +4 -0
- package/bundled-skills/loop-library/references/catalog.md +270 -0
- package/bundled-skills/mailtrap-managing-contacts/SKILL.md +112 -0
- package/bundled-skills/mailtrap-sending-emails/SKILL.md +167 -0
- package/bundled-skills/mailtrap-setting-up-sending-domain/SKILL.md +77 -0
- package/bundled-skills/mailtrap-testing-with-sandbox/SKILL.md +110 -0
- package/bundled-skills/prototype/LOGIC.md +79 -0
- package/bundled-skills/prototype/SKILL.md +62 -0
- package/bundled-skills/prototype/UI.md +112 -0
- package/bundled-skills/setup-matt-pocock-skills/SKILL.md +158 -0
- package/bundled-skills/setup-matt-pocock-skills/domain.md +51 -0
- package/bundled-skills/setup-matt-pocock-skills/issue-tracker-github.md +34 -0
- package/bundled-skills/setup-matt-pocock-skills/issue-tracker-gitlab.md +35 -0
- package/bundled-skills/setup-matt-pocock-skills/issue-tracker-local.md +19 -0
- package/bundled-skills/setup-matt-pocock-skills/triage-labels.md +15 -0
- package/bundled-skills/survey-generator/LICENSE +21 -0
- package/bundled-skills/survey-generator/SKILL.md +143 -0
- package/bundled-skills/survey-generator/build_artifact.py +208 -0
- package/bundled-skills/survey-generator/examples/agentic-engineering/research_bundle.json +1196 -0
- package/bundled-skills/survey-generator/examples/agentic-engineering/survey.html +706 -0
- package/bundled-skills/survey-generator/style_spec.json +85 -0
- package/bundled-skills/survey-generator/templates/research_bundle_template.json +69 -0
- package/bundled-skills/tdd/SKILL.md +139 -0
- package/bundled-skills/tdd/mocking.md +59 -0
- package/bundled-skills/tdd/refactoring.md +10 -0
- package/bundled-skills/tdd/tests.md +61 -0
- package/bundled-skills/teach/GLOSSARY-FORMAT.md +35 -0
- package/bundled-skills/teach/LEARNING-RECORD-FORMAT.md +46 -0
- package/bundled-skills/teach/MISSION-FORMAT.md +31 -0
- package/bundled-skills/teach/RESOURCES-FORMAT.md +32 -0
- package/bundled-skills/teach/SKILL.md +169 -0
- package/bundled-skills/to-issues/SKILL.md +115 -0
- package/bundled-skills/to-prd/SKILL.md +104 -0
- package/bundled-skills/tools-page-seo-optimizer/SKILL.md +616 -0
- package/bundled-skills/triage/AGENT-BRIEF.md +207 -0
- package/bundled-skills/triage/OUT-OF-SCOPE.md +105 -0
- package/bundled-skills/triage/SKILL.md +143 -0
- package/bundled-skills/vibecode-production-qa-validator/SKILL.md +371 -141
- package/bundled-skills/wiki-builder/SKILL.md +157 -0
- package/bundled-skills/wiki-builder/agents/openai.yaml +5 -0
- package/bundled-skills/wiki-builder/references/wiki-flavors.md +98 -0
- package/bundled-skills/wiki-builder/scripts/init_wiki.sh +105 -0
- package/bundled-skills/wiki-builder/templates/index.md +20 -0
- package/bundled-skills/wiki-builder/templates/maintenance-log.md +7 -0
- package/bundled-skills/wiki-builder/templates/prompts/compile-concept-page.md +12 -0
- package/bundled-skills/wiki-builder/templates/prompts/compile-index.md +11 -0
- package/bundled-skills/wiki-builder/templates/prompts/compile-source-page.md +12 -0
- package/bundled-skills/wiki-builder/templates/prompts/lint-wiki.md +10 -0
- package/bundled-skills/wiki-builder/templates/prompts/query-and-file.md +11 -0
- package/bundled-skills/wiki-builder/templates/sources.md +9 -0
- package/bundled-skills/wiki-builder/templates/wiki.config.md +53 -0
- package/bundled-skills/writing-great-skills/GLOSSARY.md +181 -0
- package/bundled-skills/writing-great-skills/SKILL.md +111 -0
- package/bundled-skills/yao-meta-skill/SKILL.md +86 -0
- package/bundled-skills/yao-meta-skill/agents/interface.yaml +26 -0
- package/bundled-skills/yao-meta-skill/manifest.json +24 -0
- package/bundled-skills/yao-meta-skill/references/artifact-design-doctrine.md +49 -0
- package/bundled-skills/yao-meta-skill/references/authoring-discipline.md +78 -0
- package/bundled-skills/yao-meta-skill/references/autonomous-adaptation.md +65 -0
- package/bundled-skills/yao-meta-skill/references/distribution-registry-method.md +60 -0
- package/bundled-skills/yao-meta-skill/references/eval-playbook.md +69 -0
- package/bundled-skills/yao-meta-skill/references/gate-selection.md +68 -0
- package/bundled-skills/yao-meta-skill/references/governance.md +134 -0
- package/bundled-skills/yao-meta-skill/references/human-review-template.md +54 -0
- package/bundled-skills/yao-meta-skill/references/intent-dialogue.md +138 -0
- package/bundled-skills/yao-meta-skill/references/iteration-philosophy.md +30 -0
- package/bundled-skills/yao-meta-skill/references/non-skill-decision-tree.md +39 -0
- package/bundled-skills/yao-meta-skill/references/operating-modes.md +107 -0
- package/bundled-skills/yao-meta-skill/references/output-eval-method.md +113 -0
- package/bundled-skills/yao-meta-skill/references/output-quality-risk.md +41 -0
- package/bundled-skills/yao-meta-skill/references/output-visual-quality.md +53 -0
- package/bundled-skills/yao-meta-skill/references/packaging-contracts.md +70 -0
- package/bundled-skills/yao-meta-skill/references/pattern-extraction-doctrine.md +76 -0
- package/bundled-skills/yao-meta-skill/references/platform-capability-matrix.md +49 -0
- package/bundled-skills/yao-meta-skill/references/prompt-engineering-doctrine.md +76 -0
- package/bundled-skills/yao-meta-skill/references/qa-ladder.md +57 -0
- package/bundled-skills/yao-meta-skill/references/reference-scan.md +126 -0
- package/bundled-skills/yao-meta-skill/references/regression-cause-taxonomy.md +80 -0
- package/bundled-skills/yao-meta-skill/references/resource-boundaries.md +120 -0
- package/bundled-skills/yao-meta-skill/references/review-studio-method.md +87 -0
- package/bundled-skills/yao-meta-skill/references/review-waiver-method.md +76 -0
- package/bundled-skills/yao-meta-skill/references/runtime-conformance-method.md +21 -0
- package/bundled-skills/yao-meta-skill/references/skill-archetypes.md +86 -0
- package/bundled-skills/yao-meta-skill/references/skill-atlas-method.md +35 -0
- package/bundled-skills/yao-meta-skill/references/skill-engineering-method.md +210 -0
- package/bundled-skills/yao-meta-skill/references/skill-ir-method.md +41 -0
- package/bundled-skills/yao-meta-skill/references/skillops-decision-policy.md +53 -0
- package/bundled-skills/yao-meta-skill/references/systems-thinking-doctrine.md +75 -0
- package/bundled-skills/yao-meta-skill/references/telemetry-drift-method.md +182 -0
- package/bundled-skills/yao-meta-skill/references/trust-security-method.md +79 -0
- package/bundled-skills/yao-meta-skill/references/user-memory-policy.md +35 -0
- package/bundled-skills/youtube-notetaker/SKILL.md +209 -0
- package/bundled-skills/youtube-notetaker/reference/artifact.html +269 -0
- package/bundled-skills/youtube-notetaker/scripts/contact_sheet.py +53 -0
- package/bundled-skills/youtube-notetaker/scripts/detect_slides.sh +19 -0
- package/bundled-skills/youtube-notetaker/scripts/download.sh +24 -0
- package/bundled-skills/youtube-notetaker/scripts/extract_slides.py +43 -0
- package/bundled-skills/youtube-notetaker/scripts/serve.py +173 -0
- package/bundled-skills/youtube-notetaker/scripts/setup.sh +27 -0
- package/bundled-skills/youtube-notetaker/scripts/verify.sh +31 -0
- package/bundled-skills/youtube-notetaker/scripts/vtt_to_transcript.py +59 -0
- package/bundled-skills/youtube-notetaker/scripts/write_library_item.py +69 -0
- package/package.json +1 -1
- package/skills_index.json +1956 -286
- package/bundled-skills/ai-md/SKILL.md +0 -523
- package/bundled-skills/atlas-contract/SKILL.md +0 -650
- package/bundled-skills/busybox-on-windows/SKILL.md +0 -40
- package/bundled-skills/monte-carlo-prevent/SKILL.md +0 -257
- package/bundled-skills/monte-carlo-prevent/references/TROUBLESHOOTING.md +0 -23
- package/bundled-skills/monte-carlo-prevent/references/parameters.md +0 -32
- package/bundled-skills/monte-carlo-prevent/references/workflows.md +0 -478
- package/bundled-skills/monte-carlo-push-ingestion/SKILL.md +0 -372
- package/bundled-skills/monte-carlo-push-ingestion/references/anomaly-detection.md +0 -87
- package/bundled-skills/monte-carlo-push-ingestion/references/custom-lineage.md +0 -203
- package/bundled-skills/monte-carlo-push-ingestion/references/direct-http-api.md +0 -207
- package/bundled-skills/monte-carlo-push-ingestion/references/prerequisites.md +0 -150
- package/bundled-skills/monte-carlo-push-ingestion/references/push-lineage.md +0 -160
- package/bundled-skills/monte-carlo-push-ingestion/references/push-metadata.md +0 -158
- package/bundled-skills/monte-carlo-push-ingestion/references/push-query-logs.md +0 -219
- package/bundled-skills/monte-carlo-push-ingestion/references/validation.md +0 -257
- package/bundled-skills/monte-carlo-push-ingestion/scripts/sample_verify.py +0 -357
- package/bundled-skills/monte-carlo-push-ingestion/scripts/templates/bigquery/collect_and_push_lineage.py +0 -70
- package/bundled-skills/monte-carlo-push-ingestion/scripts/templates/bigquery/collect_and_push_metadata.py +0 -65
- package/bundled-skills/monte-carlo-push-ingestion/scripts/templates/bigquery/collect_and_push_query_logs.py +0 -70
- package/bundled-skills/monte-carlo-push-ingestion/scripts/templates/bigquery/collect_lineage.py +0 -214
- package/bundled-skills/monte-carlo-push-ingestion/scripts/templates/bigquery/collect_metadata.py +0 -160
- package/bundled-skills/monte-carlo-push-ingestion/scripts/templates/bigquery/collect_query_logs.py +0 -164
- package/bundled-skills/monte-carlo-push-ingestion/scripts/templates/bigquery/push_lineage.py +0 -198
- package/bundled-skills/monte-carlo-push-ingestion/scripts/templates/bigquery/push_metadata.py +0 -193
- package/bundled-skills/monte-carlo-push-ingestion/scripts/templates/bigquery/push_query_logs.py +0 -207
- package/bundled-skills/monte-carlo-push-ingestion/scripts/templates/bigquery-iceberg/collect_and_push_metadata.py +0 -71
- package/bundled-skills/monte-carlo-push-ingestion/scripts/templates/bigquery-iceberg/collect_and_push_query_logs.py +0 -64
- package/bundled-skills/monte-carlo-push-ingestion/scripts/templates/bigquery-iceberg/collect_metadata.py +0 -253
- package/bundled-skills/monte-carlo-push-ingestion/scripts/templates/bigquery-iceberg/collect_query_logs.py +0 -149
- package/bundled-skills/monte-carlo-push-ingestion/scripts/templates/bigquery-iceberg/push_metadata.py +0 -190
- package/bundled-skills/monte-carlo-push-ingestion/scripts/templates/bigquery-iceberg/push_query_logs.py +0 -208
- package/bundled-skills/monte-carlo-push-ingestion/scripts/templates/databricks/collect_and_push_lineage.py +0 -83
- package/bundled-skills/monte-carlo-push-ingestion/scripts/templates/databricks/collect_and_push_metadata.py +0 -77
- package/bundled-skills/monte-carlo-push-ingestion/scripts/templates/databricks/collect_and_push_query_logs.py +0 -83
- package/bundled-skills/monte-carlo-push-ingestion/scripts/templates/databricks/collect_lineage.py +0 -240
- package/bundled-skills/monte-carlo-push-ingestion/scripts/templates/databricks/collect_metadata.py +0 -212
- package/bundled-skills/monte-carlo-push-ingestion/scripts/templates/databricks/collect_query_logs.py +0 -204
- package/bundled-skills/monte-carlo-push-ingestion/scripts/templates/databricks/push_lineage.py +0 -192
- package/bundled-skills/monte-carlo-push-ingestion/scripts/templates/databricks/push_metadata.py +0 -178
- package/bundled-skills/monte-carlo-push-ingestion/scripts/templates/databricks/push_query_logs.py +0 -200
- package/bundled-skills/monte-carlo-push-ingestion/scripts/templates/hive/collect_and_push_lineage.py +0 -119
- package/bundled-skills/monte-carlo-push-ingestion/scripts/templates/hive/collect_and_push_metadata.py +0 -119
- package/bundled-skills/monte-carlo-push-ingestion/scripts/templates/hive/collect_and_push_query_logs.py +0 -117
- package/bundled-skills/monte-carlo-push-ingestion/scripts/templates/hive/collect_lineage.py +0 -265
- package/bundled-skills/monte-carlo-push-ingestion/scripts/templates/hive/collect_metadata.py +0 -313
- package/bundled-skills/monte-carlo-push-ingestion/scripts/templates/hive/collect_query_logs.py +0 -284
- package/bundled-skills/monte-carlo-push-ingestion/scripts/templates/hive/push_lineage.py +0 -309
- package/bundled-skills/monte-carlo-push-ingestion/scripts/templates/hive/push_metadata.py +0 -245
- package/bundled-skills/monte-carlo-push-ingestion/scripts/templates/hive/push_query_logs.py +0 -255
- package/bundled-skills/monte-carlo-push-ingestion/scripts/templates/redshift/collect_and_push_lineage.py +0 -78
- package/bundled-skills/monte-carlo-push-ingestion/scripts/templates/redshift/collect_and_push_metadata.py +0 -80
- package/bundled-skills/monte-carlo-push-ingestion/scripts/templates/redshift/collect_and_push_query_logs.py +0 -88
- package/bundled-skills/monte-carlo-push-ingestion/scripts/templates/redshift/collect_lineage.py +0 -235
- package/bundled-skills/monte-carlo-push-ingestion/scripts/templates/redshift/collect_metadata.py +0 -219
- package/bundled-skills/monte-carlo-push-ingestion/scripts/templates/redshift/collect_query_logs.py +0 -239
- package/bundled-skills/monte-carlo-push-ingestion/scripts/templates/redshift/push_lineage.py +0 -178
- package/bundled-skills/monte-carlo-push-ingestion/scripts/templates/redshift/push_metadata.py +0 -178
- package/bundled-skills/monte-carlo-push-ingestion/scripts/templates/redshift/push_query_logs.py +0 -196
- package/bundled-skills/monte-carlo-push-ingestion/scripts/templates/snowflake/collect_and_push_lineage.py +0 -154
- package/bundled-skills/monte-carlo-push-ingestion/scripts/templates/snowflake/collect_and_push_metadata.py +0 -137
- package/bundled-skills/monte-carlo-push-ingestion/scripts/templates/snowflake/collect_and_push_query_logs.py +0 -137
- package/bundled-skills/monte-carlo-push-ingestion/scripts/templates/snowflake/collect_lineage.py +0 -349
- package/bundled-skills/monte-carlo-push-ingestion/scripts/templates/snowflake/collect_metadata.py +0 -329
- package/bundled-skills/monte-carlo-push-ingestion/scripts/templates/snowflake/collect_query_logs.py +0 -254
- package/bundled-skills/monte-carlo-push-ingestion/scripts/templates/snowflake/push_lineage.py +0 -307
- package/bundled-skills/monte-carlo-push-ingestion/scripts/templates/snowflake/push_metadata.py +0 -228
- package/bundled-skills/monte-carlo-push-ingestion/scripts/templates/snowflake/push_query_logs.py +0 -248
- package/bundled-skills/monte-carlo-push-ingestion/scripts/test_template_sdk_usage.py +0 -340
- package/bundled-skills/skill-optimizer/SKILL.md +0 -271
- package/bundled-skills/using-superpowers/SKILL.md +0 -98
|
@@ -0,0 +1,602 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: llm-council
|
|
3
|
+
description: "Run Fireworks-hosted open-weight model councils that compare responses and synthesize a final answer."
|
|
4
|
+
allowed-tools: Read, Write, Bash, AskUserQuestion
|
|
5
|
+
category: "ai-agents"
|
|
6
|
+
risk: "safe"
|
|
7
|
+
source: "official"
|
|
8
|
+
source_repo: "dair-ai/dair-academy-plugins"
|
|
9
|
+
source_type: "official"
|
|
10
|
+
date_added: "2026-06-19"
|
|
11
|
+
author: "DAIR.AI"
|
|
12
|
+
license: "MIT"
|
|
13
|
+
license_source: "https://github.com/dair-ai/dair-academy-plugins/blob/main/README.md#license"
|
|
14
|
+
tags:
|
|
15
|
+
- dair-academy
|
|
16
|
+
- ai
|
|
17
|
+
- workflow
|
|
18
|
+
tools:
|
|
19
|
+
- claude-code
|
|
20
|
+
- codex-cli
|
|
21
|
+
- cursor
|
|
22
|
+
---
|
|
23
|
+
|
|
24
|
+
# LLM Council (Fireworks AI)
|
|
25
|
+
|
|
26
|
+
## When to Use
|
|
27
|
+
|
|
28
|
+
Use when this workflow matches the user request: Use this skill for its documented workflow.
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
_Source: [dair-ai/dair-academy-plugins](https://github.com/dair-ai/dair-academy-plugins) (MIT)._
|
|
32
|
+
|
|
33
|
+
This skill implements Karpathy's LLM Council concept where multiple open-weight LLMs deliberate on a query, powered entirely by Fireworks AI:
|
|
34
|
+
|
|
35
|
+
1. **Phase 1**: All models respond to the query independently (parallel)
|
|
36
|
+
2. **Phase 2**: Models rank each other's anonymized responses
|
|
37
|
+
3. **Phase 3**: A Chairman LLM synthesizes the final answer
|
|
38
|
+
|
|
39
|
+
All 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.
|
|
40
|
+
|
|
41
|
+
## CRITICAL RULES
|
|
42
|
+
|
|
43
|
+
1. **ALWAYS use AskUserQuestion** to let the user select council models (multiselect) and the Chairman model
|
|
44
|
+
2. **ALWAYS save raw responses to files** - never summarize or truncate API outputs
|
|
45
|
+
3. **ALWAYS show full transparency** - display all individual responses, all rankings, AND the final synthesis
|
|
46
|
+
4. **NEVER skip the ranking phase** - it is essential to the council deliberation process
|
|
47
|
+
5. **Read from files for display** - ensures content is shown unmodified
|
|
48
|
+
6. **ALWAYS display the final output to the user** after Phase 3 completes
|
|
49
|
+
|
|
50
|
+
## Pre-flight Check
|
|
51
|
+
|
|
52
|
+
Before running any phase, verify the Fireworks API key is set:
|
|
53
|
+
|
|
54
|
+
```bash
|
|
55
|
+
if [ -z "$FIREWORKS_API_KEY" ]; then
|
|
56
|
+
echo "ERROR: FIREWORKS_API_KEY is not set."
|
|
57
|
+
echo "Create a Fireworks AI account at: https://fireworks.ai/"
|
|
58
|
+
echo "Then export it in your shell profile (~/.zshrc or ~/.bashrc):"
|
|
59
|
+
echo ' export FIREWORKS_API_KEY="your_api_key_here"'
|
|
60
|
+
exit 1
|
|
61
|
+
fi
|
|
62
|
+
echo "FIREWORKS_API_KEY is set."
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
## Available Models
|
|
66
|
+
|
|
67
|
+
Present these options to the user via AskUserQuestion (multiselect):
|
|
68
|
+
|
|
69
|
+
| Model | Fireworks ID | Provider |
|
|
70
|
+
|-------|-------------|----------|
|
|
71
|
+
| GLM 5 | accounts/fireworks/models/glm-5 | Z.ai |
|
|
72
|
+
| DeepSeek V3.1 | accounts/fireworks/models/deepseek-v3p1 | DeepSeek |
|
|
73
|
+
| DeepSeek V3.2 | accounts/fireworks/models/deepseek-v3p2 | DeepSeek |
|
|
74
|
+
| MiniMax M2.1 | accounts/fireworks/models/minimax-m2p1 | MiniMax |
|
|
75
|
+
| Kimi K2.5 | accounts/fireworks/models/kimi-k2p5 | Moonshot |
|
|
76
|
+
| Qwen3 235B | accounts/fireworks/models/qwen3-235b-a22b | Alibaba |
|
|
77
|
+
| Llama 4 Maverick | accounts/fireworks/models/llama4-maverick-instruct-basic | Meta |
|
|
78
|
+
|
|
79
|
+
## Workflow
|
|
80
|
+
|
|
81
|
+
### Step 1: Gather User Input
|
|
82
|
+
|
|
83
|
+
Use AskUserQuestion to get:
|
|
84
|
+
1. The query/question for the council (or accept it from the conversation)
|
|
85
|
+
2. Which models to include (multiselect, recommend 3-5 models)
|
|
86
|
+
3. Which model should be the Chairman (single select)
|
|
87
|
+
|
|
88
|
+
Note: 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.
|
|
89
|
+
|
|
90
|
+
Example AskUserQuestion for model selection (show 4, mention others):
|
|
91
|
+
```
|
|
92
|
+
question: "Which models should participate in the LLM Council? (Also available via Other: Llama 4 Maverick, Qwen3 235B, GLM 5)"
|
|
93
|
+
header: "Models"
|
|
94
|
+
multiSelect: true
|
|
95
|
+
options:
|
|
96
|
+
- label: "DeepSeek V3.2"
|
|
97
|
+
description: "DeepSeek's newest and most capable model"
|
|
98
|
+
- label: "MiniMax M2.1"
|
|
99
|
+
description: "MiniMax's strong open-weight model"
|
|
100
|
+
- label: "Kimi K2.5"
|
|
101
|
+
description: "Moonshot's strong open-weight model"
|
|
102
|
+
- label: "DeepSeek V3.1"
|
|
103
|
+
description: "DeepSeek's proven reasoning model"
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
Example AskUserQuestion for chairman:
|
|
107
|
+
```
|
|
108
|
+
question: "Which model should be the Chairman (synthesizes the final answer)?"
|
|
109
|
+
header: "Chairman"
|
|
110
|
+
multiSelect: false
|
|
111
|
+
options:
|
|
112
|
+
- label: "DeepSeek V3.2 (Recommended)"
|
|
113
|
+
description: "Newest DeepSeek, strong at comprehensive analysis"
|
|
114
|
+
- label: "GLM 5"
|
|
115
|
+
description: "Strong reasoning for synthesis"
|
|
116
|
+
- label: "Kimi K2.5"
|
|
117
|
+
description: "Strong at structured synthesis"
|
|
118
|
+
- label: "MiniMax M2.1"
|
|
119
|
+
description: "Strong open-weight model for synthesis"
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
### Model Name to ID Mapping
|
|
123
|
+
|
|
124
|
+
Use this mapping to convert user selections to Fireworks model IDs:
|
|
125
|
+
|
|
126
|
+
```python
|
|
127
|
+
MODEL_MAP = {
|
|
128
|
+
"GLM 5": "accounts/fireworks/models/glm-5",
|
|
129
|
+
"DeepSeek V3.1": "accounts/fireworks/models/deepseek-v3p1",
|
|
130
|
+
"DeepSeek V3.2": "accounts/fireworks/models/deepseek-v3p2",
|
|
131
|
+
"MiniMax M2.1": "accounts/fireworks/models/minimax-m2p1",
|
|
132
|
+
"Kimi K2.5": "accounts/fireworks/models/kimi-k2p5",
|
|
133
|
+
"Qwen3 235B": "accounts/fireworks/models/qwen3-235b-a22b",
|
|
134
|
+
"Llama 4 Maverick": "accounts/fireworks/models/llama4-maverick-instruct-basic",
|
|
135
|
+
}
|
|
136
|
+
```
|
|
137
|
+
|
|
138
|
+
### Step 2: Run Phase 1 - Individual Responses
|
|
139
|
+
|
|
140
|
+
After gathering input, run this script to get responses from all selected models in parallel:
|
|
141
|
+
|
|
142
|
+
```bash
|
|
143
|
+
QUERY="USER_QUERY_HERE"
|
|
144
|
+
MODELS='["accounts/fireworks/models/glm-5", "accounts/fireworks/models/deepseek-v3p1"]'
|
|
145
|
+
|
|
146
|
+
python3 << 'PYEOF'
|
|
147
|
+
import os
|
|
148
|
+
import json
|
|
149
|
+
import requests
|
|
150
|
+
import time
|
|
151
|
+
from concurrent.futures import ThreadPoolExecutor, as_completed
|
|
152
|
+
|
|
153
|
+
FIREWORKS_API_KEY = os.environ.get("FIREWORKS_API_KEY")
|
|
154
|
+
API_URL = "https://api.fireworks.ai/inference/v1/chat/completions"
|
|
155
|
+
|
|
156
|
+
QUERY = os.environ.get("QUERY", "")
|
|
157
|
+
MODELS = json.loads(os.environ.get("MODELS", "[]"))
|
|
158
|
+
|
|
159
|
+
# Create session directory
|
|
160
|
+
timestamp = time.strftime("%Y%m%d-%H%M%S")
|
|
161
|
+
SESSION_DIR = f"/tmp/llm-council/{timestamp}"
|
|
162
|
+
os.makedirs(SESSION_DIR, exist_ok=True)
|
|
163
|
+
|
|
164
|
+
# Save config
|
|
165
|
+
config = {"query": QUERY, "models": MODELS, "timestamp": timestamp}
|
|
166
|
+
with open(f"{SESSION_DIR}/config.json", "w") as f:
|
|
167
|
+
json.dump(config, f, indent=2)
|
|
168
|
+
|
|
169
|
+
def call_model(model_id, query):
|
|
170
|
+
"""Call a single model via Fireworks AI"""
|
|
171
|
+
try:
|
|
172
|
+
start = time.time()
|
|
173
|
+
response = requests.post(
|
|
174
|
+
API_URL,
|
|
175
|
+
headers={
|
|
176
|
+
"Authorization": f"Bearer {FIREWORKS_API_KEY}",
|
|
177
|
+
"Content-Type": "application/json"
|
|
178
|
+
},
|
|
179
|
+
json={
|
|
180
|
+
"model": model_id,
|
|
181
|
+
"messages": [
|
|
182
|
+
{"role": "system", "content": "You are participating in an LLM council deliberation. Provide your best, most thoughtful response to the query. Be comprehensive but focused."},
|
|
183
|
+
{"role": "user", "content": query}
|
|
184
|
+
],
|
|
185
|
+
"max_tokens": 4000,
|
|
186
|
+
"temperature": 1
|
|
187
|
+
},
|
|
188
|
+
timeout=120
|
|
189
|
+
)
|
|
190
|
+
response.raise_for_status()
|
|
191
|
+
elapsed = time.time() - start
|
|
192
|
+
data = response.json()
|
|
193
|
+
usage = data.get("usage", {})
|
|
194
|
+
return {
|
|
195
|
+
"success": True,
|
|
196
|
+
"content": data["choices"][0]["message"]["content"],
|
|
197
|
+
"model": model_id,
|
|
198
|
+
"latency_seconds": round(elapsed, 2),
|
|
199
|
+
"tokens": {
|
|
200
|
+
"prompt": usage.get("prompt_tokens", 0),
|
|
201
|
+
"completion": usage.get("completion_tokens", 0),
|
|
202
|
+
"total": usage.get("total_tokens", 0)
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
except Exception as e:
|
|
206
|
+
return {
|
|
207
|
+
"success": False,
|
|
208
|
+
"content": f"[ERROR: {str(e)}]",
|
|
209
|
+
"model": model_id,
|
|
210
|
+
"latency_seconds": 0,
|
|
211
|
+
"tokens": {"prompt": 0, "completion": 0, "total": 0}
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
print(f"\n{'='*60}")
|
|
215
|
+
print("PHASE 1: Collecting Individual Responses")
|
|
216
|
+
print(f"{'='*60}")
|
|
217
|
+
print(f"Query: {QUERY[:200]}...")
|
|
218
|
+
print(f"Models: {', '.join([m.split('/')[-1] for m in MODELS])}")
|
|
219
|
+
print(f"Session: {SESSION_DIR}")
|
|
220
|
+
print()
|
|
221
|
+
|
|
222
|
+
# Parallel execution
|
|
223
|
+
results = {}
|
|
224
|
+
with ThreadPoolExecutor(max_workers=len(MODELS)) as executor:
|
|
225
|
+
futures = {executor.submit(call_model, m, QUERY): m for m in MODELS}
|
|
226
|
+
for future in as_completed(futures):
|
|
227
|
+
model = futures[future]
|
|
228
|
+
result = future.result()
|
|
229
|
+
results[model] = result
|
|
230
|
+
status = "OK" if result["success"] else "FAILED"
|
|
231
|
+
latency = f"{result['latency_seconds']}s" if result["success"] else "N/A"
|
|
232
|
+
print(f" [{status}] {model.split('/')[-1]} ({latency})")
|
|
233
|
+
|
|
234
|
+
# Save raw results
|
|
235
|
+
with open(f"{SESSION_DIR}/phase1_responses.json", "w") as f:
|
|
236
|
+
json.dump(results, f, indent=2)
|
|
237
|
+
|
|
238
|
+
print(f"\nPhase 1 complete. Results saved to: {SESSION_DIR}/phase1_responses.json")
|
|
239
|
+
print(f"SESSION_DIR={SESSION_DIR}")
|
|
240
|
+
PYEOF
|
|
241
|
+
```
|
|
242
|
+
|
|
243
|
+
### Step 3: Run Phase 2 - Cross-Model Ranking
|
|
244
|
+
|
|
245
|
+
Each model reviews and ranks the anonymized responses from Phase 1:
|
|
246
|
+
|
|
247
|
+
```bash
|
|
248
|
+
SESSION_DIR="/tmp/llm-council/TIMESTAMP_HERE"
|
|
249
|
+
|
|
250
|
+
python3 << 'PYEOF'
|
|
251
|
+
import os
|
|
252
|
+
import json
|
|
253
|
+
import requests
|
|
254
|
+
import time
|
|
255
|
+
from concurrent.futures import ThreadPoolExecutor, as_completed
|
|
256
|
+
|
|
257
|
+
FIREWORKS_API_KEY = os.environ.get("FIREWORKS_API_KEY")
|
|
258
|
+
API_URL = "https://api.fireworks.ai/inference/v1/chat/completions"
|
|
259
|
+
SESSION_DIR = os.environ.get("SESSION_DIR")
|
|
260
|
+
|
|
261
|
+
# Load Phase 1 results
|
|
262
|
+
with open(f"{SESSION_DIR}/config.json") as f:
|
|
263
|
+
config = json.load(f)
|
|
264
|
+
with open(f"{SESSION_DIR}/phase1_responses.json") as f:
|
|
265
|
+
phase1_results = json.load(f)
|
|
266
|
+
|
|
267
|
+
QUERY = config["query"]
|
|
268
|
+
MODELS = config["models"]
|
|
269
|
+
|
|
270
|
+
# Create anonymized mapping
|
|
271
|
+
labels = ["A", "B", "C", "D", "E", "F", "G"][:len(MODELS)]
|
|
272
|
+
model_to_label = dict(zip(MODELS, labels))
|
|
273
|
+
label_to_model = {v: k for k, v in model_to_label.items()}
|
|
274
|
+
|
|
275
|
+
# Format anonymized responses
|
|
276
|
+
anonymized_responses = []
|
|
277
|
+
for model_id in MODELS:
|
|
278
|
+
label = model_to_label[model_id]
|
|
279
|
+
content = phase1_results[model_id]["content"]
|
|
280
|
+
anonymized_responses.append(f"=== Response {label} ===\n{content}")
|
|
281
|
+
|
|
282
|
+
anonymized_text = "\n\n".join(anonymized_responses)
|
|
283
|
+
|
|
284
|
+
def get_rankings(model_id, query, anonymized, own_label):
|
|
285
|
+
"""Get rankings from a single model"""
|
|
286
|
+
ranking_prompt = f"""You are evaluating responses from multiple AI models to this query:
|
|
287
|
+
|
|
288
|
+
QUERY: {query}
|
|
289
|
+
|
|
290
|
+
Here are the anonymized responses:
|
|
291
|
+
|
|
292
|
+
{anonymized}
|
|
293
|
+
|
|
294
|
+
Please rank these responses from BEST to WORST. For each ranking:
|
|
295
|
+
1. State the response letter (A, B, C, etc.)
|
|
296
|
+
2. Give a brief reason (1-2 sentences)
|
|
297
|
+
3. You may skip ranking your own response (labeled {own_label}) or rank it fairly
|
|
298
|
+
|
|
299
|
+
Format your response EXACTLY as:
|
|
300
|
+
RANKINGS:
|
|
301
|
+
1. [Letter] - [Brief reason]
|
|
302
|
+
2. [Letter] - [Brief reason]
|
|
303
|
+
3. [Letter] - [Brief reason]
|
|
304
|
+
..."""
|
|
305
|
+
|
|
306
|
+
try:
|
|
307
|
+
start = time.time()
|
|
308
|
+
response = requests.post(
|
|
309
|
+
API_URL,
|
|
310
|
+
headers={
|
|
311
|
+
"Authorization": f"Bearer {FIREWORKS_API_KEY}",
|
|
312
|
+
"Content-Type": "application/json"
|
|
313
|
+
},
|
|
314
|
+
json={
|
|
315
|
+
"model": model_id,
|
|
316
|
+
"messages": [
|
|
317
|
+
{"role": "system", "content": f"You are ranking AI responses objectively. Your own response is labeled '{own_label}'."},
|
|
318
|
+
{"role": "user", "content": ranking_prompt}
|
|
319
|
+
],
|
|
320
|
+
"max_tokens": 1000,
|
|
321
|
+
"temperature": 1
|
|
322
|
+
},
|
|
323
|
+
timeout=90
|
|
324
|
+
)
|
|
325
|
+
response.raise_for_status()
|
|
326
|
+
elapsed = time.time() - start
|
|
327
|
+
return {
|
|
328
|
+
"success": True,
|
|
329
|
+
"content": response.json()["choices"][0]["message"]["content"],
|
|
330
|
+
"model": model_id,
|
|
331
|
+
"latency_seconds": round(elapsed, 2)
|
|
332
|
+
}
|
|
333
|
+
except Exception as e:
|
|
334
|
+
return {
|
|
335
|
+
"success": False,
|
|
336
|
+
"content": f"[ERROR: {str(e)}]",
|
|
337
|
+
"model": model_id,
|
|
338
|
+
"latency_seconds": 0
|
|
339
|
+
}
|
|
340
|
+
|
|
341
|
+
print(f"\n{'='*60}")
|
|
342
|
+
print("PHASE 2: Cross-Model Ranking")
|
|
343
|
+
print(f"{'='*60}")
|
|
344
|
+
print(f"Label mapping: {json.dumps({v: k.split('/')[-1] for k, v in model_to_label.items()})}")
|
|
345
|
+
print()
|
|
346
|
+
|
|
347
|
+
# Collect rankings from all models in parallel
|
|
348
|
+
rankings = {}
|
|
349
|
+
with ThreadPoolExecutor(max_workers=len(MODELS)) as executor:
|
|
350
|
+
futures = {
|
|
351
|
+
executor.submit(get_rankings, mid, QUERY, anonymized_text, model_to_label[mid]): mid
|
|
352
|
+
for mid in MODELS
|
|
353
|
+
}
|
|
354
|
+
for future in as_completed(futures):
|
|
355
|
+
model = futures[future]
|
|
356
|
+
result = future.result()
|
|
357
|
+
rankings[model] = result
|
|
358
|
+
status = "OK" if result["success"] else "FAILED"
|
|
359
|
+
latency = f"{result['latency_seconds']}s" if result["success"] else "N/A"
|
|
360
|
+
print(f" [{status}] {model.split('/')[-1]} ({latency})")
|
|
361
|
+
|
|
362
|
+
# Save rankings
|
|
363
|
+
output = {
|
|
364
|
+
"label_mapping": label_to_model,
|
|
365
|
+
"model_to_label": model_to_label,
|
|
366
|
+
"rankings": rankings
|
|
367
|
+
}
|
|
368
|
+
with open(f"{SESSION_DIR}/phase2_rankings.json", "w") as f:
|
|
369
|
+
json.dump(output, f, indent=2)
|
|
370
|
+
|
|
371
|
+
print(f"\nPhase 2 complete. Rankings saved to: {SESSION_DIR}/phase2_rankings.json")
|
|
372
|
+
PYEOF
|
|
373
|
+
```
|
|
374
|
+
|
|
375
|
+
### Step 4: Run Phase 3 - Chairman Synthesis
|
|
376
|
+
|
|
377
|
+
The Chairman model receives all responses and rankings, then produces the final synthesis:
|
|
378
|
+
|
|
379
|
+
```bash
|
|
380
|
+
SESSION_DIR="/tmp/llm-council/TIMESTAMP_HERE"
|
|
381
|
+
CHAIRMAN_MODEL="accounts/fireworks/models/glm-5"
|
|
382
|
+
|
|
383
|
+
python3 << 'PYEOF'
|
|
384
|
+
import os
|
|
385
|
+
import json
|
|
386
|
+
import requests
|
|
387
|
+
import time
|
|
388
|
+
|
|
389
|
+
FIREWORKS_API_KEY = os.environ.get("FIREWORKS_API_KEY")
|
|
390
|
+
API_URL = "https://api.fireworks.ai/inference/v1/chat/completions"
|
|
391
|
+
SESSION_DIR = os.environ.get("SESSION_DIR")
|
|
392
|
+
CHAIRMAN_MODEL = os.environ.get("CHAIRMAN_MODEL")
|
|
393
|
+
|
|
394
|
+
# Load all previous results
|
|
395
|
+
with open(f"{SESSION_DIR}/config.json") as f:
|
|
396
|
+
config = json.load(f)
|
|
397
|
+
with open(f"{SESSION_DIR}/phase1_responses.json") as f:
|
|
398
|
+
phase1 = json.load(f)
|
|
399
|
+
with open(f"{SESSION_DIR}/phase2_rankings.json") as f:
|
|
400
|
+
phase2 = json.load(f)
|
|
401
|
+
|
|
402
|
+
QUERY = config["query"]
|
|
403
|
+
label_to_model = phase2["label_mapping"]
|
|
404
|
+
model_to_label = phase2["model_to_label"]
|
|
405
|
+
|
|
406
|
+
# Format responses with model names revealed
|
|
407
|
+
responses_text = []
|
|
408
|
+
for model_id, result in phase1.items():
|
|
409
|
+
label = model_to_label.get(model_id, "?")
|
|
410
|
+
model_name = model_id.split("/")[-1]
|
|
411
|
+
responses_text.append(f"=== {label}: {model_name} ===\n{result['content']}")
|
|
412
|
+
|
|
413
|
+
# Format rankings
|
|
414
|
+
rankings_text = []
|
|
415
|
+
for model_id, result in phase2["rankings"].items():
|
|
416
|
+
model_name = model_id.split("/")[-1]
|
|
417
|
+
rankings_text.append(f"[{model_name}'s Rankings]\n{result['content']}")
|
|
418
|
+
|
|
419
|
+
synthesis_prompt = f"""You are the Chairman of an LLM Council. Your task is to synthesize the best possible answer from multiple AI responses.
|
|
420
|
+
|
|
421
|
+
ORIGINAL QUERY:
|
|
422
|
+
{QUERY}
|
|
423
|
+
|
|
424
|
+
INDIVIDUAL RESPONSES:
|
|
425
|
+
{chr(10).join(responses_text)}
|
|
426
|
+
|
|
427
|
+
MODEL RANKINGS:
|
|
428
|
+
{chr(10).join(rankings_text)}
|
|
429
|
+
|
|
430
|
+
As Chairman, produce a FINAL SYNTHESIS that:
|
|
431
|
+
1. Incorporates the strongest elements from the best-ranked responses
|
|
432
|
+
2. Resolves any contradictions between responses
|
|
433
|
+
3. Addresses aspects that multiple models agreed on
|
|
434
|
+
4. Corrects any errors identified through cross-ranking
|
|
435
|
+
5. Provides the most complete, accurate, and helpful answer
|
|
436
|
+
|
|
437
|
+
Begin your synthesis:"""
|
|
438
|
+
|
|
439
|
+
print(f"\n{'='*60}")
|
|
440
|
+
print("PHASE 3: Chairman Synthesis")
|
|
441
|
+
print(f"{'='*60}")
|
|
442
|
+
print(f"Chairman: {CHAIRMAN_MODEL.split('/')[-1]}")
|
|
443
|
+
print()
|
|
444
|
+
|
|
445
|
+
try:
|
|
446
|
+
start = time.time()
|
|
447
|
+
response = requests.post(
|
|
448
|
+
API_URL,
|
|
449
|
+
headers={
|
|
450
|
+
"Authorization": f"Bearer {FIREWORKS_API_KEY}",
|
|
451
|
+
"Content-Type": "application/json"
|
|
452
|
+
},
|
|
453
|
+
json={
|
|
454
|
+
"model": CHAIRMAN_MODEL,
|
|
455
|
+
"messages": [
|
|
456
|
+
{"role": "system", "content": "You are the Chairman of an LLM Council. Synthesize multiple AI perspectives into a definitive, comprehensive response."},
|
|
457
|
+
{"role": "user", "content": synthesis_prompt}
|
|
458
|
+
],
|
|
459
|
+
"max_tokens": 4000,
|
|
460
|
+
"temperature": 1
|
|
461
|
+
},
|
|
462
|
+
timeout=180
|
|
463
|
+
)
|
|
464
|
+
response.raise_for_status()
|
|
465
|
+
elapsed = time.time() - start
|
|
466
|
+
synthesis = response.json()["choices"][0]["message"]["content"]
|
|
467
|
+
|
|
468
|
+
with open(f"{SESSION_DIR}/phase3_synthesis.txt", "w") as f:
|
|
469
|
+
f.write(synthesis)
|
|
470
|
+
|
|
471
|
+
print(f"Phase 3 complete ({elapsed:.2f}s). Synthesis saved to: {SESSION_DIR}/phase3_synthesis.txt")
|
|
472
|
+
|
|
473
|
+
except Exception as e:
|
|
474
|
+
print(f"ERROR: {e}")
|
|
475
|
+
synthesis = f"[ERROR: {str(e)}]"
|
|
476
|
+
with open(f"{SESSION_DIR}/phase3_synthesis.txt", "w") as f:
|
|
477
|
+
f.write(synthesis)
|
|
478
|
+
|
|
479
|
+
# Update config with chairman
|
|
480
|
+
config["chairman"] = CHAIRMAN_MODEL
|
|
481
|
+
with open(f"{SESSION_DIR}/config.json", "w") as f:
|
|
482
|
+
json.dump(config, f, indent=2)
|
|
483
|
+
PYEOF
|
|
484
|
+
```
|
|
485
|
+
|
|
486
|
+
### Step 5: Display Full Results
|
|
487
|
+
|
|
488
|
+
Read all saved files and display the complete council deliberation:
|
|
489
|
+
|
|
490
|
+
```bash
|
|
491
|
+
SESSION_DIR="/tmp/llm-council/TIMESTAMP_HERE"
|
|
492
|
+
|
|
493
|
+
python3 << 'PYEOF'
|
|
494
|
+
import os
|
|
495
|
+
import json
|
|
496
|
+
|
|
497
|
+
SESSION_DIR = os.environ.get("SESSION_DIR")
|
|
498
|
+
|
|
499
|
+
# Load all data
|
|
500
|
+
with open(f"{SESSION_DIR}/config.json") as f:
|
|
501
|
+
config = json.load(f)
|
|
502
|
+
with open(f"{SESSION_DIR}/phase1_responses.json") as f:
|
|
503
|
+
phase1 = json.load(f)
|
|
504
|
+
with open(f"{SESSION_DIR}/phase2_rankings.json") as f:
|
|
505
|
+
phase2 = json.load(f)
|
|
506
|
+
with open(f"{SESSION_DIR}/phase3_synthesis.txt") as f:
|
|
507
|
+
synthesis = f.read()
|
|
508
|
+
|
|
509
|
+
model_to_label = phase2["model_to_label"]
|
|
510
|
+
label_to_model = phase2["label_mapping"]
|
|
511
|
+
|
|
512
|
+
# Build formatted output
|
|
513
|
+
output = []
|
|
514
|
+
output.append("=" * 70)
|
|
515
|
+
output.append(" LLM COUNCIL DELIBERATION")
|
|
516
|
+
output.append(" Powered by Fireworks AI")
|
|
517
|
+
output.append("=" * 70)
|
|
518
|
+
output.append("")
|
|
519
|
+
output.append(f"QUERY: {config['query']}")
|
|
520
|
+
output.append(f"COUNCIL: {', '.join([m.split('/')[-1] for m in config['models']])}")
|
|
521
|
+
output.append(f"CHAIRMAN: {config.get('chairman', 'N/A').split('/')[-1]}")
|
|
522
|
+
output.append("")
|
|
523
|
+
|
|
524
|
+
# Phase 1: Individual Responses
|
|
525
|
+
output.append("-" * 70)
|
|
526
|
+
output.append(" PHASE 1: INDIVIDUAL RESPONSES")
|
|
527
|
+
output.append("-" * 70)
|
|
528
|
+
output.append("")
|
|
529
|
+
|
|
530
|
+
for model_id, result in phase1.items():
|
|
531
|
+
model_name = model_id.split("/")[-1]
|
|
532
|
+
label = model_to_label.get(model_id, "?")
|
|
533
|
+
latency = result.get("latency_seconds", "N/A")
|
|
534
|
+
tokens = result.get("tokens", {})
|
|
535
|
+
output.append(f"[{label}] {model_name} (latency: {latency}s, tokens: {tokens.get('total', 'N/A')})")
|
|
536
|
+
output.append("-" * 40)
|
|
537
|
+
output.append(result["content"])
|
|
538
|
+
output.append("")
|
|
539
|
+
|
|
540
|
+
# Phase 2: Cross-Model Rankings
|
|
541
|
+
output.append("-" * 70)
|
|
542
|
+
output.append(" PHASE 2: CROSS-MODEL RANKINGS")
|
|
543
|
+
output.append("-" * 70)
|
|
544
|
+
output.append("")
|
|
545
|
+
output.append(f"Label mapping: {json.dumps({v: k.split('/')[-1] for k, v in model_to_label.items()}, indent=2)}")
|
|
546
|
+
output.append("")
|
|
547
|
+
|
|
548
|
+
for model_id, result in phase2["rankings"].items():
|
|
549
|
+
model_name = model_id.split("/")[-1]
|
|
550
|
+
output.append(f"[{model_name}'s Rankings]")
|
|
551
|
+
output.append(result["content"])
|
|
552
|
+
output.append("")
|
|
553
|
+
|
|
554
|
+
# Phase 3: Chairman Synthesis
|
|
555
|
+
output.append("-" * 70)
|
|
556
|
+
output.append(" PHASE 3: CHAIRMAN'S SYNTHESIS")
|
|
557
|
+
output.append("-" * 70)
|
|
558
|
+
output.append("")
|
|
559
|
+
chairman_name = config.get("chairman", "Chairman").split("/")[-1]
|
|
560
|
+
output.append(f"[{chairman_name} - Chairman]")
|
|
561
|
+
output.append("")
|
|
562
|
+
output.append(synthesis)
|
|
563
|
+
output.append("")
|
|
564
|
+
output.append("=" * 70)
|
|
565
|
+
output.append(f"Session files: {SESSION_DIR}/")
|
|
566
|
+
|
|
567
|
+
# Save formatted output
|
|
568
|
+
final_output = "\n".join(output)
|
|
569
|
+
with open(f"{SESSION_DIR}/final_output.md", "w") as f:
|
|
570
|
+
f.write(final_output)
|
|
571
|
+
|
|
572
|
+
print(final_output)
|
|
573
|
+
print(f"\nFull output saved to: {SESSION_DIR}/final_output.md")
|
|
574
|
+
PYEOF
|
|
575
|
+
```
|
|
576
|
+
|
|
577
|
+
## Important Notes
|
|
578
|
+
|
|
579
|
+
1. **Session Directory**: Each run creates a unique session in `/tmp/llm-council/{timestamp}/`
|
|
580
|
+
2. **Raw Data Preserved**: All API responses are saved as-is to JSON files for full transparency
|
|
581
|
+
3. **Cost**: Fireworks pricing is per-token. More models and longer queries cost more. Check current pricing at https://fireworks.ai/pricing
|
|
582
|
+
4. **Latency Tracking**: Each API call tracks latency so you can see Fireworks' speed in action
|
|
583
|
+
5. **Token Usage**: Phase 1 responses include token counts for cost awareness
|
|
584
|
+
6. **Rate Limits**: If you hit rate limits, wait briefly and retry
|
|
585
|
+
7. **Model Availability**: Check https://app.fireworks.ai/ for current model status
|
|
586
|
+
|
|
587
|
+
## Setup
|
|
588
|
+
|
|
589
|
+
1. Create a Fireworks AI account at https://fireworks.ai/ and grab your API key from the dashboard
|
|
590
|
+
2. Export it in your shell profile:
|
|
591
|
+
```bash
|
|
592
|
+
export FIREWORKS_API_KEY="your_api_key_here"
|
|
593
|
+
```
|
|
594
|
+
3. Restart your terminal or run `source ~/.zshrc`
|
|
595
|
+
4. Invoke this skill when you want multiple open-weight AI perspectives on a question
|
|
596
|
+
|
|
597
|
+
|
|
598
|
+
## Limitations
|
|
599
|
+
|
|
600
|
+
- Requires the upstream tool, account, API key, or local setup when the workflow names one.
|
|
601
|
+
- Does not authorize destructive, production, paid, or external-message actions without explicit user approval.
|
|
602
|
+
- Validate generated artifacts or recommendations against the user's real sources before treating them as final.
|