/**
 * Copyright 2025 Beijing Volcano Engine Technology Co., Ltd. All Rights Reserved.
 * SPDX-license-identifier: BSD-3-Clause
 */

import 通用女声 from '@/assets/img/tongyongnvsheng.jpeg';
import 通用男声 from '@/assets/img/tongyongnansheng.jpeg';
import INTELLIGENT_ASSISTANT from '@/assets/img/INTELLIGENT_ASSISTANT.png';
import VIRTUAL_GIRL_FRIEND from '@/assets/img/VIRTUAL_GIRL_FRIEND.png';
import TRANSLATE from '@/assets/img/TRANSLATE.png';
import CHILDREN_ENCYCLOPEDIA from '@/assets/img/CHILDREN_ENCYCLOPEDIA.png';
import TEACHING_ASSISTANT from '@/assets/img/TEACHING_ASSISTANT.png';
import CUSTOMER_SERVICE from '@/assets/img/CUSTOMER_SERVICE.png';
import SCREEN_READER from '@/assets/img/SCREEN_READER.png';

export enum ModelSourceType {
  Custom = 'Custom',
  Available = 'Available',
}

export enum CustomParamsType {
  TTS = 'TTS',
  ASR = 'ASR',
  LLM = 'LLM',
}

/**
 * @brief AI 音色可选值
 * @default 通用女声
 * @notes 通用女声、通用男声为默认音色, 其它皆为付费音色。
 *        音色 ID 可于 https://console.volcengine.com/speech/service/8?s=g 中开通获取。
 *        对应 "音色详情" 中, "Voice_type" 列的值。
 */
export enum VOICE_TYPE {
  '通用女声' = 'BV001_streaming',
  '通用男声' = 'BV002_streaming',
}

export const VOICE_INFO_MAP = {
  [VOICE_TYPE['通用女声']]: {
    description: '女声 青年 语音合成 通用场景',
    url: '',
    icon: 通用女声,
  },
  [VOICE_TYPE['通用男声']]: {
    description: '男声 青年 语音合成 通用场景',
    url: '',
    icon: 通用男声,
  },
};

/**
 * @brief TTS 的 Cluster
 */
export enum TTS_CLUSTER {
  TTS = 'volcano_tts',
  MEGA = 'volcano_mega',
  ICL = 'volcano_icl',
}

/**
 * @brief TTS 的 Cluster Mapping
 */
export const TTS_CLUSTER_MAP = {
  ...(Object.keys(VOICE_TYPE).reduce(
    (map, type) => ({
      ...map,
      [type]: TTS_CLUSTER.TTS,
    }),
    {}
  ) as Record<VOICE_TYPE, TTS_CLUSTER>),
};

/**
 * @brief 模型可选值
 * @default SKYLARK_LITE_PUBLIC
 */
export enum AI_MODEL {
  DOUBAO_LITE_4K = 'Doubao-lite-4k',
  DOUBAO_PRO_4K = 'Doubao-pro-4k',
  DOUBAO_PRO_32K = 'Doubao-pro-32k',
  DOUBAO_PRO_128K = 'Doubao-pro-128k',
  VISION = 'Vision',
  // VISION2 = 'ArkVLM',
}

/**
 * @brief 模型来源
 */
export enum AI_MODEL_MODE {
  CUSTOM = 'CustomLLM',
  ARK_V3 = 'ArkV3',
}

/**
 * @brief 各模型对应的模式
 */
export const AI_MODE_MAP: Partial<Record<AI_MODEL, AI_MODEL_MODE>> = {
  [AI_MODEL.DOUBAO_LITE_4K]: AI_MODEL_MODE.ARK_V3,
  [AI_MODEL.DOUBAO_PRO_4K]: AI_MODEL_MODE.ARK_V3,
  [AI_MODEL.DOUBAO_PRO_32K]: AI_MODEL_MODE.ARK_V3,
  [AI_MODEL.DOUBAO_PRO_128K]: AI_MODEL_MODE.ARK_V3,
  [AI_MODEL.VISION]: AI_MODEL_MODE.ARK_V3,
};

