Skip to main content

mix.exs

defmodule CouncilEx.MixProject do
  use Mix.Project

  @version "0.1.0"
  @source_url "https://github.com/brewingelixir/council_ex"

  def project do
    [
      app: :council_ex,
      version: @version,
      elixir: "~> 1.16",
      elixirc_paths: elixirc_paths(Mix.env()),
      start_permanent: Mix.env() == :prod,
      deps: deps(),
      description: description(),
      package: package(),
      docs: docs(),
      dialyzer: dialyzer(),
      source_url: @source_url,
      homepage_url: @source_url,
      name: "CouncilEx"
    ]
  end

  defp dialyzer do
    [
      # `mix council.diagram` is a Mix task; teach the PLT about :mix so
      # dialyzer can find Mix.Task.run/1 and Mix.raise/1.
      plt_add_apps: [:mix],
      # Pin PLT location so CI can cache it across runs (see
      # .github/workflows/ci.yml).
      plt_core_path: "priv/plts",
      plt_local_path: "priv/plts"
    ]
  end

  def application do
    [
      extra_applications: [:logger],
      mod: {CouncilEx.Application, []}
    ]
  end

  defp elixirc_paths(:test), do: ["lib", "test/support"]
  defp elixirc_paths(_), do: ["lib"]

  defp description do
    "Multi-model LLM council workflows. Run LLMs in parallel rounds, aggregate/judge outputs, stream tokens, call tools (parallel exec), observe via telemetry + PubSub. Stock OpenAI/Anthropic/Gemini/Ollama adapters; pluggable Provider.Adapter."
  end

  defp deps do
    [
      {:nimble_options, "~> 1.1"},
      {:telemetry, "~> 1.2"},
      {:jason, "~> 1.4"},
      {:req, "~> 0.5"},
      {:ecto, "~> 3.13"},
      # Optional deps — only required when consumer opts into the
      # corresponding feature backend. Not loaded otherwise.
      {:phoenix_pubsub, "~> 2.1", optional: true},
      {:redix, "~> 1.5", optional: true},
      {:ecto_sql, "~> 3.13", optional: true},
      {:postgrex, "~> 0.20", optional: true},
      {:oban, "~> 2.19", optional: true},
      {:mimic, "~> 1.7", only: :test},
      {:bypass, "~> 2.1", only: :test},
      {:ex_doc, "~> 0.34", only: :dev, runtime: false},
      {:dialyxir, "~> 1.4", only: [:dev, :test], runtime: false},
      {:credo, "~> 1.7", only: [:dev, :test], runtime: false}
    ]
  end

  defp package do
    [
      maintainers: ["Humberto Aquino"],
      licenses: ["Apache-2.0"],
      links: %{
        "GitHub" => @source_url,
        "Changelog" => "#{@source_url}/blob/main/CHANGELOG.md"
      },
      files: ~w(
        lib
        mix.exs
        README.md
        CHANGELOG.md
        LICENSE
      )
    ]
  end

  defp docs do
    [
      main: "readme",
      source_ref: "v#{@version}",
      source_url: @source_url,
      skip_code_autolink_to: [
        "CouncilEx.Providers.Instructor.stream/3",
        "CouncilEx.Application",
        "CouncilEx.__before_compile__/1",
        "Ecto.Repo.query/2"
      ],
      extras: [
        "README.md",
        "CHANGELOG.md",
        "LICENSE",
        "docs/COUNCILS.md",
        "docs/COMPOSITION.md",
        "docs/COMPLEXITY.md",
        "docs/PROFILES.md",
        "docs/PROVIDERS.md",
        "docs/PROVIDER_MODELS.md",
        "docs/PER_MEMBER_CAPABILITIES.md",
        "docs/DYNAMIC_COUNCILS.md",
        "docs/AUTO_COUNCILS.md",
        "docs/PEER_REVIEW_PATTERNS.md",
        "docs/TUTORIAL_KARPATHY_COUNCIL.md",
        "docs/COUNCIL_MODE_PAPER.md",
        "docs/RELATED_WORK.md",
        "docs/RAG.md",
        "docs/DIAGRAMS.md",
        "docs/OBSERVABILITY.md",
        "docs/INTROSPECTION.md",
        "docs/PERSISTENCE.md",
        "docs/RUNNING_COUNCILS.md",
        "docs/RUNNING_IN_PHOENIX.md",
        "docs/RUNNING_WITH_OBAN.md",
        "docs/TESTING.md",
        "docs/UNIT_TESTING.md"
      ],
      groups_for_modules: [
        Core: [
          CouncilEx,
          CouncilEx.Member,
          CouncilEx.Profile,
          CouncilEx.Round,
          CouncilEx.Request,
          CouncilEx.Response,
          CouncilEx.StreamChunk,
          CouncilEx.Error,
          CouncilEx.Tool,
          CouncilEx.ToolCall,
          CouncilEx.ToolCallResult,
          CouncilEx.Router,
          CouncilEx.RunServer,
          CouncilEx.Supervisor
        ],
        "Dynamic Councils": [
          CouncilEx.DynamicCouncil,
          CouncilEx.DynamicMember,
          CouncilEx.DynamicRound,
          CouncilEx.MemberSpec,
          CouncilEx.Registry,
          CouncilEx.Registry.Backend,
          CouncilEx.Registry.ETS,
          CouncilEx.Registry.Ecto,
          CouncilEx.Registry.Redis
        ],
        AutoCouncil: [
          CouncilEx.AutoCouncil,
          CouncilEx.AutoCouncil.Resolver,
          CouncilEx.AutoCouncil.Strategy,
          CouncilEx.AutoCouncil.Providers,
          CouncilEx.AutoCouncil.Strategies.Rules,
          CouncilEx.AutoCouncil.Strategies.Cascade,
          CouncilEx.AutoCouncil.Strategies.Embedding,
          CouncilEx.AutoCouncil.Strategies.LLMClassify,
          CouncilEx.AutoCouncil.Strategies.LLMBuild
        ],
        Tools: [
          CouncilEx.Tools.InMemoryDocs
        ],
        "Prebaked Profiles": [
          CouncilEx.Profiles.OpenAIBalanced,
          CouncilEx.Profiles.OpenAIMini,
          CouncilEx.Profiles.OpenAICreative,
          CouncilEx.Profiles.OpenAIDeterministic,
          CouncilEx.Profiles.AnthropicBalanced,
          CouncilEx.Profiles.GeminiBalanced,
          CouncilEx.Profiles.OllamaLocal,
          CouncilEx.Profiles.OpenRouterAuto,
          CouncilEx.Profiles.OpenRouterClaudeSonnet
        ],
        "Built-in Rounds": [
          CouncilEx.Rounds.IndependentAnalysis,
          CouncilEx.Rounds.Critique,
          CouncilEx.Rounds.Vote,
          CouncilEx.Rounds.Synthesis,
          CouncilEx.Rounds.WeightedSynthesis,
          CouncilEx.Rounds.Iterate,
          CouncilEx.Rounds.Ranking,
          CouncilEx.Rounds.PairwiseElimination,
          CouncilEx.Rounds.PeerReview,
          CouncilEx.Rounds.AnonymizedPeerReview
        ],
        "Built-in Councils": [
          CouncilEx.Councils.ParallelPanel,
          CouncilEx.Councils.PeerReview,
          CouncilEx.Councils.Voting,
          CouncilEx.Councils.Specialist,
          CouncilEx.Councils.Consensus,
          CouncilEx.Councils.Tournament,
          CouncilEx.Councils.Chairman,
          CouncilEx.Councils.WeightedConsensus,
          CouncilEx.Councils.JuryWithRetry
        ],
        Aggregators: [
          CouncilEx.Aggregator,
          CouncilEx.Aggregators.Plurality,
          CouncilEx.Aggregators.Borda,
          CouncilEx.Aggregators.Condorcet,
          CouncilEx.Aggregators.WeightedMean,
          CouncilEx.Aggregators.Median,
          CouncilEx.Aggregators.PeerRanking
        ],
        Reliability: [
          CouncilEx.Reliability,
          CouncilEx.Reliability.Null,
          CouncilEx.Reliability.ETS,
          CouncilEx.Reliability.Ecto,
          CouncilEx.Reliability.Redis,
          CouncilEx.BiasDetector,
          CouncilEx.Confidence
        ],
        Persistence: [
          CouncilEx.Recorder,
          CouncilEx.Recorder.Ecto,
          CouncilEx.Persistence.Migration,
          CouncilEx.Persistence.Recovery,
          CouncilEx.Persistence.Schema.Run,
          CouncilEx.Persistence.Schema.RunEvent,
          CouncilEx.Workers.Oban
        ],
        "Output Schemas": [
          CouncilEx.Schemas.Critique,
          CouncilEx.Schemas.Vote,
          CouncilEx.Schemas.Ranking,
          CouncilEx.Schema.JSONSchema
        ],
        Providers: [
          CouncilEx.Provider,
          CouncilEx.Provider.Adapter,
          CouncilEx.Provider.Adapters.OpenAI,
          CouncilEx.Provider.Adapters.Anthropic,
          CouncilEx.Provider.Adapters.Gemini,
          CouncilEx.Provider.Adapters.Ollama,
          CouncilEx.Provider.Adapters.OpenRouter,
          CouncilEx.Providers.Instructor,
          CouncilEx.Providers.Mock
        ],
        Observability: [
          CouncilEx.PubSub,
          CouncilEx.PubSub.Adapter,
          CouncilEx.PubSub.PG,
          CouncilEx.PubSub.Phoenix,
          CouncilEx.Telemetry,
          CouncilEx.Events,
          CouncilEx.Verbose,
          CouncilEx.Diagram,
          CouncilEx.Anonymize
        ],
        Testing: [
          CouncilEx.Test
        ]
      ]
    ]
  end
end