Ein Wrapper für https://venus.chub.ai zum Erstellen von Konten und zum Zugriff auf Premium-LLMs mithilfe lokaler Python-Skripte.
Der Zweck dieses Skripts besteht darin, die Möglichkeiten des Reverse Engineering mit Python zu demonstrieren. Dieses Projekt dient ausschließlich Bildungszwecken und fällt unter die GPL-3-Lizenz. Für weitere Informationen können Sie mich jederzeit unter [email protected] kontaktieren. Aus rechtlichen Gründen lesen Sie bitte das Rechtsblatt sorgfältig durch
Diese README-Datei ist anfängerfreundlich und enthält Schritt-für-Schritt-Anleitungen. Der Prozess dauert langsam.
Dieses einfache Projekt nutzt Module wie selenium
, requests
und ein wenig, um die Sicherheitslücken und Inkonsistenzen der Site auszunutzen. Das Hinzufügen von Cloudflare hilft auch nicht – ich muss nur nodriver anstelle von Selenium verwenden
Führen Sie git clone https://github.com/Recentaly/Venus-Chub-Wrapper.git
aus
Installieren Sie die Abhängigkeiten, indem Sie eine Konsole im Venus-Chub-Wrapper- Verzeichnis öffnen und pip install -r requirements.txt
ausführen
Für den Kontext wird ein Beispielskript bereitgestellt. Dieses Projekt liefert nur einzelne Codeausschnitte zum Registrieren eines Kontos, zum Abrufen Ihres Mars-Tokens , zum Anmelden usw. Sie müssen Ihre eigene main.py erstellen, aber dieses Skript wird Sie durch den Prozess führen. (Update: Die Datei „main.py“ wurde versehentlich mitgeliefert. Es handelt sich jedoch nur um Beispiel 2. Sie wird gelöscht, aber Sie können jederzeit die Commit-Protokolle überprüfen, wenn Sie keine Ahnung haben.)
Erstellen Sie zunächst eine main.py im Stammverzeichnis des Projekts.
Für die Registrierung sind nur 2 Importe erforderlich. Sehen Sie sich diese unten an und kopieren Sie sie in Ihre main.py. Der erste wird benötigt, um ein Cloudflare Cross-Site Request Forgery-Token zu erhalten, und der zweite ist die Registrierungsfunktion selbst.
from assets . scripts . webdriver . csrf_cookie import get_csrf_cookie
from assets . scripts . register import register
(Optional)
from assets . scripts import make_fake_mail , make_fake_password , make_fake_username
make_fake_mail
: Gibt am Ende eine UUIDv4 + „@gmail.com“ zurück.
make_fake_password
: Gibt ein großes I + eine UUIDv4 + „!“ zurück. (um Passwortkriterien zu erfüllen)
make_fake_username
: Gibt einfach eine UUIDv4-Zeichenfolge zurück.
Dies ist die erste Sicherheitslücke: Nicht verifizierte E-Mail-Adressen, auch solche, die vollständig erfunden sind (z. B. [email protected]), sind zulässig und erhalten kostenlose API-Credits.
Hier ist ein Beispiel für die Ausführung des Codes:
from assets . scripts . webdriver . csrf_cookie import get_csrf_cookie
from assets . scripts . register import register
# get csrf token
__csrf_token : str = get_csrf_cookie ()
# register
register_response = register ( fake_email , fake_password , fake_username , fake_username , __csrf_token )
Dadurch wird ein Brennerkonto registriert und die Antwort von der Chub-API kopiert. Hier ist ein Beispielformat für register_response
:
{
"git_id" : 73017801 ,
"samwise" : " 2949skqo-901d-4f87-b22b-7c9b03221baf " ,
"username" : " ihatechildren "
}
Das einzige wirklich wichtige Objekt, das wir brauchen, ist der samwise
Token. Es dient der Authentifizierung.
Das Anmelden ist relativ einfach, wird aber meist nicht benötigt. Importieren Sie folgende Module:
from assets . scripts . webdriver . csrf_cookie import get_csrf_cookie
from assets . scripts . login import login
Um sich einzuloggen, müssen Sie folgende Parameter bereithalten:
get_csrf_cookie()
aufrufen.Rufen Sie dann die Login-Funktion auf
login_response = login ( csrf_cookie , email , password )
Dies ist das resultierende Ausgabeformat als Beispiel:
{
"git_id" : 73017801 ,
"samwise" : " 2949skqo-901d-4f87-b22b-7c9b03221baf " ,
"subscription" : 0 ,
"username" : " guatemalafan45 "
}
Nutzen Sie diesen, um den wichtigen samwise
-Token zu erhalten, wenn Sie bereits über ein Konto verfügen.
Jetzt müssen wir einen Dummy-Chat einrichten. Ich habe hierfür bereits einen Bot erstellt, mit dem ein Chat gestartet werden soll. Wir müssen einen Chat starten, da der API-Schlüssel erst initialisiert wird, wenn der Benutzer einen Chat startet. Der Code funktioniert nicht, wenn mein Dummy-Bot unter dem Endpunkt composed_view_3402/reference-endpoint-4dbc6dbef1b4
gelöscht wird. Sie können hier jedoch die Route eines beliebigen öffentlichen Bots eingeben. Ich empfehle einen Light-Bot, damit der Webdriver nicht viel Token-Verkehr verarbeiten muss. Ein Webdriver meldet sich dann an, besucht den Chat und ruft den API-Schlüssel ab, bevor er schnell schließt.
Importe:
from assets . scripts . create_chat import create_chat
Führen Sie die Funktion aus. Am besten nach Anmeldung. Hier ist ein Beispielausschnitt:
from assets . scripts . register import register
from assets . scripts . webdriver . csrf_cookie import get_csrf_cookie
from assets . scripts . create_chat import create_chat
__csrf_cookie = get_csrf_cookie ()
# register
register_response = register ( fake_email , fake_password , fake_username , fake_username , __csrf_cookie )
# make new chat
chat_id : int = create_chat ( register_response [ "samwise" ])
Die Methode create_chat
erfordert ein samwise
-Token, das Sie durch die Registrierung oder Anmeldung erhalten. Die Funktion create_chat
sendet zwei Anfragen – eine zum Erstellen der Chat-Ressource und eine für den Seitenaufruf.
Um mit den Mars- oder Mercury-LLMs mit einem Brennerkonto oder einem bestehenden Konto zu chatten, müssen wir noch unseren API-Schlüssel abrufen. Glücklicherweise erledigt dies die Funktion get_mars_token
für uns. Es heißt „get_mars_token“, aber das Token ist für alle Modelle verwendbar.
Importieren Sie zunächst das benötigte Modul
from assets . scripts . webdriver . mars_token import get_mars_token
Holen Sie sich dann Ihr Token, indem Sie die Funktion wie folgt aufrufen:
# get mars token for chat
MARS_TOKEN : str = get_mars_token ( fake_email , fake_password , chat_id )
Der Webdriver-Prozess bleibt bestehen, wenn Sie ihn nicht beenden! Auch dafür gibt es eine Funktion.
Importieren Sie es über:
from assets . scripts . webdriver import close_driver
Und rufen Sie dann die Funktion close_driver
auf. Tun Sie dies , NACHDEM Sie Ihren API-Schlüssel abgerufen haben.
Hier ist ein vollständiges Codebeispiel, um Ihren API-Schlüssel zu erhalten:
from assets . scripts . webdriver . mars_token import get_mars_token
from assets . scripts . webdriver . csrf_cookie import get_csrf_cookie
from assets . scripts . webdriver import close_driver
from assets . scripts . register import register
from assets . scripts . login import login
from assets . scripts . API . Chat import chat
from assets . scripts . API . parse_helper import parse_for_content
from assets . scripts . create_chat import create_chat
from assets . scripts import make_fake_mail , make_fake_password , make_fake_username
fake_username : str = make_fake_username ()
fake_email : str = make_fake_mail ()
fake_password : str = make_fake_password ()
# get csrf token
__csrf_token : str = get_csrf_cookie ()
# register
register_response = register ( fake_email , fake_password , fake_username , fake_username , __csrf_token )
# make new chat
chat_id : int = create_chat ( register_response [ "samwise" ])
# get mars token for chat
MARS_TOKEN : str = get_mars_token ( fake_email , fake_password , chat_id )
# close the webdriver
close_driver ()
print ( MARS_TOKEN )
Ausgabe (Hinweis: Die Selenium-Protokollierung wurde absichtlich für die Überflutung weggelassen. Teile der vertraulichen Informationen wurden mit „x“ geschwärzt.)
[...]
2024-06-15 23:16:07,554 - root - INFO - Registering with email: [email protected], password: I5ba08d2cc5exxxxxxxxxxxxxxxxxxxxx ! , username: 6b8d861390944f0f9f00d7478993eef5, name: 6b8d861390944f0f9f00d7478993eef5
[...]
CHK-2STMC397I00589C0Q5X6Uxxxxxxxxxxxxxxxxxxxxxxxxxx
Da wir nun unseren (Brenner-)API-Schlüssel mit 60 kostenlosen Anfragen haben, können wir mit den gehosteten LLMs chatten.
Die Importe sind:
from assets . scripts . API . Chat import chat
(Optional – Empfohlen für Streaming)
from assets . scripts . API . parse_helper import parse_for_content
Das optionale Modul ist in der Lage, das Token aus einem Event-Stream-Block zu extrahieren. Dies ist gut, um Wörter immer aus einem eingehenden Stream zu analysieren, anstatt dies manuell tun zu müssen.
Hier ist ein Beispiel für einen Chat-Anruf:
for chunk in chat (
MARS_TOKEN , # you need to get your API key first as well.
[
{
"role" : "system" ,
"content" : "You're a helpful assistant."
},
{
"role" : "user" ,
"content" : "Yo."
}
],
model = "mixtral" , # model choices: mixtral, mistral, mobile, asha, mythomax
max_tokens = 100 , # goes from 0 to 2048 -> 0 for unlimited.
):
print ( parse_for_content ( chunk ), end = '' , flush = True )
Ausgabe:
I'm a web developer from the UK. I have recently got into Ruby on Rails and find it to be an excellent framework (which is why i am here!).
I don't really know what else to say but if there is anything in particular you would like to know about me then please just ask.
I look forward to getting to know some of you!
Ja... es ist eine Menge Blödsinn. Nun, diese Modelle sind sowieso auf RP abgestimmt, also experimentieren Sie mit Ihren Eingabeaufforderungen. Ich persönlich kann nicht anders, aber Sie müssen das Modell nur in die Rolle eines ChatGPT-ähnlichen Assistenten versetzen und das wird hoffentlich den Zweck erfüllen.
Die chat
Funktion benötigt folgende Parameter:
CH_API_KEY : str , # your API key
messages : List [ Dict [ str , str ] ] , # A list of messages in OpenAI format.
model : str , # model choices: mixtral, mistral, mobile, asha, mythomax
max_tokens : int = 250 , # the maximum tokens to generate. Goes up to 2048 (Unconfirmed)
temperature : float = 0.8 , # the randomness of the generation. 0-2
top_p : float = 0.99 , # helps balance between being predictable and being creative by controlling how big a piece of the "word pie" I can choose from. (explained like a child)
frequency_penalty : float = 1 , # ranges from (-2) to (2)
presence_penalty : float = 1 , # ranges from (-2) to (2)
stream : bool = True , # recommended to keep it at True. False seems to be buggy mostly.
stop : List [ str ] = [ 'USER:' , '#' , '[' ] # stopping sequences. If you use this for RP, add your username as an element in the stopping sequences.
Hier ist das Chunk-Format, wenn Sie es nicht mit der ergänzten Funktion analysieren:
data: {"id": "459e62e9-bb18-423f-9403-079cdd9c597a", "object": "chat.completion", "created": "26", "model": "mixtral", "choices": [{"delta": {"content": "<a token will appear here>"}
Der letzte Teil:
data: [DONE]
from assets . scripts . webdriver . mars_token import get_mars_token
from assets . scripts . webdriver . csrf_cookie import get_csrf_cookie
from assets . scripts . webdriver import close_driver
from assets . scripts . register import register
from assets . scripts . API . Chat import chat
from assets . scripts . API . parse_helper import parse_for_content
from assets . scripts . create_chat import create_chat
from assets . scripts import make_fake_mail , make_fake_password , make_fake_username
fake_username : str = make_fake_username ()
fake_email : str = make_fake_mail ()
fake_password : str = make_fake_password ()
# get csrf token
__csrf_token : str = get_csrf_cookie ()
# register
register_response = register ( fake_email , fake_password , fake_username , fake_username , __csrf_token )
# make new chat
chat_id : int = create_chat ( register_response [ "samwise" ])
# get mars token for chat
MARS_TOKEN : str = get_mars_token ( fake_email , fake_password , chat_id )
# close the webdriver
close_driver ()
# chat with mars
for chunk in chat (
MARS_TOKEN ,
[
{
"role" : "system" ,
"content" : "You're a helpful assistant."
},
{
"role" : "user" ,
"content" : "Yo. Say hi please."
}
],
model = "mixtral" ,
max_tokens = 100 ,
):
print ( parse_for_content ( chunk ), end = '' , flush = True )