Unified, provider-neutral AI SDK for MoonBit inspired by Vercel AI SDK 7
Dependencies
当前状态:早期 alpha。1.0.0 之前 API 可能发生变化。当前版本支持 native 目标、主流文本/媒体模型服务商、MCP 客户端,以及面向 OpenCode、Pi、DeepAgents 的 Harness 运行时适配。
| 包 | 用途 |
|---|---|
| QuietlyChan/moonai/ai | 生成、embedding、媒体、上传和 realtime 等高层工作流 |
| QuietlyChan/moonai/ai/generate_text | 多步骤文本生成、逐步骤准备、流式调用、工具执行与结果聚合 |
| QuietlyChan/moonai/ai/tool | Tool caller 路由与逐步骤工具准备 |
| QuietlyChan/moonai/ai/prompt | Prompt URL/文件规范化,以及按模型能力下载资源 |
| QuietlyChan/moonai/ai/model | Provider-qualified 模型身份、直接/命名引用和 registry 解析 |
| QuietlyChan/moonai/ai/registry | Provider-qualified 模型查找,以及 provider 级 Files/Skills registry |
| QuietlyChan/moonai/provider | 模型无关的契约、调用参数、响应、事件和诊断类型 |
| QuietlyChan/moonai/provider_utils | 可复用的工具与 sandbox 契约、HTTP、SSE、JSON、multipart、URL、WebSocket、重试和流式工具 |
| QuietlyChan/moonai/openai | 带 typed options 和模型能力解析的官方 OpenAI Chat/Responses 模型 |
| QuietlyChan/moonai/open_responses | 可复用的 Open Responses 编码、解码与 transport 协议层 |
| QuietlyChan/moonai/openai_compatible | 可复用的 Chat Completions、embedding、completion 和图片适配器 |
| QuietlyChan/moonai/anthropic | Anthropic Messages、Files 和 Skills API 服务商适配器 |
| QuietlyChan/moonai/alibaba | Alibaba DashScope Chat、embedding 和视频适配器 |
| QuietlyChan/moonai/deepseek | DeepSeek Chat Completions 适配器 |
| QuietlyChan/moonai/minimax | MiniMax Chat 和视频适配器 |
| QuietlyChan/moonai/bytedance | ByteDance ModelArk Seedream 图片与 Seedance 视频适配器 |
| QuietlyChan/moonai/moonshotai | Moonshot AI Chat Completions、思考与结构化输出适配器 |
| QuietlyChan/moonai/mcp | MCP 客户端、HTTP/SSE/stdio transport、OAuth、工具和 Apps 资源 |
| QuietlyChan/moonai/harness | Harness V1 契约、Sandbox、生命周期、诊断与 WebSocket/NDJSON bridge |
| QuietlyChan/moonai/harness_opencode | OpenCode Harness 适配器 |
| QuietlyChan/moonai/harness_pi | Pi Harness 适配器 |
| QuietlyChan/moonai/harness_deepagents | DeepAgents Harness 适配器 |
| QuietlyChan/moonai/testing | 面向模型无关契约的确定性 mock model |
| QuietlyChan/moonai/cmd/main | 可选的冒烟测试程序,使用库时不需要该包 |
///|
let transport = @harness.HarnessV1BridgeTransportConfig::stdio(
@harness.HarnessV1StdioConfig::new(
command="your-harness-bridge",
args=["--stdio"],
),
)
///|
let agent = @harness_opencode.createOpenCode(
@harness_opencode.OpenCodeHarnessSettings::new(transport=transport),
)moon add QuietlyChan/moonaiimport {
"QuietlyChan/moonai/ai",
"QuietlyChan/moonai/provider",
"QuietlyChan/moonai/openai",
}///|
let model = @openai.openai(
"gpt-4.1-mini",
api_key=@env.get_env_var("OPENAI_API_KEY").unwrap(),
)
///|
let result = @ai.generate_text(
model,
prompt="用三句话解释 MoonBit。",
instructions=@ai.Instructions::text("回答要简洁。"),
)///|
let model = @openai.openai(
"gpt-4.1-mini",
api_key=@env.get_env_var("OPENAI_API_KEY").unwrap(),
)
///|
let result = @ai.stream_text(
model,
prompt="Explain MoonBit in three sentences.",
on_event=event => {
match event {
@provider.V4TextDelta(delta~, ..) => @stdio.stdout.write(delta)
_ => ()
}
},
)///|
let cancellation = @provider.CancellationToken::new()
///|
let retry_policy = @provider.RetryPolicy::new(
max_retries=3,
initial_delay_ms=200,
)
///|
let result = @ai.generate_text(
model,
prompt="解释 MoonBit。",
retry_policy~,
cancellation_token=cancellation,
)///|
let chat_model = @openai.openai_chat(
"gpt-4.1-mini",
api_key=@env.get_env_var("OPENAI_API_KEY").unwrap(),
)///|
let provider = @openai.create_openai(
api_key~,
organization="org-example",
project="proj-example",
)///|
let model = @anthropic.anthropic(
"claude-sonnet-4-20250514",
api_key=@env.get_env_var("ANTHROPIC_API_KEY").unwrap(),
)
///|
let response = @ai.stream_text(
model,
prompt="用三句话解释 MoonBit。",
provider_options={
"anthropic": {
"thinking": { "type": "enabled", "budgetTokens": 4096 },
},
},
on_event=event => {
match event {
@provider.V4TextDelta(delta~, ..) => @stdio.stdout.write(delta)
@provider.V4ReasoningDelta(delta~, ..) => ()
_ => ()
}
},
)///|
let advisor = @anthropic.advisor_20260301(
model="claude-opus-4-8",
max_uses=3,
caching=@anthropic.AnthropicAdvisorCaching::new(
ttl=@anthropic.AnthropicCacheOneHour,
),
)
///|
let result = @ai.generate_text(
model,
prompt="实现迁移,并让 advisor 审查计划。",
tools=@ai.tool_set([("advisor", advisor)]),
)///|
let deepseek = @openai_compatible.openai_compatible(
provider_name="deepseek",
base_url="https://api.deepseek.com",
model_id="deepseek-chat",
api_key~,
preserve_reasoning=true,
)
///|
let response = @ai.stream_text(
deepseek,
prompt="What is MoonBit?",
reasoning_effort=@provider.High,
on_event=event => {
match event {
@provider.V4TextDelta(delta~, ..) => @stdio.stdout.write(delta)
_ => ()
}
},
)///|
let provider = @openai_compatible.create_openai_compatible(
provider_name="example-gateway",
base_url="https://example.com/v1",
api_key~,
query_params={ "api-version": "2026-08" },
supports_structured_outputs=true,
)///|
let provider = @open_responses.create_open_responses(
provider_name="my-provider",
url="https://example.com/v1/responses",
api_key~,
)
///|
let model = provider.language_model("my-model")///|
let model = @openai_compatible.openai_compatible(
provider_name="example-gateway",
base_url="https://example.com/v1",
model_id="example-model",
api_key~,
)
///|
let response = @ai.generate_text(
model,
prompt="解释其中的取舍。",
provider_options={
"exampleGateway": {
"reasoningEffort": "high",
"user": "user-1",
},
},
)///|
let object = @ai.generate_object(
model,
{
"type": "object",
"properties": { "answer": { "type": "string" } },
"required": ["answer"],
},
prompt="请使用 JSON 回答。",
name="answer",
)
///|
let response = @ai.generate_text(
model,
messages=[
@ai.ModelMessage::user_parts([
@ai.ModelContentPart::text("描述这张图片。"),
@ai.ModelContentPart::image_url("https://example.com/moon.png"),
]),
],
)///|
let provider = @openai.create_openai(api_key~)
///|
let vector = @ai.embed(
provider.embedding("text-embedding-3-small"),
"MoonBit",
)
///|
let completion = @ai.generate_text(
provider.completion("gpt-3.5-turbo-instruct"),
prompt="MoonBit 是",
)
///|
let images = @ai.generate_image(
provider.image("gpt-image-1"),
"一枚精确的 MoonBit 语言标志",
n=2,
size="1024x1024",
)| Vercel AI SDK | moonai |
|---|---|
| generateText({ model, prompt }) | @ai.generate_text(model, prompt=...) |
| streamText({ model, prompt }) | @ai.stream_text(model, prompt=...) |
| generateObject({ model, schema }) | @ai.generate_object(model, schema, ...) |
| embed({ model, value }) | @ai.embed(model, value) |
| embedMany({ model, values }) | @ai.embed_many(model, values) |
| generateImage({ model, prompt }) | @ai.generate_image(model, prompt) |
| openai("gpt-4.1") | @openai.openai("gpt-4.1", api_key=...) |
| createOpenAI({ baseURL }) | @openai.create_openai(base_url=..., api_key=...) |
| createOpenAICompatible(...) | @openai_compatible.create_openai_compatible(...) |
| createOpenResponses(...) | @open_responses.create_open_responses(...) |
| anthropic("claude-sonnet-4-20250514") | @anthropic.anthropic("claude-sonnet-4-20250514", api_key=...) |
moon run examples/basic_chat -- "Explain MoonAI briefly."
moon run examples/tool_calling -- "Calculate 42 * 8."
moon run examples/web_agent/backendmoon info
moon fmt --check
moon check
moon testOPENAI_API_KEY=... moon run src/cmd/mainUnified, provider-neutral AI SDK for MoonBit inspired by Vercel AI SDK 7
Dependencies