El equipo de Firebase en Google acaba de lanzar la versión 1.0 de Genkit para Node.js, lo que significa que está listo para la producción y listo para ayudarle a construir la próxima generación de aplicaciones basadas en IA.
¿Qué es Genkit?
Genkit es un framework diseñado para ayudarte a crear aplicaciones y funciones potenciadas por IA. Proporciona bibliotecas de código abierto para Node.js y Go, así como herramientas de desarrollo para pruebas y depuración. Genkit está diseñado como una solución del lado del servidor.
Teniendo esto en cuenta, ¿cómo pueden aprovechar Genkit los desarrolladores de Angular? Exploremos algunas de las opciones de arquitectura disponibles.
Conexión a Genkit en Angular
Dado que las API de Genkit están diseñadas para ser utilizadas en el servidor, se recomienda utilizar un backend basado en Node o Go. Para un backend basado en Node, lo más sencillo consiste en instalar las dependencias necesarias (genkit y @genkit-ai/googleai
), seleccionar un modelo y enviar un prompt. He aquí un ejemplo:
import { genkit } from 'genkit';
import { googleAI, gemini20Flash } from '@genkit-ai/googleai';
const ai = genkit({
plugins: [googleAI()],
model: gemini20Flash, // Set default model
});
// Simple generation
const { text } = await ai.generate('Why is AI awesome?');
console.log(text);
En una aplicación Angular con SSR habilitado, se genera un backend Node para ti. Puedes añadir el código de conexión en el archivo server.tsfile y crear endpoints para comunicarte con el frontend de la aplicación Angular.
/* server.ts */
//… other required imports
import { genkit } from 'genkit';
import { googleAI, gemini20Flash } from '@genkit-ai/googleai';
/* … */
const app = express();
const commonEngine = new CommonEngine();
// Initialize Genkit
const ai = genkit({
plugins: [googleAI()],
model: gemini20Flash, // Set default model
});
// Create an API return the output of the prompt to the client
app.get('/api/ai', (req, res, next) => {
// Simple generation
ai.generate('Why is AI awesome?')
.then(({text}) => res.json(text))
.catch(next);
});
/* … */
export default app;
Ahora una petición a /api/ai devuelve una respuesta del modelo Gemini 2.0 Flash. Debido a que Genkit soporta un creciente ecosistema de proveedores de modelos, este ejemplo puede ser actualizado a un modelo diferente. Puedes utilizar Gemini a través de Google AI o Vertex AI, además de proveedores de terceros como OpenAI, Anthropic, etc.
El ejemplo anterior proporciona un buen punto de partida, pero podemos ampliarlo y aprovechar aún más las características de Genkit. Podemos actualizar el ejemplo para transmitir la respuesta del modelo con la API streamFlow
.
/* Within the SampleComponent class, you can leverage the streamFlow API */
…
import { streamFlow } from 'genkit/beta/client';
const url = 'http://127.0.0.1:3400/streamCharacters';
@Component({ … })
export class SampleComponent {
…
async callFlow() {
try {
const response = streamFlow({url, input: parseInt(this.count()),});
for await (const chunk of response.stream) {
this.characters.set(chunk);
}
this.loading.set(false);
} catch (e) {
/* … handle the error */
}
}
}
La transmisión de la respuesta ayuda a crear la conocida experiencia de estilo «AI typing» al interactuar con los modelos subyacentes.
En el lado del servidor, la implementación utiliza una respuesta estructurada con un esquema zod y la API defineFlow para crear un flujo que se puede exponer desde el lado del servidor y al que se puede acceder desde el cliente a través de HTTP.
He aquí un ejemplo de definición de un flujo que crea un flujo de diferentes personajes de juegos RPG:
export const streamCharacters = ai.defineFlow({
name: 'streamCharacters',
inputSchema: z.number(),
outputSchema: z.string(),
streamSchema: GameCharactersSchema,
},
async (count, { sendChunk }) => {
const { response, stream } = await ai.generateStream({
model: gemini20Flash,
output: {
format: 'json',
schema: GameCharactersSchema,
},
config: {
temperature: 1,
},
prompt: `Respond as JSON only. Generate ${count} different RPG game characters.`,
});
let buffer = '';
for await (const chunk of stream) {
buffer += chunk.content[0].text!;
if (buffer.length > 10) {
sendChunk(parse(maybeStripMarkdown(buffer), Allow.ALL));
}
}
return (await response).text;
});
Echa un vistazo al ejemplo completo en el ejemplo streaming-json en el repositorio de Firebase para ver este código con mayor detalle e incluso probarlo tú mismo.
Probando y depurando tus datos y flujos de trabajo AI
Uno de los retos del desarrollo con LLMs es la naturaleza aparentemente opaca de sus interacciones y la falta de una pieza de observabilidad.
Genkit proporciona herramientas adicionales para el desarrollador que le permiten comprender lo que ocurre durante sus interacciones con el modelo.
Además de la CLI de Genkit, existe la interfaz de usuario para desarrolladores de Genkit. Genkit Developer UI es una aplicación web local que permite ejecutar, depurar y probar flujos, avisos y otros elementos.
Aquí está la Developer UI en acción:
Hay más herramientas para desarrolladores disponibles, para saber más consulta la documentación.
Empieza a crear hoy mismo
Este post sólo cubre una interacción básica con Genkit, hay mucho más disponible para ti a través de la robusta API incluyendo:
Conversaciones multi-giro con gestión de contexto
- Uso de herramientas en las que la IA puede llamar a funciones de tu aplicación
- Flujos de trabajo humanos en los que colaboran la IA y los usuarios.
- Generación consciente del contexto que aprovecha los datos de su aplicación
- Genkit simplifica significativamente la interacción y la integración del modelo de IA para que pueda centrarse en crear experiencias de usuario increíbles.
Con todas las grandes características recientemente lanzadas en Angular y la versión lista para producción de Genkit, los desarrolladores tienen hoy las herramientas necesarias para construir las próximas grandes aplicaciones web impulsadas por IA. Las posibilidades son enormes y estamos impacientes por ver todas las cosas geniales que vas a crear.
Asegúrate de visitar angular.dev y firebase.google.com/docs/genkit para conocer las últimas novedades y características.