Your action can have a fetchers property that is an array of fetcher objects.

Example:

export const createChatCompletion = createAction({
  //...
  fetchers: [
    {
      id: 'fetchModels',
      dependencies: ['baseUrl', 'apiVersion'],
      fetch: async ({ credentials, options }) => {
        const baseUrl = options?.baseUrl ?? defaultOpenAIOptions.baseUrl
        const config = {
          apiKey: credentials.apiKey,
          baseURL: baseUrl ?? defaultOpenAIOptions.baseUrl,
          defaultHeaders: {
            'api-key': credentials.apiKey,
          },
          defaultQuery: options?.apiVersion
            ? {
                'api-version': options.apiVersion,
              }
            : undefined,
        } satisfies ClientOptions

        const openai = new OpenAI(config)

        const models = await openai.models.list()

        return (
          models.data
            .filter((model) => model.id.includes('gpt'))
            .sort((a, b) => b.created - a.created)
            .map((model) => model.id) ?? []
        )
      },
    },
  ],
})

A fetcher object has the following properties: id, dependencies, and fetch.

id is a string that uniquely identifies the fetcher. When you want an option field to be populated by the fetcher, you can use the fetcher’s id as the value of the option field.

dependencies is an array of strings that are the names of the option fields that the fetcher depends on. When any of the option fields in the dependencies array changes, the fetcher will be re-run.

fetch is an async function that takes an object with the following properties: credentials, options and returns a list of strings. It can also return a list of objects with the following properties: value, label. The value property is the value of the option field and the label property is the label of the option field. (Promise<(string | { label: string; value: string })[]>)