@jonab/azure-ai-sdk 0.5.17

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.
Files changed (46) hide show
  1. package/README.md +2 -0
  2. package/dist/adapters/anthropic-adapter.d.ts +172 -0
  3. package/dist/adapters/anthropic-adapter.d.ts.map +1 -0
  4. package/dist/adapters/anthropic-adapter.js +394 -0
  5. package/dist/adapters/anthropic-adapter.js.map +1 -0
  6. package/dist/adapters/index.d.ts +15 -0
  7. package/dist/adapters/index.d.ts.map +1 -0
  8. package/dist/adapters/index.js +85 -0
  9. package/dist/adapters/index.js.map +1 -0
  10. package/dist/adapters/openai-adapter.d.ts +180 -0
  11. package/dist/adapters/openai-adapter.d.ts.map +1 -0
  12. package/dist/adapters/openai-adapter.js +363 -0
  13. package/dist/adapters/openai-adapter.js.map +1 -0
  14. package/dist/adapters/openai-legacy-adapter.d.ts +70 -0
  15. package/dist/adapters/openai-legacy-adapter.d.ts.map +1 -0
  16. package/dist/adapters/openai-legacy-adapter.js +38 -0
  17. package/dist/adapters/openai-legacy-adapter.js.map +1 -0
  18. package/dist/adapters/types.d.ts +109 -0
  19. package/dist/adapters/types.d.ts.map +1 -0
  20. package/dist/adapters/types.js +2 -0
  21. package/dist/adapters/types.js.map +1 -0
  22. package/dist/azure-foundry-chat-language-model.d.ts +37 -0
  23. package/dist/azure-foundry-chat-language-model.d.ts.map +1 -0
  24. package/dist/azure-foundry-chat-language-model.js +119 -0
  25. package/dist/azure-foundry-chat-language-model.js.map +1 -0
  26. package/dist/azure-foundry-chat-options.d.ts +34 -0
  27. package/dist/azure-foundry-chat-options.d.ts.map +1 -0
  28. package/dist/azure-foundry-chat-options.js +2 -0
  29. package/dist/azure-foundry-chat-options.js.map +1 -0
  30. package/dist/azure-foundry-error.d.ts +12 -0
  31. package/dist/azure-foundry-error.d.ts.map +1 -0
  32. package/dist/azure-foundry-error.js +15 -0
  33. package/dist/azure-foundry-error.js.map +1 -0
  34. package/dist/azure-foundry-provider.d.ts +239 -0
  35. package/dist/azure-foundry-provider.d.ts.map +1 -0
  36. package/dist/azure-foundry-provider.js +263 -0
  37. package/dist/azure-foundry-provider.js.map +1 -0
  38. package/dist/index.d.ts +5 -0
  39. package/dist/index.d.ts.map +1 -0
  40. package/dist/index.js +35 -0
  41. package/dist/index.js.map +1 -0
  42. package/dist/version.d.ts +2 -0
  43. package/dist/version.d.ts.map +1 -0
  44. package/dist/version.js +2 -0
  45. package/dist/version.js.map +1 -0
  46. package/package.json +62 -0
