Вопрос с yandex.cloud GPT CHAT

goldbase1

Client
Регистрация
19.12.2020
Сообщения
91
Благодарностей
14
Баллы
8
Здравствуйте. Хотелось бы затронуть тему о 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-токен.

Перед началом работыПеред началом работы
  1. Узнайте идентификатор сервисного аккаунта.
  2. Создайте авторизованные ключи, которые необходимы при создании JWT. Сохраните идентификатор открытого ключа.
1. Создать JWT1. Создать 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-токен> каждый час
 

Кто просматривает тему: (Всего: 1, Пользователи: 0, Гости: 1)