Google Gemini Pro
Mix.install([
{:kino, "~> 0.14"},
{:req, "~> 0.4"}
])
Text
api_key_input = Kino.Input.text("API_KEY")
api_key = Kino.Input.read(api_key_input)
base_url = "https://generativelanguage.googleapis.com/v1beta/models"
headers = %{
"Content-Type" => "application/json"
}
request_body = %{
contents: [
%{
parts: [
%{
text: "開発言語の Elixir について教えてください"
}
]
}
]
}
response =
"#{base_url}/gemini-pro:generateContent?key=#{api_key}"
|> Req.post!(
json: request_body,
headers: headers
)
|> Map.get(:body)
response
|> Map.get("candidates")
|> hd()
|> Map.get("content")
|> Map.get("parts")
|> hd()
|> Map.get("text")
|> Kino.Markdown.new()
Text + Image
image_input = Kino.Input.image("IMAGE", format: :jpeg)
image_binary =
image_input
|> Kino.Input.read()
|> Map.get(:file_ref)
|> Kino.Input.file_path()
|> File.read!()
request_body = %{
contents: [
%{
parts: [
%{
text: "首輪は何色ですか"
},
%{
inline_data: %{
mime_type: "image/jpeg",
data: Base.encode64(image_binary)
}
}
]
}
]
}
response =
"#{base_url}/gemini-pro-vision:generateContent?key=#{api_key}"
|> Req.post!(
json: request_body,
headers: headers
)
|> Map.get(:body)
response
|> Map.get("candidates")
|> hd()
|> Map.get("content")
|> Map.get("parts")
|> hd()
|> Map.get("text")
|> Kino.Markdown.new()
request_body = %{
contents: [
%{
parts: [
%{
text: "写真内の犬はどういう状態になっていますか"
},
%{
inline_data: %{
mime_type: "image/jpeg",
data: Base.encode64(image_binary)
}
}
]
}
]
}
"#{base_url}/gemini-pro-vision:generateContent?key=#{api_key}"
|> Req.post!(
json: request_body,
headers: headers
)
|> Map.get(:body)
|> Map.get("candidates")
|> hd()
|> Map.get("content")
|> Map.get("parts")
|> hd()
|> Map.get("text")
|> Kino.Markdown.new()
request_body = %{
contents: [
%{
parts: [
%{
text: "写真内の犬はどんなことを考えているように見えますか"
},
%{
inline_data: %{
mime_type: "image/jpeg",
data: Base.encode64(image_binary)
}
}
]
}
]
}
"#{base_url}/gemini-pro-vision:generateContent?key=#{api_key}"
|> Req.post!(
json: request_body,
headers: headers
)
|> Map.get(:body)
|> Map.get("candidates")
|> hd()
|> Map.get("content")
|> Map.get("parts")
|> hd()
|> Map.get("text")
|> Kino.Markdown.new()