Packages
langchain
0.8.13
0.9.2
0.9.1
0.9.0
0.8.14
0.8.13
0.8.12
0.8.11
0.8.10
0.8.9
0.8.8
0.8.7
0.8.6
0.8.5
0.8.4
0.8.3
0.8.2
0.8.1
0.8.0
0.7.0
0.6.3
0.6.2
0.6.1
0.6.0
0.5.2
0.5.1
0.5.0
0.4.1
0.4.0
0.4.0-rc.3
0.4.0-rc.2
0.4.0-rc.1
0.4.0-rc.0
0.3.3
0.3.2
0.3.1
0.3.0
0.3.0-rc.2
0.3.0-rc.1
0.3.0-rc.0
0.2.0
0.1.10
0.1.9
0.1.8
0.1.7
0.1.6
0.1.5
0.1.4
0.1.3
0.1.2
0.1.1
0.1.0
Elixir implementation of a LangChain style framework that lets Elixir projects integrate with and leverage LLMs.
Current section
Files
Jump to
Current section
Files
lib/file_uploaders/file_result.ex
defmodule LangChain.FileUploader.FileResult do
@moduledoc """
Represents the result of a file upload to an LLM provider.
Different providers return different types of file references:
- **OpenAI** and **Anthropic** return a `file_id` string
- **Google Gemini** returns a `file_uri` URL
At least one of `file_id` or `file_uri` will always be present.
The `raw` field contains the full provider response for accessing
provider-specific fields not covered by the struct.
"""
use Ecto.Schema
import Ecto.Changeset
alias __MODULE__
alias LangChain.LangChainError
@primary_key false
embedded_schema do
field :file_id, :string
field :file_uri, :string
field :filename, :string
field :mime_type, :string
field :size_bytes, :integer
field :provider, Ecto.Enum, values: [:openai, :anthropic, :google]
field :raw, :map, virtual: true, default: %{}
end
@type t :: %FileResult{}
@create_fields [:file_id, :file_uri, :filename, :mime_type, :size_bytes, :provider, :raw]
@required_fields [:provider]
@doc """
Build a new FileResult and return an `:ok`/`:error` tuple with the result.
"""
@spec new(attrs :: map()) :: {:ok, t()} | {:error, Ecto.Changeset.t()}
def new(%{} = attrs) do
%FileResult{}
|> cast(attrs, @create_fields)
|> validate_required(@required_fields)
|> validate_reference_present()
|> apply_action(:insert)
end
@doc """
Build a new FileResult and return it or raise an error if invalid.
"""
@spec new!(attrs :: map()) :: t() | no_return()
def new!(attrs) do
case new(attrs) do
{:ok, result} -> result
{:error, changeset} -> raise LangChainError, changeset
end
end
defp validate_reference_present(changeset) do
file_id = get_field(changeset, :file_id)
file_uri = get_field(changeset, :file_uri)
if is_nil(file_id) and is_nil(file_uri) do
add_error(changeset, :file_id, "either file_id or file_uri must be present")
else
changeset
end
end
end