Deutsch
Quelltexte/ Codesnippets

ChatGPT API in XProfan verwenden (per cURL)

 

Sven
Bader
Die mächtige Sache hieran ist eigentlich die Verwendung von cURL, da sich so komplexe Web-Anfragen per POST auch JSON kodiert versenden lassen. cURL ist seit 2018 Teil von Windows 10 und auch in Windows 11 verfügbar, mit Windows 7/8 wird es nicht ohne weiteres gehen.

Die Antwort wird dann aus der Konsole geholt.

Ihr benötigt einen eigenen API-Schlüssel. Man muss zwar ein paar Dollar hinterlegen aber ich habe nach rund 100 (kleineren) Anfragen gerade einmal einen Cent verbraucht. (  [...]  )

Der Code funktioniert mit X4 aber auch mit XProfan 10. Viel Spaß beim Testen
 $H Windows.ph
Def GetSysColor(1)      !"USER32", "GetSysColor"'Systemfarben abfragen

Proc Utf8Decode

    'in neueren XProfan Versionen wird automatisch die gleichnamige interne Funktion verwendet
    Parameters utf8$
    Declare ansistring$, unicode$, laenge&
    laenge& = len(utf8$) * 2
    unicode$ = mkstr$(chr$(0),laenge&)
    ~MultiByteToWideChar(~CP_UTF8,0,Addr(utf8$),-1,Addr(unicode$),laenge&)
    ansistring$ = mkstr$(chr$(0),laenge&)
    ~WideCharToMultiByte(~CP_ACP,0,Addr(unicode$),-1,Addr(ansistring$),laenge&,0,0)
    ansistring$ = substr$(ansistring$,1,chr$(0))
    Return ansistring$

EndProc

