Python
import os
from meibel import MeibelClient
client = MeibelClient(api_key=os.environ["MEIBEL_API_KEY"])
session_id = "sess_8f3a2b1c9d"
with open("quarterly_report.pdf", "rb") as file:
stream = client.agents.sessions.send_chat_message_stream(
session_id=session_id,
user_message="Summarize the key findings in this report.",
file=file,
)
for event in stream:
if event.event == "partial_response":
payload = event.json()
print(payload["data"], end="")
elif event.event == "tool_call":
payload = event.json()
print(f"\n[tool call] {payload['data']}")
elif event.event == "completion":
payload = event.json()
print(f"\n\nFinal response: {payload['data']}")
break
elif event.event == "error":
payload = event.json()
print(f"\nError: {payload['data']}")
breakimport { MeibelClient } from "meibel";
import fs from "fs";
const client = new MeibelClient({ apiKey: process.env.MEIBEL_API_KEY });
const sessionId = "sess_9f8a7b6c5d4e";
const stream = await client.agents.sessions.sendChatMessageStream(sessionId, {
file: fs.createReadStream("./quarterly-report.pdf"),
});
for await (const event of stream) {
switch (event.event) {
case "partial_response":
process.stdout.write(event.data);
break;
case "completion":
console.log(`\nFinal response: ${event.data}`);
break;
case "error":
console.error(`Stream error: ${event.data}`);
break;
default:
console.log(`[${event.event}] ${event.data}`);
}
}package main
import (
"context"
"fmt"
"os"
v2 "github.com/meibel-ai/meibel-go/v2"
)
func main() {
client := v2.NewClient(v2.WithAPIKey(os.Getenv("MEIBEL_API_KEY")))
stream, err := client.Agents.Sessions.SendChatMessageStream(
context.Background(),
"session_9f8a3c2b",
v2.BodySendChatMessageStream{
UserMessage: "Can you summarize the attached report?",
Attachments: []string{"file_7a1b2c3d"},
},
)
if err != nil {
panic(err)
}
for event := range stream.Events() {
switch e := event.(type) {
case v2.CompletionEvent:
fmt.Println("completion:", e.Data)
case v2.ErrorEvent:
fmt.Println("error:", e.Data)
case v2.PartialResponseEvent:
fmt.Println("partial:", e.Data)
}
}
if err := <-stream.Errors(); err != nil {
fmt.Println("stream error:", err)
}
}curl --request POST \
--url https://api.meibel.ai/v2/sessions/{session_id}/chat/stream \
--header 'Content-Type: multipart/form-data' \
--header 'Meibel-API-Key: <api-key>' \
--form 'user_message=<string>' \
--form timeout_seconds=123 \
--form include_thinking=true \
--form include_tool_activity=true \
--form 'files=<string>' \
--form files.0.items='@example-file'const form = new FormData();
form.append('user_message', '<string>');
form.append('timeout_seconds', '123');
form.append('include_thinking', 'true');
form.append('include_tool_activity', 'true');
form.append('files', '<string>');
form.append('files.0.items', '{
"fileName": "example-file"
}');
const options = {method: 'POST', headers: {'Meibel-API-Key': '<api-key>'}};
options.body = form;
fetch('https://api.meibel.ai/v2/sessions/{session_id}/chat/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.meibel.ai/v2/sessions/{session_id}/chat/stream",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => "-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"user_message\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"timeout_seconds\"\r\n\r\n123\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"include_thinking\"\r\n\r\ntrue\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"include_tool_activity\"\r\n\r\ntrue\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"files\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"files.0.items\"; filename=\"example-file\"\r\nContent-Type: application/octet-stream\r\n\r\n{\r\n \"fileName\": \"example-file\"\r\n}\r\n-----011000010111000001101001--",
CURLOPT_HTTPHEADER => [
"Content-Type: multipart/form-data; boundary=---011000010111000001101001",
"Meibel-API-Key: <api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}HttpResponse<String> response = Unirest.post("https://api.meibel.ai/v2/sessions/{session_id}/chat/stream")
.header("Meibel-API-Key", "<api-key>")
.header("Content-Type", "multipart/form-data; boundary=---011000010111000001101001")
.body("-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"user_message\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"timeout_seconds\"\r\n\r\n123\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"include_thinking\"\r\n\r\ntrue\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"include_tool_activity\"\r\n\r\ntrue\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"files\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"files.0.items\"; filename=\"example-file\"\r\nContent-Type: application/octet-stream\r\n\r\n{\r\n \"fileName\": \"example-file\"\r\n}\r\n-----011000010111000001101001--")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.meibel.ai/v2/sessions/{session_id}/chat/stream")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Meibel-API-Key"] = '<api-key>'
request["Content-Type"] = 'multipart/form-data; boundary=---011000010111000001101001'
request.body = "-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"user_message\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"timeout_seconds\"\r\n\r\n123\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"include_thinking\"\r\n\r\ntrue\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"include_tool_activity\"\r\n\r\ntrue\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"files\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"files.0.items\"; filename=\"example-file\"\r\nContent-Type: application/octet-stream\r\n\r\n{\r\n \"fileName\": \"example-file\"\r\n}\r\n-----011000010111000001101001--"
response = http.request(request)
puts response.read_body{
"event": "<string>",
"data": {
"signal_id": "<string>"
}
}{
"detail": [
{
"loc": [
"<string>"
],
"msg": "<string>",
"type": "<string>",
"input": "<unknown>",
"ctx": {}
}
]
}Sessions
Send a chat message with file attachments and stream the response via SSE
POST
/
sessions
/
{session_id}
/
chat
/
stream
Python
import os
from meibel import MeibelClient
client = MeibelClient(api_key=os.environ["MEIBEL_API_KEY"])
session_id = "sess_8f3a2b1c9d"
with open("quarterly_report.pdf", "rb") as file:
stream = client.agents.sessions.send_chat_message_stream(
session_id=session_id,
user_message="Summarize the key findings in this report.",
file=file,
)
for event in stream:
if event.event == "partial_response":
payload = event.json()
print(payload["data"], end="")
elif event.event == "tool_call":
payload = event.json()
print(f"\n[tool call] {payload['data']}")
elif event.event == "completion":
payload = event.json()
print(f"\n\nFinal response: {payload['data']}")
break
elif event.event == "error":
payload = event.json()
print(f"\nError: {payload['data']}")
breakimport { MeibelClient } from "meibel";
import fs from "fs";
const client = new MeibelClient({ apiKey: process.env.MEIBEL_API_KEY });
const sessionId = "sess_9f8a7b6c5d4e";
const stream = await client.agents.sessions.sendChatMessageStream(sessionId, {
file: fs.createReadStream("./quarterly-report.pdf"),
});
for await (const event of stream) {
switch (event.event) {
case "partial_response":
process.stdout.write(event.data);
break;
case "completion":
console.log(`\nFinal response: ${event.data}`);
break;
case "error":
console.error(`Stream error: ${event.data}`);
break;
default:
console.log(`[${event.event}] ${event.data}`);
}
}package main
import (
"context"
"fmt"
"os"
v2 "github.com/meibel-ai/meibel-go/v2"
)
func main() {
client := v2.NewClient(v2.WithAPIKey(os.Getenv("MEIBEL_API_KEY")))
stream, err := client.Agents.Sessions.SendChatMessageStream(
context.Background(),
"session_9f8a3c2b",
v2.BodySendChatMessageStream{
UserMessage: "Can you summarize the attached report?",
Attachments: []string{"file_7a1b2c3d"},
},
)
if err != nil {
panic(err)
}
for event := range stream.Events() {
switch e := event.(type) {
case v2.CompletionEvent:
fmt.Println("completion:", e.Data)
case v2.ErrorEvent:
fmt.Println("error:", e.Data)
case v2.PartialResponseEvent:
fmt.Println("partial:", e.Data)
}
}
if err := <-stream.Errors(); err != nil {
fmt.Println("stream error:", err)
}
}curl --request POST \
--url https://api.meibel.ai/v2/sessions/{session_id}/chat/stream \
--header 'Content-Type: multipart/form-data' \
--header 'Meibel-API-Key: <api-key>' \
--form 'user_message=<string>' \
--form timeout_seconds=123 \
--form include_thinking=true \
--form include_tool_activity=true \
--form 'files=<string>' \
--form files.0.items='@example-file'const form = new FormData();
form.append('user_message', '<string>');
form.append('timeout_seconds', '123');
form.append('include_thinking', 'true');
form.append('include_tool_activity', 'true');
form.append('files', '<string>');
form.append('files.0.items', '{
"fileName": "example-file"
}');
const options = {method: 'POST', headers: {'Meibel-API-Key': '<api-key>'}};
options.body = form;
fetch('https://api.meibel.ai/v2/sessions/{session_id}/chat/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.meibel.ai/v2/sessions/{session_id}/chat/stream",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => "-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"user_message\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"timeout_seconds\"\r\n\r\n123\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"include_thinking\"\r\n\r\ntrue\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"include_tool_activity\"\r\n\r\ntrue\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"files\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"files.0.items\"; filename=\"example-file\"\r\nContent-Type: application/octet-stream\r\n\r\n{\r\n \"fileName\": \"example-file\"\r\n}\r\n-----011000010111000001101001--",
CURLOPT_HTTPHEADER => [
"Content-Type: multipart/form-data; boundary=---011000010111000001101001",
"Meibel-API-Key: <api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}HttpResponse<String> response = Unirest.post("https://api.meibel.ai/v2/sessions/{session_id}/chat/stream")
.header("Meibel-API-Key", "<api-key>")
.header("Content-Type", "multipart/form-data; boundary=---011000010111000001101001")
.body("-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"user_message\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"timeout_seconds\"\r\n\r\n123\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"include_thinking\"\r\n\r\ntrue\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"include_tool_activity\"\r\n\r\ntrue\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"files\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"files.0.items\"; filename=\"example-file\"\r\nContent-Type: application/octet-stream\r\n\r\n{\r\n \"fileName\": \"example-file\"\r\n}\r\n-----011000010111000001101001--")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.meibel.ai/v2/sessions/{session_id}/chat/stream")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Meibel-API-Key"] = '<api-key>'
request["Content-Type"] = 'multipart/form-data; boundary=---011000010111000001101001'
request.body = "-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"user_message\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"timeout_seconds\"\r\n\r\n123\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"include_thinking\"\r\n\r\ntrue\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"include_tool_activity\"\r\n\r\ntrue\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"files\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"files.0.items\"; filename=\"example-file\"\r\nContent-Type: application/octet-stream\r\n\r\n{\r\n \"fileName\": \"example-file\"\r\n}\r\n-----011000010111000001101001--"
response = http.request(request)
puts response.read_body{
"event": "<string>",
"data": {
"signal_id": "<string>"
}
}{
"detail": [
{
"loc": [
"<string>"
],
"msg": "<string>",
"type": "<string>",
"input": "<unknown>",
"ctx": {}
}
]
}Authorizations
Path Parameters
Body
multipart/form-data
Was this page helpful?
⌘I