Спасибо laf за спонсорство облачных ресурсов, друзья могут использовать piao для тестирования.
Спасибо команде laf, Bai Ye, Michelangelo @sealos.io за их восторженные проповеди, жизнь коротка, вам нужен laf :)
Вы можете присоединиться к laf development .
Так уж получилось, что Laf проводит мероприятие, давайте сделаем это вместе, каждый может получить доступ к Midjourney.
ЦельПоскольку
Midjourney официально не предоставляет интерфейс API, некоторые большие ребята упаковали пакет nodejs, который использует midjourney через непрямые операции discord.Мы завершаем использование midjourney, интегрируя эту трехстороннюю библиотеку в нашу собственную программу.Это основная вещь в уровень кода. Кроме того, все понимают, что доступа к midjourney нет, мы запускаем нашу программу через сингапурскую ноду Serverless https://laf.dev, а затем подключаемся к сервису midjourney, обращаясь к программе, развернутой в laf.
Зарегистрируйте учетную запись laf
Laf — это бессерверная платформа, разработанная Huanjie Cloud, которая может помочь разработчикам быстро создавать распределенные приложения с возможностями искусственного интеллекта. С Laf вы можете писать код так же легко, как вести блог, и быстро публиковать онлайн-приложения в любое время и в любом месте.
Теперь Laf предоставляет бесплатные ресурсы для тестирования и использования разработчиками Здесь мы можем запустить программу напрямую с помощью бесплатных ресурсов.
Служба laf проводит различие между Ханчжоу и Сингапуром, а также получает доступ и регистрирует учетные записи в разных регионах с разных доменных имен.
Сингапур: адрес в Сингапуре (сегодня мы будем использовать сингапурский сервис в пути)
Ханчжоу: Адрес в Ханчжоу
Процесс СМС-регистрации номера мобильного телефона слишком прост, поэтому я не буду о нем здесь говорить.
функция записи
Сначала добавьте функцию в панель облачной разработки и выберите имя функции, которое вам нравится.Я назову ее здесь: 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 = '' // Идентификатор промежуточной службы
const CHANNEL_ID = '' // Идентификатор промежуточного канала
const SALAI_TOKEN = ''// Токен промежуточного пути
Эти три информации о конфигурации можно использовать для тестирования с учетной записью полного уровня, предоставленной piao @米chelang基杨杨@sealos.io, и вы можете получить ее, внимательно прочитав предыдущие сообщения об активности.
Если у вас есть свой аккаунт, вы можете авторизоваться в дискорде и отправить сообщение в канале, а F12 найдет его в запросе.
После выполнения вышеуказанных шагов нажмите «Опубликовать» на узле разработки laf cloud, чтобы протестировать вызов API-интерфейса в середине пути.
Отладка интерфейса:
Сначала нажмите на ссылку в левой части выпуска, скопируйте. Это ссылка на API службы в середине пути, которую мы написали.
Я использую postman для отладки интерфейса API здесь:
Первый вызов для создания изображения
Запросить исторические задачи:
Получите графические задачи и результаты, которые мы отправили из исторических задач.
Интерфейс запроса возвращает несколько фрагментов данных за раз, а возвращаемые данные — это данные в этом канале.В настоящее время эта информация о конфигурации теста используется несколькими людьми, поэтому вы можете найти задачи изображения, созданные другими людьми.
После запроса результатов не забудьте извлечь следующие поля: id, content и url, которые позже будут использоваться для увеличения и перерисовки.
Давайте посмотрим на получившийся эффект изображения.
Задача создания изображения вернет четыре изображения для предварительного просмотра, которые вы можете выбрать, выберите понравившееся и затем увеличьте масштаб, чтобы получить большое изображение высокой четкости.
Здесь мы увеличиваем вторую картинку:
Взгляните на эффект увеличенного изображения:
Очень высокое разрешение, очень текстурированный. падение рычага в середине пути.
Друзья могут столкнуться с ситуацией, что 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, не заботьтесь о красоте страницы, он в основном используется для экспериментов с интерфейсом.
Пример: портал