Skip to content

feat(ailogic): add ailogic:config CLI commands - #10850

Merged
marb2000 merged 19 commits into
mainfrom
feat/ailogic-configs
Jul 28, 2026
Merged

feat(ailogic): add ailogic:config CLI commands#10850
marb2000 merged 19 commits into
mainfrom
feat/ailogic-configs

Conversation

@marb2000

Copy link
Copy Markdown
Member

Note

Replaces #10841, moved from my fork to a branch on the main repo as requested by @joehan. The branch is identical to the fork's, including all of @joehan's review nits (help text on every command, changelog dropped while behind the flag, empty comment blocks removed, single-use helpers inlined).

Description

Adds the firebase ailogic:config:* commands to read and modify Firebase AI Logic configuration, gated behind the ailogic experiment (same as ailogic:providers).

  • ailogic:config:get [path] reads the config. With no path it prints the whole resource; with a path it prints one value. Providers appear as read-only status derived from API enablement.
  • ailogic:config:set <path> <value> writes one setting. Developer-facing paths map to the underlying resource fields:
    • security.auth-only -> trafficFilter.firebaseAuthRequired
    • security.template-only -> trafficFilter.templateOnly
    • monitoring.state -> telemetryConfig.mode (ALL/NONE)
    • monitoring.sample-rate-percentage -> telemetryConfig.samplingRate (an integer percent 1-100 exposed as the API's (0,1] fraction)

Tightening security.auth-only or security.template-only from false to true prompts for confirmation because existing clients start getting rejected; confirm() enforces --force in non-interactive mode. Input (path and value) is validated up front, before the API-enablement flow, so bad input fails fast.

Depends on #10849 (ailogic:providers). This branch is rebased on top of that one, so until #10849 merges the diff here also shows the provider commits; once #10849 lands in main the diff narrows to the config-only changes automatically. Please review the ailogic-config-* and config-related gcp/ailogic.ts changes here; the provider files are the already-approved #10849 content.

Scenarios Tested

  • Unit tests: ailogic-config-get.spec.ts, ailogic-config-set.spec.ts, plus getConfig/updateConfig in gcp/ailogic.spec.ts. Covers unknown path, non-boolean and out-of-range values, false->true tightening confirmation, non-interactive-without-force, value/field mapping, nested-path reads, and fail-fast-before-enablement.
  • npm run build, npm run lint, and tsc --noEmit are clean.
  • Commands are hidden by default and appear under FIREBASE_CLI_EXPERIMENTS=ailogic.

Sample Commands

firebase experiments:enable ailogic
firebase ailogic:config:get
firebase ailogic:config:get security.auth-only
firebase ailogic:config:set security.auth-only true
firebase ailogic:config:set monitoring.sample-rate-percentage 50

marb2000 and others added 16 commits July 8, 2026 09:42
Add `firebase ailogic:providers:{enable,disable,list}` to manage the
Gemini API providers (Gemini Developer API and Agent Platform Gemini API)
for Firebase AI Logic from the CLI.

- providers:enable enables the Firebase AI Logic API and the selected
  provider's underlying API; agent-platform-gemini-api requires the Blaze
  (pay-as-you-go) plan.
- providers:disable prompts for confirmation (--force to skip) and turns
  off the proxy when no providers remain enabled.
- providers:list reports which providers are enabled.
- Adds a shared interactive enablement flow (used when the API is not yet
  enabled) that checks enable permission up front before prompting.
- Adds `firebase help <namespace>` listing of subcommands under a prefix
  so ailogic commands are discoverable.

Requires the firebasevertexai and serviceusage IAM permissions; commands
support --json and --non-interactive.
- Rename provider id agent-platform-gemini-api -> gemini-agent-platform-api
  for symmetry with gemini-developer-api (paulb777).
- Centralize provider-type validation in ailogic.parseProviderType/isProviderType
  and reuse it in the enable/disable commands instead of copying the union
  (christhompsongoogle).
- Add AILOGIC_LOGGING_PREFIX constant; replace the repeated 'ailogic' literals.
- Move enablement-cache invalidation into serviceusage.disableServiceAndPoll and
  drop the per-callsite uncache calls; rename its 'prefix' param to loggingPrefix.
- Drop the redundant non-interactive guard in disable; confirm() already enforces
  --force in non-interactive mode.
- Gate the ailogic commands behind a new 'ailogic' experiment until API-council
  approval.
- Document the help.ts namespace-listing blocks.
- Update/extend unit tests accordingly.
Add `firebase ailogic:config:get [path]` and `ailogic:config:set <path> <value>`
to read and write Firebase AI Logic service configuration from the CLI.

- config:get prints the full config (providers, security, monitoring) or a
  single value by path; it is read-only and reports "not enabled" gracefully
  rather than forcing API enablement.
- config:set updates one setting. Tightening security.auth-only or
  security.template-only from false to true prompts for confirmation
  (--force to skip); monitoring.sample-rate-percentage is validated as an
  integer 1-100.
- Developer-facing paths map onto the underlying config resource
  (trafficFilter.*, telemetryConfig.*), with sample rate stored as a fraction.

Supports --json and --non-interactive.
- Bring config commands under the ailogic experiment gate (via cherry-pick of the
  providers review fixes) and inherit the provider rename + centralized validation.
- config:get/config:set: single source of valid paths (fixes get's validate-vs-error
  mismatch); rename provider id to gemini-agent-platform-api.
- config:set: drop the redundant non-interactive guard (confirm() enforces --force),
  use utils.logSuccess, extract a bool parser, validate the path before the
  API-enablement flow.
- gcp: GLOBAL_LOCATION constant for the config resource; AILOGIC_LOGGING_PREFIX in
  isAILogicApiEnabled.
- Add ailogic-config-get.spec.ts and ailogic-config-set.spec.ts.
- config:set validates the value before the API-enablement flow (fail-fast) and
  returns a {path, value} result so --json produces output.
- config:get path traversal uses an isRecord type guard instead of an `as` cast;
  provider keys/paths derive from ailogic.PROVIDER_TYPES (no duplicated literals).
- Add tests: monitoring.state=false -> NONE, template-only tightening, nested-path
  get, and fail-fast-before-enablement.
- Critical: register ailogic:config commands INSIDE the experiment gate; a
  rebase had left them outside, which crashed CLI startup for users without the
  ailogic experiment (client.ailogic was undefined).
- parseBool accepts case-insensitive true/false.
- listProviders runs its two independent enablement checks in parallel.
- Remove the unused security-rules layer (generateRulesContent, getSecurityRules,
  updateSecurityRules, the rules import, and their tests); nothing references it.
- Single source for config paths: WRITABLE_CONFIG_PATHS exported from gcp/ailogic,
  READABLE derived from it; shared assertKnownConfigPath error helper; shared
  samplingRateToPercent/percentToSamplingRate codec (both directions were
  hand-coded in each command).
- config:get validates the path before any API call and only checks provider
  enablement when the requested path needs it.
- config:set: buildUpdate is now the single per-path decision site (folds in the
  confirmation message and current-value read), the switch is exhaustive so a new
  path cannot silently fall into the sample-rate branch, the percentage requires a
  plain decimal integer (Number() also accepted hex and scientific notation), and
  the --json result echoes the normalized value.
- ensureAILogicApiEnabled reuses isAILogicApiEnabled instead of inlining the check.
- config:set preflights serviceusage.services.get (ensureAILogicApiEnabled reads
  enablement state via Service Usage; without it a cold cache surfaced a raw 403
  mid-command despite passing requirePermissions).
- Echo a normalized sample-rate value ('007' -> '7') so the success message and
  --json output match what was stored.
- ensureAILogicApiEnabled honors --force for its enable confirmation and the
  provider selection offers a cancel choice (the Spark-plan retry loop had no
  exit besides Ctrl+C).
- Strengthen provider specs: pin each provider to its own API via withArgs (a
  swapped destructure passed before) and assert the disable cross-check consults
  the other provider's API.
- Add detailed .help() text to ailogic:config:get/set and
  ailogic:providers:enable/disable documenting allowed values
- Drop CHANGELOG entries while the feature is behind the experiment flag
- Remove empty JSDoc blocks in gcp/ailogic.ts
- Inline single-use sampling-rate conversions instead of exporting helpers
- listProviders now reports a provider as enabled only when the Firebase
  AI Logic API (firebasevertexai.googleapis.com) is also enabled, so
  providers:list can no longer disagree with other ailogic commands about
  whether AI Logic is enabled on the project
- enableProvider enables the AI Logic API before the provider's service
  API, so a partial failure cannot land in that inconsistent state
@wiz-9635d3485b

wiz-9635d3485b Bot commented Jul 27, 2026

Copy link
Copy Markdown

Wiz Scan Summary

Scanner Findings
Vulnerability Finding Vulnerabilities -
Data Finding Sensitive Data -
Secret Finding Secrets -
IaC Misconfiguration IaC Misconfigurations -
SAST Finding SAST Findings 1 Low
Software Management Finding Software Management Findings -
Total 1 Low

View scan details in Wiz

To detect these findings earlier in the dev lifecycle, try the Wiz Code extension for VS Code, JetBrains, or Visual Studio.

@gemini-code-assist gemini-code-assist Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code Review

This pull request introduces the firebase ailogic command surface, gated behind the ailogic experiment, to manage Firebase AI Logic configurations and Gemini API providers. It adds commands to get and set configurations (ailogic:config:get, ailogic:config:set) and to manage providers (ailogic:providers:list, ailogic:providers:enable, ailogic:providers:disable). Additionally, the help command is updated to support namespace-based subcommand listings, and new API caching/uncaching mechanisms are introduced to keep the local enablement state consistent. Comprehensive unit tests have been added for all new commands and GCP service interactions. There are no review comments, so I have no additional feedback to provide.

marb2000 added 2 commits July 26, 2026 22:31
…ive help

The custom namespace walk in the help command predates #10772, which
auto-registers a commander command for every namespace. getCommand now
always resolves namespaces to those commands, so the walk was
unreachable (and mishandled function-valued intermediate nodes like
client.ext, as flagged by review). firebase help ailogic:providers and
firebase help ext:dev are both served by progressive help.

Also remove two empty JSDoc blocks.
# Conflicts:
#	src/commands/ailogic-providers-disable.ts
#	src/commands/ailogic-providers-enable.ts
#	src/commands/index.ts
#	src/gcp/ailogic.spec.ts
#	src/gcp/ailogic.ts
@marb2000
marb2000 force-pushed the feat/ailogic-configs branch from fa5531b to c77707a Compare July 28, 2026 06:18
@marb2000
marb2000 merged commit eb2fab9 into main Jul 28, 2026
52 of 53 checks passed
@marb2000
marb2000 deleted the feat/ailogic-configs branch July 28, 2026 06:40
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants