跳到正文
Yayin Story Studio Yayin Story Studio 项目文档

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。

Note: 返回顺序是 id 的字典序,不是优先级顺序。需要按优先级遍历请使用 pickFirst() 与 pickNext()。

这个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 开始支持。