Skip to content

Commit e8d2561

Browse files
Merge pull request #135 from UkioInc/feature/vector-stores-api
feat: add support for new stable Vector Stores API
2 parents 1141bc4 + 266f3fe commit e8d2561

File tree

5 files changed

+201
-3
lines changed

5 files changed

+201
-3
lines changed

lib/openai_ex/vector_stores.ex

Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
defmodule OpenaiEx.VectorStores do
2+
@moduledoc """
3+
This module provides an implementation of the OpenAI vector_stores API. The API reference can be found at https://platform.openai.com/docs/api-reference/vector-stores.
4+
"""
5+
alias OpenaiEx.Http
6+
7+
@api_fields [
8+
:file_ids,
9+
:name,
10+
:expires_after,
11+
:metadata
12+
]
13+
14+
defp ep_url(vector_store_id \\ nil) do
15+
"/vector_stores" <>
16+
if(is_nil(vector_store_id), do: "", else: "/#{vector_store_id}")
17+
end
18+
19+
@doc """
20+
Creates a new vector store request
21+
22+
Example usage:
23+
24+
iex> _request = OpenaiEx.VectorStores.new(name: "My Vector Store", file_ids: ["file-abc123"])
25+
%{name: "My Vector Store", file_ids: ["file-abc123"]}
26+
27+
iex> _request = OpenaiEx.VectorStores.new(%{name: "My Vector Store", metadata: %{"version" => "1.0"}})
28+
%{name: "My Vector Store", metadata: %{"version" => "1.0"}}
29+
"""
30+
def new(args = [_ | _]) do
31+
args |> Enum.into(%{}) |> new()
32+
end
33+
34+
def new(args = %{}) do
35+
args |> Map.take(@api_fields)
36+
end
37+
38+
def list!(openai = %OpenaiEx{}) do
39+
openai |> list() |> Http.bang_it!()
40+
end
41+
42+
def list(openai = %OpenaiEx{}) do
43+
openai |> Http.get(ep_url())
44+
end
45+
46+
def create!(openai = %OpenaiEx{}, params \\ %{}) do
47+
openai |> create(params) |> Http.bang_it!()
48+
end
49+
50+
def create(openai = %OpenaiEx{}, params \\ %{}) do
51+
json = params |> Map.take(@api_fields)
52+
openai |> Http.post(ep_url(), json: json)
53+
end
54+
55+
def retrieve!(openai = %OpenaiEx{}, vector_store_id) do
56+
openai |> retrieve(vector_store_id) |> Http.bang_it!()
57+
end
58+
59+
def retrieve(openai = %OpenaiEx{}, vector_store_id) do
60+
openai |> Http.get(ep_url(vector_store_id))
61+
end
62+
63+
def update!(openai = %OpenaiEx{}, vector_store_id, params \\ %{}) do
64+
openai |> update(vector_store_id, params) |> Http.bang_it!()
65+
end
66+
67+
def update(openai = %OpenaiEx{}, vector_store_id, params \\ %{}) do
68+
json = params |> Map.take([:name, :expires_after, :metadata])
69+
openai |> Http.post(ep_url(vector_store_id), json: json)
70+
end
71+
72+
def delete!(openai = %OpenaiEx{}, vector_store_id) do
73+
openai |> delete(vector_store_id) |> Http.bang_it!()
74+
end
75+
76+
def delete(openai = %OpenaiEx{}, vector_store_id) do
77+
openai |> Http.delete(ep_url(vector_store_id))
78+
end
79+
end
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
defmodule OpenaiEx.VectorStores.File.Batches do
2+
@moduledoc """
3+
This module provides an implementation of the OpenAI vector_store file batches API. The API reference can be found at https://platform.openai.com/docs/api-reference/vector-stores-file-batches.
4+
"""
5+
alias OpenaiEx.Http
6+
7+
defp ep_url(vector_store_id, batch_id \\ nil, action \\ nil) do
8+
"/vector_stores" <>
9+
if(is_nil(vector_store_id), do: "", else: "/#{vector_store_id}") <>
10+
"/file_batches" <>
11+
if(is_nil(batch_id), do: "", else: "/#{batch_id}") <>
12+
if(is_nil(action), do: "", else: "/#{action}")
13+
end
14+
15+
def list!(openai = %OpenaiEx{}, vector_store_id, batch_id, params \\ %{}) do
16+
openai |> list(vector_store_id, batch_id, params) |> Http.bang_it!()
17+
end
18+
19+
def list(openai = %OpenaiEx{}, vector_store_id, batch_id, params \\ %{}) do
20+
url = ep_url(vector_store_id, batch_id, "files")
21+
qry_params = params |> Map.take([:filter | OpenaiEx.list_query_fields()])
22+
openai |> Http.get(url, qry_params)
23+
end
24+
25+
def create!(openai = %OpenaiEx{}, vector_store_id, file_ids) do
26+
openai |> create(vector_store_id, file_ids) |> Http.bang_it!()
27+
end
28+
29+
def create(openai = %OpenaiEx{}, vector_store_id, file_ids) do
30+
url = ep_url(vector_store_id)
31+
openai |> Http.post(url, json: %{file_ids: file_ids})
32+
end
33+
34+
def retrieve!(openai = %OpenaiEx{}, vector_store_id, batch_id) do
35+
openai |> retrieve(vector_store_id, batch_id) |> Http.bang_it!()
36+
end
37+
38+
def retrieve(openai = %OpenaiEx{}, vector_store_id, batch_id) do
39+
openai |> Http.get(ep_url(vector_store_id, batch_id))
40+
end
41+
42+
def cancel!(openai = %OpenaiEx{}, vector_store_id, batch_id) do
43+
openai |> cancel(vector_store_id, batch_id) |> Http.bang_it!()
44+
end
45+
46+
def cancel(openai = %OpenaiEx{}, vector_store_id, batch_id) do
47+
url = ep_url(vector_store_id, batch_id, "cancel")
48+
openai |> Http.post(url)
49+
end
50+
end
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
defmodule OpenaiEx.VectorStores.Files do
2+
@moduledoc """
3+
This module provides an implementation of the OpenAI vector_store files API. The API reference can be found at https://platform.openai.com/docs/api-reference/vector-stores-files.
4+
"""
5+
alias OpenaiEx.Http
6+
7+
defp ep_url(vector_store_id, file_id \\ nil) do
8+
"/vector_stores" <>
9+
if(is_nil(vector_store_id), do: "", else: "/#{vector_store_id}") <>
10+
"/files" <>
11+
if(is_nil(file_id), do: "", else: "/#{file_id}")
12+
end
13+
14+
def list!(openai = %OpenaiEx{}, vector_store_id, params \\ %{}) do
15+
openai |> list(vector_store_id, params) |> Http.bang_it!()
16+
end
17+
18+
def list(openai = %OpenaiEx{}, vector_store_id, params \\ %{}) do
19+
qry_params = params |> Map.take([:filter | OpenaiEx.list_query_fields()])
20+
openai |> Http.get(ep_url(vector_store_id), qry_params)
21+
end
22+
23+
def create!(openai = %OpenaiEx{}, vector_store_id, file_id, params \\ %{}) do
24+
openai |> create(vector_store_id, file_id, params) |> Http.bang_it!()
25+
end
26+
27+
def create(openai = %OpenaiEx{}, vector_store_id, file_id, params \\ %{}) do
28+
json =
29+
%{file_id: file_id}
30+
|> Map.merge(params |> Map.take([:attributes]))
31+
32+
openai |> Http.post(ep_url(vector_store_id), json: json)
33+
end
34+
35+
def retrieve!(openai = %OpenaiEx{}, vector_store_id, file_id) do
36+
openai |> retrieve(vector_store_id, file_id) |> Http.bang_it!()
37+
end
38+
39+
def retrieve(openai = %OpenaiEx{}, vector_store_id, file_id) do
40+
openai |> Http.get(ep_url(vector_store_id, file_id))
41+
end
42+
43+
def delete!(openai = %OpenaiEx{}, vector_store_id, file_id) do
44+
openai |> delete(vector_store_id, file_id) |> Http.bang_it!()
45+
end
46+
47+
def delete(openai = %OpenaiEx{}, vector_store_id, file_id) do
48+
openai |> Http.delete(ep_url(vector_store_id, file_id))
49+
end
50+
end