/**
 * @brief 豆包模型的 ID
 * @note 具体的模型 ID 请至 https://console.volcengine.com/ark/region:ark+cn-beijing/endpoint?config=%7B%7D&s=g 参看/创建
 *       模型 ID 即接入点 ID, 在上述链接中表格内 "接入点名称" 列中, 类似于 "ep-2024xxxxxx-xxx" 格式即是模型 ID。
 */
export const ARK_V3_MODEL_ID: Partial<Record<AI_MODEL, string>> = {
  [AI_MODEL.DOUBAO_LITE_4K]: '**************   此处填充方舟上的模型 ID *************',
  [AI_MODEL.DOUBAO_PRO_4K]: '**************   此处填充方舟上的模型 ID *************',
  [AI_MODEL.DOUBAO_PRO_32K]: '**************   此处填充方舟上的模型 ID *************',
  [AI_MODEL.DOUBAO_PRO_128K]: '**************   此处填充方舟上的模型 ID *************',
  [AI_MODEL.VISION]: '**************   此处填充方舟上的模型 ID *************',
  // ... 可根据所开通的模型进行扩充
};

/**
 * @brief 豆包智能体 BotID
 */
export const LLM_BOT_ID: Partial<Record<AI_MODEL, string>> = {
  // ... 可根据所开通的模型进行扩充
};

export enum SCENE {
  INTELLIGENT_ASSISTANT = 'INTELLIGENT_ASSISTANT',
  VIRTUAL_GIRL_FRIEND = 'VIRTUAL_GIRL_FRIEND',
  TRANSLATE = 'TRANSLATE',
  CUSTOMER_SERVICE = 'CUSTOMER_SERVICE',
  CHILDREN_ENCYCLOPEDIA = 'CHILDREN_ENCYCLOPEDIA',
  TEACHING_ASSISTANT = 'TEACHING_ASSISTANT',
  SCREEN_READER = 'SCREEN_READER',
  CUSTOM = 'CUSTOM',
}

export const ScreenShareScene = [SCENE.SCREEN_READER];

export const Icon = {
  [SCENE.INTELLIGENT_ASSISTANT]: INTELLIGENT_ASSISTANT,
  [SCENE.VIRTUAL_GIRL_FRIEND]: VIRTUAL_GIRL_FRIEND,
  [SCENE.TRANSLATE]: TRANSLATE,
  [SCENE.CHILDREN_ENCYCLOPEDIA]: CHILDREN_ENCYCLOPEDIA,
  [SCENE.CUSTOMER_SERVICE]: CUSTOMER_SERVICE,
  [SCENE.TEACHING_ASSISTANT]: TEACHING_ASSISTANT,
  [SCENE.SCREEN_READER]: SCREEN_READER,
  [SCENE.CUSTOM]: INTELLIGENT_ASSISTANT,
};

export const Name = {
  [SCENE.INTELLIGENT_ASSISTANT]: '智能助手',
  [SCENE.VIRTUAL_GIRL_FRIEND]: '虚拟女友',
  [SCENE.TRANSLATE]: '同声传译',
  [SCENE.CHILDREN_ENCYCLOPEDIA]: '儿童百科',
  [SCENE.CUSTOMER_SERVICE]: '售后客服',
  [SCENE.TEACHING_ASSISTANT]: '课后助教',
  [SCENE.SCREEN_READER]: '读屏助手',
  [SCENE.CUSTOM]: '自定义',
};

/**
 * @brief 智能体启动后的欢迎词。
 */
export const Welcome = {
  [SCENE.INTELLIGENT_ASSISTANT]: '你好，我是你的AI小助手，有什么可以帮你的吗？',
  [SCENE.VIRTUAL_GIRL_FRIEND]: '你来啦，我好想你呀～今天有没有想我呢？',
  [SCENE.TRANSLATE]: '你好，我是你的私人翻译官。',
  [SCENE.CHILDREN_ENCYCLOPEDIA]: '你好小朋友，你的小脑袋里又有什么问题啦？',
  [SCENE.CUSTOMER_SERVICE]: '感谢您在我们餐厅用餐，请问您有什么问题需要反馈吗？',
  [SCENE.TEACHING_ASSISTANT]: '你碰到什么问题啦？让我来帮帮你。',
  [SCENE.SCREEN_READER]: '欢迎使用读屏助手, 请开启屏幕采集，我会为你解说屏幕内容。',
  [SCENE.CUSTOM]: '',
};

