{"_id":"@avocadoui/eli-video-interview","_rev":"3-2c129cba7d47dafaccaf500a548631d8","name":"@avocadoui/eli-video-interview","dist-tags":{"latest":"1.0.0"},"versions":{"1.0.0":{"name":"@avocadoui/eli-video-interview","version":"1.0.0","author":{"name":"鳄梨科技"},"license":"MIT","_id":"@avocadoui/eli-video-interview@1.0.0","maintainers":[{"name":"jeakin","email":"netseye@gmail.com"},{"name":"easonzen","email":"376575887@qq.com"},{"name":"lizunlong","email":"lizunlong@gmail.com"},{"name":"ww85600","email":"wy85600@163.com"}],"dist":{"shasum":"0fad4ab343a0ea2c6d4c2ff5821444b83d6075d1","tarball":"https://registry.npmjs.org/@avocadoui/eli-video-interview/-/eli-video-interview-1.0.0.tgz","fileCount":515,"integrity":"sha512-MwXgZXqTfso3kQc+C8FZSB0K1vyCufNpLRmzllpYJEqmqjPw4efoQj91yQy9VPXAnUhZjj91nHmKW8qIeG2TRQ==","signatures":[{"sig":"MEQCICDXm0Xcz27EErTapiYwKPMgJkVWCpxAp8jIbGjt/pCGAiAy7Rixcv07hvdNd8Jp9n30wLmPoK9OYjLgCXT0W9RzFg==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":779827,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjbFMFACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmpUURAAiBw4xA0HxKpgzxE/OnQHduHrO849YWiG1V3KbdR69CQ53a+A\r\nGp97v5e5wg6U42RsnxOeZVkAIaGQlovTvlZyOgFNlehYs/s5kCx1u0eCDecJ\r\nHwpx1d2GONv9A3hU4u+GsGSQgXDMHlY6h3i5+ECpNOaoanl6NV9pqzJmI+sA\r\ngOon+4g0rKX+Maeh8hNr+VhLaBId7X8KwJ57Qn8jHdBjRdNjyzZQwjabIZOp\r\nn0POfCyVj5byEx5WivCP9ec8VrjI/ktonQ7p7eU/Z3uB6ERBqR3aAILryP7b\r\nX4KL8TCoV4xaRZLBibrYvRsTN+XG9sJxQhXYWnh0AOalhs7Op9zB6hFJbBP3\r\nxU/uCL0WlNmPi2Hnj3+Lpx47IGAXpaFMu5bmPGIKdjUDb6js6+6Odwz30txT\r\n3ka/OI3/bRsGv5MOZ6h3N3Qx9JY52bswgsBz7jpLOP+bJ6L7ntQMh+fgXBUI\r\n6VRj1SVBvRQeHSbHZsMQdwUFCPFEOVNa+x6QanxlquPk82jREKr/ay7RBvoF\r\nZtyfmwBXGUcRSMizYhyFvkXsyiAituFH+Z6IPOpMVnfdXcpHyKjjbiNKTlon\r\nESL1tlZg/ESfcV9EPR5L9AaXvVzoGbwfJbZ7zQmYv+2GldPsA3fK621Q7HQd\r\nQwcaUrH9HG7Cl+8cx2HSkYbpGDS2ns9C8mY=\r\n=Zlza\r\n-----END PGP SIGNATURE-----\r\n"},"main":"lib/index.js","types":"lib/index.d.ts","module":"esm/index.js","gitHead":"be5d2221ff5dd71c14fcdf531474fdfa8d1030fd","scripts":{"dev":"vite","lib":"npm run lib:cjs && npm run lib:esm","pub":"npm run lib && npm run release && npm publish","lint":"eslint --ext .js,.ts,.tsx src/","test":"echo \"Error: no test specified\" && exit 1","build":"tsc --noEmit && vite build","clean":"rimraf lib esm build","serve":"npm run dev","lib:cjs":"node ../../scripts/lib-cjs.js","lib:esm":"node ../../scripts/lib-esm.js","release":"standard-version","lint-fix":"eslint --fix --ext .js,.ts,.tsx src/"},"_npmUser":{"name":"jeakin","email":"netseye@gmail.com"},"repository":{"url":"https://jihulab.com/elihr/elifront/open/lerna-avocado-sdk.git","type":"git"},"_npmVersion":"8.15.0","description":"鳄梨科技 AI视频面试 React SDK","directories":{},"resolutions":{"react":"17.0.2","react-dom":"17.0.2"},"sideEffects":false,"_nodeVersion":"16.17.1","dependencies":{"hox":"^2.1.0","axios":"^0.27.2","dayjs":"^1.11.4","ahooks":"^3.4.1","fbm-ui":"^1.4.104","echarts":"^5.3.3","@mui/lab":"^5.0.0-alpha.85","react-svg":"^15.1.3","use-immer":"^0.7.0","array-move":"^4.0.0","sortablejs":"^1.15.0","typescript":"^4.7.2","@mui/styles":"^5.6.0","@mui/icons-material":"^5.8.3","immutability-helper":"^3.1.1"},"_hasShrinkwrap":false,"peerDependencies":{"react":">=17.0.0","react-dom":">=17.0.0"},"_npmOperationalInternal":{"tmp":"tmp/eli-video-interview_1.0.0_1668043525143_0.8040817044494488","host":"s3://npm-registry-packages"}}},"time":{"created":"2022-11-10T01:25:25.097Z","modified":"2026-03-24T04:04:03.177Z","1.0.0":"2022-11-10T01:25:25.355Z"},"author":{"name":"鳄梨科技"},"license":"MIT","repository":{"url":"https://jihulab.com/elihr/elifront/open/lerna-avocado-sdk.git","type":"git"},"description":"鳄梨科技 AI视频面试 React SDK","maintainers":[{"email":"netseye@gmail.com","name":"jeakin"},{"email":"fzqxzhang@gmail.com","name":"fzqxzhang"}],"readme":"# 鳄梨科技-AI视频面试web端插件\n\nAI视频面试web端插件是鳄梨科技提供的【AI视频题目+AI视频报告】的服务，致力于用AI解决大规模人力资源问题，此插件需搭配【小程序插件】来使用。\n\n## :sparkles: 特性\n\n- 简单易用\n- 包含的组件有AI视频题目、AI视频报告、视频预览\n- 使用 TypeScript 构建，提供完整的类型定义文件\n\n## :package: 安装\n\n```bash\n// npm\nnpm i eli-video-interview --save\n\n// yarn\nyarn add eli-video-interview\n```\n\n## 🔨 配置\n\n```ts\nimport { avocadoVideoInterview } from 'eli-video-interview';\n\nconst App: React.FC = () => {\n  useEffect(() => {\n    avocadoVideoInterview.init({\n      server_url: '', // 接口域名地址\n      auth_callback: () => new Promise((resolve, reject) => { // 授权认证回调 return Promise\n        resolve({\n          accessToken: '', // 必须返回accessToken为接口授权认证\n          expireTime: 0, // accessToken过期时间（可以不返回）\n        });\n      }),\n    });\n  }, []);\n}\n```\n\n## AI视频题目\n\nAI视频题目组件内置了AI测评题目模版，支持9种题型【普通题、色盲检测、英文字母识别、语言能力、游戏决策-气球、数字记忆、情绪判断、全身素质检测、局部纹身检测】，也可以根据自身需求自定义自由作答题或语言能力题，可自定义引导视频。\n\n### Example\n\n```tsx\nimport { AiQuestion, useAiQuestion } from 'eli-video-interview';\n\nconst { handleSubmit, handleValues, ...aiQuestionProps } = useAiQuestion({ token });\n\nconst handleSave = async () => {\n  const { code, message, data } = await handleSubmit();\n  if (code === 0) { // code === 0: 提交成功\n    console.log({ code, message, data });\n    // 具体业务实现逻辑\n  }\n};\n\nreturn (\n  <AiQuestion {...aiQuestionProps} />\n)\n```\n\n### API\n\n| 参数 | 说明 | 类型 | 必传 | 默认值 |\n| :--- | :--- | :--- | :--- | :--- |\n| token | - | string | 是 | - |\n| name | 职位名称 | string | 否 | - |\n| historyPatterns | 已有岗位模型，当数据为空时会禁用已有岗位模型切换 | Array&lt;any&gt; | 否 | [] |\n| mediaList | 引导视频 | Array&lt;[MediaList](#medialist)&gt; | 否 | [] |\n\n### AiQuestionInstance\n\n| 名称 | 说明 | 类型 |\n| :--- | :--- | :--- |\n| handleValues | 获取AI视频题目所以字段值 | () => [AiQuestionValues](#aiquestionvalues) |\n| handleSubmit | 提交AI视频题目 | () => Promise&lt;[AiQuestionSubmitRes](#aiquestionsubmitres)&gt; |\n\n#### MediaList\n\n| 参数 | 说明 | 类型 |\n| :--- | :--- | :--- |\n| url | 视频地址 | string |\n| thumbUrl | 视频图片 | string |\n\n#### AiQuestionValues\n\n| 名称 | 说明 | 类型 |\n| :--- | :--- | :--- |\n| data | 题目信息 | { name?: string; token?: string; steps: [QuestionModelStep](#questionmodelstep)[] \\| undefined; } |\n| media | 引导视频 | { mediaUrl?: string; thumbUrl?: string; } |\n\n#### AiQuestionSubmitRes\n\n| 名称 | 说明 | 类型 |\n| :--- | :--- | :--- |\n| [code](#业务状态码) | 业务状态码 | number |\n| data | 主体信息 | { token: string; mediaUrl: string; thumbUrl: string; } \\| undefined |\n| message | 提示信息 | string |\n\n#### QuestionModelStep\n\n| 名称 | 说明 | 类型 |\n| :--- | :--- | :--- |\n| name | 题目名称 | string |\n| token | 题目ID | string |\n| type | 题目类型 | number |\n| desc | 题目描述 | string |\n| prepareTime | 准备时长 | number |\n| duration | 回答时长 | number |\n| category | 标签信息 | string[] |\n| [broadcastType](#题目播报类型) | 题目播报类型 | number |\n| [aiSwitch](#题目是否开启ai分析) | 题目是否开启AI分析 | number |\n| aiType | 是否可AI评分，值为2视为是可AI评分题目 | number |\n| weight | 题目权重 | number \\| string |\n| [language](#AI分析语种) | 语种 | number |\n| [aiShowType](#题目作答类型) | 题目作答类型 | number |\n| [answerStatus](#题目重复作答状态) | 题目重复作答状态 | number |\n| videoBroadcast | 题目播报类型为视频播报时存储的参数 | [VideoBroadcast](#videobroadcast) |\n| aiAbilities | 题目AI分析参数集合 | [AiAbilityParams](#aiabilityparams)[] |\n\n\n#### VideoBroadcast\n\n| 名称 | 说明 | 类型 |\n| :--- | :--- | :--- |\n| [videoRetry](#允许重复听题) | 允许重复听题 | number |\n| videoUrl | 视频地址 | string |\n\n#### AiAbilityParams\n\n| 名称 | 说明 | 类型 |\n| :--- | :--- | :--- |\n| name | AI维度名称 | string |\n| token | AI维度ID | string |\n| [type](#ai维度类型) | AI维度类型 | number |\n| [category](#ai维度分类) | AI维度分类 | number |\n| desc | AI维度描述 | string |\n| weight | AI维度权重 | number \\| string |\n| relatedAbilities | 语种所关联的AI维度类型集合 | number[] |\n| extra | AI维度【是否意愿、要点分析】字段值 | string |\n| sort | AI维度排序 | number |\n\n## AI视频报告\n\nAI视频报告组件可根据面试者的答题情况，计算出视频面试得分及单题目的综合评分，您也可以手动调节单题的评分分值，手动调节后会重新计算视频面试得分。\n\n### Example\n\n```tsx\nimport React, { FC, useState, useCallback } from 'react';\nimport { Box } from 'fbm-ui';\nimport { AiReport, VideoPreview, useAiReport } from 'eli-video-interview';\n\nconst Report: FC = () => {\n  const token = ''; // 具体业务token\n  const [steps, setSteps] = useState<any[]>([]); // 题目信息\n  const [faceAnalysis, setFaceAnalysis] = useState<any>({}); // 人脸识别信息\n  const [pageStepIndexes, setPageStepIndexes] = useState<number[]>([]); // 具有视频信息的下标集合\n  const [stepIndex, setStepIndex] = useState<number>(0); // 当前题目下标\n\n  const aiReport = useAiReport({\n    token,\n    disabledScore: false,\n    scoreRankIntervals: [],\n    stepToken: steps[pageStepIndexes[stepIndex]]?.token,\n    operableButtons: ['export', 'refresh', 'scoreRank', 'abilities'],\n    onLoad: params => {\n      setSteps(params.steps);\n      setFaceAnalysis(params.faceAnalysis);\n      setPageStepIndexes(params.pageStepIndexes);\n    },\n    onScoreChange: scoreState => {\n      console.log(scoreState);\n    },\n    onStepChange: stepToken => {\n      const index = steps.findIndex(({ token }) => token === stepToken);\n      const stepIndex = pageStepIndexes.findIndex(i => i === index);\n      setStepIndex(stepIndex);\n    },\n    onScoreRankIntervalsChange: scoreRankIntervals => {\n      console.log(scoreRankIntervals);\n    },\n  });\n\n  const handlePrev = useCallback(() => {\n    setStepIndex(stepIndex - 1);\n  }, [stepIndex]);\n\n  const handleNext = useCallback(() => {\n    setStepIndex(stepIndex + 1);\n  }, [stepIndex]);\n\n  return (\n    <Box sx={{ width: '100%', height: '100%', overflow: 'hidden' }}>\n      <Box sx={{ position: 'absolute', left: 100 }}>\n        {steps.length > 0 && pageStepIndexes.length > 0 && (\n          <VideoPreview\n            url={steps[stepIndex].answer.videoUrl}\n            faceAnalysis={faceAnalysis}\n            currentPage={pageStepIndexes[stepIndex] + 1}\n            totalPage={steps.length}\n            disabledPrev={stepIndex === 0}\n            disabledNext={stepIndex === pageStepIndexes.length - 1}\n            onNext={handleNext}\n            onPrev={handlePrev}\n          />\n        )}\n      </Box>\n      <Box sx={{ width: '584px', height: '100%', margin: '0 auto' }}>\n        <AiReport {...aiReport} />\n      </Box>\n    </Box>\n  );\n};\n\nexport default Report;\n```\n\n### API\n\n| 参数 | 说明 | 类型 | 必传 | 默认值 |\n| :--- | :--- | :--- | :--- | :--- |\n| token | 订单ID | string | 是 | - |\n| scoreRankIntervals | 排名区间 | [ScoreRankInterval](#scorerankinterval)[] | 否 | - |\n| disabledScore | 禁用调整分值 | boolean | 否 | true |\n| reminderSent | 是否已提醒面试者作答 | boolean | 否 | - |\n| operableButtons | 可操作按钮组 | Array<'export' \\| 'refresh' \\| 'scoreRank' \\| 'abilities' \\| 'sendReminder'> | 否 | - |\n| stepToken | 当前选中视频题目token | string | 否 | - |\n| onLoad | 报告数据获取成功后回调事件 | (values: [AiReportLoadedValues](#aireportloadedvalues)) => void | 否 | - |\n| onExportReportClick | 点击导出报告后回调事件 | () => void | 否 | - |\n| onScoreChange | 分值更新时触发回调事件 | (scoreState?: [ScoreManualUpdateState](#scoremanualupdatestate)) => void | 否 | - |\n| onStepChange | 选中视频题更新时触发回调事件 | (stepToken: string) => void | 否 | - |\n| onSendReminderClick | 点击发送提醒后回调事件 | () => void | 否 | - |\n| onScoreRankIntervalsChange | 排名区间更新时触发回调事件 | (scoreRankIntervals?: [ScoreRankIntervals](#scorerankintervals)[]) => void | 否 | - |\n| onScoreRankIntervalsSubmit | 排名区间提交成功后触发回调事件 | (scoreRankIntervals?: [ScoreRankIntervals](#scorerankintervals)[]) => Promise&lt;any&gt; | 否 | - |\n\n### AiReportInstance\n\n| 名称 | 说明 | 类型 |\n| :--- | :--- | :--- |\n| handleRefresh | 刷新报告数据 | () => void |\n\n#### AiReportLoadedValues\n\n| 名称 | 说明 | 类型 |\n| :--- | :--- | :--- |\n| faceUrl | 人脸照片 | string |\n| faceAnalysis | 人脸分析（颜值得分、年龄） | [FaceAnalysis](#faceanalysis) |\n| steps | 题目信息 | any[] |\n| pageStepIndexes | 具有视频信息的下标集合 | number[] |\n\n#### FaceAnalysis\n\n| 名称 | 说明 | 类型 |\n| :--- | :--- | :--- |\n| age | 年龄 | number |\n| beauty | 颜值得分 | number |\n\n#### ScoreRankInterval\n\n| 名称 | 说明 | 类型 |\n| :--- | :--- | :--- |\n| rank | - | number |\n| scoreRankIntervals | 排名区间 | [ScoreRankIntervals](#scorerankintervals) |\n| score | 排名分数 | [Score](#score) |\n\n#### ScoreRankIntervals\n\n| 名称 | 说明 | 类型 |\n| :--- | :--- | :--- |\n| startRankProportion | 开始区间比例 | number |\n| endRankProportion | 结束区间比例 | number |\n\n#### Score\n\n| 名称 | 说明 | 类型 |\n| :--- | :--- | :--- |\n| startScore | 开始区间分数 | number |\n| endScore | 结束区间分数 | number |\n\n#### ScoreManualUpdateState\n\n| 名称 | 说明 | 类型 |\n| :--- | :--- | :--- |\n| flowStepToken | 当前分值的token | string |\n| type | 分值类型（1: 总分；2: ai纬度） | 1 \\| 2 |\n| aiAbilityChangeType | 纬度类型，type=2时存在 | number |\n| score | 分值 | number |\n\n## AI视频预览\n\nAI视频预览组件可配合AI视频报告组件使用，展示单题答题者的视频情况。\n\n### Example\n\n```tsx\nimport { VideoPreview } from 'eli-video-interview';\n\n// 具体示例请在AI视频报告查看\n```\n\n### API\n\n| 参数 | 说明 | 类型 | 必传 | 默认值 |\n| :--- | :--- | :--- | :--- | :--- |\n| url | 预览视频链接 | string | 是 | - |\n| faceAnalysis | 人脸分析（颜值得分、年龄） | [FaceAnalysis](#faceanalysis) | 否 | - |\n| isShowPageTurning | 是否显示分页 | boolean | 否 | true |\n| currentPage | 当前页数 | number | 否 | 1 |\n| totalPage | 总页数 | number | 否 | 1 |\n| disabledPrev | 禁用上一页按钮 | boolean | 否 | false |\n| disabledNext | 禁用下一页按钮 | boolean | 否 | false |\n| width | 组件宽度 | number \\| string | 否 | - |\n| style | 自定义样式 | CSSProperties | 否 | - |\n| onPrev | 点击上一页后回调事件 | () => void | 否 | - |\n| onNext | 点击下一页后回调事件 | () => void | 否 | - |\n\n## 全局类型常量\n\n### 题目作答类型\n\n```json\n1: 自由作答\n2: 跟读\n```\n\n### 题目播报类型\n\n```json\n1: 语音播报\n2: 视频播报\n```\n\n### 题目是否开启AI分析\n\n```json\n1: 开启\n2: 关闭\n```\n\n### 题目重复作答状态\n\n```json\n1: 允许重复作答\n2: 不允许重复作答\n```\n\n### AI分析语种\n\n```json\n2: 普通话\n11: 英文\n12: 日语\n16: 粤语\n```\n\n### AI维度类型\n\n```json\n1: 形象打分\n3: 语意流畅\n4: 保持微笑\n5: 语言丰富\n6: 要点分析\n7: 语速\n8: 是否意愿\n9: 年龄\n10: 颜值\n```\n\n### AI维度分类\n\n```json\n1: 语种\n2: 语意\n3: 表达\n4: 形象\n6: 语言能力\n```\n\n### 允许重复听题\n\n```json\n0: 不允许\n1: 允许\n```\n\n## HTTP状态码\n\nAPI采用标准HTTP错误码来表示接口的错误:\n\n| 状态码 | 含义 |\n| :--- | :--- |\n| 200 | OK -- 请求成功 |\n| 400 | Bad Request -- 接口请求参数错误. |\n| 401 | Unauthorized -- 认证信息非法. |\n| 403 | Forbidden -- 所访问的资源拒绝访问. |\n| 404 | Not Found -- 访问的资源不存在. |\n| 405 | Method Not Allowed -- 错误的请求Method. |\n| 500 | Internal Server Error -- 服务器内部错误. |\n| 503 | Service Unavailable -- 服务器暂时不可用. |\n\n## 业务状态码\n\n| 状态码 | 含义 |\n| :--- | :--- |\n| 0 | OK -- 请求成功 |\n| 其他code | ERROR -- 请求失败 |","readmeFilename":"README.md"}