From faea3fb25b0df114b1b0137c9dd47af20875a5e8 Mon Sep 17 00:00:00 2001 From: Raphael MANSUY Date: Fri, 13 Sep 2024 05:26:17 +0200 Subject: [PATCH] Fix/qllm-01 (#63) * fix(jest.config, package.json): update jest config to use ts-jest and babel-jest, add necessary dependencies * fix(packages/qllm-lib/src/providers/anthropic): update aws-credentials to use profile or environment variables * fix(aws-credentials): update aws-credentials to use profile or environment variables * fix(dependencies): update typedoc to version 0.26.7 * fix(npm): set strict-peer-dependencies to false --- .npmrc | 4 +- README.md | 9 +++ jest.config.js | 7 ++- package.json | 5 +- packages/qllm-cli/CHANGELOG.md | 7 +++ packages/qllm-cli/package.json | 4 +- packages/qllm-lib/CHANGELOG.md | 6 ++ packages/qllm-lib/package.json | 2 +- .../providers/anthropic/aws-credentials.ts | 55 +++++++++++++++---- packages/qllm-samples/CHANGELOG.md | 7 +++ packages/qllm-samples/package.json | 2 +- packages/sandbox-docker/package.json | 1 - 12 files changed, 88 insertions(+), 21 deletions(-) diff --git a/.npmrc b/.npmrc index 44950ec..a40725c 100644 --- a/.npmrc +++ b/.npmrc @@ -29,4 +29,6 @@ node-env=production # registry=https://registry.npmjs.org/ # Configure cache location (uncomment and modify if needed) -# cache=~/.pnpm-store \ No newline at end of file +# cache=~/.pnpm-store + +strict-peer-dependencies=false \ No newline at end of file diff --git a/README.md b/README.md index 46a5891..3a912cc 100644 --- a/README.md +++ b/README.md @@ -140,6 +140,15 @@ $ qllm configure ? Log Level: info ``` +#### AWS Configuration +To use AWS Bedrock with QLLM, you need to configure your AWS credentials. Ensure you have the following environment variables set: +- `AWS_ACCESS_KEY_ID`: Your AWS access key ID. +- `AWS_SECRET_ACCESS_KEY`: Your AWS secret access key. +- `AWS_BEDROCK_REGION`: The AWS region you want to use (optional, defaults to a predefined region). +- `AWS_BEDROCK_PROFILE`: If you prefer to use a named profile from your AWS credentials file, set this variable instead of the access key and secret. + +You can set these variables in your terminal or include them in your environment configuration file (e.g., `.env` file) for convenience. + > 💡 Pro Tip: You can always change these settings later, either through the `qllm configure` command or directly in the configuration file located at `~/.qllmrc`. > diff --git a/jest.config.js b/jest.config.js index 950426b..48b7f6b 100644 --- a/jest.config.js +++ b/jest.config.js @@ -4,10 +4,13 @@ module.exports = { testEnvironment: 'node', moduleFileExtensions: ['ts', 'tsx', 'js', 'jsx', 'json', 'node'], transform: { - '^.+\\.tsx?$': 'ts-jest', + '^.+\\.tsx?$': 'ts-jest', // Use ts-jest for TypeScript files + '^.+\\.jsx?$': 'babel-jest', // Use babel-jest for JavaScript files + }, + moduleNameMapper: { + // Add any necessary mappings for non-JS modules here }, testMatch: ['**/__tests__/**/*.ts?(x)', '**/?(*.)+(spec|test).ts?(x)'], collectCoverage: true, coverageDirectory: 'coverage', }; - \ No newline at end of file diff --git a/package.json b/package.json index f97a80d..3b3c15e 100644 --- a/package.json +++ b/package.json @@ -20,12 +20,14 @@ }, "devDependencies": { "@aws-sdk/client-sso-oidc": "^3.614.0", + "@babel/preset-env": "7.25.4", "@changesets/cli": "^2.27.7", "@rollup/plugin-commonjs": "26.0.1", "@rollup/plugin-json": "6.1.0", "@rollup/plugin-node-resolve": "15.2.3", "@rollup/plugin-terser": "0.4.4", "@rollup/plugin-typescript": "11.1.6", + "babel-jest": "29.7.0", "eslint": "^9.9.1", "espree": "10.1.0", "prettier": "^3.3.3", @@ -33,7 +35,8 @@ "rollup": "4.21.1", "rollup-plugin-analyzer": "4.0.0", "rollup-plugin-gzip": "4.0.1", - "typedoc": "0.26.6", + "ts-jest": "29.2.5", + "typedoc": "0.26.7", "typedoc-plugin-markdown": "4.2.6", "typescript": "^5.5.4" }, diff --git a/packages/qllm-cli/CHANGELOG.md b/packages/qllm-cli/CHANGELOG.md index 83970dc..adafda3 100644 --- a/packages/qllm-cli/CHANGELOG.md +++ b/packages/qllm-cli/CHANGELOG.md @@ -1,5 +1,12 @@ # qllm +## 2.9.3 + +### Patch Changes + +- Updated dependencies + - qllm-lib@3.6.2 + ## 2.9.2 ### Patch Changes diff --git a/packages/qllm-cli/package.json b/packages/qllm-cli/package.json index 40a5c21..48013fb 100644 --- a/packages/qllm-cli/package.json +++ b/packages/qllm-cli/package.json @@ -1,6 +1,6 @@ { "name": "qllm", - "version": "2.9.2", + "version": "2.9.3", "description": "QLLM CLI: A versatile CLI tool for interacting with multiple AI/LLM providers. Features include chat sessions, one-time queries, image handling, and conversation management. Streamlines AI development with easy provider/model switching and configuration.", "keywords": [ "ai", @@ -22,7 +22,7 @@ }, "scripts": { "build:ts": "tsc", - "build": "pnpm run build:ts", + "build": "pnpm install && pnpm run build:ts", "build:prod": "pnpm install && pnpm run build:ts", "clean": "rimraf dist tsconfig.tsbuildinfo", "lint": "eslint .", diff --git a/packages/qllm-lib/CHANGELOG.md b/packages/qllm-lib/CHANGELOG.md index 8ff6a04..c387a06 100644 --- a/packages/qllm-lib/CHANGELOG.md +++ b/packages/qllm-lib/CHANGELOG.md @@ -1,5 +1,11 @@ # qllm-lib +## 3.6.2 + +### Patch Changes + +- update aws-credentials to use profile or environment variables + ## 3.6.0 ### Minor Changes diff --git a/packages/qllm-lib/package.json b/packages/qllm-lib/package.json index 3fe6e3f..efed613 100644 --- a/packages/qllm-lib/package.json +++ b/packages/qllm-lib/package.json @@ -1,6 +1,6 @@ { "name": "qllm-lib", - "version": "3.6.0", + "version": "3.6.2", "description": "Core library providing robust AI engineering functionalities tailored for Large Language Model (LLM) applications, enabling developers to build, deploy, and optimize AI solutions with ease.", "keywords": [ "ai", diff --git a/packages/qllm-lib/src/providers/anthropic/aws-credentials.ts b/packages/qllm-lib/src/providers/anthropic/aws-credentials.ts index 57f61fb..c796fd1 100644 --- a/packages/qllm-lib/src/providers/anthropic/aws-credentials.ts +++ b/packages/qllm-lib/src/providers/anthropic/aws-credentials.ts @@ -1,9 +1,9 @@ import { AnthropicBedrock } from '@anthropic-ai/bedrock-sdk'; import { getCredentials } from '../../utils/cloud/aws/credential'; -import { DEFAULT_AWS_BEDROCK_REGION, DEFAULT_AWS_BEDROCK_PROFILE } from './constants'; +import { DEFAULT_AWS_BEDROCK_REGION } from './constants'; export const region = () => process.env.AWS_BEDROCK_REGION || DEFAULT_AWS_BEDROCK_REGION; -export const profile = () => process.env.AWS_BEDROCK_PROFILE || DEFAULT_AWS_BEDROCK_PROFILE; +export const profile = () => process.env.AWS_BEDROCK_PROFILE; export async function getAwsCredential() { const credentials = await getCredentials(region()); @@ -11,15 +11,46 @@ export async function getAwsCredential() { } export const createAwsBedrockAnthropicProvider = async () => { - process.env.AWS_PROFILE = profile(); - process.env.AWS_REGION = region(); - const credentials = await getAwsCredential(); - const client = new AnthropicBedrock({ - awsSessionToken: credentials.sessionToken, - awsRegion: region(), - }); + let client; - // Import AnthropicProvider dynamically to avoid circular dependency - const { AnthropicProvider } = await import('./index'); - return new AnthropicProvider({ client }); + try { + if (process.env.AWS_BEDROCK_PROFILE) { + // Clear static credentials if using profile + delete process.env.AWS_ACCESS_KEY_ID; + delete process.env.AWS_SECRET_ACCESS_KEY; + delete process.env.AWS_SESSION_TOKEN; + + process.env.AWS_PROFILE = process.env.AWS_BEDROCK_PROFILE; // Set AWS_PROFILE + // Use profile-based credentials + const credentials = await getAwsCredential(); // Ensure this function retrieves credentials based on the profile + if (!credentials || !credentials.accessKeyId || !credentials.secretAccessKey) { + throw new Error('Failed to retrieve AWS credentials from profile.'); + } + client = new AnthropicBedrock({ + awsAccessKey: credentials.accessKeyId, + awsSecretKey: credentials.secretAccessKey, + awsSessionToken: credentials.sessionToken, // Optional + awsRegion: region(), + }); + } else { + // Fallback to environment variables + if (!process.env.AWS_ACCESS_KEY_ID || !process.env.AWS_SECRET_ACCESS_KEY) { + throw new Error('AWS_ACCESS_KEY_ID and AWS_SECRET_ACCESS_KEY must be defined.'); + } + delete process.env.AWS_PROFILE; + + client = new AnthropicBedrock({ + awsAccessKey: process.env.AWS_ACCESS_KEY_ID, + awsSecretKey: process.env.AWS_SECRET_ACCESS_KEY, + awsSessionToken: process.env.AWS_SESSION_TOKEN, // Optional + awsRegion: region(), + }); + } + + const { AnthropicProvider } = await import('./index'); + return new AnthropicProvider({ client }); + } catch (error) { + console.error('Error creating AWS Bedrock Anthropic Provider:', error); + throw error; // Rethrow the error after logging + } }; diff --git a/packages/qllm-samples/CHANGELOG.md b/packages/qllm-samples/CHANGELOG.md index 693b325..f55264e 100644 --- a/packages/qllm-samples/CHANGELOG.md +++ b/packages/qllm-samples/CHANGELOG.md @@ -1,5 +1,12 @@ # qllm-samples +## 1.0.5 + +### Patch Changes + +- Updated dependencies + - qllm-lib@3.6.2 + ## 1.0.4 ### Patch Changes diff --git a/packages/qllm-samples/package.json b/packages/qllm-samples/package.json index ab45241..0f64089 100644 --- a/packages/qllm-samples/package.json +++ b/packages/qllm-samples/package.json @@ -1,6 +1,6 @@ { "name": "qllm-samples", - "version": "1.0.4", + "version": "1.0.5", "description": "QLLM Samples", "keywords": [ "ai", diff --git a/packages/sandbox-docker/package.json b/packages/sandbox-docker/package.json index b7019d5..1da8a3d 100644 --- a/packages/sandbox-docker/package.json +++ b/packages/sandbox-docker/package.json @@ -7,7 +7,6 @@ "build": "tsc", "start": "node dist/test.js", "start_example": "node dist/test.js", - "test": "jest --detectOpenHandles", "test:watch": "jest --watch", "test:coverage": "jest --coverage", "start:server": "node dist/test.js --server"