gemini.hsp

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