notebooks/userguide.livemd

Lines changed: 21 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1522,9 +1522,9 @@ assts = openai |> Assistants.list()
15221522
## Vector Stores
15231523

15241524
```elixir
1525-
alias OpenaiEx.Beta.VectorStores
1526-
alias OpenaiEx.Beta.VectorStores.Files
1527-
alias OpenaiEx.Beta.VectorStores.File.Batches
1525+
alias OpenaiEx.VectorStores
1526+
alias OpenaiEx.VectorStores.Files
1527+
alias OpenaiEx.VectorStores.File.Batches
15281528
```
15291529

15301530
### Create vector store
@@ -1588,6 +1588,24 @@ vector_store_id = vector_store["id"]
15881588
{:ok, vs_file} = openai |> VectorStores.Files.create(vector_store_id, file_id)
15891589
```
15901590

1591+
### Create vector store file with attributes
1592+
1593+
The new stable API supports adding attributes (metadata) to vector store files:
1594+
1595+
```elixir
1596+
# Create a file with attributes for better organization
1597+
file_params = %{
1598+
attributes: %{
1599+
"source" => "hr_documentation",
1600+
"category" => "policies",
1601+
"priority" => "high",
1602+
"last_updated" => "2024-01-15"
1603+
}
1604+
}
1605+
1606+
{:ok, vs_file_with_attrs} = openai |> VectorStores.Files.create(vector_store_id, file_id, file_params)
1607+
```
1608+
15911609
### Retrieve vector store file
15921610

15931611
Retrieve a vector store file using the [`VectorStores.Files.retrieve()`](https://platform.openai.com/docs/api-reference/vector-stores-files/getFile) function

test/openai_ex_test.exs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,4 +11,5 @@ defmodule OpenaiExTest do
1111
doctest OpenaiEx.Beta.Threads.Runs
1212
doctest OpenaiEx.Containers
1313
doctest OpenaiEx.ContainerFiles
14+
doctest OpenaiEx.VectorStores
1415
end

0 commit comments

Comments
 (0)