Examples
这些示例覆盖开发者最常见的集成点。示例优先展示可组合的 SDK 调用,而不是隐藏在框架代码里。
示例语言
TypeScript Beta;Python / Go / Rust / Java Alpha 实验中
端到端日历智能体
仓库内置 examples/calendar.ts,覆盖注册身份、发布描述、发现、建会话、调用工具、发送最终结果。
pnpm install
pnpm build
pnpm example:calendar
import {
createAgentInterconnectRuntime,
formatIdentityCode,
type AgentDescription
} from "gbz185-sdk";
const runtime = createAgentInterconnectRuntime();
const requesterId = formatIdentityCode({
registrationServiceProvider: "A1",
registrationRequester: "REQ001",
ontologySerial: "ASSISTANT",
instanceSerial: "1"
});
const registration = await runtime.client.registerIdentity({
delegatorId: "example-org",
subject: "Calendar Agent",
registrationServiceProvider: "A1",
registrationRequester: "REQ001",
ontologySerial: "CALENDAR",
instanceSerial: "1",
issueCredential: true,
credentialAudience: [requesterId],
credentialScope: ["agent:interact", "tool:invoke"]
});
完整代码见仓库示例文件;Get Started 页面逐段解释了每一步。
身份码工具
import {
formatIdentityCode,
parseIdentityCode,
validateIdentityCode
} from "gbz185-sdk";
const code = formatIdentityCode({
registrationServiceProvider: "abc123",
registrationRequester: "req001",
ontologySerial: "bot000001",
instanceSerial: "0"
});
console.log(code);
// 1.2.156.3088.1.ABC123.REQ001.BOT000001.0
console.log(validateIdentityCode(code));
// true
console.log(parseIdentityCode(code).registrationRequester);
// REQ001
from gbz185_sdk import AgentIdentityCodeParts, format_identity_code, parse_identity_code, validate_identity_code
code = format_identity_code(AgentIdentityCodeParts(
registration_service_provider="abc123",
registration_requester="req001",
ontology_serial="bot000001",
instance_serial="0",
))
print(code)
print(validate_identity_code(code))
print(parse_identity_code(code).registration_requester)
code, err := gbz185.FormatIdentityCode(gbz185.AgentIdentityCodeParts{
RegistrationServiceProvider: "abc123",
RegistrationRequester: "req001",
OntologySerial: "bot000001",
InstanceSerial: "0",
})
if err != nil {
panic(err)
}
parts, err := gbz185.ParseIdentityCode(code)
fmt.Println(code, gbz185.ValidateIdentityCode(code), parts.RegistrationRequester)
use gbz185_sdk::{format_identity_code, parse_identity_code, validate_identity_code, AgentIdentityCodeParts};
let parts = AgentIdentityCodeParts::new("abc123", "req001", "bot000001", "0");
let code = format_identity_code(&parts)?;
assert!(validate_identity_code(&code));
assert_eq!(parse_identity_code(&code)?.registration_requester, "REQ001");
String code = IdentityCodes.formatIdentityCode(
new AgentIdentityCodeParts("abc123", "req001", "bot000001", "0")
);
boolean valid = IdentityCodes.validateIdentityCode(code);
String requester = IdentityCodes.parseIdentityCode(code).registrationRequester();
凭证鉴别与授权
import {
DevelopmentCredentialIssuer,
DevelopmentCredentialVerifier,
InMemoryCredentialRepository,
InMemoryCredentialStatusStore,
InterconnectionAuthorizationRuntime
} from "gbz185-sdk";
const repository = new InMemoryCredentialRepository();
const statusStore = new InMemoryCredentialStatusStore();
const issuer = new DevelopmentCredentialIssuer(repository, statusStore);
const verifier = new DevelopmentCredentialVerifier(statusStore);
const auth = new InterconnectionAuthorizationRuntime(verifier);
const issued = await issuer.issueCredential({
agentId: "1.2.156.3088.1.A1.REQ001.DEMO.1",
subject: "Demo Agent",
audience: ["service-agent"],
scope: ["agent:interact"]
});
const pkg = auth.createPresentation({
credential: issued.credential,
privateKeyPem: issued.privateKeyPem,
audience: "service-agent",
scope: ["agent:interact"],
payload: { sessionId: "session-1" }
});
const decision = await auth.authenticatePeer(pkg, {
expectedAudience: "service-agent",
requiredScope: ["agent:interact"]
});
console.log(decision.allowed);
生产提醒: 这个示例使用开发 issuer/verifier。生产环境应实现 CredentialIssuer、CredentialVerifier、CertificateChainVerifier 和 CredentialStatusStore。
HTTP Transport
HttpJsonTransport 不规定 REST 路径。它只向一个 endpoint POST { operation, payload },服务端自行路由。
import {
AgentInterconnectClient,
HttpJsonTransport
} from "gbz185-sdk";
const client = new AgentInterconnectClient(
new HttpJsonTransport({
endpoint: "https://api.example.com/gbz185",
headers: { authorization: "Bearer token" }
})
);
const results = await client.discover({
text: "calendar schedule",
requiredSkills: ["schedule.add"]
});
from gbz185_sdk import AgentInterconnectClient, HttpJsonTransport
client = AgentInterconnectClient(
HttpJsonTransport("https://api.example.com/gbz185", headers={"authorization": "Bearer token"})
)
results = client.discover({
"text": "calendar schedule",
"requiredSkills": ["schedule.add"],
})
transport := &gbz185.HttpJsonTransport{
Endpoint: "https://api.example.com/gbz185",
Headers: map[string]string{"authorization": "Bearer token"},
}
client := gbz185.NewAgentInterconnectClient(transport)
var results []gbz185.JSONObject
err := client.Discover(context.Background(), gbz185.JSONObject{
"text": "calendar schedule",
"requiredSkills": []string{"schedule.add"},
}, &results)
let transport = HttpJsonTransport::new("https://api.example.com/gbz185")
.with_header("authorization", "Bearer token");
let client = AgentInterconnectClient::new(transport);
let results = client.discover(json!({
"text": "calendar schedule",
"requiredSkills": ["schedule.add"]
}))?;
AgentInterconnectClient client =
new AgentInterconnectClient(new HttpJsonTransport("https://api.example.com/gbz185"));
JsonNode results = client.discover(Map.of(
"text", "calendar schedule",
"requiredSkills", List.of("schedule.add")
));
服务端收到的 body 形态如下。
{
"operation": "discovery.discover",
"payload": {
"text": "calendar schedule",
"requiredSkills": ["schedule.add"]
}
}
群组消息分发
const runtime = createAgentInterconnectRuntime();
const session = await runtime.client.createSession({
mode: "group",
sender: { agentId: requesterId },
receivers: [
{ agentId: serviceAId, mode: "group" },
{ agentId: serviceBId, mode: "group" }
]
});
const receipts = await runtime.client.distributeMessage({
senderRole: "requester",
senderId: requesterId,
sessionId: session.id,
dataItems: [
{ type: "text/plain", metadata: {}, payload: "hello group" }
]
});
console.log(receipts.map((receipt) => receipt.recipientId));
未显式传 recipients 时,分发运行时会从会话中推断所有参与方,并排除发送方。
多轮工具调用
const rounds = await runtime.toolAccess.invokeUntilComplete({
initialRequest: {
sessionId: "session-counter",
toolInvokeList: [
{
toolId: "counter",
toolVersion: "1.0.0",
toolInputParam: { count: 0 }
}
]
},
isComplete: (result) =>
Number(result.toolResultList[0]?.toolOutputParam?.count ?? 0) >= 2,
nextRequest: (result) => ({
sessionId: "session-counter",
toolInvokeList: [
{
toolId: "counter",
toolVersion: "1.0.0",
toolInputParam: {
count: Number(result.toolResultList[0]?.toolOutputParam?.count ?? 0)
}
}
]
}),
maxRounds: 3
});
console.log(rounds.length);
这个模式适合工具返回“还没完成,需要下一轮输入”的场景。SDK 不规定完成判断,你用 isComplete 写业务条件。
result = client.invoke_tools({
"sessionId": "session-counter",
"toolInvokeList": [{
"toolId": "counter",
"toolVersion": "1.0.0",
"toolInputParam": {"count": 0},
}],
})
Alpha 客户端只封装标准 tool.invoke operation;多轮完成判断由应用层循环控制。
var result gbz185.JSONObject
err := client.InvokeTools(context.Background(), gbz185.JSONObject{
"sessionId": "session-counter",
"toolInvokeList": []gbz185.JSONObject{{
"toolId": "counter",
"toolVersion": "1.0.0",
"toolInputParam": gbz185.JSONObject{"count": 0},
}},
}, &result)
Alpha 客户端返回单轮结果;是否继续下一轮由业务代码判断。
let result = client.invoke_tools(json!({
"sessionId": "session-counter",
"toolInvokeList": [{
"toolId": "counter",
"toolVersion": "1.0.0",
"toolInputParam": { "count": 0 }
}]
}))?;
Alpha 客户端返回单轮结果;是否继续下一轮由业务代码判断。
JsonNode result = client.invokeTools(Map.of(
"sessionId", "session-counter",
"toolInvokeList", List.of(Map.of(
"toolId", "counter",
"toolVersion", "1.0.0",
"toolInputParam", Map.of("count", 0)
))
));
Alpha 客户端返回单轮结果;是否继续下一轮由业务代码判断。