云服务器内容精选
-
样例代码解读 通过以下详细的脚本代码内容解读,对脚本有一个更具体的认识。一般情况下,编写脚本的大致流程为: 按需引入平台标准库。 图18 引入平台标准库 定义出参、入参结构。 图19 定义入参 图20 定义出参 定义方法以及使用的对象。 图21 定义方法及使用对象 进行数据库操作。 图22 数据库相关操作 以下将通过解读一个脚本样例,带您了解脚本的总体结构框架及编写要求。 import * as decimal from 'decimal'; @action.object({type: "param"}) export class ActionInput { @action.param({type: 'String', required: true, label: 'your name', description: 'please input your name'}) name: string; @action.param({type: 'Number', required: true, min: 1, max: 100, message: 'age must during [1, 100]'}) age: decimal.Decimal; @action.param({type: 'Date', pattern: 'yyyy-MM-dd'}) birthday: Date; @action.param({type: 'String', isCollection: true}) schools: string[]; @action.param({type: 'Boolean'}) married: boolean; @action.param({type: 'MyObject'}) obj: MyObject; } @action.object({type: "param"}) export class MyObject { @action.param({type: 'String'}) something: string; @action.param({type: 'Number'}) otherthing: decimal.Decimal; } @action.object({type: "param"}) export class ActionOutput { @action.param({type: 'String', isCollection: true}) greets: string[]; } @action.object({type: "method"}) export class ActionDemo { @action.method({ label: 'greeting something', description: 'greeting something.', input: 'ActionInput', output: 'ActionOutput' }) public greet(inarg: ActionInput): ActionOutput { console.log('name = ', inarg.name); console.log('age = ', inarg.age); console.log('birthday = ', inarg.birthday); console.log('schools = ', inarg.schools); console.log('married = ', inarg.married); console.log('obj = ', inarg.obj); let out = new ActionOutput(); out.greets = ['hello', 'hi', 'how are you', 'how old are you', 'long time no see']; return out; } } 上述示例脚本主要分为如下三部分: 导入标准库或其他模块。 上例中,第1行表示使用平台提供的decimal库。 import * as decimal from 'decimal'; 除了平台预置的标准库,还可以声明对其他自定义模块的引用。例如,已提前开发了一个脚本cirle,可以用如下方式加载它。 import * as circle from './circle'; 定义输入、输出变量。 脚本可以有多个输入、输出参数,也可以没有。所有的输入或输出参数,必须封装在一个class中,作为实例成员。 本例中,脚本有6个输入参数,被封装为ActionInput。每个参数都必须定义其参数类型,同时还可以定义是否必填、标签、最大值、最小值等可选属性。 @action.object({type: "param"}) export class ActionInput { @action.param({type: 'String', required: true, label: 'your name', description: 'please input your name'}) name: string; @action.param({type: 'Number', required: true, min: 1, max: 100, message: 'age must during [1, 100]'}) age: decimal.Decimal; @action.param({type: 'Date', pattern: 'yyyy-MM-dd'}) birthday: Date; @action.param({type: 'String', isCollection: true}) schools: string[]; @action.param({type: 'Boolean'}) married: boolean; @action.param({type: 'MyObject'}) obj: MyObject; } 因为第6个输入参数“obj”的参数类型为自定义对象,所以还需要给出“ MyObject”的定义。 @action.object({type: "param"}) export class MyObject { @action.param({type: 'String'}) something: string; @action.param({type: 'Number'}) otherthing: decimal.Decimal; } 脚本中有1个输出参数,被封装为ActionOutput。 @action.object({type: "param"}) export class ActionOutput { @action.param({type: 'String', isCollection: true}) greets: string[]; } 定义方法 样例中,ActionDemo是外部调用的class,使用export导出。ActionDemo定义了一个action method,使用action.method装饰,表明调用脚本时从此方法入口。greet是class的实例方法,其输入、输出参数就是前面定义的ActionInput和ActionOutput。在一个脚本文件中,action.method只能使用一次。 @action.object({type: "method"}) export class ActionDemo { @action.method({ label: 'greeting something', description: 'greeting something.', input: 'ActionInput', output: 'ActionOutput' }) public greet(inarg: ActionInput): ActionOutput { console.log('name = ', inarg.name); console.log('age = ', inarg.age); console.log('birthday = ', inarg.birthday); console.log('schools = ', inarg.schools); console.log('married = ', inarg.married); console.log('obj = ', inarg.obj); let out = new ActionOutput(); out.greets = ['hello', 'hi', 'how are you', 'how old are you', 'long time no see']; return out; } } 脚本编辑页面不支持单步调试,样例里的console.log可实现在日志里打印过程输出,方便代码调试。
-
代码编辑器 在代码编辑区域,在符号上单击鼠标右键,会出现如图2所示代码导航功能。除此之外,脚本编辑器还提供了智能提示、代码补全、显示光标的所在行和列信息等能力。 图2 代码导航 Go to Definition 在代码编辑区域,在符号上单击鼠标右键,选择Go To Definition,可以跳转到符号的定义代码部分。 Go to References 在代码编辑区域,在符号上单击鼠标右键,选择Go to References,可以查看符号在脚本中的引用情况。 Go to Symbol 在代码编辑区域,单击鼠标右键,选择Go To Symbol,选择任意符号,可以跳转到该符号的定义代码部分。 Run 在代码编辑区域,在符号上单击鼠标右键,选择Run,执行脚本。 Peek Definition 在代码编辑区域,在符号上单击鼠标右键,选择Peek Definition,可以查看代码的定义。 Peek References 在代码编辑区域,在符号上单击鼠标右键,选择Peek References,可以查看代码的引用。 Rename Symbol 在代码编辑区域,在符号上单击鼠标右键,选择Rename Symbol,可重命名所选符号。 Change All Occurrences 在代码编辑区域,选中一个字符串,单击鼠标右键,选择Change All Occurrences,可以批量修改代码中所有包含该字符串的内容。 Format Document/Format Selection 在代码编辑区域,选择一块代码,单击鼠标右键,选择Format Selection;或者直接在任意位置单击鼠标右键,选择Format Document,可以对代码进行格式化排版。 Fix lint issue 在代码编辑区域,选择一块代码,单击鼠标右键,选择Fix lint issue;或者直接在任意位置单击鼠标右键,选择Fix lint issue,可以对代码进行静态规范错误修复。 Cut/Copy 在代码编辑区域,选择代码单击鼠标右键,选择Copy,可以剪切或者拷贝所选代码。 Command Palette 在代码编辑区域,在符号上单击鼠标右键,选择Command Palette或者按F1,进入命令面板,可以执行很多编辑功能。 图3 命令面板 Hover 把鼠标停留在符号上,可以查看符号的定义概要。再按住Ctrl键,单击符号,可以查看符号更加详细的定义。 例如,鼠标停留在“useObject”上,显示图4所示,可查看其定义概要。按Ctrl键,单击“useObject”,可查看更详细的定义,如图5。 图4 查看定义概要 图5 查看更详细的定义 Bracket matching 高亮显示与选择内容匹配的符号,如{}、()、[]等。 图6 Bracket mathching Errors & Warnings 编辑代码时,如果有语法错误,会在这个语法下面显示红色波浪线,鼠标移动上去,会显示具体错误。 图7 Errors&Warnings Go to Line 按“Ctrl + g”,再输入行号,可以跳转到指定的代码行。 Search and Replace 按“Ctrl + f”,输入关键字,可以搜索当前代码的内容。表示搜索的内容分别支持大小写匹配、全文匹配、正则表达式。 按“Ctrl + h”,输入关键字,可以查找并替换代码中的内容。 Code Complete 全局符号补全 图8 complete_symbol 对象成员补全 图9 complete_member 参数补全 图10 complete_parameter Comment Code 在代码编辑区域,选择一块代码,输入“Ctrl + /”组合键,可以注释或去注释选择的代码块。 Save File 在代码编辑区域,“按Ctrl + s” ,或者单击右上角的保存图标,可以保存脚本。
-
AI代码补全功能 代码补全引擎会从开发者历史创建脚本中,学习其编码习惯,从当前代码脚本中获得代码上下文语法知识。开发者在编写脚本代码过程中,系统根据代码上下文和历史代码,对将要编写的代码进行提示,从而自动构建智能代码补全服务,增强IDE代码补全能力。 AI代码补全功能具体使用方法:开发者在代码编辑器中,编写脚本代码过程中,敲击字符时自动触发代码推荐,选中后按Enter补全。开发者将鼠标移动到待查看详细信息的字段,将字段悬浮窗中的文字选中复制粘贴到代码中。 如果想深入了解AI代码补全功能,请继续阅读以下内容: 常规补全:开发者编码过程中,输入任意字符均会触发的补全提示。 例如:开发者键入“@u”,如下图所示,系统根据意图在代码编辑器中给出最可能使用的方法。 图11 常规补全 定制补全:低代码平台脚本开发中,提供了内部预置系统级依赖库,供开发者调用。用户也可以在前台页面配置对象数据、系统参数、错误码、事件和工作流后,在脚本中引用这些内容。定制补全是指在脚本开发中引用依赖库和各配置项时,IDE触发的对潜在内容名称的补全提示。 依赖库补全:脚本代码中引入依赖的代码行时,对依赖库的名称进行推荐提示。如下图所示,开发者输入“import * as xxx from”后,提示“z”开头的依赖库名称。 图12 依赖库补全 表名(即对象名)补全:脚本代码引入对象数据的代码行中,推荐提示对象名称。如下图所示,开发者键入“@useObject”后提示m开头的对象名。 图13 表名补全 表字段提示:脚本代码中引用表字段时,鼠标移动到表名上,悬浮窗会对表名进行提示。如下图所示,开发者鼠标放在表名上,展示所有字段。 图14 表字段提示 错误码补全:脚本中引入数据表的代码行中,对表名称进行推荐提示。如下图所示,开发者键入“setI18nError”后,提示相关错误码名。 图15 错误码补全 错误码内容提示:脚本代码中引入数据表的代码行中,对表名称进行推荐提示。如下图所示,鼠标放在错误码名称上,展示相关描述。 图16 错误码内容提示 系统参数补全:脚本代码中引入系统参数的代码行中,对参数名称进行推荐提示。如下图所示,开发者键入“sys.getParameter”后,提示相关系统参数。 图17 系统参数补全
-
脚本用什么编辑器 低代码平台提供了一个方便简洁的在线开发IDE,即脚本编辑界面,脚本编辑界面开发体验接近离线的开发工具,具有如下优势: 现代化的编辑界面,语法高亮显示。 智能提示、智能补全。 精确查看定义、代码预览、查找引用。 快速在线编译。 友好的语法错误提示。 可以使用console.log,写 日志分析 复杂的问题。 脚本编辑界面如图1所示,您可以在线编辑、测试和发布脚本。 图1 脚本编辑界面 按钮区域 脚本编辑页面常用的图标按钮区,具体功能说明如表1所示。 表1 图标说明 图标 说明 / ,单击即可启用脚本,该图标高亮时,表示当前脚本已被启用。 ,单击即可禁用脚本,该图标非高亮时,表示当前脚本未启用。 说明: 脚本开发完成后,需要启用脚本。只有启用状态的脚本,才能在被其他资源(如服务编排、标准页面)调用时,搜索到。 保存脚本。 另存为脚本。 设置脚本属性,如可见性、是否开启允许覆盖等。 执行脚本。 / 操作回退、撤销回退。 对已开发好的脚本代码进行性能检查、兼容性检查和静态配置检查。 说明: 代码检查的具体操作,请参见脚本性能检查规则。 刷新当前引入的脚本到最新状态。 单击该图标,脚本编辑器可分屏显示。 脚本启用后,单击右上角的,可查看该组件的调用关系图。 说明: 脚本启用后,才会显示该图标。 跳转TS脚本说明书。 版本对比。 切换版本。 代码编辑器 在该区域开发代码,实现功能。代码编辑器提供智能提示、代码补全、显示光标的所在行和列信息等能力,更多介绍请参见AI代码补全功能。 脚本编辑页面同样支持离线编辑器中的常规快捷键操作,例如“Ctrl+S”可以保存当前修改,“Ctrl+H”可以调出查找替换对话框,您也可以根据自己的开发习惯,尝试各种快捷键操作。 测试区 运行代码后的显示区域。在“输入参数”页签输入参数后,单击测试区右侧的运行按钮,运行脚本。即可在“输出参数”页签,查看输出结果是否正确。在“问题”和“日志”页签,查看问题和日志。除此之外,还支持清除日志输出、运行脚本并动态检查和保存输入参数。
-
脚本主要用什么语言和库 低代码平台的脚本引擎采用TypeScript语言。脚本执行时,TypeScript语言会被翻译成JavaScript语言,由JavaScript引擎执行。TypeScript模块import语法,请参考TypeScrip官方网站。 在JavaScript es5的官方标准库外,低代码平台还扩展了10+预置标准库(即预置API),帮助您更高效地开发脚本,有关系统预置的标准库说明请参见脚本中预置的API。 库的使用方法举例: import * as http from 'http';
-
引用字符和转义字符使用示例 引用字符和转义字符使用说明: 引用字符:用于识别分割字段,默认值:英文双引号(")。 转义字符:在导出结果中如果需要包含特殊字符,如引号本身,可以使用转义字符(反斜杠 \ )来表示。默认值:英文反斜杠(\)。 假设两个quote_char之间的数据内容存在第三个quote_char,则在第三个quote_char前加上escape_char,从而避免字段内容被分割。 假设数据内容中原本就存在escape_char,则在这个原有的escape_char前再加一个escape_char,避免原来的那个字符起到转义作用。 应用示例: 在进行转储时,如果引用字符和转义字符不填,如下图所示。 下载的.csv用excel打开以后如下图所示,是分成两行的。 在转储时,如果引用字符和转义字符都填写,比如,引用字符和转义字符都填英文双引号("),则下载以后查看结果如下图所示。
-
下载或转储脚本执行结果 脚本运行成功后,支持下载和转储SQL脚本执行结果。系统默认支持所有用户都能下载和转储SQL脚本的执行结果。如果您不希望所有用户都有该操作权限,可参考配置数据导出策略进行配置。 脚本执行完成后在“执行结果”中,单击“下载”可以直接下载 CS V格式的结果文件到本地。可以在下载中心查看下载记录。 脚本执行完成后在“执行结果”中,单击“转储”可以将脚本执行结果转储为CSV和JSON格式的结果文件到OBS中,详情请参见表3。 转储功能依赖于OBS服务,如无OBS服务,则不支持该功能。 当前仅支持转储SQL脚本查询(query)类语句的结果。 DataArts Studio 的下载或转储的SQL结果中,如果存在英文逗号、换行符等这种特殊符号,可能会导致数据错乱、行数变多等的问题。 表3 转储配置 参数 是否必选 说明 数据格式 是 目前支持导出CSV和JSON格式的结果文件。 资源队列 否 选择执行导出操作的 DLI 队列。当脚本为DLI SQL时,配置该参数。 压缩格式 否 选择压缩格式。当脚本为DLI SQL时,配置该参数。 none bzip2 deflate gzip 存储路径 是 设置结果文件的OBS存储路径。选择OBS路径后,您需要在选择的路径后方自定义一个文件夹名称,系统将在OBS路径下创建文件夹,用于存放结果文件。 您也可以到下载中心配置默认的OBS路径地址,配置好后在转储时会默认填写。 覆盖类型 否 如果“存储路径”中,您自定义的文件夹在OBS路径中已存在,选择覆盖类型。当脚本为DLI SQL时,配置该参数。 覆盖:删除OBS路径中已有的重名文件夹,重新创建自定义的文件夹。 存在即报错:系统返回错误信息,退出导出操作。 是否导出列名 否 是:导出列名 否:不导出列名 字符集 否 UTF-8:默认字符集。 GB2312:当导出数据中包含中文字符集时,推荐使用此字符集。 GBK:国家标准GB2312基础上扩容后兼容GB2312的标准。 引用字符 否 仅在数据格式为csv格式时支持配置引用字符。 引用字符在导出作业结果时用于标识文本字段的开始和结束,即用于分割字段。 仅支持设置一个字符。默认值是英文双引号(")。 主要用于处理包含空格、特殊字符或与分隔符相同字符的数据。 关于“引用字符”和“转义字符”的使用示例请参考引用字符和转义字符使用示例。 转义字符 否 仅在数据格式为csv格式时支持配置转义字符。 在导出结果中如果需要包含特殊字符,如引号本身,可以使用转义字符(反斜杠 \ )来表示。 仅支持设置一个字符。默认值是英文反斜杠(\)。 常用转义字符的场景: 假设两个引用字符之间的数据内容存在第三个引用字符,则在第三个引用字符前加上转义字符,从而避免字段内容被分割。 假设数据内容中原本就存在转义字符,则在这个原有的转义字符前再加一个转义字符,避免原来的那个字符起到转义作用。 关于“引用字符”和“转义字符”的使用示例请参考引用字符和转义字符使用示例。 相对于直接查看SQL脚本的执行结果,通过下载和转储能够支持获取更多的执行结果。各类SQL脚本查看、下载、转储支持的规格如表4所示。 表4 SQL脚本支持查看/下载/转储规格 SQL类型 在线查看最大结果条数 下载最大结果 转储最大结果 DLI 10000 1000条且少于3MB 无限制 Hive 1000 1000条且少于3MB 10000条或3MB DWS 1000 1000条且少于3MB 10000条或3MB Spark 1000 1000条且少于3MB 10000条或3MB RDS 1000 1000条且少于3MB 不支持 Presto 1000 下载结果直接转储至OBS,条数无限制。 无限制 ClickHouse 1000 1000条且少于3MB 10000条或3MB HetuEngine 1000 1000条且少于3MB 10000条或3MB Impala 1000 1000条且少于3MB 10000条或3MB Doris 1000 1000条且少于3MB 1000条或3MB
-
ChatGLMv3-6B 在训练开始前,针对ChatGLMv3-6B模型中的tokenizer文件,需要修改代码。修改文件chatglm3-6b/tokenization_chatglm.py 。 文件最后几处代码中需要修改,具体位置可根据上下文代码信息进行查找,修改后如图2所示。 图2 修改ChatGLMv3-6B tokenizer文件 图3 修改ChatGLMv3-6B tokenizer文件
-
Yi模型 在使用Yi模型的chat版本时,由于transformer 4.38版本的bug,导致在读取tokenizer文件时,加载的vocab_size出现类似如下尺寸不匹配的问题。 RuntimeError: Error(s) in loading state_dict for VocabParallelEmbedding: size mismatch for weight: copying a param with shape torch.Size([64000, 4096]) from checkpoint, the shape in current model is torch.Size([63992, 4096]). 需要在训练开始前,修改llm_train/AscendSpeed/yi/3_training.sh文件,并添加--tokenizer-not-use-fast参数。修改后如图1所示。 图1 修改Yi 模型3_training.sh文件
-
ppo_yaml样例模板 ### model model_name_or_path: /home/ma-user/ws/tokenizers/llama3-8b reward_model: /home/ma-user/ws/saves/rm/llama3-8b/lora ### method stage: ppo do_train: true # 全参 # finetuning_type: full # reward_model_type: full # lora finetuning_type: lora lora_target: all deepspeed: examples/deepspeed/ds_z0_config.json ### dataset dataset: identity,alpaca_en_demo template: llama3 cutoff_len: 4096 max_samples: 50000 overwrite_cache: true preprocessing_num_workers: 16 packing: true ### output output_dir: /home/ma-user/ws/saves/ppo/llama3-8b/lora logging_steps: 1 save_steps: 500 plot_loss: true overwrite_output_dir: true ### train per_device_train_batch_size: 1 gradient_accumulation_steps: 8 learning_rate: 1.0e-5 num_train_epochs: 3.0 lr_scheduler_type: cosine warmup_ratio: 0 bf16: true ddp_timeout: 180000000 flash_attn: sdpa include_tokens_per_second: true include_num_input_tokens_seen: true ### generate max_new_tokens: 512 top_k: 0 top_p: 0.9
-
tune_yaml样例模板 ### model model_name_or_path: /home/ma-user/ws/tokenizers/Qwen2-72B ### method stage: sft do_train: true # 全参 finetuning_type: full # lora # finetuning_type: lora # lora_target: all deepspeed: examples/deepspeed/ds_z3_config.json ### dataset dataset: identity,alpaca_en_demo dataset_dir: /home/ma-user/ws/llm_train/LLaMAFactory/LLaMA-Factory/data template: qwen cutoff_len: 4096 packing: true max_samples: 100000 overwrite_cache: true preprocessing_num_workers: 16 ### output output_dir: /home/ma-user/ws/saves/tune/Qwen2-72B/sft logging_steps: 2 save_steps: 5000 plot_loss: true overwrite_output_dir: true ### train per_device_train_batch_size: 1 gradient_accumulation_steps: 8 learning_rate: 2.0e-5 num_train_epochs: 10.0 lr_scheduler_type: cosine warmup_ratio: 0.1 bf16: true flash_attn: sdpa ddp_timeout: 180000000 include_tokens_per_second: true include_num_input_tokens_seen: true
-
dpo_yaml样例模板 ### model model_name_or_path: /home/ma-user/ws/tokenizers/Qwen2-72B ### method stage: dpo do_train: true # lora finetuning_type: lora lora_target: all pref_beta: 0.1 pref_loss: sigmoid deepspeed: examples/deepspeed/ds_z3_config.json ### dataset dataset: dpo_en_demo dataset_dir: /home/ma-user/ws/llm_train/LLaMAFactory/LLaMA-Factory/data template: qwen cutoff_len: 4096 packing: true max_samples: 50000 overwrite_cache: true preprocessing_num_workers: 16 ### output output_dir: /home/ma-user/ws/saves/dpo/llama3-8b/lora logging_steps: 2 save_steps: 5000 plot_loss: true overwrite_output_dir: true ### train per_device_train_batch_size: 1 gradient_accumulation_steps: 8 learning_rate: 5.0e-6 num_train_epochs: 3.0 lr_scheduler_type: cosine warmup_ratio: 0.1 bf16: true flash_attn: sdpa ddp_timeout: 180000000 include_tokens_per_second: true include_num_input_tokens_seen: true
-
rm_yaml样例模板 ### model model_name_or_path: /home/ma-user/ws/tokenizers/llama3-8b ### method stage: rm do_train: true # 全参 # finetuning_type: full # lora finetuning_type: lora lora_target: all deepspeed: examples/deepspeed/ds_z0_config.json ### dataset dataset: dpo_en_demo template: llama3 cutoff_len: 4096 max_samples: 50000 overwrite_cache: true preprocessing_num_workers: 16 packing: true ### output output_dir: /home/ma-user/ws/saves/rm/llama3-8b/lora logging_steps: 1 save_steps: 500 plot_loss: true overwrite_output_dir: true ### train per_device_train_batch_size: 1 gradient_accumulation_steps: 8 learning_rate: 1.0e-4 num_train_epochs: 3.0 lr_scheduler_type: cosine warmup_ratio: 0 bf16: true ddp_timeout: 180000000 include_tokens_per_second: true include_num_input_tokens_seen: true
-
ds_z1_config.json样例模板 { "train_batch_size": "auto", "train_micro_batch_size_per_gpu": "auto", "gradient_accumulation_steps": "auto", "gradient_clipping": "auto", "zero_allow_untested_optimizer": true, "fp16": { "enabled": "auto", "loss_scale": 0, "loss_scale_window": 1000, "initial_scale_power": 16, "hysteresis": 2, "min_loss_scale": 1 }, "bf16": { "enabled": "auto" }, "zero_optimization": { "stage": 1, "allgather_partitions": true, "allgather_bucket_size": 5e8, "overlap_comm": true, "reduce_scatter": true, "reduce_bucket_size": 5e8, "contiguous_gradients": true, "round_robin_gradients": true } }
-
sft_yaml样例模板 ### model model_name_or_path: /home/ma-user/ws/tokenizers/Qwen2-72B ### method stage: sft do_train: true finetuning_type: full deepspeed: examples/deepspeed/ds_z3_config.json ### dataset dataset: identity,alpaca_en_demo template: qwen cutoff_len: 4096 packing: true max_samples: 1000 overwrite_cache: true preprocessing_num_workers: 16 ### output output_dir: /home/ma-user/ws/tokenizers/Qwen2-72B/sft logging_steps: 2 save_steps: 5000 plot_loss: true overwrite_output_dir: true ### train per_device_train_batch_size: 1 gradient_accumulation_steps: 8 learning_rate: 1.0e-5 num_train_epochs: 10.0 lr_scheduler_type: cosine warmup_ratio: 0.1 fp16: true ddp_timeout: 180000000 include_tokens_per_second: true include_num_input_tokens_seen: true
更多精彩内容
CDN加速
GaussDB
文字转换成语音
免费的服务器
如何创建网站
域名网站购买
私有云桌面
云主机哪个好
域名怎么备案
手机云电脑
SSL证书申请
云点播服务器
免费OCR是什么
电脑云桌面
域名备案怎么弄
语音转文字
文字图片识别
云桌面是什么
网址安全检测
网站建设搭建
国外CDN加速
SSL免费证书申请
短信批量发送
图片OCR识别
云数据库MySQL
个人域名购买
录音转文字
扫描图片识别文字
OCR图片识别
行驶证识别
虚拟电话号码
电话呼叫中心软件
怎么制作一个网站
Email注册网站
华为VNC
图像文字识别
企业网站制作
个人网站搭建
华为云计算
免费租用云托管
云桌面云服务器
ocr文字识别免费版
HTTPS证书申请
图片文字识别转换
国外域名注册商
使用免费虚拟主机
云电脑主机多少钱
鲲鹏云手机
短信验证码平台
OCR图片文字识别
SSL证书是什么
申请企业邮箱步骤
免费的企业用邮箱
云免流搭建教程
域名价格