@@ -0,0 +1,70 @@
1
+ import { LanguageModelV3CallOptions, SharedV3Warning } from '@ai-sdk/provider';
2
+ import { OpenAIAdapter } from './openai-adapter.js';
3
+ export declare class OpenAILegacyAdapter extends OpenAIAdapter {
4
+ readonly responseSchema: import("zod").ZodObject<{
5
+ id: import("zod").ZodOptional<import("zod").ZodNullable<import("zod").ZodString>>;
6
+ model: import("zod").ZodOptional<import("zod").ZodNullable<import("zod").ZodString>>;
7
+ created: import("zod").ZodOptional<import("zod").ZodNullable<import("zod").ZodNumber>>;
8
+ choices: import("zod").ZodArray<import("zod").ZodObject<{
9
+ index: import("zod").ZodNumber;
10
+ message: import("zod").ZodObject<{
11
+ role: import("zod").ZodOptional<import("zod").ZodNullable<import("zod").ZodLiteral<"assistant">>>;
12
+ content: import("zod").ZodOptional<import("zod").ZodNullable<import("zod").ZodString>>;
13
+ tool_calls: import("zod").ZodOptional<import("zod").ZodNullable<import("zod").ZodArray<import("zod").ZodObject<{
14
+ id: import("zod").ZodString;
15
+ type: import("zod").ZodLiteral<"function">;
16
+ function: import("zod").ZodObject<{
17
+ name: import("zod").ZodString;
18
+ arguments: import("zod").ZodString;
19
+ }, import("zod/v4/core").$strip>;
20
+ }, import("zod/v4/core").$strip>>>>;
21
+ }, import("zod/v4/core").$strip>;
22
+ finish_reason: import("zod").ZodOptional<import("zod").ZodNullable<import("zod").ZodString>>;
23
+ matched_stop: import("zod").ZodOptional<import("zod").ZodNullable<import("zod").ZodUnion<readonly [import("zod").ZodString, import("zod").ZodNumber]>>>;
24
+ logprobs: import("zod").ZodOptional<import("zod").ZodNullable<import("zod").ZodUnknown>>;
25
+ content_filter_results: import("zod").ZodOptional<import("zod").ZodNullable<import("zod").ZodUnknown>>;
26
+ }, import("zod/v4/core").$strip>>;
27
+ usage: import("zod").ZodOptional<import("zod").ZodNullable<import("zod").ZodObject<{
28
+ prompt_tokens: import("zod").ZodOptional<import("zod").ZodNullable<import("zod").ZodNumber>>;
29
+ completion_tokens: import("zod").ZodOptional<import("zod").ZodNullable<import("zod").ZodNumber>>;
30
+ total_tokens: import("zod").ZodOptional<import("zod").ZodNullable<import("zod").ZodNumber>>;
31
+ }, import("zod/v4/core").$strip>>>;
32
+ }, import("zod/v4/core").$strip>;
33
+ readonly chunkSchema: import("zod").ZodObject<{
34
+ id: import("zod").ZodOptional<import("zod").ZodNullable<import("zod").ZodString>>;
35
+ model: import("zod").ZodOptional<import("zod").ZodNullable<import("zod").ZodString>>;
36
+ choices: import("zod").ZodArray<import("zod").ZodObject<{
37
+ index: import("zod").ZodNumber;
38
+ delta: import("zod").ZodObject<{
39
+ role: import("zod").ZodOptional<import("zod").ZodNullable<import("zod").ZodEnum<{
40
+ assistant: "assistant";
41
+ }>>>;
42
+ content: import("zod").ZodOptional<import("zod").ZodNullable<import("zod").ZodString>>;
43
+ reasoning_content: import("zod").ZodOptional<import("zod").ZodNullable<import("zod").ZodString>>;
44
+ tool_calls: import("zod").ZodOptional<import("zod").ZodNullable<import("zod").ZodArray<import("zod").ZodObject<{
45
+ index: import("zod").ZodNumber;
46
+ id: import("zod").ZodOptional<import("zod").ZodNullable<import("zod").ZodString>>;
47
+ type: import("zod").ZodOptional<import("zod").ZodNullable<import("zod").ZodLiteral<"function">>>;
48
+ function: import("zod").ZodObject<{
49
+ name: import("zod").ZodOptional<import("zod").ZodNullable<import("zod").ZodString>>;
50
+ arguments: import("zod").ZodOptional<import("zod").ZodNullable<import("zod").ZodString>>;
51
+ }, import("zod/v4/core").$strip>;
52
+ }, import("zod/v4/core").$strip>>>>;
53
+ }, import("zod/v4/core").$strip>;
54
+ finish_reason: import("zod").ZodOptional<import("zod").ZodNullable<import("zod").ZodString>>;
55
+ matched_stop: import("zod").ZodOptional<import("zod").ZodNullable<import("zod").ZodUnion<readonly [import("zod").ZodString, import("zod").ZodNumber]>>>;
56
+ logprobs: import("zod").ZodOptional<import("zod").ZodNullable<import("zod").ZodUnknown>>;
57
+ content_filter_results: import("zod").ZodOptional<import("zod").ZodNullable<import("zod").ZodUnknown>>;
58
+ }, import("zod/v4/core").$strip>>;
59
+ usage: import("zod").ZodOptional<import("zod").ZodNullable<import("zod").ZodObject<{
60
+ prompt_tokens: import("zod").ZodOptional<import("zod").ZodNullable<import("zod").ZodNumber>>;
61
+ completion_tokens: import("zod").ZodOptional<import("zod").ZodNullable<import("zod").ZodNumber>>;
62
+ total_tokens: import("zod").ZodOptional<import("zod").ZodNullable<import("zod").ZodNumber>>;
63
+ }, import("zod/v4/core").$strip>>>;
64
+ }, import("zod/v4/core").$strip>;
65
+ buildRequest(options: LanguageModelV3CallOptions, modelId: string, modelInBody: boolean): {
66
+ body: Record<string, unknown>;
67
+ warnings: SharedV3Warning[];
68
+ };
69
+ }
70
+ //# sourceMappingURL=openai-legacy-adapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openai-legacy-adapter.d.ts","sourceRoot":"","sources":["../../src/adapters/openai-legacy-adapter.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,0BAA0B,EAC1B,eAAe,EAChB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAA2B,aAAa,EAA2C,MAAM,qBAAqB,CAAC;AAUtH,qBAAa,mBAAoB,SAAQ,aAAa;IACpD,SAAkB,cAAc;;;;;;;;;;;;;;;;;;;;;;;;;;;;qCAAwB;IACxD,SAAkB,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;qCAAqB;IAEzC,YAAY,CACnB,OAAO,EAAE,0BAA0B,EACnC,OAAO,EAAE,MAAM,EACf,WAAW,EAAE,OAAO,GACnB;QAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAAC,QAAQ,EAAE,eAAe,EAAE,CAAA;KAAE;CA2BlE"}
@@ -0,0 +1,38 @@
1
+ import { convertToOpenAIMessages, OpenAIAdapter, openAIChunkSchema, openAIResponseSchema } from './openai-adapter.js';
2
+ // ---------------------------------------------------------------------------
3
+ // OpenAI-legacy adapter (max_tokens — gpt-4o and older)
4
+ //
5
+ // Identical to OpenAIAdapter except:
6
+ // - uses `max_tokens` instead of `max_completion_tokens`
7
+ // - forwards temperature/top_p as-is (older models accept 0 without error)
8
+ // ---------------------------------------------------------------------------
9
+ export class OpenAILegacyAdapter extends OpenAIAdapter {
10
+ responseSchema = openAIResponseSchema;
11
+ chunkSchema = openAIChunkSchema;
12
+ buildRequest(options, modelId, modelInBody) {
13
+ // Delegate to parent to get warnings, tool setup, and message conversion,
14
+ // then swap out the token-limit key and temperature handling.
15
+ const { body, warnings } = super.buildRequest(options, modelId, modelInBody);
16
+ // Parent emits max_completion_tokens — replace with max_tokens
17
+ const { max_completion_tokens, ...rest } = body;
18
+ const legacyBody = {
19
+ ...rest,
20
+ ...(max_completion_tokens !== undefined ? { max_tokens: max_completion_tokens } : {}),
21
+ };
22
+ // Legacy models accept temperature=0 explicitly — override the parent's
23
+ // suppression of 0 values and re-apply the raw SDK values.
24
+ const messages = convertToOpenAIMessages(options.prompt);
25
+ legacyBody.messages = messages;
26
+ if (options.temperature !== undefined)
27
+ legacyBody.temperature = options.temperature;
28
+ if (options.topP !== undefined)
29
+ legacyBody.top_p = options.topP;
30
+ // Clean undefined
31
+ for (const key of Object.keys(legacyBody)) {
32
+ if (legacyBody[key] === undefined)
33
+ delete legacyBody[key];
34
+ }
35
+ return { body: legacyBody, warnings };
36
+ }
37
+ }
38
+ //# sourceMappingURL=openai-legacy-adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openai-legacy-adapter.js","sourceRoot":"","sources":["../../src/adapters/openai-legacy-adapter.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,uBAAuB,EAAE,aAAa,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAEtH,8EAA8E;AAC9E,yDAAyD;AACzD,EAAE;AACF,qCAAqC;AACrC,2DAA2D;AAC3D,6EAA6E;AAC7E,8EAA8E;AAE9E,MAAM,OAAO,mBAAoB,SAAQ,aAAa;IAClC,cAAc,GAAG,oBAAoB,CAAC;IACtC,WAAW,GAAG,iBAAiB,CAAC;IAEzC,YAAY,CACnB,OAAmC,EACnC,OAAe,EACf,WAAoB;QAEpB,0EAA0E;QAC1E,8DAA8D;QAC9D,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,KAAK,CAAC,YAAY,CAAC,OAAO,EAAE,OAAO,EAAE,WAAW,CAAC,CAAC;QAE7E,+DAA+D;QAC/D,MAAM,EAAE,qBAAqB,EAAE,GAAG,IAAI,EAAE,GAAG,IAAI,CAAC;QAChD,MAAM,UAAU,GAA4B;YAC1C,GAAG,IAAI;YACP,GAAG,CAAC,qBAAqB,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,qBAAqB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACtF,CAAC;QAEF,wEAAwE;QACxE,2DAA2D;QAC3D,MAAM,QAAQ,GAAG,uBAAuB,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QACzD,UAAU,CAAC,QAAQ,GAAG,QAAQ,CAAC;QAE/B,IAAI,OAAO,CAAC,WAAW,KAAK,SAAS;YAAE,UAAU,CAAC,WAAW,GAAG,OAAO,CAAC,WAAW,CAAC;QACpF,IAAI,OAAO,CAAC,IAAI,KAAK,SAAS;YAAE,UAAU,CAAC,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC;QAEhE,kBAAkB;QAClB,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC;YAC1C,IAAI,UAAU,CAAC,GAAG,CAAC,KAAK,SAAS;gBAAE,OAAO,UAAU,CAAC,GAAG,CAAC,CAAC;QAC5D,CAAC;QAED,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,CAAC;IACxC,CAAC;CACF"}
@@ -0,0 +1,109 @@
1
+ import { LanguageModelV3CallOptions, LanguageModelV3Content, LanguageModelV3FinishReason, SharedV3Warning } from '@ai-sdk/provider';
2
+ import { ParseResult } from '@ai-sdk/provider-utils';
3
+ import { z } from 'zod';
4
+ export type AdapterType = 'openai' | 'openai-legacy' | 'anthropic';
5
+ export type ParsedResponse = {
6
+ content: LanguageModelV3Content[];
7
+ finishReason: LanguageModelV3FinishReason;
8
+ usage: {
9
+ inputTokens: number | undefined;
10
+ outputTokens: number | undefined;
11
+ };
12
+ };
13
+ export type ParsedStreamChunk = {
14
+ type: 'text-delta';
15
+ id: string;
16
+ delta: string;
17
+ } | {
18
+ type: 'text-start';
19
+ id: string;
20
+ } | {
21
+ type: 'text-end';
22
+ id: string;
23
+ } | {
24
+ type: 'tool-input-start';
25
+ id: string;
26
+ toolName: string;
27
+ } | {
28
+ type: 'tool-input-delta';
29
+ id: string;
30
+ delta: string;
31
+ } | {
32
+ type: 'tool-input-end';
33
+ id: string;
34
+ } | {
35
+ type: 'tool-call';
36
+ toolCallId: string;
37
+ toolName: string;
38
+ input: string;
39
+ } | {
40
+ type: 'finish';
41
+ finishReason: LanguageModelV3FinishReason;
42
+ usage: {
43
+ inputTokens: number | undefined;
44
+ outputTokens: number | undefined;
45
+ };
46
+ } | {
47
+ type: 'error';
48
+ error: unknown;
49
+ };
50
+ /**
51
+ * A ChatAdapter owns the wire-format for a specific model family.
52
+ * It translates between the AI SDK's LanguageModelV3 abstractions and the
53
+ * raw HTTP request/response shapes expected by that family's API.
54
+ *
55
+ * Implementing a new adapter (e.g. Anthropic, Mistral, Cohere) requires only
56
+ * this interface — the core language model class is untouched.
57
+ */
58
+ export interface ChatAdapter<TResponseRaw = unknown, TChunkRaw = unknown> {
59
+ /**
60
+ * Build the JSON request body and surface any unsupported-setting warnings.
61
+ */
62
+ buildRequest(options: LanguageModelV3CallOptions, modelId: string, modelInBody: boolean): {
63
+ body: Record<string, unknown>;
64
+ warnings: SharedV3Warning[];
65
+ };
66
+ /**
67
+ * Zod schema used to validate the non-streaming response.
68
+ */
69
+ responseSchema: z.ZodType<TResponseRaw>;
70
+ /**
71
+ * Zod schema used to validate each SSE chunk in a streaming response.
72
+ */
73
+ chunkSchema: z.ZodType<TChunkRaw>;
74
+ /**
75
+ * Parse a validated non-streaming response into normalised form.
76
+ */
77
+ parseResponse(raw: TResponseRaw): ParsedResponse;
78
+ /**
79
+ * Parse a validated SSE chunk. Returns an array of zero or more stream
80
+ * parts — some chunks carry multiple logical events (e.g. a delta + finish).
81
+ * The language model calls this once per chunk and enqueues every result.
82
+ *
83
+ * Stateful adapters (e.g. tool-call accumulation) should keep their state
84
+ * as instance fields and expose a `flush()` for any deferred events.
85
+ */
86
+ parseChunk(raw: ParseResult<TChunkRaw>): ParsedStreamChunk[];
87
+ /**
88
+ * Called once after the SSE stream closes. Return any deferred events
89
+ * (e.g. completed tool calls, final usage, finish reason).
90
+ */
91
+ flush(): ParsedStreamChunk[];
92
+ /**
93
+ * The URL path suffix appended to the base endpoint when making requests.
94
+ * Defaults to `'/chat/completions'` when not set.
95
+ *
96
+ * Override for model families that use a different path, e.g. Anthropic:
97
+ * `'/anthropic/v1/messages'`
98
+ */
99
+ readonly urlSuffix?: string;
100
+ /**
101
+ * Additional HTTP headers required by this adapter's API.
102
+ * Merged into every request alongside the auth headers.
103
+ *
104
+ * Example — Anthropic requires:
105
+ * `{ 'anthropic-version': '2023-06-01' }`
106
+ */
107
+ readonly additionalHeaders?: Record<string, string>;
108
+ }
109
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/adapters/types.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,0BAA0B,EAC1B,sBAAsB,EACtB,2BAA2B,EAC3B,eAAe,EAChB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AACrD,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAMxB,MAAM,MAAM,WAAW,GAAG,QAAQ,GAAG,eAAe,GAAG,WAAW,CAAC;AAMnE,MAAM,MAAM,cAAc,GAAG;IAC3B,OAAO,EAAE,sBAAsB,EAAE,CAAC;IAClC,YAAY,EAAE,2BAA2B,CAAC;IAC1C,KAAK,EAAE;QACL,WAAW,EAAE,MAAM,GAAG,SAAS,CAAC;QAChC,YAAY,EAAE,MAAM,GAAG,SAAS,CAAC;KAClC,CAAC;CACH,CAAC;AAEF,MAAM,MAAM,iBAAiB,GACzB;IAAE,IAAI,EAAE,YAAY,CAAC;IAAC,EAAE,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GACjD;IAAE,IAAI,EAAE,YAAY,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAE,GAClC;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAE,GAChC;IAAE,IAAI,EAAE,kBAAkB,CAAC;IAAC,EAAE,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,GAC1D;IAAE,IAAI,EAAE,kBAAkB,CAAC;IAAC,EAAE,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GACvD;IAAE,IAAI,EAAE,gBAAgB,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAE,GACtC;IAAE,IAAI,EAAE,WAAW,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GAC1E;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,YAAY,EAAE,2BAA2B,CAAC;IAAC,KAAK,EAAE;QAAE,WAAW,EAAE,MAAM,GAAG,SAAS,CAAC;QAAC,YAAY,EAAE,MAAM,GAAG,SAAS,CAAA;KAAE,CAAA;CAAE,GAC3I;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,KAAK,EAAE,OAAO,CAAA;CAAE,CAAC;AAMtC;;;;;;;GAOG;AACH,MAAM,WAAW,WAAW,CAAC,YAAY,GAAG,OAAO,EAAE,SAAS,GAAG,OAAO;IACtE;;OAEG;IACH,YAAY,CACV,OAAO,EAAE,0BAA0B,EACnC,OAAO,EAAE,MAAM,EACf,WAAW,EAAE,OAAO,GACnB;QACD,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAC9B,QAAQ,EAAE,eAAe,EAAE,CAAC;KAC7B,CAAC;IAEF;;OAEG;IACH,cAAc,EAAE,CAAC,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;IAExC;;OAEG;IACH,WAAW,EAAE,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAElC;;OAEG;IACH,aAAa,CAAC,GAAG,EAAE,YAAY,GAAG,cAAc,CAAC;IAEjD;;;;;;;OAOG;IACH,UAAU,CAAC,GAAG,EAAE,WAAW,CAAC,SAAS,CAAC,GAAG,iBAAiB,EAAE,CAAC;IAE7D;;;OAGG;IACH,KAAK,IAAI,iBAAiB,EAAE,CAAC;IAE7B;;;;;;OAMG;IACH,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAE5B;;;;;;OAMG;IACH,QAAQ,CAAC,iBAAiB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACrD"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/adapters/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,37 @@
1
+ import { LanguageModelV3, LanguageModelV3CallOptions } from '@ai-sdk/provider';
2
+ import { FetchFunction } from '@ai-sdk/provider-utils';
3
+ import { AzureFoundryChatModelId, AzureFoundryChatSettings } from './azure-foundry-chat-options.js';
4
+ type AzureFoundryChatConfig = {
5
+ provider: string;
6
+ /**
7
+ * Builds the full chat completions URL for a given deployment/model ID.
8
+ * Accepts an optional URL path suffix that the adapter may override
9
+ * (e.g. '/anthropic/v1/messages' instead of '/chat/completions').
10
+ */
11
+ url: (modelId: string, urlSuffix?: string) => string;
12
+ /**
13
+ * When true, the model ID is sent in the request body as `model`.
14
+ * Used for AI Foundry inference endpoints (services.ai.azure.com/models).
15
+ */
16
+ modelInBody: boolean;
17
+ /**
18
+ * Returns Bearer token headers for every request.
19
+ */
20
+ headers: () => Promise<Record<string, string>>;
21
+ fetch?: FetchFunction;
22
+ generateId?: () => string;
23
+ };
24
+ export declare class AzureFoundryChatLanguageModel implements LanguageModelV3 {
25
+ readonly specificationVersion: "v3";
26
+ readonly modelId: AzureFoundryChatModelId;
27
+ readonly supportedUrls: Record<string, RegExp[]>;
28
+ private readonly settings;
29
+ private readonly config;
30
+ private readonly _generateId;
31
+ constructor(modelId: AzureFoundryChatModelId, settings: AzureFoundryChatSettings, config: AzureFoundryChatConfig);
32
+ get provider(): string;
33
+ doGenerate(options: LanguageModelV3CallOptions): Promise<Awaited<ReturnType<LanguageModelV3['doGenerate']>>>;
34
+ doStream(options: LanguageModelV3CallOptions): Promise<Awaited<ReturnType<LanguageModelV3['doStream']>>>;
35
+ }
36
+ export {};
37
+ //# sourceMappingURL=azure-foundry-chat-language-model.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"azure-foundry-chat-language-model.d.ts","sourceRoot":"","sources":["../src/azure-foundry-chat-language-model.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,eAAe,EACf,0BAA0B,EAG3B,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,aAAa,EAOd,MAAM,wBAAwB,CAAC;AAGhC,OAAO,EACL,uBAAuB,EACvB,wBAAwB,EACzB,MAAM,iCAAiC,CAAC;AAmBzC,KAAK,sBAAsB,GAAG;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB;;;;OAIG;IACH,GAAG,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,KAAK,MAAM,CAAC;IACrD;;;OAGG;IACH,WAAW,EAAE,OAAO,CAAC;IACrB;;OAEG;IACH,OAAO,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IAC/C,KAAK,CAAC,EAAE,aAAa,CAAC;IACtB,UAAU,CAAC,EAAE,MAAM,MAAM,CAAC;CAC3B,CAAC;AAMF,qBAAa,6BAA8B,YAAW,eAAe;IACnE,QAAQ,CAAC,oBAAoB,EAAG,IAAI,CAAU;IAE9C,QAAQ,CAAC,OAAO,EAAE,uBAAuB,CAAC;IAE1C,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAM;IAEtD,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAA2B;IACpD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAyB;IAChD,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAe;gBAGzC,OAAO,EAAE,uBAAuB,EAChC,QAAQ,EAAE,wBAAwB,EAClC,MAAM,EAAE,sBAAsB;IAQhC,IAAI,QAAQ,IAAI,MAAM,CAErB;IAMK,UAAU,CACd,OAAO,EAAE,0BAA0B,GAClC,OAAO,CAAC,OAAO,CAAC,UAAU,CAAC,eAAe,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;IA6CxD,QAAQ,CACZ,OAAO,EAAE,0BAA0B,GAClC,OAAO,CAAC,OAAO,CAAC,UAAU,CAAC,eAAe,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;CA0E7D"}
@@ -0,0 +1,119 @@
1
+ import { combineHeaders, createEventSourceResponseHandler, createJsonResponseHandler, generateId, postJsonToApi, } from '@ai-sdk/provider-utils';
2
+ import { azureFoundryFailedResponseHandler } from './azure-foundry-error.js';
3
+ import { resolveAdapter } from './adapters/index.js';
4
+ import { VERSION } from './version.js';
5
+ // ---------------------------------------------------------------------------
6
+ // Helpers
7
+ // ---------------------------------------------------------------------------
8
+ function toV3Usage(flat) {
9
+ return {
10
+ inputTokens: { total: flat.inputTokens, noCache: undefined, cacheRead: undefined, cacheWrite: undefined },
11
+ outputTokens: { total: flat.outputTokens, text: undefined, reasoning: undefined },
12
+ };
13
+ }
14
+ // ---------------------------------------------------------------------------
15
+ // Language model implementation
16
+ // ---------------------------------------------------------------------------
17
+ export class AzureFoundryChatLanguageModel {
18
+ specificationVersion = 'v3';
19
+ modelId;
20
+ supportedUrls = {};
21
+ settings;
22
+ config;
23
+ _generateId;
24
+ constructor(modelId, settings, config) {
25
+ this.modelId = modelId;
26
+ this.settings = settings;
27
+ this.config = config;
28
+ this._generateId = config.generateId ?? generateId;
29
+ }
30
+ get provider() {
31
+ return this.config.provider;
32
+ }
33
+ // -------------------------------------------------------------------------
34
+ // doGenerate
35
+ // -------------------------------------------------------------------------
36
+ async doGenerate(options) {
37
+ const adapter = resolveAdapter(this.modelId, this.settings.adapterType, this._generateId);
38
+ const { body, warnings } = adapter.buildRequest(options, this.modelId, this.config.modelInBody);
39
+ const headers = await this.config.headers();
40
+ const { value: response, responseHeaders } = await postJsonToApi({
41
+ url: this.config.url(this.modelId, adapter.urlSuffix),
42
+ headers: combineHeaders(headers, adapter.additionalHeaders, options.headers, {
43
+ 'x-ms-useragent': `@nquandt/azure-ai-sdk/${VERSION}`,
44
+ }),
45
+ body,
46
+ failedResponseHandler: azureFoundryFailedResponseHandler,
47
+ successfulResponseHandler: createJsonResponseHandler(adapter.responseSchema),
48
+ abortSignal: options.abortSignal,
49
+ fetch: this.config.fetch,
50
+ });
51
+ const parsed = adapter.parseResponse(response);
52
+ return {
53
+ content: parsed.content,
54
+ finishReason: parsed.finishReason,
55
+ usage: toV3Usage(parsed.usage),
56
+ warnings,
57
+ request: { body },
58
+ response: { headers: responseHeaders },
59
+ };
60
+ }
61
+ // -------------------------------------------------------------------------
62
+ // doStream
63
+ // -------------------------------------------------------------------------
64
+ async doStream(options) {
65
+ const adapter = resolveAdapter(this.modelId, this.settings.adapterType, this._generateId);
66
+ const { body, warnings } = adapter.buildRequest(options, this.modelId, this.config.modelInBody);
67
+ const headers = await this.config.headers();
68
+ const { value: stream, responseHeaders: streamResponseHeaders } = await postJsonToApi({
69
+ url: this.config.url(this.modelId, adapter.urlSuffix),
70
+ headers: combineHeaders(headers, adapter.additionalHeaders, options.headers, {
71
+ 'x-ms-useragent': `@nquandt/azure-ai-sdk/${VERSION}`,
72
+ }),
73
+ body: {
74
+ ...body,
75
+ stream: true,
76
+ stream_options: { include_usage: true },
77
+ },
78
+ failedResponseHandler: azureFoundryFailedResponseHandler,
79
+ successfulResponseHandler: createEventSourceResponseHandler(adapter.chunkSchema),
80
+ abortSignal: options.abortSignal,
81
+ fetch: this.config.fetch,
82
+ });
83
+ const streamStartPart = {
84
+ type: 'stream-start',
85
+ warnings,
86
+ };
87
+ const coreStream = stream.pipeThrough(new TransformStream({
88
+ start(controller) {
89
+ controller.enqueue(streamStartPart);
90
+ },
91
+ transform(chunk, controller) {
92
+ for (const part of adapter.parseChunk(chunk)) {
93
+ controller.enqueue(part);
94
+ }
95
+ },
96
+ flush(controller) {
97
+ for (const part of adapter.flush()) {
98
+ if (part.type === 'finish') {
99
+ const v3Part = {
100
+ type: 'finish',
101
+ finishReason: part.finishReason,
102
+ usage: toV3Usage(part.usage),
103
+ };
104
+ controller.enqueue(v3Part);
105
+ }
106
+ else {
107
+ controller.enqueue(part);
108
+ }
109
+ }
110
+ },
111
+ }));
112
+ return {
113
+ stream: coreStream,
114
+ request: { body },
115
+ response: { headers: streamResponseHeaders },
116
+ };
117
+ }
118
+ }
119
+ //# sourceMappingURL=azure-foundry-chat-language-model.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"azure-foundry-chat-language-model.js","sourceRoot":"","sources":["../src/azure-foundry-chat-language-model.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,34 @@
1
+ import type { AdapterType } from './adapters/index.js';
2
+ export type AzureFoundryChatModelId = string;
3
+ export interface AzureFoundryChatSettings {
4
+ /**
5
+ * Controls which request/response payload format is used.
6
+ *
7
+ * - `'openai'` — OpenAI chat completions v2 style: `max_completion_tokens`,
8
+ * temperature=0 suppressed. For o-series, gpt-5+.
9
+ * - `'openai-legacy'` — OpenAI chat completions v1 style: `max_tokens`,
10
+ * temperature forwarded as-is. For gpt-4o, gpt-4, gpt-35-turbo.
11
+ * - `'anthropic'` — Anthropic Messages API format. For Claude models
12
+ * served via Azure AI Foundry or an identity gateway.
13
+ *
14
+ * When omitted, the adapter is inferred from the model ID using known
15
+ * naming patterns. Explicit always wins — set this when deploying behind
16
+ * APIM or another gateway where the deployment name doesn't match the
17
+ * underlying model family.
18
+ */
19
+ adapterType?: AdapterType;
20
+ /**
21
+ * Maximum number of tokens to generate in the response.
22
+ */
23
+ maxTokens?: number;
24
+ /**
25
+ * Sampling temperature. Higher values make output more random.
26
+ * Range: 0-2.
27
+ */
28
+ temperature?: number;
29
+ /**
30
+ * Top-p nucleus sampling. Alternative to temperature.
31
+ */
32
+ topP?: number;
33
+ }
34
+ //# sourceMappingURL=azure-foundry-chat-options.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"azure-foundry-chat-options.d.ts","sourceRoot":"","sources":["../src/azure-foundry-chat-options.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAEvD,MAAM,MAAM,uBAAuB,GAAG,MAAM,CAAC;AAE7C,MAAM,WAAW,wBAAwB;IACvC;;;;;;;;;;;;;;OAcG;IACH,WAAW,CAAC,EAAE,WAAW,CAAC;IAE1B;;OAEG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB;;;OAGG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IAErB;;OAEG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;CACf"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=azure-foundry-chat-options.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"azure-foundry-chat-options.js","sourceRoot":"","sources":["../src/azure-foundry-chat-options.ts"],"names":[],"mappings":""}
@@ -0,0 +1,12 @@
1
+ import { z } from 'zod';
2
+ declare const azureFoundryErrorSchema: z.ZodObject<{
3
+ error: z.ZodObject<{
4
+ code: z.ZodOptional<z.ZodNullable<z.ZodString>>;
5
+ message: z.ZodString;
6
+ status: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
7
+ }, z.core.$strip>;
8
+ }, z.core.$strip>;
9
+ export type AzureFoundryErrorData = z.infer<typeof azureFoundryErrorSchema>;
10
+ export declare const azureFoundryFailedResponseHandler: import("@ai-sdk/provider-utils").ResponseHandler<import("@ai-sdk/provider").APICallError>;
11
+ export {};
12
+ //# sourceMappingURL=azure-foundry-error.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"azure-foundry-error.d.ts","sourceRoot":"","sources":["../src/azure-foundry-error.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,QAAA,MAAM,uBAAuB;;;;;;iBAM3B,CAAC;AAEH,MAAM,MAAM,qBAAqB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,uBAAuB,CAAC,CAAC;AAE5E,eAAO,MAAM,iCAAiC,2FAM1C,CAAC"}
@@ -0,0 +1,15 @@
1
+ import { createJsonErrorResponseHandler } from '@ai-sdk/provider-utils';
2
+ import { z } from 'zod';
3
+ const azureFoundryErrorSchema = z.object({
4
+ error: z.object({
5
+ code: z.string().nullish(),
6
+ message: z.string(),
7
+ status: z.number().nullish(),
8
+ }),
9
+ });
10
+ export const azureFoundryFailedResponseHandler = createJsonErrorResponseHandler({
11
+ errorSchema: azureFoundryErrorSchema,
12
+ errorToMessage: (data) => data.error.message,
13
+ isRetryable: (response) => response.status === 429 || response.status >= 500,
14
+ });
15
+ //# sourceMappingURL=azure-foundry-error.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"azure-foundry-error.js","sourceRoot":"","sources":["../src/azure-foundry-error.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,8BAA8B,EAAE,MAAM,wBAAwB,CAAC;AACxE,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,MAAM,uBAAuB,GAAG,CAAC,CAAC,MAAM,CAAC;IACvC,KAAK,EAAE,CAAC,CAAC,MAAM,CAAC;QACd,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,EAAE;QAC1B,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE;QACnB,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,EAAE;KAC7B,CAAC;CACH,CAAC,CAAC;AAIH,MAAM,CAAC,MAAM,iCAAiC,GAC5C,8BAA8B,CAAC;IAC7B,WAAW,EAAE,uBAAuB;IACpC,cAAc,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO;IAC5C,WAAW,EAAE,CAAC,QAAQ,EAAE,EAAE,CACxB,QAAQ,CAAC,MAAM,KAAK,GAAG,IAAI,QAAQ,CAAC,MAAM,IAAI,GAAG;CACpD,CAAC,CAAC"}