Hi, I have the following calculation in one of my resources:
calculations do
calculate :llm_model,
:map,
expr(
cond do
role == :basic -> %{"model" => "gpt-4o-mini"}
role == :pro -> %{"model" => "o3-mini", "reasoning_effort" => "medium"}
role == :admin -> %{"model" => "o3-mini", "reasoning_effort" => "high"}
end
)
end
This compiles without any problems, and my reading of Ash.Resource — ash v3.5.4 is that any return type, including :map
, is allowed.
However, I get the following error when executing this code, where victor
is a User resource:
victor |> Ash.load!(:llm_model)
[debug] QUERY ERROR source="users" db=2.3ms queue=1.4ms idle=1593.8ms
SELECT u0."id", (CASE WHEN u0."role"::varchar::varchar = $1::varchar::varchar THEN $2 WHEN u0."role"::varchar::varchar = $3::varchar::varchar THEN $4 WHEN u0."role"::varchar::varchar = $5::varchar::varchar THEN $6 ELSE NULL END) FROM "users" AS u0 WHERE (u0."id"::uuid::uuid = $7::uuid::uuid) [:basic, %{"model" => "gpt-4o-mini"}, :pro, %{"model" => "o3-mini", "reasoning_effort" => "medium"}, :admin, %{"model" => "o3-mini", "reasoning_effort" => "high"}, "ab2ba555-671f-4d73-861d-c9171ec7ec9b"]
↳ anonymous fn/3 in AshPostgres.DataLayer.run_query/2, at: lib/data_layer.ex:785
** (Ash.Error.Unknown)
Bread Crumbs:
> Error returned from: FiveWhys.Accounts.User.read
Unknown Error
* ** (DBConnection.EncodeError) Postgrex expected a binary, got %{"model" => "gpt-4o-mini"}. Please make sure the value you are passing matches the definition in your table or in your query or convert the value accordingly.
<...>
I understand it that there is an attempt to evaluate the expression in Postgresql level, which understandably fails.
Am I expecting too much from calculated fields here? I can of course split it into two calculated fields, e.g., model
and reasoning_effort
, but I’m curious what is the idiomatic Ash solution here.