{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://jsonit.io/council.schema.json",
  "title": "Jsonit council file",
  "description": "An LLM Council for Jsonit schema suggestions, laid out like the llm-council-web councils. Each lens runs on its own model with its own persona and proposes a JSON Schema; the chairman merges the proposals. Upload on jsonit.io/dashboard/council. Docs: jsonit.io/docs#council-files",
  "type": "object",
  "required": [
    "lenses"
  ],
  "properties": {
    "$schema": {
      "type": "string"
    },
    "_comment": {
      "type": "string",
      "description": "Free-form note; ignored on upload."
    },
    "format": {
      "const": "jsonit-council"
    },
    "version": {
      "enum": [
        1,
        2
      ]
    },
    "name": {
      "type": "string",
      "minLength": 1,
      "maxLength": 60,
      "description": "Council name, e.g. \"Electrical specs\". Must be unique among your councils."
    },
    "description": {
      "type": "string",
      "maxLength": 500,
      "description": "Which documents this council is for. Shown when picking a council."
    },
    "context": {
      "type": "string",
      "maxLength": 3000,
      "description": "Domain background given to every lens and the chairman: what the documents contain, how the data is used, naming conventions, units, how tables should be structured."
    },
    "instructions": {
      "type": "string",
      "minLength": 1,
      "maxLength": 6000,
      "description": "Task instructions sent to every lens. Must ask for a JSON object with a \"schema\" key (and optionally \"notes\"). Omit to use the built-in instructions."
    },
    "chairman": {
      "type": "object",
      "required": [
        "model",
        "instructions"
      ],
      "properties": {
        "model": {
          "type": "string",
          "enum": [
            "google/gemini-3.8-flash",
            "google/gemini-3.1-flash-lite",
            "openai/gpt-5.4-mini",
            "openai/gpt-6.1-sol",
            "anthropic/claude-haiku-4.5",
            "anthropic/claude-sonnet-5.5",
            "deepseek/deepseek-v4-pro-0813",
            "qwen/qwen3.8-max-0902",
            "mistralai/mistral-medium-3-5",
            "moonshotai/kimi-k3",
            "x-ai/grok-4.7",
            "z-ai/glm-5.3",
            "minimax/minimax-m3",
            "cohere/command-a-plus",
            "anthropic/claude-opus-5.5",
            "openai/gpt-6.1-sol-pro",
            "qwen/qwen3.8-max-prime",
            "z-ai/glm-5.3-prime"
          ],
          "description": "OpenRouter model id. Must be one of the models Jsonit offers."
        },
        "fallback_models": {
          "type": "array",
          "maxItems": 2,
          "uniqueItems": true,
          "items": {
            "type": "string",
            "enum": [
              "google/gemini-3.8-flash",
              "google/gemini-3.1-flash-lite",
              "openai/gpt-5.4-mini",
              "openai/gpt-6.1-sol",
              "anthropic/claude-haiku-4.5",
              "anthropic/claude-sonnet-5.5",
              "deepseek/deepseek-v4-pro-0813",
              "qwen/qwen3.8-max-0902",
              "mistralai/mistral-medium-3-5",
              "moonshotai/kimi-k3",
              "x-ai/grok-4.7",
              "z-ai/glm-5.3",
              "minimax/minimax-m3",
              "cohere/command-a-plus",
              "anthropic/claude-opus-5.5",
              "openai/gpt-6.1-sol-pro",
              "qwen/qwen3.8-max-prime",
              "z-ai/glm-5.3-prime"
            ]
          },
          "description": "Backup models, tried in order if the model before them fails. Optional."
        },
        "fallback_model": {
          "type": "string",
          "enum": [
            "google/gemini-3.8-flash",
            "google/gemini-3.1-flash-lite",
            "openai/gpt-5.4-mini",
            "openai/gpt-6.1-sol",
            "anthropic/claude-haiku-4.5",
            "anthropic/claude-sonnet-5.5",
            "deepseek/deepseek-v4-pro-0813",
            "qwen/qwen3.8-max-0902",
            "mistralai/mistral-medium-3-5",
            "moonshotai/kimi-k3",
            "x-ai/grok-4.7",
            "z-ai/glm-5.3",
            "minimax/minimax-m3",
            "cohere/command-a-plus",
            "anthropic/claude-opus-5.5",
            "openai/gpt-6.1-sol-pro",
            "qwen/qwen3.8-max-prime",
            "z-ai/glm-5.3-prime"
          ],
          "description": "Version 1 files: a single backup model. Still accepted; prefer fallback_models."
        },
        "instructions": {
          "type": "string",
          "minLength": 1,
          "maxLength": 6000,
          "description": "How the chairman merges the lenses' proposals. Must ask for ONLY the final JSON Schema."
        }
      },
      "additionalProperties": false,
      "description": "Merges the lenses' proposals into the final schema. Omit to use the built-in chairman."
    },
    "lenses": {
      "type": "array",
      "minItems": 1,
      "maxItems": 6,
      "description": "The council members. At least one must be enabled.",
      "items": {
        "type": "object",
        "required": [
          "name",
          "model",
          "persona"
        ],
        "properties": {
          "id": {
            "type": "string",
            "pattern": "^[a-z0-9_-]{1,40}$",
            "description": "Short identifier; generated from the name if missing."
          },
          "name": {
            "type": "string",
            "minLength": 1,
            "maxLength": 60
          },
          "enabled": {
            "type": "boolean",
            "default": true
          },
          "model": {
            "type": "string",
            "enum": [
              "google/gemini-3.8-flash",
              "google/gemini-3.1-flash-lite",
              "openai/gpt-5.4-mini",
              "openai/gpt-6.1-sol",
              "anthropic/claude-haiku-4.5",
              "anthropic/claude-sonnet-5.5",
              "deepseek/deepseek-v4-pro-0813",
              "qwen/qwen3.8-max-0902",
              "mistralai/mistral-medium-3-5",
              "moonshotai/kimi-k3",
              "x-ai/grok-4.7",
              "z-ai/glm-5.3",
              "minimax/minimax-m3",
              "cohere/command-a-plus",
              "anthropic/claude-opus-5.5",
              "openai/gpt-6.1-sol-pro",
              "qwen/qwen3.8-max-prime",
              "z-ai/glm-5.3-prime"
            ],
            "description": "OpenRouter model id. Must be one of the models Jsonit offers."
          },
          "fallback_models": {
            "type": "array",
            "maxItems": 2,
            "uniqueItems": true,
            "items": {
              "type": "string",
              "enum": [
                "google/gemini-3.8-flash",
                "google/gemini-3.1-flash-lite",
                "openai/gpt-5.4-mini",
                "openai/gpt-6.1-sol",
                "anthropic/claude-haiku-4.5",
                "anthropic/claude-sonnet-5.5",
                "deepseek/deepseek-v4-pro-0813",
                "qwen/qwen3.8-max-0902",
                "mistralai/mistral-medium-3-5",
                "moonshotai/kimi-k3",
                "x-ai/grok-4.7",
                "z-ai/glm-5.3",
                "minimax/minimax-m3",
                "cohere/command-a-plus",
                "anthropic/claude-opus-5.5",
                "openai/gpt-6.1-sol-pro",
                "qwen/qwen3.8-max-prime",
                "z-ai/glm-5.3-prime"
              ]
            },
            "description": "Backup models, tried in order if the model before them fails. Optional."
          },
          "fallback_model": {
            "type": "string",
            "enum": [
              "google/gemini-3.8-flash",
              "google/gemini-3.1-flash-lite",
              "openai/gpt-5.4-mini",
              "openai/gpt-6.1-sol",
              "anthropic/claude-haiku-4.5",
              "anthropic/claude-sonnet-5.5",
              "deepseek/deepseek-v4-pro-0813",
              "qwen/qwen3.8-max-0902",
              "mistralai/mistral-medium-3-5",
              "moonshotai/kimi-k3",
              "x-ai/grok-4.7",
              "z-ai/glm-5.3",
              "minimax/minimax-m3",
              "cohere/command-a-plus",
              "anthropic/claude-opus-5.5",
              "openai/gpt-6.1-sol-pro",
              "qwen/qwen3.8-max-prime",
              "z-ai/glm-5.3-prime"
            ],
            "description": "Version 1 files: a single backup model. Still accepted; prefer fallback_models."
          },
          "use_when": {
            "type": "string",
            "maxLength": 200,
            "description": "What this lens is good for. Optional."
          },
          "persona": {
            "type": "string",
            "minLength": 1,
            "maxLength": 3000,
            "description": "Who this lens is and what it makes sure the schema captures (the system prompt)."
          }
        },
        "additionalProperties": true
      }
    }
  },
  "additionalProperties": true
}
