Admin -0; Personnaliser -0; Texte se comportant mal

Je rencontre des problèmes similaires lorsque j’essaie de filtrer sur les invites de mon chatbot.

La partie vraiment étrange est que le comportement peut être correct sur une installation mais pas sur une autre.

Prenez le filtre très simple de chatbot.prompt sur Admin → Personnaliser → Texte :

Installation fonctionnelle :

Installation défaillante :

NoMethodError (undefined method `scan' for {:basic=>"You are a helpful assistant.", :agent=>"You are a helpful assistant. You have great tools in the form of functions that give you the power to get newer information. Only use the functions you have been provided with. The current date and time is %{current_date_time}. Only respond to the last question, using the prior information as context, if appropriate."}:Hash)
lib/i18n/i18n_interpolation_keys_finder.rb:6:in `find'
app/controllers/admin/site_texts_controller.rb:183:in `record_for'
app/controllers/admin/site_texts_controller.rb:249:in `block in find_translations'
app/controllers/admin/site_texts_controller.rb:234:in `each'
app/controllers/admin/site_texts_controller.rb:234:in `find_translations'
app/controllers/admin/site_texts_controller.rb:34:in `index'
app/controllers/application_controller.rb:422:in `block in with_resolved_locale'
app/controllers/application_controller.rb:422:in `with_resolved_locale'
lib/middleware/omniauth_bypass_middleware.rb:64:in `call'
lib/middleware/content_security_policy_middleware.rb:12:in `call'
lib/middleware/anonymous_cache.rb:389:in `call'
lib/middleware/gtm_script_nonce_injector.rb:10:in `call'
config/initializers/100-quiet_logger.rb:20:in `call'
config/initializers/100-silence_logger.rb:29:in `call'
lib/middleware/enforce_hostname.rb:24:in `call'
lib/middleware/request_tracker.rb:233:in `call'

Le fichier de locale en question est celui-ci :

Est-ce que je fais quelque chose d’illégal ?

3 « J'aime »

ok

il semble que la méthode en question attende du texte :

mais reçoit d’une manière ou d’une autre un Hash :

irb(main):001:0> item = {:basic=>"You are a helpful assistant.", :agent=>"You are a helpful assistant.  You have great tools in the form of functions that give you the power to get newer information. Only use the functions you have been provided with.  The current date and time is %{current_date_time}.  Only respond to the last question, using the prior information as context, if appropriate."}
=>
{:basic=>"You are a helpful assistant.", :agent=>"You are a helpful assistant.  You have great tools in the form of functions that give you the power to get newer information. Only use the functions you have been provided with.  The current date and time is %{current_date_time}.  Only respond to the last question, using the prior information as context, if appropriate."}
irb(main):002:0> item
=>
{:basic=>"You are a helpful assistant.",
 :agent=>
  "You are a helpful assistant.  You have great tools in the form of functions that give you the power to get newer information. Only use the functions you have been provided with.  The current date and time is %{current_date_time}.  Only respond to the last question, using the prior information as context, if appropriate."}
irb(main):003:0> item.scan
(irb):3:in `<main>': undefined method `scan' for {:basic=>"You are a helpful assistant.", :agent=>"You are a helpful assistant.  You have great tools in the form of functions that give you the power to get newer information. Only use the functions you have been provided with.  The current date and time is %{current_date_time}.  Only respond to the last question, using the prior information as context, if appropriate."}:Hash (NoMethodError)
        from /home/robert/.rbenv/versions/3.2.1/lib/ruby/gems/3.2.0/gems/irb-1.6.2/exe/irb:11:in `<top (required)>'
        from /home/robert/.rbenv/versions/3.2.1/bin/irb:25:in `load'
        from /home/robert/.rbenv/versions/3.2.1/bin/irb:25:in `<main>'
irb(main):004:0>

Ce qui provoque son arrêt… Je vais continuer mon enquête.

Il est appelé d’ici, je crois :

Je peux reproduire le problème avec :

I18nInterpolationKeysFinder.find(I18n.overrides_disabled { I18n.t("chatbot.prompt.system.", locale: :en) })

depuis la console rails.

Je pense que cette ligne est censée empêcher la méthode de recevoir un Hash, mais elle ne fonctionne pas, pourquoi ? :

1 « J'aime »

Déplacement de ceci vers Bug, car je pense que ce comportement est incorrect et, pour une raison quelconque, peu fiable.

Selon le code, si la valeur est un Hash, elle ne doit pas être envoyée à la méthode record_for (où elle provoquerait une exception car celle-ci attend du texte), mais dans certains cas, elle l’est.

Heureux d’être corrigé.

1 « J'aime »

Cela se produit lorsqu’il existe une substitution de traduction pour une clé qui était auparavant une chaîne traduisible, mais qui a été convertie en Hash ultérieurement. C’est exactement ce qui s’est produit avec chatbot.prompt.system.

Cela semble être une régression. Je suis à peu près sûr que cela fonctionnait auparavant.

Je peux facilement reproduire cela avec un fichier de locale comme celui-ci :

en:
  foo: "this is foo"

Allez dans Personnaliser –> Texte et remplacez “foo” par une valeur différente.

Ensuite, modifiez le fichier de locale pour qu’il ressemble à ceci :

en:
  foo:
    basic: "Basic Foo"
    advanced: "Advanced Foo"

Visitez à nouveau Personnaliser –> Texte et recherchez “foo”. Discourse enregistrera l’erreur suivante.

NoMethodError (undefined method `scan' for {:basic=>"Basic Foo", :advanced=>"Advanced Foo"}:Hash)
lib/i18n/i18n_interpolation_keys_finder.rb:6:in `find'
app/controllers/admin/site_texts_controller.rb:183:in `record_for'
app/controllers/admin/site_texts_controller.rb:249:in `block in find_translations'
app/controllers/admin/site_texts_controller.rb:234:in `each'
app/controllers/admin/site_texts_controller.rb:234:in `find_translations'
app/controllers/admin/site_texts_controller.rb:34:in `index'

Discourse ne devrait pas charger les substitutions de traduction s’il n’y a pas de chaîne anglaise correspondante.

4 « J'aime »

Merci @gerhard

C’est exactement ce qui s’est passé : j’ai ajouté une autre clé finale dans le même bucket.

… Et cela n’affecte pas les nouvelles installations.

Existe-t-il une solution de contournement de type rails console ?

1 « J'aime »
TranslationOverride.where(translation_key: "chatbot.prompt.system").delete_all
TranslationOverride.send(:reload_locale!)
5 « J'aime »

Parfait. Oui, j’allais essayer ça, mais pas sur :laptop:

Je suppose que je pourrais ajouter ça à une migration ?!

2 « J'aime »

Je pense que ce bug a également été résolu en même temps que celui-ci : :tada:

2 « J'aime »