@genkit-ai/core
Version:
Genkit AI framework core libraries.
1 lines • 17.1 kB
Source Map (JSON)
{"version":3,"sources":["../src/reflectionApi.ts"],"sourcesContent":["/**\n * Copyright 2024 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport express from 'express';\nimport z from 'zod';\nimport { runWithStreamingCallback, Status, StatusCodes } from './action.js';\nimport { config } from './config.js';\nimport { logger } from './logging.js';\nimport * as registry from './registry.js';\nimport { toJsonSchema } from './schema.js';\nimport {\n cleanUpTracing,\n flushTracing,\n newTrace,\n setCustomMetadataAttribute,\n} from './tracing.js';\n\nexport const RunActionResponseSchema = z.object({\n result: z.unknown().optional(),\n error: z.unknown().optional(),\n telemetry: z\n .object({\n traceId: z.string().optional(),\n })\n .optional(),\n});\nexport type RunActionResponse = z.infer<typeof RunActionResponseSchema>;\n\nlet server;\n\nconst GLOBAL_REFLECTION_API_PORT_KEY = 'genkit__reflectionApiPort';\n\n/**\n * Starts a Reflection API that will be used by the Runner to call and control actions and flows.\n * @param port port on which to listen\n */\nexport async function startReflectionApi(port?: number | undefined) {\n if (global[GLOBAL_REFLECTION_API_PORT_KEY] !== undefined) {\n logger.warn(\n `Reflection API is already running on port ${global[GLOBAL_REFLECTION_API_PORT_KEY]}`\n );\n return;\n }\n\n if (!port) {\n port = Number(process.env.GENKIT_REFLECTION_PORT) || 3100;\n }\n global[GLOBAL_REFLECTION_API_PORT_KEY] = port;\n\n const api = express();\n\n api.use(express.json({ limit: '30mb' }));\n\n api.get('/api/__health', async (_, response) => {\n await registry.listActions();\n response.status(200).send('OK');\n });\n\n api.get('/api/__quitquitquit', async (_, response) => {\n logger.debug('Received quitquitquit');\n response.status(200).send('OK');\n await stopReflectionApi();\n });\n\n api.get('/api/actions', async (_, response, next) => {\n logger.debug('Fetching actions.');\n const actions = await registry.listActions();\n const convertedActions = {};\n Object.keys(actions).forEach((key) => {\n const action = actions[key].__action;\n convertedActions[key] = {\n key,\n name: action.name,\n description: action.description,\n metadata: action.metadata,\n };\n if (action.inputSchema || action.inputJsonSchema) {\n convertedActions[key].inputSchema = toJsonSchema({\n schema: action.inputSchema,\n jsonSchema: action.inputJsonSchema,\n });\n }\n if (action.outputSchema || action.outputJsonSchema) {\n convertedActions[key].outputSchema = toJsonSchema({\n schema: action.outputSchema,\n jsonSchema: action.outputJsonSchema,\n });\n }\n });\n // TODO: Remove try/catch when upgrading to Express 5; error is sent to `next` automatically\n // in that version\n try {\n response.send(convertedActions);\n } catch (err) {\n const { message, stack } = err as Error;\n next({ message, stack });\n }\n });\n\n api.post('/api/runAction', async (request, response, next) => {\n const { key, input } = request.body;\n const { stream } = request.query;\n logger.debug(`Running action \\`${key}\\`...`);\n let traceId;\n try {\n const action = await registry.lookupAction(key);\n if (!action) {\n response.status(404).send(`action ${key} not found`);\n return;\n }\n if (stream === 'true') {\n const result = await newTrace(\n { name: 'dev-run-action-wrapper' },\n async (_, span) => {\n setCustomMetadataAttribute('genkit-dev-internal', 'true');\n traceId = span.spanContext().traceId;\n return await runWithStreamingCallback(\n (chunk) => {\n response.write(JSON.stringify(chunk) + '\\n');\n },\n async () => await action(input)\n );\n }\n );\n await flushTracing();\n response.write(\n JSON.stringify({\n result,\n telemetry: traceId\n ? {\n traceId,\n }\n : undefined,\n } as RunActionResponse)\n );\n response.end();\n } else {\n const result = await newTrace(\n { name: 'dev-run-action-wrapper' },\n async (_, span) => {\n setCustomMetadataAttribute('genkit-dev-internal', 'true');\n traceId = span.spanContext().traceId;\n return await action(input);\n }\n );\n response.send({\n result,\n telemetry: traceId\n ? {\n traceId,\n }\n : undefined,\n } as RunActionResponse);\n }\n } catch (err) {\n const { message, stack } = err as Error;\n next({ message, stack, traceId });\n }\n });\n\n api.get('/api/envs', async (_, response) => {\n response.json(config.configuredEnvs);\n });\n\n api.get('/api/envs/:env/traces/:traceId', async (request, response) => {\n const { env, traceId } = request.params;\n logger.debug(`Fetching trace \\`${traceId}\\` for env \\`${env}\\`.`);\n const tracestore = await registry.lookupTraceStore(env);\n if (!tracestore) {\n return response.status(500).send({\n code: StatusCodes.FAILED_PRECONDITION,\n message: `${env} trace store not found`,\n });\n }\n // TODO: Remove try/catch when upgrading to Express 5; error is sent to `next` automatically\n // in that version\n try {\n const trace = await tracestore?.load(traceId);\n return trace\n ? response.json(trace)\n : response.status(404).send({\n code: StatusCodes.NOT_FOUND,\n message: `Trace with traceId=${traceId} not found.`,\n });\n } catch (err) {\n const error = err as Error;\n const { message, stack } = error;\n const errorResponse: Status = {\n code: StatusCodes.INTERNAL,\n message,\n details: {\n stack,\n },\n };\n return response.status(500).json(errorResponse);\n }\n });\n\n api.get('/api/envs/:env/traces', async (request, response, next) => {\n const { env } = request.params;\n const { limit, continuationToken } = request.query;\n logger.debug(`Fetching traces for env \\`${env}\\`.`);\n const tracestore = await registry.lookupTraceStore(env);\n if (!tracestore) {\n return response.status(500).send({\n code: StatusCodes.FAILED_PRECONDITION,\n message: `${env} trace store not found`,\n });\n }\n // TODO: Remove try/catch when upgrading to Express 5; error is sent to `next` automatically\n // in that version\n try {\n response.json(\n await tracestore.list({\n limit: limit ? parseInt(limit.toString()) : undefined,\n continuationToken: continuationToken\n ? continuationToken.toString()\n : undefined,\n })\n );\n } catch (err) {\n const { message, stack } = err as Error;\n next({ message, stack });\n }\n });\n\n api.get(\n '/api/envs/:env/flowStates/:flowId',\n async (request, response, next) => {\n const { env, flowId } = request.params;\n logger.debug(`Fetching flow state \\`${flowId}\\` for env \\`${env}\\`.`);\n const flowStateStore = await registry.lookupFlowStateStore(env);\n if (!flowStateStore) {\n return response.status(500).send({\n code: StatusCodes.FAILED_PRECONDITION,\n message: `${env} flow state store not found`,\n });\n }\n // TODO: Remove try/catch when upgrading to Express 5; error is sent to `next` automatically\n // in that version\n try {\n response.json(await flowStateStore?.load(flowId));\n } catch (err) {\n const { message, stack } = err as Error;\n next({ message, stack });\n }\n }\n );\n\n api.get('/api/envs/:env/flowStates', async (request, response, next) => {\n const { env } = request.params;\n const { limit, continuationToken } = request.query;\n logger.debug(`Fetching traces for env \\`${env}\\`.`);\n const flowStateStore = await registry.lookupFlowStateStore(env);\n if (!flowStateStore) {\n return response.status(500).send({\n code: StatusCodes.FAILED_PRECONDITION,\n message: `${env} flow state store not found`,\n });\n }\n // TODO: Remove try/catch when upgrading to Express 5; error is sent to `next` automatically\n // in that version\n try {\n response.json(\n await flowStateStore?.list({\n limit: limit ? parseInt(limit.toString()) : undefined,\n continuationToken: continuationToken\n ? continuationToken.toString()\n : undefined,\n })\n );\n } catch (err) {\n const { message, stack } = err as Error;\n next({ message, stack });\n }\n });\n\n api.use((err, req, res, next) => {\n logger.error(err.stack);\n const error = err as Error;\n const { message, stack } = error;\n const errorResponse: Status = {\n code: StatusCodes.INTERNAL,\n message,\n details: {\n stack,\n },\n };\n if (err.traceId) {\n errorResponse.details.traceId = err.traceId;\n }\n res.status(500).json(errorResponse);\n });\n\n server = api.listen(port, () => {\n console.log(`Reflection API running on http://localhost:${port}`);\n });\n\n server.on('error', (error) => {\n if (process.env.GENKIT_REFLECTION_ON_STARTUP_FAILURE === 'ignore') {\n logger.warn(\n `Failed to start the Reflection API on port ${port}, ignoring the error.`\n );\n logger.debug(error);\n } else {\n throw error;\n }\n });\n\n process.on('SIGTERM', async () => await stopReflectionApi());\n}\n\n/**\n * Stops Reflection API and any running dependencies.\n */\nasync function stopReflectionApi() {\n await Promise.all([\n new Promise<void>((resolve) => {\n if (server) {\n server.close(() => {\n logger.info('Reflection API has succesfully shut down.');\n resolve();\n });\n } else {\n resolve();\n }\n }),\n cleanUpTracing(),\n ]);\n process.exit(0);\n}\n"],"mappings":"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","names":[]}