AI Agent
client.aiAgent / client.ai_agent 连接到独立的 AI Agent 服务,运行在与主 API gateway 不同的 base URL 上。该资源提供流式聊天、embedding knowledge base 管理、列式数据(Parquet)、分布式追踪(Tempo),以及前端应用使用的完整 Chat Client 子 API。
端到端 streamChat 示例,参阅完整流程指南 §1。
import { ImbraceClient } from "@imbrace/sdk";const client = new ImbraceClient();from imbrace import ImbraceClientclient = ImbraceClient()sync(ImbraceClient)和 async(AsyncImbraceClient)客户端公开相同的接口 — async 方法需要 await,底层使用 AsyncAiAgentResource。
Chat v2 — 流式传输(SSE)
返回原始 response。将 body 作为 Server-Sent Events 流消费。
const response = await client.aiAgent.streamChat({ id: "chat_id", assistant_id: "asst_abc", organization_id: "org_abc", messages: [{ role: "user", content: "您能做什么?" }],});
const reader = response.body!.getReader();const decoder = new TextDecoder();while (true) { const { done, value } = await reader.read(); if (done) break; process.stdout.write(decoder.decode(value));}response = client.ai_agent.stream_chat({ "id": "chat_id", "assistant_id": "asst_abc", "organization_id": "org_abc", "messages": [{"role": "user", "content": "您能做什么?"}],})
for line in response.iter_lines(): if line: print(line)异步:
import asynciofrom imbrace import AsyncImbraceClient
async def main(): async with AsyncImbraceClient() as client: response = await client.ai_agent.stream_chat({ "id": "chat_id", "assistant_id": "asst_abc", "organization_id": "org_abc", "messages": [{"role": "user", "content": "您好"}], }) async for line in response.aiter_lines(): if line: print(line)
asyncio.run(main())子 Agent 聊天 v2
从子 agent 流式获取响应并获取其对话历史。
const res = await client.aiAgent.streamSubAgentChat({ assistant_id: "asst_sub", organization_id: "org_abc", session_id: "sess_xyz", chat_id: "chat_id", messages: [{ role: "user", content: "解释这些数据。" }],});
const history = await client.aiAgent.getSubAgentHistory({ session_id: "sess_xyz", chat_id: "chat_id",});res = client.ai_agent.stream_sub_agent_chat({ "assistant_id": "asst_sub", "organization_id": "org_abc", "session_id": "sess_xyz", "chat_id": "chat_id", "messages": [{"role": "user", "content": "解释这些数据。"}],})
history = client.ai_agent.get_sub_agent_history( session_id="sess_xyz", chat_id="chat_id",)提示建议
获取助手的建议提示列表。
const suggestions = await client.aiAgent.getAgentPromptSuggestion("asst_abc");suggestions = client.ai_agent.get_agent_prompt_suggestion("asst_abc")Embeddings & Knowledge Base
管理用于检索增强生成(RAG)的文件。先通过 client.boards.uploadFile 上传文件,再触发 embedding 处理。
// 触发已上传文件的 embedding 处理await client.aiAgent.processEmbedding({ fileId: "file_abc" });
// 列出和检查 embedding 文件const files = await client.aiAgent.listEmbeddingFiles({ page: 1, limit: 20 });const file = await client.aiAgent.getEmbeddingFile("file_abc");const preview = await client.aiAgent.previewEmbeddingFile({ file_id: "file_abc" });
// 更新状态和删除await client.aiAgent.updateEmbeddingFileStatus("file_abc", "active");await client.aiAgent.deleteEmbeddingFile("file_abc");
// 为 RAG 分类文件const classification = await client.aiAgent.classifyFile({ file_id: "file_abc" });# 触发已上传文件的 embedding 处理client.ai_agent.process_embedding("file_abc")
# 带处理选项client.ai_agent.process_embedding("file_abc", options={"chunk_size": 512})
# 列出和检查 embedding 文件files = client.ai_agent.list_embedding_files(page=1, limit=20)file = client.ai_agent.get_embedding_file("file_abc")preview = client.ai_agent.preview_embedding_file(file_id="file_abc")
# 更新状态和删除client.ai_agent.update_embedding_file_status("file_abc", "active")client.ai_agent.delete_embedding_file("file_abc")
# 为 RAG 分类文件classification = client.ai_agent.classify_file(file_id="file_abc")数据看板
为结构化数据集使用 AI 建议字段类型。
const result = await client.aiAgent.suggestFieldTypes({ fields: [ { name: "created_at", samples: ["2024-01-01", "2024-02-15"] }, { name: "amount", samples: [100, 200.5, 999] }, { name: "is_active", samples: [true, false, true] }, ],});// result.fields[i].suggestedType → "datetime" | "number" | "boolean" | ...result = client.ai_agent.suggest_field_types(fields=[ {"name": "created_at", "samples": ["2024-01-01", "2024-02-15"]}, {"name": "amount", "samples": [100, 200.5, 999]}, {"name": "is_active", "samples": [True, False, True]},])# result["fields"][i]["suggestedType"] → "datetime" | "number" | "boolean" | ...Parquet
为分析管道创建和管理列式 Parquet 数据文件。
// 从 JSON 数据创建 Parquet 文件const result = await client.aiAgent.generateParquet({ data: [{ id: 1, name: "Alice" }, { id: 2, name: "Bob" }], fileName: "users", folderName: "exports",});
const files = await client.aiAgent.listParquetFiles();await client.aiAgent.deleteParquetFile("exports/users.parquet");result = client.ai_agent.generate_parquet( data=[{"id": 1, "name": "Alice"}, {"id": 2, "name": "Bob"}], file_name="users", folder_name="exports",)
files = client.ai_agent.list_parquet_files()client.ai_agent.delete_parquet_file("exports/users.parquet")分布式追踪(Tempo)
从 AI Agent 服务查询 Grafana Tempo traces 以进行观测和调试。
// 列出最近的 tracesconst traces = await client.aiAgent.getTraces({ service: "ai-agent", limit: 50, timeRange: 3600, // 秒 orgId: "org_abc", details: true,});
// 查看单个 trace 详情const trace = await client.aiAgent.getTrace("trace_id_hex");
// 列出 services、tags 和 tag 值const services = await client.aiAgent.getTraceServices();const tags = await client.aiAgent.getTraceTags();const values = await client.aiAgent.getTraceTagValues("http.status_code");
// 使用 TraceQL 搜索const results = await client.aiAgent.searchTraceQL( `{ .service.name = "ai-agent" && .http.status = 500 }`);# 列出最近的 tracestraces = client.ai_agent.get_traces( service="ai-agent", limit=50, time_range=3600, # 秒 org_id="org_abc", details=True,)
# 查看单个 trace 详情trace = client.ai_agent.get_trace("trace_id_hex")
# 列出 services、tags 和 tag 值services = client.ai_agent.get_trace_services()tags = client.ai_agent.get_trace_tags()values = client.ai_agent.get_trace_tag_values("http.status_code")
# 使用 TraceQL 搜索results = client.ai_agent.search_traceql( '{ .service.name = "ai-agent" && .http.status = 500 }')Chat Client
Chat Client 子 API 为前端应用(如嵌入式聊天 widget)提供服务。框架级接线参阅集成。
认证
await client.aiAgent.verifyChatClientCredentials({ token: "tok_xxx" });await client.aiAgent.registerChatClient({ name: "web-app", secret: "s3cr3t" });const user = await client.aiAgent.getChatClientUser({ token: "tok_xxx" });client.ai_agent.verify_chat_client_credentials({"token": "tok_xxx"})client.ai_agent.register_chat_client({"name": "web-app", "secret": "s3cr3t"})user = client.ai_agent.get_chat_client_user({"token": "tok_xxx"})聊天
// 创建新聊天会话await client.aiAgent.createClientChat({ id: "chat_uuid", message: { id: "msg_uuid", role: "user", parts: [{ type: "text", text: "您好!" }], }, assistantId: "asst_abc", organizationId: "org_abc",});
// 列出、读取、更新、删除const chats = await client.aiAgent.listClientChats({ organization_id: "org_abc", limit: 20,});const chat = await client.aiAgent.getClientChat("chat_id");await client.aiAgent.updateClientChat("chat_id", { visibility: "private" });await client.aiAgent.deleteClientChat("chat_id");await client.aiAgent.deleteAllClientChats({ organization_id: "org_abc" });
// 自动生成聊天标题await client.aiAgent.generateClientChatTitle("chat_id");
// 以 SSE 方式流式传输实时聊天状态 — 返回原始 Responseconst statusStream = await client.aiAgent.streamClientChatStatus("chat_id");# 创建新聊天会话client.ai_agent.create_client_chat({ "id": "chat_uuid", "message": { "id": "msg_uuid", "role": "user", "parts": [{"type": "text", "text": "您好!"}], }, "assistantId": "asst_abc", "organizationId": "org_abc",})
# 列出、读取、更新、删除chats = client.ai_agent.list_client_chats(organization_id="org_abc", limit=20)chat = client.ai_agent.get_client_chat("chat_id")client.ai_agent.update_client_chat("chat_id", {"visibility": "private"})client.ai_agent.delete_client_chat("chat_id")client.ai_agent.delete_all_client_chats("org_abc")
# 自动生成聊天标题client.ai_agent.generate_client_chat_title("chat_id")
# 以 SSE 方式流式传输实时聊天状态 — 返回原始 httpx.Responsestatus_stream = client.ai_agent.stream_client_chat_status("chat_id")消息
await client.aiAgent.persistClientMessage({ chatId: "chat_id", content: "您好" });const messages = await client.aiAgent.listClientMessages("chat_id");await client.aiAgent.deleteTrailingMessages("message_id");client.ai_agent.persist_client_message({"chatId": "chat_id", "content": "您好"})messages = client.ai_agent.list_client_messages("chat_id")client.ai_agent.delete_trailing_messages("message_id")投票
const votes = await client.aiAgent.getVotes("chat_id");await client.aiAgent.updateVote({ messageId: "msg_id", vote: "up" });votes = client.ai_agent.get_votes("chat_id")client.ai_agent.update_vote({"messageId": "msg_id", "vote": "up"})文档(AI 生成的制品)
await client.aiAgent.createDocument({ kind: "text", content: "草稿..." });
const doc = await client.aiAgent.getDocument("doc_id");const latest = await client.aiAgent.getDocumentLatest("doc_id");const pub = await client.aiAgent.getDocumentPublic("doc_id");const byKind = await client.aiAgent.getDocumentLatestByKind({ kind: "text" });const suggestion = await client.aiAgent.getDocumentSuggestions("doc_id");
await client.aiAgent.deleteDocument("doc_id");client.ai_agent.create_document({"kind": "text", "content": "草稿..."})
doc = client.ai_agent.get_document("doc_id")latest = client.ai_agent.get_document_latest("doc_id")pub = client.ai_agent.get_document_public("doc_id")by_kind = client.ai_agent.get_document_latest_by_kind(kind="text")suggestion = client.ai_agent.get_document_suggestions("doc_id")
client.ai_agent.delete_document("doc_id")管理员指南
访问由 AI Agent 服务存储的管理员文档。指南文件以原始二进制流形式返回(通常是 PDF)。
const guides = await client.aiAgent.listAdminGuides();
// 下载特定指南 — 返回原始 Response(PDF 流)const response = await client.aiAgent.getAdminGuide("onboarding.pdf");const blob = await response.blob();guides = client.ai_agent.list_admin_guides()
# 下载特定指南 — 返回原始 httpx.Responseresponse = client.ai_agent.get_admin_guide("onboarding.pdf")with open("onboarding.pdf", "wb") as f: f.write(response.content)旧版 v1 聊天
原始 REST 聊天接口,无需流式传输即可保留对话历史。新代码应使用上方的 Chat v2 流式传输;v1 保留用于向后兼容。
// 列出某组织的聊天记录const chats = await client.aiAgent.listChats({ organization_id: "org_abc", user_id: "user_123", limit: 20,});
// 获取单个聊天(传 true 以包含消息)const chat = await client.aiAgent.getChat("chat_id", true);
// 删除聊天await client.aiAgent.deleteChat("chat_id", { organization_id: "org_abc", user_id: "user_123",});chats = client.ai_agent.list_chats( organization_id="org_abc", user_id="user_123", limit=20,)
chat = client.ai_agent.get_chat("chat_id", include_messages=True)
client.ai_agent.delete_chat( "chat_id", organization_id="org_abc", user_id="user_123",)