Bu kılavuzda, Chat API'deki StreamMessage kaynağını kullanarak Google Chat'te mesajların nasıl kademeli olarak yayınlanacağı açıklanmaktadır. Akış, Google Chat uygulamanızın canlı ilerleme göstergelerini, ara akıl yürütme veya araç yürütme adımlarını ve bir mesajı tamamlamadan önce artımlı metin yanıtlarını görüntülemesine olanak tanır.
Akış, üretken yapay zeka tarafından desteklenen Chat uygulamaları veya eksiksiz bir yanıt oluşturmanın birkaç saniye ya da dakika sürdüğü uzun süreli arka uç iş akışları için tasarlanmıştır.
Mesaj akışının işleyiş şekli
Akış mesajı, bir alanda standart bir Message kaynağı olmadan önce etkin bir akış durumundan geçer:
- Akış başlatma (
spaces.streamMessages.create): Chat uygulamanız, yanıtladığı kullanıcı etkileşimi mesajına referans vererek mesaj dizisine dayalı bir alandaStreamMessageoluşturur. API, ileti dizisinde canlı bir ilerleme göstergesi gösterir ve birStreamMessagekaynak adı ile ilknextChunkTokendeğerini döndürür. - Akışı güncelleme (
appendStreamMessageContentveyapatch): Chat uygulamanız çıkış oluştururken en sonnextChunkTokendeğerini kullanarak sıralı güncellemeler gönderir:- Yeni metin parçalarını birleştirmek, ara adımlar eklemek, satır içi alıntılar eklemek veya
progressTextdeğerini güncellemek içinspaces.streamMessages.appendStreamMessageContentyöntemini çağırın. - Akışla aktarılan içerik parçalarını değiştirmek için
spaces.streamMessages.patchyöntemini çağırın veyaprogressTextyöntemini yerinde güncelleyin.
- Yeni metin parçalarını birleştirmek, ara adımlar eklemek, satır içi alıntılar eklemek veya
- Canlı yayını sonlandırma veya silme (
commitveyadelete):- Akışı sonlandırmak ve kalıcı bir
Messagekaynağına dönüştürmek içinspaces.streamMessages.commityöntemini çağırın. Onaylama sırasında kartlar, aksesuar widget'ları ve altbilgi kaynakları gibi yalnızca onaylama öğeleri de ekleyebilirsiniz. - Alanda mesaj kaydetmeden etkin bir akışı silmek için
spaces.streamMessages.deleteyöntemini çağırın.
- Akışı sonlandırmak ve kalıcı bir
Bir akış etkinken yalnızca akışın yapıldığı referans mesajın (referencedMessage) göndereni, oluşturma işlemini iptal etmek için Durdur'u tıklayabilir. Chat, Chat uygulamanıza bir iptal sistemi komut etkinliği gönderir. Böylece arka uç çalışmasını durdurabilir ve kısmi çıkışı uygulayabilir ya da akışı silebilirsiniz.
Ön koşullar
Chat API ile mesaj akışı oluşturmak için aşağıdaki ön koşulları tamamlayın:
- Google Chat'e erişimi olan bir Business veya Enterprise Google Workspace hesabı.
- Ortamınızı ayarlama:
- Google Cloud projesi oluşturun.
- Chat uygulamanız için bir ad, simge ve açıklama belirleyerek Google Chat API'yi etkinleştirin ve yapılandırın.
- Hizmet hesabı kimlik bilgileri oluşturun ve bunları
credentials.jsonolarak kaydedin. Mesaj akışı içinhttps://www.googleapis.com/auth/chat.botyetkilendirme kapsamıyla uygulama kimlik doğrulaması gerekir. Kullanıcı kimlik doğrulaması desteklenmez.
- Chat uygulamanızı mesaj dizisi biçimli bir Chat alanına (veya en az bir mesaj içeren bire bir doğrudan mesaja) ekleyin ve yanıtlanacak erişilebilir bir mesajın (
spaces/SPACE_ID/messages/MESSAGE_ID) kaynak adını alın. Python örnekleri için Python ve
google-authiçin Google API İstemci Kitaplığı'nı yükleyin ve Chat API hizmet istemcisini ilk kullanıma hazırlayın:pip install google-api-python-client google-authfrom google.oauth2 import service_account from googleapiclient.discovery import build SCOPES = ["https://www.googleapis.com/auth/chat.bot"] creds = service_account.Credentials.from_service_account_file( "credentials.json", scopes=SCOPES ) chat = build("chat", "v1", credentials=creds)
Akış başlatma
Yanıtı akış şeklinde göstermeye başlamak için spaces.streamMessages.create yöntemini çağırın ve istek gövdesinde bir StreamMessage iletin:
referencedMessage(Zorunlu): Yanıtı tetikleyen mesajın kaynak adı.spaces/{space}/messages/{message}olarak biçimlendirilir. Referans verilen mesaj aynı alana ait olmalı ve Chat uygulamanız tarafından erişilebilir olmalıdır. Chat, akışla aktarılan yanıtıreferencedMessageile aynı ileti dizisinde yayınlar.progressText(Zorunlu): İlerleme göstergesinin yanında gösterilen, boş olmayan düz metin durum etiketi (en fazla 250 karakter), örneğin"Thinking...".markupSyntax(İsteğe bağlı): Mesaj içinMARKUP_SYNTAX_MARKDOWNveyaMARKUP_SYNTAX_CHATgibi metin biçimlendirme söz dizimi (MARKUP_SYNTAX_UNSPECIFIEDise varsayılan olarak Chat uygulamasının yapılandırılmış söz dizimi kullanılır). Satır içi alıntılar eklemeyi planlıyorsanızMARKUP_SYNTAX_MARKDOWNdeğerini ayarlayın.streamContentChunks(İsteğe bağlı): Hemen gösterilecek ilktext,stepveyacitationparçaları.
Sonraki çağrılar için yanıttan hem name (spaces/{space}/streamMessages/{stream_message}) hem de nextChunkToken değerini kaydedin.
HTTP
POST https://chat.googleapis.com/v1/spaces/SPACE_ID/streamMessages HTTP/1.1
Authorization: Bearer ACCESS_TOKEN
Content-Type: application/json
{
"referencedMessage": "spaces/SPACE_ID/messages/MESSAGE_ID",
"progressText": "Thinking...",
"markupSyntax": "MARKUP_SYNTAX_MARKDOWN"
}
Python
stream = (
chat.spaces()
.streamMessages()
.create(
parent="spaces/SPACE_ID",
body={
"referencedMessage": "spaces/SPACE_ID/messages/MESSAGE_ID",
"progressText": "Thinking...",
"markupSyntax": "MARKUP_SYNTAX_MARKDOWN",
},
)
.execute()
)
stream_name = stream["name"]
chunk_token = stream["nextChunkToken"]
Yöntem, bir StreamMessage kaynağı döndürür:
{
"name": "spaces/SPACE_ID/streamMessages/STREAM_MESSAGE_ID",
"progressText": "Thinking...",
"markupSyntax": "MARKUP_SYNTAX_MARKDOWN",
"nextChunkToken": "INITIAL_CHUNK_TOKEN"
}
İçerik parçaları ekleme
Chat uygulamanız ara adımlar veya metin jetonları oluştururken spaces.streamMessages.appendStreamMessageContent yöntemini çağırın:
chunkTokeniçin en sonnextChunkTokensürümünü geçin. Her başarılı çağrı, bir sonraki güncelleme veya kaydetme isteğinizde iletmeniz gereken yeni birnextChunkTokendöndürür.textparçaları, daha önce akışla aktarılan metne doğrudan eklenir. Parçalar arasında gerektiğinde boşluk veya yeni satır ekleyin.stepparçaları, mesajda gösterilen ara adımlar listesine eklenir.progressTextisteğe bağlıdır.progressTextparametresini atlarsanız veya""değerine ayarlarsanız Chat, daha önce ayarlananprogressTextdeğerini göstermeye devam eder.
HTTP
POST https://chat.googleapis.com/v1/spaces/SPACE_ID/streamMessages/STREAM_MESSAGE_ID:appendStreamMessageContent HTTP/1.1
Authorization: Bearer ACCESS_TOKEN
Content-Type: application/json
{
"chunkToken": "INITIAL_CHUNK_TOKEN",
"progressText": "Searching documentation...",
"streamContentChunks": [
{
"step": {
"title": "Search knowledge base",
"description": "Found 3 matching articles."
}
},
{
"text": "See <chat-citation data-id=\"c1\">guide</chat-citation>:\n"
},
{
"citation": {
"id": "c1",
"citedSources": [
{
"title": "System Architecture Guide",
"uri": "https://example.com/docs/arch"
}
]
}
}
]
}
Python
stream = (
chat.spaces()
.streamMessages()
.appendStreamMessageContent(
name=stream_name,
body={
"chunkToken": chunk_token,
"progressText": "Searching documentation...",
"streamContentChunks": [
{
"step": {
"title": "Search knowledge base",
"description": "Found 3 matching articles.",
}
},
{
"text": (
'See <chat-citation data-id="c1">'
"guide</chat-citation>:\n"
)
},
{
"citation": {
"id": "c1",
"citedSources": [
{
"title": "System Architecture Guide",
"uri": "https://example.com/docs/arch",
}
],
}
},
],
},
)
.execute()
)
chunk_token = stream["nextChunkToken"]
Akışla aktarılan içeriği veya ilerleme metnini değiştirme
Daha önce akışla aktarılan içeriği yeniden yazmanız (ör. bir son işleme veya güvenlik filtresi çalıştırdıktan sonra) ya da parça eklemeden yalnızca progressText değerini güncellemeniz gerekiyorsa spaces.streamMessages.patch yöntemini çağırın:
updateMaskparametresini, güncellenecek alanların virgülle ayrılmış listesi olarak ayarlayın:progressText,streamContentChunksveyaprogressText,streamContentChunks.StreamMessageistek gövdesine en sonnextChunkTokendeğerini ekleyin ve yanıtta döndürülen yeninextChunkTokendeğerini kaydedin.streamContentChunks,updateMaskmodundayken sağlanan parçalar, daha önce akışla aktarılan içeriğe eklenmek yerine bu içeriğin yerini alır.progressText,updateMaskolduğundaprogressText, 250 karaktere kadar boş olmayan düz metin olmalıdır.
HTTP
PATCH https://chat.googleapis.com/v1/spaces/SPACE_ID/streamMessages/STREAM_MESSAGE_ID?updateMask=progressText,streamContentChunks HTTP/1.1
Authorization: Bearer ACCESS_TOKEN
Content-Type: application/json
{
"nextChunkToken": "LATEST_CHUNK_TOKEN",
"progressText": "Formatting response...",
"streamContentChunks": [
{
"text": "Updated response text."
}
]
}
Python
stream = (
chat.spaces()
.streamMessages()
.patch(
name=stream_name,
updateMask="progressText,streamContentChunks",
body={
"nextChunkToken": chunk_token,
"progressText": "Formatting response...",
"streamContentChunks": [
{"text": "Updated response text."}
],
},
)
.execute()
)
chunk_token = stream["nextChunkToken"]
Canlı yayını tamamlama
Oluşturma işlemi tamamlandığında, akışı kalıcı bir Message kaynağına dönüştürmek için en son chunkToken ile spaces.streamMessages.commit yöntemini çağırın:
- İsteğe bağlı olarak, yalnızca onaylama parçası türleri (
card,accessoryWidgetvecitedSource) dahil olmak üzere onaylama isteğine sonstreamContentChunksekleyebilirsiniz. Önceki çağrılarda boş olmayan içerik yayınladıysanız onaylama sırasında
streamContentChunksparametresini atlayabilirsiniz. Son kaydedilen mesaj boş olamaz.
HTTP
POST https://chat.googleapis.com/v1/spaces/SPACE_ID/streamMessages/STREAM_MESSAGE_ID:commit HTTP/1.1
Authorization: Bearer ACCESS_TOKEN
Content-Type: application/json
{
"chunkToken": "LATEST_CHUNK_TOKEN",
"streamContentChunks": [
{
"text": "All checks passed."
},
{
"citedSource": {
"title": "Deployment Runbook",
"uri": "https://example.com/docs/runbook"
}
},
{
"card": {
"cardId": "details-card",
"card": {
"header": {
"title": "Build Status"
},
"sections": [
{
"widgets": [
{
"textParagraph": {
"text": "All 42 checks succeeded."
}
}
]
}
]
}
}
}
]
}
Python
status_card = {
"cardId": "details-card",
"card": {
"header": {"title": "Build Status"},
"sections": [
{
"widgets": [
{"textParagraph": {"text": "All 42 checks succeeded."}}
]
}
],
},
}
commit_response = (
chat.spaces()
.streamMessages()
.commit(
name=stream_name,
body={
"chunkToken": chunk_token,
"streamContentChunks": [
{"text": "All checks passed."},
{
"citedSource": {
"title": "Deployment Runbook",
"uri": "https://example.com/docs/runbook",
}
},
{"card": status_card},
],
},
)
.execute()
)
final_message = commit_response["message"]
print(f"Committed message: {final_message['name']}")
Etkin bir akışı silme
Düzeltilemeyen bir hata oluşursa veya kullanıcı oluşturma işlemini iptal ederse ve mesaj dizisinde kısmi bir yanıt bırakmak istemiyorsanız spaces.streamMessages.delete yöntemini çağırın:
HTTP
DELETE https://chat.googleapis.com/v1/spaces/SPACE_ID/streamMessages/STREAM_MESSAGE_ID HTTP/1.1
Authorization: Bearer ACCESS_TOKEN
Python
chat.spaces().streamMessages().delete(name=stream_name).execute()
Bir akış Message içine kaydedildikten sonra, kesinleştirilmiş mesajı silmeniz gerekirse bunun yerine spaces.messages.delete yöntemini çağırın.
Desteklenen içerik parçası türleri
streamContentChunks içindeki her giriş, StreamContentChunk birleşimindeki bir alanı belirtir. Bazı parça türleri akış boyunca gönderilebilirken diğerleri yalnızca spaces.streamMessages.commit içinde kabul edilir:
| Parça alanı | Desteklenen yöntemler | Son Message alanı |
Notlar |
|---|---|---|---|
text |
create, appendStreamMessageContent,
patch, commit |
text |
Artımlı metin. appendStreamMessageContent tarihinde birleştirildi; patch tarihinde değiştirildi.
Nihai metin 32.000 baytı aşamaz. |
step |
create, appendStreamMessageContent,
patch, commit |
elements.steps.steps[] |
Düz metin title (gerekli) ve isteğe bağlı description içeren ara işleme adımı. |
citation |
create, appendStreamMessageContent,
patch, commit |
elements.citations[] |
Alfanümerik id (63 karakterden az, alt çizgi kullanılabilir) ve citedSources ile satır içi Citation. text içinde markupSyntax: "MARKUP_SYNTAX_MARKDOWN" ve eşleşen <chat-citation data-id="ID">...</chat-citation> etiketleri gerekir. Mevcut bir id ile citation göndermek, önceki alıntının üzerine yazılmasına neden olur. |
card |
Yalnızca commit |
cardsV2[] |
Etkileşimli veya bilgilendirici
CardWithId kart. |
accessoryWidget |
Yalnızca commit |
accessoryWidgets[] |
İletinin altında gösterilen, geri bildirim düğmeleri gibi AccessoryWidget düğmeleri. |
citedSource |
Yalnızca commit |
elements.citedSources[] |
Mesajın altında satır içi alıntı etiketleri olmadan gösterilen CitedSource altbilgi bağlantısı. |
Kullanıcı tarafından başlatılan akış iptalini işleme
Bir akış etkinken yalnızca akışın yapıldığı referans mesajın (referencedMessage) göndereni, akış mesajında Durdur'u tıklayabilir. Kullanıcı bir akışı durdurduğunda Chat, Chat uygulamanızın uç noktasına cancelStream.streamMessage (durdurulan akışın spaces/{space}/streamMessages/{stream_message} kaynak adı) içeren bir sistem komutu etkileşim etkinliği gönderir.
Gelen JSON yükünün yapısı, Chat uygulamanızı Google Workspace eklentisi olarak mı yoksa Chat API etkileşim etkinliklerini kullanarak mı oluşturduğunuza bağlıdır:
Google Workspace eklentileri
{
"commonEventObject": {
"hostApp": "CHAT"
},
"chat": {
"user": {
"name": "users/USER_ID"
},
"space": {
"name": "spaces/SPACE_ID"
},
"systemCommandPayload": {
"systemCommandMetadata": {
"cancelStream": {
"streamMessage": "spaces/SPACE_ID/streamMessages/STREAM_ID"
}
}
}
}
}
Google Chat API
{
"type": "SYSTEM_COMMAND",
"space": {
"name": "spaces/SPACE_ID"
},
"user": {
"name": "users/USER_ID"
},
"systemCommandMetadata": {
"cancelStream": {
"streamMessage": "spaces/SPACE_ID/streamMessages/STREAM_ID"
}
}
}
Chat uygulamanız bir cancelStream etkinliği aldığında:
- Arka plan çalışanınıza,
streamMessageiçin daha fazla jeton oluşturmayı veya alt araçları çalıştırmayı durdurması talimatını verin. - Aşağıdaki yaklaşımlardan birini kullanarak etkin akışı çözün:
- Kısmi çıkışı sakla: En son
chunkTokenilespaces.streamMessages.commitişlevini çağırın (isteğe bağlı olarak"\n\n_Generation stopped._"gibi bir not ekleyin). - Yanıtı silme: İleti dizisine hiçbir şey kaydedilmemesi için
spaces.streamMessages.deleteyöntemini çağırın.
- Kısmi çıkışı sakla: En son
- Etkileşim etkinlik işleyicinizden boş bir HTTP
200 OKJSON yanıtı ({}) döndürün.
Sınırlamalar
Mesaj akışının aşağıdaki sınırlamaları vardır:
- Platform kullanılabilirliği: Mesaj akışı yalnızca Chat'in web sürümünde görünür. Android ve iOS desteği yakında sunulacaktır.
- Akış zaman aşımı: Etkin bir
StreamMessage, oluşturulduktan 10 dakika sonra zaman aşımına uğrar. Chat uygulamanız, yayını başlattıktan sonraki 10 dakika içindespaces.streamMessages.commitveyaspaces.streamMessages.deleteyöntemini çağırmalıdır.