1. はじめに
この Codelab では、写真の復元ツールである GlowUp を作成します。GlowUp は AI を使用して、古い写真、破損した写真、白黒写真を復元し、高品質の 4K カラー画像を作成します。このツールを使用すると、家族写真に新しい命を吹き込むことができます。また、破損したイラスト、図面、絵画などの画像を復元することもできます。
Genkit Go を使用してアプリケーション ロジックを実装し、Gemini 3 Pro Image(Nano Banana Pro とも呼ばれます)を写真の処理モデルとして使用します。
前提条件
- Go プログラミング言語に関する基本的な知識
- Google Cloud コンソールの基本知識
学習内容
- Go で Genkit アプリケーションを開発する方法
- フロー、プラグイン、プロンプトなどの Genkit の基本コンセプト
- Handlebar テンプレートを使用してプロンプトを作成する方法
- モデルのレスポンスから画像データを取得する方法
必要なもの
このワークショップはすべて Google Cloud Shell 内で実行できます。Google Cloud Shell には、必要なすべての依存関係(gcloud CLI、コードエディタ、Go、Gemini CLI)がプリインストールされています。
別の方法として、自分のマシンで作業する場合は、次のものが必要です。
- Go ツールチェーン(バージョン 1.24 以降)
- Node.js v20 以降(
genkitCLI の場合) gcloudCLI がインストールされているターミナル- VS Code などのコードを編集する IDE
- 推奨: Gemini CLI や Antigravity などのコーディング エージェント
主なテクノロジー
使用するテクノロジーについて詳しくは、以下をご覧ください。
- Gemini Nano Banana Pro(Gemini 3 Pro Image): 復元プロセスを支えるモデル
- Genkit Go: モデル呼び出しをオーケストレートするためのツールキット
2. 環境設定
この Codelab を自分のマシンで実行する場合は [Self-paced environment setup] を選択し、この Codelab をクラウドで実行する場合は [Start Cloud Shell] を選択します。
セルフペース型の環境設定
- Google Cloud Console にログインして、プロジェクトを新規作成するか、既存のプロジェクトを再利用します。Gmail アカウントも Google Workspace アカウントもまだお持ちでない場合は、アカウントを作成してください。



- プロジェクト名は、このプロジェクトの参加者に表示される名称です。Google API では使用されない文字列です。いつでも更新できます。
- プロジェクト ID は、すべての Google Cloud プロジェクトにおいて一意でなければならず、不変です(設定後は変更できません)。Cloud コンソールでは一意の文字列が自動生成されます。通常は、この内容を意識する必要はありません。ほとんどの Codelab では、プロジェクト ID(通常は
PROJECT_IDと識別されます)を参照する必要があります。生成された ID が好みではない場合は、ランダムに別の ID を生成できます。または、ご自身で試して、利用可能かどうかを確認することもできます。このステップ以降は変更できず、プロジェクトを通して同じ ID になります。 - なお、3 つ目の値として、一部の API が使用するプロジェクト番号があります。これら 3 つの値について詳しくは、こちらのドキュメントをご覧ください。
- 次に、Cloud のリソースや API を使用するために、Cloud コンソールで課金を有効にする必要があります。この Codelab の操作をすべて行って、費用が生じたとしても、少額です。このチュートリアルの終了後に請求が発生しないようにリソースをシャットダウンするには、作成したリソースを削除するか、プロジェクトを削除します。Google Cloud の新規ユーザーは、300 米ドル分の無料トライアル プログラムをご利用いただけます。
Cloud Shell を起動する
Google Cloud はノートパソコンからリモートで操作できますが、この Codelab では、Google Cloud Shell(Cloud 上で動作するコマンドライン環境)を使用します。
Google Cloud Console で、右上のツールバーにある Cloud Shell アイコンをクリックします。

プロビジョニングと環境への接続にはそれほど時間はかかりません。完了すると、次のように表示されます。

