1. Zanim zaczniesz
Czym są aplikacje Google Chat z AI?
Aplikacje Google Chat z AI:
- Wprowadź swoje usługi i zasoby do Google Chat, aby użytkownicy mogli uzyskiwać informacje i podejmować działania bez opuszczania rozmowy.
- integrować się z modelami generatywnej AI, aby tworzyć, wyszukiwać i edytować dane, takie jak tekst czy obrazy;
- Wspieranie interakcji z użyciem agentów przez stosowanie koncepcji konwersacyjnej AI w celu uzyskania bardziej praktycznych, naturalnych, zaawansowanych i przydatnych interakcji.
Dlaczego warto zintegrować aplikacje Google Chat z AI?
Typowe przypadki użycia należą do tych kategorii:
- Tworzenie i edycja treści. generować teksty marketingowe, tworzyć posty w mediach społecznościowych, tworzyć realistyczne obrazy, komponować muzykę lub pomagać w tworzeniu treści wideo;
- Wyszukiwanie i analizowanie danych Wyodrębniaj kluczowe informacje z nieuporządkowanej bazy wiedzy, podsumowuj długie teksty, klasyfikuj treści lub tłumacz języki z większą dokładnością i szybkością.
- Rozmowa Prowadź naturalne, informatywne i skuteczne rozmowy, tak jak z asystentem.
- Automatyzacja zadań wykonywać czynności w imieniu użytkownika, np. tworzyć nowe wydarzenie w kalendarzu, wysyłać dokument lub zarządzać zgłoszeniem w systemie zewnętrznym;
Możliwość zintegrowania tych funkcji bezpośrednio w znanym interfejsie Google Chat to ogromna szansa dla każdego, kto chce zwiększyć wygodę i produktywność użytkowników.
Wymagania wstępne
- Podstawowa znajomość Google Cloud i Node.js.
- Podstawowa wiedza o aplikacjach Google Chat, w tym wiadomościach, kartach, uwierzytelnianiu, interfejsach API i punktach końcowych HTTP.
Co utworzysz
W tym module nauczysz się tworzyć 8 minimalistycznych aplikacji Google Chat, które wykorzystują podstawowe koncepcje AI, aby pokazać, jak można je stosować w rzeczywistych aplikacjach. Wszystkie są tworzone jako dodatki do Google Workspace i korzystają z architektury HTTP:
Działa to w ten sposób:
- Użytkownik wysyła wiadomość w Google Chat do aplikacji Google Chat w formie wiadomości na czacie lub w pokoju w Google Chat.
- Żądanie HTTP jest wysyłane do serwera WWW działającego jako funkcja Node.js Google Cloud Run, która zawiera logikę aplikacji do obsługi czatu.
- Opcjonalnie logika aplikacji Chat może być zintegrowana z usługami Google Workspace (takimi jak Kalendarz i Arkusze), innymi usługami Google (takimi jak Mapy, YouTube i Vertex AI) lub innymi usługami internetowymi (takimi jak system zarządzania projektami lub narzędzie do obsługi zgłoszeń).
- Serwer WWW wysyła odpowiedź HTTP z powrotem do usługi aplikacji Chat w Google Chat.
- Odpowiedź jest dostarczana do użytkownika.
- Opcjonalnie aplikacja Chat może wywoływać interfejs Chat API, aby asynchronicznie publikować wiadomości lub wykonywać inne operacje.
Każda funkcja Node.js Google Cloud Run aplikacji Google Chat zawiera własną wersję tych plików źródłowych, aby wykonać niezbędne działania w krokach 3 i 6 powyżej:
package.json
: centralny plik manifestu, który służy jako plan projektu Node.js. Służy do definiowania metadanych, zależności i skryptów.env.js
: skrypt, który ustawia stałe wymagane do wykonania. Należy go edytować w zależności od środowiska i konfiguracji.index.js:
Główny skrypt, który obsługuje logikę zdarzeń interakcji w Google Chat. W tym samouczku zaimplementowano tylko typ zdarzenia wiadomości, ale w rzeczywistych aplikacjach zwykle obejmuje on inne typy, takie jak kliknięcie karty, polecenie ze znakiem ukośnika i okno.
Aplikacja Prompt
Ta aplikacja korzysta z modelu Gemini, aby rozmawiać z użytkownikami w ich językach naturalnych, używając zwięzłych i prostych odpowiedzi tekstowych.
Formatowanie aplikacji
Ta aplikacja rozszerza Prompt app
o obsługę odpowiedzi w formacie RTF zgodnym z określonym formatem tekstu wiadomości w Google Chat.
Aplikacja na ziemi
Ta aplikacja jest oparta na Format app
i obsługuje narzędzie wyszukiwarki Google oraz zwraca źródła w odpowiedziach na wiadomości z kartami.
Aplikacja MCP
Ta aplikacja jest oparta na Format app
i dodaje obsługę protokołu kontekstowego modelu pomocy dla programistów Google Workspace (MCP).
Aplikacja wieloetapowa
Ta aplikacja jest oparta na Format app
i dodaje obsługę pamięci konwersacyjnej za pomocą bazy danych Google Cloud Firestore.
Aplikacja z narzędziem niestandardowym
Ta aplikacja jest oparta na Multi-turn app
i dodaje obsługę niestandardowego narzędzia do wywoływania funkcji, które wywołuje interfejs Google Workspace Calendar API na podstawie informacji podanych przez użytkownika.
Strumieniowanie aplikacji
Ta aplikacja korzysta z modelu Gemini do generowania krótkich opowiadań na podstawie tematów podanych przez użytkowników. Interfejs Google Chat API służy do wysyłania wyników i stanów w wiadomościach w miarę postępów.
Aplikacja multimodalna
Ta aplikacja korzysta z modelu Gemini, aby edytować obrazy na podstawie instrukcji tekstowych użytkowników. Interfejsy Google Chat API służą do pobierania i przesyłania obrazów jako załączników do wiadomości.
Czego się nauczysz
- Podstawowe pojęcia związane z AI mają znaczenie w przypadku aplikacji Google Chat i sposobu ich stosowania.
- Aby uzyskać dostęp do Vertex AI za pomocą pakietu Google Gen AI SDK.
- Korzystać z interfejsów Google Workspace API do tworzenia przydatnych i zaawansowanych funkcji.
- korzystać z Cloud Run do tworzenia skalowalnych aplikacji Google Chat;
Co będzie potrzebne
- Ukończenie krótkiego wprowadzenia Tworzenie aplikacji HTTP w Google Chat w Node.js. Ten moduł praktyczny opiera się na projekcie Google Cloud, aplikacji Google Chat i funkcji Google Cloud Run.
2. Konfiguracja
Inicjowanie zasobów i uzyskiwanie do nich dostępu
W tej sekcji uzyskasz dostęp do tych zasobów i skonfigurujesz je w preferowanej przeglądarce.
Konfiguracja interfejsu Google Chat API
Otwórz konsolę Google Cloud na nowej karcie, a następnie wykonaj te czynności:
- Wybierz projekt.
- W polu wyszukiwania Google Cloud wyszukaj „Google Chat API”, a następnie kliknij Google Chat API, Zarządzaj i Konfiguracja.
- Ustaw Nazwę aplikacji i Opis na
Gen AI App
. - Kliknij Zapisz.
Pokój w Google Chat
Otwórz Google Chat w nowej karcie, a następnie wykonaj te czynności:
- Jeśli jeszcze tego nie zrobiono, otwórz pokój czatu z aplikacją Chat.
- Wpisz
Hello
i naciśnijenter
. Aplikacja Chat powinna odpowiedzieć, podając Twoje imię i nazwisko oraz zdjęcie profilowe.
Usługa funkcji Google Cloud Run
Otwórz konsolę Google Cloud na nowej karcie, a następnie wykonaj te czynności:
- Wybierz projekt.
- Kliknij Menu ☰ > Cloud Run > Usługi.
- Na liście usług kliknij addonchatapp, a następnie otwórz kartę Źródło.
Pobieranie kodu źródłowego i zasobów lokalnie
- Pobierz to repozytorium GitHub.
- W wybranym lokalnym środowisku programistycznym otwórz katalog
node/chat/gen-ai-apps
.
3. Prompt aplikacji
Ta aplikacja używa Gemini w Vertex AI, aby prowadzić rozmowy z użytkownikami w ich językach naturalnych, używając zwięzłych i prostych odpowiedzi tekstowych. Implementacja opiera się na pakiecie Google Gen AI SDK dla Node.js.
Sprawdź pojęcia
Naturalny język
Każdy język, którym ludzie posługują się w mowie lub piśmie w codziennej komunikacji, w przeciwieństwie do języków sztucznych lub komputerowych.
Funkcje Cloud Run
Funkcje Cloud Run doskonale nadają się do tworzenia bezserwerowych backendów, przetwarzania danych w czasie rzeczywistym i tworzenia inteligentnych aplikacji. Nie ma serwerów, które trzeba by udostępniać, zarządzać nimi, instalować na nich poprawki ani je aktualizować. Automatycznie się skalują, a także charakteryzują się wysoką dostępnością i odpornością na awarie.
Promptowanie
Promptowanie to technika tworzenia danych wejściowych (promptów), które kierują modelem generatywnej AI w celu uzyskania pożądanych wyników. Zwykle polega to na starannym formułowaniu pytań, podawaniu kontekstu, udzielaniu instrukcji lub podawaniu przykładów, aby uzyskać od modelu konkretne i trafne odpowiedzi.
Vertex AI
Vertex AI oferuje wszystko, czego potrzebujesz do tworzenia i używania generatywnej AI, w tym rozwiązania AI, wyszukiwanie i rozmowy, ponad 130 modeli podstawowych i zintegrowaną platformę AI.
Gemini
Gemini to multimodalny model LLM od Google dostępny w Vertex AI. Pomaga ludziom w pełnym wykorzystaniu ich potencjału, rozwijaniu wyobraźni i ciekawości oraz zwiększaniu produktywności.
Google Gen AI SDK
Google Gen AI SDK to pakiet SDK przeznaczony dla deweloperów do tworzenia aplikacji opartych na Gemini. Zapewnia on ujednolicony interfejs zgodny zarówno z Gemini Developer API, jak i z Vertex AI. Usługa ta jest dostarczana z bibliotekami klienta w językach Python, Go, Node.js i Java.
Proces sprawdzania
Sprawdzanie kodu źródłowego
env.js
...
// Replace with your GCP project ID.
projectID: process.env.PROJECT_ID || 'your-google-cloud-project-id',
// Replace with your GCP project location.
location: process.env.LOCATION || 'your-google-cloud-project-location',
// Replace with the Gemini model to use.
model: process.env.MODEL || 'gemini-2.5-flash-lite',
...
index.js
// Import the Google Gen AI SDK.
import { GoogleGenAI } from '@google/genai';
...
// Use Vertex AI.
const genAI = new GoogleGenAI({vertexai: true, project: env.projectID, location: env.location});
http('gen-ai-app', async (req, res) => {
// Send a new Chat message with the generated answer
return res.send({ hostAppDataAction: { chatDataAction: { createMessageAction: { message: {
text: await generateAnswer(req.body.chat.messagePayload.message.text)
}}}}});
});
async function generateAnswer(message) {
// The prompt is made of the user's message and specific instructions for the model.
const prompt = 'In a consice and with plain text only (no formatting), '
+ 'answer the following message in the same language: ' + message;
const aiResponse = await genAI.models.generateContent({model: env.model, contents: prompt});
return aiResponse.candidates[0].content.parts[0].text;
};
...
package.json
...
"main": "index.js",
"type": "module",
"scripts": {
"start": "node index.js"
},
"dependencies": {
"@google-cloud/functions-framework": "^4.0.0",
"@google/genai": "1.15.0"
},
...
Włączanie interfejsu Vertex AI API
- W konsoli Google Cloud włącz interfejs Vertex AI API:
- Kliknij Menu ☰ > Interfejsy API i usługi > Włączone interfejsy API i usługi, a potem sprawdź, czy na liście znajduje się Vertex AI API.
Aktualizowanie funkcji Node.js w Google Cloud Run
- W lokalnym środowisku programistycznym zmień bieżący katalog na
node/chat/gen-ai-apps/1-prompt
. Zawiera cały kod źródłowy i wszystkie zasoby. - Otwórz plik
env.js
w edytorze i ustaw te wartości: - projectID: identyfikator Twojego projektu Google Cloud. Możesz go znaleźć na stronie powitalnej konsoli Google Cloud.
- location: region usługi funkcji Cloud Run w Google Cloud. Możesz go pobrać ze strony szczegółów usługi funkcji Google Cloud Run.
- model: model, którego chcesz użyć. Wszystkie dostępne modele znajdziesz w dokumentacji Vertex AI. Domyślnie ustawiony jest model Flash, który zapewnia szybkie i tanie wykonywanie.
- Otwórz kartę Źródło na stronie szczegółów usługi funkcji Google Cloud Run.
- Kliknij Edytuj źródło.
- Ustaw Punkt wejścia funkcji na
gen-ai-app
. - Kliknij ➕, wpisz
env.js
i kliknij ✔️, aby utworzyć brakujący plik źródłowy. - Zastąp całą zawartość plików
index.js
,env.js
ipackage.json
zawartością z lokalnego środowiska programistycznego. - Kliknij Zapisz i wdroż ponownie.
- Poczekaj na zakończenie wdrażania wersji.
Wypróbuj
- Na czacie z aplikacją w Google Chat wpisz
Hello, how are you?
i naciśnijenter
. Aplikacja powinna odpowiadać zwięźle w formie zwykłego tekstu zgodnie z instrukcjami w prompcie.
- Na czacie z aplikacją w Google Chat wpisz
Bonjour comment allez-vous?
i naciśnijenter
. Aplikacja powinna odpowiedzieć po francusku zgodnie z instrukcjami w prompcie.
4. Formatowanie aplikacji
Ta aplikacja rozszerza Prompt app
o obsługę odpowiedzi w formacie tekstu sformatowanego zgodnym z formatem wiadomości tekstowych Google Chat. Instrukcje w prompcie są aktualizowane o wyczerpujący opis różnych opcji, z których może korzystać model.
Sprawdź pojęcia
Wiadomości tekstowe w Google Chat
Wiadomości tekstowe w Google Chat obsługują różne opcje formatowania, które umożliwiają tworzenie bardziej przejrzystych i wyrazistych wiadomości bezpośrednio w interfejsie Google Chat. Opierają się one na konkretnych regułach Markdown, które umożliwiają stosowanie pogrubienia, kursywy, przekreślenia, tworzenie hiperlinków itp.
Proces sprawdzania
Sprawdź kod źródłowy
index.js
...
async function generateAnswer(message) {
// Specify formatting options that are compatible with Google Chat messages
// https://developers.google.com/workspace/chat/format-messages#format-texts
const prompt = `Use simple text for concise answers. The only formatting options you can use is to
(1) surround some text with a single star for bold such as *text* for strong emphasis
(2) surround some text with a single underscore for italic such as _text_ for gentle emphasis
(3) surround some text with a single tild for strikethrough such as ~text~ for removal
(4) use a less than before followed by a URL followed by a pipe followed by a link text followed
by a more than for a hyperlink such as <https://example.com|link text> for resource referencing
(5) use a backslash followed by the letter n for a new line such as \n for readibility
(6) surround some text with a single backquote such as \`text\` for quoting code
(7) surround an entire paragraph with three backquotes in dedicated lines such as
\`\`\`\nparagraph\n\`\`\` for quoting code
(8) prepend lines with list items with a single star or hyphen followed by a single space
such as * list item or - list item for bulleting ;
DO NOT USE ANY OTHER FORMATTING OTHER THAN THOSE.
Answer the following message in the same language: ${message}`;
...
};
...
Aktualizowanie funkcji Node.js w Google Cloud Run
- W lokalnym środowisku programistycznym zmień bieżący katalog na
node/chat/gen-ai-apps/2-format
. Zawiera cały kod źródłowy i wszystkie zasoby. - Otwórz kartę Źródło na stronie szczegółów usługi funkcji Google Cloud Run.
- Kliknij Edytuj źródło.
- Zastąp całą zawartość pliku
index.js
zawartością z lokalnego środowiska programistycznego. - Kliknij Zapisz i wdroż ponownie.
- Poczekaj na zakończenie wdrażania wersji.
Wypróbuj
- Na czacie z aplikacją w Google Chat wpisz
Showcase all formatting options you have with one paragraph each
i naciśnijenter
. Aplikacja powinna odpowiedzieć, podając przykłady formatowania na podstawie naszych instrukcji w prompcie.
- Na czacie z aplikacją w Google Chat wpisz
What are Google Chat apps? What's great about them?
i naciśnijenter
. Gdy to przydatne, aplikacja powinna odpowiadać z formatowaniem.
5. Aplikacja naziemna
Ta aplikacja jest oparta na Format app
i dodaje obsługę uzasadniania oraz zwracania źródeł. Uruchamia narzędzie wyszukiwarki Google i dołącza karty z linkami do odpowiedzi.
Przejrzyj pojęcia
Grounding
Grounding to technika łączenia modeli ze źródłami informacji. Jest często stosowany w praktycznych zastosowaniach, aby zwiększyć dokładność i trafność generowanych treści poprzez odwoływanie się do danych ze świata rzeczywistego. Zapobiega to halucynacjom modelu i generowaniu nieprawdziwych informacji.
Narzędzie wyszukiwarki Google
Narzędzie wyszukiwarki Google ulepsza grounding, umożliwiając modelom wyszukiwanie w internecie informacji w czasie rzeczywistym, co zapewnia dokładność i aktualność odpowiedzi.
Platforma kart Google Workspace
Framework kart w Google Workspace umożliwia deweloperom tworzenie rozbudowanych, interaktywnych interfejsów użytkownika. Umożliwia tworzenie uporządkowanych i atrakcyjnych wizualnie kart, które mogą zawierać tekst, obrazy, przyciski i inne widżety. Karty te zwiększają wygodę użytkowników, ponieważ zawierają uporządkowane informacje i umożliwiają szybkie wykonywanie działań bezpośrednio w ramach rozmowy.
Przepływ weryfikacji
Sprawdź kod źródłowy
index.js
...
const aiResponse = await genAI.models.generateContent({
model: env.model,
contents: prompt,
// Google Search tool is enabled
config: { tools: [{ googleSearch: {}}]}
});
let groundingCardsV2 = undefined;
const grounding = aiResponse.candidates[0].groundingMetadata;
// Go through the grounding metadata if any
if (grounding && grounding.groundingChunks && grounding.groundingChunks.length > 0) {
let linkButtons = [];
grounding.groundingChunks.forEach(groundingChunk => {
if (groundingChunk.web) {
// Create one link button per web URL returned
linkButtons.push({
text: groundingChunk.web.domain,
onClick: { openLink: { url: groundingChunk.web.uri}}
});
}
});
// Create a card with link buttons
groundingCardsV2 = [{
cardId: "sourcesCard",
card: { sections: [{
header: "Sources",
widgets: [{ buttonList: { buttons: linkButtons}}]
}]}
}];
}
// Send a Chat message with the generated answer
return res.send({ hostAppDataAction: { chatDataAction: { createMessageAction: { message: {
text: aiResponse.candidates[0].content.parts[0].text,
// The sources are referenced in the card
cardsV2: groundingCardsV2
}}}}});
...
Aktualizowanie funkcji Node.js w Google Cloud Run
- W lokalnym środowisku programistycznym zmień bieżący katalog na
node/chat/gen-ai-apps/3-ground
. Zawiera cały kod źródłowy i wszystkie zasoby. - Otwórz kartę Źródło na stronie szczegółów usługi funkcji Google Cloud Run.
- Kliknij Edytuj źródło.
- Zastąp całą zawartość pliku
index.js
zawartością z lokalnego środowiska programistycznego. - Kliknij Zapisz i wdroż ponownie.
- Poczekaj na zakończenie wdrażania wersji.
Wypróbuj
Na czacie z aplikacją w Google Chat wpisz What's the world population?
i naciśnij enter
. Aplikacja powinna odpowiedzieć, dołączając linki do źródeł na karcie.
6. Aplikacja MCP
Ta aplikacja jest rozszerzeniem Format app
, ponieważ obsługuje narzędzia udostępniane przez serwer protokołu kontekstu modelu (MCP) hostowany zdalnie. Łączy się z platformą Google Workspace Developer Assist MCP, która udostępnia narzędzia do uzyskiwania dostępu do dokumentacji dla programistów Google Workspace i wyszukiwania w niej informacji.
Sprawdź pojęcia
Model Context Protocol (MCP)
Model Context Protocol to platforma open source, która integruje modele z usługami zewnętrznymi w ustandaryzowany sposób. Modele mogą programowo wykrywać, rozumieć i wykorzystywać różne narzędzia, co zwiększa ich możliwości, pozwala wykonywać działania w świecie rzeczywistym i uzyskiwać dostęp do aktualnych informacji.
MCP TypeScript SDK
Pakiet SDK TypeScript implementuje pełną specyfikację MCP, co upraszcza tworzenie klientów MCP, którzy łączą się z dowolnym serwerem MCP. Umożliwia też tworzenie serwerów MCP, które zapewniają dostęp do zasobów, promptów i narzędzi.
Proces sprawdzania
Sprawdź kod źródłowy
index.js
// Import the MCP TypeScript SDK.
import { Client } from "@modelcontextprotocol/sdk/client/index.js";
import { StreamableHTTPClientTransport } from "@modelcontextprotocol/sdk/client/streamableHttp.js";
import { SSEClientTransport } from "@modelcontextprotocol/sdk/client/sse.js";
...
// Create and connect the MCP client from the URL.
const mcpServerUrl = new URL("https://workspace-developer.goog/mcp");
const client = new Client({ name: "gen-ai-app-mcp", version: "1.0.0" });
// Try Streamable HTTP first (new) and SSE (old) as fallback for transport
try {
await client.connect(new StreamableHTTPClientTransport(mcpServerUrl));
} catch (error) {
await client.connect(new SSEClientTransport(mcpServerUrl));
}
http('gen-ai-app', async (req, res) => {
...
const aiResponse = await genAI.models.generateContent({
model: env.model,
contents: prompt,
// MCP tools are enabled
config: { tools: [mcpToTool(client)]}
});
...
}
...
package.json
...
"dependencies": {
...
"@modelcontextprotocol/sdk": "^1.18.1"
},
...
Aktualizowanie funkcji Node.js w Google Cloud Run
- W lokalnym środowisku programistycznym zmień bieżący katalog na
node/chat/gen-ai-apps/4-mcp
. Zawiera cały kod źródłowy i wszystkie zasoby. - Otwórz kartę Źródło na stronie szczegółów usługi funkcji Google Cloud Run.
- Kliknij Edytuj źródło.
- Zastąp całą zawartość plików
index.js
ipackage.json
zawartością plików w lokalnym środowisku programistycznym. - Kliknij Zapisz i wdroż ponownie.
- Poczekaj na zakończenie wdrażania wersji.
Wypróbuj
- Na czacie z aplikacją w Google Chat wpisz
What can you do for me?
i naciśnijenter
. Aplikacja powinna opisywać, co potrafi (narzędzia MCP).
- Na czacie z aplikacją w Google Chat wpisz
I would like to get the latest official documentation for the Google Sheets API append values
i naciśnijenter
. Aplikacja powinna odpowiedzieć, podając żądaną dokumentację (przy użyciu narzędzi MCP).
7. Aplikacja wieloetapowa
Ta aplikacja jest oparta na Format app
i dodaje obsługę pamięci konwersacyjnej przez śledzenie historii interakcji na czacie. Umożliwia to bardziej naturalne, inteligentne i spersonalizowane korzystanie z usługi. Aplikacja używa do przechowywania domyślnej bazy danych Google Cloud Firestore powiązanej z projektem Google Cloud.
Przejrzyj pojęcia
Wielokrotne
Pojęcie wieloetapowości odnosi się do zdolności modelu do utrzymywania kontekstu i ciągłości w wielu wymianach zdań i rozmowach. Jest to niezbędna funkcja do obsługi złożonych rozmów, zaawansowanych funkcji opartych na AI i naturalnej obsługi.
Google Cloud Firestore
Google Cloud Firestore to elastyczna i skalowalna baza danych NoSQL w chmurze do tworzenia aplikacji mobilnych, internetowych i serwerowych. Przechowuje dane w dokumentach pogrupowanych w kolekcje i umożliwia synchronizację w czasie rzeczywistym oraz obsługę offline.
Proces sprawdzania
Sprawdź kod źródłowy
index.js
// Import the Google Cloud Firestore client library.
import { Firestore } from '@google-cloud/firestore';
...
// Configure DB
const USERS_PREFIX = 'users/';
const CHATS_COLLECTION = 'chats';
const db = new Firestore();
...
// Create or update data for a given user
async function createOrUpdateChatHistory(userId, data) {
await db.collection(CHATS_COLLECTION).doc(userId.replace(USERS_PREFIX, '')).set(data);
};
// Retrieve data snapshot for a given user
async function getChatHistory(userId) {
return await db.collection(CHATS_COLLECTION).doc(userId.replace(USERS_PREFIX, '')).get();
};
...
...
http('gen-ai-app', async (req, res) => {
// Retrieve the chat history of the user
const chatHistory = await getChatHistory(userId);
const chat = genAI.chats.create({
model: env.model,
// Initiate the model with chat history for context
history: chatHistory.exists ? chatHistory.data().contents : []
});
// If no history, send a first message to the model with instructions on how to behave
if(!chatHistory.exists) {
const preambule = 'The only formatting options you can use is to '
+ ...
+ 'DO NOT USE ANY OTHER FORMATTING OTHER THAN THOSE. '
+ 'Answer in the same language that I use.';
// The answer to this message is ignored
await chat.sendMessage({message: preambule});
}
// Send the user's message to the model to generate the answer
const aiResponse = await chat.sendMessage({message: userMessage});
// Persist the updated chat history of the user
await createOrUpdateChatHistory(userId, {contents: chat.getHistory({curated: true})});
// Send a Chat message with the generated answer
return res.send({ hostAppDataAction: { chatDataAction: { createMessageAction: { message: {
text: aiResponse.candidates[0].content.parts[0].text
}}}}});
});
...
package.json
...
"dependencies": {
...
"@google-cloud/firestore": "^7.11.5"
},
...
Włączanie interfejsu Google Cloud Firestore API
- Kliknij Menu ☰ > Interfejsy API i usługi > Włączone interfejsy API i usługi, a potem sprawdź, czy na liście znajduje się Cloud Firestore API.
Tworzenie bazy danych Cloud Firestore
- W konsoli Google Cloud kliknij Menu ☰ > Firestore.
- Kliknij Utwórz bazę danych Firestore.
- Pozostaw domyślną konfigurację i kliknij Utwórz bazę danych.
Aktualizowanie funkcji Node.js w Google Cloud Run
- W lokalnym środowisku programistycznym zmień bieżący katalog na
node/chat/gen-ai-apps/5-multi-turn
. Zawiera cały kod źródłowy i wszystkie zasoby. - Otwórz kartę Źródło na stronie szczegółów usługi funkcji Google Cloud Run.
- Kliknij Edytuj źródło.
- Zastąp całą zawartość plików
index.js
ipackage.json
zawartością plików w lokalnym środowisku programistycznym. - Kliknij Zapisz i wdroż ponownie.
- Poczekaj na zakończenie wdrażania wersji.
Wypróbuj
- Na czacie z aplikacją w Google Chat wpisz
Can you speak with the English from the 80's for now on?
i naciśnijenter
. Aplikacja powinna odpowiedzieć pozytywnie.
- Na czacie z aplikacją w Google Chat wpisz
Define what Google Chat apps are in one sentence
i naciśnijenter
. Aplikacja powinna nadal odpowiadać w języku angielskim z lat 80.
8. Aplikacja z niestandardowym narzędziem
Ta aplikacja korzysta z Multi-turn app
, dodając obsługę niestandardowego narzędzia do wywoływania funkcji, które używa interfejsu Google Workspace Calendar API do pobierania następnego wydarzenia z kalendarza publicznego. Model zarządza wszystkimi interakcjami użytkownika, w tym odbieraniem danych wejściowych i dostarczaniem danych wyjściowych z narzędzia. Aplikacja jest jednak nadal odpowiedzialna za wykonywanie niezbędnych wywołań interfejsu API i dostarczanie wyników do modelu na żądanie. Aplikacja używa klucza interfejsu API Google, ponieważ do pobierania publicznych danych kalendarza nie są potrzebne dane logowania użytkownika.
Sprawdź pojęcia
Wywoływanie funkcji
Wywoływanie funkcji umożliwia modelowi wykrywanie, kiedy żądanie użytkownika może zostać zrealizowane przez zewnętrzne narzędzie lub interfejs API. Następnie model podaje parametry potrzebne do wywołania tego narzędzia, integrując w ten sposób funkcje zewnętrzne w swoich odpowiedziach.
Interfejsy Google Workspace API
Interfejsy Google Workspace API umożliwiają programistom integrowanie aplikacji z różnymi usługami Google Workspace. Te interfejsy API zapewniają programowy dostęp do funkcji różnych usług, takich jak Gmail, Google Chat, Kalendarz, Dysk, Dokumenty, Arkusze i inne, umożliwiając automatyzację, synchronizację danych i tworzenie niestandardowych procesów.
Proces sprawdzania
Sprawdź kod źródłowy
env.js
...
// Replace with your Google API key.
googleApiKey: process.env.GOOGLE_API_KEY || 'your-google-api-key',
...
index.js
// Import parameter type definitions from Google Gen AI SDK.
import { GoogleGenAI, Type } from '@google/genai';
// Import Google APIs that include the Google Calendar API.
import { google } from 'googleapis';
...
// Create a Google Calendar API client using a Google API key.
const calendar = google.calendar({version: 'v3', auth: env.googleApiKey});
...
// Define the tool used for function calling
const getNextPublicCalendarEventTitleFunctionDeclaration = {
name: 'getNextPublicCalendarEventTitle',
parameters: {
type: Type.OBJECT,
description: 'Get the title of the next event of a public calendar.',
properties: {
calendarId: {
type: Type.STRING,
description: 'ID of the public calendar to get the next event title.',
}
},
required: ['calendarId']
}
};
// The function referenced in the tool definition
async function getNextPublicCalendarEventTitle(calendarId) {
// Use Calendar API to retrieve the next event in the given calendar
const response = await calendar.events.list({
calendarId: calendarId,
timeMin: new Date().toISOString(),
maxResults: 1,
singleEvents: true,
orderBy: 'startTime',
});
const events = response.data.items;
if (!events || events.length === 0) {
return null;
}
return `${events[0].summary}`;
};
...
...
http('gen-ai-app', async (req, res) => {
...
// Send the user's message to the model to generate the answer
let aiResponse = await chat.sendMessage({
message: userMessage,
// The tool used for function calling is enabled
config: { tools: [{ functionDeclarations: [getNextPublicCalendarEventTitleFunctionDeclaration]}]}
});
// Handle the function calling turn with the model if any
const functionCall = aiResponse.candidates[0].content.parts[0].functionCall;
if (functionCall) {
let functionResult = null;
switch(functionCall.name) {
case 'getNextPublicCalendarEventTitle':
// Make the function call as per model request
functionResult = await getNextPublicCalendarEventTitle(functionCall.args['calendarId']);
break;
default:
}
// Finish the function calling turn by sending the execution result to the model
aiResponse = await chat.sendMessage({ message: { functionResponse: {
name: functionCall.name,
response: { output: functionResult }
}}});
}
...
// Send a Chat message with the generated answer
return res.send({ hostAppDataAction: { chatDataAction: { createMessageAction: { message: {
text: aiResponse.candidates[0].content.parts[0].text
}}}}});
});
...
package.json
...
"dependencies": {
...
"googleapis": "^160.0.0"
},
...
Włączanie interfejsu Calendar API
- Kliknij Menu ☰ > Interfejsy API i usługi > Włączone interfejsy API i usługi, a następnie sprawdź, czy na liście znajduje się Interfejs Google Calendar API.
Tworzenie klucza interfejsu API Google
W konsoli Google Cloud wykonaj te czynności:
- Kliknij Menu ☰ > Interfejsy API i usługi > Dane logowania.
- Kliknij + Utwórz dane logowania, a potem wybierz Klucz interfejsu API.
- Poczekaj na zakończenie operacji.
- W oknie potwierdzenia znajdź pole tekstowe Twój klucz API i kliknij Skopiuj do schowka.
Aktualizowanie funkcji Node.js w Google Cloud Run
- W lokalnym środowisku programistycznym zmień bieżący katalog na
node/chat/gen-ai-apps/6-custom-tool
. Zawiera cały kod źródłowy i wszystkie zasoby. - Otwórz kartę Źródło na stronie szczegółów usługi funkcji Google Cloud Run.
- Kliknij Edytuj źródło.
- Zastąp całą zawartość plików
index.js
ipackage.json
zawartością plików w lokalnym środowisku programistycznym. - Otwórz plik
env.js
i wykonaj te czynności: - Dodaj do wyeksportowanych pól parametr googleApiKey.
export const env = {
...
googleApiKey: 'your-google-api-key',
};
- Zastąp
your-google-api-key
kluczem interfejsu Google API skopiowanym w poprzednim kroku. Możesz go pobrać ze strony danych logowania Google Cloud, klikając Pokaż klucz.
- Kliknij Zapisz i wdroż ponownie.
- Poczekaj na zakończenie wdrażania wersji.
Wypróbuj
- W Kalendarzu Google wykonaj te czynności:
- W sekcji Inne kalendarze kliknij +, a następnie Utwórz nowy kalendarz.
- Ustaw Name na
My Public Calendar
- Kliknij Utwórz kalendarz.
- Poczekaj na zakończenie operacji.
- W sekcji Ustawienia moich kalendarzy wybierz nowo utworzony kalendarz Mój kalendarz publiczny.
- W sekcji Uprawnienia dostępu do wydarzeń wybierz Udostępnij publicznie, a następnie w oknie Ostrzeżenie kliknij OK.
- W sekcji Uprawnienia dostępu do wydarzeń w menu obok opcji Udostępnij publicznie wybierz Wyświetlanie wszystkich szczegółów wydarzeń.
- W sekcji Integrowanie kalendarza skopiuj do schowka wartość pola Identyfikator kalendarza.
- Aby zamknąć Ustawienia, kliknij strzałkę w lewo w lewym górnym rogu.
- Kliknij kalendarz, aby utworzyć nowe wydarzenie na jutro, wpisz
Important meeting
, w menu wybierz Mój kalendarz publiczny, a następnie kliknij Zapisz. - Na czacie z aplikacją w Google Chat wpisz
When is the next meeting?
i naciśnijenter
. Aplikacja powinna poprosić o precyzyjną datę, ponieważ nie wiadomo, o który kalendarz chodzi.
- W pokoju wiadomości na czacie w aplikacji Chat w Google Chat wklej skopiowany wcześniej do schowka identyfikator kalendarza i naciśnij
enter
. Aplikacja powinna odpowiedzieć, podając szczegóły utworzonego wcześniej wydarzenia.
9. Aplikacja do odtwarzania strumieniowego
Ta aplikacja korzysta z modelu Gemini, aby generować 2-minutowe opowiadania na podstawie tematów podanych przez użytkowników. Generowanie pełnych odpowiedzi zajmuje trochę czasu, dlatego aplikacja wywołuje model w trybie przesyłania strumieniowego i korzysta z interfejsu Google Chat API, aby wysyłać treści i stany w wiadomościach w miarę postępów.
Sprawdź pojęcia
Google Chat API
Google Chat API umożliwia programistom interakcję z Google Chat, dzięki czemu mogą oni wysyłać wiadomości, tworzyć pokoje, zarządzać uczestnikami rozmów i wykonywać inne czynności, aby tworzyć niestandardowe integracje i boty.
Strumieniując
Strumieniowanie to proces odbierania danych w ciągłym strumieniu, a nie czekania na wygenerowanie całej odpowiedzi. W przypadku wywołań modeli AI przesyłanie strumieniowe umożliwia aplikacjom wyświetlanie użytkownikom częściowych wyników od razu po ich udostępnieniu, co poprawia postrzeganą wydajność i wygodę użytkowników, zwłaszcza w przypadku dłuższych zadań generowania. Jest to szczególnie istotne w przypadku modeli generatywnej AI, które mogą potrzebować dużo czasu na wygenerowanie pełnych danych wyjściowych.
Proces sprawdzania
Sprawdzanie kodu źródłowego
index.js
// Import Google Auth library used to create Google Chat API client
import { GoogleAuth } from 'google-auth-library';
...
http('gen-ai-app', async (req, res) => {
// Use app authentication.
// Application Default Credentials (ADC) will use the Cloud Run function's
// default service account, we just need to specify the Chat API app auth scopes.
const auth = new GoogleAuth({
// Chat API app authentication scopes
scopes: ['https://www.googleapis.com/auth/chat.bot']
});
// Create Chat service client with application credentials
const chatClient = google.chat({
version: 'v1',
auth: await auth.getClient()
});
// Send a server streaming request to generate the answer
const aiResponse = await genAI.models.generateContentStream({
model: env.model,
contents: `Generate a story about a ${userMessage}. `
+ `It should take 2 minutes to read it out loud.`
});
// Send a first Chat message to summarize what will be done
await chatClient.spaces.messages.create({
parent: spaceName,
requestBody: { text: `Sure, let me work on generating a short story `
+ `about a ${userMessage} like you requested.`}
});
// Go through the response chunks received from the stream
let messageName = undefined;
let answer = "";
for await (const chunk of aiResponse) {
const text = chunk.text;
if (text) {
// Update the answer by concatenating the response chunks
answer += text;
// The Chat message request body is the same for message creation and update
const responseBody = {
text: answer,
accessoryWidgets: [getStatusAccessoryWidget('Generating story...', 'progress_activity')]
}
if (!messageName) {
// Create a Chat message dedicated to the generated content
const messageResponse = await chatClient.spaces.messages.create({
parent: spaceName,
requestBody: responseBody
});
messageName = messageResponse.data.name;
} else {
// Update the Chat message dedicated to the generated content
await chatClient.spaces.messages.patch({
name: messageName,
updateMask: 'text,accessory_widgets',
requestBody: responseBody
});
}
}
}
// Update the accessory widget with final progress status
await chatClient.spaces.messages.patch({
name: messageName,
updateMask: 'accessory_widgets',
requestBody: {
accessoryWidgets: [getStatusAccessoryWidget('Story is fully generated', 'check')]
}
});
// Send a last Chat message to confirm it's done
return res.send({ hostAppDataAction: { chatDataAction: { createMessageAction: { message: {
text: 'All done, I hope you like it!'
}}}}});
});
// Create an accessory widget with progress status
function getStatusAccessoryWidget(text, icon) {
return { buttonList: { buttons: [{
text: text,
icon: { materialIcon: { name: icon}},
// This is a workaround to have the icon shown, it's not clickable
onClick: { openLink: { url: "https://google.com"}},
disabled: true
}]}};
}
package.json
...
"dependencies": {
...
"google-auth-library": "^10.3.0"
},
...
Aktualizowanie funkcji Node.js w Google Cloud Run
- W lokalnym środowisku programistycznym zmień bieżący katalog na
node/chat/gen-ai-apps/7-stream
. Zawiera cały kod źródłowy i wszystkie zasoby. - Otwórz kartę Źródło na stronie szczegółów usługi funkcji Google Cloud Run.
- Kliknij Edytuj źródło.
- Zastąp całą zawartość plików
index.js
ipackage.json
zawartością plików w lokalnym środowisku programistycznym. - Kliknij Zapisz i wdroż ponownie.
- Poczekaj na zakończenie wdrażania wersji.
Wypróbuj
Na czacie z aplikacją w Google Chat wpisz turtle
i naciśnij enter
. Aplikacja powinna odpowiedzieć komunikatem potwierdzającym, wygenerowaną historią z informacją o postępach oraz komunikatem potwierdzającym zakończenie.
10. Aplikacja multimodalna
Ta aplikacja korzysta z modelu do edytowania obrazów na podstawie instrukcji tekstowych użytkowników. Zarówno użytkownicy, jak i aplikacja dodają swoje obrazy jako załączniki do wiadomości w Google Chat, aby je wymieniać. Aplikacja korzysta z interfejsów Google Chat API, aby programowo pobierać i przesyłać obrazy.
Sprawdź pojęcia
Załącznik do wiadomości w Google Chat
Załączniki do wiadomości w Google Chat to pliki, takie jak obrazy lub filmy, które są przesyłane do wiadomości w Google Chat. Tymi załącznikami można zarządzać programowo, co umożliwia aplikacjom interakcję z multimediami bezpośrednio w rozmowach.
Przekazywanie dostępu w całej domenie (DWD)
Przekazywanie dostępu w całej domenie umożliwia kontu usługi podszywanie się pod użytkowników w domenie Google Workspace, dzięki czemu aplikacje mogą wykonywać działania w imieniu tych użytkowników bez bezpośredniej autoryzacji. Jest to przydatne w przypadku aplikacji, które muszą uzyskiwać dostęp do danych użytkownika lub wykonywać działania (np. przesyłać załączniki do Google Chat) w kontekście użytkownika, nawet gdy nie jest on aktywnie obecny, poprzez przyznanie kontu usługi szerokiego dostępu w całej domenie.
Proces sprawdzania
Sprawdź kod źródłowy
env.js
...
// Replace with the Gemini model to use.
model: process.env.MODEL || 'gemini-2.0-flash-preview-image-generation',
...
index.js
...
// Import byte stream management libraries.
import { Buffer } from 'buffer';
import { Readable } from 'stream';
...
// Download a Google Chat attachment as base 64 string.
async function downloadFile(appChatClient, attachmentName) {
const response = await appChatClient.media.download({
resourceName: attachmentName,
alt: 'media'
}, {
responseType: 'stream'
});
const chunks = [];
return new Promise((resolve) => {
response.data.on('data', (chunk) => {
chunks.push(chunk);
});
response.data.on('end', () => {
const fileBuffer = Buffer.concat(chunks);
const base64String = fileBuffer.toString('base64');
resolve(base64String);
});
});
}
// Upload a base 64 string as Google Chat attachment of a space.
async function uploadFile(useChatClient, spaceName, data) {
const filename = 'generated_image.png';
return await userChatClient.media.upload({
parent: spaceName,
requestBody: { filename: filename },
media: {
mimeType: 'image/png',
body: Readable.from(Buffer.from(data, 'base64'))
}
});
}
...
...
http('gen-ai-app', async (req, res) => {
const userEmail = req.body.chat.user.email;
const spaceName = req.body.chat.messagePayload.space.name;
const userMessage = req.body.chat.messagePayload.message.text;
const attachmentName = req.body.chat.messagePayload.message.attachment[0].attachmentDataRef.resourceName;
const attachmentContentType = req.body.chat.messagePayload.message.attachment[0].contentType;
// Set up app authentication used to download the attachment input
// Application Default Credentials (ADC) will use the Cloud Run function's
// default service account.
const appAuth = new GoogleAuth({
// Specify the Chat API app authentication scopes
scopes: ['https://www.googleapis.com/auth/chat.bot']
});
// Create Chat service client with application credentials
const appChatClient = google.chat({
version: 'v1',
auth: await appAuth.getClient()
});
// Send a request to generate the answer with both text and image contents
const aiResponse = await genAI.models.generateContent({
model: env.model,
contents: [{
role: 'USER',
parts: [
// The text content of the message
{ text: userMessage },
// The attachment of the message is downloaded and added inline
{ inlineData: {
data: await downloadFile(appChatClient, attachmentName),
mimeType: attachmentContentType
}}
]
}],
config: { responseModalities: ['TEXT', 'IMAGE']}
});
// Set up user impersonation authentication used to upload the attachment output
// and send the response.
const impersonatedUserAuth = new GoogleAuth({
// Specify the Chat API user authentication scopes
scopes: ['https://www.googleapis.com/auth/chat.messages'],
keyFile: './credentials.json',
clientOptions: {
// Impersonate the user who sent the original message
subject: userEmail
}
});
// Create Chat service client with impersonated user credentials
const userChatClient = google.chat({
version: 'v1',
auth: await impersonatedUserAuth.getClient()
});
let responseText = undefined;
let responseAttachment = undefined;
// Go through the response parts received
for (const part of aiResponse.candidates[0].content.parts) {
if (part.inlineData) {
// The resulting image is retrieved inline and uploaded
const mediaResponse = await uploadFile(userChatClient, spaceName, part.inlineData.data);
responseAttachment = mediaResponse.data;
} else {
responseText = part.text;
}
}
// Create a Chat message dedicated to the generated content
await userChatClient.spaces.messages.create({
parent: spaceName,
requestBody: {
text: responseText ? responseText : 'Here it is!',
// The uploaded image is referenced as attachment
attachment: responseAttachment ? [responseAttachment] : undefined
}
});
// Send a last Chat message to confirm it's done
return res.send({ hostAppDataAction: { chatDataAction: { createMessageAction: { message: {
text: 'Done, feel free to let me know if you need anything else!'
}}}}});
});
...
Konfigurowanie konta usługi i eksportowanie prywatnego klucza
- Delegowanie domyślnego konta usługi Cloud Run do zarządzania wiadomościami w Google Chat użytkowników. Postępuj zgodnie z instrukcjami, używając zakresu https://www.googleapis.com/auth/chat.messages. Aby pobrać identyfikator klienta domyślnego konta usługi Cloud Run, wykonaj te czynności:
- Kliknij Menu ☰ > Administracja > Konta usługi.
- Kliknij konto usługi o nazwie Domyślne konto usługi Compute.
- Rozwiń sekcję Ustawienia zaawansowane.
- Skopiuj Identyfikator klienta do schowka.
- Tworzenie i pobieranie nowego klucza prywatnego dla domyślnego konta usługi Cloud Run
- Kliknij Menu ☰ > Administracja > Konta usługi.
- Kliknij konto usługi o nazwie Domyślne konto usługi Compute.
- Kliknij kartę Klucze, a potem Dodaj klucz i Utwórz nowy klucz.
- Wybierz JSON, a potem kliknij Utwórz.
- Nowa para kluczy publicznych/prywatnych zostanie wygenerowana i pobrana na Twoje urządzenie jako nowy plik. Zapisz pobrany plik JSON i skopiuj jego zawartość do schowka. Jest to jedyna kopia tego klucza. Informacje o tym, jak bezpiecznie przechowywać klucz, znajdziesz w artykule Zarządzanie kluczami konta usługi.
Aktualizowanie funkcji Node.js w Google Cloud Run
- W lokalnym środowisku programistycznym zmień bieżący katalog na
node/chat/gen-ai-apps/8-multimodal
. Zawiera cały kod źródłowy i wszystkie zasoby. - Otwórz kartę Źródło na stronie szczegółów usługi funkcji Google Cloud Run.
- Kliknij Edytuj źródło.
- Kliknij ➕, wpisz
credentials.json
i kliknij ✔️, aby utworzyć brakujący plik zasobu. - Wklej zawartość pliku JSON pobranego w poprzednim kroku do nowo utworzonego pliku
credentials.json
. - Zastąp całą zawartość pliku
index.js
zawartością pliku w lokalnym środowisku programistycznym. - Otwórz plik
env.js
i ustaw wartość model nagemini-2.0-flash-preview-image-generation
.
...
model: 'gemini-2.0-flash-preview-image-generation',
...
- Kliknij Zapisz i wdroż ponownie.
- Poczekaj na zakończenie wdrażania wersji.
Wypróbuj
W pokoju na czacie z aplikacją Chat w Google Chat prześlij swoje zdjęcie portretowe w formacie PNG, wpisz Change the background color to blue
i naciśnij enter
. Aplikacja powinna odpowiedzieć, wyświetlając wersję zdjęcia z niebieskim tłem i wiadomość z potwierdzeniem zakończenia.
11. Czyszczenie danych
Usuwanie projektu Google Cloud
Aby uniknąć obciążenia konta Google Cloud opłatami za zasoby zużyte w tym ćwiczeniu, zalecamy usunięcie projektu Google Cloud.
W konsoli Google Cloud wykonaj te czynności:
- Kliknij Menu ☰ > Administracja > Ustawienia.
- Kliknij Wyłącz.
- Wpisz identyfikator projektu.
- Kliknij Wyłącz mimo to.
12. Gratulacje
Gratulacje! Utworzyliście aplikacje Google Chat jako dodatki do Google Workspace, które integrują podstawowe koncepcje AI.
Co dalej?
W tym laboratorium kodu prezentujemy tylko minimalistyczne przypadki użycia, ale istnieje wiele obszarów, które możesz rozwinąć w swoich aplikacjach Google Chat, np.:
- obsługiwać inne typy multimediów, takie jak dźwięk i wideo;
- Integracja z innymi modelami AI, w tym modelami niestandardowymi, hostowanymi na dedykowanych platformach, takich jak Vertex AI.
- Integracja z agentami, w tym z agentami niestandardowymi, hostowanymi na dedykowanych platformach, takich jak Agentspace i Dialogflow CX.
- Korzystaj z pętli opinii i klasyfikacji, aby monitorować i zwiększać wydajność.
- Publikuj na platformie, aby ułatwić pracę zespołom, organizacjom i użytkownikom publicznym.
Więcej informacji
Deweloperzy mają do dyspozycji wiele materiałów, takich jak filmy w YouTube, strony z dokumentacją, przykłady kodu i samouczki:
- Kanał Google Workspace Developers w YouTube – witamy programistów!
- Witryna z dokumentacją dla programistów dotyczącą Google Chat
- Repozytorium GitHub ze wszystkimi przykładami Google Chat
- Centrum dla deweloperów Google Cloud
- Generatywna AI w Vertex AI
- Modele generatywnej AI
- Dostrajanie modeli generatywnej AI
- Generatywne AI – trenowanie niestandardowe