mirror of
https://github.com/mii443/openai-api-rs.git
synced 2025-08-22 23:25:39 +00:00
Add vision
This commit is contained in:
@ -10,7 +10,7 @@ fn main() -> Result<(), Box<dyn std::error::Error>> {
|
|||||||
GPT4.to_string(),
|
GPT4.to_string(),
|
||||||
vec![chat_completion::ChatCompletionMessage {
|
vec![chat_completion::ChatCompletionMessage {
|
||||||
role: chat_completion::MessageRole::user,
|
role: chat_completion::MessageRole::user,
|
||||||
content: String::from("What is Bitcoin?"),
|
content: chat_completion::Content::Text(String::from("What is bitcoin?")),
|
||||||
name: None,
|
name: None,
|
||||||
}],
|
}],
|
||||||
);
|
);
|
||||||
|
@ -31,7 +31,7 @@ fn main() -> Result<(), Box<dyn std::error::Error>> {
|
|||||||
GPT3_5_TURBO_0613.to_string(),
|
GPT3_5_TURBO_0613.to_string(),
|
||||||
vec![chat_completion::ChatCompletionMessage {
|
vec![chat_completion::ChatCompletionMessage {
|
||||||
role: chat_completion::MessageRole::user,
|
role: chat_completion::MessageRole::user,
|
||||||
content: String::from("What is the price of Ethereum?"),
|
content: chat_completion::Content::Text(String::from("What is the price of Ethereum?")),
|
||||||
name: None,
|
name: None,
|
||||||
}],
|
}],
|
||||||
)
|
)
|
||||||
|
@ -31,7 +31,7 @@ fn main() -> Result<(), Box<dyn std::error::Error>> {
|
|||||||
GPT3_5_TURBO_0613.to_string(),
|
GPT3_5_TURBO_0613.to_string(),
|
||||||
vec![chat_completion::ChatCompletionMessage {
|
vec![chat_completion::ChatCompletionMessage {
|
||||||
role: chat_completion::MessageRole::user,
|
role: chat_completion::MessageRole::user,
|
||||||
content: String::from("What is the price of Ethereum?"),
|
content: chat_completion::Content::Text(String::from("What is the price of Ethereum?")),
|
||||||
name: None,
|
name: None,
|
||||||
}],
|
}],
|
||||||
)
|
)
|
||||||
@ -83,15 +83,17 @@ fn main() -> Result<(), Box<dyn std::error::Error>> {
|
|||||||
vec![
|
vec![
|
||||||
chat_completion::ChatCompletionMessage {
|
chat_completion::ChatCompletionMessage {
|
||||||
role: chat_completion::MessageRole::user,
|
role: chat_completion::MessageRole::user,
|
||||||
content: String::from("What is the price of Ethereum?"),
|
content: chat_completion::Content::Text(String::from(
|
||||||
|
"What is the price of Ethereum?",
|
||||||
|
)),
|
||||||
name: None,
|
name: None,
|
||||||
},
|
},
|
||||||
chat_completion::ChatCompletionMessage {
|
chat_completion::ChatCompletionMessage {
|
||||||
role: chat_completion::MessageRole::function,
|
role: chat_completion::MessageRole::function,
|
||||||
content: {
|
content: chat_completion::Content::Text({
|
||||||
let price = get_coin_price(&coin);
|
let price = get_coin_price(&coin);
|
||||||
format!("{{\"price\": {}}}", price)
|
format!("{{\"price\": {}}}", price)
|
||||||
},
|
}),
|
||||||
name: Some(String::from("get_coin_price")),
|
name: Some(String::from("get_coin_price")),
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
|
39
examples/vision.rs
Normal file
39
examples/vision.rs
Normal file
@ -0,0 +1,39 @@
|
|||||||
|
use openai_api_rs::v1::api::Client;
|
||||||
|
use openai_api_rs::v1::chat_completion::{self, ChatCompletionRequest};
|
||||||
|
use openai_api_rs::v1::common::GPT4_VISION_PREVIEW;
|
||||||
|
use std::env;
|
||||||
|
|
||||||
|
fn main() -> Result<(), Box<dyn std::error::Error>> {
|
||||||
|
let client = Client::new(env::var("OPENAI_API_KEY").unwrap().to_string());
|
||||||
|
|
||||||
|
let req = ChatCompletionRequest::new(
|
||||||
|
GPT4_VISION_PREVIEW.to_string(),
|
||||||
|
vec![chat_completion::ChatCompletionMessage {
|
||||||
|
role: chat_completion::MessageRole::user,
|
||||||
|
content: chat_completion::Content::ImageUrl(vec![
|
||||||
|
chat_completion::ImageUrl {
|
||||||
|
r#type: chat_completion::ContentType::text,
|
||||||
|
text: Some(String::from("What’s in this image?")),
|
||||||
|
image_url: None,
|
||||||
|
},
|
||||||
|
chat_completion::ImageUrl {
|
||||||
|
r#type: chat_completion::ContentType::image_url,
|
||||||
|
text: None,
|
||||||
|
image_url: Some(chat_completion::ImageUrlType {
|
||||||
|
url: String::from(
|
||||||
|
"https://upload.wikimedia.org/wikipedia/commons/5/50/Bitcoin.png",
|
||||||
|
),
|
||||||
|
}),
|
||||||
|
},
|
||||||
|
]),
|
||||||
|
name: None,
|
||||||
|
}],
|
||||||
|
);
|
||||||
|
|
||||||
|
let result = client.chat_completion(req)?;
|
||||||
|
println!("{:?}", result.choices[0].message.content);
|
||||||
|
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
|
// OPENAI_API_KEY=xxxx cargo run --package openai-api-rs --example chat_completion
|
@ -98,10 +98,51 @@ pub enum MessageRole {
|
|||||||
function,
|
function,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[derive(Debug, Deserialize, Clone)]
|
||||||
|
pub enum Content {
|
||||||
|
Text(String),
|
||||||
|
ImageUrl(Vec<ImageUrl>),
|
||||||
|
}
|
||||||
|
|
||||||
|
impl serde::Serialize for Content {
|
||||||
|
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
|
||||||
|
where
|
||||||
|
S: serde::Serializer,
|
||||||
|
{
|
||||||
|
match *self {
|
||||||
|
Content::Text(ref text) => serializer.serialize_str(text),
|
||||||
|
Content::ImageUrl(ref image_url) => image_url.serialize(serializer),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Debug, Serialize, Deserialize, Clone)]
|
||||||
|
#[allow(non_camel_case_types)]
|
||||||
|
pub enum ContentType {
|
||||||
|
text,
|
||||||
|
image_url,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Debug, Serialize, Deserialize, Clone)]
|
||||||
|
#[allow(non_camel_case_types)]
|
||||||
|
pub struct ImageUrlType {
|
||||||
|
pub url: String,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Debug, Serialize, Deserialize, Clone)]
|
||||||
|
#[allow(non_camel_case_types)]
|
||||||
|
pub struct ImageUrl {
|
||||||
|
pub r#type: ContentType,
|
||||||
|
#[serde(skip_serializing_if = "Option::is_none")]
|
||||||
|
pub text: Option<String>,
|
||||||
|
#[serde(skip_serializing_if = "Option::is_none")]
|
||||||
|
pub image_url: Option<ImageUrlType>,
|
||||||
|
}
|
||||||
|
|
||||||
#[derive(Debug, Serialize, Deserialize, Clone)]
|
#[derive(Debug, Serialize, Deserialize, Clone)]
|
||||||
pub struct ChatCompletionMessage {
|
pub struct ChatCompletionMessage {
|
||||||
pub role: MessageRole,
|
pub role: MessageRole,
|
||||||
pub content: String,
|
pub content: Content,
|
||||||
#[serde(skip_serializing_if = "Option::is_none")]
|
#[serde(skip_serializing_if = "Option::is_none")]
|
||||||
pub name: Option<String>,
|
pub name: Option<String>,
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user