index.ts 2.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. import { escape } from 'lodash-es'
  2. export const sleep = (ms: number) => {
  3. return new Promise(resolve => setTimeout(resolve, ms))
  4. }
  5. export async function asyncRunSafe<T = any>(fn: Promise<T>): Promise<[Error] | [null, T]> {
  6. try {
  7. return [null, await fn]
  8. }
  9. catch (e: any) {
  10. return [e || new Error('unknown error')]
  11. }
  12. }
  13. export const getTextWidthWithCanvas = (text: string, font?: string) => {
  14. const canvas = document.createElement('canvas')
  15. const ctx = canvas.getContext('2d')
  16. if (ctx) {
  17. ctx.font = font ?? '12px Inter, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"'
  18. return Number(ctx.measureText(text).width.toFixed(2))
  19. }
  20. return 0
  21. }
  22. const chars = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ-_'
  23. export function randomString(length: number) {
  24. let result = ''
  25. for (let i = length; i > 0; --i) result += chars[Math.floor(Math.random() * chars.length)]
  26. return result
  27. }
  28. export const getPurifyHref = (href: string) => {
  29. if (!href)
  30. return ''
  31. return escape(href)
  32. }
  33. export async function fetchWithRetry<T = any>(fn: Promise<T>, retries = 3): Promise<[Error] | [null, T]> {
  34. const [error, res] = await asyncRunSafe(fn)
  35. if (error) {
  36. if (retries > 0) {
  37. const res = await fetchWithRetry(fn, retries - 1)
  38. return res
  39. }
  40. else {
  41. if (error instanceof Error)
  42. return [error]
  43. return [new Error('unknown error')]
  44. }
  45. }
  46. else {
  47. return [null, res]
  48. }
  49. }
  50. export const correctModelProvider = (provider: string) => {
  51. if (!provider)
  52. return ''
  53. if (provider.includes('/'))
  54. return provider
  55. if (['google'].includes(provider))
  56. return 'langgenius/gemini/google'
  57. return `langgenius/${provider}/${provider}`
  58. }
  59. export const correctToolProvider = (provider: string, toolInCollectionList?: boolean) => {
  60. if (!provider)
  61. return ''
  62. if (toolInCollectionList)
  63. return provider
  64. if (provider.includes('/'))
  65. return provider
  66. if (['stepfun', 'jina', 'siliconflow', 'gitee_ai'].includes(provider))
  67. return `langgenius/${provider}_tool/${provider}`
  68. return `langgenius/${provider}/${provider}`
  69. }
  70. export const canFindTool = (providerId: string, oldToolId?: string) => {
  71. return providerId === oldToolId
  72. || providerId === `langgenius/${oldToolId}/${oldToolId}`
  73. || providerId === `langgenius/${oldToolId}_tool/${oldToolId}`
  74. }