Skip to content

Commit 1e4fb7e

Browse files
[azopenai] Fixing example's typo, creating a constructor for KeyCredential (Azure#21042)
Fixing a few things based on feedback from @JeffreyRichter. - Example had a typo and a hardcoded calculation. - Adding a constructor for KeyCredential.
1 parent 9c53d0f commit 1e4fb7e

File tree

8 files changed

+60
-30
lines changed

8 files changed

+60
-30
lines changed

sdk/cognitiveservices/azopenai/README.md

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -91,11 +91,9 @@ the [Code of Conduct FAQ][coc_faq] or contact [opencode@microsoft.com][coc_conta
9191
comments.
9292

9393
<!-- LINKS -->
94-
<!-- https://github.com/Azure/azure-sdk-for-go/tree/main/sdk/cognitiveservices/azopenai ->
95-
<!-- https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/cognitiveservices/azopenai -->
9694
[azure_openai_access]: https://learn.microsoft.com/azure/cognitive-services/openai/overview#how-do-i-get-access-to-azure-openai
97-
[azopenai_repo]: https://github.com/Azure/azure-sdk-for-go/tree/main/sdk
98-
[azopenai_pkg_go]: https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk
95+
[azopenai_repo]: https://github.com/Azure/azure-sdk-for-go/tree/main/sdk/cognitiveservices/azopenai
96+
[azopenai_pkg_go]: https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/cognitiveservices/azopenai
9997
[azure_identity]: https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/azidentity
10098
[azure_sub]: https://azure.microsoft.com/free/
10199
[openai_docs]: https://learn.microsoft.com/azure/cognitive-services/openai
@@ -104,4 +102,4 @@ comments.
104102
[cla]: https://cla.microsoft.com
105103
[coc]: https://opensource.microsoft.com/codeofconduct/
106104
[coc_faq]: https://opensource.microsoft.com/codeofconduct/faq/
107-
[coc_contact]: mailto:opencode@microsoft.com
105+
[coc_contact]: mailto:opencode@microsoft.com

sdk/cognitiveservices/azopenai/assets.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,5 +2,5 @@
22
"AssetsRepo": "Azure/azure-sdk-assets",
33
"AssetsRepoPrefixPath": "go",
44
"TagPrefix": "go/cognitiveservices/azopenai",
5-
"Tag": "go/cognitiveservices/azopenai_0bc6dc4171"
5+
"Tag": "go/cognitiveservices/azopenai_49bcacb061"
66
}

sdk/cognitiveservices/azopenai/client_test.go

