读取智能体会话和消息¶
列出当前工作区中可见的智能体会话,选择一条会话并读取详情和消息内容。
准备¶
可见的智能体会话:在读取会话和消息的列表结果中按标题选择,使用该条目的字符串 ID。
读取会话和消息¶
将 Python 示例保存为 read_sessions.py 后运行 python read_sessions.py;或将 Go 示例保存为 main.go 后,在已配置 SDK 依赖的 Go module 中运行 go run .。示例列出一批会话并读取第一条;可按标题将选择位置改为该批次的其他条目。
import json
import os
from urllib.parse import quote
import moi_product_sdk as sdk
def main():
client = sdk.new_with_personal_access_token(
os.environ["PRODUCT_API_BASE_URL"], os.environ["PRODUCT_API_KEY"]
)
agents = client.workspace(os.environ["WORKSPACE_ID"]).agents()
page = agents.resource_get("conversations", "", sdk.with_limit(20))
print(f"可见会话总数={page['total']},本批={len(page['items'])}")
if not page["items"]:
print("当前没有可见会话;请先在智能体中发起对话后重试。")
return
# 本例读取当前批次第一条会话,可按输出的标题选择其他条目。
for item in page["items"]:
print(f"会话={item['id']},标题={item['title']}")
conversation_id = page["items"][0]["id"]
tail = "/" + quote(conversation_id, safe="")
detail = agents.resource_get("conversations", tail)
if detail["id"] != conversation_id:
raise RuntimeError("会话详情的 ID 与列表不一致")
print(f"会话={detail['id']},智能体={detail['agent_id']},"
f"标题={detail['title']},状态={detail['status']}")
messages = agents.resource_get("conversations", tail + "/messages", sdk.with_limit(20))
print(f"消息总数={messages['total']},本批={len(messages['items'])}")
for message in messages["items"]:
if message["conversation_id"] != conversation_id:
raise RuntimeError("消息不属于所选会话")
print(f"消息={message['id']},角色={message['role']},序号={message['seq']}")
print(json.dumps(message["parts"], ensure_ascii=False))
if __name__ == "__main__":
main()
package main
import (
"context"
"encoding/json"
"fmt"
"log"
"net/url"
"os"
sdk "github.com/matrixorigin/matrixflow/sdk/go-sdk"
)
type conversation struct {
ID string `json:"id"`
AgentID string `json:"agent_id"`
Title string `json:"title"`
Status string `json:"status"`
}
type message struct {
ID string `json:"id"`
ConversationID string `json:"conversation_id"`
Role string `json:"role"`
Seq int64 `json:"seq"`
Parts json.RawMessage `json:"parts"`
}
type page[T any] struct {
Items []T `json:"items"`
Total int `json:"total"`
}
func read[T any](ctx context.Context, agents *sdk.AgentService, tail string, out *T) error {
data, err := agents.ResourceGet(ctx, "conversations", tail, sdk.WithLimit(20))
if err != nil {
return err
}
raw, err := json.Marshal(data)
if err != nil {
return err
}
return json.Unmarshal(raw, out)
}
func run() error {
client, err := sdk.NewWithPersonalAccessToken(os.Getenv("PRODUCT_API_BASE_URL"), os.Getenv("PRODUCT_API_KEY"))
if err != nil {
return err
}
ctx := context.Background()
agents := client.Agents(os.Getenv("WORKSPACE_ID"))
var listed page[conversation]
if err := read(ctx, agents, "", &listed); err != nil {
return err
}
fmt.Printf("可见会话总数=%d,本批=%d\n", listed.Total, len(listed.Items))
if len(listed.Items) == 0 {
fmt.Println("当前没有可见会话;请先在智能体中发起对话后重试。")
return nil
}
for _, item := range listed.Items {
fmt.Printf("会话=%s,标题=%s\n", item.ID, item.Title)
}
conversationID := listed.Items[0].ID
tail := "/" + url.PathEscape(conversationID)
var detail conversation
if err := read(ctx, agents, tail, &detail); err != nil {
return err
}
if detail.ID != conversationID {
return fmt.Errorf("会话详情的 ID 与列表不一致")
}
fmt.Printf("会话=%s,智能体=%s,标题=%s,状态=%s\n", detail.ID, detail.AgentID, detail.Title, detail.Status)
var messages page[message]
if err := read(ctx, agents, tail+"/messages", &messages); err != nil {
return err
}
fmt.Printf("消息总数=%d,本批=%d\n", messages.Total, len(messages.Items))
for _, item := range messages.Items {
if item.ConversationID != conversationID {
return fmt.Errorf("消息不属于所选会话")
}
fmt.Printf("消息=%s,角色=%s,序号=%d\n%s\n", item.ID, item.Role, item.Seq, item.Parts)
}
return nil
}
func main() {
if err := run(); err != nil {
log.Fatal(err)
}
}
查询结果与分页¶
会话结果包含 ID、标题、关联智能体和状态;消息结果包含消息 ID、角色、序号和内容片段。示例核对详情与列表的会话 ID 一致,并检查消息属于所选会话。
会话和消息分别分页,每批最多读取 20 条。继续查询时,将偏移量增加本批条数,直到读满总数或返回空页。会话状态描述对话记录;智能体任务进度见调用智能体并读取任务结果。
最后更新于