Единственный API, который вам нужен!

Единственный API, который вам нужен!

2 марта 2023 г.

Мои дорогие читатели, я с большим удовольствием представляю вам свое последнее изобретение! С безудержной гордостью и радостью я отправляюсь в путешествие с открытым исходным кодом, которое обеспечит мне место в анналах истории программного обеспечения.

Я уверен, что с продуктом, который я собираюсь представить; легендарный статус неизбежен! Итак, без лишних слов, давайте сразу перейдем к деталям.

Позвольте мне спросить вас: часто ли вам неприятно совмещать несколько API и SDK в вашем проекте? Управление различными зависимостями и работа с несовместимыми шаблонами могут стать настоящей проблемой.

И давайте не будем забывать о трудоемком поиске недостающих функций, в которых вы отчаянно нуждаетесь. Если вы согласно киваете головой, знайте, что вы не одиноки.

Я тоже был там, и я понимаю борьбу. Но не бойтесь, друзья мои, потому что я приношу отличные новости! Наконец-то найдено решение этой проблемы.

То, что я собираюсь показать вам, меняет правила игры. Это продукт столь же новаторский, как и открытие электричества в свое время — настоящая революция в потреблении API. Вы смотрите на один API, который управляет ими всеми! Я очень рад представить вам "The Only API".

На данный момент вы можете мгновенно заменить все API, которые вы используете, на «Единственный API» и использовать упрощенную кодовую базу, одновременно расширенную за счет более мощных функций, чем когда-либо прежде.

Лол, подожди… Что? Как это вообще возможно?

Ответ прост. Это потому, что «The Only API» — это всего лишь строго типизированный SDK с открытым исходным кодом и бесконечным числом методов, позволяющий запрашивать все, что вам нужно, и получать данные в любом формате, который вы предпочитаете!

Теперь я понимаю, что понятие бесконечного количества методов и совместимости с любым форматом данных может быть трудным для понимания, и вы можете скептически отнестись к тому, что это просто очередной обман.

Итак, позвольте представить вам несколько увлекательных примеров того, как «The Only API» можно использовать на практике.

Установив его в своем проекте, вы можете начать с чего-то простого:

const result = await api.getTheAnswerToLifeTheUniverseAndEverything()
                        .AsType({ answer: Number });

// { answer: 42 }

Как видите, ответ, хотя и немного загадочный, соответствует нынешнему научному консенсусу и всем знаниям, известным людям на момент написания этой статьи.

Но еще более интересно то, что мы можем использовать метод AsType для получения нашего ответа в точном формате, который нам нужен.

Конечно, «Единственный API» поддерживает бесконечное количество параметров, и в качестве входных данных можно использовать все возможные форматы данных, начиная с чего-то простого, например:

const result = await api.getTheNameOfACapital({ country: "France" })
                        .AsType({ name: String });

// { name: 'Paris' }

И если нам нужно больше данных, мы просто меняем возвращаемый тип данных на что-то более сложное, как в примере ниже:

const result = await api.getTheNameOfACapital({ country: "France" })
                        .AsType({
                            name: String, 
                            population: Number, 
                            mostFamousBuilding: String
                        });