この仮想マシンには、必要な開発ツールがすべて用意されています。永続的なホーム ディレクトリが 5 GB 用意されており、Google Cloud で稼働します。そのため、ネットワークのパフォーマンスと認証機能が大幅に向上しています。この Codelab での作業はすべて、ブラウザ内から実行できます。インストールは不要です。
3. プロジェクトの設定
プロジェクトを作成する
まず、プロジェクトの新しいディレクトリを作成し、Go モジュールを初期化する必要があります。ターミナルで、次のコマンドを実行します。
mkdir -p glowup && cd glowup
go mod init glowup
Genkit CLI をインストールする
次に、Genkit CLI をインストールする必要があります。これにより、デベロッパー UI などのローカル デベロッパー ツールにアクセスできるようになります。ターミナル ウィンドウで次のように入力します。
curl -sL cli.genkit.dev | bash
環境変数を構成する
正しい Google Cloud 認証情報が設定されていることを確認します。your-project-id は、実際のプロジェクト ID に置き換えます。Gemini 3 Pro プレビュー モデル(Nano Banana Pro など)を使用する場合は、ロケーションを global にする必要があります。
export GOOGLE_CLOUD_PROJECT=$(gcloud config get project)
export GOOGLE_CLOUD_LOCATION=global
シェルモードで次のコマンドを実行して、Vertex AI API を有効にします。
gcloud services enable aiplatform.googleapis.com
ローカルマシン(Cloud Shell 以外)から実行している場合は、gcloud コマンドで認証する必要があります。
gcloud auth application-default login
4. 最初の Genkit アプリケーションを作成する
Genkit は、プロダクション レディな AI 搭載アプリケーションを構築、デプロイ、モニタリングするデベロッパーを支援するために設計されたオープンソース フレームワークです。このセクションでは、写真の復元ロジックに入る前に、フレームワークに慣れるために簡単な「Hello World」アプリケーションを作成します。
Genkit の用語
Genkit の使用を開始する前に、いくつかの重要な用語を理解しておくことが重要です。
- プラグイン: Genkit の機能を拡張するために使用されます。プラグインを介して、アプリケーションを強化する AI モデルを登録します。
- フロー: Genkit の主要なアーキテクチャ コンポーネント。一般的なフローでは、入力を受け取り、処理して出力を返します。必ずしもモデルを使用する必要はありませんが、ほとんどの場合、フロー内でモデルを使用します。
- プロンプト: dotprompt 形式で保存された(
*.promptファイルとして保存)インタラクション テンプレート。これらには、モデルの指示だけでなく、モデル名、モデル パラメータ、入力、出力などの構成も含まれます。
AI モデルとの接続
Genkit は、プラグインを使用してコードをモデル プロバイダに接続します。Google、Anthropic、OpenAI など、主要なモデル プロバイダ向けのプラグインがあります。また、プラグインを使用してローカルモデルに接続したり(Ollama を使用するなど)、Genkit の機能を拡張したり(MCP サーバーに接続するなど)することもできます。
Google モデルにアクセスするには、googlegenai プラグインを使用する必要があります。次の 2 つのバックエンドがサポートされています。
- Google AI: プロトタイピングに最適です。API キーを使用します。
- Vertex AI(Google Cloud): 本番環境におすすめします。プロジェクト ID とロケーションを使用します。
この Codelab では、ラボの開始時に作成したプロジェクトを参照して、Vertex AI 認証を使用します。
グリーター フローの作成
写真の復元フローを詳しく見ていく前に、コンセプトを理解し、セットアップが正しく機能していることを確認するための基本的なフローを構築しましょう。
フローは、AI ロジックをラップして次の機能を提供する特別な Genkit 関数です。
- 型安全な入力と出力: 静的検証とランタイム検証に Go 構造体を使用してスキーマを定義する
- ストリーミングのサポート: 部分的なレスポンスまたはカスタムデータをストリーミングする
- デベロッパー UI の統合: ビジュアル トレースを使用してフローをテストしてデバッグする
- 簡単なデプロイ: HTTP エンドポイントとして任意のプラットフォームにデプロイ
IDE を開き、プロジェクト ディレクトリに main.go ファイルを作成します。cloudshell を使用している場合は、次のコマンドを使用できます。
cloudshell edit main.go
次に、次のコードを追加します。
main.go
package main
import (
"context"
"log"
"os"
"os/signal"
"syscall"
"github.com/firebase/genkit/go/genkit"
"github.com/firebase/genkit/go/ai"
"github.com/firebase/genkit/go/plugins/googlegenai"
)
func main() {
ctx, cancel := signal.NotifyContext(context.Background(), os.Interrupt, syscall.SIGTERM)
defer cancel()
// Initialize Genkit with the Vertex AI plugin
g := genkit.Init(ctx,
genkit.WithPlugins(&googlegenai.VertexAI{}),
)
// Define the greeter flow
genkit.DefineFlow(g, "greeter", func(ctx context.Context, name string) (string, error) {
text, err := genkit.GenerateText(ctx, g,
ai.WithModelName("vertexai/gemini-2.5-pro"),
ai.WithPrompt("Say a warm and creative hello to %s", name),
)
if err != nil {
return "", err
}
return text, nil
})
// Register the flow here in the next steps
log.Println("GlowUp initialized. Ready for flows.")
<-ctx.Done()
}
ファイルを保存し、go mod tidy を実行して依存関係を更新します。
go mod tidy
上記のコードは、VertexAI プラグインで Genkit を初期化し、「greeter」という名前のフローを定義して、<-ctx.Done() で永久に待機します。フローを実際に実行する手順が指定されていないため、このプログラムがすぐに終了しないように実行を保留しています。
つまり、このプログラムをこのまま実行しても、それ自体ではあまり機能しません。フローを何らかの方法で呼び出す必要があります。実際の本番環境アプリケーションでは、このフローをウェブサーバーまたは CLI アプリにラップしますが、開発時には genkit CLI を使用してフローの開発と最適化を行うことができます。
genkit CLI は、Genkit スタックのモデル、プロンプト、フローなどのコンポーネントをテストするために開発されました。また、トレースも完全にサポートしているため、アプリケーションの内部動作を把握したい場合に非常に便利です。genkit CLI を使用してグリーター フローを起動するには、次のコマンドを実行します。
genkit start -- go run main.go
これにより、Telemetry API と Developer UI のエンドポイントが起動します。次のように表示されます。
$ genkit start -- go run main.go Telemetry API running on http://localhost:4033 Project root: /home/daniela/glowup Genkit Developer UI: http://localhost:4000
ブラウザで localhost:4000 を開いて、Dev-UI を起動します。次のような画面が表示されます。

