Transmitir Execução
curl --request GET \
--url https://api.tess.im/digital-employees/{employeeId}/runs/{runId}/stream \
--header 'Authorization: Bearer <token>' \
--header 'x-workspace-id: <x-workspace-id>'import requests
url = "https://api.tess.im/digital-employees/{employeeId}/runs/{runId}/stream"
headers = {
"x-workspace-id": "<x-workspace-id>",
"Authorization": "Bearer <token>"
}
response = requests.get(url, headers=headers)
print(response.text)const options = {
method: 'GET',
headers: {'x-workspace-id': '<x-workspace-id>', Authorization: 'Bearer <token>'}
};
fetch('https://api.tess.im/digital-employees/{employeeId}/runs/{runId}/stream', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.tess.im/digital-employees/{employeeId}/runs/{runId}/stream",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"x-workspace-id: <x-workspace-id>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.tess.im/digital-employees/{employeeId}/runs/{runId}/stream"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("x-workspace-id", "<x-workspace-id>")
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.tess.im/digital-employees/{employeeId}/runs/{runId}/stream")
.header("x-workspace-id", "<x-workspace-id>")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.tess.im/digital-employees/{employeeId}/runs/{runId}/stream")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["x-workspace-id"] = '<x-workspace-id>'
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_bodyDigital Employees
Transmitir Execução
Abre um stream Server-Sent Events (SSE) para acompanhar uma execução em tempo real.
GET
/
digital-employees
/
{employeeId}
/
runs
/
{runId}
/
stream
Transmitir Execução
curl --request GET \
--url https://api.tess.im/digital-employees/{employeeId}/runs/{runId}/stream \
--header 'Authorization: Bearer <token>' \
--header 'x-workspace-id: <x-workspace-id>'import requests
url = "https://api.tess.im/digital-employees/{employeeId}/runs/{runId}/stream"
headers = {
"x-workspace-id": "<x-workspace-id>",
"Authorization": "Bearer <token>"
}
response = requests.get(url, headers=headers)
print(response.text)const options = {
method: 'GET',
headers: {'x-workspace-id': '<x-workspace-id>', Authorization: 'Bearer <token>'}
};
fetch('https://api.tess.im/digital-employees/{employeeId}/runs/{runId}/stream', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.tess.im/digital-employees/{employeeId}/runs/{runId}/stream",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"x-workspace-id: <x-workspace-id>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.tess.im/digital-employees/{employeeId}/runs/{runId}/stream"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("x-workspace-id", "<x-workspace-id>")
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.tess.im/digital-employees/{employeeId}/runs/{runId}/stream")
.header("x-workspace-id", "<x-workspace-id>")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.tess.im/digital-employees/{employeeId}/runs/{runId}/stream")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["x-workspace-id"] = '<x-workspace-id>'
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_bodyO endpoint de stream utiliza Server-Sent Events (SSE) para entregar a saída incremental da execução. Conecte-se a este endpoint enquanto uma run estiver com status
running para receber a saída conforme ela é gerada.
Exemplos de Código
curl --request GET \
--url 'https://api.tess.im/digital-employees/{employeeId}/runs/{runId}/stream' \
--header 'Authorization: Bearer YOUR_API_KEY' \
--header 'x-workspace-id: YOUR_WORKSPACE_ID' \
--header 'Accept: text/event-stream' \
--no-buffer
const https = require('https');
const options = {
hostname: 'api.tess.im',
path: '/digital-employees/{employeeId}/runs/{runId}/stream',
method: 'GET',
headers: {
'Authorization': 'Bearer YOUR_API_KEY',
'x-workspace-id': 'YOUR_WORKSPACE_ID',
'Accept': 'text/event-stream'
}
};
const req = https.request(options, (res) => {
res.on('data', (chunk) => {
const lines = chunk.toString().split('\n');
lines.forEach((line) => {
if (line.startsWith('data: ')) {
const data = JSON.parse(line.slice(6));
if (data.delta) process.stdout.write(data.delta);
if (data.status === 'completed') console.log('\nRun completed.');
}
});
});
});
req.on('error', console.error);
req.end();
import requests
import json
url = "https://api.tess.im/digital-employees/{employeeId}/runs/{runId}/stream"
headers = {
"Authorization": "Bearer YOUR_API_KEY",
"x-workspace-id": "YOUR_WORKSPACE_ID",
"Accept": "text/event-stream"
}
with requests.get(url, headers=headers, stream=True) as response:
for line in response.iter_lines():
if line:
decoded = line.decode('utf-8')
if decoded.startswith('data: '):
data = json.loads(decoded[6:])
if 'delta' in data:
print(data['delta'], end='', flush=True)
if data.get('status') == 'completed':
print('\nRun completed.')
<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.tess.im/digital-employees/{employeeId}/runs/{runId}/stream",
CURLOPT_RETURNTRANSFER => false,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer YOUR_API_KEY",
"x-workspace-id: YOUR_WORKSPACE_ID",
"Accept: text/event-stream"
],
CURLOPT_WRITEFUNCTION => function($curl, $data) {
$lines = explode("\n", $data);
foreach ($lines as $line) {
if (str_starts_with($line, 'data: ')) {
$payload = json_decode(substr($line, 6), true);
if (isset($payload['delta'])) echo $payload['delta'];
if (($payload['status'] ?? '') === 'completed') echo "\nRun completed.";
}
}
return strlen($data);
}
]);
curl_exec($curl);
curl_close($curl);
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.io.BufferedReader;
import java.io.InputStreamReader;
HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://api.tess.im/digital-employees/{employeeId}/runs/{runId}/stream"))
.header("Authorization", "Bearer YOUR_API_KEY")
.header("x-workspace-id", "YOUR_WORKSPACE_ID")
.header("Accept", "text/event-stream")
.GET()
.build();
HttpResponse<java.io.InputStream> response = client.send(request,
HttpResponse.BodyHandlers.ofInputStream());
try (BufferedReader reader = new BufferedReader(new InputStreamReader(response.body()))) {
String line;
while ((line = reader.readLine()) != null) {
if (line.startsWith("data: ")) {
System.out.println(line.substring(6));
}
}
}
package main
import (
"bufio"
"fmt"
"net/http"
"strings"
)
func main() {
client := &http.Client{}
req, _ := http.NewRequest("GET",
"https://api.tess.im/digital-employees/{employeeId}/runs/{runId}/stream", nil)
req.Header.Add("Authorization", "Bearer YOUR_API_KEY")
req.Header.Add("x-workspace-id", "YOUR_WORKSPACE_ID")
req.Header.Add("Accept", "text/event-stream")
resp, _ := client.Do(req)
defer resp.Body.Close()
scanner := bufio.NewScanner(resp.Body)
for scanner.Scan() {
line := scanner.Text()
if strings.HasPrefix(line, "data: ") {
fmt.Println(line[6:])
}
}
}
using System.Net.Http;
using System.IO;
using var client = new HttpClient();
client.DefaultRequestHeaders.Add("Authorization", "Bearer YOUR_API_KEY");
client.DefaultRequestHeaders.Add("x-workspace-id", "YOUR_WORKSPACE_ID");
client.DefaultRequestHeaders.Add("Accept", "text/event-stream");
using var response = await client.GetAsync(
"https://api.tess.im/digital-employees/{employeeId}/runs/{runId}/stream",
HttpCompletionOption.ResponseHeadersRead);
using var stream = await response.Content.ReadAsStreamAsync();
using var reader = new StreamReader(stream);
while (!reader.EndOfStream)
{
var line = await reader.ReadLineAsync();
if (line != null && line.StartsWith("data: "))
Console.WriteLine(line.Substring(6));
}
require 'uri'
require 'net/http'
uri = URI('https://api.tess.im/digital-employees/{employeeId}/runs/{runId}/stream')
http = Net::HTTP.new(uri.host, uri.port)
http.use_ssl = true
request = Net::HTTP::Get.new(uri)
request['Authorization'] = 'Bearer YOUR_API_KEY'
request['x-workspace-id'] = 'YOUR_WORKSPACE_ID'
request['Accept'] = 'text/event-stream'
http.request(request) do |response|
response.read_body do |chunk|
chunk.split("\n").each do |line|
if line.start_with?('data: ')
puts line[6..]
end
end
end
end
Headers
Authorization: Passe sua chave de API como Bearer token no header
Authorization: Authorization: Bearer YOUR_API_KEY.integer
obrigatório
ID do workspace. Obrigatório em todas as requisições da API de Digital Employees.
Parâmetros de Caminho
integer
obrigatório
O ID do digital employee.
integer
obrigatório
O ID da execução a ser transmitida.
Eventos SSE
| Evento | Descrição |
|---|---|
delta | Trecho incremental de saída. Contém parte do texto gerado enquanto a execução avança. |
complete | Snapshot final com status, output, rendered_output e metadados da run. Sinaliza o fim do stream. |
heartbeat | Comentário de keep-alive (: heartbeat) enviado periodicamente para manter a conexão ativa. |
Formato do Evento delta
data: {"delta": "The financial report..."}
Formato do Evento complete
data: {"status": "completed", "output": "The financial report for Q2 is complete.", "rendered_output": "...", "execution_id": 9001}
Conecte-se a este endpoint somente enquanto o status da run for
running. Se a execução já tiver finalizado, utilize Saída da Execução.⌘I