#use strict #use hspinet ; ; Google Geminiに接続、プロンプトを送信して結果を取得します ; apikey="" url="https://generativelanguage.googleapis.com/v1beta/models/" aistudio="https://aistudio.google.com/" logfile="jsonlog.txt" gmodels="ngemini-2.0-flash\ngemini-2.0-flash-lite\ngemini-1.5-flash\ngemini-1.5-flash-8b\ngemini-1.5-pro" curmodel=0 curmodel_str="" sdim s1,256 sdim s2,256 sdim s3,256 _lf="*":poke _lf,0,10 sdim buf,$10000 sdim wrt,$10000 ; 結果出力用バッファ sdim mystr,256 mystr="HSP3というプログラミング言語を知っていますか?" wx=ginfo_sx:wy=ginfo_sy netinit if stat : dialog "ネット接続できません。" : end *setapi ; APIのセット ; if apikey!="" : goto *gui_main ; cls 1 mes "API Key:" objsize 320,24 input apikey objsize 160,24 pos 340,18 button "OK",*setapi pos 0,88 mes "Geminiに接続するためには、まず最初にAPI Keyが必要です。" mes "API Keyはユーザー個別に取得する必要がある秘密鍵の文字列です。" mes "API Keyそのものや、API Keyを含むスクリーンショットを公開しないよう注意してください。" mes "" button "APIを取得する",*go_api stop *go_api ; WEBへ exec aistudio,16 stop *gui_main ; URLを指定 neturl url netheader "Content-Type: application/json\n\n" ; UI ; cls 1 mes "質問:" objsize wx,24 input mystr id_mystr=stat objsize 160,24 button "OK",*sendapi_main objsize 240,24 pos wx-240,44 combox curmodel,,gmodels sy=380 pos 0,wy-sy mes "答え:" mesbox wrt,wx,sy,1 id_wrt=stat stop *sendapi_main ; 入力欄を無効に objenable id_mystr,0 wait 1 ; モデルを設定 notesel gmodels noteget curmodel_str,curmodel mystr_utf8="" nkfcnv mystr_utf8,mystr,"Swd" ; UTF8形式に変換 ; POST形式でCGIにパラメーターを渡す prm = "{"+_lf prm += " \"contents\": [{"+_lf prm += " \"parts\":[{\"text\": \""+mystr_utf8+"\"}]"+_lf prm += " }]"+_lf prm += " }"+_lf ; プログレスバー anim=0:px=16:py=16 ; リクエスト netrequest_post curmodel_str+":generateContent?key="+apikey, prm res=0 *main ; 結果待ちのためのループ x=0:y=68 repeat wx/px i=((anim+cnt)&15)*16 color i,i,i boxf x,y,x+px,y+py x+=px loop anim++ netexec res if res > 0 : goto *comp if res < 0 : goto *bad await 1000/30 goto *main *bad ; エラー neterror s1 buf="ERROR:"+s1 goto *comp2 *comp ; 完了 netgetv buf ;nkfcnv res,buf,"sc" ; HSPの形式に変換 if logfile!="" { ; ログを保存 notesel buf notesave logfile } *comp2 sdim wrt,$10000 ; 結果出力用バッファ sdim jstr,$10000 jroot=0 j_error=0 j_candidates=0 j_content=0 j_parts=0 j_text=0 jsonnkf "Wsc" ; utf8->sjisへの変換指定 jsonopen jroot,buf jsongetobj j_error,"error",jroot if j_error!=0 : goto *err_getmsg jsongetobj j_candidates,"candidates" if j_candidates=0 : goto *err_invalid jsongetarrayobjbyname j_content,"content",j_candidates if j_content=0 : goto *err_invalid jsongetobj j_parts,"parts",j_content if j_parts=0 : goto *err_invalid jsongetarrayobj j_text,j_parts,0 if j_text=0 : goto *err_invalid jsongets jstr, "text", j_text wrt=jstr goto *compov *err_getmsg jsongets jstr, "message", j_error wrt="サーバーのエラーです:\n"+jstr goto *compov *err_invalid wrt="サーバーの無効な応答です:\n"+buf goto *compov *compov jsonclose goto *gui_main