時間をかけて Dev UI を確認します。「あいさつ」フローを 1 回だけトリガーして、その動作を確認します。
プロンプト テンプレートの使用
前の例のようにモデル呼び出しでプロンプトをハードコードすることもできますが、プロンプト テンプレートを作成してアプリケーションのすべてのプロンプトを一元的に保存する方が、より良い方法です。これにより、コードのメンテナンス時に見つけやすくなるだけでなく、フローとは独立してプロンプトを試すこともできます。
プロンプト テンプレートを定義するために、Genkit はオープンソースの dotprompt 形式を使用し、*.prompt ファイルとして保存します。.prompt ファイルは次の 2 つの部分で構成されます。
- Frontmatter: モデル、モデル パラメータ、入力スキーマと出力スキーマの両方を定義する YAML ブロック
- 本文: プロンプトの本文。"handlebars" 構文を使用してテンプレート化できます。たとえば、
variable-nameという名前の入力を定義した場合、本文で{{variable-name}}として参照できます。
プロジェクトのディレクトリ構造は次のようになります。
glowup/
├── main.go
└── prompts/
└── greeter.prompt
実際に見てみましょう。まず、プロンプトを保存するフォルダを作成します。
mkdir -p prompts
次に、greeter.prompt ファイルを作成します。
cloudshell edit prompts/greeter.prompt
次の内容を挿入します。
greeter.prompt

