クラウド リソースのスポンサーシップを提供してくれた laf のおかげで、友人がテストに piao を使用できるようになりました。
LAFチーム、Bai Ye、Michelangelo @sealos.ioの熱心な説教に感謝します、人生は短い、あなたにはLAFが必要です:)
laf 開発に参加することを歓迎します。
たまたまlafがイベントやってるから一緒にやりましょう、みんなMidjourneyにアクセスできます
目的
Midjourney は正式に API インターフェースを提供していないため、一部の大手企業が discord の間接操作を通じて Midjourney を使用する Nodejs パッケージをパッケージ化しています。この 3 部構成のライブラリを独自のプログラムに統合することで、Midjourney の使用を完了します。これがコアです。コードレベル。また、midjourney にアクセスする方法がないことは誰もが理解しているので、https://laf.dev のシンガポール ノード Serverless 経由でプログラムを実行し、laf にデプロイされたプログラムにアクセスして Midjourney サービスに接続します。
laf アカウントを登録する
Laf は、Huanjie Cloud によって開発されたサーバーレス フレームワークで、開発者が AI 機能を備えた分散アプリケーションを迅速に構築するのに役立ちます。Laf を使用すると、ブログを書くのと同じくらい簡単にコードを記述し、いつでもどこでもオンライン アプリケーションをすばやく公開できます。
現在、Laf は開発者がテストして使用できる無料のリソースを提供しており、無料のリソースを使用してプログラムを直接実行できます。
laf サービスは杭州とシンガポールを区別し、異なるドメイン名から異なる地域のアカウントにアクセスして登録します。
シンガポール:シンガポールの住所(今日の旅の途中でシンガポールのサービスを使用します)
杭州:杭州の住所
携帯電話番号SMS登録の手順は非常に簡単なので、ここでは説明しません。
書き込み関数
まずクラウド開発パネルに関数を追加し、好きな関数名を選択します。ここでは「midjourney」と名前を付けます。
関数コードを追加する
import cloud from '@lafjs/cloud'
import { Midjourney, MidjourneyMessage } from 'midjourney'
const SERVER_ID = '' // Midjourney 服务 ID
const CHANNEL_ID = '' // Midjourney 频道 ID
const SALAI_TOKEN = '' // Midjourney 服务 Token
const Limit = 100
const MaxWait = 3
const client = new Midjourney({
ServerId: SERVER_ID,
ChannelId: CHANNEL_ID,
SalaiToken: SALAI_TOKEN,
Debug: true,
SessionId: SALAI_TOKEN,
Limit: Limit,
MaxWait: MaxWait
});
export default async function (ctx: FunctionContext) {
const { type, param } = ctx.body
switch (type) {
case 'RetrieveMessages':
return await RetrieveMessages(param)
case 'imagine':
return await imagine(param)
case 'upscale':
return await upscale(param)
case 'variation':
return await variation(param)
}
}
// 查询最近消息
async function RetrieveMessages(param) {
console.log("RetrieveMessages")
const client = new MidjourneyMessage({
ChannelId: CHANNEL_ID,
SalaiToken: SALAI_TOKEN,
});
const msg = await client.RetrieveMessages();
console.log("RetrieveMessages success ", msg)
return msg
}
// 创建生图任务
async function imagine(param) {
console.log("imagine", param)
const { question, msg_Id } = param
const msg = await client.Imagine(
`[${msg_Id}] ${question}`,
(uri: string, progress: string) => {
console.log("loading", uri, "progress", progress);
}
);
console.log("imagine success ", msg)
return true
}
// upscale 放大图片
async function upscale(param) {
console.log("upscale", param)
const { question, index, id, url } = param
const hash = url.split("_").pop()?.split(".")[0] ?? ""
console.log(hash)
const msg = await client.Upscale(
question,
index,
id,
hash,
(uri: string, progress: string) => {
console.log("loading", uri, "progress", progress);
}
);
console.log("upscale success ", msg)
return msg
}
// variation 变换图片
async function variation(param) {
console.log("variation", param)
const client = new Midjourney({
ServerId: SERVER_ID,
ChannelId: CHANNEL_ID,
SalaiToken: SALAI_TOKEN,
Debug: true,
SessionId: SALAI_TOKEN,
Limit: Limit,
MaxWait: 100
});
const { question, index, id, url } = param
const hash = url.split("_").pop()?.split(".")[0] ?? ""
const msg = await client.Variation(
question,
index,
id,
hash,
(uri: string, progress: string) => {
console.log("loading", uri, "progress", progress);
}
);
console.log("variation success ", msg)
return msg
}
関連する関数に必要な依存関係を追加します。
途中のクライアントを初期化するための主要な構成情報を入力します。
const SERVER_ID = '' // ミッドジャーニーサービス ID
const CHANNEL_ID = '' // ミッドジャーニーのチャンネル ID
const SALAI_TOKEN = '' // ミッドジャーニートークン
これら 3 つの構成情報は、piao @米chelang基杨杨@sealos.io によって提供されるフルレベルのアカウントでテストするために使用できます。これは、以前のアクティビティの投稿を注意深く読むことで取得できます。
自分のアカウントをお持ちの場合は、discord にログインしてチャンネルにメッセージを送信すると、F12 キーでリクエスト内にメッセージが表示されます。
上記の手順を完了したら、laf クラウド開発ノードで「公開」をクリックして、ミッドジャーニー API インターフェース呼び出しをテストします。
インターフェイスのデバッグ:
まず、リリースの左側にあるリンクをクリックしてコピーします。これは私たちが作成した Midjourney サービス API リンクです。
ここでは postman を使用して API インターフェイスをデバッグします。
画像を生成するための最初の呼び出し
履歴タスクのクエリ:
履歴タスクから送信されたグラフ化タスクと結果を取得します。
クエリ インターフェイスは一度に複数のデータを返します。返されたデータはこのチャネルのデータです。現在、このテスト構成情報は複数の人によって共有されているため、他の人が生成した画像タスクを見つけることができます。
結果をクエリした後、必ず次のフィールドを抽出してください: id、content、および URL。これらのフィールドは、後でズームインおよび再描画するために使用されます。
結果として得られる画像効果を見てみましょう。
画像生成タスクでは 4 つのプレビュー画像が返されるので、好みの画像を選択し、ズームインして高解像度の大きな画像を取得します。
ここで 2 番目の写真を拡大してみます。
拡大された画像効果を見てください。
非常に高解像度で、非常に質感が高い。旅の途中でレバーが落ちる。
理由は誰もが理解しているため、友人は写真の結果を生成する URL リンクにアクセスできない状況に遭遇する可能性があります。
ここでも、引き続き laf が提供するクラウド ストレージ機能を使用して画像をダンプできます。サンプル コードは次のとおりです。
import cloud from '@lafjs/cloud'
import axios from 'axios'
import { S3 } from "@aws-sdk/client-s3";
const s3Client = new S3({
endpoint: process.env.OSS_EXTERNAL_ENDPOINT,
region: process.env.OSS_REGION,
credentials: {
accessKeyId: process.env.OSS_ACCESS_KEY,
secretAccessKey: process.env.OSS_ACCESS_SECRET
},
forcePathStyle: true,
})
export default async function (ctx: FunctionContext) {
console.log('storage image')
const { url } = ctx.body
if (!url) {
return { err: "url is empty" }
}
let key = ''
if (url.indexOf('https://cdn.discordapp.com/') == 0) {
key = url.replace('https://cdn.discordapp.com/', '')
}
if (url.indexOf('https://media.discordapp.net/') == 0) {
key = url.replace('https://media.discordapp.net/', '')
}
await uploadImgToMinio(url, key);
return { data: 'https://<你的云存储bucket>.site.laf.dev/' + key }
}
async function uploadImgToMinio(imgurl, key) {
const { data } = await axios.get(imgurl, { responseType: 'arraybuffer' });
const buffer = Buffer.from(data, 'binary');
await s3Client.putObject({
Bucket: <你的云存储bucket>,
Key: key,
Body: buffer,
ContentType: 'application/octet-stream'
});
}
ここでは、元の画像のパスは完全に一致しており、laf クラウド ストレージに保存されており、正常に保存された後は、laf クラウド ストレージのバケット リンク アドレスを介して画像にアクセスできます。
他にもさまざまな遊び方がありますので、ここでやめておきます。
以下は laf で作ったサンプルです。ページの美しさは気にせず、主にインターフェイスの実験に使用します。
例:ポータル