@opencode-ai/ai 0.0.0-next-16895 → 0.0.0-next-16896

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -11,7 +11,7 @@ type AzureURL = AtLeastOne<{
11
11
  export type LanguageModelOptions = AzureURL & RouteDefaultsInput & ProviderAuthOption<"optional"> & {
12
12
  readonly apiVersion?: string;
13
13
  readonly queryParams?: Record<string, string>;
14
- readonly useCompletionUrls?: boolean;
14
+ readonly useDeploymentBasedUrls?: boolean;
15
15
  readonly providerOptions?: OpenAIProviderOptionsInput;
16
16
  };
17
17
  export type Config = LanguageModelOptions;
@@ -19,6 +19,7 @@ export type Settings = ProviderPackage.Settings & AzureURL & {
19
19
  readonly apiKey?: string;
20
20
  readonly apiVersion?: string;
21
21
  readonly queryParams?: Readonly<Record<string, string>>;
22
+ readonly useDeploymentBasedUrls?: boolean;
22
23
  readonly providerOptions?: OpenAIProviderOptionsInput;
23
24
  };
24
25
  export declare const routes: (RouteDef<{
@@ -3,29 +3,24 @@ import {} from "../route/auth-options";
3
3
  import { ProviderID } from "../schema";
4
4
  import * as OpenAIChat from "../protocols/openai-chat";
5
5
  import * as OpenAIResponses from "../protocols/openai-responses";
6
+ import { ProviderShared } from "../protocols/shared";
6
7
  import { withOpenAIOptions } from "./openai-options";
7
8
  export const id = ProviderID.make("azure");
8
9
  const routeAuth = Auth.remove("authorization");
9
- const resourceBaseURL = (resourceName) => `https://${resourceName.trim()}.openai.azure.com/openai/v1`;
10
+ const resourceBaseURL = (resourceName) => `https://${resourceName.trim()}.openai.azure.com/openai`;
10
11
  const responsesRoute = OpenAIResponses.route.with({
11
12
  id: "azure-openai-responses",
12
13
  provider: id,
13
14
  auth: routeAuth,
14
- endpoint: {
15
- query: { "api-version": "v1" },
16
- },
17
15
  });
18
16
  const chatRoute = OpenAIChat.route.with({
19
17
  id: "azure-openai-chat",
20
18
  provider: id,
21
19
  auth: routeAuth,
22
- endpoint: {
23
- query: { "api-version": "v1" },
24
- },
25
20
  });
26
21
  export const routes = [responsesRoute, chatRoute];
27
22
  const defaults = (input) => {
28
- const { apiKey: _, apiVersion: _apiVersion, resourceName: _resourceName, useCompletionUrls: _useCompletionUrls, baseURL: _baseURL, queryParams: _queryParams, ...rest } = input;
23
+ const { apiKey: _, apiVersion: _apiVersion, resourceName: _resourceName, useDeploymentBasedUrls: _useDeploymentBasedUrls, baseURL: _baseURL, queryParams: _queryParams, ...rest } = input;
29
24
  if ("auth" in rest) {
30
25
  const { auth: _, ...withoutAuth } = rest;
31
26
  return withoutAuth;
@@ -39,30 +34,31 @@ const auth = (input) => {
39
34
  .orElse(Auth.config("AZURE_OPENAI_API_KEY"))
40
35
  .pipe(Auth.header("api-key")));
41
36
  };
42
- const configuredRoute = (route, input) => route.with({
37
+ const configuredRoute = (route, input, modelID) => route.with({
43
38
  auth: auth(input),
44
- endpoint: {
45
- // AtLeastOne guarantees at least one is set; baseURL wins if both are.
46
- baseURL: input.baseURL ?? resourceBaseURL(input.resourceName),
47
- query: {
48
- ...(input.apiVersion ? { "api-version": input.apiVersion } : {}),
49
- ...input.queryParams,
50
- },
51
- },
39
+ endpoint: endpoint(input, modelID),
52
40
  });
41
+ function endpoint(input, modelID) {
42
+ const baseURL = ProviderShared.trimBaseUrl(input.baseURL ?? resourceBaseURL(input.resourceName));
43
+ const query = { "api-version": input.apiVersion ?? "v1", ...input.queryParams };
44
+ if (input.useDeploymentBasedUrls)
45
+ return { baseURL: `${baseURL}/deployments/${modelID}`, query };
46
+ if (input.baseURL !== undefined && !new URL(input.baseURL).hostname.endsWith(".openai.azure.com")) {
47
+ return { baseURL, query: input.queryParams };
48
+ }
49
+ return { baseURL: `${baseURL}/v1`, query };
50
+ }
53
51
  export const configure = (input) => {
54
- const configuredResponsesRoute = configuredRoute(responsesRoute, input);
55
- const configuredChatRoute = configuredRoute(chatRoute, input);
56
52
  const modelDefaults = defaults(input);
57
- const responses = (modelID) => configuredResponsesRoute
53
+ const responses = (modelID) => configuredRoute(responsesRoute, input, modelID)
58
54
  .with(withOpenAIOptions(modelID, modelDefaults))
59
55
  .model({ id: modelID });
60
- const chat = (modelID) => configuredChatRoute
56
+ const chat = (modelID) => configuredRoute(chatRoute, input, modelID)
61
57
  .with(withOpenAIOptions(modelID, modelDefaults))
62
58
  .model({ id: modelID });
63
59
  return {
64
60
  id,
65
- model: (modelID) => (input.useCompletionUrls === true ? chat(modelID) : responses(modelID)),
61
+ model: responses,
66
62
  responses,
67
63
  chat,
68
64
  configure,
@@ -81,6 +77,7 @@ const config = (settings) => {
81
77
  limits: settings.limits,
82
78
  providerOptions: settings.providerOptions,
83
79
  queryParams: settings.queryParams === undefined ? undefined : { ...settings.queryParams },
80
+ useDeploymentBasedUrls: settings.useDeploymentBasedUrls,
84
81
  };
85
82
  if (settings.baseURL !== undefined)
86
83
  return { ...common, baseURL: settings.baseURL };
@@ -8,8 +8,7 @@ import { Protocol } from "../route/protocol";
8
8
  import { ProviderID } from "../schema";
9
9
  import { GoogleVertexShared } from "./google-vertex-shared";
10
10
  const VERSION = "vertex-2023-10-16";
11
- // models.dev uses this provider id even though the API contract is Anthropic Messages.
12
- export const id = ProviderID.make("google-vertex-anthropic");
11
+ export const id = ProviderID.make("google-vertex");
13
12
  const route = Route.make({
14
13
  id: "google-vertex-messages",
15
14
  provider: id,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "$schema": "https://json.schemastore.org/package.json",
3
- "version": "0.0.0-next-16895",
3
+ "version": "0.0.0-next-16896",
4
4
  "name": "@opencode-ai/ai",
5
5
  "type": "module",
6
6
  "license": "MIT",
@@ -30,7 +30,7 @@
30
30
  "devDependencies": {
31
31
  "@clack/prompts": "1.0.0-alpha.1",
32
32
  "@effect/platform-node": "4.0.0-beta.101",
33
- "@opencode-ai/http-recorder": "0.0.0-next-16895",
33
+ "@opencode-ai/http-recorder": "0.0.0-next-16896",
34
34
  "@tsconfig/bun": "1.0.9",
35
35
  "@types/bun": "1.3.13",
36
36
  "@typescript/native-preview": "7.0.0-dev.20251207.1",
@@ -39,7 +39,7 @@
39
39
  "dependencies": {
40
40
  "@smithy/eventstream-codec": "4.2.14",
41
41
  "@smithy/util-utf8": "4.2.2",
42
- "@opencode-ai/schema": "0.0.0-next-16895",
42
+ "@opencode-ai/schema": "0.0.0-next-16896",
43
43
  "aws4fetch": "1.0.20",
44
44
  "effect": "4.0.0-beta.101",
45
45
  "google-auth-library": "10.5.0"