このプロンプトは、テンプレート言語の機能の一部を紹介しています。まず、フロントマターでモデル vertexai/gemini-2.5-flash を指定します。モデルを指定するには、それぞれのプラグインのドキュメントで定義されている命名規則を使用する必要があります。
config セクションでは、モデル パラメータを構成できます。温度 1.9 を使用して、モデルのクリエイティビティを高めています。Temperature の範囲は 0(一貫性のある出力)から 2(クリエイティブな出力)までです。このモデル パラメータやその他のモデル パラメータは、通常、モデルのモデルシートに公開されます。たとえば、gemini-2.5-flash のモデルシートは次のようになります。
入力セクションでは、プロンプトの引数を指定できます。この例では、名前を文字列として定義しています。フロントマターの後にプロンプト本文があります。最初のブロックはシステム プロンプトを定義し、2 番目のブロックはユーザー プロンプトです。これらの要素を組み合わせることで、非常に強力なプロンプト技術を実現できます。dotprompt のドキュメント全文はこちらをご覧ください。
次に、先ほど作成したプロンプトを使用するように greeter フローを調整します。
main.go
package main
import (
"context"
"os"
"os/signal"
"syscall"
"github.com/firebase/genkit/go/ai"
"github.com/firebase/genkit/go/genkit"
"github.com/firebase/genkit/go/plugins/googlegenai"
)
func main() {
ctx, cancel := signal.NotifyContext(context.Background(), os.Interrupt, syscall.SIGTERM)
defer cancel()
// Initialize Genkit with the Vertex AI plugin
g := genkit.Init(ctx,
genkit.WithPlugins(&googlegenai.VertexAI{}),
genkit.WithDefaultModel("vertexai/gemini-2.5-flash"),
)
// Define the greeter flow
genkit.DefineFlow(g, "greeter", func(ctx context.Context, name *string) (string, error) {
prompt := genkit.LookupPrompt(g, "greeter")
input := map[string]any{
"name": name,
}
resp, err := prompt.Execute(ctx, ai.WithInput(input))
if err != nil {
return "", err
}
return resp.Text(), nil
})
<-ctx.Done()
}
コマンドラインからフローを実行し、名前を指定した場合と指定しない場合で違いを確認します。名前なしで実行する:
genkit flow:run greeter
出力例:
$ genkit flow:run greeter Telemetry API running on http://localhost:4035 Running '/flow/greeter' (stream=false)... Result: "Hello there, absolutely delightful human!\n\nThe very moment your message arrived, the day instantly sparkled a little brighter. It's not just nice, it's genuinely **wonderful** to meet you!\n\nMay your entire day be filled with unexpected pockets of joy, effortless triumphs, and all the happiness you truly deserve! We're thrilled to have you here!"
名前を指定する場合:
genkit flow:run greeter '{"name":"Daniela"}'
出力例:
$ genkit flow:run greeter '{"name":"Daniela"}'
Telemetry API running on http://localhost:4035
Running '/flow/greeter' (stream=false)...
Result:
"Well hello there, Daniela! What a truly beautiful name, and what an absolute pleasure it is to meet you!\n\nRight from this moment, I just know your day is going to be brimming with positive energy and wonderful surprises. May it be filled with brilliant ideas, joyful moments, and the delightful realization that you're an amazing person doing incredible things. So glad you're here!"
テンプレートが想定どおりに機能していることがわかります。このプロジェクトを次のレベルに進める準備が整いました。
5. Nano Banana Pro で画像を復元する
復元プロンプト
Genkit の構成要素を理解したので、写真復元プロンプトを作成しましょう。
プロンプト ディレクトリに glowup.prompt という名前のファイルを作成し、次の内容を貼り付けます。
glowup.prompt