Lines changed: 19 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,9 @@ import (
2626
func TestClient_GetChatCompletions(t *testing.T) {
2727
deploymentID := "gpt-35-turbo"
2828

29-
cred := KeyCredential{APIKey: apiKey}
29+
cred, err := NewKeyCredential(apiKey)
30+
require.NoError(t, err)
31+
3032
chatClient, err := NewClientWithKeyCredential(endpoint, cred, deploymentID, newClientOptionsForTest(t))
3133
require.NoError(t, err)
3234

@@ -158,7 +160,9 @@ func testGetChatCompletions(t *testing.T, chatClient *Client, modelOrDeployment
158160
}
159161

160162
func TestClient_GetChatCompletions_InvalidModel(t *testing.T) {
161-
cred := KeyCredential{APIKey: apiKey}
163+
cred, err := NewKeyCredential(apiKey)
164+
require.NoError(t, err)
165+
162166
chatClient, err := NewClientWithKeyCredential(endpoint, cred, "thisdoesntexist", newClientOptionsForTest(t))
163167
require.NoError(t, err)
164168

@@ -179,7 +183,9 @@ func TestClient_GetChatCompletions_InvalidModel(t *testing.T) {
179183
}
180184

181185
func TestClient_GetEmbeddings_InvalidModel(t *testing.T) {
182-
cred := KeyCredential{APIKey: apiKey}
186+
cred, err := NewKeyCredential(apiKey)
187+
require.NoError(t, err)
188+
183189
chatClient, err := NewClientWithKeyCredential(endpoint, cred, "thisdoesntexist", newClientOptionsForTest(t))
184190
require.NoError(t, err)
185191

@@ -197,7 +203,9 @@ func TestClient_GetCompletions(t *testing.T) {
197203
body CompletionsOptions
198204
options *GetCompletionsOptions
199205
}
200-
cred := KeyCredential{APIKey: apiKey}
206+
cred, err := NewKeyCredential(apiKey)
207+
require.NoError(t, err)
208+
201209
client, err := NewClientWithKeyCredential(endpoint, cred, streamingModelDeployment, newClientOptionsForTest(t))
202210
if err != nil {
203211
log.Fatalf("%v", err)
@@ -267,7 +275,9 @@ func TestClient_GetEmbeddings(t *testing.T) {
267275
// model deployment points to `text-similarity-curie-001`
268276
deploymentID := "embedding"
269277

270-
cred := KeyCredential{APIKey: apiKey}
278+
cred, err := NewKeyCredential(apiKey)
279+
require.NoError(t, err)
280+
271281
client, err := NewClientWithKeyCredential(endpoint, cred, deploymentID, newClientOptionsForTest(t))
272282
require.NoError(t, err)
273283

@@ -330,7 +340,10 @@ func newOpenAIClientForTest(t *testing.T) *Client {
330340
t.Skipf("OPENAI_API_KEY not defined, skipping OpenAI public endpoint test")
331341
}
332342

333-
chatClient, err := NewClientForOpenAI(openAIEndpoint, KeyCredential{APIKey: openAIKey}, newClientOptionsForTest(t))
343+
cred, err := NewKeyCredential(openAIKey)
344+
require.NoError(t, err)
345+
346+
chatClient, err := NewClientForOpenAI(openAIEndpoint, cred, newClientOptionsForTest(t))
334347
require.NoError(t, err)
335348

336349
return chatClient

sdk/cognitiveservices/azopenai/custom_client.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -104,7 +104,7 @@ func newOpenAIPolicy(cred KeyCredential) *openAIPolicy {
104104
func (b *openAIPolicy) Do(req *policy.Request) (*http.Response, error) {
105105
q := req.Raw().URL.Query()
106106
q.Del("api-version")
107-
req.Raw().Header.Set("authorization", "Bearer "+b.cred.APIKey)
107+
req.Raw().Header.Set("authorization", "Bearer "+b.cred.apiKey)
108108
return req.Next()
109109
}
110110

sdk/cognitiveservices/azopenai/custom_client_test.go

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ import (
1515

1616
"github.com/Azure/azure-sdk-for-go/sdk/azcore"
1717
"github.com/Azure/azure-sdk-for-go/sdk/azcore/to"
18+
"github.com/stretchr/testify/require"
1819
)
1920

2021
func TestNewClient(t *testing.T) {
@@ -78,10 +79,12 @@ func TestNewClientWithKeyCredential(t *testing.T) {
7879
func TestClient_GetCompletionsStream(t *testing.T) {
7980
body := CompletionsOptions{
8081
Prompt: []*string{to.Ptr("What is Azure OpenAI?")},
81-
MaxTokens: to.Ptr(int32(2048 - 127)),
82+
MaxTokens: to.Ptr(int32(2048)),
8283
Temperature: to.Ptr(float32(0.0)),
8384
}
84-
cred := KeyCredential{APIKey: apiKey}
85+
86+
cred, err := NewKeyCredential(apiKey)
87+
require.NoError(t, err)
8588

8689
client, err := NewClientWithKeyCredential(endpoint, cred, streamingModelDeployment, newClientOptionsForTest(t))
8790
if err != nil {

sdk/cognitiveservices/azopenai/examples_client_test.go

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,10 @@ import (
1818
func ExampleNewClientForOpenAI() {
1919
// NOTE: this constructor creates a client that connects to the public OpenAI endpoint.
2020
// To connect to an Azure OpenAI endpoint, use azopenai.NewClient() or azopenai.NewClientWithyKeyCredential.
21-
keyCredential := azopenai.KeyCredential{
22-
APIKey: "open-ai-apikey",
21+
keyCredential, err := azopenai.NewKeyCredential("<OpenAI-APIKey>")
22+
23+
if err != nil {
24+
panic(err)
2325
}
2426

2527
client, err := azopenai.NewClientForOpenAI("https://api.openai.com/v1", keyCredential, nil)
@@ -53,8 +55,10 @@ func ExampleNewClient() {
5355
func ExampleNewClientWithKeyCredential() {
5456
// NOTE: this constructor creates a client that connects to an Azure OpenAI endpoint.
5557
// To connect to the public OpenAI endpoint, use azopenai.NewClientForOpenAI
56-
keyCredential := azopenai.KeyCredential{
57-
APIKey: "Azure OpenAI apikey",
58+
keyCredential, err := azopenai.NewKeyCredential("<Azure-OpenAI-APIKey>")
59+
60+
if err != nil {
61+
panic(err)
5862
}
5963

6064
modelDeploymentID := "model deployment ID"
@@ -78,8 +82,10 @@ func ExampleClient_GetCompletionsStream() {
7882
return
7983
}
8084

81-
keyCredential := azopenai.KeyCredential{
82-
APIKey: azureOpenAIKey,
85+
keyCredential, err := azopenai.NewKeyCredential(azureOpenAIKey)
86+
87+
if err != nil {
88+
panic(err)
8389
}
8490

8591
client, err := azopenai.NewClientWithKeyCredential(azureOpenAIEndpoint, keyCredential, modelDeploymentID, nil)
@@ -90,7 +96,7 @@ func ExampleClient_GetCompletionsStream() {
9096

9197
resp, err := client.GetCompletionsStream(context.TODO(), azopenai.CompletionsOptions{
9298
Prompt: []*string{to.Ptr("What is Azure OpenAI?")},
93-
MaxTokens: to.Ptr(int32(2048 - 127)),
99+
MaxTokens: to.Ptr(int32(2048)),
94100
Temperature: to.Ptr(float32(0.0)),
95101
}, nil)
96102

@@ -102,7 +108,7 @@ func ExampleClient_GetCompletionsStream() {
102108
entry, err := resp.CompletionsStream.Read()
103109

104110
if errors.Is(err, io.EOF) {
105-
fmt.Printf("More more completions")
111+
fmt.Printf("\n *** No more completions ***\n")
106112
break
107113
}
108114

sdk/cognitiveservices/azopenai/policy_apikey.go

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,14 @@ import (
1414

1515
// KeyCredential is used when doing APIKey-based authentication.
1616
type KeyCredential struct {
17-
// APIKey is the api key for the client.
18-
APIKey string
17+
// apiKey is the api key for the client.
18+
apiKey string
19+
}
20+
21+
// NewKeyCredential creates a KeyCredential containing an API key for
22+
// either Azure OpenAI or OpenAI.
23+
func NewKeyCredential(apiKey string) (KeyCredential, error) {
24+
return KeyCredential{apiKey: apiKey}, nil
1925
}
2026

2127
// apiKeyPolicy authorizes requests with an API key acquired from a KeyCredential.
@@ -35,6 +41,6 @@ func newAPIKeyPolicy(cred KeyCredential, header string) *apiKeyPolicy {
3541

3642
// Do returns a function which authorizes req with a token from the policy's credential
3743
func (b *apiKeyPolicy) Do(req *policy.Request) (*http.Response, error) {
38-
req.Raw().Header.Set(b.header, b.cred.APIKey)
44+
req.Raw().Header.Set(b.header, b.cred.apiKey)
3945
return req.Next()
4046
}

sdk/cognitiveservices/azopenai/policy_apikey_test.go

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import (
1414

1515
"github.com/Azure/azure-sdk-for-go/sdk/azcore/policy"
1616
"github.com/Azure/azure-sdk-for-go/sdk/azcore/runtime"
17+
"github.com/stretchr/testify/require"
1718

1819
"github.com/Azure/azure-sdk-for-go/sdk/internal/mock"
1920
)
@@ -23,7 +24,9 @@ func TestNewAPIKeyPolicy(t *testing.T) {
2324
header string
2425
cred KeyCredential
2526
}
26-
simpleCred := KeyCredential{APIKey: "apiKey"}
27+
simpleCred, err := NewKeyCredential("apiKey")
28+
require.NoError(t, err)
29+
2730
simpleHeader := "headerName"
2831
tests := []struct {
2932
name string
@@ -55,9 +58,10 @@ func TestAPIKeyPolicy_Success(t *testing.T) {
5558
srv, close := mock.NewTLSServer()
5659
defer close()
5760
srv.AppendResponse(mock.WithStatusCode(http.StatusOK))
58-
cred := KeyCredential{
59-
APIKey: "secret",
60-
}
61+
62+
cred, err := NewKeyCredential("secret")
63+
require.NoError(t, err)
64+
6165
authPolicy := newAPIKeyPolicy(cred, "api-key")
6266
pipeline := runtime.NewPipeline(
6367
"testmodule",

0 commit comments

Comments
 (0)