From 6ffcd74bccb3d0bd5d6b1957a044e7b58626f781 Mon Sep 17 00:00:00 2001 From: Aayush Kapoor Date: Wed, 1 Oct 2025 16:49:42 -0400 Subject: [PATCH] add user-agent header --- src/portkey-provider.ts | 4 +++- src/utils.ts | 32 ++++++++++++++++++++++++++++++++ src/version.ts | 3 +++ tsup.config.ts | 7 +++++++ vitest.edge.config.js | 4 ++++ vitest.node.config.js | 4 ++++ 6 files changed, 53 insertions(+), 1 deletion(-) create mode 100644 src/version.ts diff --git a/src/portkey-provider.ts b/src/portkey-provider.ts index 53eeb1d..49fa680 100644 --- a/src/portkey-provider.ts +++ b/src/portkey-provider.ts @@ -10,6 +10,8 @@ import { import { FetchFunction } from "@ai-sdk/provider-utils"; import { Portkey } from "portkey-ai"; import { defaultHeadersBuilder } from "./utils"; +import { withUserAgentSuffix } from "./utils"; +import { VERSION } from "./version"; import { LanguageModelV1, ProviderV1, @@ -56,7 +58,7 @@ export function createPortkey( ): Omit { const portkeyProvider = new Portkey(options) as PortkeyProvider; - const headers = defaultHeadersBuilder(portkeyProvider); + const headers = withUserAgentSuffix(defaultHeadersBuilder(portkeyProvider), `ai-sdk-provider/${VERSION}`); const getHeaders = () => headers; const getCommonModelConfig = (modelType: string): CommonModelConfig => ({ diff --git a/src/utils.ts b/src/utils.ts index afe9594..413cac4 100644 --- a/src/utils.ts +++ b/src/utils.ts @@ -55,3 +55,35 @@ export async function fetchImageAsBase64(url: string): Promise { return btoa(binary); } } + +/** + * Removes entries from a record where the value is null or undefined. + * @param record - The input object whose entries may be null or undefined. + * @returns A new object containing only entries with non-null and non-undefined values. + */ +export function removeUndefinedEntries( + record: Record, + ): Record { + return Object.fromEntries( + Object.entries(record).filter(([, value]) => value !== null), + ) as Record + } + +export function withUserAgentSuffix( +headers: HeadersInit | Record | undefined, +...userAgentSuffixParts: string[] +): Record { +const cleanedHeaders = removeUndefinedEntries( + (headers as Record) ?? {}, +) + +const currentUserAgentHeader = cleanedHeaders['user-agent'] || '' +const newUserAgent = [currentUserAgentHeader, ...userAgentSuffixParts] + .filter(Boolean) + .join(' ') + +return { + ...cleanedHeaders, + 'user-agent': newUserAgent, +} +} diff --git a/src/version.ts b/src/version.ts new file mode 100644 index 0000000..60a088e --- /dev/null +++ b/src/version.ts @@ -0,0 +1,3 @@ +declare const __PACKAGE_VERSION__: string | undefined +export const VERSION: string = + __PACKAGE_VERSION__ === undefined ? '0.0.0-test' : __PACKAGE_VERSION__ diff --git a/tsup.config.ts b/tsup.config.ts index 3f92041..f4b8255 100644 --- a/tsup.config.ts +++ b/tsup.config.ts @@ -1,10 +1,17 @@ import { defineConfig } from 'tsup'; +import { readFileSync } from 'node:fs' +const package_ = JSON.parse( + readFileSync(new URL('package.json', import.meta.url), 'utf8'), +) export default defineConfig([ { entry: ['src/index.ts'], format: ['cjs', 'esm'], dts: true, sourcemap: true, + define: { + __PACKAGE_VERSION__: JSON.stringify(package_.version), + }, }, ]); diff --git a/vitest.edge.config.js b/vitest.edge.config.js index da59c9c..54271ac 100644 --- a/vitest.edge.config.js +++ b/vitest.edge.config.js @@ -1,4 +1,5 @@ import { defineConfig } from "vite"; +import packageJson from "./package.json"; // https://vitejs.dev/config/ export default defineConfig({ @@ -7,4 +8,7 @@ export default defineConfig({ globals: true, include: ["**/*.test.ts", "**/*.test.tsx"], }, + define: { + __PACKAGE_VERSION__: JSON.stringify(packageJson.version), + }, }); diff --git a/vitest.node.config.js b/vitest.node.config.js index 492439a..7c7768d 100644 --- a/vitest.node.config.js +++ b/vitest.node.config.js @@ -1,4 +1,5 @@ import { defineConfig } from "vite"; +import packageJson from "./package.json"; // https://vitejs.dev/config/ export default defineConfig({ @@ -7,4 +8,7 @@ export default defineConfig({ globals: true, include: ["**/*.test.ts", "**/*.test.tsx"], }, + define: { + __PACKAGE_VERSION__: JSON.stringify(packageJson.version), + }, });