@ax-llm/ax-ai-aws-bedrock 22.0.7 → 22.0.9
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.
- package/README.md +5 -7
- package/index.cjs +2 -2
- package/index.cjs.map +1 -1
- package/index.d.cts +2 -1
- package/index.d.ts +2 -1
- package/index.js +2 -2
- package/index.js.map +1 -1
- package/package.json +2 -3
package/README.md
CHANGED
|
@@ -4,7 +4,7 @@ Production-ready AWS Bedrock integration for AX library. Supports Claude, GPT OS
|
|
|
4
4
|
|
|
5
5
|
## Features
|
|
6
6
|
|
|
7
|
-
- **Claude models**:
|
|
7
|
+
- **Claude models**: Opus 4.5, Sonnet 4.0, Sonnet 3.7, Sonnet 3.5
|
|
8
8
|
- **GPT OSS models**: 120B, 20B
|
|
9
9
|
- **Embeddings**: Titan Embed V2
|
|
10
10
|
- Regional failover (separate configs for Claude and GPT)
|
|
@@ -26,7 +26,7 @@ const ai = new AxAIBedrock({
|
|
|
26
26
|
region: 'us-east-2',
|
|
27
27
|
fallbackRegions: ['us-west-2', 'us-east-1'],
|
|
28
28
|
config: {
|
|
29
|
-
model: AxAIBedrockModel.
|
|
29
|
+
model: AxAIBedrockModel.ClaudeOpus45,
|
|
30
30
|
temperature: 0.7,
|
|
31
31
|
maxTokens: 4096,
|
|
32
32
|
},
|
|
@@ -45,20 +45,18 @@ const response = await ai.chat({
|
|
|
45
45
|
```typescript
|
|
46
46
|
import { AxSignature, AxGen } from '@ax-llm/ax';
|
|
47
47
|
|
|
48
|
-
const ai = new AxAIBedrock({ config: { model: AxAIBedrockModel.
|
|
48
|
+
const ai = new AxAIBedrock({ config: { model: AxAIBedrockModel.ClaudeOpus45 } });
|
|
49
49
|
const summarize = AxSignature.from('document: string -> summary: string');
|
|
50
50
|
const program = new AxGen(summarize, { ai });
|
|
51
51
|
|
|
52
52
|
const result = await program.forward({ document: 'Your text...' });
|
|
53
53
|
```
|
|
54
54
|
|
|
55
|
-
##
|
|
55
|
+
## Recommended Models
|
|
56
56
|
|
|
57
57
|
```typescript
|
|
58
58
|
// Claude
|
|
59
|
-
AxAIBedrockModel.
|
|
60
|
-
AxAIBedrockModel.Claude37Sonnet; // anthropic.claude-3-7-sonnet-20250219-v1:0
|
|
61
|
-
AxAIBedrockModel.Claude35Sonnet; // anthropic.claude-3-5-sonnet-20240620-v1:0
|
|
59
|
+
AxAIBedrockModel.ClaudeOpus45; // us.anthropic.claude-opus-4-5-20251101-v1:0
|
|
62
60
|
|
|
63
61
|
// GPT OSS
|
|
64
62
|
AxAIBedrockModel.GptOss120B; // openai.gpt-oss-120b-1:0
|
package/index.cjs
CHANGED
|
@@ -380,7 +380,7 @@ var AxAIBedrockImpl = class {
|
|
|
380
380
|
const embedRequest = {
|
|
381
381
|
inputText: req.texts[0],
|
|
382
382
|
// Take first text
|
|
383
|
-
dimensions:
|
|
383
|
+
dimensions: this.config.dimensions,
|
|
384
384
|
normalize: true
|
|
385
385
|
};
|
|
386
386
|
const apiConfig = {
|
|
@@ -425,7 +425,7 @@ var AxAIBedrock = class extends import_ax.AxBaseAI {
|
|
|
425
425
|
}) {
|
|
426
426
|
const fullConfig = {
|
|
427
427
|
...(0, import_ax.axBaseAIDefaultConfig)(),
|
|
428
|
-
model: "us.anthropic.claude-
|
|
428
|
+
model: "us.anthropic.claude-opus-4-5-20251101-v1:0" /* ClaudeOpus45 */,
|
|
429
429
|
region,
|
|
430
430
|
fallbackRegions,
|
|
431
431
|
gptRegion,
|
package/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../index.ts","../api.ts","../types.ts","../info.ts"],"sourcesContent":["/**\n * AWS Bedrock Provider for AX\n *\n * Production-ready AWS Bedrock integration supporting Claude, GPT OSS, and Titan Embed models.\n *\n * @example\n * ```typescript\n * import { AxAIBedrock, AxAIBedrockModel } from '@ax-llm/ax-ai-aws-bedrock';\n *\n * const ai = new AxAIBedrock({\n * region: 'us-east-2',\n * config: { model: AxAIBedrockModel.ClaudeSonnet4 }\n * });\n *\n * const response = await ai.chat({\n * chatPrompt: [\n * { role: 'system', content: 'You are a helpful assistant.' },\n * { role: 'user', content: 'What is AWS Bedrock?' }\n * ]\n * });\n * ```\n *\n * @packageDocumentation\n */\n\nexport { AxAIBedrock } from './api.js';\nexport { axModelInfoBedrock } from './info.js';\nexport { AxAIBedrockEmbedModel, AxAIBedrockModel } from './types.js';\n\nexport type {\n AxAIBedrockConfig,\n BedrockChatRequest,\n BedrockChatResponse,\n BedrockClaudeRequest,\n BedrockClaudeResponse,\n BedrockGptRequest,\n BedrockGptResponse,\n BedrockTitanEmbedRequest,\n BedrockTitanEmbedResponse,\n} from './types.js';\n","/**\n * AWS Bedrock Provider for AX Library\n *\n * Supports Claude, GPT OSS, and Titan Embed models for use with AX's\n * compiler, signatures, flows, and optimization features.\n *\n * Usage:\n * const ai = new AxAIBedrock({\n * region: 'us-east-2',\n * config: { model: AxAIBedrockModel.ClaudeSonnet4 }\n * });\n *\n * const sig = AxSignature.from('input -> output');\n * const gen = new AxGen(sig, { ai });\n * const result = await gen.forward({ input: 'test' });\n */\n\nimport {\n BedrockRuntimeClient,\n InvokeModelCommand,\n} from '@aws-sdk/client-bedrock-runtime';\nimport type {\n AxAIServiceImpl,\n AxAIServiceOptions,\n AxAPI,\n AxChatRequest,\n AxChatResponse,\n AxChatResponseResult,\n AxEmbedRequest,\n AxEmbedResponse,\n AxModelConfig,\n AxTokenUsage,\n} from '@ax-llm/ax';\nimport { type AxAIFeatures, AxBaseAI, axBaseAIDefaultConfig } from '@ax-llm/ax';\nimport { axModelInfoBedrock } from './info.js';\nimport {\n type AxAIBedrockConfig,\n type AxAIBedrockEmbedModel,\n AxAIBedrockModel,\n type BedrockChatRequest,\n type BedrockChatResponse,\n type BedrockClaudeRequest,\n type BedrockClaudeResponse,\n type BedrockGptRequest,\n type BedrockGptResponse,\n type BedrockTitanEmbedRequest,\n type BedrockTitanEmbedResponse,\n} from './types.js';\n\n// ============================================================================\n// IMPLEMENTATION - Converts between AX format and Bedrock format\n// ============================================================================\n\ntype AxBedrockChatRequest = Omit<AxChatRequest, 'model'> &\n Required<Pick<AxChatRequest<AxAIBedrockModel>, 'model'>>;\n\ntype AxBedrockEmbedRequest = Omit<AxEmbedRequest, 'embedModel'> &\n Required<Pick<AxEmbedRequest<AxAIBedrockEmbedModel>, 'embedModel'>>;\n\ntype ModelFamily = 'claude' | 'gpt' | 'titan';\n\nclass AxAIBedrockImpl\n implements\n AxAIServiceImpl<\n AxAIBedrockModel,\n AxAIBedrockEmbedModel,\n BedrockChatRequest,\n BedrockTitanEmbedRequest,\n BedrockChatResponse,\n never, // No streaming for now\n BedrockTitanEmbedResponse\n >\n{\n private clients: Map<string, BedrockRuntimeClient> = new Map();\n private tokensUsed?: AxTokenUsage;\n\n constructor(\n private config: AxAIBedrockConfig,\n private primaryRegion: string,\n private fallbackRegions: string[],\n private gptRegion: string,\n private gptFallbackRegions: string[]\n ) {}\n\n getTokenUsage(): AxTokenUsage | undefined {\n return this.tokensUsed;\n }\n\n getModelConfig(): AxModelConfig {\n return {\n maxTokens: this.config.maxTokens,\n temperature: this.config.temperature,\n topP: this.config.topP,\n stopSequences: this.config.stopSequences,\n };\n }\n\n private getClient(region: string): BedrockRuntimeClient {\n let client = this.clients.get(region);\n if (!client) {\n client = new BedrockRuntimeClient({ region });\n this.clients.set(region, client);\n }\n return client;\n }\n\n /**\n * Detect model family from model ID\n */\n private getModelFamily(modelId: string): ModelFamily {\n if (\n modelId.includes('anthropic.claude') ||\n modelId.includes('us.anthropic.claude')\n ) {\n return 'claude';\n }\n if (modelId.includes('openai.gpt')) {\n return 'gpt';\n }\n if (modelId.includes('amazon.titan-embed')) {\n return 'titan';\n }\n throw new Error(`Unknown model family for: ${modelId}`);\n }\n\n /**\n * Get appropriate regions for model\n */\n private getRegionsForModel(modelId: string): string[] {\n const family = this.getModelFamily(modelId);\n if (family === 'gpt') {\n return [this.gptRegion, ...this.gptFallbackRegions];\n }\n return [this.primaryRegion, ...this.fallbackRegions];\n }\n\n /**\n * Regional failover logic - tries primary region, then fallbacks\n */\n private async invokeWithFailover<T>(\n modelId: string,\n handler: (client: BedrockRuntimeClient) => Promise<T>\n ): Promise<T> {\n const regions = this.getRegionsForModel(modelId);\n let lastError: Error | undefined;\n\n for (const region of regions) {\n try {\n const client = this.getClient(region);\n return await handler(client);\n } catch (error) {\n lastError = error as Error;\n console.warn(\n `[Bedrock] Region ${region} failed for ${modelId}:`,\n error\n );\n }\n }\n\n throw lastError || new Error(`All Bedrock regions failed for ${modelId}`);\n }\n\n /**\n * Transform AX chat request → Bedrock request (Claude or GPT)\n */\n createChatReq = async (\n req: Readonly<AxBedrockChatRequest>,\n _config: Readonly<AxAIServiceOptions>\n ): Promise<[AxAPI, BedrockChatRequest]> => {\n const family = this.getModelFamily(req.model);\n const maxTokens =\n req.modelConfig?.maxTokens ?? this.config.maxTokens ?? 4096;\n const temperature = req.modelConfig?.temperature ?? this.config.temperature;\n const topP = req.modelConfig?.topP ?? this.config.topP;\n\n let bedrockRequest: BedrockChatRequest;\n\n if (family === 'claude') {\n // Extract system messages for Claude\n const systemMessages = req.chatPrompt\n .filter((msg) => msg.role === 'system')\n .map((msg) => msg.content)\n .join('\\n\\n');\n\n // Convert other messages to Claude format\n const messages = req.chatPrompt\n .filter((msg) => msg.role !== 'system')\n .map((msg) => {\n if (msg.role === 'user') {\n return {\n role: 'user' as const,\n content:\n typeof msg.content === 'string'\n ? msg.content\n : JSON.stringify(msg.content),\n };\n }\n if (msg.role === 'assistant') {\n return {\n role: 'assistant' as const,\n content: msg.content || '',\n };\n }\n throw new Error(`Unsupported role: ${msg.role}`);\n });\n\n bedrockRequest = {\n anthropic_version: 'bedrock-2023-05-31',\n max_tokens: maxTokens,\n messages,\n ...(systemMessages ? { system: systemMessages } : {}),\n ...(temperature !== undefined ? { temperature } : {}),\n ...(topP !== undefined ? { top_p: topP } : {}),\n } as BedrockClaudeRequest;\n } else if (family === 'gpt') {\n // GPT uses OpenAI-style format with system messages in array\n const messages = req.chatPrompt\n .filter((msg) => msg.role !== 'function') // Skip function messages\n .map((msg) => {\n // Get content based on role\n let content: string;\n if ('content' in msg) {\n content =\n typeof msg.content === 'string'\n ? msg.content\n : JSON.stringify(msg.content);\n } else {\n content = '';\n }\n\n return {\n role: msg.role as 'system' | 'user' | 'assistant',\n content,\n };\n });\n\n bedrockRequest = {\n messages,\n max_tokens: maxTokens,\n ...(temperature !== undefined ? { temperature } : {}),\n ...(topP !== undefined ? { top_p: topP } : {}),\n } as BedrockGptRequest;\n } else {\n throw new Error(`Chat not supported for model family: ${family}`);\n }\n\n // Create API config with local call (uses SDK instead of HTTP)\n const apiConfig: AxAPI = {\n name: `bedrock-${family}`,\n localCall: async <TRequest, TResponse>(data: TRequest) => {\n const reqBody = data as unknown as BedrockChatRequest;\n const result = await this.invokeWithFailover(\n req.model,\n async (client) => {\n const command = new InvokeModelCommand({\n modelId: req.model,\n body: JSON.stringify(reqBody),\n contentType: 'application/json',\n accept: 'application/json',\n });\n const response = await client.send(command);\n return JSON.parse(new TextDecoder().decode(response.body));\n }\n );\n return result as TResponse;\n },\n };\n\n return [apiConfig, bedrockRequest];\n };\n\n /**\n * Transform Bedrock response → AX chat response (Claude or GPT)\n */\n createChatResp(resp: Readonly<BedrockChatResponse>): AxChatResponse {\n // Detect response type\n if ('content' in resp && Array.isArray(resp.content)) {\n // Claude response\n return this.createClaudeChatResp(resp as BedrockClaudeResponse);\n } else if ('choices' in resp && Array.isArray(resp.choices)) {\n // GPT response\n return this.createGptChatResp(resp as BedrockGptResponse);\n }\n throw new Error('Unknown response format');\n }\n\n /**\n * Handle Claude-specific response format\n */\n private createClaudeChatResp(\n resp: Readonly<BedrockClaudeResponse>\n ): AxChatResponse {\n // Extract text content from response\n let content = '';\n for (const block of resp.content) {\n if (block.type === 'text') {\n content += block.text;\n }\n }\n\n // Track token usage for AX's optimizer\n this.tokensUsed = {\n promptTokens: resp.usage.input_tokens,\n completionTokens: resp.usage.output_tokens,\n totalTokens: resp.usage.input_tokens + resp.usage.output_tokens,\n };\n\n // Map finish reason\n let finishReason: AxChatResponseResult['finishReason'];\n switch (resp.stop_reason) {\n case 'end_turn':\n case 'stop_sequence':\n finishReason = 'stop';\n break;\n case 'max_tokens':\n finishReason = 'length';\n break;\n default:\n finishReason = undefined;\n }\n\n return {\n results: [\n {\n index: 0,\n id: resp.id,\n content,\n finishReason,\n },\n ],\n remoteId: resp.id,\n };\n }\n\n /**\n * Handle GPT-specific response format\n */\n private createGptChatResp(\n resp: Readonly<BedrockGptResponse>\n ): AxChatResponse {\n const choice = resp.choices[0];\n if (!choice) {\n throw new Error('No choices in GPT response');\n }\n\n // Extract content (can be string or array)\n let content = '';\n if (typeof choice.message.content === 'string') {\n content = choice.message.content;\n } else if (Array.isArray(choice.message.content)) {\n content = choice.message.content\n .map((part) => {\n if (typeof part === 'string') return part;\n return part.text || part.content || '';\n })\n .join('');\n }\n\n // Track token usage if available\n if (resp.usage) {\n this.tokensUsed = {\n promptTokens: resp.usage.prompt_tokens,\n completionTokens: resp.usage.completion_tokens,\n totalTokens: resp.usage.total_tokens,\n };\n }\n\n // Map finish reason\n let finishReason: AxChatResponseResult['finishReason'];\n switch (choice.finish_reason) {\n case 'stop':\n finishReason = 'stop';\n break;\n case 'length':\n finishReason = 'length';\n break;\n case 'content_filter':\n finishReason = 'content_filter';\n break;\n default:\n finishReason = undefined;\n }\n\n return {\n results: [\n {\n index: choice.index,\n id: resp.id,\n content,\n finishReason,\n },\n ],\n remoteId: resp.id,\n };\n }\n\n /**\n * Create embed request for Titan\n */\n createEmbedReq = async (\n req: Readonly<AxBedrockEmbedRequest>\n ): Promise<[AxAPI, BedrockTitanEmbedRequest]> => {\n if (!req.texts || req.texts.length === 0) {\n throw new Error('No texts provided for embedding');\n }\n\n const embedRequest: BedrockTitanEmbedRequest = {\n inputText: req.texts[0], // Take first text\n dimensions: 512,\n normalize: true,\n };\n\n const apiConfig: AxAPI = {\n name: 'bedrock-titan-embed',\n localCall: async <TRequest, TResponse>(data: TRequest) => {\n const reqBody = data as unknown as BedrockTitanEmbedRequest;\n const result = await this.invokeWithFailover(\n req.embedModel,\n async (client) => {\n const command = new InvokeModelCommand({\n modelId: req.embedModel,\n body: JSON.stringify(reqBody),\n contentType: 'application/json',\n accept: 'application/json',\n });\n const response = await client.send(command);\n return JSON.parse(new TextDecoder().decode(response.body));\n }\n );\n return result as TResponse;\n },\n };\n\n return [apiConfig, embedRequest];\n };\n\n /**\n * Create embed response from Titan\n */\n createEmbedResp(resp: Readonly<BedrockTitanEmbedResponse>): AxEmbedResponse {\n return {\n embeddings: [resp.embedding],\n };\n }\n}\n\n// ============================================================================\n// PROVIDER CLASS - Main entry point\n// ============================================================================\n\nexport class AxAIBedrock extends AxBaseAI<\n AxAIBedrockModel,\n AxAIBedrockEmbedModel,\n BedrockChatRequest,\n BedrockTitanEmbedRequest,\n BedrockChatResponse,\n never, // No streaming yet\n BedrockTitanEmbedResponse,\n string\n> {\n constructor({\n region = 'us-east-2',\n fallbackRegions = ['us-west-2', 'us-east-1'],\n gptRegion = 'us-west-2',\n gptFallbackRegions = ['us-east-1'],\n config,\n options,\n }: Readonly<{\n region?: string;\n fallbackRegions?: string[];\n gptRegion?: string;\n gptFallbackRegions?: string[];\n config: Readonly<Partial<AxAIBedrockConfig>>;\n options?: Readonly<AxAIServiceOptions>;\n }>) {\n // Merge user config with defaults\n const fullConfig: AxAIBedrockConfig = {\n ...axBaseAIDefaultConfig(),\n model: AxAIBedrockModel.ClaudeSonnet4,\n region,\n fallbackRegions,\n gptRegion,\n gptFallbackRegions,\n ...config,\n };\n\n // Create implementation\n const aiImpl = new AxAIBedrockImpl(\n fullConfig,\n region,\n fallbackRegions,\n gptRegion,\n gptFallbackRegions\n );\n\n // Define feature support\n const supportFor = (): AxAIFeatures => ({\n functions: false, // Not implemented yet - add when needed\n streaming: false, // Not implemented yet - add when needed\n functionCot: false,\n hasThinkingBudget: false,\n hasShowThoughts: false,\n media: {\n images: {\n supported: false, // Add when needed\n formats: [],\n },\n audio: {\n supported: false,\n formats: [],\n },\n files: {\n supported: false,\n formats: [],\n uploadMethod: 'none',\n },\n urls: {\n supported: false,\n webSearch: false,\n contextFetching: false,\n },\n },\n caching: {\n supported: false,\n types: [],\n },\n thinking: false,\n multiTurn: true, // All models support multi-turn conversations\n });\n\n // Initialize base class\n super(aiImpl, {\n name: 'Bedrock',\n apiURL: '', // Not used - we use SDK directly\n headers: async () => ({}), // AWS SDK handles auth\n modelInfo: axModelInfoBedrock,\n defaults: {\n model: fullConfig.model,\n embedModel: fullConfig.embedModel,\n },\n options,\n supportFor,\n });\n }\n}\n\nexport type { AxAIBedrockConfig } from './types.js';\n// Re-export types for convenience\nexport { AxAIBedrockEmbedModel, AxAIBedrockModel } from './types.js';\n","/**\n * AWS Bedrock provider types for AX integration\n * Supports Claude, GPT OSS, and Titan models\n */\n\nimport type { AxModelConfig } from '@ax-llm/ax';\n\n// All Bedrock models\nexport enum AxAIBedrockModel {\n // Claude models\n ClaudeOpus45 = 'us.anthropic.claude-opus-4-5-20251101-v1:0',\n ClaudeSonnet4 = 'us.anthropic.claude-sonnet-4-20250514-v1:0',\n Claude37Sonnet = 'anthropic.claude-3-7-sonnet-20250219-v1:0',\n Claude35Sonnet = 'anthropic.claude-3-5-sonnet-20240620-v1:0',\n\n // GPT OSS models\n GptOss120B = 'openai.gpt-oss-120b-1:0',\n GptOss20B = 'openai.gpt-oss-20b-1:0',\n}\n\n// Embed models\nexport enum AxAIBedrockEmbedModel {\n TitanEmbedV2 = 'amazon.titan-embed-text-v2:0',\n}\n\nexport interface AxAIBedrockConfig extends AxModelConfig {\n model: AxAIBedrockModel;\n embedModel?: AxAIBedrockEmbedModel;\n region?: string;\n fallbackRegions?: string[];\n gptRegion?: string;\n gptFallbackRegions?: string[];\n}\n\n// ============================================================================\n// Claude Request/Response Types\n// ============================================================================\n\nexport interface BedrockClaudeRequest {\n anthropic_version: string;\n max_tokens: number;\n messages: Array<{\n role: 'user' | 'assistant';\n content: string | Array<{ type: 'text'; text: string }>;\n }>;\n system?: string;\n temperature?: number;\n top_p?: number;\n}\n\nexport interface BedrockClaudeResponse {\n id: string;\n type: 'message';\n role: 'assistant';\n content: Array<{ type: 'text'; text: string }>;\n model: string;\n stop_reason: 'end_turn' | 'max_tokens' | 'stop_sequence';\n usage: {\n input_tokens: number;\n output_tokens: number;\n };\n}\n\n// ============================================================================\n// GPT OSS Request/Response Types (OpenAI-compatible format)\n// ============================================================================\n\nexport interface BedrockGptRequest {\n messages: Array<{\n role: 'system' | 'user' | 'assistant';\n content: string;\n }>;\n max_tokens: number;\n temperature?: number;\n top_p?: number;\n}\n\nexport interface BedrockGptResponse {\n id?: string;\n choices: Array<{\n index: number;\n message: {\n role: 'assistant';\n content:\n | string\n | Array<{ type?: string; text?: string; content?: string }>;\n };\n finish_reason: 'stop' | 'length' | 'content_filter' | null;\n }>;\n usage?: {\n prompt_tokens: number;\n completion_tokens: number;\n total_tokens: number;\n };\n}\n\n// ============================================================================\n// Titan Embed Request/Response Types\n// ============================================================================\n\nexport interface BedrockTitanEmbedRequest {\n inputText: string;\n dimensions?: number;\n normalize?: boolean;\n}\n\nexport interface BedrockTitanEmbedResponse {\n embedding: number[];\n inputTextTokenCount: number;\n}\n\n// Union types for all models\nexport type BedrockChatRequest = BedrockClaudeRequest | BedrockGptRequest;\nexport type BedrockChatResponse = BedrockClaudeResponse | BedrockGptResponse;\n","/**\n * Bedrock model information (pricing, limits, features)\n */\n\nimport type { AxModelInfo } from '@ax-llm/ax';\nimport { AxAIBedrockEmbedModel, AxAIBedrockModel } from './types.js';\n\nexport const axModelInfoBedrock: AxModelInfo[] = [\n // ========================================================================\n // Claude Models\n // ========================================================================\n {\n name: AxAIBedrockModel.ClaudeOpus45,\n currency: 'usd',\n promptTokenCostPer1M: 5.0,\n completionTokenCostPer1M: 25.0,\n maxTokens: 64000,\n contextWindow: 200000,\n supported: { thinkingBudget: true, showThoughts: true },\n },\n {\n name: AxAIBedrockModel.ClaudeSonnet4,\n currency: 'usd',\n promptTokenCostPer1M: 3.0,\n completionTokenCostPer1M: 15.0,\n maxTokens: 64000,\n contextWindow: 200000,\n supported: { thinkingBudget: true, showThoughts: true },\n },\n {\n name: AxAIBedrockModel.Claude37Sonnet,\n currency: 'usd',\n promptTokenCostPer1M: 3.0,\n completionTokenCostPer1M: 15.0,\n maxTokens: 64000,\n contextWindow: 200000,\n },\n {\n name: AxAIBedrockModel.Claude35Sonnet,\n currency: 'usd',\n promptTokenCostPer1M: 3.0,\n completionTokenCostPer1M: 15.0,\n maxTokens: 8192,\n contextWindow: 200000,\n },\n\n // ========================================================================\n // GPT OSS Models\n // ========================================================================\n {\n name: AxAIBedrockModel.GptOss120B,\n currency: 'usd',\n promptTokenCostPer1M: 0.5,\n completionTokenCostPer1M: 1.5,\n maxTokens: 16384,\n contextWindow: 128000,\n },\n {\n name: AxAIBedrockModel.GptOss20B,\n currency: 'usd',\n promptTokenCostPer1M: 0.25,\n completionTokenCostPer1M: 0.75,\n maxTokens: 16384,\n contextWindow: 128000,\n },\n\n // ========================================================================\n // Embed Models\n // ========================================================================\n {\n name: AxAIBedrockEmbedModel.TitanEmbedV2,\n currency: 'usd',\n promptTokenCostPer1M: 0.02,\n completionTokenCostPer1M: 0,\n maxTokens: 8192,\n contextWindow: 8192,\n },\n];\n"],"mappings":"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","names":["AxAIBedrockModel","AxAIBedrockEmbedModel"]}
|
|
1
|
+
{"version":3,"sources":["../index.ts","../api.ts","../types.ts","../info.ts"],"sourcesContent":["/**\n * AWS Bedrock Provider for AX\n *\n * Production-ready AWS Bedrock integration supporting Claude, GPT OSS, and Titan Embed models.\n *\n * @example\n * ```typescript\n * import { AxAIBedrock, AxAIBedrockModel } from '@ax-llm/ax-ai-aws-bedrock';\n *\n * const ai = new AxAIBedrock({\n * region: 'us-east-2',\n * config: { model: AxAIBedrockModel.ClaudeOpus45 }\n * });\n *\n * const response = await ai.chat({\n * chatPrompt: [\n * { role: 'system', content: 'You are a helpful assistant.' },\n * { role: 'user', content: 'What is AWS Bedrock?' }\n * ]\n * });\n * ```\n *\n * @packageDocumentation\n */\n\nexport { AxAIBedrock } from './api.js';\nexport { axModelInfoBedrock } from './info.js';\nexport type {\n AxAIBedrockConfig,\n BedrockChatRequest,\n BedrockChatResponse,\n BedrockClaudeRequest,\n BedrockClaudeResponse,\n BedrockGptRequest,\n BedrockGptResponse,\n BedrockTitanEmbedRequest,\n BedrockTitanEmbedResponse,\n} from './types.js';\nexport { AxAIBedrockEmbedModel, AxAIBedrockModel } from './types.js';\n","/**\n * AWS Bedrock Provider for AX Library\n *\n * Supports Claude, GPT OSS, and Titan Embed models for use with AX's\n * compiler, signatures, flows, and optimization features.\n *\n * Usage:\n * const ai = new AxAIBedrock({\n * region: 'us-east-2',\n * config: { model: AxAIBedrockModel.ClaudeOpus45 }\n * });\n *\n * const sig = AxSignature.from('input -> output');\n * const gen = new AxGen(sig, { ai });\n * const result = await gen.forward({ input: 'test' });\n */\n\nimport {\n BedrockRuntimeClient,\n InvokeModelCommand,\n} from '@aws-sdk/client-bedrock-runtime';\nimport type {\n AxAIServiceImpl,\n AxAIServiceOptions,\n AxAPI,\n AxChatRequest,\n AxChatResponse,\n AxChatResponseResult,\n AxEmbedRequest,\n AxEmbedResponse,\n AxModelConfig,\n AxTokenUsage,\n} from '@ax-llm/ax';\nimport { type AxAIFeatures, AxBaseAI, axBaseAIDefaultConfig } from '@ax-llm/ax';\nimport { axModelInfoBedrock } from './info.js';\nimport {\n type AxAIBedrockConfig,\n type AxAIBedrockEmbedModel,\n AxAIBedrockModel,\n type BedrockChatRequest,\n type BedrockChatResponse,\n type BedrockClaudeRequest,\n type BedrockClaudeResponse,\n type BedrockGptRequest,\n type BedrockGptResponse,\n type BedrockTitanEmbedRequest,\n type BedrockTitanEmbedResponse,\n} from './types.js';\n\n// ============================================================================\n// IMPLEMENTATION - Converts between AX format and Bedrock format\n// ============================================================================\n\ntype AxBedrockChatRequest = Omit<AxChatRequest, 'model'> &\n Required<Pick<AxChatRequest<AxAIBedrockModel>, 'model'>>;\n\ntype AxBedrockEmbedRequest = Omit<AxEmbedRequest, 'embedModel'> &\n Required<Pick<AxEmbedRequest<AxAIBedrockEmbedModel>, 'embedModel'>>;\n\ntype ModelFamily = 'claude' | 'gpt' | 'titan';\n\nclass AxAIBedrockImpl\n implements\n AxAIServiceImpl<\n AxAIBedrockModel,\n AxAIBedrockEmbedModel,\n BedrockChatRequest,\n BedrockTitanEmbedRequest,\n BedrockChatResponse,\n never, // No streaming for now\n BedrockTitanEmbedResponse\n >\n{\n private clients: Map<string, BedrockRuntimeClient> = new Map();\n private tokensUsed?: AxTokenUsage;\n\n constructor(\n private config: AxAIBedrockConfig,\n private primaryRegion: string,\n private fallbackRegions: string[],\n private gptRegion: string,\n private gptFallbackRegions: string[]\n ) {}\n\n getTokenUsage(): AxTokenUsage | undefined {\n return this.tokensUsed;\n }\n\n getModelConfig(): AxModelConfig {\n return {\n maxTokens: this.config.maxTokens,\n temperature: this.config.temperature,\n topP: this.config.topP,\n stopSequences: this.config.stopSequences,\n };\n }\n\n private getClient(region: string): BedrockRuntimeClient {\n let client = this.clients.get(region);\n if (!client) {\n client = new BedrockRuntimeClient({ region });\n this.clients.set(region, client);\n }\n return client;\n }\n\n /**\n * Detect model family from model ID\n */\n private getModelFamily(modelId: string): ModelFamily {\n if (\n modelId.includes('anthropic.claude') ||\n modelId.includes('us.anthropic.claude')\n ) {\n return 'claude';\n }\n if (modelId.includes('openai.gpt')) {\n return 'gpt';\n }\n if (modelId.includes('amazon.titan-embed')) {\n return 'titan';\n }\n throw new Error(`Unknown model family for: ${modelId}`);\n }\n\n /**\n * Get appropriate regions for model\n */\n private getRegionsForModel(modelId: string): string[] {\n const family = this.getModelFamily(modelId);\n if (family === 'gpt') {\n return [this.gptRegion, ...this.gptFallbackRegions];\n }\n return [this.primaryRegion, ...this.fallbackRegions];\n }\n\n /**\n * Regional failover logic - tries primary region, then fallbacks\n */\n private async invokeWithFailover<T>(\n modelId: string,\n handler: (client: BedrockRuntimeClient) => Promise<T>\n ): Promise<T> {\n const regions = this.getRegionsForModel(modelId);\n let lastError: Error | undefined;\n\n for (const region of regions) {\n try {\n const client = this.getClient(region);\n return await handler(client);\n } catch (error) {\n lastError = error as Error;\n console.warn(\n `[Bedrock] Region ${region} failed for ${modelId}:`,\n error\n );\n }\n }\n\n throw lastError || new Error(`All Bedrock regions failed for ${modelId}`);\n }\n\n /**\n * Transform AX chat request → Bedrock request (Claude or GPT)\n */\n createChatReq = async (\n req: Readonly<AxBedrockChatRequest>,\n _config: Readonly<AxAIServiceOptions>\n ): Promise<[AxAPI, BedrockChatRequest]> => {\n const family = this.getModelFamily(req.model);\n const maxTokens =\n req.modelConfig?.maxTokens ?? this.config.maxTokens ?? 4096;\n const temperature = req.modelConfig?.temperature ?? this.config.temperature;\n const topP = req.modelConfig?.topP ?? this.config.topP;\n\n let bedrockRequest: BedrockChatRequest;\n\n if (family === 'claude') {\n // Extract system messages for Claude\n const systemMessages = req.chatPrompt\n .filter((msg) => msg.role === 'system')\n .map((msg) => msg.content)\n .join('\\n\\n');\n\n // Convert other messages to Claude format\n const messages = req.chatPrompt\n .filter((msg) => msg.role !== 'system')\n .map((msg) => {\n if (msg.role === 'user') {\n return {\n role: 'user' as const,\n content:\n typeof msg.content === 'string'\n ? msg.content\n : JSON.stringify(msg.content),\n };\n }\n if (msg.role === 'assistant') {\n return {\n role: 'assistant' as const,\n content: msg.content || '',\n };\n }\n throw new Error(`Unsupported role: ${msg.role}`);\n });\n\n bedrockRequest = {\n anthropic_version: 'bedrock-2023-05-31',\n max_tokens: maxTokens,\n messages,\n ...(systemMessages ? { system: systemMessages } : {}),\n ...(temperature !== undefined ? { temperature } : {}),\n ...(topP !== undefined ? { top_p: topP } : {}),\n } as BedrockClaudeRequest;\n } else if (family === 'gpt') {\n // GPT uses OpenAI-style format with system messages in array\n const messages = req.chatPrompt\n .filter((msg) => msg.role !== 'function') // Skip function messages\n .map((msg) => {\n // Get content based on role\n let content: string;\n if ('content' in msg) {\n content =\n typeof msg.content === 'string'\n ? msg.content\n : JSON.stringify(msg.content);\n } else {\n content = '';\n }\n\n return {\n role: msg.role as 'system' | 'user' | 'assistant',\n content,\n };\n });\n\n bedrockRequest = {\n messages,\n max_tokens: maxTokens,\n ...(temperature !== undefined ? { temperature } : {}),\n ...(topP !== undefined ? { top_p: topP } : {}),\n } as BedrockGptRequest;\n } else {\n throw new Error(`Chat not supported for model family: ${family}`);\n }\n\n // Create API config with local call (uses SDK instead of HTTP)\n const apiConfig: AxAPI = {\n name: `bedrock-${family}`,\n localCall: async <TRequest, TResponse>(data: TRequest) => {\n const reqBody = data as unknown as BedrockChatRequest;\n const result = await this.invokeWithFailover(\n req.model,\n async (client) => {\n const command = new InvokeModelCommand({\n modelId: req.model,\n body: JSON.stringify(reqBody),\n contentType: 'application/json',\n accept: 'application/json',\n });\n const response = await client.send(command);\n return JSON.parse(new TextDecoder().decode(response.body));\n }\n );\n return result as TResponse;\n },\n };\n\n return [apiConfig, bedrockRequest];\n };\n\n /**\n * Transform Bedrock response → AX chat response (Claude or GPT)\n */\n createChatResp(resp: Readonly<BedrockChatResponse>): AxChatResponse {\n // Detect response type\n if ('content' in resp && Array.isArray(resp.content)) {\n // Claude response\n return this.createClaudeChatResp(resp as BedrockClaudeResponse);\n } else if ('choices' in resp && Array.isArray(resp.choices)) {\n // GPT response\n return this.createGptChatResp(resp as BedrockGptResponse);\n }\n throw new Error('Unknown response format');\n }\n\n /**\n * Handle Claude-specific response format\n */\n private createClaudeChatResp(\n resp: Readonly<BedrockClaudeResponse>\n ): AxChatResponse {\n // Extract text content from response\n let content = '';\n for (const block of resp.content) {\n if (block.type === 'text') {\n content += block.text;\n }\n }\n\n // Track token usage for AX's optimizer\n this.tokensUsed = {\n promptTokens: resp.usage.input_tokens,\n completionTokens: resp.usage.output_tokens,\n totalTokens: resp.usage.input_tokens + resp.usage.output_tokens,\n };\n\n // Map finish reason\n let finishReason: AxChatResponseResult['finishReason'];\n switch (resp.stop_reason) {\n case 'end_turn':\n case 'stop_sequence':\n finishReason = 'stop';\n break;\n case 'max_tokens':\n finishReason = 'length';\n break;\n default:\n finishReason = undefined;\n }\n\n return {\n results: [\n {\n index: 0,\n id: resp.id,\n content,\n finishReason,\n },\n ],\n remoteId: resp.id,\n };\n }\n\n /**\n * Handle GPT-specific response format\n */\n private createGptChatResp(\n resp: Readonly<BedrockGptResponse>\n ): AxChatResponse {\n const choice = resp.choices[0];\n if (!choice) {\n throw new Error('No choices in GPT response');\n }\n\n // Extract content (can be string or array)\n let content = '';\n if (typeof choice.message.content === 'string') {\n content = choice.message.content;\n } else if (Array.isArray(choice.message.content)) {\n content = choice.message.content\n .map((part) => {\n if (typeof part === 'string') return part;\n return part.text || part.content || '';\n })\n .join('');\n }\n\n // Track token usage if available\n if (resp.usage) {\n this.tokensUsed = {\n promptTokens: resp.usage.prompt_tokens,\n completionTokens: resp.usage.completion_tokens,\n totalTokens: resp.usage.total_tokens,\n };\n }\n\n // Map finish reason\n let finishReason: AxChatResponseResult['finishReason'];\n switch (choice.finish_reason) {\n case 'stop':\n finishReason = 'stop';\n break;\n case 'length':\n finishReason = 'length';\n break;\n case 'content_filter':\n finishReason = 'content_filter';\n break;\n default:\n finishReason = undefined;\n }\n\n return {\n results: [\n {\n index: choice.index,\n id: resp.id,\n content,\n finishReason,\n },\n ],\n remoteId: resp.id,\n };\n }\n\n /**\n * Create embed request for Titan\n */\n createEmbedReq = async (\n req: Readonly<AxBedrockEmbedRequest>\n ): Promise<[AxAPI, BedrockTitanEmbedRequest]> => {\n if (!req.texts || req.texts.length === 0) {\n throw new Error('No texts provided for embedding');\n }\n\n const embedRequest: BedrockTitanEmbedRequest = {\n inputText: req.texts[0], // Take first text\n dimensions: this.config.dimensions,\n normalize: true,\n };\n\n const apiConfig: AxAPI = {\n name: 'bedrock-titan-embed',\n localCall: async <TRequest, TResponse>(data: TRequest) => {\n const reqBody = data as unknown as BedrockTitanEmbedRequest;\n const result = await this.invokeWithFailover(\n req.embedModel,\n async (client) => {\n const command = new InvokeModelCommand({\n modelId: req.embedModel,\n body: JSON.stringify(reqBody),\n contentType: 'application/json',\n accept: 'application/json',\n });\n const response = await client.send(command);\n return JSON.parse(new TextDecoder().decode(response.body));\n }\n );\n return result as TResponse;\n },\n };\n\n return [apiConfig, embedRequest];\n };\n\n /**\n * Create embed response from Titan\n */\n createEmbedResp(resp: Readonly<BedrockTitanEmbedResponse>): AxEmbedResponse {\n return {\n embeddings: [resp.embedding],\n };\n }\n}\n\n// ============================================================================\n// PROVIDER CLASS - Main entry point\n// ============================================================================\n\nexport class AxAIBedrock extends AxBaseAI<\n AxAIBedrockModel,\n AxAIBedrockEmbedModel,\n BedrockChatRequest,\n BedrockTitanEmbedRequest,\n BedrockChatResponse,\n never, // No streaming yet\n BedrockTitanEmbedResponse,\n string\n> {\n constructor({\n region = 'us-east-2',\n fallbackRegions = ['us-west-2', 'us-east-1'],\n gptRegion = 'us-west-2',\n gptFallbackRegions = ['us-east-1'],\n config,\n options,\n }: Readonly<{\n region?: string;\n fallbackRegions?: string[];\n gptRegion?: string;\n gptFallbackRegions?: string[];\n config: Readonly<Partial<AxAIBedrockConfig>>;\n options?: Readonly<AxAIServiceOptions>;\n }>) {\n // Merge user config with defaults\n const fullConfig: AxAIBedrockConfig = {\n ...axBaseAIDefaultConfig(),\n model: AxAIBedrockModel.ClaudeOpus45,\n region,\n fallbackRegions,\n gptRegion,\n gptFallbackRegions,\n ...config,\n };\n\n // Create implementation\n const aiImpl = new AxAIBedrockImpl(\n fullConfig,\n region,\n fallbackRegions,\n gptRegion,\n gptFallbackRegions\n );\n\n // Define feature support\n const supportFor = (): AxAIFeatures => ({\n functions: false, // Not implemented yet - add when needed\n streaming: false, // Not implemented yet - add when needed\n functionCot: false,\n hasThinkingBudget: false,\n hasShowThoughts: false,\n media: {\n images: {\n supported: false, // Add when needed\n formats: [],\n },\n audio: {\n supported: false,\n formats: [],\n },\n files: {\n supported: false,\n formats: [],\n uploadMethod: 'none',\n },\n urls: {\n supported: false,\n webSearch: false,\n contextFetching: false,\n },\n },\n caching: {\n supported: false,\n types: [],\n },\n thinking: false,\n multiTurn: true, // All models support multi-turn conversations\n });\n\n // Initialize base class\n super(aiImpl, {\n name: 'Bedrock',\n apiURL: '', // Not used - we use SDK directly\n headers: async () => ({}), // AWS SDK handles auth\n modelInfo: axModelInfoBedrock,\n defaults: {\n model: fullConfig.model,\n embedModel: fullConfig.embedModel,\n },\n options,\n supportFor,\n });\n }\n}\n\nexport type { AxAIBedrockConfig } from './types.js';\n// Re-export types for convenience\nexport { AxAIBedrockEmbedModel, AxAIBedrockModel } from './types.js';\n","/**\n * AWS Bedrock provider types for AX integration\n * Supports Claude, GPT OSS, and Titan models\n */\n\nimport type { AxModelConfig } from '@ax-llm/ax';\n\n// All Bedrock models\nexport enum AxAIBedrockModel {\n // Claude models\n ClaudeOpus45 = 'us.anthropic.claude-opus-4-5-20251101-v1:0',\n ClaudeSonnet4 = 'us.anthropic.claude-sonnet-4-20250514-v1:0',\n Claude37Sonnet = 'anthropic.claude-3-7-sonnet-20250219-v1:0',\n Claude35Sonnet = 'anthropic.claude-3-5-sonnet-20240620-v1:0',\n\n // GPT OSS models\n GptOss120B = 'openai.gpt-oss-120b-1:0',\n GptOss20B = 'openai.gpt-oss-20b-1:0',\n}\n\n// Embed models\nexport enum AxAIBedrockEmbedModel {\n TitanEmbedV2 = 'amazon.titan-embed-text-v2:0',\n}\n\nexport interface AxAIBedrockConfig extends AxModelConfig {\n model: AxAIBedrockModel;\n embedModel?: AxAIBedrockEmbedModel;\n dimensions?: number;\n region?: string;\n fallbackRegions?: string[];\n gptRegion?: string;\n gptFallbackRegions?: string[];\n}\n\n// ============================================================================\n// Claude Request/Response Types\n// ============================================================================\n\nexport interface BedrockClaudeRequest {\n anthropic_version: string;\n max_tokens: number;\n messages: Array<{\n role: 'user' | 'assistant';\n content: string | Array<{ type: 'text'; text: string }>;\n }>;\n system?: string;\n temperature?: number;\n top_p?: number;\n}\n\nexport interface BedrockClaudeResponse {\n id: string;\n type: 'message';\n role: 'assistant';\n content: Array<{ type: 'text'; text: string }>;\n model: string;\n stop_reason: 'end_turn' | 'max_tokens' | 'stop_sequence';\n usage: {\n input_tokens: number;\n output_tokens: number;\n };\n}\n\n// ============================================================================\n// GPT OSS Request/Response Types (OpenAI-compatible format)\n// ============================================================================\n\nexport interface BedrockGptRequest {\n messages: Array<{\n role: 'system' | 'user' | 'assistant';\n content: string;\n }>;\n max_tokens: number;\n temperature?: number;\n top_p?: number;\n}\n\nexport interface BedrockGptResponse {\n id?: string;\n choices: Array<{\n index: number;\n message: {\n role: 'assistant';\n content:\n | string\n | Array<{ type?: string; text?: string; content?: string }>;\n };\n finish_reason: 'stop' | 'length' | 'content_filter' | null;\n }>;\n usage?: {\n prompt_tokens: number;\n completion_tokens: number;\n total_tokens: number;\n };\n}\n\n// ============================================================================\n// Titan Embed Request/Response Types\n// ============================================================================\n\nexport interface BedrockTitanEmbedRequest {\n inputText: string;\n dimensions?: number;\n normalize?: boolean;\n}\n\nexport interface BedrockTitanEmbedResponse {\n embedding: number[];\n inputTextTokenCount: number;\n}\n\n// Union types for all models\nexport type BedrockChatRequest = BedrockClaudeRequest | BedrockGptRequest;\nexport type BedrockChatResponse = BedrockClaudeResponse | BedrockGptResponse;\n","/**\n * Bedrock model information (pricing, limits, features)\n */\n\nimport type { AxModelInfo } from '@ax-llm/ax';\nimport { AxAIBedrockEmbedModel, AxAIBedrockModel } from './types.js';\n\nexport const axModelInfoBedrock: AxModelInfo[] = [\n // ========================================================================\n // Claude Models\n // ========================================================================\n {\n name: AxAIBedrockModel.ClaudeOpus45,\n currency: 'usd',\n promptTokenCostPer1M: 5.0,\n completionTokenCostPer1M: 25.0,\n maxTokens: 64000,\n contextWindow: 200000,\n supported: { thinkingBudget: true, showThoughts: true },\n },\n {\n name: AxAIBedrockModel.ClaudeSonnet4,\n currency: 'usd',\n promptTokenCostPer1M: 3.0,\n completionTokenCostPer1M: 15.0,\n maxTokens: 64000,\n contextWindow: 200000,\n supported: { thinkingBudget: true, showThoughts: true },\n },\n {\n name: AxAIBedrockModel.Claude37Sonnet,\n currency: 'usd',\n promptTokenCostPer1M: 3.0,\n completionTokenCostPer1M: 15.0,\n maxTokens: 64000,\n contextWindow: 200000,\n },\n {\n name: AxAIBedrockModel.Claude35Sonnet,\n currency: 'usd',\n promptTokenCostPer1M: 3.0,\n completionTokenCostPer1M: 15.0,\n maxTokens: 8192,\n contextWindow: 200000,\n },\n\n // ========================================================================\n // GPT OSS Models\n // ========================================================================\n {\n name: AxAIBedrockModel.GptOss120B,\n currency: 'usd',\n promptTokenCostPer1M: 0.5,\n completionTokenCostPer1M: 1.5,\n maxTokens: 16384,\n contextWindow: 128000,\n },\n {\n name: AxAIBedrockModel.GptOss20B,\n currency: 'usd',\n promptTokenCostPer1M: 0.25,\n completionTokenCostPer1M: 0.75,\n maxTokens: 16384,\n contextWindow: 128000,\n },\n\n // ========================================================================\n // Embed Models\n // ========================================================================\n {\n name: AxAIBedrockEmbedModel.TitanEmbedV2,\n currency: 'usd',\n promptTokenCostPer1M: 0.02,\n completionTokenCostPer1M: 0,\n maxTokens: 8192,\n contextWindow: 8192,\n },\n];\n"],"mappings":"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","names":["AxAIBedrockModel","AxAIBedrockEmbedModel"]}
|
package/index.d.cts
CHANGED
|
@@ -19,6 +19,7 @@ declare enum AxAIBedrockEmbedModel {
|
|
|
19
19
|
interface AxAIBedrockConfig extends AxModelConfig {
|
|
20
20
|
model: AxAIBedrockModel;
|
|
21
21
|
embedModel?: AxAIBedrockEmbedModel;
|
|
22
|
+
dimensions?: number;
|
|
22
23
|
region?: string;
|
|
23
24
|
fallbackRegions?: string[];
|
|
24
25
|
gptRegion?: string;
|
|
@@ -103,7 +104,7 @@ type BedrockChatResponse = BedrockClaudeResponse | BedrockGptResponse;
|
|
|
103
104
|
* Usage:
|
|
104
105
|
* const ai = new AxAIBedrock({
|
|
105
106
|
* region: 'us-east-2',
|
|
106
|
-
* config: { model: AxAIBedrockModel.
|
|
107
|
+
* config: { model: AxAIBedrockModel.ClaudeOpus45 }
|
|
107
108
|
* });
|
|
108
109
|
*
|
|
109
110
|
* const sig = AxSignature.from('input -> output');
|
package/index.d.ts
CHANGED
|
@@ -19,6 +19,7 @@ declare enum AxAIBedrockEmbedModel {
|
|
|
19
19
|
interface AxAIBedrockConfig extends AxModelConfig {
|
|
20
20
|
model: AxAIBedrockModel;
|
|
21
21
|
embedModel?: AxAIBedrockEmbedModel;
|
|
22
|
+
dimensions?: number;
|
|
22
23
|
region?: string;
|
|
23
24
|
fallbackRegions?: string[];
|
|
24
25
|
gptRegion?: string;
|
|
@@ -103,7 +104,7 @@ type BedrockChatResponse = BedrockClaudeResponse | BedrockGptResponse;
|
|
|
103
104
|
* Usage:
|
|
104
105
|
* const ai = new AxAIBedrock({
|
|
105
106
|
* region: 'us-east-2',
|
|
106
|
-
* config: { model: AxAIBedrockModel.
|
|
107
|
+
* config: { model: AxAIBedrockModel.ClaudeOpus45 }
|
|
107
108
|
* });
|
|
108
109
|
*
|
|
109
110
|
* const sig = AxSignature.from('input -> output');
|
package/index.js
CHANGED
|
@@ -354,7 +354,7 @@ var AxAIBedrockImpl = class {
|
|
|
354
354
|
const embedRequest = {
|
|
355
355
|
inputText: req.texts[0],
|
|
356
356
|
// Take first text
|
|
357
|
-
dimensions:
|
|
357
|
+
dimensions: this.config.dimensions,
|
|
358
358
|
normalize: true
|
|
359
359
|
};
|
|
360
360
|
const apiConfig = {
|
|
@@ -399,7 +399,7 @@ var AxAIBedrock = class extends AxBaseAI {
|
|
|
399
399
|
}) {
|
|
400
400
|
const fullConfig = {
|
|
401
401
|
...axBaseAIDefaultConfig(),
|
|
402
|
-
model: "us.anthropic.claude-
|
|
402
|
+
model: "us.anthropic.claude-opus-4-5-20251101-v1:0" /* ClaudeOpus45 */,
|
|
403
403
|
region,
|
|
404
404
|
fallbackRegions,
|
|
405
405
|
gptRegion,
|
package/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../api.ts","../types.ts","../info.ts"],"sourcesContent":["/**\n * AWS Bedrock Provider for AX Library\n *\n * Supports Claude, GPT OSS, and Titan Embed models for use with AX's\n * compiler, signatures, flows, and optimization features.\n *\n * Usage:\n * const ai = new AxAIBedrock({\n * region: 'us-east-2',\n * config: { model: AxAIBedrockModel.ClaudeSonnet4 }\n * });\n *\n * const sig = AxSignature.from('input -> output');\n * const gen = new AxGen(sig, { ai });\n * const result = await gen.forward({ input: 'test' });\n */\n\nimport {\n BedrockRuntimeClient,\n InvokeModelCommand,\n} from '@aws-sdk/client-bedrock-runtime';\nimport type {\n AxAIServiceImpl,\n AxAIServiceOptions,\n AxAPI,\n AxChatRequest,\n AxChatResponse,\n AxChatResponseResult,\n AxEmbedRequest,\n AxEmbedResponse,\n AxModelConfig,\n AxTokenUsage,\n} from '@ax-llm/ax';\nimport { type AxAIFeatures, AxBaseAI, axBaseAIDefaultConfig } from '@ax-llm/ax';\nimport { axModelInfoBedrock } from './info.js';\nimport {\n type AxAIBedrockConfig,\n type AxAIBedrockEmbedModel,\n AxAIBedrockModel,\n type BedrockChatRequest,\n type BedrockChatResponse,\n type BedrockClaudeRequest,\n type BedrockClaudeResponse,\n type BedrockGptRequest,\n type BedrockGptResponse,\n type BedrockTitanEmbedRequest,\n type BedrockTitanEmbedResponse,\n} from './types.js';\n\n// ============================================================================\n// IMPLEMENTATION - Converts between AX format and Bedrock format\n// ============================================================================\n\ntype AxBedrockChatRequest = Omit<AxChatRequest, 'model'> &\n Required<Pick<AxChatRequest<AxAIBedrockModel>, 'model'>>;\n\ntype AxBedrockEmbedRequest = Omit<AxEmbedRequest, 'embedModel'> &\n Required<Pick<AxEmbedRequest<AxAIBedrockEmbedModel>, 'embedModel'>>;\n\ntype ModelFamily = 'claude' | 'gpt' | 'titan';\n\nclass AxAIBedrockImpl\n implements\n AxAIServiceImpl<\n AxAIBedrockModel,\n AxAIBedrockEmbedModel,\n BedrockChatRequest,\n BedrockTitanEmbedRequest,\n BedrockChatResponse,\n never, // No streaming for now\n BedrockTitanEmbedResponse\n >\n{\n private clients: Map<string, BedrockRuntimeClient> = new Map();\n private tokensUsed?: AxTokenUsage;\n\n constructor(\n private config: AxAIBedrockConfig,\n private primaryRegion: string,\n private fallbackRegions: string[],\n private gptRegion: string,\n private gptFallbackRegions: string[]\n ) {}\n\n getTokenUsage(): AxTokenUsage | undefined {\n return this.tokensUsed;\n }\n\n getModelConfig(): AxModelConfig {\n return {\n maxTokens: this.config.maxTokens,\n temperature: this.config.temperature,\n topP: this.config.topP,\n stopSequences: this.config.stopSequences,\n };\n }\n\n private getClient(region: string): BedrockRuntimeClient {\n let client = this.clients.get(region);\n if (!client) {\n client = new BedrockRuntimeClient({ region });\n this.clients.set(region, client);\n }\n return client;\n }\n\n /**\n * Detect model family from model ID\n */\n private getModelFamily(modelId: string): ModelFamily {\n if (\n modelId.includes('anthropic.claude') ||\n modelId.includes('us.anthropic.claude')\n ) {\n return 'claude';\n }\n if (modelId.includes('openai.gpt')) {\n return 'gpt';\n }\n if (modelId.includes('amazon.titan-embed')) {\n return 'titan';\n }\n throw new Error(`Unknown model family for: ${modelId}`);\n }\n\n /**\n * Get appropriate regions for model\n */\n private getRegionsForModel(modelId: string): string[] {\n const family = this.getModelFamily(modelId);\n if (family === 'gpt') {\n return [this.gptRegion, ...this.gptFallbackRegions];\n }\n return [this.primaryRegion, ...this.fallbackRegions];\n }\n\n /**\n * Regional failover logic - tries primary region, then fallbacks\n */\n private async invokeWithFailover<T>(\n modelId: string,\n handler: (client: BedrockRuntimeClient) => Promise<T>\n ): Promise<T> {\n const regions = this.getRegionsForModel(modelId);\n let lastError: Error | undefined;\n\n for (const region of regions) {\n try {\n const client = this.getClient(region);\n return await handler(client);\n } catch (error) {\n lastError = error as Error;\n console.warn(\n `[Bedrock] Region ${region} failed for ${modelId}:`,\n error\n );\n }\n }\n\n throw lastError || new Error(`All Bedrock regions failed for ${modelId}`);\n }\n\n /**\n * Transform AX chat request → Bedrock request (Claude or GPT)\n */\n createChatReq = async (\n req: Readonly<AxBedrockChatRequest>,\n _config: Readonly<AxAIServiceOptions>\n ): Promise<[AxAPI, BedrockChatRequest]> => {\n const family = this.getModelFamily(req.model);\n const maxTokens =\n req.modelConfig?.maxTokens ?? this.config.maxTokens ?? 4096;\n const temperature = req.modelConfig?.temperature ?? this.config.temperature;\n const topP = req.modelConfig?.topP ?? this.config.topP;\n\n let bedrockRequest: BedrockChatRequest;\n\n if (family === 'claude') {\n // Extract system messages for Claude\n const systemMessages = req.chatPrompt\n .filter((msg) => msg.role === 'system')\n .map((msg) => msg.content)\n .join('\\n\\n');\n\n // Convert other messages to Claude format\n const messages = req.chatPrompt\n .filter((msg) => msg.role !== 'system')\n .map((msg) => {\n if (msg.role === 'user') {\n return {\n role: 'user' as const,\n content:\n typeof msg.content === 'string'\n ? msg.content\n : JSON.stringify(msg.content),\n };\n }\n if (msg.role === 'assistant') {\n return {\n role: 'assistant' as const,\n content: msg.content || '',\n };\n }\n throw new Error(`Unsupported role: ${msg.role}`);\n });\n\n bedrockRequest = {\n anthropic_version: 'bedrock-2023-05-31',\n max_tokens: maxTokens,\n messages,\n ...(systemMessages ? { system: systemMessages } : {}),\n ...(temperature !== undefined ? { temperature } : {}),\n ...(topP !== undefined ? { top_p: topP } : {}),\n } as BedrockClaudeRequest;\n } else if (family === 'gpt') {\n // GPT uses OpenAI-style format with system messages in array\n const messages = req.chatPrompt\n .filter((msg) => msg.role !== 'function') // Skip function messages\n .map((msg) => {\n // Get content based on role\n let content: string;\n if ('content' in msg) {\n content =\n typeof msg.content === 'string'\n ? msg.content\n : JSON.stringify(msg.content);\n } else {\n content = '';\n }\n\n return {\n role: msg.role as 'system' | 'user' | 'assistant',\n content,\n };\n });\n\n bedrockRequest = {\n messages,\n max_tokens: maxTokens,\n ...(temperature !== undefined ? { temperature } : {}),\n ...(topP !== undefined ? { top_p: topP } : {}),\n } as BedrockGptRequest;\n } else {\n throw new Error(`Chat not supported for model family: ${family}`);\n }\n\n // Create API config with local call (uses SDK instead of HTTP)\n const apiConfig: AxAPI = {\n name: `bedrock-${family}`,\n localCall: async <TRequest, TResponse>(data: TRequest) => {\n const reqBody = data as unknown as BedrockChatRequest;\n const result = await this.invokeWithFailover(\n req.model,\n async (client) => {\n const command = new InvokeModelCommand({\n modelId: req.model,\n body: JSON.stringify(reqBody),\n contentType: 'application/json',\n accept: 'application/json',\n });\n const response = await client.send(command);\n return JSON.parse(new TextDecoder().decode(response.body));\n }\n );\n return result as TResponse;\n },\n };\n\n return [apiConfig, bedrockRequest];\n };\n\n /**\n * Transform Bedrock response → AX chat response (Claude or GPT)\n */\n createChatResp(resp: Readonly<BedrockChatResponse>): AxChatResponse {\n // Detect response type\n if ('content' in resp && Array.isArray(resp.content)) {\n // Claude response\n return this.createClaudeChatResp(resp as BedrockClaudeResponse);\n } else if ('choices' in resp && Array.isArray(resp.choices)) {\n // GPT response\n return this.createGptChatResp(resp as BedrockGptResponse);\n }\n throw new Error('Unknown response format');\n }\n\n /**\n * Handle Claude-specific response format\n */\n private createClaudeChatResp(\n resp: Readonly<BedrockClaudeResponse>\n ): AxChatResponse {\n // Extract text content from response\n let content = '';\n for (const block of resp.content) {\n if (block.type === 'text') {\n content += block.text;\n }\n }\n\n // Track token usage for AX's optimizer\n this.tokensUsed = {\n promptTokens: resp.usage.input_tokens,\n completionTokens: resp.usage.output_tokens,\n totalTokens: resp.usage.input_tokens + resp.usage.output_tokens,\n };\n\n // Map finish reason\n let finishReason: AxChatResponseResult['finishReason'];\n switch (resp.stop_reason) {\n case 'end_turn':\n case 'stop_sequence':\n finishReason = 'stop';\n break;\n case 'max_tokens':\n finishReason = 'length';\n break;\n default:\n finishReason = undefined;\n }\n\n return {\n results: [\n {\n index: 0,\n id: resp.id,\n content,\n finishReason,\n },\n ],\n remoteId: resp.id,\n };\n }\n\n /**\n * Handle GPT-specific response format\n */\n private createGptChatResp(\n resp: Readonly<BedrockGptResponse>\n ): AxChatResponse {\n const choice = resp.choices[0];\n if (!choice) {\n throw new Error('No choices in GPT response');\n }\n\n // Extract content (can be string or array)\n let content = '';\n if (typeof choice.message.content === 'string') {\n content = choice.message.content;\n } else if (Array.isArray(choice.message.content)) {\n content = choice.message.content\n .map((part) => {\n if (typeof part === 'string') return part;\n return part.text || part.content || '';\n })\n .join('');\n }\n\n // Track token usage if available\n if (resp.usage) {\n this.tokensUsed = {\n promptTokens: resp.usage.prompt_tokens,\n completionTokens: resp.usage.completion_tokens,\n totalTokens: resp.usage.total_tokens,\n };\n }\n\n // Map finish reason\n let finishReason: AxChatResponseResult['finishReason'];\n switch (choice.finish_reason) {\n case 'stop':\n finishReason = 'stop';\n break;\n case 'length':\n finishReason = 'length';\n break;\n case 'content_filter':\n finishReason = 'content_filter';\n break;\n default:\n finishReason = undefined;\n }\n\n return {\n results: [\n {\n index: choice.index,\n id: resp.id,\n content,\n finishReason,\n },\n ],\n remoteId: resp.id,\n };\n }\n\n /**\n * Create embed request for Titan\n */\n createEmbedReq = async (\n req: Readonly<AxBedrockEmbedRequest>\n ): Promise<[AxAPI, BedrockTitanEmbedRequest]> => {\n if (!req.texts || req.texts.length === 0) {\n throw new Error('No texts provided for embedding');\n }\n\n const embedRequest: BedrockTitanEmbedRequest = {\n inputText: req.texts[0], // Take first text\n dimensions: 512,\n normalize: true,\n };\n\n const apiConfig: AxAPI = {\n name: 'bedrock-titan-embed',\n localCall: async <TRequest, TResponse>(data: TRequest) => {\n const reqBody = data as unknown as BedrockTitanEmbedRequest;\n const result = await this.invokeWithFailover(\n req.embedModel,\n async (client) => {\n const command = new InvokeModelCommand({\n modelId: req.embedModel,\n body: JSON.stringify(reqBody),\n contentType: 'application/json',\n accept: 'application/json',\n });\n const response = await client.send(command);\n return JSON.parse(new TextDecoder().decode(response.body));\n }\n );\n return result as TResponse;\n },\n };\n\n return [apiConfig, embedRequest];\n };\n\n /**\n * Create embed response from Titan\n */\n createEmbedResp(resp: Readonly<BedrockTitanEmbedResponse>): AxEmbedResponse {\n return {\n embeddings: [resp.embedding],\n };\n }\n}\n\n// ============================================================================\n// PROVIDER CLASS - Main entry point\n// ============================================================================\n\nexport class AxAIBedrock extends AxBaseAI<\n AxAIBedrockModel,\n AxAIBedrockEmbedModel,\n BedrockChatRequest,\n BedrockTitanEmbedRequest,\n BedrockChatResponse,\n never, // No streaming yet\n BedrockTitanEmbedResponse,\n string\n> {\n constructor({\n region = 'us-east-2',\n fallbackRegions = ['us-west-2', 'us-east-1'],\n gptRegion = 'us-west-2',\n gptFallbackRegions = ['us-east-1'],\n config,\n options,\n }: Readonly<{\n region?: string;\n fallbackRegions?: string[];\n gptRegion?: string;\n gptFallbackRegions?: string[];\n config: Readonly<Partial<AxAIBedrockConfig>>;\n options?: Readonly<AxAIServiceOptions>;\n }>) {\n // Merge user config with defaults\n const fullConfig: AxAIBedrockConfig = {\n ...axBaseAIDefaultConfig(),\n model: AxAIBedrockModel.ClaudeSonnet4,\n region,\n fallbackRegions,\n gptRegion,\n gptFallbackRegions,\n ...config,\n };\n\n // Create implementation\n const aiImpl = new AxAIBedrockImpl(\n fullConfig,\n region,\n fallbackRegions,\n gptRegion,\n gptFallbackRegions\n );\n\n // Define feature support\n const supportFor = (): AxAIFeatures => ({\n functions: false, // Not implemented yet - add when needed\n streaming: false, // Not implemented yet - add when needed\n functionCot: false,\n hasThinkingBudget: false,\n hasShowThoughts: false,\n media: {\n images: {\n supported: false, // Add when needed\n formats: [],\n },\n audio: {\n supported: false,\n formats: [],\n },\n files: {\n supported: false,\n formats: [],\n uploadMethod: 'none',\n },\n urls: {\n supported: false,\n webSearch: false,\n contextFetching: false,\n },\n },\n caching: {\n supported: false,\n types: [],\n },\n thinking: false,\n multiTurn: true, // All models support multi-turn conversations\n });\n\n // Initialize base class\n super(aiImpl, {\n name: 'Bedrock',\n apiURL: '', // Not used - we use SDK directly\n headers: async () => ({}), // AWS SDK handles auth\n modelInfo: axModelInfoBedrock,\n defaults: {\n model: fullConfig.model,\n embedModel: fullConfig.embedModel,\n },\n options,\n supportFor,\n });\n }\n}\n\nexport type { AxAIBedrockConfig } from './types.js';\n// Re-export types for convenience\nexport { AxAIBedrockEmbedModel, AxAIBedrockModel } from './types.js';\n","/**\n * AWS Bedrock provider types for AX integration\n * Supports Claude, GPT OSS, and Titan models\n */\n\nimport type { AxModelConfig } from '@ax-llm/ax';\n\n// All Bedrock models\nexport enum AxAIBedrockModel {\n // Claude models\n ClaudeOpus45 = 'us.anthropic.claude-opus-4-5-20251101-v1:0',\n ClaudeSonnet4 = 'us.anthropic.claude-sonnet-4-20250514-v1:0',\n Claude37Sonnet = 'anthropic.claude-3-7-sonnet-20250219-v1:0',\n Claude35Sonnet = 'anthropic.claude-3-5-sonnet-20240620-v1:0',\n\n // GPT OSS models\n GptOss120B = 'openai.gpt-oss-120b-1:0',\n GptOss20B = 'openai.gpt-oss-20b-1:0',\n}\n\n// Embed models\nexport enum AxAIBedrockEmbedModel {\n TitanEmbedV2 = 'amazon.titan-embed-text-v2:0',\n}\n\nexport interface AxAIBedrockConfig extends AxModelConfig {\n model: AxAIBedrockModel;\n embedModel?: AxAIBedrockEmbedModel;\n region?: string;\n fallbackRegions?: string[];\n gptRegion?: string;\n gptFallbackRegions?: string[];\n}\n\n// ============================================================================\n// Claude Request/Response Types\n// ============================================================================\n\nexport interface BedrockClaudeRequest {\n anthropic_version: string;\n max_tokens: number;\n messages: Array<{\n role: 'user' | 'assistant';\n content: string | Array<{ type: 'text'; text: string }>;\n }>;\n system?: string;\n temperature?: number;\n top_p?: number;\n}\n\nexport interface BedrockClaudeResponse {\n id: string;\n type: 'message';\n role: 'assistant';\n content: Array<{ type: 'text'; text: string }>;\n model: string;\n stop_reason: 'end_turn' | 'max_tokens' | 'stop_sequence';\n usage: {\n input_tokens: number;\n output_tokens: number;\n };\n}\n\n// ============================================================================\n// GPT OSS Request/Response Types (OpenAI-compatible format)\n// ============================================================================\n\nexport interface BedrockGptRequest {\n messages: Array<{\n role: 'system' | 'user' | 'assistant';\n content: string;\n }>;\n max_tokens: number;\n temperature?: number;\n top_p?: number;\n}\n\nexport interface BedrockGptResponse {\n id?: string;\n choices: Array<{\n index: number;\n message: {\n role: 'assistant';\n content:\n | string\n | Array<{ type?: string; text?: string; content?: string }>;\n };\n finish_reason: 'stop' | 'length' | 'content_filter' | null;\n }>;\n usage?: {\n prompt_tokens: number;\n completion_tokens: number;\n total_tokens: number;\n };\n}\n\n// ============================================================================\n// Titan Embed Request/Response Types\n// ============================================================================\n\nexport interface BedrockTitanEmbedRequest {\n inputText: string;\n dimensions?: number;\n normalize?: boolean;\n}\n\nexport interface BedrockTitanEmbedResponse {\n embedding: number[];\n inputTextTokenCount: number;\n}\n\n// Union types for all models\nexport type BedrockChatRequest = BedrockClaudeRequest | BedrockGptRequest;\nexport type BedrockChatResponse = BedrockClaudeResponse | BedrockGptResponse;\n","/**\n * Bedrock model information (pricing, limits, features)\n */\n\nimport type { AxModelInfo } from '@ax-llm/ax';\nimport { AxAIBedrockEmbedModel, AxAIBedrockModel } from './types.js';\n\nexport const axModelInfoBedrock: AxModelInfo[] = [\n // ========================================================================\n // Claude Models\n // ========================================================================\n {\n name: AxAIBedrockModel.ClaudeOpus45,\n currency: 'usd',\n promptTokenCostPer1M: 5.0,\n completionTokenCostPer1M: 25.0,\n maxTokens: 64000,\n contextWindow: 200000,\n supported: { thinkingBudget: true, showThoughts: true },\n },\n {\n name: AxAIBedrockModel.ClaudeSonnet4,\n currency: 'usd',\n promptTokenCostPer1M: 3.0,\n completionTokenCostPer1M: 15.0,\n maxTokens: 64000,\n contextWindow: 200000,\n supported: { thinkingBudget: true, showThoughts: true },\n },\n {\n name: AxAIBedrockModel.Claude37Sonnet,\n currency: 'usd',\n promptTokenCostPer1M: 3.0,\n completionTokenCostPer1M: 15.0,\n maxTokens: 64000,\n contextWindow: 200000,\n },\n {\n name: AxAIBedrockModel.Claude35Sonnet,\n currency: 'usd',\n promptTokenCostPer1M: 3.0,\n completionTokenCostPer1M: 15.0,\n maxTokens: 8192,\n contextWindow: 200000,\n },\n\n // ========================================================================\n // GPT OSS Models\n // ========================================================================\n {\n name: AxAIBedrockModel.GptOss120B,\n currency: 'usd',\n promptTokenCostPer1M: 0.5,\n completionTokenCostPer1M: 1.5,\n maxTokens: 16384,\n contextWindow: 128000,\n },\n {\n name: AxAIBedrockModel.GptOss20B,\n currency: 'usd',\n promptTokenCostPer1M: 0.25,\n completionTokenCostPer1M: 0.75,\n maxTokens: 16384,\n contextWindow: 128000,\n },\n\n // ========================================================================\n // Embed Models\n // ========================================================================\n {\n name: AxAIBedrockEmbedModel.TitanEmbedV2,\n currency: 'usd',\n promptTokenCostPer1M: 0.02,\n completionTokenCostPer1M: 0,\n maxTokens: 8192,\n contextWindow: 8192,\n },\n];\n"],"mappings":"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","names":["AxAIBedrockModel","AxAIBedrockEmbedModel"]}
|
|
1
|
+
{"version":3,"sources":["../api.ts","../types.ts","../info.ts"],"sourcesContent":["/**\n * AWS Bedrock Provider for AX Library\n *\n * Supports Claude, GPT OSS, and Titan Embed models for use with AX's\n * compiler, signatures, flows, and optimization features.\n *\n * Usage:\n * const ai = new AxAIBedrock({\n * region: 'us-east-2',\n * config: { model: AxAIBedrockModel.ClaudeOpus45 }\n * });\n *\n * const sig = AxSignature.from('input -> output');\n * const gen = new AxGen(sig, { ai });\n * const result = await gen.forward({ input: 'test' });\n */\n\nimport {\n BedrockRuntimeClient,\n InvokeModelCommand,\n} from '@aws-sdk/client-bedrock-runtime';\nimport type {\n AxAIServiceImpl,\n AxAIServiceOptions,\n AxAPI,\n AxChatRequest,\n AxChatResponse,\n AxChatResponseResult,\n AxEmbedRequest,\n AxEmbedResponse,\n AxModelConfig,\n AxTokenUsage,\n} from '@ax-llm/ax';\nimport { type AxAIFeatures, AxBaseAI, axBaseAIDefaultConfig } from '@ax-llm/ax';\nimport { axModelInfoBedrock } from './info.js';\nimport {\n type AxAIBedrockConfig,\n type AxAIBedrockEmbedModel,\n AxAIBedrockModel,\n type BedrockChatRequest,\n type BedrockChatResponse,\n type BedrockClaudeRequest,\n type BedrockClaudeResponse,\n type BedrockGptRequest,\n type BedrockGptResponse,\n type BedrockTitanEmbedRequest,\n type BedrockTitanEmbedResponse,\n} from './types.js';\n\n// ============================================================================\n// IMPLEMENTATION - Converts between AX format and Bedrock format\n// ============================================================================\n\ntype AxBedrockChatRequest = Omit<AxChatRequest, 'model'> &\n Required<Pick<AxChatRequest<AxAIBedrockModel>, 'model'>>;\n\ntype AxBedrockEmbedRequest = Omit<AxEmbedRequest, 'embedModel'> &\n Required<Pick<AxEmbedRequest<AxAIBedrockEmbedModel>, 'embedModel'>>;\n\ntype ModelFamily = 'claude' | 'gpt' | 'titan';\n\nclass AxAIBedrockImpl\n implements\n AxAIServiceImpl<\n AxAIBedrockModel,\n AxAIBedrockEmbedModel,\n BedrockChatRequest,\n BedrockTitanEmbedRequest,\n BedrockChatResponse,\n never, // No streaming for now\n BedrockTitanEmbedResponse\n >\n{\n private clients: Map<string, BedrockRuntimeClient> = new Map();\n private tokensUsed?: AxTokenUsage;\n\n constructor(\n private config: AxAIBedrockConfig,\n private primaryRegion: string,\n private fallbackRegions: string[],\n private gptRegion: string,\n private gptFallbackRegions: string[]\n ) {}\n\n getTokenUsage(): AxTokenUsage | undefined {\n return this.tokensUsed;\n }\n\n getModelConfig(): AxModelConfig {\n return {\n maxTokens: this.config.maxTokens,\n temperature: this.config.temperature,\n topP: this.config.topP,\n stopSequences: this.config.stopSequences,\n };\n }\n\n private getClient(region: string): BedrockRuntimeClient {\n let client = this.clients.get(region);\n if (!client) {\n client = new BedrockRuntimeClient({ region });\n this.clients.set(region, client);\n }\n return client;\n }\n\n /**\n * Detect model family from model ID\n */\n private getModelFamily(modelId: string): ModelFamily {\n if (\n modelId.includes('anthropic.claude') ||\n modelId.includes('us.anthropic.claude')\n ) {\n return 'claude';\n }\n if (modelId.includes('openai.gpt')) {\n return 'gpt';\n }\n if (modelId.includes('amazon.titan-embed')) {\n return 'titan';\n }\n throw new Error(`Unknown model family for: ${modelId}`);\n }\n\n /**\n * Get appropriate regions for model\n */\n private getRegionsForModel(modelId: string): string[] {\n const family = this.getModelFamily(modelId);\n if (family === 'gpt') {\n return [this.gptRegion, ...this.gptFallbackRegions];\n }\n return [this.primaryRegion, ...this.fallbackRegions];\n }\n\n /**\n * Regional failover logic - tries primary region, then fallbacks\n */\n private async invokeWithFailover<T>(\n modelId: string,\n handler: (client: BedrockRuntimeClient) => Promise<T>\n ): Promise<T> {\n const regions = this.getRegionsForModel(modelId);\n let lastError: Error | undefined;\n\n for (const region of regions) {\n try {\n const client = this.getClient(region);\n return await handler(client);\n } catch (error) {\n lastError = error as Error;\n console.warn(\n `[Bedrock] Region ${region} failed for ${modelId}:`,\n error\n );\n }\n }\n\n throw lastError || new Error(`All Bedrock regions failed for ${modelId}`);\n }\n\n /**\n * Transform AX chat request → Bedrock request (Claude or GPT)\n */\n createChatReq = async (\n req: Readonly<AxBedrockChatRequest>,\n _config: Readonly<AxAIServiceOptions>\n ): Promise<[AxAPI, BedrockChatRequest]> => {\n const family = this.getModelFamily(req.model);\n const maxTokens =\n req.modelConfig?.maxTokens ?? this.config.maxTokens ?? 4096;\n const temperature = req.modelConfig?.temperature ?? this.config.temperature;\n const topP = req.modelConfig?.topP ?? this.config.topP;\n\n let bedrockRequest: BedrockChatRequest;\n\n if (family === 'claude') {\n // Extract system messages for Claude\n const systemMessages = req.chatPrompt\n .filter((msg) => msg.role === 'system')\n .map((msg) => msg.content)\n .join('\\n\\n');\n\n // Convert other messages to Claude format\n const messages = req.chatPrompt\n .filter((msg) => msg.role !== 'system')\n .map((msg) => {\n if (msg.role === 'user') {\n return {\n role: 'user' as const,\n content:\n typeof msg.content === 'string'\n ? msg.content\n : JSON.stringify(msg.content),\n };\n }\n if (msg.role === 'assistant') {\n return {\n role: 'assistant' as const,\n content: msg.content || '',\n };\n }\n throw new Error(`Unsupported role: ${msg.role}`);\n });\n\n bedrockRequest = {\n anthropic_version: 'bedrock-2023-05-31',\n max_tokens: maxTokens,\n messages,\n ...(systemMessages ? { system: systemMessages } : {}),\n ...(temperature !== undefined ? { temperature } : {}),\n ...(topP !== undefined ? { top_p: topP } : {}),\n } as BedrockClaudeRequest;\n } else if (family === 'gpt') {\n // GPT uses OpenAI-style format with system messages in array\n const messages = req.chatPrompt\n .filter((msg) => msg.role !== 'function') // Skip function messages\n .map((msg) => {\n // Get content based on role\n let content: string;\n if ('content' in msg) {\n content =\n typeof msg.content === 'string'\n ? msg.content\n : JSON.stringify(msg.content);\n } else {\n content = '';\n }\n\n return {\n role: msg.role as 'system' | 'user' | 'assistant',\n content,\n };\n });\n\n bedrockRequest = {\n messages,\n max_tokens: maxTokens,\n ...(temperature !== undefined ? { temperature } : {}),\n ...(topP !== undefined ? { top_p: topP } : {}),\n } as BedrockGptRequest;\n } else {\n throw new Error(`Chat not supported for model family: ${family}`);\n }\n\n // Create API config with local call (uses SDK instead of HTTP)\n const apiConfig: AxAPI = {\n name: `bedrock-${family}`,\n localCall: async <TRequest, TResponse>(data: TRequest) => {\n const reqBody = data as unknown as BedrockChatRequest;\n const result = await this.invokeWithFailover(\n req.model,\n async (client) => {\n const command = new InvokeModelCommand({\n modelId: req.model,\n body: JSON.stringify(reqBody),\n contentType: 'application/json',\n accept: 'application/json',\n });\n const response = await client.send(command);\n return JSON.parse(new TextDecoder().decode(response.body));\n }\n );\n return result as TResponse;\n },\n };\n\n return [apiConfig, bedrockRequest];\n };\n\n /**\n * Transform Bedrock response → AX chat response (Claude or GPT)\n */\n createChatResp(resp: Readonly<BedrockChatResponse>): AxChatResponse {\n // Detect response type\n if ('content' in resp && Array.isArray(resp.content)) {\n // Claude response\n return this.createClaudeChatResp(resp as BedrockClaudeResponse);\n } else if ('choices' in resp && Array.isArray(resp.choices)) {\n // GPT response\n return this.createGptChatResp(resp as BedrockGptResponse);\n }\n throw new Error('Unknown response format');\n }\n\n /**\n * Handle Claude-specific response format\n */\n private createClaudeChatResp(\n resp: Readonly<BedrockClaudeResponse>\n ): AxChatResponse {\n // Extract text content from response\n let content = '';\n for (const block of resp.content) {\n if (block.type === 'text') {\n content += block.text;\n }\n }\n\n // Track token usage for AX's optimizer\n this.tokensUsed = {\n promptTokens: resp.usage.input_tokens,\n completionTokens: resp.usage.output_tokens,\n totalTokens: resp.usage.input_tokens + resp.usage.output_tokens,\n };\n\n // Map finish reason\n let finishReason: AxChatResponseResult['finishReason'];\n switch (resp.stop_reason) {\n case 'end_turn':\n case 'stop_sequence':\n finishReason = 'stop';\n break;\n case 'max_tokens':\n finishReason = 'length';\n break;\n default:\n finishReason = undefined;\n }\n\n return {\n results: [\n {\n index: 0,\n id: resp.id,\n content,\n finishReason,\n },\n ],\n remoteId: resp.id,\n };\n }\n\n /**\n * Handle GPT-specific response format\n */\n private createGptChatResp(\n resp: Readonly<BedrockGptResponse>\n ): AxChatResponse {\n const choice = resp.choices[0];\n if (!choice) {\n throw new Error('No choices in GPT response');\n }\n\n // Extract content (can be string or array)\n let content = '';\n if (typeof choice.message.content === 'string') {\n content = choice.message.content;\n } else if (Array.isArray(choice.message.content)) {\n content = choice.message.content\n .map((part) => {\n if (typeof part === 'string') return part;\n return part.text || part.content || '';\n })\n .join('');\n }\n\n // Track token usage if available\n if (resp.usage) {\n this.tokensUsed = {\n promptTokens: resp.usage.prompt_tokens,\n completionTokens: resp.usage.completion_tokens,\n totalTokens: resp.usage.total_tokens,\n };\n }\n\n // Map finish reason\n let finishReason: AxChatResponseResult['finishReason'];\n switch (choice.finish_reason) {\n case 'stop':\n finishReason = 'stop';\n break;\n case 'length':\n finishReason = 'length';\n break;\n case 'content_filter':\n finishReason = 'content_filter';\n break;\n default:\n finishReason = undefined;\n }\n\n return {\n results: [\n {\n index: choice.index,\n id: resp.id,\n content,\n finishReason,\n },\n ],\n remoteId: resp.id,\n };\n }\n\n /**\n * Create embed request for Titan\n */\n createEmbedReq = async (\n req: Readonly<AxBedrockEmbedRequest>\n ): Promise<[AxAPI, BedrockTitanEmbedRequest]> => {\n if (!req.texts || req.texts.length === 0) {\n throw new Error('No texts provided for embedding');\n }\n\n const embedRequest: BedrockTitanEmbedRequest = {\n inputText: req.texts[0], // Take first text\n dimensions: this.config.dimensions,\n normalize: true,\n };\n\n const apiConfig: AxAPI = {\n name: 'bedrock-titan-embed',\n localCall: async <TRequest, TResponse>(data: TRequest) => {\n const reqBody = data as unknown as BedrockTitanEmbedRequest;\n const result = await this.invokeWithFailover(\n req.embedModel,\n async (client) => {\n const command = new InvokeModelCommand({\n modelId: req.embedModel,\n body: JSON.stringify(reqBody),\n contentType: 'application/json',\n accept: 'application/json',\n });\n const response = await client.send(command);\n return JSON.parse(new TextDecoder().decode(response.body));\n }\n );\n return result as TResponse;\n },\n };\n\n return [apiConfig, embedRequest];\n };\n\n /**\n * Create embed response from Titan\n */\n createEmbedResp(resp: Readonly<BedrockTitanEmbedResponse>): AxEmbedResponse {\n return {\n embeddings: [resp.embedding],\n };\n }\n}\n\n// ============================================================================\n// PROVIDER CLASS - Main entry point\n// ============================================================================\n\nexport class AxAIBedrock extends AxBaseAI<\n AxAIBedrockModel,\n AxAIBedrockEmbedModel,\n BedrockChatRequest,\n BedrockTitanEmbedRequest,\n BedrockChatResponse,\n never, // No streaming yet\n BedrockTitanEmbedResponse,\n string\n> {\n constructor({\n region = 'us-east-2',\n fallbackRegions = ['us-west-2', 'us-east-1'],\n gptRegion = 'us-west-2',\n gptFallbackRegions = ['us-east-1'],\n config,\n options,\n }: Readonly<{\n region?: string;\n fallbackRegions?: string[];\n gptRegion?: string;\n gptFallbackRegions?: string[];\n config: Readonly<Partial<AxAIBedrockConfig>>;\n options?: Readonly<AxAIServiceOptions>;\n }>) {\n // Merge user config with defaults\n const fullConfig: AxAIBedrockConfig = {\n ...axBaseAIDefaultConfig(),\n model: AxAIBedrockModel.ClaudeOpus45,\n region,\n fallbackRegions,\n gptRegion,\n gptFallbackRegions,\n ...config,\n };\n\n // Create implementation\n const aiImpl = new AxAIBedrockImpl(\n fullConfig,\n region,\n fallbackRegions,\n gptRegion,\n gptFallbackRegions\n );\n\n // Define feature support\n const supportFor = (): AxAIFeatures => ({\n functions: false, // Not implemented yet - add when needed\n streaming: false, // Not implemented yet - add when needed\n functionCot: false,\n hasThinkingBudget: false,\n hasShowThoughts: false,\n media: {\n images: {\n supported: false, // Add when needed\n formats: [],\n },\n audio: {\n supported: false,\n formats: [],\n },\n files: {\n supported: false,\n formats: [],\n uploadMethod: 'none',\n },\n urls: {\n supported: false,\n webSearch: false,\n contextFetching: false,\n },\n },\n caching: {\n supported: false,\n types: [],\n },\n thinking: false,\n multiTurn: true, // All models support multi-turn conversations\n });\n\n // Initialize base class\n super(aiImpl, {\n name: 'Bedrock',\n apiURL: '', // Not used - we use SDK directly\n headers: async () => ({}), // AWS SDK handles auth\n modelInfo: axModelInfoBedrock,\n defaults: {\n model: fullConfig.model,\n embedModel: fullConfig.embedModel,\n },\n options,\n supportFor,\n });\n }\n}\n\nexport type { AxAIBedrockConfig } from './types.js';\n// Re-export types for convenience\nexport { AxAIBedrockEmbedModel, AxAIBedrockModel } from './types.js';\n","/**\n * AWS Bedrock provider types for AX integration\n * Supports Claude, GPT OSS, and Titan models\n */\n\nimport type { AxModelConfig } from '@ax-llm/ax';\n\n// All Bedrock models\nexport enum AxAIBedrockModel {\n // Claude models\n ClaudeOpus45 = 'us.anthropic.claude-opus-4-5-20251101-v1:0',\n ClaudeSonnet4 = 'us.anthropic.claude-sonnet-4-20250514-v1:0',\n Claude37Sonnet = 'anthropic.claude-3-7-sonnet-20250219-v1:0',\n Claude35Sonnet = 'anthropic.claude-3-5-sonnet-20240620-v1:0',\n\n // GPT OSS models\n GptOss120B = 'openai.gpt-oss-120b-1:0',\n GptOss20B = 'openai.gpt-oss-20b-1:0',\n}\n\n// Embed models\nexport enum AxAIBedrockEmbedModel {\n TitanEmbedV2 = 'amazon.titan-embed-text-v2:0',\n}\n\nexport interface AxAIBedrockConfig extends AxModelConfig {\n model: AxAIBedrockModel;\n embedModel?: AxAIBedrockEmbedModel;\n dimensions?: number;\n region?: string;\n fallbackRegions?: string[];\n gptRegion?: string;\n gptFallbackRegions?: string[];\n}\n\n// ============================================================================\n// Claude Request/Response Types\n// ============================================================================\n\nexport interface BedrockClaudeRequest {\n anthropic_version: string;\n max_tokens: number;\n messages: Array<{\n role: 'user' | 'assistant';\n content: string | Array<{ type: 'text'; text: string }>;\n }>;\n system?: string;\n temperature?: number;\n top_p?: number;\n}\n\nexport interface BedrockClaudeResponse {\n id: string;\n type: 'message';\n role: 'assistant';\n content: Array<{ type: 'text'; text: string }>;\n model: string;\n stop_reason: 'end_turn' | 'max_tokens' | 'stop_sequence';\n usage: {\n input_tokens: number;\n output_tokens: number;\n };\n}\n\n// ============================================================================\n// GPT OSS Request/Response Types (OpenAI-compatible format)\n// ============================================================================\n\nexport interface BedrockGptRequest {\n messages: Array<{\n role: 'system' | 'user' | 'assistant';\n content: string;\n }>;\n max_tokens: number;\n temperature?: number;\n top_p?: number;\n}\n\nexport interface BedrockGptResponse {\n id?: string;\n choices: Array<{\n index: number;\n message: {\n role: 'assistant';\n content:\n | string\n | Array<{ type?: string; text?: string; content?: string }>;\n };\n finish_reason: 'stop' | 'length' | 'content_filter' | null;\n }>;\n usage?: {\n prompt_tokens: number;\n completion_tokens: number;\n total_tokens: number;\n };\n}\n\n// ============================================================================\n// Titan Embed Request/Response Types\n// ============================================================================\n\nexport interface BedrockTitanEmbedRequest {\n inputText: string;\n dimensions?: number;\n normalize?: boolean;\n}\n\nexport interface BedrockTitanEmbedResponse {\n embedding: number[];\n inputTextTokenCount: number;\n}\n\n// Union types for all models\nexport type BedrockChatRequest = BedrockClaudeRequest | BedrockGptRequest;\nexport type BedrockChatResponse = BedrockClaudeResponse | BedrockGptResponse;\n","/**\n * Bedrock model information (pricing, limits, features)\n */\n\nimport type { AxModelInfo } from '@ax-llm/ax';\nimport { AxAIBedrockEmbedModel, AxAIBedrockModel } from './types.js';\n\nexport const axModelInfoBedrock: AxModelInfo[] = [\n // ========================================================================\n // Claude Models\n // ========================================================================\n {\n name: AxAIBedrockModel.ClaudeOpus45,\n currency: 'usd',\n promptTokenCostPer1M: 5.0,\n completionTokenCostPer1M: 25.0,\n maxTokens: 64000,\n contextWindow: 200000,\n supported: { thinkingBudget: true, showThoughts: true },\n },\n {\n name: AxAIBedrockModel.ClaudeSonnet4,\n currency: 'usd',\n promptTokenCostPer1M: 3.0,\n completionTokenCostPer1M: 15.0,\n maxTokens: 64000,\n contextWindow: 200000,\n supported: { thinkingBudget: true, showThoughts: true },\n },\n {\n name: AxAIBedrockModel.Claude37Sonnet,\n currency: 'usd',\n promptTokenCostPer1M: 3.0,\n completionTokenCostPer1M: 15.0,\n maxTokens: 64000,\n contextWindow: 200000,\n },\n {\n name: AxAIBedrockModel.Claude35Sonnet,\n currency: 'usd',\n promptTokenCostPer1M: 3.0,\n completionTokenCostPer1M: 15.0,\n maxTokens: 8192,\n contextWindow: 200000,\n },\n\n // ========================================================================\n // GPT OSS Models\n // ========================================================================\n {\n name: AxAIBedrockModel.GptOss120B,\n currency: 'usd',\n promptTokenCostPer1M: 0.5,\n completionTokenCostPer1M: 1.5,\n maxTokens: 16384,\n contextWindow: 128000,\n },\n {\n name: AxAIBedrockModel.GptOss20B,\n currency: 'usd',\n promptTokenCostPer1M: 0.25,\n completionTokenCostPer1M: 0.75,\n maxTokens: 16384,\n contextWindow: 128000,\n },\n\n // ========================================================================\n // Embed Models\n // ========================================================================\n {\n name: AxAIBedrockEmbedModel.TitanEmbedV2,\n currency: 'usd',\n promptTokenCostPer1M: 0.02,\n completionTokenCostPer1M: 0,\n maxTokens: 8192,\n contextWindow: 8192,\n },\n];\n"],"mappings":"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","names":["AxAIBedrockModel","AxAIBedrockEmbedModel"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ax-llm/ax-ai-aws-bedrock",
|
|
3
|
-
"version": "22.0.
|
|
3
|
+
"version": "22.0.9",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "AWS Bedrock Provider for AX - supports Claude, GPT OSS, and Titan Embed models",
|
|
6
6
|
"repository": {
|
|
@@ -22,7 +22,7 @@
|
|
|
22
22
|
],
|
|
23
23
|
"dependencies": {
|
|
24
24
|
"@aws-sdk/client-bedrock-runtime": "^3.709.0",
|
|
25
|
-
"@ax-llm/ax": "22.0.
|
|
25
|
+
"@ax-llm/ax": "22.0.9"
|
|
26
26
|
},
|
|
27
27
|
"peerDependencies": {
|
|
28
28
|
"@ax-llm/ax": "14.0.31"
|
|
@@ -44,7 +44,6 @@
|
|
|
44
44
|
"import": "./index.js",
|
|
45
45
|
"require": "./index.cjs"
|
|
46
46
|
},
|
|
47
|
-
"./index.global.js": "./index.global.js",
|
|
48
47
|
"./*": {
|
|
49
48
|
"types": "./*.d.ts",
|
|
50
49
|
"import": "./*.js",
|