From 2402051c0517b6512261984323a52ad5c4956e5f Mon Sep 17 00:00:00 2001 From: Richard Park Date: Fri, 14 Jul 2023 22:16:16 -0700 Subject: [PATCH 01/10] Readme and examples --- sdk/cognitiveservices/azopenai/README.md | 41 ++-- .../azopenai/client_shared_test.go | 10 +- .../example_client_createimage_test.go | 63 +++++++ .../example_client_embeddings_test.go | 55 ++++++ .../example_client_getchatcompletions_test.go | 178 ++++++++++++++++++ .../example_client_getcompletions_test.go | 114 +++++++++++ .../azopenai/example_client_test.go | 67 +++++++ .../azopenai/examples_client_test.go | 167 ---------------- sdk/cognitiveservices/azopenai/main_test.go | 23 +++ 9 files changed, 522 insertions(+), 196 deletions(-) create mode 100644 sdk/cognitiveservices/azopenai/example_client_createimage_test.go create mode 100644 sdk/cognitiveservices/azopenai/example_client_embeddings_test.go create mode 100644 sdk/cognitiveservices/azopenai/example_client_getchatcompletions_test.go create mode 100644 sdk/cognitiveservices/azopenai/example_client_getcompletions_test.go create mode 100644 sdk/cognitiveservices/azopenai/example_client_test.go delete mode 100644 sdk/cognitiveservices/azopenai/examples_client_test.go create mode 100644 sdk/cognitiveservices/azopenai/main_test.go diff --git a/sdk/cognitiveservices/azopenai/README.md b/sdk/cognitiveservices/azopenai/README.md index 9b8e5a9179fd..c4c0509fe2f9 100644 --- a/sdk/cognitiveservices/azopenai/README.md +++ b/sdk/cognitiveservices/azopenai/README.md @@ -1,6 +1,8 @@ # Azure OpenAI client module for Go -Azure OpenAI is a managed service that allows developers to deploy, tune, and generate content from OpenAI models on Azure resources. +NOTE: this client can connect to both Azure OpenAI and Open AI. + +Azure OpenAI Service provides REST API access to OpenAI's powerful language models including the GPT-4, GPT-35-Turbo, and Embeddings model series. The Azure OpenAI client library for GO is an adaptation of OpenAI's REST APIs that provides an idiomatic interface and rich integration with the rest of the Azure SDK ecosystem. @@ -20,42 +22,34 @@ Install the `azopenai` and `azidentity` modules with `go get`: ```bash go get github.com/Azure/azure-sdk-for-go/sdk/cognitiveservices/azopenai + +# optional go get github.com/Azure/azure-sdk-for-go/sdk/azidentity ``` -The [azidentity][azure_identity] module is used for authentication during client construction. +The [azidentity][azure_identity] module is used for Azure Active Directory authentication with Azure OpenAI. ### Authentication - +#### Azure OpenAI -#### Create a client +Azure OpenAI clients can authenticate using Azure Active Directory or with an API key: -Constructing the client requires your vault's URL, which you can get from the Azure CLI or the Azure Portal. +* Using Azure Active Directory, with a TokenCredential: [example](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/cognitiveservices/azopenai#example-NewClient) +* Using an API key: [example](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/cognitiveservices/azopenai#example-NewClientWithKeyCredential) -```go -import ( - "github.com/Azure/azure-sdk-for-go/sdk/azidentity" - "github.com/Azure/azure-sdk-for-go/sdk/cognitiveservices/azopenai" -) - -func main() { - endpoint := "https://" - apiKey := "" - - var err error - cred := azopenai.KeyCredential{APIKey: apiKey} - client, err := azopenai.NewClientWithKeyCredential(endpoint, cred, &options) - if err != nil { - // TODO: handle error - } -} -``` +#### OpenAI + +OpenAI supports connecting using an API key: [example](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/cognitiveservices/azopenai#example-NewClientForOpenAI) ## Key concepts See [Key concepts][openai_key_concepts] in the product documentation for more details about general concepts. +# Examples + +Examples for various scenarios can be found on [pkg.go.dev](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/cognitiveservices/azopenai#pkg-examples) or in the example*_test.go files in our GitHub repo for [azopenai](https://github.com/Azure/azure-sdk-for-go/blob/main/sdk/cognitiveservices/azopenai). + ## Troubleshooting ### Error Handling @@ -103,3 +97,4 @@ comments. [coc]: https://opensource.microsoft.com/codeofconduct/ [coc_faq]: https://opensource.microsoft.com/codeofconduct/faq/ [coc_contact]: mailto:opencode@microsoft.com +[azure_openai_quickstart]: https://learn.microsoft.com/azure/cognitive-services/openai/quickstart \ No newline at end of file diff --git a/sdk/cognitiveservices/azopenai/client_shared_test.go b/sdk/cognitiveservices/azopenai/client_shared_test.go index 3e4242842bec..d450105ad9fb 100644 --- a/sdk/cognitiveservices/azopenai/client_shared_test.go +++ b/sdk/cognitiveservices/azopenai/client_shared_test.go @@ -5,7 +5,6 @@ package azopenai_test import ( "crypto/tls" - "fmt" "net/http" "os" "regexp" @@ -17,7 +16,6 @@ import ( "github.com/Azure/azure-sdk-for-go/sdk/azcore/policy" "github.com/Azure/azure-sdk-for-go/sdk/cognitiveservices/azopenai" "github.com/Azure/azure-sdk-for-go/sdk/internal/recording" - "github.com/joho/godotenv" "github.com/stretchr/testify/require" ) @@ -74,10 +72,10 @@ func init() { chatCompletionsModelDeployment = "gpt-4" openAIChatCompletionsModel = "gpt-4" } else { - if err := godotenv.Load(); err != nil { - fmt.Printf("Failed to load .env file: %s\n", err) - os.Exit(1) - } + // if err := godotenv.Load(); err != nil { + // fmt.Printf("Failed to load .env file: %s\n", err) + // os.Exit(1) + // } endpoint, apiKey, completionsModelDeployment, chatCompletionsModelDeployment = getVars("") canaryEndpoint, canaryAPIKey, canaryCompletionsModelDeployment, canaryChatCompletionsModelDeployment = getVars("_CANARY") diff --git a/sdk/cognitiveservices/azopenai/example_client_createimage_test.go b/sdk/cognitiveservices/azopenai/example_client_createimage_test.go new file mode 100644 index 000000000000..78844a1382a7 --- /dev/null +++ b/sdk/cognitiveservices/azopenai/example_client_createimage_test.go @@ -0,0 +1,63 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. See License.txt in the project root for license information. + +package azopenai_test + +import ( + "context" + "fmt" + "net/http" + "os" + + "github.com/Azure/azure-sdk-for-go/sdk/azcore/to" + "github.com/Azure/azure-sdk-for-go/sdk/cognitiveservices/azopenai" +) + +func ExampleClient_CreateImage() { + azureOpenAIKey := os.Getenv("AOAI_API_KEY") + + // Ex: "https://.openai.azure.com" + azureOpenAIEndpoint := os.Getenv("AOAI_ENDPOINT") + + if azureOpenAIKey == "" || azureOpenAIEndpoint == "" { + fmt.Fprintf(os.Stderr, "Skipping example, environment variables missing\n") + return + } + + keyCredential, err := azopenai.NewKeyCredential(azureOpenAIKey) + + if err != nil { + panic(err) + } + + client, err := azopenai.NewClientWithKeyCredential(azureOpenAIEndpoint, keyCredential, "", nil) + + if err != nil { + panic(err) + } + + resp, err := client.CreateImage(context.TODO(), azopenai.ImageGenerationOptions{ + Prompt: to.Ptr("a cat"), + ResponseFormat: to.Ptr(azopenai.ImageGenerationResponseFormatURL), + }, nil) + + if err != nil { + panic(err) + } + + for _, generatedImage := range resp.Data { + // the underlying type for the generatedImage is dictated by the value of + // ImageGenerationOptions.ResponseFormat. In this example we used `azopenai.ImageGenerationResponseFormatURL`, + // so the underlying type will be ImageLocation. + + resp, err := http.Head(*generatedImage.URL) + + if err != nil { + panic(err) + } + + fmt.Fprintf(os.Stderr, "Image generated, HEAD request on URL returned %d\n", resp.StatusCode) + } + + // Output: +} diff --git a/sdk/cognitiveservices/azopenai/example_client_embeddings_test.go b/sdk/cognitiveservices/azopenai/example_client_embeddings_test.go new file mode 100644 index 000000000000..9ffe0fba3109 --- /dev/null +++ b/sdk/cognitiveservices/azopenai/example_client_embeddings_test.go @@ -0,0 +1,55 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. See License.txt in the project root for license information. + +package azopenai_test + +import ( + "context" + "fmt" + "os" + + "github.com/Azure/azure-sdk-for-go/sdk/cognitiveservices/azopenai" +) + +func ExampleClient_GetEmbeddings() { + azureOpenAIKey := os.Getenv("AOAI_API_KEY") + modelDeploymentID := os.Getenv("AOAI_EMBEDDINGS_MODEL_DEPLOYMENT") + + // Ex: "https://.openai.azure.com" + azureOpenAIEndpoint := os.Getenv("AOAI_ENDPOINT") + + if azureOpenAIKey == "" || modelDeploymentID == "" || azureOpenAIEndpoint == "" { + fmt.Fprintf(os.Stderr, "Skipping example, environment variables missing\n") + return + } + + keyCredential, err := azopenai.NewKeyCredential(azureOpenAIKey) + + if err != nil { + panic(err) + } + + // In Azure OpenAI you must deploy a model before you can use it in your client. For more information + // see here: https://learn.microsoft.com/azure/cognitive-services/openai/how-to/create-resource + client, err := azopenai.NewClientWithKeyCredential(azureOpenAIEndpoint, keyCredential, modelDeploymentID, nil) + + if err != nil { + panic(err) + } + + resp, err := client.GetEmbeddings(context.TODO(), azopenai.EmbeddingsOptions{ + Input: []string{"The food was delicious and the waiter..."}, + Model: &modelDeploymentID, + }, nil) + + if err != nil { + panic(err) + } + + for _, embed := range resp.Data { + // embed.Embedding contains the embeddings for this input index. + fmt.Fprintf(os.Stderr, "Got embeddings for input %d\n", *embed.Index) + } + + // Output: +} diff --git a/sdk/cognitiveservices/azopenai/example_client_getchatcompletions_test.go b/sdk/cognitiveservices/azopenai/example_client_getchatcompletions_test.go new file mode 100644 index 000000000000..08f0d4456750 --- /dev/null +++ b/sdk/cognitiveservices/azopenai/example_client_getchatcompletions_test.go @@ -0,0 +1,178 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. See License.txt in the project root for license information. + +package azopenai_test + +import ( + "context" + "errors" + "fmt" + "io" + "os" + + "github.com/Azure/azure-sdk-for-go/sdk/azcore/to" + "github.com/Azure/azure-sdk-for-go/sdk/cognitiveservices/azopenai" +) + +func ExampleClient_GetChatCompletions() { + azureOpenAIKey := os.Getenv("AOAI_API_KEY") + modelDeploymentID := os.Getenv("AOAI_CHAT_COMPLETIONS_MODEL_DEPLOYMENT") + + // Ex: "https://.openai.azure.com" + azureOpenAIEndpoint := os.Getenv("AOAI_ENDPOINT") + + if azureOpenAIKey == "" || modelDeploymentID == "" || azureOpenAIEndpoint == "" { + fmt.Fprintf(os.Stderr, "Skipping example, environment variables missing\n") + return + } + + keyCredential, err := azopenai.NewKeyCredential(azureOpenAIKey) + + if err != nil { + panic(err) + } + + // In Azure OpenAI you must deploy a model before you can use it in your client. For more information + // see here: https://learn.microsoft.com/azure/cognitive-services/openai/how-to/create-resource + client, err := azopenai.NewClientWithKeyCredential(azureOpenAIEndpoint, keyCredential, modelDeploymentID, nil) + + if err != nil { + panic(err) + } + + // This is a conversation in progress. + // NOTE: all messages, regardless of role, count against token usage for this API. + messages := []azopenai.ChatMessage{ + // You set the tone and rules of the conversation with a prompt as the system role. + {Role: to.Ptr(azopenai.ChatRoleSystem), Content: to.Ptr("You are a helpful assistant. You will talk like a pirate.")}, + + // The user asks a question + {Role: to.Ptr(azopenai.ChatRoleUser), Content: to.Ptr("Can you help me?")}, + + // The reply would come back from the ChatGPT. You'd add it to the conversation so we can maintain context. + {Role: to.Ptr(azopenai.ChatRoleAssistant), Content: to.Ptr("Arrrr! Of course, me hearty! What can I do for ye?")}, + + // The user answers the question based on the latest reply. + {Role: to.Ptr(azopenai.ChatRoleUser), Content: to.Ptr("What's the best way to train a parrot?")}, + + // from here you'd keep iterating, sending responses back from ChatGPT + } + + gotReply := false + + resp, err := client.GetChatCompletions(context.TODO(), azopenai.ChatCompletionsOptions{ + // This is a conversation in progress. + // NOTE: all messages count against token usage for this API. + Messages: messages, + }, nil) + + if err != nil { + panic(err) + } + + for _, choice := range resp.Choices { + gotReply = true + fmt.Fprintf(os.Stderr, "Content[%d]: %s\n", *choice.Index, *choice.Message.Content) + } + + if gotReply { + fmt.Fprintf(os.Stderr, "Got chat completions reply\n") + } + + // Output: +} + +func ExampleClient_GetChatCompletionsStream() { + azureOpenAIKey := os.Getenv("AOAI_API_KEY") + modelDeploymentID := os.Getenv("AOAI_CHAT_COMPLETIONS_MODEL_DEPLOYMENT") + + // Ex: "https://.openai.azure.com" + azureOpenAIEndpoint := os.Getenv("AOAI_ENDPOINT") + + if azureOpenAIKey == "" || modelDeploymentID == "" || azureOpenAIEndpoint == "" { + fmt.Fprintf(os.Stderr, "Skipping example, environment variables missing\n") + return + } + + keyCredential, err := azopenai.NewKeyCredential(azureOpenAIKey) + + if err != nil { + panic(err) + } + + // In Azure OpenAI you must deploy a model before you can use it in your client. For more information + // see here: https://learn.microsoft.com/azure/cognitive-services/openai/how-to/create-resource + client, err := azopenai.NewClientWithKeyCredential(azureOpenAIEndpoint, keyCredential, modelDeploymentID, nil) + + if err != nil { + panic(err) + } + + // This is a conversation in progress. + // NOTE: all messages, regardless of role, count against token usage for this API. + messages := []azopenai.ChatMessage{ + // You set the tone and rules of the conversation with a prompt as the system role. + {Role: to.Ptr(azopenai.ChatRoleSystem), Content: to.Ptr("You are a helpful assistant. You will talk like a pirate and limit your responses to 20 words or less.")}, + + // The user asks a question + {Role: to.Ptr(azopenai.ChatRoleUser), Content: to.Ptr("Can you help me?")}, + + // The reply would come back from the ChatGPT. You'd add it to the conversation so we can maintain context. + {Role: to.Ptr(azopenai.ChatRoleAssistant), Content: to.Ptr("Arrrr! Of course, me hearty! What can I do for ye?")}, + + // The user answers the question based on the latest reply. + {Role: to.Ptr(azopenai.ChatRoleUser), Content: to.Ptr("What's the best way to train a parrot?")}, + + // from here you'd keep iterating, sending responses back from ChatGPT + } + + resp, err := client.GetChatCompletionsStream(context.TODO(), azopenai.ChatCompletionsOptions{ + // This is a conversation in progress. + // NOTE: all messages count against token usage for this API. + Messages: messages, + N: to.Ptr[int32](1), + }, nil) + + if err != nil { + panic(err) + } + + streamReader := resp.ChatCompletionsStream + gotReply := false + + for { + chatCompletions, err := streamReader.Read() + + if errors.Is(err, io.EOF) { + break + } + + if err != nil { + panic(err) + } + + for _, choice := range chatCompletions.Choices { + gotReply = true + + text := "" + + if choice.Delta.Content != nil { + text = *choice.Delta.Content + } + + role := "" + + if choice.Delta.Role != nil { + role = string(*choice.Delta.Role) + } + + fmt.Fprintf(os.Stderr, "Content[%d], role %q: %q\n", *choice.Index, role, text) + } + } + + if gotReply { + fmt.Fprintf(os.Stderr, "Got chat completions streaming reply\n") + } + + // Output: +} diff --git a/sdk/cognitiveservices/azopenai/example_client_getcompletions_test.go b/sdk/cognitiveservices/azopenai/example_client_getcompletions_test.go new file mode 100644 index 000000000000..2b24568cdaf7 --- /dev/null +++ b/sdk/cognitiveservices/azopenai/example_client_getcompletions_test.go @@ -0,0 +1,114 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. See License.txt in the project root for license information. + +package azopenai_test + +import ( + "context" + "errors" + "fmt" + "io" + "os" + + "github.com/Azure/azure-sdk-for-go/sdk/azcore/to" + "github.com/Azure/azure-sdk-for-go/sdk/cognitiveservices/azopenai" +) + +func ExampleClient_GetCompletions() { + azureOpenAIKey := os.Getenv("AOAI_API_KEY") + modelDeploymentID := os.Getenv("AOAI_COMPLETIONS_MODEL_DEPLOYMENT") + + // Ex: "https://.openai.azure.com" + azureOpenAIEndpoint := os.Getenv("AOAI_ENDPOINT") + + if azureOpenAIKey == "" || modelDeploymentID == "" || azureOpenAIEndpoint == "" { + fmt.Fprintf(os.Stderr, "Skipping example, environment variables missing\n") + return + } + + keyCredential, err := azopenai.NewKeyCredential(azureOpenAIKey) + + if err != nil { + panic(err) + } + + // In Azure OpenAI you must deploy a model before you can use it in your client. For more information + // see here: https://learn.microsoft.com/azure/cognitive-services/openai/how-to/create-resource + client, err := azopenai.NewClientWithKeyCredential(azureOpenAIEndpoint, keyCredential, modelDeploymentID, nil) + + if err != nil { + panic(err) + } + + resp, err := client.GetCompletions(context.TODO(), azopenai.CompletionsOptions{ + Prompt: []string{"What is Azure OpenAI, in 20 words or less"}, + MaxTokens: to.Ptr(int32(2048)), + Temperature: to.Ptr(float32(0.0)), + }, nil) + + if err != nil { + panic(err) + } + + for _, choice := range resp.Choices { + fmt.Fprintf(os.Stderr, "Result: %s\n", *choice.Text) + } + + // Output: +} + +func ExampleClient_GetCompletionsStream() { + azureOpenAIKey := os.Getenv("AOAI_API_KEY") + modelDeploymentID := os.Getenv("AOAI_COMPLETIONS_MODEL_DEPLOYMENT") + + // Ex: "https://.openai.azure.com" + azureOpenAIEndpoint := os.Getenv("AOAI_ENDPOINT") + + if azureOpenAIKey == "" || modelDeploymentID == "" || azureOpenAIEndpoint == "" { + fmt.Fprintf(os.Stderr, "Skipping example, environment variables missing\n") + return + } + + keyCredential, err := azopenai.NewKeyCredential(azureOpenAIKey) + + if err != nil { + panic(err) + } + + // In Azure OpenAI you must deploy a model before you can use it in your client. For more information + // see here: https://learn.microsoft.com/azure/cognitive-services/openai/how-to/create-resource + client, err := azopenai.NewClientWithKeyCredential(azureOpenAIEndpoint, keyCredential, modelDeploymentID, nil) + + if err != nil { + panic(err) + } + + resp, err := client.GetCompletionsStream(context.TODO(), azopenai.CompletionsOptions{ + Prompt: []string{"What is Azure OpenAI, in 20 words or less?"}, + MaxTokens: to.Ptr(int32(2048)), + Temperature: to.Ptr(float32(0.0)), + }, nil) + + if err != nil { + panic(err) + } + + for { + entry, err := resp.CompletionsStream.Read() + + if errors.Is(err, io.EOF) { + fmt.Printf("\n*** No more completions ***\n") + break + } + + if err != nil { + panic(err) + } + + for _, choice := range entry.Choices { + fmt.Fprintf(os.Stderr, "Result: %s\n", *choice.Text) + } + } + + // Output: +} diff --git a/sdk/cognitiveservices/azopenai/example_client_test.go b/sdk/cognitiveservices/azopenai/example_client_test.go new file mode 100644 index 000000000000..45f7d8787257 --- /dev/null +++ b/sdk/cognitiveservices/azopenai/example_client_test.go @@ -0,0 +1,67 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. See License.txt in the project root for license information. + +package azopenai_test + +import ( + "github.com/Azure/azure-sdk-for-go/sdk/azidentity" + "github.com/Azure/azure-sdk-for-go/sdk/cognitiveservices/azopenai" +) + +func ExampleNewClientForOpenAI() { + // NOTE: this constructor creates a client that connects to the public OpenAI endpoint. + // To connect to an Azure OpenAI endpoint, use azopenai.NewClient() or azopenai.NewClientWithyKeyCredential. + keyCredential, err := azopenai.NewKeyCredential("") + + if err != nil { + panic(err) + } + + client, err := azopenai.NewClientForOpenAI("https://api.openai.com/v1", keyCredential, nil) + + if err != nil { + panic(err) + } + + _ = client +} + +func ExampleNewClient() { + // NOTE: this constructor creates a client that connects to an Azure OpenAI endpoint. + // To connect to the public OpenAI endpoint, use azopenai.NewClientForOpenAI + dac, err := azidentity.NewDefaultAzureCredential(nil) + + if err != nil { + panic(err) + } + + modelDeploymentID := "model deployment ID" + client, err := azopenai.NewClient("https://.openai.azure.com", dac, modelDeploymentID, nil) + + if err != nil { + panic(err) + } + + _ = client +} + +func ExampleNewClientWithKeyCredential() { + // NOTE: this constructor creates a client that connects to an Azure OpenAI endpoint. + // To connect to the public OpenAI endpoint, use azopenai.NewClientForOpenAI + keyCredential, err := azopenai.NewKeyCredential("") + + if err != nil { + panic(err) + } + + // In Azure OpenAI you must deploy a model before you can use it in your client. For more information + // see here: https://learn.microsoft.com/azure/cognitive-services/openai/how-to/create-resource + modelDeploymentID := "model deployment ID" + client, err := azopenai.NewClientWithKeyCredential("https://.openai.azure.com", keyCredential, modelDeploymentID, nil) + + if err != nil { + panic(err) + } + + _ = client +} diff --git a/sdk/cognitiveservices/azopenai/examples_client_test.go b/sdk/cognitiveservices/azopenai/examples_client_test.go deleted file mode 100644 index 7af7c7d1c1fe..000000000000 --- a/sdk/cognitiveservices/azopenai/examples_client_test.go +++ /dev/null @@ -1,167 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. See License.txt in the project root for license information. - -package azopenai_test - -import ( - "context" - "errors" - "fmt" - "io" - "os" - - "github.com/Azure/azure-sdk-for-go/sdk/azcore/to" - "github.com/Azure/azure-sdk-for-go/sdk/azidentity" - "github.com/Azure/azure-sdk-for-go/sdk/cognitiveservices/azopenai" -) - -func ExampleNewClientForOpenAI() { - // NOTE: this constructor creates a client that connects to the public OpenAI endpoint. - // To connect to an Azure OpenAI endpoint, use azopenai.NewClient() or azopenai.NewClientWithyKeyCredential. - keyCredential, err := azopenai.NewKeyCredential("") - - if err != nil { - panic(err) - } - - client, err := azopenai.NewClientForOpenAI("https://api.openai.com/v1", keyCredential, nil) - - if err != nil { - panic(err) - } - - _ = client -} - -func ExampleNewClient() { - // NOTE: this constructor creates a client that connects to an Azure OpenAI endpoint. - // To connect to the public OpenAI endpoint, use azopenai.NewClientForOpenAI - dac, err := azidentity.NewDefaultAzureCredential(nil) - - if err != nil { - panic(err) - } - - modelDeploymentID := "model deployment ID" - client, err := azopenai.NewClient("https://.openai.azure.com", dac, modelDeploymentID, nil) - - if err != nil { - panic(err) - } - - _ = client -} - -func ExampleNewClientWithKeyCredential() { - // NOTE: this constructor creates a client that connects to an Azure OpenAI endpoint. - // To connect to the public OpenAI endpoint, use azopenai.NewClientForOpenAI - keyCredential, err := azopenai.NewKeyCredential("") - - if err != nil { - panic(err) - } - - // In Azure OpenAI you must deploy a model before you can use it in your client. For more information - // see here: https://learn.microsoft.com/azure/cognitive-services/openai/how-to/create-resource - modelDeploymentID := "model deployment ID" - client, err := azopenai.NewClientWithKeyCredential("https://.openai.azure.com", keyCredential, modelDeploymentID, nil) - - if err != nil { - panic(err) - } - - _ = client -} - -func ExampleClient_GetCompletionsStream() { - azureOpenAIKey := os.Getenv("AOAI_API_KEY") - modelDeploymentID := os.Getenv("AOAI_COMPLETIONS_MODEL_DEPLOYMENT") - - // Ex: "https://.openai.azure.com" - azureOpenAIEndpoint := os.Getenv("AOAI_ENDPOINT") - - if azureOpenAIKey == "" || modelDeploymentID == "" || azureOpenAIEndpoint == "" { - return - } - - keyCredential, err := azopenai.NewKeyCredential(azureOpenAIKey) - - if err != nil { - panic(err) - } - - // In Azure OpenAI you must deploy a model before you can use it in your client. For more information - // see here: https://learn.microsoft.com/azure/cognitive-services/openai/how-to/create-resource - client, err := azopenai.NewClientWithKeyCredential(azureOpenAIEndpoint, keyCredential, modelDeploymentID, nil) - - if err != nil { - panic(err) - } - - resp, err := client.GetCompletionsStream(context.TODO(), azopenai.CompletionsOptions{ - Prompt: []string{"What is Azure OpenAI?"}, - MaxTokens: to.Ptr(int32(2048)), - Temperature: to.Ptr(float32(0.0)), - }, nil) - - if err != nil { - panic(err) - } - - for { - entry, err := resp.CompletionsStream.Read() - - if errors.Is(err, io.EOF) { - fmt.Printf("\n *** No more completions ***\n") - break - } - - if err != nil { - panic(err) - } - - for _, choice := range entry.Choices { - fmt.Printf("%s", *choice.Text) - } - } -} - -func ExampleClient_CreateImage() { - azureOpenAIKey := os.Getenv("AOAI_API_KEY") - - // Ex: "https://.openai.azure.com" - azureOpenAIEndpoint := os.Getenv("AOAI_ENDPOINT") - - if azureOpenAIKey == "" || azureOpenAIEndpoint == "" { - fmt.Printf("Skipping example, environment variables missing\n") - return - } - - keyCredential, err := azopenai.NewKeyCredential(azureOpenAIKey) - - if err != nil { - panic(err) - } - - client, err := azopenai.NewClientWithKeyCredential(azureOpenAIEndpoint, keyCredential, "", nil) - - if err != nil { - panic(err) - } - - resp, err := client.CreateImage(context.TODO(), azopenai.ImageGenerationOptions{ - Prompt: to.Ptr("a cat"), - ResponseFormat: to.Ptr(azopenai.ImageGenerationResponseFormatURL), - }, nil) - - if err != nil { - panic(err) - } - - for _, generatedImage := range resp.Data { - // the underlying type for the generatedImage is dictated by the value of - // ImageGenerationOptions.ResponseFormat. In this example we used `azopenai.ImageGenerationResponseFormatURL`, - // so the underlying type will be ImageLocation. - fmt.Printf("Image generated at URL %q\n", *generatedImage.URL) - } -} diff --git a/sdk/cognitiveservices/azopenai/main_test.go b/sdk/cognitiveservices/azopenai/main_test.go new file mode 100644 index 000000000000..7ab728c2c174 --- /dev/null +++ b/sdk/cognitiveservices/azopenai/main_test.go @@ -0,0 +1,23 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. See License.txt in the project root for license information. + +package azopenai_test + +import ( + "fmt" + "os" + "testing" + + "github.com/Azure/azure-sdk-for-go/sdk/internal/recording" + "github.com/joho/godotenv" +) + +func TestMain(m *testing.M) { + if recording.GetRecordMode() != recording.PlaybackMode { + if err := godotenv.Load(); err != nil { + fmt.Printf("No .env file - can't run examples or live tests\n") + } + } + + os.Exit(m.Run()) +} From bfc67a3efd25bbbcc105989c19a9d873e0938c59 Mon Sep 17 00:00:00 2001 From: Richard Park Date: Mon, 17 Jul 2023 16:28:12 -0700 Subject: [PATCH 02/10] Update topline --- sdk/cognitiveservices/azopenai/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sdk/cognitiveservices/azopenai/README.md b/sdk/cognitiveservices/azopenai/README.md index c4c0509fe2f9..50e369064ae2 100644 --- a/sdk/cognitiveservices/azopenai/README.md +++ b/sdk/cognitiveservices/azopenai/README.md @@ -1,6 +1,6 @@ # Azure OpenAI client module for Go -NOTE: this client can connect to both Azure OpenAI and Open AI. +NOTE: this client can be used with Azure OpenAI and Open AI. Azure OpenAI Service provides REST API access to OpenAI's powerful language models including the GPT-4, GPT-35-Turbo, and Embeddings model series. From 7e1706caebd84c68756240e64f82dc747ccba133 Mon Sep 17 00:00:00 2001 From: Richard Park Date: Mon, 17 Jul 2023 16:49:56 -0700 Subject: [PATCH 03/10] Updating readme and custom_client.go's package comment --- sdk/cognitiveservices/azopenai/README.md | 4 +--- sdk/cognitiveservices/azopenai/custom_client.go | 5 ++++- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/sdk/cognitiveservices/azopenai/README.md b/sdk/cognitiveservices/azopenai/README.md index 50e369064ae2..fc8a5a1287c7 100644 --- a/sdk/cognitiveservices/azopenai/README.md +++ b/sdk/cognitiveservices/azopenai/README.md @@ -2,9 +2,7 @@ NOTE: this client can be used with Azure OpenAI and Open AI. -Azure OpenAI Service provides REST API access to OpenAI's powerful language models including the GPT-4, GPT-35-Turbo, and Embeddings model series. - -The Azure OpenAI client library for GO is an adaptation of OpenAI's REST APIs that provides an idiomatic interface and rich integration with the rest of the Azure SDK ecosystem. +Azure OpenAI Service provides access to OpenAI's powerful language models including the GPT-4, GPT-35-Turbo, and Embeddings model series, as well as image generation using DALL-E. [Source code][azopenai_repo] | [Package (pkg.go.dev)][azopenai_pkg_go] | [REST API documentation][openai_rest_docs] | [Product documentation][openai_docs] diff --git a/sdk/cognitiveservices/azopenai/custom_client.go b/sdk/cognitiveservices/azopenai/custom_client.go index 6fba8cab1756..c4f1da63b198 100644 --- a/sdk/cognitiveservices/azopenai/custom_client.go +++ b/sdk/cognitiveservices/azopenai/custom_client.go @@ -4,6 +4,10 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. See License.txt in the project root for license information. +// Package azopenai Azure OpenAI Service provides access to OpenAI's powerful language models including the GPT-4, +// GPT-35-Turbo, and Embeddings model series, as well as image generation using DALL-E. +// +// The [Client] in this package can be used with Azure OpenAI or OpenAI. package azopenai // this file contains handwritten additions to the generated code @@ -21,7 +25,6 @@ import ( const ( clientName = "azopenai.Client" - apiVersion = "2023-03-15-preview" tokenScope = "https://cognitiveservices.azure.com/.default" ) From 39fbda45debfa38a3e1d1e16c6371169c94ee9f7 Mon Sep 17 00:00:00 2001 From: Richard Park Date: Tue, 18 Jul 2023 13:06:14 -0700 Subject: [PATCH 04/10] Adding in a functions example, rerecord. --- sdk/cognitiveservices/azopenai/assets.json | 2 +- .../azopenai/client_functions_test.go | 37 +++----- .../azopenai/client_shared_test.go | 18 ++-- .../example_client_getchatcompletions_test.go | 92 +++++++++++++++++++ .../example_client_getcompletions_test.go | 2 +- sdk/cognitiveservices/azopenai/main_test.go | 11 +-- 6 files changed, 120 insertions(+), 42 deletions(-) diff --git a/sdk/cognitiveservices/azopenai/assets.json b/sdk/cognitiveservices/azopenai/assets.json index b7b04a7814db..8153da5c9cc9 100644 --- a/sdk/cognitiveservices/azopenai/assets.json +++ b/sdk/cognitiveservices/azopenai/assets.json @@ -2,5 +2,5 @@ "AssetsRepo": "Azure/azure-sdk-assets", "AssetsRepoPrefixPath": "go", "TagPrefix": "go/cognitiveservices/azopenai", - "Tag": "go/cognitiveservices/azopenai_63852f374c" + "Tag": "go/cognitiveservices/azopenai_e8362ae205" } diff --git a/sdk/cognitiveservices/azopenai/client_functions_test.go b/sdk/cognitiveservices/azopenai/client_functions_test.go index 352155c1eefb..92bf46f52acd 100644 --- a/sdk/cognitiveservices/azopenai/client_functions_test.go +++ b/sdk/cognitiveservices/azopenai/client_functions_test.go @@ -25,32 +25,23 @@ type ParamProperty struct { Enum []string `json:"enum,omitempty"` } -func getClientForFunctionsTest(t *testing.T, azure bool) *azopenai.Client { - if azure { - cred, err := azopenai.NewKeyCredential(apiKey) - require.NoError(t, err) - - chatClient, err := azopenai.NewClientWithKeyCredential(endpoint, cred, chatCompletionsModelDeployment, newClientOptionsForTest(t)) - require.NoError(t, err) - - return chatClient - } else { - cred, err := azopenai.NewKeyCredential(openAIKey) - require.NoError(t, err) - - chatClient, err := azopenai.NewClientForOpenAI(openAIEndpoint, cred, newClientOptionsForTest(t)) - require.NoError(t, err) - - return chatClient - } +func TestGetChatCompletions_usingFunctions(t *testing.T) { + // https://platform.openai.com/docs/guides/gpt/function-calling + + t.Run("OpenAI", func(t *testing.T) { + chatClient := newOpenAIClientForTest(t) + testChatCompletionsFunctions(t, chatClient) + }) + + t.Run("AzureOpenAI", func(t *testing.T) { + chatClient := newAzureOpenAIClientForTest(t, chatCompletionsModelDeployment, false) + testChatCompletionsFunctions(t, chatClient) + }) } -func TestFunctions(t *testing.T) { - // https://platform.openai.com/docs/guides/gpt/function-calling#:~:text=For%20example%2C%20you%20can%3A%201%20Create%20chatbots%20that,...%203%20Extract%20structured%20data%20from%20text%20 - chatClient := getClientForFunctionsTest(t, false) - +func testChatCompletionsFunctions(t *testing.T, chatClient *azopenai.Client) { resp, err := chatClient.GetChatCompletions(context.Background(), azopenai.ChatCompletionsOptions{ - Model: to.Ptr("gpt-3.5-turbo-0613"), + Model: to.Ptr("gpt-4-0613"), Messages: []azopenai.ChatMessage{ { Role: to.Ptr(azopenai.ChatRoleUser), diff --git a/sdk/cognitiveservices/azopenai/client_shared_test.go b/sdk/cognitiveservices/azopenai/client_shared_test.go index d450105ad9fb..94e201ba8dd6 100644 --- a/sdk/cognitiveservices/azopenai/client_shared_test.go +++ b/sdk/cognitiveservices/azopenai/client_shared_test.go @@ -5,6 +5,7 @@ package azopenai_test import ( "crypto/tls" + "fmt" "net/http" "os" "regexp" @@ -16,6 +17,7 @@ import ( "github.com/Azure/azure-sdk-for-go/sdk/azcore/policy" "github.com/Azure/azure-sdk-for-go/sdk/cognitiveservices/azopenai" "github.com/Azure/azure-sdk-for-go/sdk/internal/recording" + "github.com/joho/godotenv" "github.com/stretchr/testify/require" ) @@ -46,6 +48,8 @@ func getVars(suffix string) (endpoint, apiKey, completionsModelDeployment, chatC apiKey = os.Getenv("AOAI_API_KEY" + suffix) completionsModelDeployment = os.Getenv("AOAI_COMPLETIONS_MODEL_DEPLOYMENT" + suffix) + + // ex: gpt-4-0613 chatCompletionsModelDeployment = os.Getenv("AOAI_CHAT_COMPLETIONS_MODEL_DEPLOYMENT" + suffix) return @@ -54,7 +58,7 @@ func getVars(suffix string) (endpoint, apiKey, completionsModelDeployment, chatC const fakeEndpoint = "https://recordedhost/" const fakeAPIKey = "redacted" -func init() { +func initEnvVars() { if recording.GetRecordMode() == recording.PlaybackMode { endpoint = fakeEndpoint apiKey = fakeAPIKey @@ -69,13 +73,13 @@ func init() { completionsModelDeployment = "text-davinci-003" openAICompletionsModel = "text-davinci-003" - chatCompletionsModelDeployment = "gpt-4" + chatCompletionsModelDeployment = "gpt-4-0613" openAIChatCompletionsModel = "gpt-4" } else { - // if err := godotenv.Load(); err != nil { - // fmt.Printf("Failed to load .env file: %s\n", err) - // os.Exit(1) - // } + if err := godotenv.Load(); err != nil { + fmt.Printf("Failed to load .env file: %s\n", err) + os.Exit(1) + } endpoint, apiKey, completionsModelDeployment, chatCompletionsModelDeployment = getVars("") canaryEndpoint, canaryAPIKey, canaryCompletionsModelDeployment, canaryChatCompletionsModelDeployment = getVars("_CANARY") @@ -83,7 +87,7 @@ func init() { openAIKey = os.Getenv("OPENAI_API_KEY") openAIEndpoint = os.Getenv("OPENAI_ENDPOINT") openAICompletionsModel = os.Getenv("OPENAI_COMPLETIONS_MODEL") - openAIChatCompletionsModel = os.Getenv("OPENAI_CHAT_COMPLETIONS_MODEL") + openAIChatCompletionsModel = os.Getenv("OPENAI_CHAT_COMPLETIONS_MODEL") // ex: gpt-4-0613 if openAIEndpoint != "" && !strings.HasSuffix(openAIEndpoint, "/") { // (this just makes recording replacement easier) diff --git a/sdk/cognitiveservices/azopenai/example_client_getchatcompletions_test.go b/sdk/cognitiveservices/azopenai/example_client_getchatcompletions_test.go index 08f0d4456750..e27bfc3e6be5 100644 --- a/sdk/cognitiveservices/azopenai/example_client_getchatcompletions_test.go +++ b/sdk/cognitiveservices/azopenai/example_client_getchatcompletions_test.go @@ -5,6 +5,7 @@ package azopenai_test import ( "context" + "encoding/json" "errors" "fmt" "io" @@ -82,6 +83,97 @@ func ExampleClient_GetChatCompletions() { // Output: } +func ExampleClient_GetChatCompletions_functions() { + openAIKey := os.Getenv("OPENAI_API_KEY") + const model = "gpt-3.5-turbo-0613" + + if openAIKey == "" { + fmt.Fprintf(os.Stderr, "Skipping example, environment variables missing\n") + return + } + + keyCredential, err := azopenai.NewKeyCredential(openAIKey) + + if err != nil { + panic(err) + } + + client, err := azopenai.NewClientForOpenAI("https://api.openai.com/v1", keyCredential, nil) + + if err != nil { + panic(err) + } + + // some JSON schema keys + const jsonSchemaType = "type" + const jsonSchemaDesc = "description" + const jsonSchemaEnum = "enum" + const jsonSchemaRequired = "required" + const jsonSchemaProps = "properties" + + resp, err := client.GetChatCompletions(context.Background(), azopenai.ChatCompletionsOptions{ + Model: to.Ptr(model), + Messages: []azopenai.ChatMessage{ + { + Role: to.Ptr(azopenai.ChatRoleUser), + Content: to.Ptr("What's the weather like in Boston, MA, in celsius?"), + }, + }, + FunctionCall: &azopenai.ChatCompletionsOptionsFunctionCall{ + Value: to.Ptr("auto"), + }, + Functions: []azopenai.FunctionDefinition{ + { + Name: to.Ptr("get_current_weather"), + Description: to.Ptr("Get the current weather in a given location"), + + Parameters: map[string]any{ + jsonSchemaRequired: []string{"location"}, + jsonSchemaType: "object", + jsonSchemaProps: map[string]any{ + "location": map[string]any{ + jsonSchemaType: "string", + jsonSchemaDesc: "The city and state, e.g. San Francisco, CA", + }, + "unit": map[string]any{ + jsonSchemaType: "string", + jsonSchemaEnum: []string{"celsius", "fahrenheit"}, + }, + }, + }, + }, + }, + Temperature: to.Ptr[float32](0.0), + }, nil) + + if err != nil { + panic(err) + } + + funcCall := resp.ChatCompletions.Choices[0].Message.FunctionCall + + // This is the function name we gave in the call to GetCompletions + // Prints: Function name: "get_current_weather" + fmt.Fprintf(os.Stderr, "Function name: %q\n", *funcCall.Name) + + // The arguments for your function come back as a JSON string + var funcParams *struct { + Location string `json:"location"` + Unit string `json:"unit"` + } + err = json.Unmarshal([]byte(*funcCall.Arguments), &funcParams) + + if err != nil { + panic(err) + } + + // Prints: + // Parameters: azopenai_test.location{Location:"Boston, MA", Unit:"celsius"} + fmt.Fprintf(os.Stderr, "Parameters: %#v\n", *funcParams) + + // Output: +} + func ExampleClient_GetChatCompletionsStream() { azureOpenAIKey := os.Getenv("AOAI_API_KEY") modelDeploymentID := os.Getenv("AOAI_CHAT_COMPLETIONS_MODEL_DEPLOYMENT") diff --git a/sdk/cognitiveservices/azopenai/example_client_getcompletions_test.go b/sdk/cognitiveservices/azopenai/example_client_getcompletions_test.go index 2b24568cdaf7..4b81d0d8acb2 100644 --- a/sdk/cognitiveservices/azopenai/example_client_getcompletions_test.go +++ b/sdk/cognitiveservices/azopenai/example_client_getcompletions_test.go @@ -97,7 +97,7 @@ func ExampleClient_GetCompletionsStream() { entry, err := resp.CompletionsStream.Read() if errors.Is(err, io.EOF) { - fmt.Printf("\n*** No more completions ***\n") + fmt.Fprintf(os.Stderr, "\n*** No more completions ***\n") break } diff --git a/sdk/cognitiveservices/azopenai/main_test.go b/sdk/cognitiveservices/azopenai/main_test.go index 7ab728c2c174..2890ad613e61 100644 --- a/sdk/cognitiveservices/azopenai/main_test.go +++ b/sdk/cognitiveservices/azopenai/main_test.go @@ -4,20 +4,11 @@ package azopenai_test import ( - "fmt" "os" "testing" - - "github.com/Azure/azure-sdk-for-go/sdk/internal/recording" - "github.com/joho/godotenv" ) func TestMain(m *testing.M) { - if recording.GetRecordMode() != recording.PlaybackMode { - if err := godotenv.Load(); err != nil { - fmt.Printf("No .env file - can't run examples or live tests\n") - } - } - + initEnvVars() os.Exit(m.Run()) } From aa27e235953695ed399e2be2739201a6f57288ba Mon Sep 17 00:00:00 2001 From: Richard Park Date: Tue, 18 Jul 2023 13:08:35 -0700 Subject: [PATCH 05/10] Oops, no space! --- sdk/cognitiveservices/azopenai/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sdk/cognitiveservices/azopenai/README.md b/sdk/cognitiveservices/azopenai/README.md index fc8a5a1287c7..8d599d44b437 100644 --- a/sdk/cognitiveservices/azopenai/README.md +++ b/sdk/cognitiveservices/azopenai/README.md @@ -1,6 +1,6 @@ # Azure OpenAI client module for Go -NOTE: this client can be used with Azure OpenAI and Open AI. +NOTE: this client can be used with Azure OpenAI and OpenAI. Azure OpenAI Service provides access to OpenAI's powerful language models including the GPT-4, GPT-35-Turbo, and Embeddings model series, as well as image generation using DALL-E. From 33f0462e8d4e51875f7a3097133ae2a4ade1a5c1 Mon Sep 17 00:00:00 2001 From: Richard Park <51494936+richardpark-msft@users.noreply.github.com> Date: Tue, 18 Jul 2023 13:08:55 -0700 Subject: [PATCH 06/10] C'mon man, it's OpenAI, not Open AI! (thanks Charles) Co-authored-by: Charles Lowell <10964656+chlowell@users.noreply.github.com> --- sdk/cognitiveservices/azopenai/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sdk/cognitiveservices/azopenai/README.md b/sdk/cognitiveservices/azopenai/README.md index fc8a5a1287c7..8d599d44b437 100644 --- a/sdk/cognitiveservices/azopenai/README.md +++ b/sdk/cognitiveservices/azopenai/README.md @@ -1,6 +1,6 @@ # Azure OpenAI client module for Go -NOTE: this client can be used with Azure OpenAI and Open AI. +NOTE: this client can be used with Azure OpenAI and OpenAI. Azure OpenAI Service provides access to OpenAI's powerful language models including the GPT-4, GPT-35-Turbo, and Embeddings model series, as well as image generation using DALL-E. From aef3df44e8b7e17917db217302225e992c9040a0 Mon Sep 17 00:00:00 2001 From: Richard Park <51494936+richardpark-msft@users.noreply.github.com> Date: Tue, 18 Jul 2023 13:09:29 -0700 Subject: [PATCH 07/10] go:build needs to be there. Co-authored-by: Charles Lowell <10964656+chlowell@users.noreply.github.com> --- .../azopenai/example_client_createimage_test.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/sdk/cognitiveservices/azopenai/example_client_createimage_test.go b/sdk/cognitiveservices/azopenai/example_client_createimage_test.go index 78844a1382a7..8f4983002654 100644 --- a/sdk/cognitiveservices/azopenai/example_client_createimage_test.go +++ b/sdk/cognitiveservices/azopenai/example_client_createimage_test.go @@ -1,3 +1,6 @@ +//go:build go1.18 +// +build go1.18 + // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. See License.txt in the project root for license information. From 80599fcfece2606615fe40a89815c85baa768837 Mon Sep 17 00:00:00 2001 From: Richard Park Date: Tue, 18 Jul 2023 13:21:54 -0700 Subject: [PATCH 08/10] Use TODO instead of panic in examples --- .../example_client_createimage_test.go | 8 +++---- .../example_client_embeddings_test.go | 6 ++--- .../example_client_getchatcompletions_test.go | 22 +++++++++---------- .../example_client_getcompletions_test.go | 14 ++++++------ .../azopenai/example_client_test.go | 12 +++++----- 5 files changed, 31 insertions(+), 31 deletions(-) diff --git a/sdk/cognitiveservices/azopenai/example_client_createimage_test.go b/sdk/cognitiveservices/azopenai/example_client_createimage_test.go index 8f4983002654..42287b861ede 100644 --- a/sdk/cognitiveservices/azopenai/example_client_createimage_test.go +++ b/sdk/cognitiveservices/azopenai/example_client_createimage_test.go @@ -30,13 +30,13 @@ func ExampleClient_CreateImage() { keyCredential, err := azopenai.NewKeyCredential(azureOpenAIKey) if err != nil { - panic(err) + // TODO: handle error } client, err := azopenai.NewClientWithKeyCredential(azureOpenAIEndpoint, keyCredential, "", nil) if err != nil { - panic(err) + // TODO: handle error } resp, err := client.CreateImage(context.TODO(), azopenai.ImageGenerationOptions{ @@ -45,7 +45,7 @@ func ExampleClient_CreateImage() { }, nil) if err != nil { - panic(err) + // TODO: handle error } for _, generatedImage := range resp.Data { @@ -56,7 +56,7 @@ func ExampleClient_CreateImage() { resp, err := http.Head(*generatedImage.URL) if err != nil { - panic(err) + // TODO: handle error } fmt.Fprintf(os.Stderr, "Image generated, HEAD request on URL returned %d\n", resp.StatusCode) diff --git a/sdk/cognitiveservices/azopenai/example_client_embeddings_test.go b/sdk/cognitiveservices/azopenai/example_client_embeddings_test.go index 9ffe0fba3109..ce77480e676c 100644 --- a/sdk/cognitiveservices/azopenai/example_client_embeddings_test.go +++ b/sdk/cognitiveservices/azopenai/example_client_embeddings_test.go @@ -26,7 +26,7 @@ func ExampleClient_GetEmbeddings() { keyCredential, err := azopenai.NewKeyCredential(azureOpenAIKey) if err != nil { - panic(err) + // TODO: handle error } // In Azure OpenAI you must deploy a model before you can use it in your client. For more information @@ -34,7 +34,7 @@ func ExampleClient_GetEmbeddings() { client, err := azopenai.NewClientWithKeyCredential(azureOpenAIEndpoint, keyCredential, modelDeploymentID, nil) if err != nil { - panic(err) + // TODO: handle error } resp, err := client.GetEmbeddings(context.TODO(), azopenai.EmbeddingsOptions{ @@ -43,7 +43,7 @@ func ExampleClient_GetEmbeddings() { }, nil) if err != nil { - panic(err) + // TODO: handle error } for _, embed := range resp.Data { diff --git a/sdk/cognitiveservices/azopenai/example_client_getchatcompletions_test.go b/sdk/cognitiveservices/azopenai/example_client_getchatcompletions_test.go index e27bfc3e6be5..a039be95aa6a 100644 --- a/sdk/cognitiveservices/azopenai/example_client_getchatcompletions_test.go +++ b/sdk/cognitiveservices/azopenai/example_client_getchatcompletions_test.go @@ -30,7 +30,7 @@ func ExampleClient_GetChatCompletions() { keyCredential, err := azopenai.NewKeyCredential(azureOpenAIKey) if err != nil { - panic(err) + // TODO: handle error } // In Azure OpenAI you must deploy a model before you can use it in your client. For more information @@ -38,7 +38,7 @@ func ExampleClient_GetChatCompletions() { client, err := azopenai.NewClientWithKeyCredential(azureOpenAIEndpoint, keyCredential, modelDeploymentID, nil) if err != nil { - panic(err) + // TODO: handle error } // This is a conversation in progress. @@ -68,7 +68,7 @@ func ExampleClient_GetChatCompletions() { }, nil) if err != nil { - panic(err) + // TODO: handle error } for _, choice := range resp.Choices { @@ -95,13 +95,13 @@ func ExampleClient_GetChatCompletions_functions() { keyCredential, err := azopenai.NewKeyCredential(openAIKey) if err != nil { - panic(err) + // TODO: handle error } client, err := azopenai.NewClientForOpenAI("https://api.openai.com/v1", keyCredential, nil) if err != nil { - panic(err) + // TODO: handle error } // some JSON schema keys @@ -147,7 +147,7 @@ func ExampleClient_GetChatCompletions_functions() { }, nil) if err != nil { - panic(err) + // TODO: handle error } funcCall := resp.ChatCompletions.Choices[0].Message.FunctionCall @@ -164,7 +164,7 @@ func ExampleClient_GetChatCompletions_functions() { err = json.Unmarshal([]byte(*funcCall.Arguments), &funcParams) if err != nil { - panic(err) + // TODO: handle error } // Prints: @@ -189,7 +189,7 @@ func ExampleClient_GetChatCompletionsStream() { keyCredential, err := azopenai.NewKeyCredential(azureOpenAIKey) if err != nil { - panic(err) + // TODO: handle error } // In Azure OpenAI you must deploy a model before you can use it in your client. For more information @@ -197,7 +197,7 @@ func ExampleClient_GetChatCompletionsStream() { client, err := azopenai.NewClientWithKeyCredential(azureOpenAIEndpoint, keyCredential, modelDeploymentID, nil) if err != nil { - panic(err) + // TODO: handle error } // This is a conversation in progress. @@ -226,7 +226,7 @@ func ExampleClient_GetChatCompletionsStream() { }, nil) if err != nil { - panic(err) + // TODO: handle error } streamReader := resp.ChatCompletionsStream @@ -240,7 +240,7 @@ func ExampleClient_GetChatCompletionsStream() { } if err != nil { - panic(err) + // TODO: handle error } for _, choice := range chatCompletions.Choices { diff --git a/sdk/cognitiveservices/azopenai/example_client_getcompletions_test.go b/sdk/cognitiveservices/azopenai/example_client_getcompletions_test.go index 4b81d0d8acb2..5339502a029b 100644 --- a/sdk/cognitiveservices/azopenai/example_client_getcompletions_test.go +++ b/sdk/cognitiveservices/azopenai/example_client_getcompletions_test.go @@ -29,7 +29,7 @@ func ExampleClient_GetCompletions() { keyCredential, err := azopenai.NewKeyCredential(azureOpenAIKey) if err != nil { - panic(err) + // TODO: handle error } // In Azure OpenAI you must deploy a model before you can use it in your client. For more information @@ -37,7 +37,7 @@ func ExampleClient_GetCompletions() { client, err := azopenai.NewClientWithKeyCredential(azureOpenAIEndpoint, keyCredential, modelDeploymentID, nil) if err != nil { - panic(err) + // TODO: handle error } resp, err := client.GetCompletions(context.TODO(), azopenai.CompletionsOptions{ @@ -47,7 +47,7 @@ func ExampleClient_GetCompletions() { }, nil) if err != nil { - panic(err) + // TODO: handle error } for _, choice := range resp.Choices { @@ -72,7 +72,7 @@ func ExampleClient_GetCompletionsStream() { keyCredential, err := azopenai.NewKeyCredential(azureOpenAIKey) if err != nil { - panic(err) + // TODO: handle error } // In Azure OpenAI you must deploy a model before you can use it in your client. For more information @@ -80,7 +80,7 @@ func ExampleClient_GetCompletionsStream() { client, err := azopenai.NewClientWithKeyCredential(azureOpenAIEndpoint, keyCredential, modelDeploymentID, nil) if err != nil { - panic(err) + // TODO: handle error } resp, err := client.GetCompletionsStream(context.TODO(), azopenai.CompletionsOptions{ @@ -90,7 +90,7 @@ func ExampleClient_GetCompletionsStream() { }, nil) if err != nil { - panic(err) + // TODO: handle error } for { @@ -102,7 +102,7 @@ func ExampleClient_GetCompletionsStream() { } if err != nil { - panic(err) + // TODO: handle error } for _, choice := range entry.Choices { diff --git a/sdk/cognitiveservices/azopenai/example_client_test.go b/sdk/cognitiveservices/azopenai/example_client_test.go index 45f7d8787257..b203567f5cb4 100644 --- a/sdk/cognitiveservices/azopenai/example_client_test.go +++ b/sdk/cognitiveservices/azopenai/example_client_test.go @@ -14,13 +14,13 @@ func ExampleNewClientForOpenAI() { keyCredential, err := azopenai.NewKeyCredential("") if err != nil { - panic(err) + // TODO: handle error } client, err := azopenai.NewClientForOpenAI("https://api.openai.com/v1", keyCredential, nil) if err != nil { - panic(err) + // TODO: handle error } _ = client @@ -32,14 +32,14 @@ func ExampleNewClient() { dac, err := azidentity.NewDefaultAzureCredential(nil) if err != nil { - panic(err) + // TODO: handle error } modelDeploymentID := "model deployment ID" client, err := azopenai.NewClient("https://.openai.azure.com", dac, modelDeploymentID, nil) if err != nil { - panic(err) + // TODO: handle error } _ = client @@ -51,7 +51,7 @@ func ExampleNewClientWithKeyCredential() { keyCredential, err := azopenai.NewKeyCredential("") if err != nil { - panic(err) + // TODO: handle error } // In Azure OpenAI you must deploy a model before you can use it in your client. For more information @@ -60,7 +60,7 @@ func ExampleNewClientWithKeyCredential() { client, err := azopenai.NewClientWithKeyCredential("https://.openai.azure.com", keyCredential, modelDeploymentID, nil) if err != nil { - panic(err) + // TODO: handle error } _ = client From 0e2353194ea601c84e709bb0aec0be2442edcf96 Mon Sep 17 00:00:00 2001 From: Richard Park Date: Tue, 18 Jul 2023 13:57:25 -0700 Subject: [PATCH 09/10] Use Azure OpenAI as the endpoint. --- .../example_client_getchatcompletions_test.go | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/sdk/cognitiveservices/azopenai/example_client_getchatcompletions_test.go b/sdk/cognitiveservices/azopenai/example_client_getchatcompletions_test.go index a039be95aa6a..007338d78547 100644 --- a/sdk/cognitiveservices/azopenai/example_client_getchatcompletions_test.go +++ b/sdk/cognitiveservices/azopenai/example_client_getchatcompletions_test.go @@ -84,21 +84,26 @@ func ExampleClient_GetChatCompletions() { } func ExampleClient_GetChatCompletions_functions() { - openAIKey := os.Getenv("OPENAI_API_KEY") - const model = "gpt-3.5-turbo-0613" + azureOpenAIKey := os.Getenv("AOAI_API_KEY") + modelDeploymentID := os.Getenv("AOAI_CHAT_COMPLETIONS_MODEL_DEPLOYMENT") + + // Ex: "https://.openai.azure.com" + azureOpenAIEndpoint := os.Getenv("AOAI_ENDPOINT") - if openAIKey == "" { + if azureOpenAIKey == "" || modelDeploymentID == "" || azureOpenAIEndpoint == "" { fmt.Fprintf(os.Stderr, "Skipping example, environment variables missing\n") return } - keyCredential, err := azopenai.NewKeyCredential(openAIKey) + keyCredential, err := azopenai.NewKeyCredential(azureOpenAIKey) if err != nil { // TODO: handle error } - client, err := azopenai.NewClientForOpenAI("https://api.openai.com/v1", keyCredential, nil) + // In Azure OpenAI you must deploy a model before you can use it in your client. For more information + // see here: https://learn.microsoft.com/azure/cognitive-services/openai/how-to/create-resource + client, err := azopenai.NewClientWithKeyCredential(azureOpenAIEndpoint, keyCredential, modelDeploymentID, nil) if err != nil { // TODO: handle error @@ -112,7 +117,7 @@ func ExampleClient_GetChatCompletions_functions() { const jsonSchemaProps = "properties" resp, err := client.GetChatCompletions(context.Background(), azopenai.ChatCompletionsOptions{ - Model: to.Ptr(model), + Model: &modelDeploymentID, Messages: []azopenai.ChatMessage{ { Role: to.Ptr(azopenai.ChatRoleUser), From 2c48cfa756df6ea1029809df374be6f52db91d18 Mon Sep 17 00:00:00 2001 From: Richard Park <51494936+richardpark-msft@users.noreply.github.com> Date: Wed, 19 Jul 2023 00:25:32 +0000 Subject: [PATCH 10/10] Moving comment into the right spot --- .../azopenai/example_client_test.go | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/sdk/cognitiveservices/azopenai/example_client_test.go b/sdk/cognitiveservices/azopenai/example_client_test.go index b203567f5cb4..e13930b3f680 100644 --- a/sdk/cognitiveservices/azopenai/example_client_test.go +++ b/sdk/cognitiveservices/azopenai/example_client_test.go @@ -9,14 +9,14 @@ import ( ) func ExampleNewClientForOpenAI() { - // NOTE: this constructor creates a client that connects to the public OpenAI endpoint. - // To connect to an Azure OpenAI endpoint, use azopenai.NewClient() or azopenai.NewClientWithyKeyCredential. keyCredential, err := azopenai.NewKeyCredential("") if err != nil { // TODO: handle error } + // NOTE: this constructor creates a client that connects to the public OpenAI endpoint. + // To connect to an Azure OpenAI endpoint, use azopenai.NewClient() or azopenai.NewClientWithyKeyCredential. client, err := azopenai.NewClientForOpenAI("https://api.openai.com/v1", keyCredential, nil) if err != nil { @@ -27,8 +27,6 @@ func ExampleNewClientForOpenAI() { } func ExampleNewClient() { - // NOTE: this constructor creates a client that connects to an Azure OpenAI endpoint. - // To connect to the public OpenAI endpoint, use azopenai.NewClientForOpenAI dac, err := azidentity.NewDefaultAzureCredential(nil) if err != nil { @@ -36,6 +34,9 @@ func ExampleNewClient() { } modelDeploymentID := "model deployment ID" + + // NOTE: this constructor creates a client that connects to an Azure OpenAI endpoint. + // To connect to the public OpenAI endpoint, use azopenai.NewClientForOpenAI client, err := azopenai.NewClient("https://.openai.azure.com", dac, modelDeploymentID, nil) if err != nil { @@ -46,8 +47,6 @@ func ExampleNewClient() { } func ExampleNewClientWithKeyCredential() { - // NOTE: this constructor creates a client that connects to an Azure OpenAI endpoint. - // To connect to the public OpenAI endpoint, use azopenai.NewClientForOpenAI keyCredential, err := azopenai.NewKeyCredential("") if err != nil { @@ -57,6 +56,9 @@ func ExampleNewClientWithKeyCredential() { // In Azure OpenAI you must deploy a model before you can use it in your client. For more information // see here: https://learn.microsoft.com/azure/cognitive-services/openai/how-to/create-resource modelDeploymentID := "model deployment ID" + + // NOTE: this constructor creates a client that connects to an Azure OpenAI endpoint. + // To connect to the public OpenAI endpoint, use azopenai.NewClientForOpenAI client, err := azopenai.NewClientWithKeyCredential("https://.openai.azure.com", keyCredential, modelDeploymentID, nil) if err != nil {