Skip to content

Commit 2bb527c

Browse files
authored
Merge pull request #2 from davideast/davideast-patch-1-1
Fix templating in server.ts
2 parents 99b5840 + 8ddf7be commit 2bb527c

File tree

1 file changed

+102
-101
lines changed

1 file changed

+102
-101
lines changed

server.ts

Lines changed: 102 additions & 101 deletions
Original file line numberDiff line numberDiff line change
@@ -14,104 +14,105 @@
1414
limitations under the License.
1515
*/
1616

17-
import { APP_BASE_HREF } from '@angular/common';
18-
import { CommonEngine } from '@angular/ssr';
19-
import express from 'express';
20-
import { fileURLToPath } from 'node:url';
21-
import { dirname, join, resolve } from 'node:path';
22-
import bootstrap from './src/main.server';
23-
import {
24-
GoogleGenerativeAI,
25-
GenerateContentRequest,
26-
} from '@google/generative-ai';
27-
28-
// The Express app is exported so that it can be used by serverless Functions.
29-
export function app(): express.Express {
30-
const server = express();
31-
const serverDistFolder = dirname(fileURLToPath(import.meta.url));
32-
const browserDistFolder = resolve(serverDistFolder, '../browser');
33-
const indexHtml = join(serverDistFolder, 'index.server.html');
34-
35-
// Update this line to add your API_KEY if you are not using env variables
36-
const GEMINI_API_KEY = process.env['API_KEY'] || '';
37-
const commonEngine = new CommonEngine();
38-
39-
const genAI = new GoogleGenerativeAI(GEMINI_API_KEY);
40-
const model = genAI.getGenerativeModel({ model: 'gemini-1.5-pro-latest' });
41-
model.generationConfig.responseMimeType = 'application/json';
42-
const DEFAULT_LANG = 'spanish';
43-
44-
server.set('view engine', 'html');
45-
server.set('views', browserDistFolder);
46-
47-
// Define Express Rest API endpoints
48-
server.get('/api/ask-gemini', async (req, res) => {
49-
if (!GEMINI_API_KEY) {
50-
return res.status(500).send({
51-
message: 'Please provide an API key for Gemini, using default {$DEFAULT_LANG} translations.',
52-
});
53-
}
54-
55-
let language = req.query['lang'] ? req.query['lang'] as string : DEFAULT_LANG;
56-
57-
try {
58-
const prompt = `Your task is to generate 25 vocabulary words for learning ${language}.
59-
Provide the ${language} translation, with 1 correct english translation and 2 incorrect english translations.
60-
61-
input: generate 25 vocaulary words for learning spanish
62-
output: [{"phrase": "hola", "options"=["goodbye", "wait", "hello"], "answer": "hello"}, {"phrase": "adios", "options":["good morning", "see you later", "car"], "answer": "see you later"}, {"phrase": "gracias", "options":["shoes", "thank you", "comb"], "answer": "thank you"}]
63-
`;
64-
const request: GenerateContentRequest = {
65-
contents: [{ role: 'user', parts: [{ text: prompt }] }],
66-
tools: [],
67-
};
68-
const results = await model.generateContent(request);
69-
70-
return res
71-
.status(200)
72-
.send({ response: results.response.text(), usingDefault: false });
73-
} catch (e) {
74-
return res.status(500).send({
75-
message: `Unable to generate the practice questions for ${language}, using default {$DEFAULT_LANG} translations.`,
76-
});
77-
}
78-
});
79-
80-
// Serve static files from /browser
81-
server.get(
82-
'*.*',
83-
express.static(browserDistFolder, {
84-
maxAge: '1y',
85-
})
86-
);
87-
88-
// All regular routes use the Angular engine
89-
server.get('*', (req, res, next) => {
90-
const { protocol, originalUrl, baseUrl, headers } = req;
91-
92-
commonEngine
93-
.render({
94-
bootstrap,
95-
documentFilePath: indexHtml,
96-
url: `${protocol}://${headers.host}${originalUrl}`,
97-
publicPath: browserDistFolder,
98-
providers: [{ provide: APP_BASE_HREF, useValue: baseUrl }],
99-
})
100-
.then((html) => res.send(html))
101-
.catch((err) => next(err));
102-
});
103-
104-
return server;
105-
}
106-
107-
function run(): void {
108-
const port = process.env['PORT'] || process.argv[3] || 4000;
109-
110-
// Start up the Node server
111-
const server = app();
112-
server.listen(port, () => {
113-
console.log(`Node Express server listening on http://localhost:${port}`);
114-
});
115-
}
116-
117-
run();
17+
import { APP_BASE_HREF } from '@angular/common';
18+
import { CommonEngine } from '@angular/ssr';
19+
import express from 'express';
20+
import { fileURLToPath } from 'node:url';
21+
import { dirname, join, resolve } from 'node:path';
22+
import bootstrap from './src/main.server';
23+
import {
24+
GoogleGenerativeAI,
25+
GenerateContentRequest,
26+
} from '@google/generative-ai';
27+
28+
// The Express app is exported so that it can be used by serverless Functions.
29+
export function app(): express.Express {
30+
const server = express();
31+
const serverDistFolder = dirname(fileURLToPath(import.meta.url));
32+
const browserDistFolder = resolve(serverDistFolder, '../browser');
33+
const indexHtml = join(serverDistFolder, 'index.server.html');
34+
35+
// Update this line to add your API_KEY if you are not using env variables
36+
const GEMINI_API_KEY = process.env['API_KEY'] || '';
37+
const commonEngine = new CommonEngine();
38+
39+
const genAI = new GoogleGenerativeAI(GEMINI_API_KEY);
40+
const model = genAI.getGenerativeModel({ model: 'gemini-1.5-pro-latest' });
41+
model.generationConfig.responseMimeType = 'application/json';
42+
const DEFAULT_LANG = 'spanish';
43+
44+
server.set('view engine', 'html');
45+
server.set('views', browserDistFolder);
46+
47+
// Define Express Rest API endpoints
48+
server.get('/api/ask-gemini', async (req, res) => {
49+
if (!GEMINI_API_KEY) {
50+
return res.status(500).send({
51+
message: `Please provide an API key for Gemini, using default ${DEFAULT_LANG} translations.`,
52+
});
53+
}
54+
55+
let language = req.query['lang'] ? req.query['lang'] as string : DEFAULT_LANG;
56+
57+
try {
58+
const prompt = `Your task is to generate 25 vocabulary words for learning ${language}.
59+
Provide the ${language} translation, with 1 correct english translation and 2 incorrect english translations.
60+
61+
input: generate 25 vocaulary words for learning spanish
62+
output: [{"phrase": "hola", "options"=["goodbye", "wait", "hello"], "answer": "hello"}, {"phrase": "adios", "options":["good morning", "see you later", "car"], "answer": "see you later"}, {"phrase": "gracias", "options":["shoes", "thank you", "comb"], "answer": "thank you"}]
63+
`;
64+
const request: GenerateContentRequest = {
65+
contents: [{ role: 'user', parts: [{ text: prompt }] }],
66+
tools: [],
67+
};
68+
const results = await model.generateContent(request);
69+
70+
return res
71+
.status(200)
72+
.send({ response: results.response.text(), usingDefault: false });
73+
} catch (e) {
74+
return res.status(500).send({
75+
message: `Unable to generate the practice questions for ${language}, using default ${DEFAULT_LANG} translations.`,
76+
});
77+
}
78+
});
79+
80+
// Serve static files from /browser
81+
server.get(
82+
'*.*',
83+
express.static(browserDistFolder, {
84+
maxAge: '1y',
85+
})
86+
);
87+
88+
// All regular routes use the Angular engine
89+
server.get('*', (req, res, next) => {
90+
const { protocol, originalUrl, baseUrl, headers } = req;
91+
92+
commonEngine
93+
.render({
94+
bootstrap,
95+
documentFilePath: indexHtml,
96+
url: `${protocol}://${headers.host}${originalUrl}`,
97+
publicPath: browserDistFolder,
98+
providers: [{ provide: APP_BASE_HREF, useValue: baseUrl }],
99+
})
100+
.then((html) => res.send(html))
101+
.catch((err) => next(err));
102+
});
103+
104+
return server;
105+
}
106+
107+
function run(): void {
108+
const port = process.env['PORT'] || process.argv[3] || 4000;
109+
110+
// Start up the Node server
111+
const server = app();
112+
server.listen(port, () => {
113+
console.log(`Node Express server listening on http://localhost:${port}`);
114+
});
115+
}
116+
117+
run();
118+

0 commit comments

Comments
 (0)