Здравствуйте. Хотелось бы затронуть тему о yandex.cloud GPT CHAT. Не буду рассказывать как получить аккаунт и ключи (думаю что ничего трудного). Плюс думаю в то что яндекс дает оплату на 2 месяца использования чата да и как то хочется посмотреть чего достиг яндекс. Остановлюсь на самом чате. После получения API для пользования чатом нужно создать POST запрос с данными, где {-Variable.bot_rol-} это роль бота, {-Variable.text-} текст запроса:
Посмотреть вложение 121181
{
"modelUri": "gpt://b1gb729hhumfoa96klal/yandexgpt/latest",
"completionOptions": {
"stream": false,
"temperature": 0.6,
"maxTokens": 2000
},
"messages": [
{
"role": "system",
"text":"{-Variable.bot_rol-}"
},
{
"role": "user",
"text": "{-Variable.text-}"
}
]
}
В поле URL пишем https://llm.api.cloud.yandex.net/foundationModels/v1/completion
Далее Заголовки запроса :
Посмотреть вложение 121182
Content-Type: application/json,
Authorization: Api-Key "Ваш ключ"
Здесь думаю все понятно.
Но мы хотим так же пользоваться сервисом создания картинок, и тут яндекс начинает удивлять
Для получения картинок нужно создать POST запрос с данными, где {-Variable.text-} текст запроса:
Посмотреть вложение 121183
{
"modelUri": "art://b1gb729hhumfoa96klal/yandex-art/latest",
"generationOptions": {
"seed": 10
},
"messages": [
{
"weight": 1,
"text": "{-Variable.text-}"
}
]
}
В поле URL пишем https://llm.api.cloud.yandex.net:443/foundationModels/v1/imageGenerationAsync
И дальше Яндекс делает ход конем. И нам нужно получить
Получить IAM-токен с помощью JWT
Чтобы получить IAM-токен, создайте JSON Web Token (JWT) и обменяйте его на IAM-токен.
Перед началом работыПеред началом работы
Сформируйте JWT вручную по инструкции или воспользуйтесь библиотекой для вашего языка.
Совет
На jwt.io можно посмотреть список библиотек и попробовать сгенерировать токен вручную.
Пример создания JWT с использованием jose-jwt.
Вот здесь мне нужна Ваша помощь. Для получения ключа яндекс дает такой код:
using System;
using System.Collections.Generic;
using System.IO;
using System.Security.Cryptography;
using Jose;
namespace ConsoleApp
{
class Program
{
static void Main(string[] args)
{
var serviceAccountId = "<идентификатор_сервисного_аккаунта>";
var keyId = "<идентификатор_открытого_ключа>";
var now = DateTimeOffset.UtcNow.ToUnixTimeSeconds();
var headers = new Dictionary<string, object>()
{
{ "kid", keyId }
};
var payload = new Dictionary<string, object>()
{
{ "aud", "https://iam.api.cloud.yandex.net/iam/v1/tokens" },
{ "iss", serviceAccountId },
{ "iat", now },
{ "exp", now + 3600 }
};
using (var rsa = RSA.Create())
{
rsa.ImportFromPem(File.ReadAllText("<файл_закрытого_ключа>").ToCharArray());
string encodedToken = Jose.JWT.Encode(payload, rsa, JwsAlgorithm.PS256, headers);
}
}
}
}
Чтобы получить IAM-токен, воспользуйтесь методом REST API create для ресурса IamToken или вызовом gRPC API IamTokenService/CreateForServiceAccount.
Пример запроса с помощью cURL для метода REST API create:
curl -X POST \
-H 'Content-Type: application/json' \
-d '{"jwt": "<JWT-токен>"}' \
Где <JWT-токен> — токен в формате JWT, полученный на предыдущем шаге.
Полученный IAM-токен указывайте при обращении к ресурсам Yandex Cloud через API. Передайте IAM-токен в заголовке Authorization в следующем формате:
Authorization: Bearer <IAM-токен>
Подскажите как этот код поставить в ZennoPoster? Т.к. яндекс предлагает менять <IAM-токен> каждый час
Посмотреть вложение 121181
{
"modelUri": "gpt://b1gb729hhumfoa96klal/yandexgpt/latest",
"completionOptions": {
"stream": false,
"temperature": 0.6,
"maxTokens": 2000
},
"messages": [
{
"role": "system",
"text":"{-Variable.bot_rol-}"
},
{
"role": "user",
"text": "{-Variable.text-}"
}
]
}
В поле URL пишем https://llm.api.cloud.yandex.net/foundationModels/v1/completion
Далее Заголовки запроса :
Посмотреть вложение 121182
Content-Type: application/json,
Authorization: Api-Key "Ваш ключ"
Здесь думаю все понятно.
Но мы хотим так же пользоваться сервисом создания картинок, и тут яндекс начинает удивлять
Для получения картинок нужно создать POST запрос с данными, где {-Variable.text-} текст запроса:
Посмотреть вложение 121183
{
"modelUri": "art://b1gb729hhumfoa96klal/yandex-art/latest",
"generationOptions": {
"seed": 10
},
"messages": [
{
"weight": 1,
"text": "{-Variable.text-}"
}
]
}
В поле URL пишем https://llm.api.cloud.yandex.net:443/foundationModels/v1/imageGenerationAsync
И дальше Яндекс делает ход конем. И нам нужно получить
Получить IAM-токен с помощью JWT
Чтобы получить IAM-токен, создайте JSON Web Token (JWT) и обменяйте его на IAM-токен.
Перед началом работыПеред началом работы
- Узнайте идентификатор сервисного аккаунта.
- Создайте авторизованные ключи, которые необходимы при создании JWT. Сохраните идентификатор открытого ключа.
Сформируйте JWT вручную по инструкции или воспользуйтесь библиотекой для вашего языка.
Совет
На jwt.io можно посмотреть список библиотек и попробовать сгенерировать токен вручную.
Пример создания JWT с использованием jose-jwt.
Вот здесь мне нужна Ваша помощь. Для получения ключа яндекс дает такой код:
- .NET 4.7+:
using System;
using System.Collections.Generic;
using System.IO;
using System.Security.Cryptography;
using Jose;
using Org.BouncyCastle.Crypto.Parameters;
using Org.BouncyCastle.OpenSsl;
using Org.BouncyCastle.Security;
class Program
{
static void Main(string[] args)
{
var serviceAccountId = "<идентификатор_сервисного_аккаунта>";
var keyId = "<идентификатор_открытого_ключа>";
var now = DateTimeOffset.UtcNow.ToUnixTimeSeconds();
var headers = new Dictionary<string, object>()
{
{ "kid", keyId }
};
var payload = new Dictionary<string, object>()
{
{ "aud", "https://iam.api.cloud.yandex.net/iam/v1/tokens" },
{ "iss", serviceAccountId },
{ "iat", now },
{ "exp", now + 3600 }
};
RsaPrivateCrtKeyParameters privateKeyParams;
using (var pemStream = File.OpenText("<файл_закрытого_ключа>"))
{
privateKeyParams = new PemReader(pemStream).ReadObject() as RsaPrivateCrtKeyParameters;
}
using (var rsa = new RSACryptoServiceProvider())
{
rsa.ImportParameters(DotNetUtilities.ToRSAParameters(privateKeyParams));
string encodedToken = Jose.JWT.Encode(payload, rsa, JwsAlgorithm.PS256, headers);
}
}
} - .NET 5.0+ и .NET Core 2.2+:
using System;
using System.Collections.Generic;
using System.IO;
using System.Security.Cryptography;
using Jose;
namespace ConsoleApp
{
class Program
{
static void Main(string[] args)
{
var serviceAccountId = "<идентификатор_сервисного_аккаунта>";
var keyId = "<идентификатор_открытого_ключа>";
var now = DateTimeOffset.UtcNow.ToUnixTimeSeconds();
var headers = new Dictionary<string, object>()
{
{ "kid", keyId }
};
var payload = new Dictionary<string, object>()
{
{ "aud", "https://iam.api.cloud.yandex.net/iam/v1/tokens" },
{ "iss", serviceAccountId },
{ "iat", now },
{ "exp", now + 3600 }
};
using (var rsa = RSA.Create())
{
rsa.ImportFromPem(File.ReadAllText("<файл_закрытого_ключа>").ToCharArray());
string encodedToken = Jose.JWT.Encode(payload, rsa, JwsAlgorithm.PS256, headers);
}
}
}
}
Чтобы получить IAM-токен, воспользуйтесь методом REST API create для ресурса IamToken или вызовом gRPC API IamTokenService/CreateForServiceAccount.
Пример запроса с помощью cURL для метода REST API create:
curl -X POST \
-H 'Content-Type: application/json' \
-d '{"jwt": "<JWT-токен>"}' \
Где <JWT-токен> — токен в формате JWT, полученный на предыдущем шаге.
Полученный IAM-токен указывайте при обращении к ресурсам Yandex Cloud через API. Передайте IAM-токен в заголовке Authorization в следующем формате:
Authorization: Bearer <IAM-токен>
Подскажите как этот код поставить в ZennoPoster? Т.к. яндекс предлагает менять <IAM-токен> каждый час