Не нужно магии, научим вас использовать Midjourney по желанию [приложенный исходный код] [пример]

Спасибо 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, не заботьтесь о красоте страницы, он в основном используется для экспериментов с интерфейсом.

Пример: портал

Guess you like

Origin blog.csdn.net/xiealan/article/details/130804742