#machine-learning #algorithm #ai #api-client #binary-data

algorithmia

用于调用算法和管理在 Algorithmia 上托管的数据的客户端

21 个版本 (稳定)

3.0.0-beta.32020年1月30日
3.0.0-beta.22019年4月6日
3.0.0-beta2019年2月17日
2.1.3 2017年8月22日
0.7.0 2015年9月30日

#104 in 机器学习

Download history 13/week @ 2024-02-19 2/week @ 2024-02-26 9/week @ 2024-03-11 69/week @ 2024-04-01

每月 78 次下载

MIT 许可证

89KB
1.5K SLoC

Algorithmia Rust 客户端库

Algorithmia API 的 rust 客户端库。

文档

Build Status Crates.io

入门

Algorithmia Rust 客户端发布到 crates.io。将 algorithmia = "3.0" 添加到您的 Cargo.toml 依赖中,并运行 cargo install

使用您的 API 密钥实例化 Algorithmia 客户端

use algorithmia::Algorithmia;

let client = Algorithmia::client("YOUR_API_KEY")?;

现在您可以调用算法了。

调用算法

此客户端提供 Algorithm 类型(通常由 client.algo(..) 创建),它提供调用 Algorithmia 平台上托管算法的方法。以下调用算法的示例根据输入/输出类型组织,这些类型在不同算法之间可能有所不同。

注意:单个算法可能具有不同的输入和输出类型,或接受多种类型的输入,因此请参考算法的说明以获取该算法的特定用法示例。

文本输入/输出

通过将 &str 传递给 Algorithm::pipe 以调用具有文本输入的算法。如果算法输出是文本,请在响应上调用 as_string 方法。

let algo = client.algo("algo://demo/Hello/0.1.1");
let response = algo.pipe("HAL 9000")?;
println!("{}", response.into_string()?);

JSON 输入/输出

使用JSON输入调用算法,通过引用实现serde::Serialize的类型来调用pipe。如果算法输出为JSON,则可以调用decode将响应反序列化为一个实现serde::Deserialize的类型。

这包括许多原始类型、元组、Vec和其他来自标准库的集合类型

let algo = client.algo("algo://WebPredict/ListAnagrams/0.1.0");
let response = algo.pipe(vec!["transformer", "terraforms", "retransform"])?;
let output: Vec<String> = response.decode()?;
// -> ["transformer", "retransform"] as Vec<String>

为自定义类型实现SerializeDeserialize通常只需添加一个derive注解即可。

#[derive(Deserialize, Serialize)]
struct MyStruct {
    some_field: String,
    other_field: u32,
}
// now you can call `pipe` with `&MyStruct` or `decode` into `MyStruct`

使用serde_json,您还可以使用json!宏或实现自定义序列化/反序列化。有关使用serde的更多详细信息,请参阅serde.rs

或者,您可以处理原始JSON字符串

let response = algo.pipe_json(r#"["transformer", "terraforms", "retransform"]"#)?;
let output = response.to_json()?;
// -> "[\"transformer\", \"retransform\"]"

二进制输入/输出

通过调用pipe方法并传递字节切片(&[u8])来调用算法的二进制输入。如果算法响应是二进制数据,则调用响应上的as_bytes方法以获取字节数组(Vec<u8>)。

let mut input = Vec::new();
File::open("/path/to/bender.jpg").read_to_end(&mut input);
let response = client.algo("opencv/SmartThumbnail/0.1").pipe(&input)?;
let output = response.as_bytes()?;
// -> Vec<u8>

错误处理

遵循Rust中显式错误处理的本质,pipe和响应解析方法都返回包裹在Result中的类型

let algo = client.algo("algo://demo/Hello/0.1.1");
match algo.pipe(&[]) {
    Ok(response) => { /* success */ },
    Err(err) => println!("error calling demo/Hello: {}", err),
}
// -> error calling demo/Hello: apply() functions do not match input data

注意:此crate使用了error-chain crate,因此对于许多错误变体,可能会有附加的错误链到err.source()

请求选项

客户端通过构建器模式公开选项,可以配置算法请求。这包括支持更改超时或在响应中包含stdout。

let mut algo = client.algo("algo://demo/Hello/0.1.1");
let algo = algo.timeout(10).stdout(true);
let response = algo.pipe(input)?;
if let Some(ref stdout) = response.metadata.stdout {
    println!("{}", stdout);
}

注意:stdout(true)如果无法访问算法源,则会被忽略。

管理数据

Algorithmia Rust客户端还提供了一种管理Algorithmia托管数据和您已连接到Algorithmia账户的Dropbox或S3账户中的数据的方法。

此客户端提供了一种DataFile类型(通常通过client.file(uri)创建)和一种DataDir类型(通常通过client.dir(uri)创建),它们提供了管理数据的方法。

创建目录

通过实例化一个DataDir对象并使用DataAcl调用create来创建目录。

let robots = client.dir("data://.my/robots");
robots.create(DataAcl::default())

let robots = client.dir("dropbox://robots");
robots.create(DataAcl::default())

将文件上传到目录

通过在DataFile对象上调用put或将put_file调用在DataDir对象上上传文件。

let robots = client.dir("data://.my/robots");

// Upload local file
robots.put_file("/path/to/Optimus_Prime.png");
// Write a text file
robots.child::<DataFile>("Optimus_Prime.txt").put("Leader of the Autobots");
// Write a binary file
robots.child::<DataFile>("Optimus_Prime.key").put(b"transform");

下载文件内容

通过在DataFile对象上调用get下载文件,它返回一个包裹在Result中的DataResponse,该响应实现了Read

// Download and locally save file
let mut t800_png_reader = client.file("data://.my/robots/T-800.png").get()?;
let mut t800_png = File::create("/path/to/save/t800.png")?;
std::io::copy(&mut t800_png_reader, &mut t800_png);

// Get the file's contents as a string
let mut t800_text_reader = robots.file("data://.my/robots/T-800.txt").get()?;
let mut t800_text = String::new();
t800_text_reader.read_to_string(&mut t800_text);

// Get the file's contents as a byte array
let mut t800_png_reader = robots.file("data://.my/robots/T-800.png").get()?;
let mut t800_bytes = Vec::new();
t800_png_reader.read_to_end(&mut t800_bytes);

删除文件和目录

通过调用各自的DataFileDataDir对象的delete方法来删除文件和目录。DataDirectories接受一个force参数,该参数指示是否应该删除包含文件或其他目录的目录。

client.file("data://.my/robots/C-3PO.txt").delete();
client.dir("data://.my/robots").delete(false);

列出目录内容

使用对DataDir对象调用list方法返回的迭代器遍历目录的内容

let my_robots = client.dir("data://.my/robots");
for entry in my_robots.list() {
    match entry {
        Ok(DirEntry::Dir(dir)) => println!("Directory {}", dir.to_data_uri()),
        Ok(DirEntry::File(file)) => println!("File {}", file.to_data_uri()),
        Err(err) => println!("Error listing my robots: {}", err),
    }
}

示例

有关使用此客户端的示例,请参阅

构建 & 测试

此项目使用cargo构建和测试

cargo build
cargo test
cargo doc --no-deps

依赖项

~14–19MB
~378K SLoC