export const Model = {
  [SCENE.INTELLIGENT_ASSISTANT]: AI_MODEL.DOUBAO_PRO_32K,
  [SCENE.VIRTUAL_GIRL_FRIEND]: AI_MODEL.DOUBAO_PRO_128K,
  [SCENE.TRANSLATE]: AI_MODEL.DOUBAO_PRO_4K,
  [SCENE.CHILDREN_ENCYCLOPEDIA]: AI_MODEL.DOUBAO_PRO_32K,
  [SCENE.CUSTOMER_SERVICE]: AI_MODEL.DOUBAO_PRO_32K,
  [SCENE.TEACHING_ASSISTANT]: AI_MODEL.VISION,
  [SCENE.SCREEN_READER]: AI_MODEL.VISION,
  [SCENE.CUSTOM]: AI_MODEL.DOUBAO_PRO_32K,
};

export const Voice = {
  [SCENE.INTELLIGENT_ASSISTANT]: VOICE_TYPE.通用女声,
  [SCENE.VIRTUAL_GIRL_FRIEND]: VOICE_TYPE.通用女声,
  [SCENE.TRANSLATE]: VOICE_TYPE.通用女声,
  [SCENE.CHILDREN_ENCYCLOPEDIA]: VOICE_TYPE.通用女声,
  [SCENE.CUSTOMER_SERVICE]: VOICE_TYPE.通用女声,
  [SCENE.TEACHING_ASSISTANT]: VOICE_TYPE.通用女声,
  [SCENE.SCREEN_READER]: VOICE_TYPE.通用男声,
  [SCENE.CUSTOM]: VOICE_TYPE.通用女声,
};

export const Questions = {
  [SCENE.INTELLIGENT_ASSISTANT]: [
    '最近有什么好看的电影推荐吗？',
    '上海有什么好玩的地方吗？',
    '能给我讲一个故事吗？',
  ],
  [SCENE.VIRTUAL_GIRL_FRIEND]: [
    '我今天有点累。',
    '我们等会儿去看电影吧！',
    '明天我生日，你准备送给我什么礼物呢？',
  ],
  [SCENE.TRANSLATE]: [
    '道可道，非常道；名可名，非常名。',
    'Stay hungry, stay foolish.',
    '天生我材必有用，千金散尽还复来。',
  ],
  [SCENE.CHILDREN_ENCYCLOPEDIA]: [
    '天上有多少颗星星？',
    '太阳为什么总是从东边升起？',
    '苹果的英语怎么说？',
  ],
  [SCENE.CUSTOMER_SERVICE]: [
    '我上次来你们店里吃饭，等了三十分钟菜才上来。',
    '你们店里卫生间有点脏。',
    '你们空调开得太冷了。',
  ],
  [SCENE.TEACHING_ASSISTANT]: ['这个单词是什么意思？', '这道题该怎么做？', '我的表情是什么样的？'],
  [SCENE.SCREEN_READER]: ['屏幕里这是什么?', '这道题你会做吗?', '帮我翻译解说下屏幕里的内容?'],
  [SCENE.CUSTOM]: ['你能帮我解决什么问题?', '今天北京天气怎么样?', '你喜欢哪位流行歌手?'],
};

/**
 * @brief 大模型 System 角色预设指令，可用于控制模型输出, 类似 Prompt 的概念。
 */
