diff --git a/src/ai/.x/templates/openai-asst-webpage-js/ai.png b/src/ai/.x/templates/openai-asst-webpage-js/favicon.png similarity index 100% rename from src/ai/.x/templates/openai-asst-webpage-js/ai.png rename to src/ai/.x/templates/openai-asst-webpage-js/favicon.png diff --git a/src/ai/.x/templates/openai-asst-webpage-js/index.html b/src/ai/.x/templates/openai-asst-webpage-js/index.html index 994b6cbd..6287f6e7 100644 --- a/src/ai/.x/templates/openai-asst-webpage-js/index.html +++ b/src/ai/.x/templates/openai-asst-webpage-js/index.html @@ -2,6 +2,7 @@ + @@ -16,8 +17,8 @@
- @@ -41,7 +42,7 @@

chat.contoso.com

- +
@@ -53,7 +54,7 @@

chat.contoso.com

-
@@ -64,7 +65,7 @@

chat.contoso.com

- + \ No newline at end of file diff --git a/src/ai/.x/templates/openai-asst-webpage-js/package.json b/src/ai/.x/templates/openai-asst-webpage-js/package.json index ba672518..b534215f 100644 --- a/src/ai/.x/templates/openai-asst-webpage-js/package.json +++ b/src/ai/.x/templates/openai-asst-webpage-js/package.json @@ -5,7 +5,9 @@ "main": "script.js", "scripts": { "test": "echo \"Error: no test specified\" && exit 1", - "webpack": "webpack" + "start": "vite", + "build": "vite build", + "preview": "vite preview" }, "author": "", "license": "MIT", @@ -17,8 +19,6 @@ }, "keywords": [], "devDependencies": { - "dotenv-webpack": "^7.0.3", - "webpack": "^5.89.0", - "webpack-cli": "^5.1.4" + "vite": "^5.2.8" } -} +} \ No newline at end of file diff --git a/src/ai/.x/templates/openai-asst-webpage-js/src/CreateOpenAI.js b/src/ai/.x/templates/openai-asst-webpage-js/src/CreateOpenAI.js index 24c2a97c..bb5d8f43 100644 --- a/src/ai/.x/templates/openai-asst-webpage-js/src/CreateOpenAI.js +++ b/src/ai/.x/templates/openai-asst-webpage-js/src/CreateOpenAI.js @@ -1,8 +1,8 @@ -const { InteractiveBrowserCredential } = require('@azure/identity'); -const { OpenAIEnvInfo } = require('./OpenAIEnvInfo'); -const { OpenAI } = require('openai'); +import { InteractiveBrowserCredential } from '@azure/identity'; +import { OpenAIEnvInfo } from './OpenAIEnvInfo'; +import { OpenAI } from 'openai'; -class CreateOpenAI { +export class CreateOpenAI { static async forAssistantsAPI({ dangerouslyAllowBrowser, errorCallback } = {}) { return this.forAPI({ api: 'assistants', dangerouslyAllowBrowser, errorCallback }); @@ -120,5 +120,3 @@ class CreateOpenAI { return token.token; } } - -exports.CreateOpenAI = CreateOpenAI; \ No newline at end of file diff --git a/src/ai/.x/templates/openai-asst-webpage-js/src/OpenAIAssistantsStreamingClass.js b/src/ai/.x/templates/openai-asst-webpage-js/src/OpenAIAssistantsStreamingClass.js index fd654d33..004bdf08 100644 --- a/src/ai/.x/templates/openai-asst-webpage-js/src/OpenAIAssistantsStreamingClass.js +++ b/src/ai/.x/templates/openai-asst-webpage-js/src/OpenAIAssistantsStreamingClass.js @@ -1,9 +1,7 @@ <#@ template hostspecific="true" #> <#@ output extension=".js" encoding="utf-8" #> <#@ parameter type="System.String" name="ClassName" #> -const { OpenAI } = require('openai'); - -class <#= ClassName #> { +export class <#= ClassName #> { // Constructor constructor(openAIAssistantId, openai, simulateTypingDelay = 0) { @@ -22,7 +20,7 @@ class <#= ClassName #> { // Retrieve an existing thread async retrieveThread(threadId) { - this.thread =await this.openai.beta.threads.retrieve(threadId); + this.thread = await this.openai.beta.threads.retrieve(threadId); console.log(`Thread ID: ${this.thread.id}`); return this.thread; } @@ -87,5 +85,4 @@ class <#= ClassName #> { } } } - -exports.<#= ClassName #> = <#= ClassName #>; \ No newline at end of file + \ No newline at end of file diff --git a/src/ai/.x/templates/openai-asst-webpage-js/src/OpenAIEnvInfo.js b/src/ai/.x/templates/openai-asst-webpage-js/src/OpenAIEnvInfo.js index 6849cc86..18d1f0c2 100644 --- a/src/ai/.x/templates/openai-asst-webpage-js/src/OpenAIEnvInfo.js +++ b/src/ai/.x/templates/openai-asst-webpage-js/src/OpenAIEnvInfo.js @@ -8,26 +8,25 @@ <#@ parameter type="System.String" name="AZURE_OPENAI_SYSTEM_PROMPT" #> <#@ parameter type="System.String" name="OPENAI_API_KEY" #> <#@ parameter type="System.String" name="OPENAI_MODEL_NAME" #> -class OpenAIEnvInfo { - +export class OpenAIEnvInfo { // NOTE: Never deploy your key in client-side environments like browsers or mobile apps // SEE: https://help.openai.com/en/articles/5112595-best-practices-for-api-key-safety - static ASSISTANT_ID = process.env.ASSISTANT_ID ?? "<#= ASSISTANT_ID #>"; + static ASSISTANT_ID = import.meta.env.ASSISTANT_ID ?? ""; - static AZURE_CLIENT_ID = process.env.AZURE_CLIENT_ID ?? null; - static AZURE_TENANT_ID = process.env.AZURE_TENANT_ID ?? null; + static AZURE_CLIENT_ID = import.meta.env.AZURE_CLIENT_ID ?? null; + static AZURE_TENANT_ID = import.meta.env.AZURE_TENANT_ID ?? null; - static AZURE_OPENAI_API_KEY = process.env.AZURE_OPENAI_API_KEY ?? "<#= AZURE_OPENAI_API_KEY #>"; - static AZURE_OPENAI_API_VERSION = process.env.AZURE_OPENAI_API_VERSION ?? "<#= AZURE_OPENAI_API_VERSION #>"; - static AZURE_OPENAI_ENDPOINT = process.env.AZURE_OPENAI_ENDPOINT ?? "<#= AZURE_OPENAI_ENDPOINT #>"; - static AZURE_OPENAI_CHAT_DEPLOYMENT = process.env.AZURE_OPENAI_CHAT_DEPLOYMENT ?? "<#= AZURE_OPENAI_CHAT_DEPLOYMENT #>"; + static AZURE_OPENAI_API_KEY = import.meta.env.AZURE_OPENAI_API_KEY ?? ""; + static AZURE_OPENAI_API_VERSION = import.meta.env.AZURE_OPENAI_API_VERSION ?? ""; + static AZURE_OPENAI_ENDPOINT = import.meta.env.AZURE_OPENAI_ENDPOINT ?? ""; + static AZURE_OPENAI_CHAT_DEPLOYMENT = import.meta.env.AZURE_OPENAI_CHAT_DEPLOYMENT ?? ""; - static AZURE_OPENAI_SYSTEM_PROMPT = process.env.AZURE_OPENAI_SYSTEM_PROMPT ?? "<#= AZURE_OPENAI_SYSTEM_PROMPT #>"; + static AZURE_OPENAI_SYSTEM_PROMPT = import.meta.env.AZURE_OPENAI_SYSTEM_PROMPT ?? "You are a helpful AI assistant."; - static OPENAI_API_KEY = process.env.OPENAI_API_KEY ?? "<#= OPENAI_API_KEY #>"; - static OPENAI_ORG_ID = process.env.OPENAI_ORG_ID ?? null; - static OPENAI_MODEL_NAME = process.env.OPENAI_MODEL_NAME ?? "<#= OPENAI_MODEL_NAME #>"; + static OPENAI_API_KEY = import.meta.env.OPENAI_API_KEY ?? ""; + static OPENAI_ORG_ID = import.meta.env.OPENAI_ORG_ID ?? null; + static OPENAI_MODEL_NAME = import.meta.env.OPENAI_MODEL_NAME ?? ""; static isConnectionInfoOk(errorCallback) { const ok = this.isAzureAADConnectionInfoOk() || this.isAzureKeyConnectionInfoOk() || this.isOpenAIConnectionInfoOk(); @@ -70,6 +69,4 @@ class OpenAIEnvInfo { } return true; } -} - -exports.OpenAIEnvInfo = OpenAIEnvInfo; +} \ No newline at end of file diff --git a/src/ai/.x/templates/openai-asst-webpage-js/src/script.js b/src/ai/.x/templates/openai-asst-webpage-js/src/script.js index d1bccbe8..c932ca5d 100644 --- a/src/ai/.x/templates/openai-asst-webpage-js/src/script.js +++ b/src/ai/.x/templates/openai-asst-webpage-js/src/script.js @@ -1,12 +1,12 @@ <#@ template hostspecific="true" #> <#@ output extension=".js" encoding="utf-8" #> <#@ parameter type="System.String" name="ClassName" #> -const marked = require("marked"); -const hljs = require("highlight.js"); +import * as marked from "marked"; +import * as hljs from "highlight.js"; -const { CreateOpenAI } = require("./CreateOpenAI"); -const { OpenAIEnvInfo } = require("./OpenAIEnvInfo"); -const { <#= ClassName #> } = require("./OpenAIAssistantsStreamingClass"); +import { CreateOpenAI } from "./CreateOpenAI"; +import { OpenAIEnvInfo } from "./OpenAIEnvInfo"; +import { <#= ClassName #> } from "./OpenAIAssistantsStreamingClass"; let assistant; async function assistantInit(threadId = null) { @@ -484,10 +484,8 @@ async function init() { userInputTextAreaFocus(); - window.newChat = newChat; - window.loadThread = loadThread; - window.sendMessage = sendMessage; - window.toggleTheme = toggleTheme; + document.querySelector('#sendButton').addEventListener('click', sendMessage); + document.querySelector('#newChatButton').addEventListener('click', newChat); } -init(); \ No newline at end of file +window.addEventListener('DOMContentLoaded', init); \ No newline at end of file diff --git a/src/ai/.x/templates/openai-asst-webpage-js/vite.config.js b/src/ai/.x/templates/openai-asst-webpage-js/vite.config.js new file mode 100644 index 00000000..0e35e81e --- /dev/null +++ b/src/ai/.x/templates/openai-asst-webpage-js/vite.config.js @@ -0,0 +1,3 @@ +export default { + envPrefix: ["ASSISTANT_ID", "AZURE_", "OPENAI_"], +}; \ No newline at end of file diff --git a/src/ai/.x/templates/openai-asst-webpage-js/webpack.config.js b/src/ai/.x/templates/openai-asst-webpage-js/webpack.config.js deleted file mode 100644 index 154fbff8..00000000 --- a/src/ai/.x/templates/openai-asst-webpage-js/webpack.config.js +++ /dev/null @@ -1,27 +0,0 @@ -const path = require('path'); -const webpack = require('webpack'); -const Dotenv = require('dotenv-webpack'); - -module.exports = { - mode: 'development', - entry: './src/script.js', - output: { - filename: 'main.js', - path: path.resolve(__dirname, 'dist'), - }, - plugins: [ - new Dotenv(), - new webpack.DefinePlugin({ - 'process.env.ASSISTANT_ID': JSON.stringify(process.env.ASSISTANT_ID), - 'process.env.AZURE_CLIENT_ID': JSON.stringify(process.env.AZURE_CLIENT_ID), - 'process.env.AZURE_TENANT_ID': JSON.stringify(process.env.AZURE_TENANT_ID), - 'process.env.AZURE_OPENAI_API_KEY': JSON.stringify(process.env.AZURE_OPENAI_API_KEY), - 'process.env.AZURE_OPENAI_API_VERSION': JSON.stringify(process.env.AZURE_OPENAI_API_VERSION), - 'process.env.AZURE_OPENAI_ENDPOINT': JSON.stringify(process.env.AZURE_OPENAI_ENDPOINT), - 'process.env.AZURE_OPENAI_CHAT_DEPLOYMENT': JSON.stringify(process.env.AZURE_OPENAI_CHAT_DEPLOYMENT), - 'process.env.OPENAI_API_KEY': JSON.stringify(process.env.OPENAI_API_KEY), - 'process.env.OPENAI_ORG_ID': JSON.stringify(process.env.OPENAI_ORG_ID), - 'process.env.OPENAI_MODEL_NAME': JSON.stringify(process.env.OPENAI_MODEL_NAME), - }), - ], -}; \ No newline at end of file