yandex.cloud GPT CHAT

goldbase1

Client
Регистрация
19.12.2020
Сообщения
86
Благодарностей
13
Баллы
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-токен> каждый час
 

Ахилес

Client
Регистрация
11.11.2020
Сообщения
924
Благодарностей
377
Баллы
63

goldbase1

Client
Регистрация
19.12.2020
Сообщения
86
Благодарностей
13
Баллы
8
а что это за токен, 0329482340982340923408. Пишет: The token is invalid. Я уже выше написал, что токен <IAM-токен> срок действия ключа 24 часа. ДЛЯ СЕРВИСНЫХ АККАУНТОВ. И поэтому задаю вопрос здесь т.к. не знаю как это сделать, нужно получать токен каждый час
 
Последнее редактирование:

Ахилес

Client
Регистрация
11.11.2020
Сообщения
924
Благодарностей
377
Баллы
63
а что это за токен, 0329482340982340923408. Пишет: The token is invalid. Я уже выше написал, что токен <IAM-токен> срок действия ключа 24 часа. ДЛЯ СЕРВИСНЫХ АККАУНТОВ. И поэтому задаю вопрос здесь т.к. не знаю как это сделать, нужно получать токен каждый час
это IAM который ты получаешь в этом запросе:

Пример запроса с помощью cURL для метода REST API create:
curl -X POST \
-H 'Content-Type: application/json' \
-d '{"jwt": "<JWT-токен>"}' \

https://iam.api.cloud.yandex.net/iam/v1/tokens

Где <JWT-токен> — токен в формате JWT, полученный на предыдущем шаге.
 

goldbase1

Client
Регистрация
19.12.2020
Сообщения
86
Благодарностей
13
Баллы
8
так вот я и спрашиваю как получить jwt токен
 

Ахилес

Client
Регистрация
11.11.2020
Сообщения
924
Благодарностей
377
Баллы
63
так вот я и спрашиваю как получить jwt токен
запросом.... :bn:
тип POST
заголовок Content-Type: application/json'
тело '{"jwt": "<JWT-токен>"}'
адресс https://iam.api.cloud.yandex.net/iam/v1/tokens

JWT-токен :
1. Создать JWT1. Создать JWT
Сформируйте JWT вручную по инструкции или воспользуйтесь библиотекой для вашего языка.

Совет
На jwt.io можно посмотреть список библиотек и попробовать сгенерировать токен вручную.


Пример создания JWT с использованием jose-jwt. <--------------- ;-)
 

Ахилес

Client
Регистрация
11.11.2020
Сообщения
924
Благодарностей
377
Баллы
63
там даже код у тебя в посте есть.
подключай все нужные dll, прописывай GAC, using, раскидывай процедуры в общий код и вызывай из кубика нужную процедуру.

PS. только для зенки нужно что бы было .net 4.6 , а не .NET 4.7+ или выше... если нет dll под эту версию, тогда придется делать отдельное приложение с передачей данных из зенки туда и обратно.
 

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