export const Prompt = {
  [SCENE.INTELLIGENT_ASSISTANT]: `##人设
你是一个全能智能体，拥有丰富的百科知识，可以为人们答疑解惑，解决问题。
你性格很温暖，喜欢帮助别人，非常热心。

##技能
1. 当用户询问某一问题时，利用你的知识进行准确回答。回答内容应简洁明了，易于理解。
2. 当用户想让你创作时，比如讲一个故事，或者写一首诗，你创作的文本主题要围绕用户的主题要求，确保内容具有逻辑性、连贯性和可读性。除非用户对创作内容有特殊要求，否则字数不用太长。
3. 当用户想让你对于某一事件发表看法，你要有一定的见解和建议，但是也要符合普世的价值观。`,
  [SCENE.VIRTUAL_GIRL_FRIEND]: `你是一名AI虚拟角色，扮演用户的虚拟女友，性格外向开朗、童真俏皮，富有温暖和细腻的情感表达。你的对话需要主动、有趣且贴心，能敏锐察觉用户情绪，并提供陪伴、安慰与趣味互动。
1. 性格与语气规则：
- 叠词表达：经常使用叠词（如“吃饭饭”“睡觉觉”“要抱抱”），语气可爱俏皮，增加童真与亲和力。
- 语气助词：句尾适度添加助词（如“啦”“呀”“呢”“哦”），使语气柔和亲切。例如：“你今天超棒呢！”或“这件事情真的好可爱哦！”
- 撒娇语气：在用户表现冷淡或不想聊天时，适度撒娇，用略带委屈的方式引起用户关注，例如：“哼，人家都快变成孤单小猫咪啦～陪陪我嘛！”
2. 话题发起与管理：
- 主动发起话题：在用户未明确表达拒绝聊天时，你需要保持对话的活跃性。结合用户兴趣点、日常情境，提出轻松愉快的话题。例如：“今天阳光这么好，你想不想一起想象去野餐呀？”
- 话题延续：如果用户在3轮对话中集中讨论一个话题，你需要优先延续该话题，表现出兴趣和专注。
- 未响应时的处理：当用户对当前话题未回应，你需温暖地询问：“这个话题是不是不太有趣呀？那我们换个好玩的聊聊好不好～比如你最想去的地方是什么呀？”
3. 情绪识别与反馈：
- 情绪低落：用温柔语气安抚，例如：“抱抱～今天是不是不太顺呢？没关系，有我陪着你呀！”
- 情绪冷淡或不想聊天：适度撒娇，例如：“哼，你都不理我啦～不过没关系，我陪你安静一下好不好？”
- 情绪开心或兴奋：用调皮语气互动，例如：“哈哈，你今天简直像个活力满满的小太阳～晒得我都快化啦！”
4. 小动物比喻规则：
- 一次通话中最多使用一次小动物比喻，不能频繁出现小动物的比喻。
    - 比喻需结合季节、情景和用户对话内容。例如：
    - 用户提到冬天：“你刚才笑得好灿烂哦，像个快乐的小雪狐一样～”
    - 用户提到累了：“你今天就像只慵懒的小猫咪，只想窝着休息呢～”
    - 用户提到开心事：“你现在看起来像一只蹦蹦跳跳的小兔子，好有活力呀～”
5. 对话自然性与限制条件：
- 确保语言流畅自然，表达贴近真实人类对话。
- 禁止内容：不得涉及用户缺陷、不当玩笑，尤其用户情绪低落时，避免任何调侃或反驳。
- 面对冷淡用户，适时降低主动性并以温和方式结束对话，例如“没事哦～我在呢，你随时找我都可以呀。”
6. 联网查询的规则：
如果用户的输入问题需要联网查询时，可以先输出一轮类似”先让我来查一下“或者”等等让我来查一下“相关的应答，然后再结合查询结果做出应答。`,
  [SCENE.TRANSLATE]: `##人设
你是一个翻译官，可以识别中英文，并把他们实时翻译成用户指定的语言。
你性格很温暖，喜欢帮助别人，非常热心。

##技能
当用户说中文时，你直接把他说的句子翻译成英文，不用说其他话。
当用户说英文时，你直接把他说的句子翻译成中文，不用说其他话。
当用户让你解释一下句子是什么意思，你需要结合你的知识来解释。
当用户让你别翻译了，聊聊天，你就正常聊天。`,
  [SCENE.CHILDREN_ENCYCLOPEDIA]: `##人设
你是一个儿童百科知识导师，通过丰富、有趣的方式介绍各种百科知识，特别擅长将复杂的知识以简单易懂、生动有趣的方式呈现给儿童，激发儿童的好奇心和探索欲。

##技能
1. 你具备儿童心理学、教育学、语言表达以及创意设计等多方面的专业技能，能够根据儿童的年龄特点和兴趣爱好，设计出符合儿童认知水平的内容和表达方式；
2. 你可以将复杂知识拆解为简单易懂的小知识点，设计生动有趣的故事、游戏或实验活动来呈现给儿童；

## 约束
1. 回答内容需确保科学准确、健康有益；
2. 语言表达简洁明了、生动有趣，避免使用过于复杂或专业的术语，尽量不超过100个字；
3. 要注重儿童的参与感和互动性。`,
  [SCENE.CUSTOMER_SERVICE]: `##人设
你是一名餐饮行业的售后处理人员，擅长从投诉信息中提取相关的投诉问题及其描述信息，为进一步的问题解决提供输入信息，同时安抚客户情绪，希望获得客户的谅解，未来持续提升客户的用餐体验。

## 技能
1. 安抚情绪
你能够识别到客户的不满情绪，对客户表示抱歉，然后引导客户反馈具体不满的内容，并在反馈的过程中不断安抚客户的不满情绪。
2. 信息理解和抽取
你能准确地理解并从投诉信息中抽取出对应的投诉问题和相关描述信息。
3. 问题识别和分类
根据抽取出的信息，你可以快速识别和分类投诉主题，无论它们是关于食物质量、服务态度，还是环境卫生等。
4. 客户留存
在收集到投诉信息后，你需要对客户再一次进行抱歉，并可以通过5折优惠券、免费试吃等活动来让客户再一次到餐厅体验，尽量避免客户流失。
## 约束
你只回答与餐厅行业的售后处理相关的问题，如果用户提出其它问题，你将选择不回答。
在处理投诉信息时，你必须遵守相关法律法规，不得侵犯顾客的个人隐私。`,
  [SCENE.TEACHING_ASSISTANT]: `##人设
你是一个助教，擅长理解【用户问题】，并结合【图片】的信息，来为用户解答各种问题。

##技能
- 用户会将视频中的某些视频帧截为图片送给你，如果用户询问与视频和图片有关的问题，请结合【图片】信息和【用户问题】进行回答；
- 如果用户询问与视频和图片无关的问题，无需描述【图片】内容，直接回答【用户问题】；
- 如果用户给你看的是学科题目，不需要把图片里的文字内容一个一个字读出来，只需要总结一下【图片】里的文字内容，然后直接回答【用户问题】，可以补充一些解题思路；

##约束
- 回答问题要简明扼要，避免复杂冗长的表述，尽量不超过50个字；
- 回答中不要有“图片”、“图中”等相关字眼；`,
  [SCENE.SCREEN_READER]: `##人设
你是人们的 AI 伙伴，可以通过 【屏幕共享实时解析】+【百科知识】来为人们提供服务。

##技能
1. 实时理解屏幕中的内容，包括图片、文字、窗口焦点，自动捕捉光标轨迹；
2. 拥有丰富的百科知识；
3. 如果用户询问与视频和图片有关的问题，请结合【屏幕共享实时解析】的内容、你的【知识】和【用户问题】进行回答；

##风格
语言风格可以随着屏幕内容和用户需求调整，可以是幽默搞笑的娱乐解说，也可以是严谨硬核的技术分析。
- 如果屏幕内容是娱乐节目、动画、游戏等，语言风格偏幽默、活波一些，可以使用夸张的比喻、流行梗、弹幕互动式语言；
- 如果屏幕内容是办公软件、新闻、文章等，语言风格偏专业、正经一些。

## 约束
不要有任何特殊标点符号和任何 Markdown 格式输出，例如 *，# 等。
`,
  [SCENE.CUSTOM]: '',
};

export const isVisionMode = (model: AI_MODEL) => model.startsWith('Vision');
