agsamantha/node_modules/langsmith/dist/utils/env.js
2024-10-02 15:15:21 -05:00

212 lines
6.9 KiB
JavaScript

// Inlined from https://github.com/flexdinesh/browser-or-node
import { __version__ } from "../index.js";
let globalEnv;
export const isBrowser = () => typeof window !== "undefined" && typeof window.document !== "undefined";
export const isWebWorker = () => typeof globalThis === "object" &&
globalThis.constructor &&
globalThis.constructor.name === "DedicatedWorkerGlobalScope";
export const isJsDom = () => (typeof window !== "undefined" && window.name === "nodejs") ||
(typeof navigator !== "undefined" &&
(navigator.userAgent.includes("Node.js") ||
navigator.userAgent.includes("jsdom")));
// Supabase Edge Function provides a `Deno` global object
// without `version` property
export const isDeno = () => typeof Deno !== "undefined";
// Mark not-as-node if in Supabase Edge Function
export const isNode = () => typeof process !== "undefined" &&
typeof process.versions !== "undefined" &&
typeof process.versions.node !== "undefined" &&
!isDeno();
export const getEnv = () => {
if (globalEnv) {
return globalEnv;
}
if (isBrowser()) {
globalEnv = "browser";
}
else if (isNode()) {
globalEnv = "node";
}
else if (isWebWorker()) {
globalEnv = "webworker";
}
else if (isJsDom()) {
globalEnv = "jsdom";
}
else if (isDeno()) {
globalEnv = "deno";
}
else {
globalEnv = "other";
}
return globalEnv;
};
let runtimeEnvironment;
export async function getRuntimeEnvironment() {
if (runtimeEnvironment === undefined) {
const env = getEnv();
const releaseEnv = getShas();
runtimeEnvironment = {
library: "langsmith",
runtime: env,
sdk: "langsmith-js",
sdk_version: __version__,
...releaseEnv,
};
}
return runtimeEnvironment;
}
/**
* Retrieves the LangChain-specific environment variables from the current runtime environment.
* Sensitive keys (containing the word "key", "token", or "secret") have their values redacted for security.
*
* @returns {Record<string, string>}
* - A record of LangChain-specific environment variables.
*/
export function getLangChainEnvVars() {
const allEnvVars = getEnvironmentVariables() || {};
const envVars = {};
for (const [key, value] of Object.entries(allEnvVars)) {
if (key.startsWith("LANGCHAIN_") && typeof value === "string") {
envVars[key] = value;
}
}
for (const key in envVars) {
if ((key.toLowerCase().includes("key") ||
key.toLowerCase().includes("secret") ||
key.toLowerCase().includes("token")) &&
typeof envVars[key] === "string") {
const value = envVars[key];
envVars[key] =
value.slice(0, 2) + "*".repeat(value.length - 4) + value.slice(-2);
}
}
return envVars;
}
/**
* Retrieves the LangChain-specific metadata from the current runtime environment.
*
* @returns {Record<string, string>}
* - A record of LangChain-specific metadata environment variables.
*/
export function getLangChainEnvVarsMetadata() {
const allEnvVars = getEnvironmentVariables() || {};
const envVars = {};
const excluded = [
"LANGCHAIN_API_KEY",
"LANGCHAIN_ENDPOINT",
"LANGCHAIN_TRACING_V2",
"LANGCHAIN_PROJECT",
"LANGCHAIN_SESSION",
];
for (const [key, value] of Object.entries(allEnvVars)) {
if (key.startsWith("LANGCHAIN_") &&
typeof value === "string" &&
!excluded.includes(key) &&
!key.toLowerCase().includes("key") &&
!key.toLowerCase().includes("secret") &&
!key.toLowerCase().includes("token")) {
if (key === "LANGCHAIN_REVISION_ID") {
envVars["revision_id"] = value;
}
else {
envVars[key] = value;
}
}
}
return envVars;
}
/**
* Retrieves the environment variables from the current runtime environment.
*
* This function is designed to operate in a variety of JS environments,
* including Node.js, Deno, browsers, etc.
*
* @returns {Record<string, string> | undefined}
* - A record of environment variables if available.
* - `undefined` if the environment does not support or allows access to environment variables.
*/
export function getEnvironmentVariables() {
try {
// Check for Node.js environment
// eslint-disable-next-line no-process-env
if (typeof process !== "undefined" && process.env) {
// eslint-disable-next-line no-process-env
return Object.entries(process.env).reduce((acc, [key, value]) => {
acc[key] = String(value);
return acc;
}, {});
}
// For browsers and other environments, we may not have direct access to env variables
// Return undefined or any other fallback as required.
return undefined;
}
catch (e) {
// Catch any errors that might occur while trying to access environment variables
return undefined;
}
}
export function getEnvironmentVariable(name) {
// Certain Deno setups will throw an error if you try to access environment variables
// https://github.com/hwchase17/langchainjs/issues/1412
try {
return typeof process !== "undefined"
? // eslint-disable-next-line no-process-env
process.env?.[name]
: undefined;
}
catch (e) {
return undefined;
}
}
export function getLangSmithEnvironmentVariable(name) {
return (getEnvironmentVariable(`LANGSMITH_${name}`) ||
getEnvironmentVariable(`LANGCHAIN_${name}`));
}
export function setEnvironmentVariable(name, value) {
if (typeof process !== "undefined") {
// eslint-disable-next-line no-process-env
process.env[name] = value;
}
}
let cachedCommitSHAs;
/**
* Get the Git commit SHA from common environment variables
* used by different CI/CD platforms.
* @returns {string | undefined} The Git commit SHA or undefined if not found.
*/
export function getShas() {
if (cachedCommitSHAs !== undefined) {
return cachedCommitSHAs;
}
const common_release_envs = [
"VERCEL_GIT_COMMIT_SHA",
"NEXT_PUBLIC_VERCEL_GIT_COMMIT_SHA",
"COMMIT_REF",
"RENDER_GIT_COMMIT",
"CI_COMMIT_SHA",
"CIRCLE_SHA1",
"CF_PAGES_COMMIT_SHA",
"REACT_APP_GIT_SHA",
"SOURCE_VERSION",
"GITHUB_SHA",
"TRAVIS_COMMIT",
"GIT_COMMIT",
"BUILD_VCS_NUMBER",
"bamboo_planRepository_revision",
"Build.SourceVersion",
"BITBUCKET_COMMIT",
"DRONE_COMMIT_SHA",
"SEMAPHORE_GIT_SHA",
"BUILDKITE_COMMIT",
];
const shas = {};
for (const env of common_release_envs) {
const envVar = getEnvironmentVariable(env);
if (envVar !== undefined) {
shas[env] = envVar;
}
}
cachedCommitSHAs = shas;
return shas;
}