Files
recap-relay/startos/actions/setGeminiKey.ts
T
2026-05-11 20:03:27 -05:00

55 lines
1.5 KiB
TypeScript

import { sdk } from '../sdk'
import { configFile } from '../file-models/config.json'
const { InputSpec, Value } = sdk
// The operator's Gemini API key. This is the relay's primary backend
// — Recap requests for both transcribe and analyze go to Gemini first,
// and only spill to the optional Parakeet/Gemma backends once a user
// exceeds their tier's monthly Gemini cap.
//
// Free key from https://aistudio.google.com/apikey. Track usage in
// the Google AI Studio dashboard to know what tier pricing should be.
const inputSpec = InputSpec.of({
relay_gemini_api_key: Value.text({
name: 'Gemini API Key',
description:
'The relay\'s Google Gemini API key. Used for transcribe + analyze forwarding. Get one at https://aistudio.google.com/apikey',
required: true,
default: null,
masked: true,
minLength: 1,
maxLength: 256,
}),
})
export const setGeminiKey = sdk.Action.withInput(
'set-gemini-key',
async ({ effects }) => ({
name: 'Set Gemini API Key',
description:
"The operator's Gemini key. Required — the relay will refuse to serve traffic until this is set.",
warning: null,
allowedStatuses: 'any',
group: null,
visibility: 'enabled',
}),
inputSpec,
async ({ effects }) => {
const config = await configFile.read().once()
return {
relay_gemini_api_key: config?.relay_gemini_api_key || undefined,
}
},
async ({ effects, input }) => {
await configFile.merge(effects, {
relay_gemini_api_key: input.relay_gemini_api_key,
})
return null
},
)