Visindigo::Agent::Provider Class
class Visindigo::Agent::Provider一组模型的集合,用于在实际执行时挑选一个可用的模型. 详情...
| 头文件: | #include <Agent/Provider.h> |
| 自以下版本: | Visindigo 0.17.0 |
公开成员函数
(自 Visindigo 0.17.0 引入) | Provider() |
(自 Visindigo 0.17.0 引入) | Provider(const QString &name) |
(自 Visindigo 0.17.0 引入) | ~Provider() |
(自 Visindigo 0.17.0 引入) Visindigo::Agent::Provider & | addModel(const QString &modelId, qint32 priority = 0) |
(自 Visindigo 0.17.0 引入) Visindigo::Agent::Provider & | clearModels() |
(自 Visindigo 0.17.0 引入) bool | fromJson(const Visindigo::Utility::JsonConfig &json) |
(自 Visindigo 0.17.0 引入) QString | getId() const |
(自 Visindigo 0.17.0 引入) QStringList | getModelIds() const |
(自 Visindigo 0.17.0 引入) qint32 | getModelPriority(const QString &modelId) const |
(自 Visindigo 0.17.0 引入) QString | getName() const |
(自 Visindigo 0.17.0 引入) bool | isValid() const |
(自 Visindigo 0.17.0 引入) QString | pickFirst(Visindigo::Agent::Model::Capabilities required) const |
(自 Visindigo 0.17.0 引入) QString | pickNext(const QString &afterModelId, Visindigo::Agent::Model::Capabilities required) const |
(自 Visindigo 0.17.0 引入) Visindigo::Agent::Provider & | removeModel(const QString &modelId) |
(自 Visindigo 0.17.0 引入) Visindigo::Agent::Provider & | setName(const QString &name) |
(自 Visindigo 0.17.0 引入) Visindigo::Utility::JsonConfig | toJson() const |
详细说明
Provider 回答的是"该用哪个模型":它按优先级持有一批模型 id,并提供 pickFirst() / pickNext() 两个挑选入口。前者用于正常发起一次对话, 后者用于某个模型失败或额度耗尽时换一个继续。
Provider 只保存模型 id,不保存 Model 本身。这样做的直接好处是 toJson() 的产物里不含任何凭据——服务商列表可以随手贴给别人看, 而共享同一批模型的多个 Provider 也不会各自持有一份 token 副本。
Provider 自身也用 UUID 作索引,注册在 Visindigo::Agent::Center 中。
成员函数文档
[since Visindigo 0.17.0] Provider::Provider()
构造一个空 Provider,并立即分配一个新的 UUID。
这个function 从 Visindigo 0.17.0 开始支持。
[since Visindigo 0.17.0] Provider::Provider(const QString &name)
以名称构造空 Provider。名称仅用于展示,索引仍走 id。
这个function 从 Visindigo 0.17.0 开始支持。
[noexcept, since Visindigo 0.17.0] Provider::~Provider()
这个function 从 Visindigo 0.17.0 开始支持。
[since Visindigo 0.17.0] Visindigo::Agent::Provider &Provider::addModel(const QString &modelId, qint32 priority = 0)
加入一个模型 id,并指定其优先级。优先级越大越先被 pickFirst() 选中, 默认 0。
重复加入同一个 id 会覆盖其优先级,而不是产生第二个条目。
Note: 这里不检查 modelId 是否已在 Center 的模型池中存在。允许先建 Provider 后补模型,可以让配置的读取顺序不受限制;代价是写错 id 时 只会在挑选阶段表现为"挑不到模型"。
priority 优先级,数值越大越先被 pickFirst() 选中。
这个function 从 Visindigo 0.17.0 开始支持。
[since Visindigo 0.17.0] Visindigo::Agent::Provider &Provider::clearModels()
清空全部模型。
这个function 从 Visindigo 0.17.0 开始支持。
[since Visindigo 0.17.0] bool Provider::fromJson(const Visindigo::Utility::JsonConfig &json)
从 JSON 对象恢复。
存档里带有 id 时会一并恢复;没有 id 字段时保留当前(新生成的)id, 因而可以把手写的服务商片段直接读进来。
Note: 恢复只影响 id 与优先级,模型本身仍由 Center 的模型池提供。若模型池 里没有对应 id,该候选项会在挑选阶段被跳过,而不是在这里报错。
json 已解析的 JSON 对象。
return 读到了非空的 id 时返回 true。
这个function 从 Visindigo 0.17.0 开始支持。
[since Visindigo 0.17.0] QString Provider::getId() const
返回唯一标识。
这个function 从 Visindigo 0.17.0 开始支持。
[since Visindigo 0.17.0] QStringList Provider::getModelIds() const
返回全部模型 id。
这个function 从 Visindigo 0.17.0 开始支持。
[since Visindigo 0.17.0] qint32 Provider::getModelPriority(const QString &modelId) const
返回指定模型的优先级;该 id 不在本 Provider 中时返回 0。
modelId 模型 id。
这个function 从 Visindigo 0.17.0 开始支持。
[since Visindigo 0.17.0] QString Provider::getName() const
返回展示名称。
这个function 从 Visindigo 0.17.0 开始支持。
[since Visindigo 0.17.0] bool Provider::isValid() const
判断 Provider 是否至少持有一个模型 id。
Note: 它不检查这些 id 是否真的能在模型池里解析出来——那需要查询 Center, 而本函数在 Provider 的拷贝上也会被调用。
return 至少持有一个模型 id 时返回 true。
这个function 从 Visindigo 0.17.0 开始支持。
[since Visindigo 0.17.0] QString Provider::pickFirst(Visindigo::Agent::Model::Capabilities required) const
按优先级从高到低挑选第一个满足 required 的模型,返回其 id。
优先级相同时按 id 字典序决定先后,因此挑选结果与插入顺序无关,也不随 底层容器的遍历顺序变化——同一份配置在任意一次运行里都会挑出同一个模型。
满足条件指的是:该 id 能在 Center 的模型池里找到、该模型 Model::isValid() 为真、并且它的能力位包含 required 的全部位。传入 Model::Capability::None 表示只要求模型可用。
挑不到时返回空串;调用方应当据此放弃本次请求,而不是退回默认模型硬发。
这个function 从 Visindigo 0.17.0 开始支持。
[since Visindigo 0.17.0] QString Provider::pickNext(const QString &afterModelId, Visindigo::Agent::Model::Capabilities required) const
在 pickFirst() 的挑选顺序里,返回 afterModelId 之后第一个满足 required 的模型 id。
这是"降级重试"的入口:当前模型超时或被限流时换下一个继续,而不是直接 把失败抛给用户。afterModelId 不在本 Provider 中时,等价于 pickFirst()。
Note: 它不会回绕到序列开头。若 afterModelId 已是最后一个候选,返回空串; 调用方需要自行判断要不要从头再来一次,而不是让本函数悄悄循环——那样在 所有模型都不可用时就会变成死循环。
这个function 从 Visindigo 0.17.0 开始支持。
[since Visindigo 0.17.0] Visindigo::Agent::Provider &Provider::removeModel(const QString &modelId)
移除一个模型 id。id 不存在时什么也不做。
modelId 模型 id。
这个function 从 Visindigo 0.17.0 开始支持。
[since Visindigo 0.17.0] Visindigo::Agent::Provider &Provider::setName(const QString &name)
设置供展示的名称,例如服务商名。
name 展示名称。
这个function 从 Visindigo 0.17.0 开始支持。
[since Visindigo 0.17.0] Visindigo::Utility::JsonConfig Provider::toJson() const
序列化为 JSON 对象,形态为 "id": "...", "name": "...", "models": [{"id": "...", "priority": 0}]。
产物里只有 id,不含地址与凭据,因此可以安全地写进项目文件或随日志附上。
这个function 从 Visindigo 0.17.0 开始支持。