From 5da419afc9edff9429bb01d782b95c8bb54491f2 Mon Sep 17 00:00:00 2001 From: Vitalii Valkov Date: Sat, 8 Aug 2026 22:05:59 +0200 Subject: [PATCH 1/2] Name vendors after their APIs and split placeholder delivery vendor is renamed anthropic|openai. Naming the enum after CLIs is what produced the incoherent OpenAI binding: the row paired chatgpt.com -- the subscription host Codex calls -- with OPENAI_API_KEY, the variable that puts Codex in API-key mode addressing api.openai.com instead. A credential belongs to the API it authenticates; which CLI presents it is incidental. The old names stay as aliases on the same numbers, so nothing on the wire changes and no consumer has to recompile in lockstep. That leaves the database rows, the OpenZiti services, and the role attributes on live identities as the only things needing migration -- and lets them migrate one at a time rather than together. A placeholder is now typed. Codex reads its subscription credential from a file rather than an environment variable, and the two kinds have different writers: a variable must be on the container spec for a sandbox shell to inherit it, while a file lands at a CLI-specific path under HOME that only agynd can resolve. The attachment carries the kind and everything its writer needs. --- proto/agynio/api/llm/v1/llm.proto | 25 +++++++++++++++++++++---- 1 file changed, 21 insertions(+), 4 deletions(-) diff --git a/proto/agynio/api/llm/v1/llm.proto b/proto/agynio/api/llm/v1/llm.proto index fb38133..2acba9e 100644 --- a/proto/agynio/api/llm/v1/llm.proto +++ b/proto/agynio/api/llm/v1/llm.proto @@ -76,10 +76,24 @@ enum Protocol { // Vendor whose own consumer plan a Subscription holds a credential for. Closed: // each value fixes an intercepted host, an upstream, a protocol, a header set, // and the container placeholder variable name. +// Named after the API the credential authenticates. The old names are aliases +// on the same numbers. enum Vendor { + // buf:lint:ignore ENUM_NO_ALLOW_ALIAS + option allow_alias = true; VENDOR_UNSPECIFIED = 0; - VENDOR_CLAUDE = 1; - VENDOR_CODEX = 2; + VENDOR_ANTHROPIC = 1; + VENDOR_CLAUDE = 1 [deprecated = true]; + VENDOR_OPENAI = 2; + VENDOR_CODEX = 2 [deprecated = true]; +} + +// How a vendor's placeholder credential reaches the container. ENV is the +// orchestrator's to set; FILE is agynd's to write. +enum PlaceholderKind { + PLACEHOLDER_KIND_UNSPECIFIED = 0; + PLACEHOLDER_KIND_ENV = 1; + PLACEHOLDER_KIND_FILE = 2; } // =========================================================================== @@ -281,9 +295,12 @@ message SubscriptionAttachment { // Denormalized from the subscription, which cannot change vendor. Carried // here so the orchestrator gets role attributes without a second call. Vendor vendor = 3; - // Name of the container environment variable holding this vendor's - // placeholder credential. Empty for a vendor that has none. + PlaceholderKind placeholder_kind = 7; + // ENV kind only. string placeholder_env = 4; + // FILE kind only. Path is relative to HOME. + string placeholder_path = 8; + string placeholder_contents = 9; oneof target { string agent_id = 5; // UUID string environment_id = 6; // UUID From 08373dd8cb369889a3adad7bfa11c16f4e962328 Mon Sep 17 00:00:00 2001 From: Vitalii Valkov Date: Sat, 8 Aug 2026 23:35:19 +0200 Subject: [PATCH 2/2] Drop the prose comments --- proto/agynio/api/llm/v1/llm.proto | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/proto/agynio/api/llm/v1/llm.proto b/proto/agynio/api/llm/v1/llm.proto index 2acba9e..daf8500 100644 --- a/proto/agynio/api/llm/v1/llm.proto +++ b/proto/agynio/api/llm/v1/llm.proto @@ -76,8 +76,6 @@ enum Protocol { // Vendor whose own consumer plan a Subscription holds a credential for. Closed: // each value fixes an intercepted host, an upstream, a protocol, a header set, // and the container placeholder variable name. -// Named after the API the credential authenticates. The old names are aliases -// on the same numbers. enum Vendor { // buf:lint:ignore ENUM_NO_ALLOW_ALIAS option allow_alias = true; @@ -88,8 +86,6 @@ enum Vendor { VENDOR_CODEX = 2 [deprecated = true]; } -// How a vendor's placeholder credential reaches the container. ENV is the -// orchestrator's to set; FILE is agynd's to write. enum PlaceholderKind { PLACEHOLDER_KIND_UNSPECIFIED = 0; PLACEHOLDER_KIND_ENV = 1; @@ -296,9 +292,8 @@ message SubscriptionAttachment { // here so the orchestrator gets role attributes without a second call. Vendor vendor = 3; PlaceholderKind placeholder_kind = 7; - // ENV kind only. string placeholder_env = 4; - // FILE kind only. Path is relative to HOME. + // Relative to HOME. string placeholder_path = 8; string placeholder_contents = 9; oneof target {