55 "net/http"
66 "net/url"
77 "strconv"
8+ "strings"
89
910 "gomodel/internal/core"
1011 "gomodel/internal/llmclient"
@@ -22,34 +23,46 @@ var Registration = providers.Registration{
2223
2324type Provider struct {
2425 * openai.CompatibleProvider
25- apiVersion string
26+ resourceProvider * openai.CompatibleProvider
27+ apiVersion string
2628}
2729
2830func New (apiKey string , opts providers.ProviderOptions ) core.Provider {
2931 p := & Provider {apiVersion : defaultAPIVersion }
30- p . CompatibleProvider = openai . NewCompatibleProvider ( apiKey , opts , openai.CompatibleProviderConfig {
32+ cfg := openai.CompatibleProviderConfig {
3133 ProviderName : "azure" ,
3234 DefaultBaseURL : "https://example.invalid" ,
3335 SetHeaders : setHeaders ,
34- })
36+ }
37+ p .CompatibleProvider = openai .NewCompatibleProvider (apiKey , opts , cfg )
38+ p .resourceProvider = openai .NewCompatibleProvider (apiKey , opts , cfg )
3539 p .SetRequestMutator (p .mutateRequest )
40+ p .resourceProvider .SetRequestMutator (p .mutateRequest )
3641 return p
3742}
3843
3944func NewWithHTTPClient (apiKey string , httpClient * http.Client , hooks llmclient.Hooks ) * Provider {
4045 p := & Provider {apiVersion : defaultAPIVersion }
41- p . CompatibleProvider = openai . NewCompatibleProviderWithHTTPClient ( apiKey , httpClient , hooks , openai.CompatibleProviderConfig {
46+ cfg := openai.CompatibleProviderConfig {
4247 ProviderName : "azure" ,
4348 DefaultBaseURL : "https://example.invalid" ,
4449 SetHeaders : setHeaders ,
45- })
50+ }
51+ p .CompatibleProvider = openai .NewCompatibleProviderWithHTTPClient (apiKey , httpClient , hooks , cfg )
52+ p .resourceProvider = openai .NewCompatibleProviderWithHTTPClient (apiKey , httpClient , hooks , cfg )
4653 p .SetRequestMutator (p .mutateRequest )
54+ p .resourceProvider .SetRequestMutator (p .mutateRequest )
4755 return p
4856}
4957
58+ func (p * Provider ) SetBaseURL (baseURL string ) {
59+ p .CompatibleProvider .SetBaseURL (baseURL )
60+ p .resourceProvider .SetBaseURL (resourceRootBaseURL (baseURL ))
61+ }
62+
5063func (p * Provider ) ListModels (ctx context.Context ) (* core.ModelsResponse , error ) {
5164 var resp core.ModelsResponse
52- if err := p .Do (ctx , llmclient.Request {
65+ if err := p .resourceProvider . Do (ctx , llmclient.Request {
5366 Method : http .MethodGet ,
5467 Endpoint : "/openai/models" ,
5568 }, & resp ); err != nil {
@@ -63,7 +76,7 @@ func (p *Provider) CreateBatch(ctx context.Context, req *core.BatchRequest) (*co
6376 return nil , core .NewInvalidRequestError ("batch request is required" , nil )
6477 }
6578 var resp core.BatchResponse
66- if err := p .Do (ctx , llmclient.Request {
79+ if err := p .resourceProvider . Do (ctx , llmclient.Request {
6780 Method : http .MethodPost ,
6881 Endpoint : "/openai/batches" ,
6982 Body : req ,
@@ -78,7 +91,7 @@ func (p *Provider) CreateBatch(ctx context.Context, req *core.BatchRequest) (*co
7891
7992func (p * Provider ) GetBatch (ctx context.Context , id string ) (* core.BatchResponse , error ) {
8093 var resp core.BatchResponse
81- if err := p .Do (ctx , llmclient.Request {
94+ if err := p .resourceProvider . Do (ctx , llmclient.Request {
8295 Method : http .MethodGet ,
8396 Endpoint : "/openai/batches/" + url .PathEscape (id ),
8497 }, & resp ); err != nil {
@@ -105,7 +118,7 @@ func (p *Provider) ListBatches(ctx context.Context, limit int, after string) (*c
105118 }
106119
107120 var resp core.BatchListResponse
108- if err := p .Do (ctx , llmclient.Request {
121+ if err := p .resourceProvider . Do (ctx , llmclient.Request {
109122 Method : http .MethodGet ,
110123 Endpoint : endpoint ,
111124 }, & resp ); err != nil {
@@ -121,7 +134,7 @@ func (p *Provider) ListBatches(ctx context.Context, limit int, after string) (*c
121134
122135func (p * Provider ) CancelBatch (ctx context.Context , id string ) (* core.BatchResponse , error ) {
123136 var resp core.BatchResponse
124- if err := p .Do (ctx , llmclient.Request {
137+ if err := p .resourceProvider . Do (ctx , llmclient.Request {
125138 Method : http .MethodPost ,
126139 Endpoint : "/openai/batches/" + url .PathEscape (id ) + "/cancel" ,
127140 }, & resp ); err != nil {
@@ -169,3 +182,25 @@ func isValidClientRequestID(id string) bool {
169182 }
170183 return true
171184}
185+
186+ func resourceRootBaseURL (baseURL string ) string {
187+ parsed , err := url .Parse (strings .TrimSpace (baseURL ))
188+ if err != nil {
189+ return strings .TrimRight (strings .TrimSpace (baseURL ), "/" )
190+ }
191+
192+ path := strings .TrimRight (parsed .Path , "/" )
193+ for _ , marker := range []string {"/openai/deployments/" , "/deployments/" } {
194+ if idx := strings .Index (path , marker ); idx >= 0 {
195+ path = path [:idx ]
196+ break
197+ }
198+ }
199+
200+ parsed .Path = path
201+ parsed .RawPath = ""
202+ parsed .RawQuery = ""
203+ parsed .Fragment = ""
204+
205+ return strings .TrimRight (parsed .String (), "/" )
206+ }
0 commit comments