1package providertests
2
3import (
4 "cmp"
5 "net/http"
6 "os"
7 "testing"
8
9 "charm.land/fantasy"
10 "charm.land/fantasy/providers/azure"
11 "charm.land/fantasy/providers/openai"
12 "github.com/stretchr/testify/require"
13 "gopkg.in/dnaeon/go-vcr.v4/pkg/recorder"
14)
15
16const defaultBaseURL = "https://fantasy-playground-resource.openai.azure.com"
17
18func TestAzureCommon(t *testing.T) {
19 testCommon(t, []builderPair{
20 {"azure-o4-mini", builderAzureO4Mini, nil, nil},
21 {"azure-gpt-5-mini", builderAzureGpt5Mini, nil, nil},
22 {"azure-grok-3-mini", builderAzureGrok3Mini, nil, nil},
23 })
24}
25
26func TestAzureThinking(t *testing.T) {
27 opts := fantasy.ProviderOptions{
28 openai.Name: &openai.ProviderOptions{
29 ReasoningEffort: openai.ReasoningEffortOption(openai.ReasoningEffortHigh),
30 },
31 }
32 testThinking(t, []builderPair{
33 {"azure-gpt-5-mini", builderAzureGpt5Mini, opts, nil},
34 {"azure-grok-3-mini", builderAzureGrok3Mini, opts, nil},
35 }, testAzureThinking)
36}
37
38func testAzureThinking(t *testing.T, result *fantasy.AgentResult) {
39 require.Greater(t, result.Response.Usage.ReasoningTokens, int64(0), "expected reasoning tokens, got none")
40}
41
42func builderAzureO4Mini(t *testing.T, r *recorder.Recorder) (fantasy.LanguageModel, error) {
43 provider, err := azure.New(
44 azure.WithBaseURL(cmp.Or(os.Getenv("FANTASY_AZURE_BASE_URL"), defaultBaseURL)),
45 azure.WithAPIKey(cmp.Or(os.Getenv("FANTASY_AZURE_API_KEY"), "(missing)")),
46 azure.WithHTTPClient(&http.Client{Transport: r}),
47 )
48 if err != nil {
49 return nil, err
50 }
51 return provider.LanguageModel(t.Context(), "o4-mini")
52}
53
54func builderAzureGpt5Mini(t *testing.T, r *recorder.Recorder) (fantasy.LanguageModel, error) {
55 provider, err := azure.New(
56 azure.WithBaseURL(cmp.Or(os.Getenv("FANTASY_AZURE_BASE_URL"), defaultBaseURL)),
57 azure.WithAPIKey(cmp.Or(os.Getenv("FANTASY_AZURE_API_KEY"), "(missing)")),
58 azure.WithHTTPClient(&http.Client{Transport: r}),
59 )
60 if err != nil {
61 return nil, err
62 }
63 return provider.LanguageModel(t.Context(), "gpt-5-mini")
64}
65
66func builderAzureGrok3Mini(t *testing.T, r *recorder.Recorder) (fantasy.LanguageModel, error) {
67 provider, err := azure.New(
68 azure.WithBaseURL(cmp.Or(os.Getenv("FANTASY_AZURE_BASE_URL"), defaultBaseURL)),
69 azure.WithAPIKey(cmp.Or(os.Getenv("FANTASY_AZURE_API_KEY"), "(missing)")),
70 azure.WithHTTPClient(&http.Client{Transport: r}),
71 )
72 if err != nil {
73 return nil, err
74 }
75 return provider.LanguageModel(t.Context(), "grok-3-mini")
76}