復元プロンプトは「グリーター」プロンプトと同じパターンに従いますが、いくつかの大きな違いがあります。
- 画像サイズ:
imageConfigのimageSizeプロパティは、Nano Banana Pro のモデル固有のパラメータです。これにより、出力サイズを 1K、2K、4K として指定できます。 - メディア入力:
{{ media }}テンプレートを使用して、ユーザー プロンプトに写真を挿入します。この手法により、マルチモーダル プロンプト(テキスト + 画像)をモデルに送信できます。
このプロンプトはデベロッパー UI でテストできます。出力を確認するために、自由に調整してください。
画像復元フロー
復元プロンプトの準備ができたので、CLI アプリケーションを構築しましょう。main.go の内容を次のコードに置き換えます。
main.go
package main
import (
"context"
"encoding/base64"
"errors"
"flag"
"fmt"
"log"
"mime"
"os"
"os/signal"
"strings"
"syscall"
"github.com/firebase/genkit/go/ai"
"github.com/firebase/genkit/go/genkit"
"github.com/firebase/genkit/go/plugins/googlegenai"
)
func main() {
url := flag.String("url", "", "url of the image to restore")
contentType := flag.String("contentType", "image/jpeg", "content type of the image (default: image/jpeg)")
flag.Parse()
ctx, cancel := signal.NotifyContext(context.Background(), os.Interrupt, syscall.SIGTERM)
defer cancel()
// Initialize Genkit with the Vertex AI plugin
g := genkit.Init(ctx,
genkit.WithPlugins(&googlegenai.VertexAI{}),
)
// Input schema for the glowUp flow
type Input struct {
URL string `json:"url,omitempty"`
ContentType string `json:"contentType,omitempty"`
}
glowup := genkit.DefineFlow(g, "glowUp", func(ctx context.Context, input Input) (string, error) {
// 1. Retrieve prompt
prompt := genkit.LookupPrompt(g, "glowup")
if prompt == nil {
return "", errors.New("prompt 'glowup' not found")
}
resp, err := prompt.Execute(ctx, ai.WithInput(input))
if err != nil {
return "", fmt.Errorf("generation failed: %w", err)
}
return resp.Media(), nil
})
// triggers the flow and returns the encoded response from the model
out, err := glowup.Run(ctx, Input{URL: *url, ContentType: *contentType})
if err != nil {
log.Fatalln(err)
}
// decodes image data and returns the appropriate file extension
data, ext, err := decode(out)
if err != nil {
log.Fatalln(err)
}
// writes restored file to disk
filename := "restored" + ext
if err := os.WriteFile(filename, data, 0644); err != nil {
log.Fatalln(err)
}
}
// decode returns the decoded data and the file extension appropriate for the mime type
func decode(text string) ([]byte, string, error) {
if !strings.HasPrefix(text, "data:") {
return nil, "", errors.New("unsupported enconding format")
}
text = strings.TrimPrefix(text, "data:")
parts := strings.Split(text, ";base64,")
mimeType := parts[0]
decoded, err := base64.StdEncoding.DecodeString(parts[1])
if err != nil {
return nil, "", err
}
ext, err := mime.ExtensionsByType(mimeType)
if err != nil {
return nil, "", err
}
return decoded, ext[0], nil
}
コードの構造は greeter フローと非常によく似ていますが、今回はスタンドアロンの CLI アプリケーションとして実行するように適応されています。永久にブロックする代わりに、glowUp フローを実行し、出力をデコードして、結果のバイナリデータをディスクに保存します。
モデルは画像データを次の形式で返すため、出力をデコードする必要があります。
data:<mime type>;base64,<base64 encoded image>
decode 関数では、文字列操作を使用して MIME タイプとエンコードされた画像の部分を分割しています。次に、mime.ExtensionByType 関数と base64.DecodeString 関数を使用して、ファイルの保存に必要な情報を抽出します。
復元フローのテスト
それでは、このフローを実際の写真で実行してみましょう。修復が必要な古い写真が手元にない場合は、米国議会図書館のウェブサイトから取得したこのパブリック ドメインの写真で試すことができます。

フローに渡す写真への直接リンクは次のとおりです。https://tile.loc.gov/storage-services/service/pnp/fsa/8c01000/8c01700/8c01765v.jpg
export IMAGE_URL="https://tile.loc.gov/storage-services/service/pnp/fsa/8c01000/8c01700/8c01765v.jpg"
go run main.go --url $IMAGE_URL
復元してカラー化した出力は次のとおりです。

