项目简介
输入提示并使用 https://replicate.com/fofr/sticker-maker 生成贴纸。
主页以 呈现。
lib/sticker_web/home_live.ex
提交提示表单时,将调用此handle_event:
def handle_event("save", %{"prompt" => prompt}, socket) do
user_id = socket.assigns.local_user_id
{:ok, prediction} =
Predictions.create_prediction(%{
prompt: prompt,
local_user_id: user_id
})
send(self(), {:kick_off, prediction})
{:noreply,
socket
|> assign(form: to_form(%{"prompt" => ""}))
|> stream_insert(:my_predictions, prediction, at: 0)}
end
这会向 LiveView 发送一条
:kick_off
消息(因此没有延迟),该消息调用
Predictions.moderate/3
:
lib/sticker/predictions.ex
@doc """
Moderates a prediction.
The logic in replicate_webhook_controller.ex handles
the webhook. Once the moderation is complete, the webhook controller automatically
called gen_image.
"""
def moderate(prompt, user_id, prediction_id) do
"fofr/prompt-classifier"
|> Replicate.Models.get!()
|> Replicate.Models.get_latest_version!()
|> Replicate.Predictions.create(
%{
prompt: "[PROMPT] #{prompt} [/PROMPT] [SAFETY_RANKING]",
max_new_tokens: 128,
temperature: 0.2,
top_p: 0.9,
top_k: 50,
stop_sequences: "[/SAFETY_RANKING]"
},
"#{Sticker.Utils.get_host()}/webhooks/replicate?user_id=#{user_id}&prediction_id=#{prediction_id}"
)
end
我们将一个 webhook 传递给 Replicate。webhook 的所有逻辑都存在于 lib/sticker_web/controllers/replicate_webhook_controller.ex 中。这个 Webhook 的好处是我们可以刷新页面或断开连接,而 Replicate 仍然为我们处理预测队列。一旦预测准备好,我们将其上传到 Tigris(Replicate 不会为我们保存我们的数据),然后贴纸会广播回我们的 home_live.ex .
重要的是,由于我们传递了 Replicate 一个 Webhook,因此对于本地开发,需要运行 ngrok 以将 localhost 隧道连接到 URL。安装 ngrok 后,运行 ngrok http 4000 它并将 URL 粘贴到复制 .env 的文件中。
开发
要启动 Phoenix 服务器,请执行以下操作:
-
运行 mix setup 以安装和设置依赖项
-
创建一个 env 文件 cp .env.copy .env
-
使用 mix phx.server IEx 或在 IEx iex -S mix phx.server 内部启动 Phoenix 端点
-
将 .env 文件REPLICATE_API_TOKEN设置为复制令牌
现在,您可以从浏览器访问 localhost:4000 。