You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
reacted with thumbs up emoji reacted with thumbs down emoji reacted with laugh emoji reacted with hooray emoji reacted with confused emoji reacted with heart emoji reacted with rocket emoji reacted with eyes emoji
Uh oh!
There was an error while loading. Please reload this page.
相关:#400(per-sender NyxID binding,同属 NyxID ↔ aevatar 边界)
背景
aevatar 目前选模型只有"用户 prefer 一个 model"或"每次 chat 单选"两种方式。问题:
/api/v1/llm/status只返回 auto-seeded provider(OpenAI/Anthropic/Google 等),过滤是provider_config_id != null(NyxIDbackend/src/services/llm_gateway_service.rs:319-335)DownstreamService,gateway 看不到,只能走/api/v1/proxy/s/{slug}/...NyxIdLlmEndpointResolver.cs:17),通用 service 上的 LLM 入口完全不可见提议
切成三层,每层职责清晰,事实流单向:
Layer 1 — Detect-all scripting 做发现
写一个 aevatar scripting(
Aevatar.Scripting.*体系),用户触发或 cron 调度后自动跑:NyxIdApiClient.DiscoverProxyServicesAsync()(已存在,src/Aevatar.AI.ToolProviders.NyxId/NyxIdApiClient.cs:247-248),列出该用户所有 connected serviceGET /api/v1/proxy/s/{slug}/v1/models,NyxID 的proxy_request_via_slug(backend/src/handlers/proxy.rs:130-173)自动注入凭证转发到上游关键性质:探测出来的事实——不依赖 NyxID metadata("不会被 NyxID 欺骗"),NyxID 自己加不加 capability 字段都不影响信任源。
Layer 2 —
LlmProviderCatalogGAgent持有事实源actor 化的 catalog,按 CLAUDE.md "actor 即业务实体":
Map<binding_id, ProviderBinding>,每条{ nyxid_slug, base_path, discovered_models[], last_probed_at, probe_status, capabilities, user_disabled }RescanProviders/RefreshBinding/MarkDisabled/MarkEnabledProvidersDiscovered/BindingUpdated/BindingDisabledLlmProviderCatalogReadModel,UI 选择和 policy resolver 都从这里读跟 scripting 的合一/解耦是待决问题 #2。
Layer 3 — Workflow 只做机械的 model 选择
workflow 不承担 router 职责:
{ preferred_binding, conditions[], fallback_chain[], budget_cap }(context, catalog_readmodel, policy, attempt_n) → (binding, model_id),挂在LLMCallModule.HandleStepRequestAsync的 model 解析 hook 上retry/on_error: fallback直接驱动 attempt 自增,不用炸图这一层全程机械执行,不涉及发现、信任判断、metadata 推理。
对 NyxID 的依赖
MVP 不需要 NyxID 改动:
/api/v1/proxy/services+/api/v1/proxy/s/{slug}/v1/models转发已经够。可推动但不阻塞:让 NyxID 在 service model 上加 capability hint(如
service_type: llm、openai_compatible: true),只作为 probe 提示——优先扫这些 service、其他降优先级,不作为信任源。理由是"减少无效 probe 流量 + 加速发现",谈判位置好。待决问题
IScriptBehaviorRuntimeCapabilities目前不含 HTTP。开IHttpInvokeCapability单独走?还是 scripting orchestrate + 专门ProbeAgent做 I/O(scripting 只发命令、收事件、写状态)?倾向后者/v1/models外要不要做最小 chat completion / tool-use probe 验证能力?还是只信 model id 命名规则?claude-sonnet-4-5)在多个 NyxID service 上都能跑,policy 怎么 disambiguate(cost / latency / 用户指定 binding)?落地顺序(建议)
NyxIdApiClient.ProbeModelsAsync(slug)+ OpenAI-compatible model list 解析LLMCallModule接入 resolver hook,替换Metadata["aevatar.model_override"]的硬来源model_policy字段aevatar llm catalog list/rescan/disable {slug}评论区留给 layer 边界、scripting 形态(待决 1 + 2)、policy schema、observability 选型讨论。
All reactions