この記事では、Azure OpenAI Starter Kit を使用してAzure OpenAI リソースをデプロイし、小さな hello world アプリを実行する方法について説明します。 アプリでは、Microsoft Entra ID認証と OpenAI SDK を使用して、Azure OpenAI Responses API を呼び出します。
この記事の終わりまでに、次の操作を行います。
- Azure Developer CLI を使用して、GPT-5-mini Azure OpenAI をデプロイします。
- API キーではなく、Microsoft Entra IDで認証するローカル アプリを実行します。
- 1 つの要求を Responses API に送信し、モデルの出力を出力します。
Note
この記事では、例の基礎として Azure OpenAI スターター キットを使用します。 スターター キットには、コードとしてのインフラストラクチャ、Azure Developer CLI の構成、および複数のプログラミング言語のクライアント例が含まれています。
Cost
この記事で作成Azureリソースは、Azure サブスクリプションに課金されます。 継続的な料金を回避するには、記事の終了時にリソースをクリーンアップします。
Prerequisites
この記事を完了するには、以下が必要です。
- Azure サブスクリプション。 無料で作成できます。
- サブスクリプションにAzureリソースとロールの割り当てを作成するためのアクセス許可 (OwnerUser Access Administrator など)。
- Git。
- Azure CLI。
- Azure Developer CLI
- Python 3.8 以降。
- .NET SDK 10 以降。 スターター キットでは、ファイルベースの C# アプリとパッケージ ディレクティブを使用します。
- Node.js 18 以降。
- Go 1.25.1 以降。
- Java 21 以降。
- Maven 3.9 以降。
コードを取得する
Azure OpenAI Starter Kit リポジトリを複製し、プロジェクト フォルダーを開きます。
git clone https://github.com/Azure-Samples/azure-openai-starter.git
cd azure-openai-starter
Azure にサインインする
Azure CLIと Azure Developer CLI の両方でサインインします。
az login
azd auth login
アカウントが複数のテナントにアクセスできる場合は、アクティブなテナントがリソースをデプロイするテナントであることを確認します。
az account show --query tenantId -o tsv
Azure OpenAI をデプロイ
リポジトリ ルートから次の Azure Developer CLI コマンドを実行します。
azd up
プロンプトに回答するには、次のガイダンスを使用します。
| プロンプト | 回答 |
|---|---|
| 環境名 |
aoai-helloなど、短い小文字の名前を使用します。 この値は、Azure のリソース名で使用されます。 |
| サブスクリプション | リソースを作成するサブスクリプションを選択します。 |
| 場所 | 近くのリージョンを選択します。 |
| Azure OpenAI モデルの場所 | GPT-5-mini が使用可能なリージョンを選択します。 |
通常、デプロイには数分かかります。 コマンドが完了すると、スターター キットによって Azure OpenAI がプロビジョニングされ、GPT-5-mini モデルがデプロイされます。
ローカル環境を構成する
hello world アプリは、Azure サインインを使用してMicrosoft Entraアクセス トークンを取得します。 OpenAI クライアントによって使用されるエンドポイントを設定します。
export AZURE_OPENAI_ENDPOINT=$(azd env get-value AZURE_OPENAI_ENDPOINT)
export AZURE_OPENAI_DEPLOYMENT=$(azd env get-value AZURE_OPENAI_GPT_DEPLOYMENT_NAME)
export AZURE_TENANT_ID=$(az account show --query tenantId -o tsv)
Tip
Azure OpenAI は、API 呼び出しでデプロイ名を使用します。 スターター キットは、GPT-5-mini デプロイ名を AZURE_OPENAI_GPT_DEPLOYMENT_NAMEとして出力します。 この記事では、その値を AZURE_OPENAI_DEPLOYMENT にマップして、言語間でコードが同じになるようにします。
hello world アプリを作成して実行する
hello_world_entra.py フォルダーに src/python という名前のファイルを作成します。
import os
from azure.identity import DefaultAzureCredential, get_bearer_token_provider
from openai import OpenAI
endpoint = os.environ["AZURE_OPENAI_ENDPOINT"].rstrip("/")
deployment = os.getenv("AZURE_OPENAI_DEPLOYMENT", "gpt-5-mini")
token_provider = get_bearer_token_provider(
DefaultAzureCredential(),
"https://cognitiveservices.azure.com/.default",
)
client = OpenAI(
base_url=f"{endpoint}/openai/v1/",
api_key=token_provider,
)
response = client.responses.create(
model=deployment,
input="Say hello from Azure OpenAI in one sentence.",
max_output_tokens=300,
)
print(response.output_text)
Pythonの依存関係をインストールし、アプリを実行します。
cd src/python
python -m pip install -r requirements.txt
python hello_world_entra.py
hello_world_entra.cs フォルダーに src/dotnet という名前のファイルを作成します。
#!/usr/bin/dotnet run
#:package OpenAI@2.9.1
#:package Azure.Identity@1.*
using System;
using System.ClientModel.Primitives;
using Azure.Identity;
using OpenAI;
using OpenAI.Responses;
#pragma warning disable OPENAI001
string endpoint = Environment.GetEnvironmentVariable("AZURE_OPENAI_ENDPOINT")
?? throw new InvalidOperationException("Set AZURE_OPENAI_ENDPOINT.");
string deployment = Environment.GetEnvironmentVariable("AZURE_OPENAI_DEPLOYMENT")
?? "gpt-5-mini";
BearerTokenPolicy tokenPolicy = new(
new DefaultAzureCredential(),
"https://cognitiveservices.azure.com/.default");
OpenAIClientOptions options = new()
{
Endpoint = new Uri($"{endpoint.TrimEnd('/')}/openai/v1/")
};
ResponsesClient client = new(tokenPolicy, options);
ResponseResult response = await client.CreateResponseAsync(
deployment,
"Say hello from Azure OpenAI in one sentence.",
null);
Console.WriteLine(response.GetOutputText());
アプリを実行します。
cd src/dotnet
dotnet run hello_world_entra.cs
hello_world_entra.ts フォルダーに src/typescript という名前のファイルを作成します。
import OpenAI from "openai";
import { DefaultAzureCredential, getBearerTokenProvider } from "@azure/identity";
const endpoint = process.env.AZURE_OPENAI_ENDPOINT;
if (!endpoint) {
throw new Error("Set AZURE_OPENAI_ENDPOINT.");
}
const deployment = process.env.AZURE_OPENAI_DEPLOYMENT ?? "gpt-5-mini";
const tokenProvider = getBearerTokenProvider(
new DefaultAzureCredential(),
"https://cognitiveservices.azure.com/.default"
);
const client = new OpenAI({
baseURL: `${endpoint.replace(/\/+$/, "")}/openai/v1/`,
apiKey: tokenProvider as any,
});
const response = await client.responses.create({
model: deployment,
input: "Say hello from Azure OpenAI in one sentence.",
max_output_tokens: 300,
});
console.log(response.output_text);
TypeScript の依存関係をインストールし、アプリを実行します。
cd src/typescript
npm install
npx tsx hello_world_entra.ts
hello_world_entra.go フォルダーに src/go/responses_example_entra という名前のファイルを作成します。
package main
import (
"context"
"fmt"
"log"
"net/http"
"os"
"strings"
"github.com/Azure/azure-sdk-for-go/sdk/azcore/policy"
"github.com/Azure/azure-sdk-for-go/sdk/azcore/runtime"
"github.com/Azure/azure-sdk-for-go/sdk/azidentity"
"github.com/openai/openai-go/v3"
"github.com/openai/openai-go/v3/option"
"github.com/openai/openai-go/v3/responses"
)
type policyAdapter option.MiddlewareNext
func (adapter policyAdapter) Do(req *policy.Request) (*http.Response, error) {
return (option.MiddlewareNext)(adapter)(req.Raw())
}
func newClient(endpoint string) openai.Client {
const scope = "https://cognitiveservices.azure.com/.default"
credential, err := azidentity.NewDefaultAzureCredential(nil)
if err != nil {
log.Fatalf("Failed to create DefaultAzureCredential: %s", err)
}
bearerTokenPolicy := runtime.NewBearerTokenPolicy(
credential,
[]string{scope},
nil,
)
return openai.NewClient(
option.WithBaseURL(strings.TrimRight(endpoint, "/")+"/openai/v1/"),
option.WithMiddleware(func(req *http.Request, next option.MiddlewareNext) (*http.Response, error) {
pipeline := runtime.NewPipeline(
"aoai-hello-world",
"",
runtime.PipelineOptions{},
&policy.ClientOptions{
PerRetryPolicies: []policy.Policy{
bearerTokenPolicy,
policyAdapter(next),
},
},
)
pipelineRequest, err := runtime.NewRequestFromRequest(req)
if err != nil {
return nil, err
}
return pipeline.Do(pipelineRequest)
}),
)
}
func main() {
endpoint := os.Getenv("AZURE_OPENAI_ENDPOINT")
if endpoint == "" {
log.Fatal("Set AZURE_OPENAI_ENDPOINT.")
}
deployment := os.Getenv("AZURE_OPENAI_DEPLOYMENT")
if deployment == "" {
deployment = "gpt-5-mini"
}
client := newClient(endpoint)
response, err := client.Responses.New(context.Background(), responses.ResponseNewParams{
Model: deployment,
Input: responses.ResponseNewParamsInputUnion{
OfString: openai.String("Say hello from Azure OpenAI in one sentence."),
},
MaxOutputTokens: openai.Int(300),
})
if err != nil {
log.Fatalf("Failed to create response: %s", err)
}
fmt.Println(response.OutputText())
}
アプリを実行します。
cd src/go/responses_example_entra
go run hello_world_entra.go
HelloWorldEntra.java フォルダーに src/java/src/main/java/com/azure/openai/starter という名前のファイルを作成します。
package com.azure.openai.starter;
import com.azure.identity.AuthenticationUtil;
import com.azure.identity.DefaultAzureCredentialBuilder;
import com.openai.client.OpenAIClient;
import com.openai.client.okhttp.OpenAIOkHttpClient;
import com.openai.credential.BearerTokenCredential;
import com.openai.models.responses.Response;
import com.openai.models.responses.ResponseCreateParams;
import java.util.function.Supplier;
public class HelloWorldEntra {
public static void main(String[] args) {
String endpoint = System.getenv("AZURE_OPENAI_ENDPOINT");
if (endpoint == null || endpoint.isBlank()) {
throw new IllegalStateException("Set AZURE_OPENAI_ENDPOINT.");
}
String deployment = System.getenv().getOrDefault(
"AZURE_OPENAI_DEPLOYMENT",
"gpt-5-mini");
Supplier<String> bearerTokenSupplier = AuthenticationUtil.getBearerTokenSupplier(
new DefaultAzureCredentialBuilder().build(),
"https://cognitiveservices.azure.com/.default");
OpenAIClient client = OpenAIOkHttpClient.builder()
.baseUrl(endpoint.replaceAll("/+$", "") + "/openai/v1/")
.credential(BearerTokenCredential.create(bearerTokenSupplier))
.build();
Response response = client.responses().create(
ResponseCreateParams.builder()
.model(deployment)
.input(ResponseCreateParams.Input.ofText(
"Say hello from Azure OpenAI in one sentence."))
.maxOutputTokens(300)
.build());
System.out.println(response.output());
}
}
アプリを実行します。
cd src/java
mvn compile exec:java -Dexec.mainClass="com.azure.openai.starter.HelloWorldEntra"
正確な出力形式は SDK によって異なります。 デプロイされた Azure OpenAI モデルからの出力が表示されます。これには短いあいさつ文が含まれています。
Hello from Azure OpenAI! I'm running on your Azure OpenAI deployment and ready to help.
コードを理解する
hello world アプリには、次の 3 つの重要な部分があります。
-
DefaultAzureCredentialは、ローカル Azure サインインからMicrosoft Entra トークンを取得します。 - OpenAI クライアントは、Azure OpenAI v1 エンドポイント (
/openai/v1/) を指します。 -
model値は、Azure OpenAI デプロイ名です。 このスターター キットでは、デプロイ名はgpt-5-mini。
Python アプリでは、openai パッケージと azure-identity が使用されます。
get_bearer_token_provider ヘルパーは、OpenAI クライアントがその資格情報として使用できるトークン プロバイダーを作成します。
C# アプリでは、OpenAI パッケージと Azure.Identity が使用されます。
BearerTokenPolicy は、ResponsesClient によって送信された要求にMicrosoft Entra トークンを追加します。
TypeScript アプリでは、openaiで@azure/identity パッケージが使用されます。
getBearerTokenProvider ヘルパーは、OpenAI クライアントがその資格情報として使用できるトークン プロバイダーを作成します。
Go アプリでは、Azure Core ベアラー トークン ポリシーで azidentity.NewDefaultAzureCredential を使用します。 このポリシーはミドルウェアとして OpenAI クライアントに追加されるため、要求ではMicrosoft Entra IDトークンが使用されます。
Java アプリでは、DefaultAzureCredentialBuilder で AuthenticationUtil.getBearerTokenSupplier を使用します。 トークン サプライヤーは、 BearerTokenCredentialを使用して OpenAI クライアントに渡されます。
スターター キットのサンプルを実行する
スターター キットには、言語ごとにより大きな Responses API の例も含まれています。
python responses_example_entra.py
dotnet run responses_example_entra.cs
npx tsx responses_example_entra.ts
go run main.go
mvn compile exec:java -Dexec.mainClass="com.azure.openai.starter.ResponsesExampleEntra"
Troubleshooting
| 問題点 | これを試す |
|---|---|
azd up は、選択したリージョンで GPT-5-mini を使用できないために失敗します。 |
プロンプトが表示されたら、別の Azure OpenAI モデルの場所を選択するか、azd env set AZURE_LOCATION eastus2 で別のリージョンを設定し、azd up をもう一度実行します。 |
azd up は、ロールの割り当てまたは承認エラーで失敗します。 |
アカウントでリソースとロールの割り当てを作成できることを確認します。 このテンプレートには、通常、所有者またはユーザー アクセス管理者が必要です。 |
アプリは 401 または PermissionDeniedを返します。 |
azd upで使用されているのと同じテナントとサブスクリプションにサインインしていることを確認します。
az loginを実行し、azd auth loginを実行して、AZURE_TENANT_IDから取得したテナント ID をaz account showに設定します。 ロール割り当ての反映には数分かかることもあります。 |
DefaultAzureCredential failed to retrieve a token。 |
Azure CLIがインストールされ、az account show で認証されていることを確認します。 複数のテナントを使用する場合は、 az login --tenant <tenant-id>を使用して正しいテナントにサインインします。 |
アプリは model not found または deployment not foundを返します。 |
AZURE_OPENAI_DEPLOYMENT が Azure OpenAI デプロイ名と一致することを確認します。 スターター キットの既定値は gpt-5-mini です。 |
| .NET アプリはパッケージ ディレクティブを認識しません。 | スターター キットに必要な .NET SDK バージョンをインストールします。
#:package を使用するファイル ベースの C# アプリには、最新の .NET SDK が必要です。 |
| Go アプリでモジュールまたは依存関係が見つかりません。 |
src/go/responses_example_entraから Go コマンドを実行します。 Go 1.25.1 以降がインストールされていることを確認します。 |
| Java アプリは、ソースまたはターゲット のバージョン エラーで失敗します。 | Java 21 以降がインストールされ、ターミナルによって選択されていることを確認します。 |
| 詳細なデプロイ ログが必要です。 |
azd up --debug を実行します。 |
現在の Azure Developer CLI 環境の値は、次の方法で調べることができます。
azd env get-values
リソースをクリーンアップする
リソースが不要になったら、スターター キット リポジトリのルートから次のコマンドを実行します。
azd down --purge
このコマンドは、スターター キットによって作成されたAzure リソースを削除し、継続的な料金の停止に役立ちます。
ヘルプを取得する
スターター キットに関するヘルプが必要な場合は、次のリソースを使用します。
- Azure OpenAI Starter Kit リポジトリ。
- Azure OpenAI Starter Kit の問題。
- Azure OpenAI のドキュメント。
- Azure Developer CLI のドキュメント。
- Azure OpenAI ロールベースのアクセス制御。