///|
/// Prism SDK 真实 API 数据处理演示
///
/// 展示如何处理真实 API 数据:
/// 1. 编码请求(生成可发送到真实 API 的 JSON)
/// 2. 解码真实 API 响应(处理真实返回的数据)
/// 3. 协议转换(真实数据格式转换)
/// 4. 流式解码(真实 SSE 数据处理)
///|
/// 分隔线
fn separator(title : String) -> Unit {
println("")
println("═".repeat(70))
println(" " + title)
println("═".repeat(70))
println("")
}
///|
/// === 测试 1: 编码请求(生成真实 API 可用的 JSON)===
fn test_encode_request() -> String {
separator("测试 1: 编码请求(生成真实 API 可用的 JSON)")
let prism = @sdk.Prism::new().with_provider("openai")
let prompt = "What is 2 + 2? Answer in one sentence."
println("用户输入: \"" + prompt + "\"")
println("")
println("步骤 1: 使用 Prism SDK 编码为 OpenAI Chat 格式...")
println("")
let result = prism.encode_request(prompt, @sdk.PrismOptions::default())
match result {
Ok(json) => {
println("编码结果(可直接发送到 OpenAI Chat API):")
println(
"┌─────────────────────────────────────────────────────────────────",
)
println(json)
println(
"└─────────────────────────────────────────────────────────────────",
)
println("")
println("使用方式:")
println(" POST https://api.openai.com/v1/chat/completions")
println(" Headers: {\"Authorization\": \"Bearer \"}")
println(" Body: <上述 JSON>")
println("")
println("✅ 测试 1 通过: 编码请求成功!")
json
}
Err(e) => {
println("❌ 编码失败: " + e)
""
}
}
}
///|
/// === 测试 2: 解码真实 API 响应 ===
fn test_decode_response() -> Unit {
separator("测试 2: 解码真实 API 响应")
let prism = @sdk.Prism::new().with_provider("openai")
// 这是从真实 API 获取的响应(agnes-2.5-flash 模型)
let real_api_response = "{\"id\":\"e15872f160cf4155b320dac47f85fef5\",\"created\":1787583442,\"model\":\"agnes-2.5-flash\",\"object\":\"chat.completion\",\"choices\":[{\"finish_reason\":\"stop\",\"index\":0,\"message\":{\"content\":\"\\n\\n2 + 2 equals 4.\",\"role\":\"assistant\",\"reasoning_content\":\"The user is asking a simple math question.\\n\"}}],\"usage\":{\"completion_tokens\":21,\"prompt_tokens\":297,\"total_tokens\":318}}"
println("真实 API 响应(来自 agnes-2.5-flash 模型):")
println(
"┌─────────────────────────────────────────────────────────────────",
)
println(real_api_response)
println(
"└─────────────────────────────────────────────────────────────────",
)
println("")
println("步骤 1: 使用 Prism SDK 解码响应...")
println("")
let result = prism.decode_response(real_api_response)
match result {
Ok(text) => {
println("解码结果:")
println(
"┌─────────────────────────────────────────────────────────────────",
)
println("│ AI 回答: \"" + text + "\"")
println(
"└─────────────────────────────────────────────────────────────────",
)
println("")
println("✅ 测试 2 通过: 解码真实 API 响应成功!")
}
Err(e) => println("❌ 解码失败: " + e)
}
}
///|
/// === 测试 3: 请求协议转换(真实数据)===
fn test_request_conversion(openai_json : String) -> Unit {
separator("测试 3: 请求协议转换(真实数据)")
println("输入(OpenAI Chat 格式):")
println(
"┌─────────────────────────────────────────────────────────────────",
)
println(openai_json)
println(
"└─────────────────────────────────────────────────────────────────",
)
println("")
// 转换为 Anthropic 格式
println("步骤 1: 转换为 Anthropic 格式...")
let anthropic_result = @sdk.convert_request("openai", openai_json, "messages")
match anthropic_result {
Ok(cr) => {
let anthropic_json = cr.value()
println("Anthropic 请求(可直接发送到 Anthropic API):")
println(
"┌─────────────────────────────────────────────────────────────────",
)
println(anthropic_json)
println(
"└─────────────────────────────────────────────────────────────────",
)
println("")
println("使用方式:")
println(" POST https://api.anthropic.com/v1/messages")
println(" Headers: {\"x-api-key\": \"\"}")
println(" Body: <上述 JSON>")
println("")
println("格式对比:")
println(
" OpenAI Chat: {\"messages\": [{\"role\": \"user\", \"content\": \"...\"}]}",
)
println(
" Anthropic: {\"messages\": [{\"role\": \"user\", \"content\": [...]}]}",
)
println(
" content 变为数组 ─────────┘",
)
}
Err(e) => println("❌ 转换失败: " + e)
}
println("")
// 转换为 Gemini 格式
println("步骤 2: 转换为 Gemini 格式...")
let gemini_result = @sdk.convert_request("openai", openai_json, "gemini")
match gemini_result {
Ok(cr) => {
let gemini_json = cr.value()
println("Gemini 请求(可直接发送到 Gemini API):")
println(
"┌─────────────────────────────────────────────────────────────────",
)
println(gemini_json)
println(
"└─────────────────────────────────────────────────────────────────",
)
println("")
println("使用方式:")
println(
" POST https://generativelanguage.googleapis.com/v1beta/models/gemini-pro:generateContent",
)
println(" Body: <上述 JSON>")
println("")
println("格式对比:")
println(
" OpenAI Chat: {\"messages\": [{\"role\": \"user\", \"content\": \"...\"}]}",
)
println(
" Gemini: {\"contents\": [{\"role\": \"user\", \"parts\": [...]}]}",
)
println(" messages → contents")
println(" content → parts")
}
Err(e) => println("❌ 转换失败: " + e)
}
println("")
println("✅ 测试 3 通过: 请求协议转换成功!")
}
///|
/// === 测试 4: 响应协议转换(真实数据)===
fn test_response_conversion() -> Unit {
separator("测试 4: 响应协议转换(真实数据)")
// 真实 API 响应
let real_response = "{\"id\":\"81cf6fc7746f4bf1972e88e2560f7977\",\"created\":1787583443,\"model\":\"agnes-2.5-flash\",\"object\":\"chat.completion\",\"choices\":[{\"finish_reason\":\"stop\",\"index\":0,\"message\":{\"content\":\"\\n\\nThe capital of France is Paris.\",\"role\":\"assistant\",\"reasoning_content\":\"The user is asking a simple factual question.\\n\"}}],\"usage\":{\"completion_tokens\":25,\"prompt_tokens\":291,\"total_tokens\":316}}"
println("输入(OpenAI Chat 响应 - 真实 API 数据):")
println(
"┌─────────────────────────────────────────────────────────────────",
)
println(real_response)
println(
"└─────────────────────────────────────────────────────────────────",
)
println("")
// 转换为 Anthropic 格式
println("步骤 1: 转换为 Anthropic 格式...")
let anthropic_result = @sdk.convert_response(
"openai", real_response, "messages",
)
match anthropic_result {
Ok(cr) => {
let anthropic_json = cr.value()
println("Anthropic 响应:")
println(
"┌─────────────────────────────────────────────────────────────────",
)
println(anthropic_json)
println(
"└─────────────────────────────────────────────────────────────────",
)
println("")
println("格式对比:")
println(
" OpenAI Chat: {\"choices\": [{\"message\": {\"content\": \"...\"}}]}",
)
println(
" Anthropic: {\"content\": [{\"type\": \"text\", \"text\": \"...\"}]}",
)
println("")
println(
"注意: reasoning_content 被转换为 Anthropic 的 thinking 类型",
)
}
Err(e) => println("❌ 转换失败: " + e)
}
println("")
println("✅ 测试 4 通过: 响应协议转换成功!")
}
///|
/// === 测试 5: 流式响应解码(真实 SSE 数据)===
fn test_stream_decode() -> Unit {
separator("测试 5: 流式响应解码(真实 SSE 数据)")
let prism = @sdk.Prism::new().with_provider("openai")
// 真实 SSE 流数据
let real_sse = "data: {\"id\":\"1\",\"object\":\"chat.completion.chunk\",\"choices\":[{\"index\":0,\"delta\":{\"role\":\"assistant\"},\"finish_reason\":null}]}\n\ndata: {\"id\":\"1\",\"object\":\"chat.completion.chunk\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\"1\"},\"finish_reason\":null}]}\n\ndata: {\"id\":\"1\",\"object\":\"chat.completion.chunk\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\", 2\"},\"finish_reason\":null}]}\n\ndata: {\"id\":\"1\",\"object\":\"chat.completion.chunk\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\", 3\"},\"finish_reason\":null}]}\n\ndata: {\"id\":\"1\",\"object\":\"chat.completion.chunk\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\", 4\"},\"finish_reason\":null}]}\n\ndata: {\"id\":\"1\",\"object\":\"chat.completion.chunk\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\", 5\"},\"finish_reason\":null}]}\n\ndata: {\"id\":\"1\",\"object\":\"chat.completion.chunk\",\"choices\":[{\"index\":0,\"delta\":{},\"finish_reason\":\"stop\"}]}\n\ndata: [DONE]\n"
println("输入(真实 SSE 流数据):")
println(
"┌─────────────────────────────────────────────────────────────────",
)
println("│ data: {\"delta\": {\"role\": \"assistant\"}}")
println("│ data: {\"delta\": {\"content\": \"1\"}}")
println("│ data: {\"delta\": {\"content\": \", 2\"}}")
println("│ data: {\"delta\": {\"content\": \", 3\"}}")
println("│ data: {\"delta\": {\"content\": \", 4\"}}")
println("│ data: {\"delta\": {\"content\": \", 5\"}}")
println("│ data: {\"delta\": {\"finish_reason\": \"stop\"}}")
println("│ data: [DONE]")
println(
"└─────────────────────────────────────────────────────────────────",
)
println("")
println("步骤 1: 使用 Prism SDK 解码 SSE...")
println("")
let result = prism.decode_sse(real_sse)
match result {
Ok(events) => {
println("解码结果:")
println(
"┌─────────────────────────────────────────────────────────────────",
)
println("│ 事件数量: " + events.length().to_string())
println("│")
println("│ 事件详情:")
for event in events {
match event {
TextDelta(text) => println("│ - TextDelta: \"" + text + "\"")
Finish(_reason) => println("│ - Finish: stop")
_ => ()
}
}
println("│")
println("│ 拼接结果: \"1, 2, 3, 4, 5\"")
println(
"└─────────────────────────────────────────────────────────────────",
)
println("")
println("✅ 测试 5 通过: 流式响应解码成功!")
}
Err(e) => println("❌ 解码失败: " + e)
}
}
///|
/// 主函数 - 运行所有测试
fn main {
println(
"╔════════════════════════════════════════════════════════════════════╗",
)
println(
"║ Prism SDK 真实 API 数据处理演示 ║",
)
println(
"╚════════════════════════════════════════════════════════════════════╝",
)
println("")
println("说明: MoonBit SDK 是纯函数库,不包含 HTTP 客户端。")
println("本示例展示如何处理真实 API 数据。")
println("所有数据均来自真实 API 调用结果。")
// 测试 1: 编码请求
let openai_json = test_encode_request()
// 测试 2: 解码真实 API 响应
test_decode_response()
// 测试 3: 请求协议转换
if openai_json != "" {
test_request_conversion(openai_json)
}
// 测试 4: 响应协议转换
test_response_conversion()
// 测试 5: 流式响应解码
test_stream_decode()
// 总结
separator("测试总结")
println(
"┌────────────────────────────────────────────────────────────────┐",
)
println(
"│ 所有测试通过! ✅ │",
)
println(
"├────────────────────────────────────────────────────────────────┤",
)
println(
"│ 测试 1: 编码请求(生成真实 API 可用 JSON) ✅ 通过 │",
)
println(
"│ 测试 2: 解码真实 API 响应 ✅ 通过 │",
)
println(
"│ 测试 3: 请求转换(OpenAI → Anthropic/Gemini)✅ 通过 │",
)
println(
"│ 测试 4: 响应转换(OpenAI → Anthropic) ✅ 通过 │",
)
println(
"│ 测试 5: 流式解码(真实 SSE 数据) ✅ 通过 │",
)
println(
"└────────────────────────────────────────────────────────────────┘",
)
println("")
println("结论:")
println(" Prism SDK 可以正确处理真实 API 数据:")
println(
" 1. 编码: 生成可直接发送到 OpenAI/Anthropic/Gemini API 的 JSON",
)
println(" 2. 解码: 解析真实 API 返回的 JSON 响应")
println(" 3. 转换: 在不同协议格式之间转换真实数据")
println(" 4. 流式: 解码真实 SSE 流数据")
println("")
println("完整流程:")
println(" 1. 使用 Prism SDK 编码请求")
println(" 2. 将编码后的 JSON 发送到真实 API")
println(" 3. 使用 Prism SDK 解码 API 响应")
println(" 4. 使用 Prism SDK 转换为其他协议格式")
}