Skip to content

Commit

Permalink
Align with latest Bumblebee changes (#41)
Browse files Browse the repository at this point in the history
  • Loading branch information
jonatanklosko authored Feb 15, 2024
1 parent bc50e0a commit 5664773
Show file tree
Hide file tree
Showing 4 changed files with 39 additions and 146 deletions.
16 changes: 16 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,22 @@ All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).

## [Unreleased](https://github.com/livebook-dev/kino_bumblebee)

### Added

* Output streaming in the text generation task ([#32](https://github.com/livebook-dev/kino_bumblebee/pull/32))

### Changed

* Update Whisper model list
* Moved seed to the prediction form in Stable Diffusion ([#41](https://github.com/livebook-dev/kino_bumblebee/pull/41))
* Bumped `bumblebee` and `kino` dependency requirements

### Removed

* Removed the conversational task ([#41](https://github.com/livebook-dev/kino_bumblebee/pull/41))

## [v0.4.0](https://github.com/livebook-dev/kino_bumblebee/tree/v0.4.0) (2023-10-06)

### Added
Expand Down
140 changes: 7 additions & 133 deletions lib/kino_bumblebee/task_cell.ex
Original file line number Diff line number Diff line change
Expand Up @@ -95,77 +95,6 @@ defmodule KinoBumblebee.TaskCell do
%{
label: "Text",
tasks: [
%{
id: "conversation",
label: "Conversation",
variants: [
%{
id: "blenderbot_400m",
label: "Blenderbot (400M parameters)",
docs_logo: "huggingface_logo.svg",
docs_url: "https://huggingface.co/facebook/blenderbot-400M-distill",
generation: %{
model_repo_id: "facebook/blenderbot-400M-distill",
tokenizer_repo_id: "facebook/blenderbot-400M-distill"
}
},
%{
id: "blenderbot_1b",
label: "Blenderbot (1B parameters)",
docs_logo: "huggingface_logo.svg",
docs_url: "https://huggingface.co/facebook/blenderbot-1B-distill",
generation: %{
model_repo_id: "facebook/blenderbot-1B-distill",
tokenizer_repo_id: "facebook/blenderbot-1B-distill"
}
},
%{
id: "blenderbot_3b",
label: "Blenderbot (3B parameters)",
docs_logo: "huggingface_logo.svg",
docs_url: "https://huggingface.co/facebook/blenderbot-3B",
generation: %{
model_repo_id: "facebook/blenderbot-3B",
tokenizer_repo_id: "facebook/blenderbot-3B"
}
},
%{
id: "dialogpt_small",
label: "DialoGPT (small)",
docs_logo: "huggingface_logo.svg",
docs_url: "https://huggingface.co/microsoft/DialoGPT-small",
generation: %{
model_repo_id: "microsoft/DialoGPT-small",
tokenizer_repo_id: "gpt2"
}
},
%{
id: "dialogpt_medium",
label: "DialoGPT (medium)",
docs_logo: "huggingface_logo.svg",
docs_url: "https://huggingface.co/microsoft/DialoGPT-medium",
generation: %{
model_repo_id: "microsoft/DialoGPT-medium",
tokenizer_repo_id: "gpt2"
}
},
%{
id: "dialogpt_large",
label: "DialoGPT (large)",
docs_logo: "huggingface_logo.svg",
docs_url: "https://huggingface.co/microsoft/DialoGPT-large",
generation: %{
model_repo_id: "microsoft/DialoGPT-large",
tokenizer_repo_id: "gpt2"
}
}
],
params: [
%{field: "sequence_length", label: "Max input tokens", type: :number, default: 100},
%{field: "min_new_tokens", label: "Min new tokens", type: :number, default: nil},
%{field: "max_new_tokens", label: "Max new tokens", type: :number, default: 100}
]
},
%{
id: "fill_mask",
label: "Fill-mask",
Expand Down Expand Up @@ -760,8 +689,7 @@ defmodule KinoBumblebee.TaskCell do
label: "Number of images",
type: :number,
default: 2
},
%{field: "seed", label: "Seed", type: :number, default: nil}
}
],
note:
"this is a very involved task, the generation can take a long time if you run it on a CPU. To achieve a better quality increase the number of steps, 40 is usually a better default."
Expand Down Expand Up @@ -1361,55 +1289,6 @@ defmodule KinoBumblebee.TaskCell do
]
end

defp to_quoted(%{"task_id" => "conversation"} = attrs) do
opts =
[compile: [batch_size: 1, sequence_length: attrs["sequence_length"]]] ++
maybe_defn_options(attrs)

generation_otps =
drop_nil_options(
min_new_tokens: attrs["min_new_tokens"],
max_new_tokens: attrs["max_new_tokens"]
)

%{generation: generation} = variant_from_attrs(attrs)

[
quote do
{:ok, model_info} = Bumblebee.load_model({:hf, unquote(generation.model_repo_id)})

{:ok, tokenizer} = Bumblebee.load_tokenizer({:hf, unquote(generation.tokenizer_repo_id)})

{:ok, generation_config} =
Bumblebee.load_generation_config({:hf, unquote(generation.model_repo_id)})

unquote_splicing(maybe_configure_generation(generation_otps))

serving =
Bumblebee.Text.conversation(model_info, tokenizer, generation_config, unquote(opts))
end,
quote do
frame = Kino.Frame.new()

inputs = [message: Kino.Input.text("Message")]
form = Kino.Control.form(inputs, submit: "Send message", reset_on_submit: [:message])

Kino.listen(form, nil, fn %{data: %{message: message}}, history ->
Kino.Frame.append(frame, Kino.Markdown.new("**Me:** #{message}"))

%{text: text, history: history} =
Nx.Serving.run(serving, %{text: message, history: history})

Kino.Frame.append(frame, Kino.Markdown.new("**Bot:** #{text}"))

{:cont, history}
end)

Kino.Layout.grid([frame, form], boxed: true, gap: 16)
end
]
end

defp to_quoted(
%{"task_id" => "text_to_image", "variant_id" => "stable_diffusion_" <> _} = attrs
) do
Expand All @@ -1434,16 +1313,10 @@ defmodule KinoBumblebee.TaskCell do

{:ok, clip} = Bumblebee.load_model({:hf, repository_id, subdir: "text_encoder"})

{:ok, unet} =
Bumblebee.load_model({:hf, repository_id, subdir: "unet"},
params_filename: "diffusion_pytorch_model.bin"
)
{:ok, unet} = Bumblebee.load_model({:hf, repository_id, subdir: "unet"})

{:ok, vae} =
Bumblebee.load_model({:hf, repository_id, subdir: "vae"},
architecture: :decoder,
params_filename: "diffusion_pytorch_model.bin"
)
Bumblebee.load_model({:hf, repository_id, subdir: "vae"}, architecture: :decoder)

{:ok, scheduler} = Bumblebee.load_scheduler({:hf, repository_id, subdir: "scheduler"})

Expand All @@ -1465,13 +1338,14 @@ defmodule KinoBumblebee.TaskCell do
end,
quote do
text_input = Kino.Input.textarea("Text", default: unquote(generation.default_text))
form = Kino.Control.form([text: text_input], submit: "Run")
seed_input = Kino.Input.number("Seed")
form = Kino.Control.form([text: text_input, seed: seed_input], submit: "Run")
frame = Kino.Frame.new()

Kino.listen(form, fn %{data: %{text: text}} ->
Kino.listen(form, fn %{data: %{text: text, seed: seed}} ->
Kino.Frame.render(frame, Kino.Text.new("Running..."))

output = Nx.Serving.run(serving, text)
output = Nx.Serving.run(serving, %{prompt: text, seed: seed})

for result <- output.results do
Kino.Image.new(result.image)
Expand Down
9 changes: 6 additions & 3 deletions mix.exs
Original file line number Diff line number Diff line change
Expand Up @@ -26,11 +26,14 @@ defmodule KinoBumblebee.MixProject do

defp deps do
[
{:bumblebee, "~> 0.4.0"},
# {:bumblebee, "~> 0.5.0"},
{:bumblebee, github: "elixir-nx/bumblebee"},
# {:kino, "~> 0.13"},
{:kino, github: "livebook-dev/kino", override: true},
{:nx, "~> 0.5"},
{:exla, "~> 0.5", only: [:dev, :test]},
# {:nx, "~> 0.5"},
# {:exla, "~> 0.5", only: [:dev, :test]},
{:nx, github: "elixir-nx/nx", sparse: "nx", override: true},
{:exla, github: "elixir-nx/nx", sparse: "exla", override: true, only: [:dev, :test]},
{:ex_doc, "~> 0.29", only: :dev, runtime: false}
]
end
Expand Down
20 changes: 10 additions & 10 deletions mix.lock
Original file line number Diff line number Diff line change
@@ -1,31 +1,31 @@
%{
"axon": {:hex, :axon, "0.6.0", "fd7560079581e4cedebaf0cd5f741d6ac3516d06f204ebaf1283b1093bf66ff6", [:mix], [{:kino, "~> 0.7", [hex: :kino, repo: "hexpm", optional: true]}, {:kino_vega_lite, "~> 0.1.7", [hex: :kino_vega_lite, repo: "hexpm", optional: true]}, {:nx, "~> 0.6.0", [hex: :nx, repo: "hexpm", optional: false]}, {:polaris, "~> 0.1", [hex: :polaris, repo: "hexpm", optional: false]}, {:table_rex, "~> 3.1.1", [hex: :table_rex, repo: "hexpm", optional: true]}], "hexpm", "204e7aeb50d231a30b25456adf17bfbaae33fe7c085e03793357ac3bf62fd853"},
"bumblebee": {:hex, :bumblebee, "0.4.0", "a50be80b46f1e9c12af224fc14ee15575f9137b36751854fe79dfa4838d67251", [:mix], [{:axon, "~> 0.6.0", [hex: :axon, repo: "hexpm", optional: false]}, {:castore, "~> 0.1 or ~> 1.0", [hex: :castore, repo: "hexpm", optional: false]}, {:jason, "~> 1.4.0", [hex: :jason, repo: "hexpm", optional: false]}, {:nx, "~> 0.6.1", [hex: :nx, repo: "hexpm", optional: false]}, {:nx_image, "~> 0.1.0", [hex: :nx_image, repo: "hexpm", optional: false]}, {:nx_signal, "~> 0.2.0", [hex: :nx_signal, repo: "hexpm", optional: false]}, {:progress_bar, "~> 3.0", [hex: :progress_bar, repo: "hexpm", optional: false]}, {:safetensors, "~> 0.1.1", [hex: :safetensors, repo: "hexpm", optional: false]}, {:tokenizers, "~> 0.4", [hex: :tokenizers, repo: "hexpm", optional: false]}, {:unpickler, "~> 0.1.0", [hex: :unpickler, repo: "hexpm", optional: false]}, {:unzip, "0.8.0", [hex: :unzip, repo: "hexpm", optional: false]}], "hexpm", "a215ff1016ca189f18888a48c318d3f2eb00130646d3005ea113d87944a94f61"},
"castore": {:hex, :castore, "0.1.22", "4127549e411bedd012ca3a308dede574f43819fe9394254ca55ab4895abfa1a2", [:mix], [], "hexpm", "c17576df47eb5aa1ee40cc4134316a99f5cad3e215d5c77b8dd3cfef12a22cac"},
"axon": {:git, "https://github.com/elixir-nx/axon.git", "7a2e9bcbf63583400e6b69d9ecf99365d5e9ce0f", []},
"bumblebee": {:git, "https://github.com/elixir-nx/bumblebee.git", "ae3deac0b6032f6b57d5d28c8f9f29a66e7b0923", []},
"castore": {:hex, :castore, "1.0.5", "9eeebb394cc9a0f3ae56b813459f990abb0a3dedee1be6b27fdb50301930502f", [:mix], [], "hexpm", "8d7c597c3e4a64c395980882d4bca3cebb8d74197c590dc272cfd3b6a6310578"},
"complex": {:hex, :complex, "0.5.0", "af2d2331ff6170b61bb738695e481b27a66780e18763e066ee2cd863d0b1dd92", [:mix], [], "hexpm", "2683bd3c184466cfb94fad74cbfddfaa94b860e27ad4ca1bffe3bff169d91ef1"},
"decimal": {:hex, :decimal, "2.1.1", "5611dca5d4b2c3dd497dec8f68751f1f1a54755e8ed2a966c2633cf885973ad6", [:mix], [], "hexpm", "53cfe5f497ed0e7771ae1a475575603d77425099ba5faef9394932b35020ffcc"},
"earmark_parser": {:hex, :earmark_parser, "1.4.29", "149d50dcb3a93d9f3d6f3ecf18c918fb5a2d3c001b5d3305c926cddfbd33355b", [:mix], [], "hexpm", "4902af1b3eb139016aed210888748db8070b8125c2342ce3dcae4f38dcc63503"},
"elixir_make": {:hex, :elixir_make, "0.7.5", "784cc00f5fa24239067cc04d449437dcc5f59353c44eb08f188b2b146568738a", [:mix], [{:castore, "~> 0.1", [hex: :castore, repo: "hexpm", optional: true]}], "hexpm", "c3d63e8d5c92fa3880d89ecd41de59473fa2e83eeb68148155e25e8b95aa2887"},
"elixir_make": {:hex, :elixir_make, "0.7.8", "505026f266552ee5aabca0b9f9c229cbb496c689537c9f922f3eb5431157efc7", [:mix], [{:castore, "~> 0.1 or ~> 1.0", [hex: :castore, repo: "hexpm", optional: true]}, {:certifi, "~> 2.0", [hex: :certifi, repo: "hexpm", optional: true]}], "hexpm", "7a71945b913d37ea89b06966e1342c85cfe549b15e6d6d081e8081c493062c07"},
"ex_doc": {:hex, :ex_doc, "0.29.1", "b1c652fa5f92ee9cf15c75271168027f92039b3877094290a75abcaac82a9f77", [:mix], [{:earmark_parser, "~> 1.4.19", [hex: :earmark_parser, repo: "hexpm", optional: false]}, {:makeup_elixir, "~> 0.14", [hex: :makeup_elixir, repo: "hexpm", optional: false]}, {:makeup_erlang, "~> 0.1", [hex: :makeup_erlang, repo: "hexpm", optional: false]}], "hexpm", "b7745fa6374a36daf484e2a2012274950e084815b936b1319aeebcf7809574f6"},
"exla": {:hex, :exla, "0.6.0", "af63e45ce41ad25630967923147d14292a0cc48e507b8a3cf3bf3d5483099a28", [:make, :mix], [{:elixir_make, "~> 0.6", [hex: :elixir_make, repo: "hexpm", optional: false]}, {:nx, "~> 0.6.0", [hex: :nx, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4.0 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}, {:xla, "~> 0.5.0", [hex: :xla, repo: "hexpm", optional: false]}], "hexpm", "5f6a4a105ea9ab207b9aa4de5a294730e2bfe9639f4b8d37a7c00da131090d7a"},
"exla": {:git, "https://github.com/elixir-nx/nx.git", "caa379194233544f216f92b4c1551485d769d3a9", [sparse: "exla"]},
"fss": {:hex, :fss, "0.1.1", "9db2344dbbb5d555ce442ac7c2f82dd975b605b50d169314a20f08ed21e08642", [:mix], [], "hexpm", "78ad5955c7919c3764065b21144913df7515d52e228c09427a004afe9c1a16b0"},
"jason": {:hex, :jason, "1.4.1", "af1504e35f629ddcdd6addb3513c3853991f694921b1b9368b0bd32beb9f1b63", [:mix], [{:decimal, "~> 1.0 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: true]}], "hexpm", "fbb01ecdfd565b56261302f7e1fcc27c4fb8f32d56eab74db621fc154604a7a1"},
"kino": {:git, "https://github.com/livebook-dev/kino.git", "c33953cdcd25227736b7b840324d540e09d1ccc5", []},
"makeup": {:hex, :makeup, "1.1.0", "6b67c8bc2882a6b6a445859952a602afc1a41c2e08379ca057c0f525366fc3ca", [:mix], [{:nimble_parsec, "~> 1.2.2 or ~> 1.3", [hex: :nimble_parsec, repo: "hexpm", optional: false]}], "hexpm", "0a45ed501f4a8897f580eabf99a2e5234ea3e75a4373c8a52824f6e873be57a6"},
"makeup_elixir": {:hex, :makeup_elixir, "0.16.0", "f8c570a0d33f8039513fbccaf7108c5d750f47d8defd44088371191b76492b0b", [:mix], [{:makeup, "~> 1.0", [hex: :makeup, repo: "hexpm", optional: false]}, {:nimble_parsec, "~> 1.2.3", [hex: :nimble_parsec, repo: "hexpm", optional: false]}], "hexpm", "28b2cbdc13960a46ae9a8858c4bebdec3c9a6d7b4b9e7f4ed1502f8159f338e7"},
"makeup_erlang": {:hex, :makeup_erlang, "0.1.1", "3fcb7f09eb9d98dc4d208f49cc955a34218fc41ff6b84df7c75b3e6e533cc65f", [:mix], [{:makeup, "~> 1.0", [hex: :makeup, repo: "hexpm", optional: false]}], "hexpm", "174d0809e98a4ef0b3309256cbf97101c6ec01c4ab0b23e926a9e17df2077cbb"},
"nimble_parsec": {:hex, :nimble_parsec, "1.2.3", "244836e6e3f1200c7f30cb56733fd808744eca61fd182f731eac4af635cc6d0b", [:mix], [], "hexpm", "c8d789e39b9131acf7b99291e93dae60ab48ef14a7ee9d58c6964f59efb570b0"},
"nx": {:hex, :nx, "0.6.4", "948d9f42f81e63fc901d243ac0a985c8bb87358be62e27826cfd67f58bc640af", [:mix], [{:complex, "~> 0.5", [hex: :complex, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4.0 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "bb9c2e2e3545b5eb4739d69046a988daaa212d127dba7d97801c291616aff6d6"},
"nx": {:git, "https://github.com/elixir-nx/nx.git", "caa379194233544f216f92b4c1551485d769d3a9", [sparse: "nx"]},
"nx_image": {:hex, :nx_image, "0.1.1", "69cf0d2fd873d12b028583aa49b5e0a25f6aca307afc337a5d871851a20fba1d", [:mix], [{:nx, "~> 0.4", [hex: :nx, repo: "hexpm", optional: false]}], "hexpm", "55c8206a822237f6027168f11214e3887263c5b8a1f8e0634eea82c96e5093e3"},
"nx_signal": {:hex, :nx_signal, "0.2.0", "e1ca0318877b17c81ce8906329f5125f1e2361e4c4235a5baac8a95ee88ea98e", [:mix], [{:nx, "~> 0.6", [hex: :nx, repo: "hexpm", optional: false]}], "hexpm", "7247e5e18a177a59c4cb5355952900c62fdeadeb2bad02a9a34237b68744e2bb"},
"polaris": {:hex, :polaris, "0.1.0", "dca61b18e3e801ecdae6ac9f0eca5f19792b44a5cb4b8d63db50fc40fc038d22", [:mix], [{:nx, "~> 0.5", [hex: :nx, repo: "hexpm", optional: false]}], "hexpm", "13ef2b166650e533cb24b10e2f3b8ab4f2f449ba4d63156e8c569527f206e2c2"},
"progress_bar": {:hex, :progress_bar, "3.0.0", "f54ff038c2ac540cfbb4c2bfe97c75e7116ead044f3c2b10c9f212452194b5cd", [:mix], [{:decimal, "~> 2.0", [hex: :decimal, repo: "hexpm", optional: false]}], "hexpm", "6981c2b25ab24aecc91a2dc46623658e1399c21a2ae24db986b90d678530f2b7"},
"rustler_precompiled": {:hex, :rustler_precompiled, "0.6.3", "f838d94bc35e1844973ee7266127b156fdc962e9e8b7ff666c8fb4fed7964d23", [:mix], [{:castore, "~> 0.1 or ~> 1.0", [hex: :castore, repo: "hexpm", optional: false]}, {:rustler, "~> 0.23", [hex: :rustler, repo: "hexpm", optional: true]}], "hexpm", "e18ecca3669a7454b3a2be75ae6c3ef01d550bc9a8cf5fbddcfff843b881d7c6"},
"safetensors": {:hex, :safetensors, "0.1.1", "b5859a010fb56249ecfba4799d316e96b89152576af2db7657786c55dcf2f5b6", [:mix], [{:jason, "~> 1.4", [hex: :jason, repo: "hexpm", optional: false]}, {:nx, "~> 0.5", [hex: :nx, repo: "hexpm", optional: false]}], "hexpm", "dfbb525bf3debb2e2d90f840728af70da5d55f6caa091cac4d0891a4eb4c52d5"},
"rustler_precompiled": {:hex, :rustler_precompiled, "0.7.1", "ecadf02cc59a0eccbaed6c1937303a5827fbcf60010c541595e6d3747d3d0f9f", [:mix], [{:castore, "~> 0.1 or ~> 1.0", [hex: :castore, repo: "hexpm", optional: false]}, {:rustler, "~> 0.23", [hex: :rustler, repo: "hexpm", optional: true]}], "hexpm", "b9e4657b99a1483ea31502e1d58c464bedebe9028808eda45c3a429af4550c66"},
"safetensors": {:hex, :safetensors, "0.1.2", "849434fea20b2ed14b92e74205a925d86039c4ef53efe861e5c7b574c3ba8fa6", [:mix], [{:jason, "~> 1.4", [hex: :jason, repo: "hexpm", optional: false]}, {:nx, "~> 0.5", [hex: :nx, repo: "hexpm", optional: false]}], "hexpm", "298a5c82e34fc3b955464b89c080aa9a2625a47d69148d51113771e19166d4e0"},
"table": {:hex, :table, "0.1.2", "87ad1125f5b70c5dea0307aa633194083eb5182ec537efc94e96af08937e14a8", [:mix], [], "hexpm", "7e99bc7efef806315c7e65640724bf165c3061cdc5d854060f74468367065029"},
"telemetry": {:hex, :telemetry, "1.2.1", "68fdfe8d8f05a8428483a97d7aab2f268aaff24b49e0f599faa091f1d4e7f61c", [:rebar3], [], "hexpm", "dad9ce9d8effc621708f99eac538ef1cbe05d6a874dd741de2e689c47feafed5"},
"tokenizers": {:hex, :tokenizers, "0.4.0", "140283ca74a971391ddbd83cd8cbdb9bd03736f37a1b6989b82d245a95e1eb97", [:mix], [{:castore, "~> 0.1 or ~> 1.0", [hex: :castore, repo: "hexpm", optional: false]}, {:rustler, ">= 0.0.0", [hex: :rustler, repo: "hexpm", optional: true]}, {:rustler_precompiled, "~> 0.6", [hex: :rustler_precompiled, repo: "hexpm", optional: false]}], "hexpm", "ef1a9824f5a893cd3b831c0e5b3d72caa250d2ec462035cc6afef6933b13a82e"},
"unpickler": {:hex, :unpickler, "0.1.0", "c2262c0819e6985b761e7107546cef96a485f401816be5304a65fdd200d5bd6a", [:mix], [], "hexpm", "e2b3f61e62406187ac52afead8a63bfb4e49394028993f3c4c42712743cab79e"},
"unzip": {:hex, :unzip, "0.8.0", "ee21d87c21b01567317387dab4228ac570ca15b41cfc221a067354cbf8e68c4d", [:mix], [], "hexpm", "ffa67a483efcedcb5876971a50947222e104d5f8fea2c4a0441e6f7967854827"},
"xla": {:hex, :xla, "0.5.0", "fb8a02c02e5a4f4531fbf18a90c325e471037f983f0115d23f510e7dd9a6aa65", [:make, :mix], [{:elixir_make, "~> 0.4", [hex: :elixir_make, repo: "hexpm", optional: false]}], "hexpm", "571ac797a4244b8ba8552ed0295a54397bd896708be51e4da6cbb784f6678061"},
"unzip": {:hex, :unzip, "0.10.0", "374e0059e48e982076f3fd22cd4817ab11016c1bae3f09421511901ddda95c5c", [:mix], [], "hexpm", "101c06b0fa97a858a83beb618f4bc20370624f73ab3954f756d9b52194056de6"},
"xla": {:hex, :xla, "0.6.0", "67bb7695efa4a23b06211dc212de6a72af1ad5a9e17325e05e0a87e4c241feb8", [:make, :mix], [{:elixir_make, "~> 0.4", [hex: :elixir_make, repo: "hexpm", optional: false]}], "hexpm", "dd074daf942312c6da87c7ed61b62fb1a075bced157f1cc4d47af2d7c9f44fb7"},
}

0 comments on commit 5664773

Please sign in to comment.