diff --git a/src/costrict/provider/fetch.ts b/src/costrict/provider/fetch.ts index 14dbefc92..c974749e5 100644 --- a/src/costrict/provider/fetch.ts +++ b/src/costrict/provider/fetch.ts @@ -89,6 +89,7 @@ export function createCoStrictFetch(): CoStrictFetch { // ========== 步骤 3: 构建 headers ========== const headers = new Headers(init?.headers) headers.set('Authorization', `Bearer ${creds.access_token}`) + headers.set('User-Agent', `csc/${VERSION}`) headers.set('HTTP-Referer', 'https://github.com/zgsm-ai/costrict-cli') headers.set('X-Title', 'CoStrict-CLI') headers.set('X-Costrict-Version', `costrict-cli-${VERSION}`) diff --git a/src/costrict/provider/index.ts b/src/costrict/provider/index.ts index 1dcede320..0db3ebe0a 100644 --- a/src/costrict/provider/index.ts +++ b/src/costrict/provider/index.ts @@ -16,6 +16,7 @@ import type { Tools } from '../../Tool.js' import type { Options } from '../../services/api/claude.js' import OpenAI from 'openai' import { getProxyFetchOptions } from '../../utils/proxy.js' +import { getUserAgent } from '../../utils/http.js' import { anthropicMessagesToOpenAI, anthropicToolsToOpenAI, anthropicToolChoiceToOpenAI, adaptOpenAIStreamToAnthropic } from '@ant/model-provider' import { normalizeMessagesForAPI } from '../../utils/messages.js' import { toolToAPISchema } from '../../utils/api.js' @@ -103,6 +104,7 @@ export async function* queryModelCoStrict( forAnthropicAPI: false, }) as any, fetch: costrictFetch as any, + defaultHeaders: { 'User-Agent': getUserAgent() }, }) logForDebugging( diff --git a/src/services/api/grok/client.ts b/src/services/api/grok/client.ts index 060d12636..232583574 100644 --- a/src/services/api/grok/client.ts +++ b/src/services/api/grok/client.ts @@ -1,5 +1,6 @@ import OpenAI from 'openai' import { getProxyFetchOptions } from 'src/utils/proxy.js' +import { getUserAgent } from 'src/utils/http.js' /** * Environment variables: @@ -30,6 +31,7 @@ export function getGrokClient(options?: { dangerouslyAllowBrowser: true, fetchOptions: getProxyFetchOptions({ forAnthropicAPI: false }), ...(options?.fetchOverride && { fetch: options.fetchOverride }), + defaultHeaders: { 'User-Agent': getUserAgent() }, }) if (!options?.fetchOverride) { diff --git a/src/services/api/openai/client.ts b/src/services/api/openai/client.ts index f7c4b27e8..d34ca7a42 100644 --- a/src/services/api/openai/client.ts +++ b/src/services/api/openai/client.ts @@ -3,6 +3,7 @@ import { openaiAdapter } from 'src/services/providerUsage/adapters/openai.js' import { updateProviderBuckets } from 'src/services/providerUsage/store.js' import { getProxyFetchOptions } from 'src/utils/proxy.js' import { isEnvTruthy } from 'src/utils/envUtils.js' +import { getUserAgent } from 'src/utils/http.js' /** * Environment variables: @@ -60,6 +61,7 @@ export function getOpenAIClient(options?: { ...(process.env.OPENAI_PROJECT_ID && { project: process.env.OPENAI_PROJECT_ID }), fetchOptions: getProxyFetchOptions({ forAnthropicAPI: false }), fetch: wrappedFetch, + defaultHeaders: { 'User-Agent': getUserAgent() }, }) if (!options?.fetchOverride) { diff --git a/src/utils/http.ts b/src/utils/http.ts index 93b87e8e0..45d8cce87 100644 --- a/src/utils/http.ts +++ b/src/utils/http.ts @@ -31,7 +31,7 @@ export function getUserAgent(): string { // so the read picks up the same setWorkload() value as getAttributionHeader. const workload = getWorkload() const workloadSuffix = workload ? `, workload/${workload}` : '' - return `claude-cli/${MACRO.VERSION} (${process.env.USER_TYPE}, ${process.env.CLAUDE_CODE_ENTRYPOINT ?? 'cli'}${agentSdkVersion}${clientApp}${workloadSuffix})` + return `csc/${MACRO.VERSION}` } export function getMCPUserAgent(): string { @@ -46,7 +46,7 @@ export function getMCPUserAgent(): string { parts.push(`client-app/${process.env.CLAUDE_AGENT_SDK_CLIENT_APP}`) } const suffix = parts.length > 0 ? ` (${parts.join(', ')})` : '' - return `claude-code/${MACRO.VERSION}${suffix}` + return `csc/${MACRO.VERSION}${suffix}` } // User-Agent for WebFetch requests to arbitrary sites. `Claude-User` is diff --git a/src/utils/sideQuery.ts b/src/utils/sideQuery.ts index ab1ba9715..9e99c63fa 100644 --- a/src/utils/sideQuery.ts +++ b/src/utils/sideQuery.ts @@ -32,6 +32,7 @@ import { resolveCoStrictModel } from '../costrict/provider/modelMapping.js' import { getCoStrictBaseURL } from '../costrict/provider/auth.js' import { loadCoStrictCredentials } from '../costrict/provider/credentials.js' import { getProxyFetchOptions } from './proxy.js' +import { getUserAgent } from './http.js' import { getMainLoopModel } from './model/model.js' import OpenAI from 'openai' @@ -145,6 +146,7 @@ export async function sideQuery(opts: SideQueryOptions): Promise { dangerouslyAllowBrowser: true, fetchOptions: getProxyFetchOptions({ forAnthropicAPI: false }) as Record, fetch: createCoStrictFetch() as unknown as typeof fetch, + defaultHeaders: { 'User-Agent': getUserAgent() }, }) return sideQueryOpenAICompat(opts, client, resolveCoStrictModel(getMainLoopModel()), 'CoStrict') }