Observed since 21 Oct, 10:03 UTC
No superseded metadata states collected. Unchanged observations do not create new revisions.
AIBridge - 跨语言多模态 AI 统一接口 SDK(Rust 核心,一套 API 调用 38+ provider:chat/image/video/embed/TTS/ASR)
English | 中文
跨语言 AI 统一接口 SDK -- 一套 API 调用所有 AI 模型。 Rust 核心 + Python / JS-TS / Go / JVM / .NET 五语言原生绑定。
AIBridge(原名 agn-sdk)是多模态 AI 统一接口 SDK:文本对话(chat)、图像生成(image)、视频生成(video)、文字转语音(TTS)、语音转文字(ASR)、文本嵌入(embed),一套 API 调用 38+ 个 AI provider。
v2 是破坏性升级。若你已在用 Python v1(
agn-sdk),请参阅 迁移指南。
aibridge-core (Rust, 纯 async 逻辑)
┌──────────┴──────────┐
直连(原生async) C ABI (aibridge-ffi cdylib)
┌─────┴─────┐ ┌─────┬─────┬─────┐
aibridge- aibridge- aibridge- aibridge- aibridge-
python node go jvm dotnet
(PyO3) (napi-rs) (CGO) (JNA) (P/Invoke)
asyncio Promise/ goroutine CompletableFuture Task/
AsyncIter AsyncIter +channel /Flow IAsyncEnum
aibridge-core,无 JSON 序列化边界,享真正原生 async。aibridge-ffi 的 C ABI(句柄 + JSON 边界 + 全局 tokio runtime),各语言用原生异步原语包装。详见 设计文档。
共 38 个真实 provider + 1 个 mock(echo,测试用),按类别:
| 类别 | provider |
|---|---|
| MVP | openai agnes(含 agnes-video-2.5 / agnes-video-2.5-flash,视频双契约) volcengine_cv(火山引擎) gemini |
| OpenAI 兼容族 | azure siliconflow(别名 sf) togetherai(together) fireworksai(fireworks) cloudflareai(cloudflare / workersai) |
| 扩展模型 | grok(xaigrok) yi(lingyiwanwu) sensenova(shangtang) hunyuan(tencent_hunyuan) groq |
| 更多模型 | deepseek stepfun(step) mistral cohere perplexity |
| 新兴模型 | ideogram(ideo) luma(dream-machine / lumalabs) llama(meta-llama / meta) |
| 中文模型 | qwen(通义千问) zhipu(智谱) doubao(豆包) ernie(文心一言) kimi minimax |
| 独立协议 | anthropic(Claude) stability(Stability AI) runway pika kling(可灵) |
| 音频 TTS | edge-tts(免费,免认证,别名 edge_tts / edge) elevenlabs(eleven / 11labs) cartesia(sonic) |
| 音频 ASR | deepgram(dg) assemblyai(assembly / aai) |
| Mock | echo(免认证,测试用,不调网络) |
下面每个示例都用 echo 适配器(免认证、不调网络),可直接运行验证管线。真实使用时把 provider="echo" 换成 provider="openai" 等并传入 api_key。
pip install aibridge-sdk
import asyncio
from aibridge import Client
async def main():
# echo 免认证;真实用例:Client(provider="openai", api_key="sk-xxx")
client = Client(provider="echo")
await client.start()
# 文本对话
resp = await client.chat(
model="echo-chat",
messages=[{"role": "user", "content": "你好"}],
)
print(resp.choices[0].message.content) # "你好 [echo]"
# 流式对话
stream = await client.chat_stream(
model="echo-chat",
messages=[{"role": "user", "content": "你好"}],
)
async for chunk in stream:
print(chunk.choices[0].content, end="", flush=True)
print()
# 文字转语音
audio = await client.speech(model="echo-tts", input="你好", voice="alloy")
print(f"音频 {len(audio.audio_data)} 字节")
await client.close()
asyncio.run(main())
运行:
pip install maturin
maturin develop -m crates/aibridge-python/Cargo.toml
python examples/hello_python.py
const { Client } = require('./crates/aibridge-node');
async function main() {
// echo 免认证;真实用例:new Client('openai', { apiKey: 'sk-xxx' })
const client = new Client('echo', {});
await client.start();
// 文本对话
const resp = await client.chat({
model: 'echo-chat',
messages: [{ role: 'user', content: '你好' }],
});
console.log(resp.choices[0].message.content); // "你好 [echo]"
// 流式对话
const stream = await client.chatStream({
model: 'echo-chat',
messages: [{ role: 'user', content: '你好' }],
});
for await (const chunk of stream) {
const delta = chunk.choices[0];
if (delta.content) process.stdout.write(delta.content);
}
console.log();
// 文字转语音
const audio = await client.speech({
model: 'echo-tts',
input: '你好',
voice: 'alloy',
});
console.log(`音频 ${audio.audioData.length} 字节`);
await client.close();
}
main();
运行:
cd crates/aibridge-node && npm install && napi build && cd ../..
node examples/hello_node.js
package main
import (
"fmt"
aibridge "github.com/aibridge/aibridge-go"
)
func main() {
// echo 免认证;真实用例:aibridge.NewClient("openai", &aibridge.ClientOpts{ApiKey: "sk-xxx"})
client, err := aibridge.NewClient("echo", nil)
if err != nil {
panic(err)
}
defer client.Close()
client.Start()
// 文本对话
chatReq := &aibridge.ChatRequest{
Model: "echo-chat",
Messages: []aibridge.ChatMessage{aibridge.NewUserTextMessage("你好")},
}
resp, err := client.Chat(chatReq)
if err != nil {
panic(err)
}
fmt.Println(resp.Choices[0].Message.Content) // "你好 [echo]"
// 流式对话
stream, err := client.ChatStream(chatReq)
if err != nil {
panic(err)
}
for chunk := range stream.Ch() {
if len(chunk.Choices) > 0 {
fmt.Print(chunk.Choices[0].Delta.Content)
}
}
fmt.Println()
// 文字转语音
speechReq := &aibridge.SpeechRequest{
Model: "echo-tts",
Input: "你好",
Voice: aibridge.SingleVoice("alloy"),
}
speech, err := client.Speech(speechReq)
if err != nil {
panic(err)
}
fmt.Printf("音频 %d 字节\n", len(speech.AudioData))
}
运行:
cargo build -p aibridge-ffi
cd bindings/go
CGO_ENABLED=1 DYLD_LIBRARY_PATH=../../target/debug go run ./example
package io.aibridge;
import java.util.List;
public class Hello {
public static void main(String[] args) {
// echo 免认证;真实用例:new Client("openai", "sk-xxx")
try (Client client = new Client("echo")) {
client.start();
// 文本对话
ChatRequest req = ChatRequest.builder(
"echo-chat",
List.of(ChatMessage.user("你好")))
.build();
ChatCompletion resp = client.chat(req);
System.out.println(resp.choices.get(0).message.content); // "你好 [echo]"
// 流式对话
ChatRequest streamReq = ChatRequest.builder(
"echo-chat",
List.of(ChatMessage.user("你好")))
.stream(true)
.build();
try (ChatStream stream = client.chatStream(streamReq)) {
while (stream.hasNext()) {
ChatCompletionChunk chunk = stream.next();
String c = chunk.firstDeltaContent();
if (c != null) System.out.print(c);
}
}
System.out.println();
// 文字转语音
SpeechRequest speechReq = SpeechRequest.builder("echo-tts", "你好", "alloy").build();
SpeechResultFull audio = client.speech(speechReq);
System.out.println("音频 " + audio.audioLength() + " 字节");
}
}
}
运行:
cd bindings/jvm && ./gradlew run
using AIBridge;
// echo 免认证;真实用例:new Client("openai", "sk-xxx")
using var client = new Client("echo");
client.Start();
// 文本对话
var chatReq = new ChatRequest("echo-chat", new[]
{
ChatMessage.User("你好"),
});
ChatCompletion resp = client.Chat(chatReq);
Console.WriteLine(resp.Choices[0].Message.Content); // "你好 [echo]"
// 流式对话
int chunkCount = 0;
var assembled = new System.Text.StringBuilder();
await foreach (ChatCompletionChunk chunk in client.ChatStreamAsync(chatReq))
{
chunkCount++;
if (chunk.Choices.Count > 0 && chunk.Choices[0].Delta.Content != null)
assembled.Append(chunk.Choices[0].Delta.Content);
}
Console.WriteLine(assembled.ToString());
// 文字转语音
var speechReq = new SpeechRequest("echo-tts", "你好", "alloy");
SpeechResult audio = client.Speech(speechReq);
Console.WriteLine($"音频 {audio.AudioData.Length} 字节");
运行:
cargo build -p aibridge-ffi
cd bindings/dotnet && dotnet run
阶段 3 发布进行中,以下为各语言的目标安装方式。发布前可从源码构建。
| 语言 | 安装命令 | 包名 |
|---|---|---|
| Python | pip install aibridge | PyPI aibridge |
| Node.js | npm install aibridge | npm aibridge |
| Go | go get github.com/aibridge/aibridge-go(需单独装 libaibridge) | Go module aibridge-go |
| JVM | Maven io.aibridge:aibridge | Maven Central |
| .NET | dotnet add package AIBridge | NuGet AIBridge |
从源码构建(开发/发布前):
# Rust 核心 + ffi
cargo build --workspace
# Python 绑定
pip install maturin
maturin develop -m crates/aibridge-python/Cargo.toml
# Node 绑定
cd crates/aibridge-node && npm install && napi build
# Go / JVM / .NET 绑定需先 cargo build -p aibridge-ffi 产 libaibridge 动态库
| 能力 | 方法 | 说明 |
|---|---|---|
| 文本对话 | chat | 支持多轮、system/user/assistant/tool、多模态、工具调用 |
| 流式对话 | chat_stream | 原生异步迭代器,逐块产出 |
| 图像生成 | image_generate | 文生图、图生图(reference_images)、局部重绘(mask) |
| 视频生成 | video_create + video_poll | 文生视频、图生视频,任务轮询 |
| 文字转语音 | speech | TTS,支持音色候选列表自动降级 |
| 语音转文字 | transcribe | ASR,支持文件路径/URL/bytes/base64 输入 |
| 文本嵌入 | embed | 文本向量化 |
| 模型列表 | list_models | 实时拉取 provider 可用模型 |
| 音色列表 | list_voices / recommend_voices | 音色健康检查/推荐/自动降级 |
统一错误基类 AibridgeError,子类按错误性质分类(各语言异常名一致):
AuthenticationError 认证失败RateLimitError 限流(含 retry_after)ValidationError 参数校验ModelNotFoundError 模型不存在APIError Provider API 错误NetworkError 网络错误TimeoutError 超时UnsupportedCapabilityError 能力不支持ProviderNotFoundError provider 不存在VoiceNotAvailableError 音色不可用ServiceUnavailableError 服务暂不可用(可重试)错误带稳定 code(snake_case,如 rate_limit_error)与 retryable 标识,便于业务层重试决策。
v1.3.3;v1 已全量迁移至 v2,旧文件已从仓库移除)同仓库主 LICENSE。
Download counts and popularity will appear here as the collector receives them.
| Version | Published | Direct dependencies | Open version |
|---|---|---|---|
| 2.1.1 | 30 Aug 2026 | 0 |
This describes our collected data; it is not a security assessment.
Observed since 21 Oct, 10:03 UTC
No superseded metadata states collected. Unchanged observations do not create new revisions.
package:5d0ec7a49869e7e601addb6e1a9a386739e39fb6bddfadac573626c3863ca5dd