/* 

{
  name: 'Paris',
  population: 2148271,
  mostFamousBuilding: 'Eiffel Tower'
}

И если вы думаете, что он может вернуть только один результат, попробуйте следующее:

const result = await api.getBestTVShows({ 
                            page: 1, 
                            perPage: 5, 
                            orderBy: "awesomeness" 
                        })
                        .AsType([{ 
                            name: String, 
                            top3Cast: [{ 
                                actorName: String,
                                charachterName: String
                            }]
                        }]);

/*

[
    {
        "name": "Game Of Thrones",
        "top3Cast": [
            {
                "actorName": "Peter Dinklage",
                "characterName": "Tyrion Lannister"
            },
            {
                "actorName": "Emilia Clarke",
                "characterName": "Daenerys Targaryen"
            },
            {
                "actorName": "Kit Harington",
                "characterName": "Jon Snow"
            }
        ]
    },
    {
        "name": "The Big Bang Theory",
        "top3Cast": [
            {
                "actorName": "Johnny Galecki",
                "characterName": "Leonard Hofstadter"
            },
            {
                "actorName": "Jim Parsons",
                "characterName": "Sheldon Cooper"
            },
            {
                "actorName": "Kaley Cuoco",
                "characterName": "Penny Hofstadter"
            }
        ]
    },
    {
        "name": "Friends",
        "top3Cast": [
            {
                "actorName": "Jennifer Aniston",
                "characterName": "Rachel Green"
            },
            {
                "actorName": "Matt LeBlanc",
                "characterName": "Joey Tribbiani"
            },
            {
                "actorName": "Matthew Perry",
                "characterName": "Chandler Bing"
            }
        ]
    },
    {
        "name": "Breaking Bad",
        "top3Cast": [
            {
                "actorName": "Bryan Cranston",
                "characterName": "Walter White"
            },
            {
                "actorName": "Anna Gunn",
                "characterName": "Skyler White"
            },
            {
                "actorName": "Aaron Paul",
                "characterName": "Jesse Pinkman"
            }
        ]
    },
    {
        "name": "Stranger Things",
        "top3Cast": [
            {
                "actorName": "Millie Bobby Brown",
                "characterName": "Eleven"
            },
            {
                "actorName": "Finn Wolfhard",
                "characterName": "Mike Wheeler"
            },
            {
                "actorName": "Winona Ryder",
                "characterName": "Joyce Byers"
            }
        ]
    }
]

И я знаю, что Bay Watch должен быть в этом списке, но это все равно впечатляет, верно? Все эти возможности в одном API, но это лишь небольшая его часть.

На этом возможности не заканчиваются. На самом деле они бесконечны и ограничены только нашим воображением. Если вам интересно узнать, как «Единственный API» может решать более сложные проблемы, посмотрите короткое видео, которое я сделал, чтобы продемонстрировать, как его можно использовать при написании кода:

https://youtu.be/bXPOLoF5HjA?embedable=true

Итак, с чего начать?

На данный момент я уверен, что вы так же взволнованы, как и я, и хотите немедленно начать использовать «Единственный API». Уверен, вы уже представляете, как здорово будет заменить все ваши старые API этой простой, элегантной и мощной альтернативой.

Хорошая новость в том, что вы можете сделать это прямо сейчас! Он уже опубликован на GitHub и доступен для скачивания с npm. Все, что вам нужно сделать, это установить пакет в свой проект TypeScript или JavaScript, используя:

npm install theonlyapi

А затем создайте экземпляр «Единственного API»:

import TheApi from "theonlyapi";

const api = TheAPI("sk-XXXXXXXXXXXXXXXXXXXXXXXXXXXX");

И все…

Видеть? Светлое будущее вашей карьеры разработчиков находится всего в одной установке npm.

Спасибо, что прочитали эту статью! Увидимся в следующий раз!

Извините, что? Что такое ключ API? Ну…

Хорошо… ты меня понял. Как бы нам ни хотелось иметь всезнающий универсальный API, который может делать все, о чем мы просим, ​​«The Only API» сам по себе не является самостоятельным продуктом. Для этого требуется мощный движок, а параметр, необходимый для его инициализации, — это ваш личный ключ к API OpenAI.

Приношу свои извинения за то, что оправдал ваши надежды, но при этом позвольте мне немного подробнее рассказать об этом проекте и о том, как мне пришла в голову эта идея.

На самом деле это было довольно просто сделать и очень приятно использовать - вы должны попробовать! Кодирование заняло всего один день, и наиболее важным аспектом является подсказка, которую библиотека отправляет в OpenAI.

Мне пришлось поэкспериментировать с разными способами формулировки запросов и опробовать различные механизмы генерации завершений, предоставленные одной из самых популярных компаний в мире ИТ. Наконец, я придумал это:

<цитата>

Возвращает результат вызова API гипотетического веб-метода addTwoNumbers с параметрами ["21", "37"]. Отформатируйте ответ, чтобы он соответствовал следующей сигнатуре объекта: { «ответ»: номер}. Вывести только ответ JSON.

И только для того, чтобы исправить некоторые ошибки и крайние случаи, а также повысить общую эффективность API, я добавил следующую фразу:

<цитата>

Если некоторые входные данные будут отображаться в выходных данных, ни в коем случае не изменяйте их. Держите ответ коротким. Сделайте это однострочным ответом без символов новой строки. Сократите JSON.

По сути, это приглашение затем отправляется в конечную точку OpenAI «createCompletion». Движок, который я выбрал, — новейший и лучший «text-davinci-003». Я также установил для параметра "max_tokens" значение 1024, чтобы средний ответ JSON соответствовал этому пределу.

Он работает довольно прилично, возвращая правильный JSON в 9 из 10 случаев, и, как вы можете себе представить, он делает массу ошибок и возвращает много выдуманной информации. Если вы играли с Chat GPT, вы знаете, что у него всегда будет ответ. Просто это может быть не всегда правильно.

Знаете, это строго типизировано…

Самая большая проблема, с которой я столкнулся, заключалась в том, чтобы сделать это действительно похожим на строго типизированный API. Несмотря на ограничения синтаксиса TypeScript, мне нужно было сделать несколько необычных вещей:

* Создайте объект, позволяющий запускать любой метод с любым именем.

* Разрешить использование любых параметров.

* Разрешить определять любой тип возвращаемого значения и сделать результат строго типизированным.

* Иметь возможность получать всю эту информацию от пользовательских вызовов и помещать ее в мою подсказку.

Я должен отдать должное моему хорошему другу Michał, который является лучшим экспертом по TypeScript, которого я знаю. Он очень помог мне преодолеть некоторые трудности, с которыми я столкнулся, и помог мне сформировать библиотеку почти так, как я хотел.

Самый ценный совет, который он мне дал, заключался в использовании Proxy JavaScript. Это позволяет мне создать прокси для другого объекта, что позволяет перехватывать и переопределять основные операции для этого объекта.

Благодаря этой функции и старому доброму ключевому слову arguments я мог легко получить всю информацию о звонках и поместить ее в мою подсказку OpenAI.

Другая проблема заключалась в том, как создать тип, позволяющий мне запускать на нем любую функцию и в результате возвращать мою функцию «AsType». Это оказалось довольно просто:

type TheApi = {
  [key: string]: (...args: any[]) => {
    AsType: AsTypeFunction;
  };

Сама функция «AsType». Я хотел, чтобы пользователи очень просто определяли возвращаемые типы в строке. Я предполагал, что пользователь может определить объект и использовать типы JavaScript, такие как String, Number или Boolean, вместе с массивами и вложенными объектами для определения формата ответа. . Я начал с этого:

type AsTypeFunction = <T extends {}>(returnType: T) => Promise<T>;

Но проблема заключалась в том, что, например, Number вводится в NumberConstructor в Typescript. Для моей цели это должен был быть простой число, которое можно было бы использовать со стандартными числовыми операторами и внутри функций, требующих числа в качестве одного из своих параметров.

Мне нужно было научиться использовать сопоставление в определениях типов, но в конце концов я понял следующее:

type SimpleValue<Type> = Type extends NumberConstructor ? number :
                         Type extends StringConstructor ? string :  
                         Type extends BooleanConstructor ? boolean :
                         SimplifyType<Type>;

type SimplifyType<Type> = Type extends [] 
                          ? [SimpleValue<any>] 
                          : { [Key in keyof Type]
                                   : SimpleValue<Type[Key]> } 


type AsTypeFunction = <T extends {}>(returnType: T) 
                            => Promise<SimplifyType<T>>

Я понимаю, что это может показаться немного сложным, но по сути это означает, что если возвращаемый тип является массивом, мы должны рассматривать его как массив простых значений. Если возвращаемый тип является объектом, мы должны рассматривать его как объект с ключами, являющимися простыми значениями.

Теперь, что такое простое значение? Это либо простой тип, и в этом случае мы должны вернуть число, строку или логическое значение, либо другой «SimplifyType», если есть вложенный объект. Затем мы можем разрешить его, используя те же правила, что и упомянутые выше.

Мне нравится гибкость TypeScript, когда дело доходит до определения типов. Меня это всегда поражает!

Но почему?

Обычно лучшие идеи приходят ко мне, когда я в душе, но на этот раз все было по-другому. Не хочу претендовать на чью-то известную цитату, но "у меня была мечта". Вы знаете тот момент, когда вы просыпаетесь утром, но потом у вас появляются лишние 5 минут сна с яркими сновидениями?

Обычно мне снится то, что я люблю, и да, вы правы, я мечтал о программировании.

В этом прекраснейшем сне я представлял себе использование единого API со всеми функциями, необходимыми для проекта. Обычно я забываю свои сны сразу после того, как встаю с постели, но на этот раз мысль о том, чтобы иметь один API для всего, засела у меня в голове на целый день.

В какой-то момент я подумал - а почему бы и нет? OpenAI может имитировать что угодно, включая API. TypeScript, вероятно, достаточно мощен, чтобы обеспечить приятный интерфейс для его использования. Я попробовал.

Я понимаю, что этот PoC не имеет никакой ценности, кроме любопытства и еще одного применения революционной технологии, которую нам дали в прошлом году, но если подумать...

Усовершенствованные языковые модели ИИ только что родились и уже поражают нас. Я могу только представить, как быстро он будет развиваться. Теперь, когда версия Chat GPT для Bing также может получать информацию из внешних источников, ее, вероятно, можно улучшить.

В какой-то момент подобный API может стать продуктом Microsoft или другого крупного игрока... Посмотрим.

Спасибо за прочтение!


Оригинал
PREVIOUS ARTICLE
NEXT ARTICLE