从 Colang 1 迁移到 Colang 2
NeMo Guardrails CLI 提供了一个工具 (nemoguardrails convert ...
),用于将 guardrail 配置从 Colang 1.0 格式转换为 Colang 2.x。它对文件的内容执行多项语法转换,例如转换某些关键字和更改某些标识符的大小写。
警告
转换工具未涵盖某些边缘情况。您应始终在转换后手动审查 guardrail 配置。
工作原理
该工具遍历 path
参数指定的目录,并将转换应用于每个以 .co
结尾的文件。转换包括
将
define flow
转换为flow
。将
define subflow
转换为flow
。将
define bot
转换为flow bot
。将
define user
转换为flow user
。将
execute
转换为await
。转换
await
之后的 snake_case 标识符为 CamelCase,并在其后附加关键字Action
,同时保留使用的任何参数。将
else when
转换为or when
。将
stop
转换为abort
。将
bot
之后的带引号的字符串转换为bot say
或or bot say
。将
user
之后的带引号的字符串转换为user said
或or user said
。转换匿名流程。
为根流程(需要激活的流程)使用
active
装饰器。将
global
关键字添加到全局变量。将
...
转换为 Colang 2 中相应的语法。
生成运算符
Colang 1.0 和 2.0 之间,生成操作的语法略有变化。 以下 Colang 1.0 代码段
# some instruction in natural language
$var_name = ...
它被翻译为
$name = ... "some instruction in natural language"
通用匹配
在 Colang 1.0 中,可以使用 user ...
和 bot ...
进行通用匹配。 这些在 Colang 2.0 中具有不同的等效项。 ...
不再用于匹配,仅用于生成。
转换期间应用以下更改
user ...
被翻译为user said something
bot ...
被翻译为bot said something
Rail 配置
Colang 1.0 配置可以在 rails
字段中定义某些 rail。
如果在
config.yml
中定义了 rail,则会生成一个_rails.co
文件,其中包含定义的 rail。
示例流程转换
例如,以下流程
define flow
user express greeting
bot express greeting
被转换为
@active
flow express_greeting
user express greeting
bot express greeting
注意
按照惯例,用户流程使用过去时,而机器人流程使用现在时。但是,迁移工具不强制执行此约定。
该工具跟踪处理的行数和每个文件中所做的更改数。它还会计算更改的文件总数。
警告
该工具修改原始文件。建议使用版本控制来跟踪工具所做的更改。它还可以让您查看原始文件和修改后文件之间的差异。
用法
要使用转换工具,请使用以下命令
nemoguardrails convert /path/to/directory
convert
命令有几个选项
--verbose
或--no-verbose
:是否应详细迁移并输出详细日志。默认为no-verbose
。--validate
或--no-validate
:迁移是否应使用 Colang Parser 验证输出。默认为no-validate
。--use-active-decorator
或--no-use-active-decorator
:迁移是否应使用active
装饰器。默认为use-active-decorator
。
假设和限制
该工具假定输入文件格式正确。如果文件格式不正确,则该工具可能无法按预期工作。
该工具使用正则表达式来查找和替换文本中的某些模式。如果输入文件包含与这些模式匹配但不应替换的文本,则该工具可能会产生不正确的结果。
该工具重命名原始文件,并将转换后的内容写入具有原始名称的新文件。使用版本控制来跟踪工具所做的更改。
该工具不处理文件读取和写入操作期间可能发生的错误。如果发生错误,该工具会记录错误并继续处理下一个文件。
流程定义中不支持使用
-
、+
等字符以及or
、and
等标记,迁移工具不处理此转换。更好的做法是在流程开始时定义全局变量。但是,迁移工具不强制执行此操作。