sample\hspinet\gemini.hsp » Plain Format
#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