TEN-framework / ten_framework

TEN, the Next-Gen AI-Agent Framework, the world's first truly real-time multimodal AI agent framework.
https://doc.theten.ai/
Other
315 stars 26 forks source link

If environment variable does not exist, the value of property using this environment should not be NULL. #187

Open leoadonia opened 3 weeks ago

leoadonia commented 3 weeks ago

Extension might uses the environment variable as the value of property, ex:

"property": {
      "api_key": "${env:BING_API_KEY}"
 }

If the environment variable does not exist, the ten_value_t bound to this property is TEN_TYPE_NULL.

It's better to set the default value to an empty string rather than NULL if the environment does not exist.

leoadonia commented 3 weeks ago

临时记录

默认值

环境变量不存在时, 目前有两种设置默认值的可选,null 或者 空字符串 (针对 env 来说, 值类型一般是 string).

设置为 null, 即在 property 的值在 runtime 内是以 ten_value_null 对象的形式存在.

对于设置为 null:

扩展来看, env 的方式, 只是一种 "注入" property 的方式, 与现有的 value system 无关, 不应该跟 value 的 default value 产生关系.

注入 property 的方式可以有多种:

所以, env 只是一种获取值的渠道, 在获取到之后, 应用到 value system 中. 也可以理解为是在定义 property store.

那这样, 后续扩展其他渠道时, 可能会出现两种 "异常" (姑且将获取不到值认为是 异常):

如果结合 schema 来看, 还会存在 store 存的值与预期的不一致的问题, 如果是直接将从 store 中的值作用到 value 中, 也存在类型不匹配的错误.

从这个角度, env 中获取不到返回的 NULL, 就应该是一种统一的处理方式, 即如何在 获取阶段表达 not found 的错误.

leoadonia commented 3 weeks ago

从 value system 的角度来看, 处理 env 的方式, 应该算是 marshal / unmarshal 的一种实现. 可以是从 marshal / unmarshal 定义标准接口, 当传入的值是 NULL 时, 该如何 unmarshal.

leoadonia commented 3 days ago

常见框架的行为

Java/Springboot

Springboot 中提供 AutoConfiguration 的能力, 可以将不同的数据源作为配置注入到 Configuratio Pojo class 中. 如:

@Configuration
class Config {
    @Value("${example.name}")
    private String name;
}

上述是将配置源中 key 为 example.name (example scope 下的 name) 的值注入到 Config class 中的 name 中.

预期 example.name 需要定义在数据源中, 比如 Springboot 中的默认数据源 application.yaml 中.

application.yaml 是 Springboot 的默认的本地化配置源, 可以基于 spring cloud config server 支持不同的 backend, 如 git. 但作用到 AutoConfiguration 上的原则是一致的.

与 os env 不同的是, Springboot 中的 variable name 允许是以 数字开头, 如:

spring:
  application:
    name: demo
example:
  name: ${3A:}

是可以正常启动以及正常获取值的.

leoadonia commented 3 days ago

K8S

K8S 中的 ConfigMap 有类似的应用场景, 比如将 ConfigMap 中的某一个 field 注入到 container 的环境变量中 (即将 config source A 中的内容作为另一种 config container B 的源, 以另一种方式来获取值, 如不再是 GetConfig, 而是通过 GetEnv).