Unterstützung für das offizielle ChatGPT-Modell wurde hinzugefügt! Sie können jetzt das gpt-3.5-turbo
-Modell mit der offiziellen OpenAI-API verwenden, indem Sie ChatGPTClient
verwenden. Dies ist das gleiche Modell, das ChatGPT verwendet, und es ist das derzeit leistungsstärkste Modell, das verfügbar ist. Die Nutzung dieses Modells ist nicht kostenlos , es ist jedoch 10x günstiger (Preis: 0,002 $ pro 1.000 Token) als text-davinci-003
.
Weitere Informationen finden Sie im OpenAI-Beitrag „Introducing ChatGPT and Whisper APIs“.
Um es zu verwenden, setzen Sie Das in modelOptions.model
auf gpt-3.5-turbo
und ChatGPTClient
kümmert sich um den Rest.ChatGPTClient
verwendete Standardmodell ist jetzt gpt-3.5-turbo
. Sie können weiterhin wie gewohnt userLabel
, chatGptLabel
und promptPrefix
(Systemanweisungen) festlegen.
Wenn Sie chat.openai.com weiterhin automatisieren, besteht möglicherweise eine höhere Wahrscheinlichkeit, dass Ihr Konto gesperrt wird. Dies geschieht weiterhin auf eigenes Risiko.
Ich habe einen experimentellen ChatGPTBrowserClient
hinzugefügt, der auf einem Reverse-Proxy-Server basiert, der eine Cloudflare-Umgehung nutzt, sodass Sie mit ChatGPT (chat.openai.com) kommunizieren können, ohne dass eine Browserautomatisierung erforderlich ist. Sie benötigen lediglich Ihr Zugriffstoken von https://chat.openai.com/api/auth/session.
Bitte beachten Sie wie immer, dass Sie, wenn Sie sich für diesen Weg entscheiden, Ihr Zugriffstoken einem Closed-Source-Server eines Drittanbieters zugänglich machen. Wenn Sie diesbezüglich Bedenken haben, können Sie entweder ein kostenloses ChatGPT-Konto verwenden, um Risiken zu minimieren, oder stattdessen weiterhin ChatGPTClient
mit dem Modell text-davinci-003
verwenden.
Die Methode, die wir für den Zugriff auf die zugrunde liegenden ChatGPT-Modelle verwendet haben, wurde leider gepatcht. Im Moment haben Sie die Wahl, entweder die offizielle OpenAI-API mit dem text-davinci-003
-Modell zu verwenden (was Geld kostet) oder eine browserbasierte Lösung als Schnittstelle zum ChatGPT-Backend zu verwenden (das weniger leistungsfähig, ratenbegrenzter und leistungsstärker ist). wird derzeit von dieser Bibliothek nicht unterstützt).
Mit Hilfe von @PawanOsman haben wir eine Möglichkeit gefunden, die zugrunde liegenden ChatGPT-Modelle weiterhin zu verwenden . Um hoffentlich zu verhindern, dass der Zugriff erneut verloren geht, haben wir uns entschieden, Reverse-Proxy-Server bereitzustellen, die mit der OpenAI-API kompatibel sind. Ich habe ChatGPTClient
aktualisiert, um die Verwendung eines Reverse-Proxy-Servers anstelle des OpenAI-API-Servers zu unterstützen. Weitere Informationen zu verfügbaren Proxyservern und deren Funktionsweise finden Sie unter Verwenden eines Reverse-Proxys.
Bitte beachten Sie, dass Sie, wenn Sie sich für diesen Weg entscheiden, Ihr Zugriffstoken einem Closed-Source-Server eines Drittanbieters zugänglich machen. Wenn Sie diesbezüglich Bedenken haben, können Sie entweder ein kostenloses ChatGPT-Konto verwenden, um Risiken zu minimieren, oder stattdessen weiterhin die offizielle OpenAI-API mit dem Modell text-davinci-003
verwenden.
Ich habe ein neues Arbeitsmodell für text-chat-davinci-002
gefunden, text-chat-davinci-002-sh-alpha-aoruigiofdj83
. Dies ist das zugrunde liegende Modell, das die ChatGPT Plus-Version „Turbo“ verwendet. Die Reaktionen sind rasend schnell. Ich habe die Bibliothek aktualisiert, um dieses Modell zu verwenden.
Schlechtes Timing; text-chat-davinci-002-sh-alpha-aoruigiofdj83
wurde kurz darauf entfernt, möglicherweise aufgrund eines neuen Modells irgendwo da draußen?
Erleben Sie die Leistungsfähigkeit von Bings GPT-4-Version von ChatGPT mit BingAIClient
(experimentell). Der API-Server und die CLI müssen noch aktualisiert werden, um dies zu unterstützen , aber Sie können den Client jetzt direkt verwenden. Bitte beachten Sie, dass Sie diesen Client nicht nutzen können, wenn Ihr Konto noch auf der Warteliste steht.
Obwohl text-chat-davinci-002-20221122
wieder verfügbar ist, scheint es ständig überlastet zu sein und gibt einen 429-Fehler zurück. Es ist wahrscheinlich, dass OpenAI diesem Modell nur wenig Ressourcen gewidmet hat, um eine breite Nutzung durch die Öffentlichkeit zu verhindern. Darüber hinaus habe ich gehört, dass der Zugriff auf neuere Versionen jetzt für OpenAI-Mitarbeiter und -Partner gesperrt ist, sodass es unwahrscheinlich ist, dass wir bis zur offiziellen Veröffentlichung des Modells Workarounds finden werden.
Sie können stattdessen das Modell text-davinci-003
als Ersatz verwenden. Bedenken Sie, dass text-davinci-003
nicht so gut ist wie text-chat-davinci-002
(das über RHLF trainiert und als Konversations-KI optimiert wurde), obwohl die Ergebnisse in den meisten Fällen immer noch recht gut sind. Bitte beachten Sie, dass die Nutzung von text-davinci-003
Credits ($) kostet.
Ich werde die Unterstützung für das browserbasierte ChatGPT für den API-Server und die CLI wieder hinzufügen. Bitte markieren Sie dieses Repository und achten Sie auf Aktualisierungen.
Die Achterbahn hat die nächste Haltestelle erreicht. text-chat-davinci-002-20221122
ist wieder verfügbar.
Der Versuch, text-chat-davinci-002-20221122
mit der OpenAI-API zu verwenden, gibt jetzt einen 404-Fehler zurück. Sie können stattdessen das Modell text-davinci-003
als Ersatz verwenden. Bedenken Sie, dass text-davinci-003
nicht so gut ist wie text-chat-davinci-002
(das über RHLF trainiert und als Konversations-KI optimiert wurde), obwohl die Ergebnisse immer noch sehr gut sind. Bitte beachten Sie, dass die Nutzung von text-davinci-003
Credits ($) kostet.
Bitte warten Sie auf weitere Updates, während wir weitere Problemumgehungen untersuchen.
Der Versuch, text-chat-davinci-002-20230126
mit der OpenAI-API zu verwenden, gibt jetzt einen 404-Fehler zurück. Jemand hat den neuen Modellnamen bereits gefunden, möchte ihn aber zum jetzigen Zeitpunkt nicht preisgeben. Ich werde dieses Repository aktualisieren, sobald ich das neue Modell gefunden habe. Wenn Sie Hinweise haben, öffnen Sie bitte ein Problem oder eine Pull-Anfrage.
In der Zwischenzeit habe ich Unterstützung für Modelle wie text-davinci-003
hinzugefügt, die Sie als Ersatz verwenden können. Bedenken Sie, dass text-davinci-003
nicht so gut ist wie text-chat-davinci-002
(das über RHLF trainiert und als Konversations-KI optimiert wurde), obwohl die Ergebnisse immer noch sehr gut sind. Bitte beachten Sie, dass die Nutzung von text-davinci-003
Credits ($) kostet.
Der Discord-Benutzer @pig#8932 hat ein funktionierendes text-chat-davinci-002
Modell gefunden, text-chat-davinci-002-20221122
. Ich habe die Bibliothek aktualisiert, um dieses Modell zu verwenden.
Eine Client-Implementierung für ChatGPT und Bing AI. Verfügbar als Node.js-Modul, REST-API-Server und CLI-App.
ChatGPTClient
: Unterstützung für das offizielle ChatGPT-Basismodell, gpt-3.5-turbo
, über die OpenAI-API.keyv-file
Adapter ist ebenfalls in diesem Paket enthalten und kann zum Speichern von Konversationen in einer JSON-Datei verwendet werden, wenn Sie den API-Server oder die CLI verwenden (siehe settings.example.js
).text-davinci-003
BingAIClient
: Unterstützung für Bings Version von ChatGPT, unterstützt von GPT-4.ChatGPTBrowserClient
: Unterstützung für die offizielle ChatGPT-Website unter Verwendung eines Reverse-Proxy-Servers für eine Cloudflare-Umgehung.npm i @waylaidwanderer/chatgpt-api
Siehe demos/use-bing-client.js
.
Siehe demos/use-client.js
.
Siehe demos/use-browser-client.js
.
Sie können das Paket mit installieren
npm i -g @waylaidwanderer/chatgpt-api
Führen Sie es dann mit chatgpt-api
aus. Dies erfordert einen optionalen Parameter --settings=<path_to_settings.js>
oder sucht im aktuellen Verzeichnis nach settings.js
, sofern dieser nicht festgelegt ist, mit folgendem Inhalt:
module . exports = {
// Options for the Keyv cache, see https://www.npmjs.com/package/keyv.
// This is used for storing conversations, and supports additional drivers (conversations are stored in memory by default).
// Only necessary when using `ChatGPTClient`, or `BingAIClient` in jailbreak mode.
cacheOptions : { } ,
// If set, `ChatGPTClient` and `BingAIClient` will use `keyv-file` to store conversations to this JSON file instead of in memory.
// However, `cacheOptions.store` will override this if set
storageFilePath : process . env . STORAGE_FILE_PATH || './cache.json' ,
chatGptClient : {
// Your OpenAI API key (for `ChatGPTClient`)
openaiApiKey : process . env . OPENAI_API_KEY || '' ,
// (Optional) Support for a reverse proxy for the completions endpoint (private API server).
// Warning: This will expose your `openaiApiKey` to a third party. Consider the risks before using this.
// reverseProxyUrl: 'https://chatgpt.hato.ai/completions',
// (Optional) Parameters as described in https://platform.openai.com/docs/api-reference/completions
modelOptions : {
// You can override the model name and any other parameters here.
// The default model is `gpt-3.5-turbo`.
model : 'gpt-3.5-turbo' ,
// Set max_tokens here to override the default max_tokens of 1000 for the completion.
// max_tokens: 1000,
} ,
// (Optional) Davinci models have a max context length of 4097 tokens, but you may need to change this for other models.
// maxContextTokens: 4097,
// (Optional) You might want to lower this to save money if using a paid model like `text-davinci-003`.
// Earlier messages will be dropped until the prompt is within the limit.
// maxPromptTokens: 3097,
// (Optional) Set custom instructions instead of "You are ChatGPT...".
// (Optional) Set a custom name for the user
// userLabel: 'User',
// (Optional) Set a custom name for ChatGPT ("ChatGPT" by default)
// chatGptLabel: 'Bob',
// promptPrefix: 'You are Bob, a cowboy in Western times...',
// A proxy string like "http://<ip>:<port>"
proxy : '' ,
// (Optional) Set to true to enable `console.debug()` logging
debug : false ,
} ,
// Options for the Bing client
bingAiClient : {
// Necessary for some people in different countries, e.g. China (https://cn.bing.com)
host : '' ,
// The "_U" cookie value from bing.com
userToken : '' ,
// If the above doesn't work, provide all your cookies as a string instead
cookies : '' ,
// A proxy string like "http://<ip>:<port>"
proxy : '' ,
// (Optional) Set to true to enable `console.debug()` logging
debug : false ,
} ,
chatGptBrowserClient : {
// (Optional) Support for a reverse proxy for the conversation endpoint (private API server).
// Warning: This will expose your access token to a third party. Consider the risks before using this.
reverseProxyUrl : 'https://bypass.churchless.tech/api/conversation' ,
// Access token from https://chat.openai.com/api/auth/session
accessToken : '' ,
// Cookies from chat.openai.com (likely not required if using reverse proxy server).
cookies : '' ,
// A proxy string like "http://<ip>:<port>"
proxy : '' ,
// (Optional) Set to true to enable `console.debug()` logging
debug : false ,
} ,
// Options for the API server
apiOptions : {
port : process . env . API_PORT || 3000 ,
host : process . env . API_HOST || 'localhost' ,
// (Optional) Set to true to enable `console.debug()` logging
debug : false ,
// (Optional) Possible options: "chatgpt", "chatgpt-browser", "bing". (Default: "chatgpt")
clientToUse : 'chatgpt' ,
// (Optional) Generate titles for each conversation for clients that support it (only ChatGPTClient for now).
// This will be returned as a `title` property in the first response of the conversation.
generateTitles : false ,
// (Optional) Set this to allow changing the client or client options in POST /conversation.
// To disable, set to `null`.
perMessageClientOptionsWhitelist : {
// The ability to switch clients using `clientOptions.clientToUse` will be disabled if `validClientsToUse` is not set.
// To allow switching clients per message, you must set `validClientsToUse` to a non-empty array.
validClientsToUse : [ 'bing' , 'chatgpt' , 'chatgpt-browser' ] , // values from possible `clientToUse` options above
// The Object key, e.g. "chatgpt", is a value from `validClientsToUse`.
// If not set, ALL options will be ALLOWED to be changed. For example, `bing` is not defined in `perMessageClientOptionsWhitelist` above,
// so all options for `bingAiClient` will be allowed to be changed.
// If set, ONLY the options listed here will be allowed to be changed.
// In this example, each array element is a string representing a property in `chatGptClient` above.
chatgpt : [
'promptPrefix' ,
'userLabel' ,
'chatGptLabel' ,
// Setting `modelOptions.temperature` here will allow changing ONLY the temperature.
// Other options like `modelOptions.model` will not be allowed to be changed.
// If you want to allow changing all `modelOptions`, define `modelOptions` here instead of `modelOptions.temperature`.
'modelOptions.temperature' ,
] ,
} ,
} ,
// Options for the CLI app
cliOptions : {
// (Optional) Possible options: "chatgpt", "bing".
// clientToUse: 'bing',
} ,
} ;
Alternativ können Sie das Paket auch direkt installieren und ausführen.
git clone https://github.com/waylaidwanderer/node-chatgpt-api
npm install
installieren (wenn Docker nicht verwendet wird)settings.example.js
im Stammverzeichnis in settings.js
um und ändern Sie die Einstellungen bei Bedarf.npm start
oder npm run server
(falls Docker nicht verwendet wird)docker-compose up
(erfordert Docker) Beginnen Sie ein Gespräch oder führen Sie es fort. Optionale Parameter sind nur für Konversationen erforderlich, die mehrere Anfragen umfassen.
Feld | Beschreibung |
---|---|
Nachricht | Die Nachricht, die dem Benutzer angezeigt werden soll. |
Konversations-ID | (Optional) Eine ID für die Konversation, die Sie fortsetzen möchten. |
jailbreakConversationId | (Optional, nur für BingAIClient ) Auf true setzen, um eine Konversation im Jailbreak-Modus zu starten. Danach sollte dies die ID für die Jailbreak-Konversation sein (in der Antwort als Parameter angegeben, auch jailbreakConversationId genannt). |
parentMessageId | (Optional für ChatGPTClient und BingAIClient im Jailbreak-Modus) Die ID der übergeordneten Nachricht (z. B. response.messageId ), wenn eine Konversation fortgesetzt wird. |
KonversationSignatur | (Optional, nur für BingAIClient ) Eine Signatur für die Konversation (in der Antwort als Parameter angegeben, auch mit dem Namen conversationSignature ). Erforderlich, wenn Sie ein Gespräch fortsetzen, es sei denn, Sie befinden sich im Jailbreak-Modus. |
clientId | (Optional, nur für BingAIClient ) Die ID des Clients. Erforderlich, wenn Sie ein Gespräch fortsetzen, es sei denn, Sie befinden sich im Jailbreak-Modus. |
Aufruf-ID | (Optional, nur für BingAIClient ) Die ID des Aufrufs. Erforderlich, wenn Sie ein Gespräch fortsetzen, es sei denn, Sie befinden sich im Jailbreak-Modus. |
clientOptions | (Optional) Ein Objekt, das Optionen für den Client enthält. |
clientOptions.clientToUse | (Optional) Der Client, der für diese Nachricht verwendet werden soll. Mögliche Werte: chatgpt , chatgpt-browser , bing . |
clientOptions.* | (Optional) Alle gültigen Optionen für den Client. Beispielsweise können Sie für ChatGPTClient clientOptions.openaiApiKey festlegen, um einen API-Schlüssel nur für diese Nachricht festzulegen, oder clientOptions.promptPrefix um der KI nur für diese Nachricht benutzerdefinierte Anweisungen zu geben usw. |
Um zu konfigurieren, welche Optionen pro Nachricht geändert werden können (Standard: alle), lesen Sie die Kommentare für perMessageClientOptionsWhitelist
in settings.example.js
. Um das Ändern von Clients zu ermöglichen, muss perMessageClientOptionsWhitelist.validClientsToUse
auf ein nicht leeres Array festgelegt werden, wie in der Beispieleinstellungsdatei beschrieben.
Um eine Konversation mit ChatGPT zu starten, senden Sie eine POST-Anfrage an den /conversation
Endpunkt des Servers mit einem JSON-Body mit Parametern gemäß Endpoints > POST /conversation oben.
{
"message" : " Hello, how are you today? " ,
"conversationId" : " your-conversation-id (optional) " ,
"parentMessageId" : " your-parent-message-id (optional, for `ChatGPTClient` only) " ,
"conversationSignature" : " your-conversation-signature (optional, for `BingAIClient` only) " ,
"clientId" : " your-client-id (optional, for `BingAIClient` only) " ,
"invocationId" : " your-invocation-id (optional, for `BingAIClient` only) " ,
}
Der Server gibt ein JSON-Objekt zurück, das die Antwort von ChatGPT enthält:
// HTTP/1.1 200 OK
{
"response" : "I'm doing well, thank you! How are you?" ,
"conversationId" : "your-conversation-id" ,
"messageId" : "response-message-id (for `ChatGPTClient` only)" ,
"conversationSignature" : "your-conversation-signature (for `BingAIClient` only)" ,
"clientId" : "your-client-id (for `BingAIClient` only)" ,
"invocationId" : "your-invocation-id (for `BingAIClient` only - pass this new value back into subsequent requests as-is)" ,
"details" : "an object containing the raw response from the client"
}
Wenn die Anfrage nicht erfolgreich ist, gibt der Server ein JSON-Objekt mit einer Fehlermeldung zurück.
Wenn dem Anfrageobjekt eine erforderliche Eigenschaft fehlt (z. B. message
):
// HTTP/1.1 400 Bad Request
{
"error" : "The message parameter is required."
}
Wenn beim Senden der Nachricht an ChatGPT ein Fehler aufgetreten ist:
// HTTP/1.1 503 Service Unavailable
{
"error" : "There was an error communicating with ChatGPT."
}
Sie können "stream": true
im Anforderungstext festlegen, um einen Stream von Tokens zu empfangen, während diese generiert werden.
import { fetchEventSource } from '@waylaidwanderer/fetch-event-source' ; // use `@microsoft/fetch-event-source` instead if in a browser environment
const opts = {
method : 'POST' ,
headers : {
'Content-Type' : 'application/json' ,
} ,
body : JSON . stringify ( {
"message" : "Write a poem about cats." ,
"conversationId" : "your-conversation-id (optional)" ,
"parentMessageId" : "your-parent-message-id (optional)" ,
"stream" : true ,
// Any other parameters per `Endpoints > POST /conversation` above
} ) ,
} ;
Ein Beispiel dafür, wie Sie die Antwort empfangen, während sie generiert wird, finden Sie unter demos/use-api-server-streaming.js. Sie erhalten jeweils einen Token und müssen ihn daher selbst verketten.
Erfolgreiche Ausgabe:
{ data : '' , event : '' , id : '' , retry : 3000 }
{ data : 'Hello' , event : '' , id : '' , retry : undefined }
{ data : '!' , event : '' , id : '' , retry : undefined }
{ data : ' How' , event : '' , id : '' , retry : undefined }
{ data : ' can' , event : '' , id : '' , retry : undefined }
{ data : ' I' , event : '' , id : '' , retry : undefined }
{ data : ' help' , event : '' , id : '' , retry : undefined }
{ data : ' you' , event : '' , id : '' , retry : undefined }
{ data : ' today' , event : '' , id : '' , retry : undefined }
{ data : '?' , event : '' , id : '' , retry : undefined }
{ data : '<result JSON here, see Method 1>' , event : 'result' , id : '' , retry : undefined }
{ data : '[DONE]' , event : '' , id : '' , retry : undefined }
// Hello! How can I help you today?
Fehlerausgabe:
const message = {
data : '{"code":503,"error":"There was an error communicating with ChatGPT."}' ,
event : 'error' ,
id : '' ,
retry : undefined
} ;
if ( message . event === 'error' ) {
console . error ( JSON . parse ( message . data ) . error ) ; // There was an error communicating with ChatGPT.
}
fetch-event-source
importieren und POST
Methode verwenden. Befolgen Sie die gleichen Einrichtungsanweisungen für den API-Server und erstellen Sie settings.js
.
Bei globaler Installation:
chatgpt-cli
Bei lokaler Installation:
npm run cli
Die Antworten von ChatGPT werden automatisch in Ihre Zwischenablage kopiert, sodass Sie sie in andere Anwendungen einfügen können.
Wie in den obigen Beispielen gezeigt, können Sie reverseProxyUrl
in den Optionen von ChatGPTClient
festlegen, um einen Reverse-Proxy-Server anstelle der offiziellen ChatGPT-API zu verwenden. Derzeit ist dies die einzige Möglichkeit, die zugrunde liegenden ChatGPT-Modelle zu verwenden . Diese Methode wurde gepatcht und die folgenden Anweisungen sind nicht mehr relevant. Möglicherweise möchten Sie jedoch aus anderen Gründen dennoch einen Reverse-Proxy verwenden. Derzeit werden noch Reverse-Proxy-Server verwendet, um eine Cloudflare-Umgehung für ChatGPTBrowserClient
durchzuführen.
Wie funktioniert es? Einfache Antwort: ChatGPTClient
> Reverse-Proxy > OpenAI-Server. Der Reverse-Proxy-Server greift unter der Haube auf magische Weise direkt über den OpenAI-Server auf das zugrunde liegende Modell zu und gibt die Antwort dann an ChatGPTClient
zurück.
Anweisungen finden Sie weiter unten.
accessToken
).reverseProxyUrl
in den Optionen settings.js > chatGptClient
oder ChatGPTClient
“ auf https://chatgpt.hato.ai/completions
fest.settings.chatGptClient.openaiApiKey
) auf das ChatGPT-Zugriffstoken, das Sie in Schritt 1 erhalten haben.model
auf text-davinci-002-render
, text-davinci-002-render-paid
oder text-davinci-002-render-sha
fest, je nachdem, auf welche ChatGPT-Modelle Ihr Konto Zugriff hat. Modelle müssen ein ChatGPT-Modellname sein, nicht der zugrunde liegende Modellname, und Sie können kein Modell verwenden, auf das Ihr Konto keinen Zugriff hat.stream: true
(API) oder onProgress
(Client) als Problemumgehung.accessToken
).reverseProxyUrl
in den Optionen settings.js > chatGptClient
oder ChatGPTClient
“ auf https://chatgpt.pawan.krd/api/completions
“ fest.settings.chatGptClient.openaiApiKey
) auf das ChatGPT-Zugriffstoken, das Sie in Schritt 1 erhalten haben.model
auf text-davinci-002-render
, text-davinci-002-render-paid
oder text-davinci-002-render-sha
fest, je nachdem, auf welche ChatGPT-Modelle Ihr Konto Zugriff hat. Modelle müssen ein ChatGPT-Modellname sein, nicht der zugrunde liegende Modellname, und Sie können kein Modell verwenden, auf das Ihr Konto keinen Zugriff hat.stream: true
(API) oder onProgress
(Client) als Problemumgehung. Eine Liste toller Projekte mit @waylaidwanderer/chatgpt-api
:
Fügen Sie Ihre zur Liste hinzu, indem Sie diese README-Datei bearbeiten und eine Pull-Anfrage erstellen!
Ein Web-Client für dieses Projekt ist auch unter waylaidwanderer/PandoraAI verfügbar.
ChatGPTClient
Da gpt-3.5-turbo
das zugrunde liegende Modell von ChatGPT ist, musste ich mein Bestes tun, um die Art und Weise nachzubilden, wie es auf der offiziellen ChatGPT-Website verwendet wird. Das bedeutet, dass sich meine Implementierung oder das zugrunde liegende Modell in mancher Hinsicht möglicherweise nicht genau gleich verhält:
Wenn Sie zu diesem Projekt beitragen möchten, erstellen Sie bitte einen Pull-Request mit einer detaillierten Beschreibung Ihrer Änderungen.
Dieses Projekt ist unter der MIT-Lizenz lizenziert.