@hongymagic/q 0.3.1 → 0.3.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (3) hide show
  1. package/README.md +1 -1
  2. package/dist/q.js +58 -11
  3. package/package.json +1 -1
package/README.md CHANGED
@@ -105,7 +105,7 @@ provider_api_key_env = "PROVIDER_API_KEY"
105
105
  | `provider_slug` | Provider identifier (maps to `x-portkey-provider` header) |
106
106
  | `api_key_env` | Environment variable for Portkey API key (maps to `x-portkey-api-key` header) |
107
107
  | `provider_api_key_env` | Environment variable for underlying provider's API key (maps to `Authorization` header) |
108
- | `headers` | Additional custom headers (supports `${VAR}` interpolation) |
108
+ | `headers` | Additional custom headers (supports env var interpolation for allowlisted vars) |
109
109
 
110
110
  **Environment variables:**
111
111
 
package/dist/q.js CHANGED
@@ -27262,14 +27262,37 @@ ${formatZodErrors(result.error)}`);
27262
27262
  return result;
27263
27263
  }
27264
27264
  static interpolate(value) {
27265
- return value.replace(/\$\{([^}]+)\}/g, (_, varName) => {
27266
- const envValue = process.env[varName];
27267
- if (envValue === undefined) {
27268
- throw new ConfigValidationError(`Environment variable '${varName}' referenced in config but not set`);
27269
- }
27270
- return envValue;
27271
- });
27272
- }
27265
+ return interpolateValue(value);
27266
+ }
27267
+ }
27268
+ var ALLOWED_INTERPOLATION_VARS = new Set([
27269
+ "ANTHROPIC_API_KEY",
27270
+ "OPENAI_API_KEY",
27271
+ "PORTKEY_API_KEY",
27272
+ "ANTHROPIC_BASE_URL",
27273
+ "OPENAI_BASE_URL",
27274
+ "PORTKEY_BASE_URL",
27275
+ "PORTKEY_PROVIDER",
27276
+ "HTTP_PROXY",
27277
+ "HTTPS_PROXY",
27278
+ "NO_PROXY",
27279
+ "HOME",
27280
+ "USER",
27281
+ "HOSTNAME"
27282
+ ]);
27283
+ function interpolateValue(value) {
27284
+ return value.replace(/\$\{([^}]+)\}/g, (_, varName) => {
27285
+ if (!ALLOWED_INTERPOLATION_VARS.has(varName)) {
27286
+ const allowedList = Array.from(ALLOWED_INTERPOLATION_VARS).join(", ");
27287
+ throw new ConfigValidationError(`Environment variable '${varName}' is not allowed for interpolation.
27288
+ ` + `Allowed variables: ${allowedList}`);
27289
+ }
27290
+ const envValue = process.env[varName];
27291
+ if (envValue === undefined) {
27292
+ throw new ConfigValidationError(`Environment variable '${varName}' referenced in config but not set`);
27293
+ }
27294
+ return envValue;
27295
+ });
27273
27296
  }
27274
27297
  async function loadConfig() {
27275
27298
  return Config.load();
@@ -27314,7 +27337,7 @@ api_key_env = "OPENAI_API_KEY"
27314
27337
  # provider_slug = "@your-org/bedrock-provider"
27315
27338
  # api_key_env = "PORTKEY_API_KEY"
27316
27339
  # provider_api_key_env = "PROVIDER_API_KEY"
27317
- # headers = { "x-custom" = "\${CUSTOM_VALUE}" }
27340
+ # headers = { "x-portkey-trace-id" = "\${HOSTNAME}" } # Only allowlisted env vars
27318
27341
 
27319
27342
  # Example: Ollama (local models)
27320
27343
  # [providers.ollama]
@@ -27424,6 +27447,12 @@ class QError2 extends Error {
27424
27447
  this.name = "QError";
27425
27448
  }
27426
27449
  }
27450
+ class UsageError2 extends QError2 {
27451
+ constructor(message) {
27452
+ super(message, 2);
27453
+ this.name = "UsageError";
27454
+ }
27455
+ }
27427
27456
  function logError2(message) {
27428
27457
  console.error(message);
27429
27458
  }
@@ -46196,6 +46225,20 @@ function createPortkeyProvider(config2, providerName, debug = false) {
46196
46225
  }
46197
46226
 
46198
46227
  // src/providers/index.ts
46228
+ var SENSITIVE_FIELD_PATTERNS = [
46229
+ "key",
46230
+ "secret",
46231
+ "token",
46232
+ "password",
46233
+ "auth",
46234
+ "credential"
46235
+ ];
46236
+ function filterSensitiveFields(config2) {
46237
+ return Object.fromEntries(Object.entries(config2).filter(([key]) => {
46238
+ const lowerKey = key.toLowerCase();
46239
+ return !SENSITIVE_FIELD_PATTERNS.some((pattern) => lowerKey.includes(pattern));
46240
+ }));
46241
+ }
46199
46242
  function resolveProvider(config2, providerOverride, modelOverride, debug = false) {
46200
46243
  const providerName = providerOverride ?? config2.default.provider;
46201
46244
  const providerConfig = config2.providers[providerName];
@@ -46203,7 +46246,7 @@ function resolveProvider(config2, providerOverride, modelOverride, debug = false
46203
46246
  throw new ProviderNotFoundError(providerName);
46204
46247
  }
46205
46248
  const modelId = modelOverride ?? config2.default.model;
46206
- logDebug(`Provider config: ${JSON.stringify(providerConfig, null, 2)}`, debug);
46249
+ logDebug(`Provider config: ${JSON.stringify(filterSensitiveFields(providerConfig), null, 2)}`, debug);
46207
46250
  const model = createModel(providerConfig, providerName, modelId, debug);
46208
46251
  return {
46209
46252
  model,
@@ -54509,11 +54552,15 @@ async function main() {
54509
54552
  console.log(listProviders(config3));
54510
54553
  process.exit(0);
54511
54554
  }
54555
+ const query = args.query.join(" ");
54556
+ const MAX_QUERY_LENGTH = 5000;
54557
+ if (query.length > MAX_QUERY_LENGTH) {
54558
+ throw new UsageError2(`Query too long (${query.length} characters). Maximum is ${MAX_QUERY_LENGTH}.`);
54559
+ }
54512
54560
  logDebug2("Loading config...", debug);
54513
54561
  const config2 = await loadConfig();
54514
54562
  logDebug2(`Resolving provider: ${args.options.provider ?? config2.default.provider}`, debug);
54515
54563
  const { model, providerName, modelId } = resolveProvider(config2, args.options.provider, args.options.model, debug);
54516
- const query = args.query.join(" ");
54517
54564
  const envInfo = getEnvironmentInfo();
54518
54565
  logDebug2(`Query: ${query}`, debug);
54519
54566
  logDebug2(`Provider: ${providerName}, Model: ${modelId}`, debug);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@hongymagic/q",
3
- "version": "0.3.1",
3
+ "version": "0.3.2",
4
4
  "description": "Quick AI answers from the command line",
5
5
  "main": "dist/q.js",
6
6
  "type": "module",