parsing nested fields when argument is a TypedStruct

I have the following typed struct:
defmodule WeightRanker do
use Ash.TypedStruct

typed_struct do
field :dense_vector, :float, default: 1
field :splade_vector_text, :float, default: 1
field :splade_vector_title, :float, default: 1
field :splade_vector_tags, :float, default: 1
field :splade_vector_description, :float, default: 1
field :bm25_vector_text, :float, default: 1
field :bm25_vector_title, :float, default: 1
field :bm25_vector_tags, :float, default: 1
field :bm25_vector_description, :float, default: 1
end
end
defmodule WeightRanker do
use Ash.TypedStruct

typed_struct do
field :dense_vector, :float, default: 1
field :splade_vector_text, :float, default: 1
field :splade_vector_title, :float, default: 1
field :splade_vector_tags, :float, default: 1
field :splade_vector_description, :float, default: 1
field :bm25_vector_text, :float, default: 1
field :bm25_vector_title, :float, default: 1
field :bm25_vector_tags, :float, default: 1
field :bm25_vector_description, :float, default: 1
end
end
I want to be able to receive it as an input on an action: argument :weights, Milvus.WeightRanker, default: fn -> Milvus.WeightRanker.new!(%{}) end and have Ash automatically parse something like: %{"weights" => %{"dense_vector" => 0}} and pass the fields into the TypedStruct. Expected:
%ShAgent.HybridSearch.Milvus.WeightRanker{
dense_vector: 0,
splade_vector_text: 1.0,
splade_vector_title: 1.0,
splade_vector_tags: 1.0,
splade_vector_description: 1.0,
bm25_vector_text: 1.0,
bm25_vector_title: 1.0,
bm25_vector_tags: 1.0,
bm25_vector_description: 1.0
}
%ShAgent.HybridSearch.Milvus.WeightRanker{
dense_vector: 0,
splade_vector_text: 1.0,
splade_vector_title: 1.0,
splade_vector_tags: 1.0,
splade_vector_description: 1.0,
bm25_vector_text: 1.0,
bm25_vector_title: 1.0,
bm25_vector_tags: 1.0,
bm25_vector_description: 1.0
}
Actual result:
%ShAgent.HybridSearch.Milvus.WeightRanker{
dense_vector: 1.0, # default value
splade_vector_text: 1.0,
splade_vector_title: 1.0,
splade_vector_tags: 1.0,
splade_vector_description: 1.0,
bm25_vector_text: 1.0,
bm25_vector_title: 1.0,
bm25_vector_tags: 1.0,
bm25_vector_description: 1.0
}
%ShAgent.HybridSearch.Milvus.WeightRanker{
dense_vector: 1.0, # default value
splade_vector_text: 1.0,
splade_vector_title: 1.0,
splade_vector_tags: 1.0,
splade_vector_description: 1.0,
bm25_vector_text: 1.0,
bm25_vector_title: 1.0,
bm25_vector_tags: 1.0,
bm25_vector_description: 1.0
}
Is this supported? Am I doing something wrong?
Solution:
works on latest ash version
Jump to solution
2 Replies
rtorresware
rtorreswareOP2mo ago
Hmm it seems that it is not supported:
ShAgent.HybridSearch.Milvus.WeightRanker |> Ash.Type.cast_input(%{"dense_vector" => 0})
{:ok,
%ShAgent.HybridSearch.Milvus.WeightRanker{
dense_vector: 1.0,
splade_vector_text: 1.0,
splade_vector_title: 1.0,
splade_vector_tags: 1.0,
splade_vector_description: 1.0,
bm25_vector_text: 1.0,
bm25_vector_title: 1.0,
bm25_vector_tags: 1.0,
bm25_vector_description: 1.0
}}
ShAgent.HybridSearch.Milvus.WeightRanker |> Ash.Type.cast_input(%{"dense_vector" => 0})
{:ok,
%ShAgent.HybridSearch.Milvus.WeightRanker{
dense_vector: 1.0,
splade_vector_text: 1.0,
splade_vector_title: 1.0,
splade_vector_tags: 1.0,
splade_vector_description: 1.0,
bm25_vector_text: 1.0,
bm25_vector_title: 1.0,
bm25_vector_tags: 1.0,
bm25_vector_description: 1.0
}}
Solution
rtorresware
rtorresware2mo ago
works on latest ash version

Did you find this page helpful?