diff --git a/samples/idx-template.json b/samples/idx-template.json index 64fa3a14c5..dc88e63cbb 100644 --- a/samples/idx-template.json +++ b/samples/idx-template.json @@ -16,7 +16,8 @@ "options": { "js-character-generator": "Simple Character Generator", "js-coffee-shop": "Coffeeshop w Several types of Prompt", - "js-schoolAgent": "A Multi-Agent School Assistant" + "js-schoolAgent": "A Multi-Agent School Assistant", + "js-prompts": "A sample with various prompt styles" } } ] diff --git a/samples/js-prompts/.idx/dev.nix b/samples/js-prompts/.idx/dev.nix new file mode 100644 index 0000000000..873d601371 --- /dev/null +++ b/samples/js-prompts/.idx/dev.nix @@ -0,0 +1,43 @@ +## Default Nix Environment for Typescript + Gemini Examples +## Requires the sample to be started with npx run genkit:dev + +# To learn more about how to use Nix to configure your environment +# see: https://developers.google.com/idx/guides/customize-idx-env +{ pkgs, ... }: { + # Which nixpkgs channel to use. + channel = "stable-24.05"; # or "unstable" + # Use https://search.nixos.org/packages to find packages + packages = [ + pkgs.nodejs_20 + pkgs.util-linux + ]; + # Sets environment variables in the workspace + env = { + #TODO Get a API key from https://g.co/ai/idxGetGeminiKey + GOOGLE_GENAI_API_KEY = ""; + }; + idx = { + # Search for the extensions you want on https://open-vsx.org/ and use "publisher.id" + extensions = [ + ]; + + # Workspace lifecycle hooks + workspace = { + # Runs when a workspace is first created + onCreate = { + npm-install = "npm ci --no-audit --prefer-offline --no-progress --timing"; + default.openFiles = [ "README.md" "src/index.ts" ]; + }; + # Runs when the workspace is (re)started + onStart = { + run-server = "if [ -z \"\${GOOGLE_GENAI_API_KEY}\" ]; then \ + echo 'No Gemini API key detected, enter a Gemini API key from https://aistudio.google.com/app/apikey:' && \ + read -s GOOGLE_GENAI_API_KEY && \ + echo 'You can also set the key in .idx/dev.nix to automatically add to your workspace' + export GOOGLE_GENAI_API_KEY; \ + fi && \ + npm run genkit:dev"; + }; + }; + }; +} \ No newline at end of file diff --git a/samples/prompts/README.md b/samples/js-prompts/README.md similarity index 100% rename from samples/prompts/README.md rename to samples/js-prompts/README.md diff --git a/samples/prompts/package-lock.json b/samples/js-prompts/package-lock.json similarity index 97% rename from samples/prompts/package-lock.json rename to samples/js-prompts/package-lock.json index 49e253a716..e6c42dd0a3 100644 --- a/samples/prompts/package-lock.json +++ b/samples/js-prompts/package-lock.json @@ -9,13 +9,14 @@ "version": "1.0.0", "license": "ISC", "dependencies": { - "@genkit-ai/googleai": "^0.9.0-rc || ^0.9", + "@genkit-ai/express": "^1.0.0-rc.14", + "@genkit-ai/googleai": "^1.0.0-rc.14", "express": "^4.21.0", - "genkit": "^0.9.0-rc || ^0.9", + "genkit": "^1.0.0-rc.14", "zod": "^3.23.8" }, "devDependencies": { - "genkit-cli": "^0.9.0-rc || ^0.9", + "genkit-cli": "^1.0.0-rc.14", "typescript": "^5.5.4" } }, @@ -436,14 +437,15 @@ } }, "node_modules/@genkit-ai/ai": { - "version": "0.9.12", - "resolved": "https://registry.npmjs.org/@genkit-ai/ai/-/ai-0.9.12.tgz", - "integrity": "sha512-xyVVAIGKNpj5zCkoEfWZkzwctl0/hmpX6vKZgdgMH2MiqP5LzTp7rUekBMon8c1rMDVAze97QVSjAmZIoMLSlA==", + "version": "1.0.0-rc.14", + "resolved": "https://registry.npmjs.org/@genkit-ai/ai/-/ai-1.0.0-rc.14.tgz", + "integrity": "sha512-5CHyRixumiM5uHkzwHl7IWbrYSzWvhDvYAsMoq9mmI8iCJA9g/3u8JOcHSRiseuaap5gv/QGm809IpIlak55ZA==", "dependencies": { - "@genkit-ai/core": "0.9.12", + "@genkit-ai/core": "1.0.0-rc.14", "@opentelemetry/api": "^1.9.0", "@types/node": "^20.11.19", "colorette": "^2.0.20", + "dotprompt": "^1.0.0-dev.3 || ^1", "json5": "^2.2.3", "node-fetch": "^3.3.2", "partial-json": "^0.1.7", @@ -451,9 +453,9 @@ } }, "node_modules/@genkit-ai/core": { - "version": "0.9.12", - "resolved": "https://registry.npmjs.org/@genkit-ai/core/-/core-0.9.12.tgz", - "integrity": "sha512-QPJZ3TL5Iq2fyeo30MpUjd3ZLcYQf97RsitDZhMbGy3vMwbgig0nhEbJ6v/qaWsOMqSfIxJE/gETY3mMts1vRg==", + "version": "1.0.0-rc.14", + "resolved": "https://registry.npmjs.org/@genkit-ai/core/-/core-1.0.0-rc.14.tgz", + "integrity": "sha512-8h0Vl3SCP0vYIN60uELaZWEAP6BjLxXTcoWv2MFn7khxblzVkMWq98IxPThHo3s5BGB+Pxnhnsywdb/ItliFUA==", "dependencies": { "@opentelemetry/api": "^1.9.0", "@opentelemetry/context-async-hooks": "^1.25.0", @@ -461,11 +463,13 @@ "@opentelemetry/sdk-metrics": "^1.25.0", "@opentelemetry/sdk-node": "^0.52.0", "@opentelemetry/sdk-trace-base": "^1.25.0", + "@types/json-schema": "^7.0.15", "ajv": "^8.12.0", "ajv-formats": "^3.0.1", "async-mutex": "^0.5.0", "body-parser": "^1.20.3", "cors": "^2.8.5", + "dotprompt": "^1.0.0-dev.3 || ^1", "express": "^4.21.0", "get-port": "^5.1.0", "json-schema": "^0.4.0", @@ -473,39 +477,40 @@ "zod-to-json-schema": "^3.22.4" } }, - "node_modules/@genkit-ai/dotprompt": { - "version": "0.9.12", - "resolved": "https://registry.npmjs.org/@genkit-ai/dotprompt/-/dotprompt-0.9.12.tgz", - "integrity": "sha512-eEHBRzRVemiPuqCBbXiLgltNWpmCHmC+gVHBhsAnrfOYBlwmPvh2nnAPBXGYnkDH87PuN11jg8YJQmO4kQuoSw==", + "node_modules/@genkit-ai/express": { + "version": "1.0.0-rc.14", + "resolved": "https://registry.npmjs.org/@genkit-ai/express/-/express-1.0.0-rc.14.tgz", + "integrity": "sha512-I8VcuV2iyJXs/X3nCQZ/UR+FIO7XwaBo6+KWSDnugJrCweQZQ0LCYHbinSp1obLm/xCML7CWnqpZTX87mnbe3w==", "dependencies": { - "@genkit-ai/ai": "0.9.12", - "@genkit-ai/core": "0.9.12", - "front-matter": "^4.0.2", - "handlebars": "^4.7.8", - "node-fetch": "^3.3.2" + "body-parser": "^1.20.3", + "cors": "^2.8.5" + }, + "peerDependencies": { + "express": "^4.21.1", + "genkit": "^1.0.0-rc.14" } }, "node_modules/@genkit-ai/googleai": { - "version": "0.9.12", - "resolved": "https://registry.npmjs.org/@genkit-ai/googleai/-/googleai-0.9.12.tgz", - "integrity": "sha512-q6bX9Nq4xVpzH4vd9W+rg4xO7SVodG516K4BVM04DtxU5w0ogwLl/mRPEU0VIoISjD6FwaC4sPjPkEerTp8a4g==", + "version": "1.0.0-rc.14", + "resolved": "https://registry.npmjs.org/@genkit-ai/googleai/-/googleai-1.0.0-rc.14.tgz", + "integrity": "sha512-zeEWzPhVUpi6iJ7fHS4Hn1WnwrNLyA02LNHG6f/9iaEkCQJBbV3YHHdpRA2lIXSAwhdx619KPBoFRM2JeGm9YQ==", "dependencies": { "@google/generative-ai": "^0.21.0", "google-auth-library": "^9.6.3", "node-fetch": "^3.3.2" }, "peerDependencies": { - "genkit": "0.9.12" + "genkit": "^1.0.0-rc.14" } }, "node_modules/@genkit-ai/telemetry-server": { - "version": "0.9.12", - "resolved": "https://registry.npmjs.org/@genkit-ai/telemetry-server/-/telemetry-server-0.9.12.tgz", - "integrity": "sha512-8w1O9LOUtMCGc8bx+Vcd5D68L8ctM6H544Vxnfvy8gx4JHV5dj7vQiI9YDgm65pgP15pytQzt1TcRtOtYoimFw==", + "version": "1.0.0-rc.14", + "resolved": "https://registry.npmjs.org/@genkit-ai/telemetry-server/-/telemetry-server-1.0.0-rc.14.tgz", + "integrity": "sha512-cFxLS8IkXhRds9+wgaru3QirgehQImG9CuhLfjo09MRcIM21Vr9F083YVnlO8WDckWz5NwclkfFKkD25FDpE/w==", "dev": true, "dependencies": { "@asteasolutions/zod-to-openapi": "^7.0.0", - "@genkit-ai/tools-common": "0.9.12", + "@genkit-ai/tools-common": "1.0.0-rc.14", "@google-cloud/firestore": "^7.6.0", "@opentelemetry/api": "^1.9.0", "@opentelemetry/context-async-hooks": "^1.25.0", @@ -519,14 +524,16 @@ } }, "node_modules/@genkit-ai/tools-common": { - "version": "0.9.12", - "resolved": "https://registry.npmjs.org/@genkit-ai/tools-common/-/tools-common-0.9.12.tgz", - "integrity": "sha512-A9ToM/CY6vxcBSw4o47Q7qrpMaRsk4P6ZuzoDMlCzCVI+RZN5ulTL4LXMrq6nQ/KxY1GT94bSoulROXBMzW/Gw==", + "version": "1.0.0-rc.14", + "resolved": "https://registry.npmjs.org/@genkit-ai/tools-common/-/tools-common-1.0.0-rc.14.tgz", + "integrity": "sha512-50PE/CIL3u9YC4c3vifz6CVSlC1cmQ3xAHMOsUxsRRvcPzIbL8jOCYMKAnbdgAkp0WGgWG+fLjiKbUPZydEgcg==", "dev": true, "dependencies": { "@asteasolutions/zod-to-openapi": "^7.0.0", "@trpc/server": "10.45.0", "adm-zip": "^0.5.12", + "ajv": "^8.12.0", + "ajv-formats": "^3.0.1", "axios": "^1.7.7", "body-parser": "^1.20.2", "chokidar": "^3.5.3", @@ -549,24 +556,6 @@ "zod-to-json-schema": "^3.22.4" } }, - "node_modules/@genkit-ai/tools-common/node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true - }, - "node_modules/@genkit-ai/tools-common/node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, "node_modules/@genkit-ai/tools-common/node_modules/uuid": { "version": "9.0.1", "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", @@ -1695,6 +1684,11 @@ "integrity": "sha512-hWtVTC2q7hc7xZ/RLbxapMvDMgUnDvKvMOpKal4DrMyfGBUfB1oKaZlIRr6mJL+If3bAP6sV/QneGzF6tJjZDg==", "dev": true }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==" + }, "node_modules/@types/long": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/@types/long/-/long-4.0.2.tgz", @@ -1905,12 +1899,10 @@ } }, "node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dependencies": { - "sprintf-js": "~1.0.2" - } + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true }, "node_modules/array-flatten": { "version": "1.1.1", @@ -2168,9 +2160,9 @@ } }, "node_modules/cjs-module-lexer": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.4.1.tgz", - "integrity": "sha512-cuSVIHi9/9E/+821Qjdvngor+xpnlwnuwIyZOaLmHBVdXL+gP+I6QQB9VkO7RI77YIcTV+S1W9AreJ5eN63JBA==" + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.4.3.tgz", + "integrity": "sha512-9z8TZaGM1pfswYeXrUpzPrkx8UnWYdhJclsiYMm6x/w5+nN+8Tf/LnAgfLGQCm59qAOxU8WwHEq2vNwF6i4j+Q==" }, "node_modules/cli-cursor": { "version": "3.1.0", @@ -2498,6 +2490,15 @@ "node": ">=8" } }, + "node_modules/dotprompt": { + "version": "1.0.0-dev.3", + "resolved": "https://registry.npmjs.org/dotprompt/-/dotprompt-1.0.0-dev.3.tgz", + "integrity": "sha512-gAcIhG+vzZlrZcBN/lO8gEMUtXHKMLbs1+snJuZrPkZnNgnWrzz1hYN4vYotpng/5fHsYSPUEckECy6qUNSrsQ==", + "dependencies": { + "handlebars": "^4.7.8", + "yaml": "^2.5.0" + } + }, "node_modules/dunder-proto": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", @@ -2664,18 +2665,6 @@ "node": ">=0.8.0" } }, - "node_modules/esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/etag": { "version": "1.8.1", "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", @@ -3005,14 +2994,6 @@ "integrity": "sha512-twe20eF1OxVxp/ML/kq2p1uc6KvFK/+vs8WjEbeKmV2He22MKm7YF2ANIt+EOqhJ5L3K/SuuPhk0hWQDjOM23g==", "dev": true }, - "node_modules/front-matter": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/front-matter/-/front-matter-4.0.2.tgz", - "integrity": "sha512-I8ZuJ/qG92NWX8i5x1Y8qyj3vizhXS31OxjKDu3LKP+7/qBgfIKValiZIEwoVoJKUHlhWtYrktkxV1XsX+pPlg==", - "dependencies": { - "js-yaml": "^3.13.1" - } - }, "node_modules/fsevents": { "version": "2.3.3", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", @@ -3100,24 +3081,23 @@ } }, "node_modules/genkit": { - "version": "0.9.12", - "resolved": "https://registry.npmjs.org/genkit/-/genkit-0.9.12.tgz", - "integrity": "sha512-m1VQE/yhuii0y1aGTnkoSesSXTNE25q1s7vv5YVgJWa/t2gOXuznZOoHTJ847f/3mKC7fgnV7xGI+t/+7wbe0g==", + "version": "1.0.0-rc.14", + "resolved": "https://registry.npmjs.org/genkit/-/genkit-1.0.0-rc.14.tgz", + "integrity": "sha512-JB6fTcJ5CI4UhsP4uNyXpi9/OatyhPwOkBXnbHafE5rdibXuKUXadbb2LC+PWfG3+7WrLXGKlrj7kOIN3Hq2lw==", "dependencies": { - "@genkit-ai/ai": "0.9.12", - "@genkit-ai/core": "0.9.12", - "@genkit-ai/dotprompt": "0.9.12", + "@genkit-ai/ai": "1.0.0-rc.14", + "@genkit-ai/core": "1.0.0-rc.14", "uuid": "^10.0.0" } }, "node_modules/genkit-cli": { - "version": "0.9.12", - "resolved": "https://registry.npmjs.org/genkit-cli/-/genkit-cli-0.9.12.tgz", - "integrity": "sha512-Qsk7TmVBxghTT+0cRe2j0fYJboUIfWhuUoeVbWshranye6tConGMyDEZdXBIeMWIixSbG7k8a7a2INdRdjcQJw==", + "version": "1.0.0-rc.14", + "resolved": "https://registry.npmjs.org/genkit-cli/-/genkit-cli-1.0.0-rc.14.tgz", + "integrity": "sha512-JR8Vvm2rGGQMsBkq+dWSypUC4ij1Uew5cjFaS74flyv/glV6RMNMuXP5XQBc5C9zIkfXeT+kng8BghHM4Gx/4g==", "dev": true, "dependencies": { - "@genkit-ai/telemetry-server": "0.9.12", - "@genkit-ai/tools-common": "0.9.12", + "@genkit-ai/telemetry-server": "1.0.0-rc.14", + "@genkit-ai/tools-common": "1.0.0-rc.14", "axios": "^1.7.7", "colorette": "^2.0.20", "commander": "^11.1.0", @@ -3731,12 +3711,12 @@ } }, "node_modules/js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" + "argparse": "^2.0.1" }, "bin": { "js-yaml": "bin/js-yaml.js" @@ -4790,11 +4770,6 @@ "node": "*" } }, - "node_modules/sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==" - }, "node_modules/stack-trace": { "version": "0.0.10", "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", @@ -5398,7 +5373,6 @@ "version": "2.7.0", "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.7.0.tgz", "integrity": "sha512-+hSoy/QHluxmC9kCIJyL/uyFmLmc+e5CFR5Wa+bpIhIj85LVb9ZH2nVnqrHoSvKogwODv0ClqZkmiSSaIH5LTA==", - "dev": true, "bin": { "yaml": "bin.mjs" }, diff --git a/samples/prompts/package.json b/samples/js-prompts/package.json similarity index 77% rename from samples/prompts/package.json rename to samples/js-prompts/package.json index 081931c36e..af227f43df 100644 --- a/samples/prompts/package.json +++ b/samples/js-prompts/package.json @@ -14,13 +14,14 @@ "author": "", "license": "ISC", "dependencies": { - "genkit": "^0.9.0-rc || ^0.9", - "@genkit-ai/googleai": "^0.9.0-rc || ^0.9", + "genkit": "^1.0.0-rc.14", + "@genkit-ai/googleai": "^1.0.0-rc.14", + "@genkit-ai/express": "^1.0.0-rc.14", "express": "^4.21.0", "zod": "^3.23.8" }, "devDependencies": { - "genkit-cli": "^0.9.0-rc || ^0.9", + "genkit-cli": "^1.0.0-rc.14", "typescript": "^5.5.4" } } diff --git a/samples/prompts/src/index.ts b/samples/js-prompts/src/index.ts similarity index 89% rename from samples/prompts/src/index.ts rename to samples/js-prompts/src/index.ts index 9149c03585..5241dd1a62 100644 --- a/samples/prompts/src/index.ts +++ b/samples/js-prompts/src/index.ts @@ -15,6 +15,7 @@ */ // Import the Genkit core libraries and plugins. +import { startFlowServer } from '@genkit-ai/express'; import { googleAI } from '@genkit-ai/googleai'; import { genkit, z } from 'genkit'; @@ -77,13 +78,19 @@ const threeGreetingsPrompt = ai.definePrompt( const threeGreetings = ai.defineFlow('threeGreetingsPrompt', async () => { const response = await threeGreetingsPrompt({ name: 'Fred' }); - return response.output?.likeAPirate; + return response.output; }); // Start a flow server, which exposes your flows as HTTP endpoints. This call // must come last, after all of your plug-in configuration and flow definitions. // You can optionally specify a subset of flows to serve, and configure some // HTTP server options, but by default, the flow server serves all defined flows. -ai.startFlowServer({ +startFlowServer({ flows: [threeGreetings, simpleTemplate, simpleDotprompt, simplePrompt], }); + +// Call one of the flows just to validate everything is hooked up properly +helloDotprompt({ name: 'Bob' }).then((generateResponse) => { + console.log('\nThe model response:'); + console.log(generateResponse.text); +}); diff --git a/samples/prompts/tsconfig.json b/samples/js-prompts/tsconfig.json similarity index 100% rename from samples/prompts/tsconfig.json rename to samples/js-prompts/tsconfig.json