55 lines
1.5 KiB
TypeScript
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
|
|
},
|
|
)
|