mirror of
https://github.com/CherryHQ/cherry-studio.git
synced 2025-12-19 06:30:10 +08:00
* feat(migrate): add default settings for assistants during migration - Introduced a new migration step to assign default settings for assistants that lack configuration. - Default settings include temperature, context count, and other parameters to ensure consistent behavior across the application. * chore(store): increment version number to 115 for persisted reducer * feat(vertex-sdk): integrate Anthropic Vertex SDK and add access token retrieval - Added support for the new `@anthropic-ai/vertex-sdk` in the project. - Introduced a new IPC channel `VertexAI_GetAccessToken` to retrieve access tokens. - Implemented `getAccessToken` method in `VertexAIService` to handle service account authentication. - Updated the `IpcChannel` enum and related IPC handlers to support the new functionality. - Enhanced the `VertexAPIClient` to utilize the `AnthropicVertexClient` for model handling. - Refactored existing code to accommodate the integration of the Vertex SDK and improve modularity. * feat(vertex-ai): enhance VertexAI settings and API host management - Added a new method to format the API host URL in both AnthropicVertexClient and VertexAPIClient. - Updated getBaseURL methods to utilize the new formatting logic. - Enhanced VertexAISettings component to include an input for API host configuration, with help text for user guidance. - Updated localization files to include new help text for the API host field in multiple languages. * fix(vertex-sdk): update baseURL handling and patch dependencies - Refactored baseURL assignment in AnthropicVertexClient to ensure it defaults to undefined when the URL is empty. - Updated yarn.lock to reflect changes in dependency resolution and checksum for @anthropic-ai/vertex-sdk patch. * refactor(VertexAISetting): use provider.id rather than provider * refactor: improve API host formatting in AnthropicVertexClient - Updated the `formatApiHost` method to streamline host URL handling. - Introduced a helper function to determine if the original host should be used based on its format. - Ensured consistent appending of the `/v1/` path for valid API requests. * fix: handle empty host in AnthropicVertexClient - Added a check in the `getBaseURL` method to return the host if it is empty, preventing potential errors. - Included a console log for the base URL to aid in debugging and verification of the URL formatting. * feat(AnthropicVertexClient): add logging for authentication errors and mock client in tests - Introduced logging functionality in AnthropicVertexClient to replace console.error with logger service for better error tracking. - Added mock implementation for AnthropicVertexClient in tests to enhance testing capabilities. - Updated package.json to include the @aws-sdk/client-s3 dependency. * feat(tests): add comprehensive tests for client compatibility types - Introduced a new test file to validate compatibility types for various API clients including OpenAI, Anthropic, Gemini, Aihubmix, NewAPI, and Vertex. - Implemented mock services to facilitate testing and ensure isolation of client behavior. - Added tests for both direct API clients and decorator pattern clients, ensuring correct compatibility type returns. - Enhanced middleware compatibility logic tests to verify correct identification of compatible clients. --------- Co-authored-by: one <wangan.cs@gmail.com>
197 lines
9.3 KiB
Diff
Vendored
197 lines
9.3 KiB
Diff
Vendored
diff --git a/client.js b/client.js
|
|
index c2b9cd6e46f9f66f901af259661bc2d2f8b38936..9b6b3af1a6573e1ccaf3a1c5f41b48df198cbbe0 100644
|
|
--- a/client.js
|
|
+++ b/client.js
|
|
@@ -26,7 +26,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
exports.AnthropicVertex = exports.BaseAnthropic = void 0;
|
|
const client_1 = require("@anthropic-ai/sdk/client");
|
|
const Resources = __importStar(require("@anthropic-ai/sdk/resources/index"));
|
|
-const google_auth_library_1 = require("google-auth-library");
|
|
+// const google_auth_library_1 = require("google-auth-library");
|
|
const env_1 = require("./internal/utils/env.js");
|
|
const values_1 = require("./internal/utils/values.js");
|
|
const headers_1 = require("./internal/headers.js");
|
|
@@ -56,7 +56,7 @@ class AnthropicVertex extends client_1.BaseAnthropic {
|
|
throw new Error('No region was given. The client should be instantiated with the `region` option or the `CLOUD_ML_REGION` environment variable should be set.');
|
|
}
|
|
super({
|
|
- baseURL: baseURL || `https://${region}-aiplatform.googleapis.com/v1`,
|
|
+ baseURL: baseURL || (region === 'global' ? 'https://aiplatform.googleapis.com/v1' : `https://${region}-aiplatform.googleapis.com/v1`),
|
|
...opts,
|
|
});
|
|
this.messages = makeMessagesResource(this);
|
|
@@ -64,22 +64,22 @@ class AnthropicVertex extends client_1.BaseAnthropic {
|
|
this.region = region;
|
|
this.projectId = projectId;
|
|
this.accessToken = opts.accessToken ?? null;
|
|
- this._auth =
|
|
- opts.googleAuth ?? new google_auth_library_1.GoogleAuth({ scopes: 'https://www.googleapis.com/auth/cloud-platform' });
|
|
- this._authClientPromise = this._auth.getClient();
|
|
+ // this._auth =
|
|
+ // opts.googleAuth ?? new google_auth_library_1.GoogleAuth({ scopes: 'https://www.googleapis.com/auth/cloud-platform' });
|
|
+ // this._authClientPromise = this._auth.getClient();
|
|
}
|
|
validateHeaders() {
|
|
// auth validation is handled in prepareOptions since it needs to be async
|
|
}
|
|
- async prepareOptions(options) {
|
|
- const authClient = await this._authClientPromise;
|
|
- const authHeaders = await authClient.getRequestHeaders();
|
|
- const projectId = authClient.projectId ?? authHeaders['x-goog-user-project'];
|
|
- if (!this.projectId && projectId) {
|
|
- this.projectId = projectId;
|
|
- }
|
|
- options.headers = (0, headers_1.buildHeaders)([authHeaders, options.headers]);
|
|
- }
|
|
+ // async prepareOptions(options) {
|
|
+ // const authClient = await this._authClientPromise;
|
|
+ // const authHeaders = await authClient.getRequestHeaders();
|
|
+ // const projectId = authClient.projectId ?? authHeaders['x-goog-user-project'];
|
|
+ // if (!this.projectId && projectId) {
|
|
+ // this.projectId = projectId;
|
|
+ // }
|
|
+ // options.headers = (0, headers_1.buildHeaders)([authHeaders, options.headers]);
|
|
+ // }
|
|
buildRequest(options) {
|
|
if ((0, values_1.isObj)(options.body)) {
|
|
// create a shallow copy of the request body so that code that mutates it later
|
|
diff --git a/client.mjs b/client.mjs
|
|
index 70274cbf38f69f87cbcca9567e77e4a7b938cf90..4dea954b6f4afad565663426b7adfad5de973a7d 100644
|
|
--- a/client.mjs
|
|
+++ b/client.mjs
|
|
@@ -1,6 +1,6 @@
|
|
import { BaseAnthropic } from '@anthropic-ai/sdk/client';
|
|
import * as Resources from '@anthropic-ai/sdk/resources/index';
|
|
-import { GoogleAuth } from 'google-auth-library';
|
|
+// import { GoogleAuth } from 'google-auth-library';
|
|
import { readEnv } from "./internal/utils/env.mjs";
|
|
import { isObj } from "./internal/utils/values.mjs";
|
|
import { buildHeaders } from "./internal/headers.mjs";
|
|
@@ -29,7 +29,7 @@ export class AnthropicVertex extends BaseAnthropic {
|
|
throw new Error('No region was given. The client should be instantiated with the `region` option or the `CLOUD_ML_REGION` environment variable should be set.');
|
|
}
|
|
super({
|
|
- baseURL: baseURL || `https://${region}-aiplatform.googleapis.com/v1`,
|
|
+ baseURL: baseURL || (region === 'global' ? 'https://aiplatform.googleapis.com/v1' : `https://${region}-aiplatform.googleapis.com/v1`),
|
|
...opts,
|
|
});
|
|
this.messages = makeMessagesResource(this);
|
|
@@ -37,22 +37,22 @@ export class AnthropicVertex extends BaseAnthropic {
|
|
this.region = region;
|
|
this.projectId = projectId;
|
|
this.accessToken = opts.accessToken ?? null;
|
|
- this._auth =
|
|
- opts.googleAuth ?? new GoogleAuth({ scopes: 'https://www.googleapis.com/auth/cloud-platform' });
|
|
- this._authClientPromise = this._auth.getClient();
|
|
+ // this._auth =
|
|
+ // opts.googleAuth ?? new GoogleAuth({ scopes: 'https://www.googleapis.com/auth/cloud-platform' });
|
|
+ //this._authClientPromise = this._auth.getClient();
|
|
}
|
|
validateHeaders() {
|
|
// auth validation is handled in prepareOptions since it needs to be async
|
|
}
|
|
- async prepareOptions(options) {
|
|
- const authClient = await this._authClientPromise;
|
|
- const authHeaders = await authClient.getRequestHeaders();
|
|
- const projectId = authClient.projectId ?? authHeaders['x-goog-user-project'];
|
|
- if (!this.projectId && projectId) {
|
|
- this.projectId = projectId;
|
|
- }
|
|
- options.headers = buildHeaders([authHeaders, options.headers]);
|
|
- }
|
|
+ // async prepareOptions(options) {
|
|
+ // const authClient = await this._authClientPromise;
|
|
+ // const authHeaders = await authClient.getRequestHeaders();
|
|
+ // const projectId = authClient.projectId ?? authHeaders['x-goog-user-project'];
|
|
+ // if (!this.projectId && projectId) {
|
|
+ // this.projectId = projectId;
|
|
+ // }
|
|
+ // options.headers = buildHeaders([authHeaders, options.headers]);
|
|
+ // }
|
|
buildRequest(options) {
|
|
if (isObj(options.body)) {
|
|
// create a shallow copy of the request body so that code that mutates it later
|
|
diff --git a/src/client.ts b/src/client.ts
|
|
index a6f9c6be65e4189f4f9601fb560df3f68e7563eb..37b1ad2802e3ca0dae4ca35f9dcb5b22dcf09796 100644
|
|
--- a/src/client.ts
|
|
+++ b/src/client.ts
|
|
@@ -12,22 +12,22 @@ export { BaseAnthropic } from '@anthropic-ai/sdk/client';
|
|
const DEFAULT_VERSION = 'vertex-2023-10-16';
|
|
const MODEL_ENDPOINTS = new Set<string>(['/v1/messages', '/v1/messages?beta=true']);
|
|
|
|
-export type ClientOptions = Omit<CoreClientOptions, 'apiKey' | 'authToken'> & {
|
|
- region?: string | null | undefined;
|
|
- projectId?: string | null | undefined;
|
|
- accessToken?: string | null | undefined;
|
|
-
|
|
- /**
|
|
- * Override the default google auth config using the
|
|
- * [google-auth-library](https://www.npmjs.com/package/google-auth-library) package.
|
|
- *
|
|
- * Note that you'll likely have to set `scopes`, e.g.
|
|
- * ```ts
|
|
- * new GoogleAuth({ scopes: 'https://www.googleapis.com/auth/cloud-platform' })
|
|
- * ```
|
|
- */
|
|
- googleAuth?: GoogleAuth | null | undefined;
|
|
-};
|
|
+// export type ClientOptions = Omit<CoreClientOptions, 'apiKey' | 'authToken'> & {
|
|
+// region?: string | null | undefined;
|
|
+// projectId?: string | null | undefined;
|
|
+// accessToken?: string | null | undefined;
|
|
+
|
|
+// /**
|
|
+// * Override the default google auth config using the
|
|
+// * [google-auth-library](https://www.npmjs.com/package/google-auth-library) package.
|
|
+// *
|
|
+// * Note that you'll likely have to set `scopes`, e.g.
|
|
+// * ```ts
|
|
+// * new GoogleAuth({ scopes: 'https://www.googleapis.com/auth/cloud-platform' })
|
|
+// * ```
|
|
+// */
|
|
+// googleAuth?: GoogleAuth | null | undefined;
|
|
+// };
|
|
|
|
export class AnthropicVertex extends BaseAnthropic {
|
|
region: string;
|
|
@@ -74,9 +74,9 @@ export class AnthropicVertex extends BaseAnthropic {
|
|
this.projectId = projectId;
|
|
this.accessToken = opts.accessToken ?? null;
|
|
|
|
- this._auth =
|
|
- opts.googleAuth ?? new GoogleAuth({ scopes: 'https://www.googleapis.com/auth/cloud-platform' });
|
|
- this._authClientPromise = this._auth.getClient();
|
|
+ // this._auth =
|
|
+ // opts.googleAuth ?? new GoogleAuth({ scopes: 'https://www.googleapis.com/auth/cloud-platform' });
|
|
+ // this._authClientPromise = this._auth.getClient();
|
|
}
|
|
|
|
messages: MessagesResource = makeMessagesResource(this);
|
|
@@ -86,17 +86,17 @@ export class AnthropicVertex extends BaseAnthropic {
|
|
// auth validation is handled in prepareOptions since it needs to be async
|
|
}
|
|
|
|
- protected override async prepareOptions(options: FinalRequestOptions): Promise<void> {
|
|
- const authClient = await this._authClientPromise;
|
|
+ // protected override async prepareOptions(options: FinalRequestOptions): Promise<void> {
|
|
+ // const authClient = await this._authClientPromise;
|
|
|
|
- const authHeaders = await authClient.getRequestHeaders();
|
|
- const projectId = authClient.projectId ?? authHeaders['x-goog-user-project'];
|
|
- if (!this.projectId && projectId) {
|
|
- this.projectId = projectId;
|
|
- }
|
|
+ // const authHeaders = await authClient.getRequestHeaders();
|
|
+ // const projectId = authClient.projectId ?? authHeaders['x-goog-user-project'];
|
|
+ // if (!this.projectId && projectId) {
|
|
+ // this.projectId = projectId;
|
|
+ // }
|
|
|
|
- options.headers = buildHeaders([authHeaders, options.headers]);
|
|
- }
|
|
+ // options.headers = buildHeaders([authHeaders, options.headers]);
|
|
+ // }
|
|
|
|
override buildRequest(options: FinalRequestOptions): {
|
|
req: FinalizedRequestInit;
|