21 个版本 (稳定)
3.0.0-beta.3 | 2020年1月30日 |
---|---|
3.0.0-beta.2 | 2019年4月6日 |
3.0.0-beta | 2019年2月17日 |
2.1.3 | 2017年8月22日 |
0.7.0 | 2015年9月30日 |
#104 in 机器学习
每月 78 次下载
89KB
1.5K SLoC
Algorithmia Rust 客户端库
Algorithmia API 的 rust 客户端库。
入门
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>
为自定义类型实现Serialize
或Deserialize
通常只需添加一个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);
删除文件和目录
通过调用各自的DataFile
或DataDir
对象的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),
}
}
示例
有关使用此客户端的示例,请参阅
- 基本测试 示例
- Algorithmia CLI - 使用此客户端构建的CLI
- Algorithmia FUSE - 使用此客户端构建的实验性文件系统
构建 & 测试
此项目使用cargo构建和测试
cargo build
cargo test
cargo doc --no-deps
依赖项
~14–19MB
~378K SLoC