shared.js 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. const path = require('path')
  2. /** 与 fun/ai 各 execute 一致:统一走 nodejs/ai/ai.js */
  3. const aiModule = require(path.join(__dirname, '../../../../ai/ai.js'))
  4. /**
  5. * @param {string} [model] 流程传入的 model;'doubao' 走豆包分支
  6. * @param {{ openai: string, doubao: string }} actions openai 为 ai.run 名;doubao 为 doubao_ 前缀全名
  7. */
  8. function resolveModelAction (model, actions) {
  9. const mRaw = model != null ? String(model).trim() : ''
  10. const m = mRaw.toLowerCase()
  11. if (m === 'doubao') {
  12. return { action: actions.doubao, opts: {} }
  13. }
  14. const opts = {}
  15. if (mRaw) opts.model = mRaw
  16. return { action: actions.openai, opts }
  17. }
  18. function mergeRunOptions (opts, extraOpts) {
  19. const merged = { ...opts, ...(extraOpts || {}) }
  20. const out = {}
  21. for (const [k, v] of Object.entries(merged)) {
  22. if (v === undefined || v === null) continue
  23. if (k === 'model' && String(v).trim() === '') continue
  24. out[k] = v
  25. }
  26. return out
  27. }
  28. /**
  29. * @param {string} openaiAction
  30. * @param {string} doubaoAction 如 doubao_img2text
  31. * @param {unknown[]} runArgs ai.run 中位于 options 之前的参数
  32. * @param {string} [model]
  33. * @param {Record<string, unknown>} [extraOpts] 如 { timeoutMs }
  34. */
  35. async function runWithModel (openaiAction, doubaoAction, runArgs, model, extraOpts) {
  36. const { action, opts } = resolveModelAction(model, { openai: openaiAction, doubao: doubaoAction })
  37. const finalOpts = mergeRunOptions(opts, extraOpts)
  38. if (Object.keys(finalOpts).length === 0) {
  39. return aiModule.run(action, ...runArgs)
  40. }
  41. return aiModule.run(action, ...runArgs, finalOpts)
  42. }
  43. function resolveSavePath (savePath, folderPath) {
  44. if (!savePath || typeof savePath !== 'string') return null
  45. const trimmed = savePath.trim()
  46. if (path.isAbsolute(trimmed) || /^[A-Za-z]:/.test(trimmed)) return trimmed
  47. return folderPath ? path.join(folderPath, trimmed) : path.resolve(trimmed)
  48. }
  49. module.exports = {
  50. aiModule,
  51. resolveModelAction,
  52. runWithModel,
  53. resolveSavePath,
  54. }