完了しました。
6. glowUp をウェブサービスとしてデプロイする
コマンドライン アプリケーションではなく、ウェブサービスでフローを公開する場合は、Genkit の genkit.Handler アダプタを使用して、フローをエンドポイントに簡単に変換できます。次のコードは、genkit.Handler を使用して glowUp フローを glowUp エンドポイントとして登録します。
標準ライブラリの http パッケージを使用して通常どおりに、通常の HTTP サーバーで公開できますが、Genkit には、シャットダウン シグナルの正常な処理など、一般的なサーバー ボイラープレートの一部を処理する server プラグインも用意されています。
main.go の内容を次のコードに置き換えて、ウェブサーバーを作成します。
package main
import (
"context"
"errors"
"fmt"
"log"
"net/http"
"os"
"github.com/firebase/genkit/go/ai"
"github.com/firebase/genkit/go/genkit"
"github.com/firebase/genkit/go/plugins/googlegenai"
"github.com/firebase/genkit/go/plugins/server"
)
func main() {
ctx := context.Background()
PORT := os.Getenv("PORT")
if PORT == "" {
PORT = "8080"
}
listenAddr := ":" + PORT
// Initialize Genkit with the Vertex AI plugin
g := genkit.Init(ctx,
genkit.WithPlugins(&googlegenai.VertexAI{}),
)
// Input schema for the glowUp flow
type Input struct {
URL string `json:"url,omitempty"`
ContentType string `json:"contentType,omitempty"`
}
genkit.DefineFlow(g, "glowUp", func(ctx context.Context, input Input) (string, error) {
prompt := genkit.LookupPrompt(g, "glowup")
if prompt == nil {
return "", errors.New("prompt 'glowup' not found")
}
resp, err := prompt.Execute(ctx, ai.WithInput(input))
if err != nil {
return "", fmt.Errorf("generation failed: %w", err)
}
return resp.Media(), nil
})
log.Printf("GlowUp Flow Server started. Listening on %s", listenAddr)
mux := http.NewServeMux()
for _, flow := range genkit.ListFlows(g) {
mux.HandleFunc("POST /"+flow.Name(), genkit.Handler(flow))
}
if err := server.Start(ctx, listenAddr, mux); err != nil {
// Check if the error is due to context cancellation
if ctx.Err() != nil {
log.Println("GlowUp server shutting down gracefully...")
return
}
log.Fatal(err)
}
}
このサービスはローカルまたはクラウドで実行できます。ローカルで実行するには、プログラムが完成したため、ファイルを直接実行するだけで済みます。genkit CLI を介して起動する必要はありません。次に例を示します。
go run main.go
これはブロッキング オペレーションであるため、テストするには 2 つ目のターミナルを起動する必要があります。最も簡単な方法は、curl コマンドを使用することです。
curl -sS -X POST http://localhost:8080/glowUp \
-H "Content-Type: application/json" \
-d '{"data":{"url": $IMAGE_URL, "contentType":"image/jpeg"}}' \
> result.json
これはサーバー レスポンスであるため、base64 画像をデコードする必要があります。
cat result.json | jq -r '.result' | awk -F ',' '{print $2}' | base64 -d > restored.png
ウェブサービスを Cloud Run にデプロイする
このサーバーが「自分のマシンで動作する」のは問題ありませんが、理想的には、すべてのユーザーがアクセスできる場所にデプロイします。このようなサービスをデプロイする最も便利な方法の 1 つは、Cloud Run のソースからのデプロイ機能を使用することです。この機能を使用すると、コンテナを自分でビルドする必要がなく、すべてが自動化されます。
ソースからのデプロイを使用してこのサービスを Cloud Run にデプロイするには、次のコマンドを実行します(プロジェクト ID はご自身のものに置き換えてください)。
gcloud run deploy glowup --source . --region us-central1 --no-allow-unauthenticated --set-env-vars GOOGLE_GENAI_USE_VERTEXAI=True,GOOGLE_CLOUD_LOCATION=$GOOGLE_CLOUD_LOCATION,GOOGLE_CLOUD_PROJECT=$GOOGLE_CLOUD_PROJECT
デプロイの完了には数分かかることがあります。完了したら、curl を介して別のリクエストを送信して、エンドポイントをテストできます。
GLOWUP_URL=$(gcloud run services describe glowup --region us-central1 --format='value(status.url)')
curl -X POST "$GLOWUP_URL/glowUp" \
-H "Authorization: Bearer $(gcloud auth print-identity-token)" \
-H "Content-Type: application/json" \
-d "{\"data\":{\"url\":\"$IMAGE_URL\", \"contentType\":\"image/jpeg\"} }" \
> result.json
ここでも、base64 画像をデコードする必要があります。
cat result.json | jq -r '.result' | awk -F ',' '{print $2}' | base64 -d > restored_cloudrun.png
これで、写真復元ウェブサーバーが完全に動作するようになりました。
省略可: クライアント アプリケーションの「バイブ コーディング」
手動でコードを作成するのは楽しいですが、特定の種類のプロジェクトを以前に実施したことがない場合は、難しいこともあります。幸いなことに、現在ではコーディング エージェントを使用してプロセスを高速化できます。
このステップでは、コードを自分で記述する代わりに、Gemini CLI(またはお気に入りのコーディング エージェント)に作業を依頼します。次のプロンプトを使用します。
GlowUp is a photo restoration service that takes a restoration request as input and returns a restored picture as output. Your task is to create a client application that uses this server to process image urls and save a restored file locally.
TODO:
- Write a CLI application that receives three arguments: an url (required), content type (optional, defaults to image/jpeg) and addr (server address, optional, defaults to localhost:8080)
- The CLI should send a POST request to the /glowUp endpoint in the server with the body '{"data":{"url": <url>, "contentType": <contentType>} }'
- The server response should be parsed by stripping the "data:" prefix. The remainder will have the format <mimeType>;base64,<encoded imageData>
- Extract the mime type and convert to a file extension using the mime package
- Extract the image data and decode it using the base64 package
Save a file named "restored" + the detected file extension
Acceptance Criteria:
- The client builds successfully
- Use the client to restore the image https://tile.loc.gov/storage-services/service/pnp/fsa/8c01000/8c01700/8c01765v.jpg
- Check that restored.png exists after processing the image above
同じモジュールに 2 つの「main」関数を含めることはできないため、エージェントはファイルを少し再編成する必要がある場合があります。動作を確認し、必要に応じてサーバーコードやスニペットを提供して、正しい実装に導きます。
ラボ後のクリーンアップ
7. まとめ
おめでとうございます!Genkit と Nano Banana Pro を使用して、忠実度の高い写真復元アプリを構築できました。
この Codelab では、以下の方法を学習しました。
- Genkit Go アプリケーションを開発するように環境を構成する
dotpromptを使用してマルチモーダル プロンプトを作成する- プロンプト テンプレートを使用して Genkit フローを作成する
- Nano Banana Pro を使用して画像を処理する
- Genkit フローをコマンドライン アプリケーションとウェブサービスとしてパッケージ化する
- Genkit アプリケーションを Cloud Run にデプロイする
テストが完了したら、環境をクリーンアップします。
次のステップ
このプラットフォームの他の Codelab を試したり、glowUp を独自に改善したりして、学習を続けることができます。
改善案が必要な場合は、以下をお試しください。
- glowUp CLI を有効にしてローカル ファイルを復元する
- GlowUp ウェブサービスのフロントエンドを作成する
- データから MIME タイプを自動的に検出する
- その他のタイプの画像処理(写真から絵画、絵画から写真、スケッチから最終的なアートなど)を実行します。
- クライアントを作成または改善する(スマートフォン アプリを構築するなど)
可能性は無限大です。自分で進めるのが少し不安な場合は、Gemini CLI や Antigravity などのコーディング エージェントの助けを借りることもできます。Genkit をさらに活用したい場合は、Genkit MCP サーバーとペア設定されたコーディング エージェントを使用すると、作業が大幅に楽になります。
最後に、このリポジトリの完全なコードにアクセスする場合は、こちらをご覧ください。
ぜひコーディングにお役立てください。