mirror of
https://github.com/getcompanion-ai/co-mono.git
synced 2026-04-15 17:00:59 +00:00
Adds support for Amazon Bedrock with Claude models including: - Full streaming support via Converse API - Reasoning/thinking support for Claude models - Cross-region inference model ID handling - Multiple AWS credential sources (profile, IAM keys, API keys) - Image support in messages and tool results - Unicode surrogate sanitization Also adds 'Adding a New Provider' documentation to AGENTS.md and README. Co-authored-by: nickchan2 <nickchan2@users.noreply.github.com>
66 lines
2.6 KiB
TypeScript
66 lines
2.6 KiB
TypeScript
/**
|
|
* A test suite to ensure all configured Amazon Bedrock models are usable.
|
|
*
|
|
* This is here to make sure we got correct model identifiers from models.dev and other sources.
|
|
* Because Amazon Bedrock requires cross-region inference in some models,
|
|
* plain model identifiers are not always usable and it requires tweaking of model identifiers to use cross-region inference.
|
|
* See https://docs.aws.amazon.com/bedrock/latest/userguide/inference-profiles-support.html#inference-profiles-support-system for more details.
|
|
*
|
|
* This test suite is not enabled by default unless AWS credentials and `BEDROCK_EXTENSIVE_MODEL_TEST` environment variables are set.
|
|
* This test suite takes ~2 minutes to run. Because not all models are available in all regions,
|
|
* it's recommended to use `us-west-2` region for best coverage for running this test suite.
|
|
*
|
|
* You can run this test suite with:
|
|
* ```bash
|
|
* $ AWS_REGION=us-west-2 BEDROCK_EXTENSIVE_MODEL_TEST=1 AWS_PROFILE=... npm test -- ./test/bedrock-models.test.ts
|
|
* ```
|
|
*/
|
|
|
|
import { describe, expect, it } from "vitest";
|
|
import { getModels } from "../src/models.js";
|
|
import { complete } from "../src/stream.js";
|
|
import type { Context } from "../src/types.js";
|
|
import { hasBedrockCredentials } from "./bedrock-utils.js";
|
|
|
|
describe("Amazon Bedrock Models", () => {
|
|
const models = getModels("amazon-bedrock");
|
|
|
|
it("should get all available Bedrock models", () => {
|
|
expect(models.length).toBeGreaterThan(0);
|
|
console.log(`Found ${models.length} Bedrock models`);
|
|
});
|
|
|
|
if (hasBedrockCredentials() && process.env.BEDROCK_EXTENSIVE_MODEL_TEST) {
|
|
for (const model of models) {
|
|
it(`should make a simple request with ${model.id}`, { timeout: 10_000 }, async () => {
|
|
const context: Context = {
|
|
systemPrompt: "You are a helpful assistant. Be extremely concise.",
|
|
messages: [
|
|
{
|
|
role: "user",
|
|
content: "Reply with exactly: 'OK'",
|
|
timestamp: Date.now(),
|
|
},
|
|
],
|
|
};
|
|
|
|
const response = await complete(model, context);
|
|
|
|
expect(response.role).toBe("assistant");
|
|
expect(response.content).toBeTruthy();
|
|
expect(response.content.length).toBeGreaterThan(0);
|
|
expect(response.usage.input + response.usage.cacheRead).toBeGreaterThan(0);
|
|
expect(response.usage.output).toBeGreaterThan(0);
|
|
expect(response.errorMessage).toBeFalsy();
|
|
|
|
const textContent = response.content
|
|
.filter((b) => b.type === "text")
|
|
.map((b) => (b.type === "text" ? b.text : ""))
|
|
.join("")
|
|
.trim();
|
|
expect(textContent).toBeTruthy();
|
|
console.log(`${model.id}: ${textContent.substring(0, 100)}`);
|
|
});
|
|
}
|
|
}
|
|
});
|