Proc CMDOut

    'ursprünglich von Andreas Miethe
    Parameters Progname$,Command$,MemBuffer&
    Struct PROCESS_INFORMATION = hProcess&,hThread&,dwProcessId&,dwThreadId&
    Struct SECURITY_ATTRIBUTES =  nLength&,lpSecurityDescriptor&,bInheritHandle&
    Struct STARTUPINFO =cb&,lpReserved&,lpDesktop&,lpTitle&,dwX&,dwY&,dwXSize&,dwYSize&,dwXCountChars&,dwYCountChars&,dwFillAttribute&,dwFlags&,wShowWindow%,cbReserved2%,lpReserved2&,hStdInput&,hStdOutput&,hStdError&
    Def &NORMAL_PRIORITY_CLASS  $20
    Def &STARTF_USESTDHANDLES  $100
    Def &STARTF_USESHOWWINDOW  $1
    Declare hRPipe&,hWPipe&,pRBytes&,Result&
    Declare PI#,SI#,SA#, out$
    Dim PI#,PROCESS_INFORMATION
    Dim SI#,STARTUPINFO
    Dim SA#,SECURITY_ATTRIBUTES
    Declare StringBuffer$, output$
    StringBuffer$ = Space$(MemBuffer&)
    SA#.nLength& =SizeOf(SA#)
    SA#.bInheritHandle& = 1
    SA#.lpSecurityDescriptor& = 0
    Result& = ~CreatePipe(Addr(hRPipe&), Addr(hWPipe&), SA#, 0)

    If Result& = 0

        Return ""'MessageBox("Pipe konnte nicht gestartet werden","",0)

    EndIf

    If Progname$ <> ""

        Command$ = " " + Command$

    EndIf

    SI#.cb& = SizeOf(SI#)
    SI#.dwFlags& = &STARTF_USESHOWWINDOW | &STARTF_USESTDHANDLES
    SI#.hStdOutput& = hWPipe&
    SI#.hStdError& = hWPipe&

    If Progname$ = ""

        Result& = ~CreateProcess(0, Addr(Command$), SA#, SA#, 1, &NORMAL_PRIORITY_CLASS, 0, 0, SI#,PI#)

    Else

        Result& = ~CreateProcess(Addr(Progname$), Addr(Command$),SA#,SA#,1,&NORMAL_PRIORITY_CLASS, 0, 0,SI#,PI#)

    EndIf

    If Result& <> 1

        Return ""'MessageBox("Datei nicht gefunden","",0)

    EndIf

    Result& = ~CloseHandle(hWPipe&)

    While Result& <> 0

        Result& = ~ReadFile(hRPipe&,Addr(StringBuffer$),MemBuffer&,Addr(pRBytes&), 0)

        If pRBytes& > 0

            Out$ = Left$(StringBuffer$,pRBytes&)
            output$ = output$ + Out$

        EndIf

    EndWhile

    ~CloseHandle(PI#.hProcess&)
    ~CloseHandle(PI#.hThread&)
    ~CloseHandle(hRPipe&)
    Dispose PI#
    Dispose SI#
    Dispose SA#
    output$ = Utf8Decode(output$)
    Return output$

EndProc

WindowStyle 1+2+4+8+16
WindowTitle "ChatGPT"
Window 100,100 - 650,600;0
Cls GetSysColor(15)'Fensterfarbe
UserMessages 16
UseFont "Tahoma",15,0,0,0,0'Standardfont
SetDialogFont 1
Declare edit&,font&[10],button&,text&
Font&[1] = Create("Font","Tahoma",15,0,0,0,0)'normal
text& = Create("Text",%hWnd,"", 20, 20, 600, 320)
Edit& = Create("MultiEdit", %hWnd, "", 20, 400, 600, 96)
button& = Create("Button", %hWnd, "Senden", 20, 500, 600, 24)
SetFont Edit&,font&[1]

Proc GPT

    Parameters prompt$
    Declare api_key$, endpoint$, payload$, response$,responseJson$, content$,model$,curl_exe$
    Declare curl_command$
    curl_exe$ =  trim$(CMDOut("", "where curl", 8192))
    api_key$  = "sk-proj-..........................................................................................."
    endpoint$ = "https://api.openai.com/v1/chat/completions"
    content$  = ""'Vorabbriefing, z.B. "Du bist Yoda aus Star Wars."
    model$    = "gpt-4o-mini"
    payload$ = "{\\\qmodel\\\q:\\\q" + model$ + "\\\q,\\\qmessages\\\q:[{\\\qrole\\\q:\\\qsystem\\\q,\\\qcontent\\\q:\\\q" + content$ + "\\\q},{\\\qrole\\\q:\\\quser\\\q,\\\qcontent\\\q:\\\q" + prompt$ + "\\\q}]}"
    curl_command$ = curl_exe$ + " -s -k -X POST " + endpoint$ + " -H \qAuthorization: Bearer " + api_key$ + "\q -H \qContent-Type: application/json\q -d \q" + payload$ + "\q"
    responseJson$ =  CMDOut("", curl_command$, 8192)
    'Man könnte auch die JSON Funktionen von XProfan X4 verwenden, aber nicht ohne Umwege über eine Datei
    response$ =  translate$(responseJson$,"\\\q", "\\q")' \" in XProfan-Syntax umwandeln (noch escaped)
    response$ =  Substr$(response$,2, "\qcontent\q: \q")' Antwort extrahieren
    response$ =  Substr$(response$,1, "\q")' Antwort extrahieren
    response$ =  translate$(response$,"\\q", "\q")' Anführungszeichen final kodieren
    response$ =  translate$(response$,"\\n","\n" )' Zeilenumbrüche

    If (response$ = "")

        SetText text&,  responseJson$

    Else

        SetText text&,  response$

    EndIf

EndProc

WhileNot (%umessage = 16)

    WaitInput

    If Clicked(button&)

        GPT(gettext$(edit&))

    EndIf

EndWhile

 
vor 11 Tagen  
 



Zum Quelltext


Thementitel, max. 100 Zeichen.
 

Systemprofile:

Kein Systemprofil angelegt. [anlegen]

XProfan:

 Beitrag  Schrift  Smilies  ▼ 

Bitte anmelden um einen Beitrag zu verfassen.
 

Themenoptionen

108 Betrachtungen

Unbenanntvor 0 min.
HofK vor 3 Tagen
Walter vor 4 Tagen
R.Schneider vor 7 Tagen
Peter Max Müller vor 8 Tagen
Mehr...

Themeninformationen

Dieses Thema hat 1 Teilnehmer:

Sven Bader (1x)


Admins  |  AGB  |  Anwendungen  |  Autoren  |  Chat  |  Datenschutz  |  Download  |  Eingangshalle  |  Hilfe  |  Händlerportal  |  Impressum  |  Mart  |  Schnittstellen  |  SDK  |  Services  |  Spiele  |  Suche  |  Support

Ein Projekt aller XProfaner, die es gibt!


Mein XProfan
Private Nachrichten
Eigenes Ablageforum
Themen-Merkliste
Eigene Beiträge
Eigene Themen
Zwischenablage
Abmelden
 Deutsch English Français Español Italia
Übersetzungen

Datenschutz


Wir verwenden Cookies nur als Session-Cookies wegen der technischen Notwendigkeit und bei uns gibt es keine Cookies von Drittanbietern.

Wenn du hier auf unsere Webseite klickst oder navigierst, stimmst du unserer Erfassung von Informationen in unseren Cookies auf XProfan.Net zu.

Weitere Informationen zu unseren Cookies und dazu, wie du die Kontrolle darüber behältst, findest du in unserer nachfolgenden Datenschutzerklärung.


einverstandenDatenschutzerklärung
Ich möchte keinen Cookie