读取智能体会话和消息

列出当前工作区中可见的智能体会话,选择一条会话并读取详情和消息内容。

准备

  1. 配置 SDK 和个人访问令牌。

  2. 选择工作区并获取工作区 ID。

  3. 可见的智能体会话:在读取会话和消息的列表结果中按标题选择,使用该条目的字符串 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 条。继续查询时,将偏移量增加本批条数,直到读满总数或返回空页。会话状态描述对话记录;智能体任务进度见调用智能体并读取任务结果。

最后更新于