Packages
langchain
0.3.0-rc.0
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/token_usage.ex
defmodule LangChain.TokenUsage do
@moduledoc """
Contains token usage information returned from an LLM.
## Example
%TokenUsage{
input: 30,
output: 15
}
Input is the tokens from the prompt. Output is the completion or generated
tokens returned.
"""
use Ecto.Schema
import Ecto.Changeset
require Logger
alias __MODULE__
alias LangChain.LangChainError
@primary_key false
embedded_schema do
field :input, :integer
field :output, :integer
end
@type t :: %TokenUsage{}
@create_fields [:input, :output]
# Anthropic returns only the output token count when streaming deltas
@required_fields [:output]
@doc """
Build a new TokenUsage and return an `:ok`/`:error` tuple with the result.
"""
@spec new(attrs :: map()) :: {:ok, t()} | {:error, Ecto.Changeset.t()}
def new(attrs \\ %{}) do
%TokenUsage{}
|> cast(attrs, @create_fields)
|> common_validations()
|> apply_action(:insert)
end
@doc """
Build a new TokenUsage 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, usage} ->
usage
{:error, changeset} ->
raise LangChainError, changeset
end
end
defp common_validations(changeset) do
changeset
|> validate_required(@required_fields)
|> validate_number(:input, greater_than_or_equal_to: 0)
|> validate_number(:output, greater_than_or_equal_to: 0)
end
@doc """
Return the total token usage amount. The total is the sum of input and output.
"""
@spec total(t()) :: integer()
def total(%TokenUsage{} = usage) do
usage.input + usage.output
end
end