credentials.mjs 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940
  1. function firstNonEmpty(values) {
  2. return values.find(value => typeof value === 'string' && value.trim())?.trim() || '';
  3. }
  4. function positiveNumber(values, fallback) {
  5. const value = Number(firstNonEmpty(values.map(item => item == null ? '' : String(item))));
  6. return Number.isFinite(value) && value > 0 ? value : fallback;
  7. }
  8. export function readNewApiConfig(options = {}) {
  9. return {
  10. // API key may be injected by trusted application code/tests, but MCP tool schemas
  11. // never expose it. End users should configure one of the environment variables.
  12. apiKey: firstNonEmpty([options.apiKey, process.env.FMODE_LLM_API_KEY, process.env.LLM_API_KEY]),
  13. // Never accept a caller-controlled endpoint field from an MCP invocation. The
  14. // `trustedBaseUrl` option exists only for direct dependency injection in tests.
  15. baseUrl: firstNonEmpty([options.trustedBaseUrl, process.env.FMODE_LLM_BASE_URL, process.env.LLM_BASE_URL]),
  16. allowInsecureHttp: options.allowInsecureHttp === true || /^true$/i.test(process.env.FMODE_ALLOW_INSECURE_HTTP || ''),
  17. timeoutMs: positiveNumber([options.timeoutMs, process.env.FMODE_LLM_TIMEOUT_MS], 180000),
  18. usdToCnyRate: positiveNumber([process.env.FMODE_USD_TO_CNY_RATE], 6.8),
  19. geminiGenerationReserveUsd: positiveNumber([
  20. process.env.FMODE_GEMINI_GENERATION_RESERVE_USD,
  21. process.env.FMODE_GEMINI_GENERATION_RESERVE
  22. ], 0.10),
  23. geminiVisionReserveUsd: positiveNumber([
  24. process.env.FMODE_GEMINI_VISION_RESERVE_USD,
  25. process.env.FMODE_GEMINI_VISION_RESERVE
  26. ], 0.01),
  27. seedreamImagePriceUsd: positiveNumber([
  28. process.env.FMODE_SEEDREAM_IMAGE_PRICE_USD,
  29. process.env.FMODE_SEEDREAM_IMAGE_PRICE
  30. ], 0.03)
  31. };
  32. }
  33. export function asBearerToken(token) {
  34. const value = String(token || '').trim();
  35. if (!value) return '';
  36. return /^Bearer\s+/i.test(value) ? value : `Bearer ${value}`;
  37. }