diff --git a/test/agent/src/utils.h b/test/agent/src/utils.h
index 9b00d06eb41aa4cf602a299c1f0e2b1b2061bd4f..f74c12ff8134a1d03999901e1b9f1282474f989a 100644
--- a/test/agent/src/utils.h
+++ b/test/agent/src/utils.h
@@ -104,28 +104,50 @@ apply_to_guile(SCM body_proc, Args... args)
 struct from_guile
 {
     SCM value;
-
-    from_guile(SCM val)
-        : value(val)
+    const char* expr;
+    const char* file;
+    int line;
+
+    from_guile(SCM val, const char* expr_, const char* file_, int line_)
+        : value(val),
+          expr(expr_),
+          file(file_),
+          line(line_)
     {}
 
+    template<typename Pred>
+    void ensure_type(const char* msg, Pred&& pred)
+    {
+        if (!pred(value)) {
+            jami::Logger::log(LOG_ERR,
+                              file,
+                              line,
+                              false,
+                              "[GUILE] For expression `%s`: "
+                              "Scheme value must be of type %s\n",
+                              expr,
+                              msg);
+            exit(EXIT_FAILURE);
+        }
+    }
+
     operator bool()
     {
-        AGENT_ASSERT(scm_is_bool(value), "Scheme value must be of type bool");
+        ensure_type("bool", scm_is_bool);
 
         return scm_to_bool(value);
     }
 
     operator int()
     {
-        AGENT_ASSERT(scm_is_integer(value), "Scheme value must be of type integer");
+        ensure_type("integer", scm_is_integer);
 
         return scm_to_int(value);
     }
 
     operator std::string()
     {
-        AGENT_ASSERT(scm_is_string(value), "Scheme value must be of type string");
+        ensure_type("string", scm_is_string);
 
         char* str_raw = scm_to_locale_string(value);
         std::string ret(str_raw);
@@ -137,7 +159,7 @@ struct from_guile
     template<typename T>
     operator std::vector<T>()
     {
-        AGENT_ASSERT(scm_is_simple_vector(value), "Scheme value must be a simple vector");
+        ensure_type("simple vector", scm_is_simple_vector);
 
         std::vector<T> ret;
 
@@ -146,7 +168,7 @@ struct from_guile
         for (size_t i = 0; i < SCM_SIMPLE_VECTOR_LENGTH(value); ++i) {
             SCM val = SCM_SIMPLE_VECTOR_REF(value, i);
 
-            ret.emplace_back(from_guile(val));
+            ret.emplace_back(from_guile(val, expr, file, line));
         }
 
         return ret;
@@ -155,15 +177,15 @@ struct from_guile
     template<typename K, typename V>
     operator std::map<K, V>()
     {
-        AGENT_ASSERT(scm_is_true(scm_list_p(value)), "Scheme value mut be a list");
+        ensure_type("list", [](SCM v){ return scm_is_true(scm_list_p(v)); });
 
         std::map<K, V> ret;
 
         while (not scm_is_null(value)) {
             SCM pair = scm_car(value);
 
-            K key = from_guile(scm_car(pair));
-            V val = from_guile(scm_cdr(pair));
+            K key = from_guile(scm_car(pair), expr, file, line);
+            V val = from_guile(scm_cdr(pair), expr, file, line);
 
             ret[key] = val;
 
@@ -173,3 +195,5 @@ struct from_guile
         return ret;
     }
 };
+
+#define from_guile(EXPR) from_guile(EXPR, #EXPR, __FILE__, __LINE__)