🐛 fix: improve tools calling error feedback when arguments are not correctly (#3150)

* update docs

* fix: fix plugin arguments issue

* Update error.ts

* 🚨 ci: fix lint

*  test: fix test

* chore: update locale
This commit is contained in:
Arvin Xu
2024-07-06 01:21:53 +08:00
committed by GitHub
parent 7fa3b42546
commit 1fa160fa1a
25 changed files with 243 additions and 927 deletions

File diff suppressed because it is too large Load Diff

View File

@@ -67,6 +67,7 @@
"OpenAIBizError": "طلب خدمة OpenAI خاطئ، يرجى التحقق من المعلومات التالية أو إعادة المحاولة",
"PluginApiNotFound": "عذرًا، لا يوجد API للإضافة في وصف الإضافة، يرجى التحقق من تطابق طريقة الطلب الخاصة بك مع API الوصف",
"PluginApiParamsError": "عذرًا، فشلت التحقق من صحة معلمات الطلب للإضافة، يرجى التحقق من تطابق المعلمات مع معلومات الوصف",
"PluginFailToTransformArguments": "عذرًا، فشل تحويل معلمات استدعاء الإضافة، يرجى محاولة إعادة إنشاء رسالة المساعد أو تجربة نموذج AI ذو قدرات استدعاء أقوى",
"PluginGatewayError": "عذرًا، حدث خطأ في بوابة الإضافة، يرجى التحقق من تكوين بوابة الإضافة",
"PluginManifestInvalid": "عذرًا، فشلت التحقق من صحة وصف الإضافة، يرجى التحقق من تنسيق وصف الإضافة",
"PluginManifestNotFound": "عذرًا، لم يتم العثور على وصف الإضافة (manifest.json) في الخادم، يرجى التحقق من صحة عنوان ملف وصف الإضافة",

View File

@@ -67,6 +67,7 @@
"OpenAIBizError": "Грешка в услугата на OpenAI, моля проверете следната информация или опитайте отново",
"PluginApiNotFound": "Съжаляваме, API не съществува в манифеста на плъгина. Моля, проверете дали методът на вашата заявка съвпада с API на манифеста на плъгина",
"PluginApiParamsError": "Съжаляваме, проверката на входния параметър за заявката на плъгина е неуспешна. Моля, проверете дали входните параметри съвпадат с описанието на API",
"PluginFailToTransformArguments": "Съжаляваме, неуспешно преобразуване на аргументите за извикване на плъгин. Моля, опитайте отново да генерирате съобщението на помощника или опитайте с по-мощна AI модел на Tools Calling.",
"PluginGatewayError": "Съжаляваме, възникна грешка с шлюза на плъгина. Моля, проверете дали конфигурацията на шлюза на плъгина е правилна.",
"PluginManifestInvalid": "Съжаляваме, проверката на манифеста на плъгина е неуспешна. Моля, проверете дали форматът на манифеста е правилен",
"PluginManifestNotFound": "Съжаляваме, сървърът не можа да намери файла на манифеста на плъгина (manifest.json). Моля, проверете дали адресът на файла на манифеста на плъгина е правилен",

View File

@@ -67,6 +67,7 @@
"OpenAIBizError": "Fehler bei der Anforderung des OpenAI-Dienstes. Bitte überprüfen Sie die folgenden Informationen oder versuchen Sie es erneut.",
"PluginApiNotFound": "Entschuldigung, das API des Plugins im Plugin-Manifest existiert nicht. Bitte überprüfen Sie, ob Ihre Anfragemethode mit dem Plugin-Manifest-API übereinstimmt",
"PluginApiParamsError": "Entschuldigung, die Eingabeüberprüfung der Plugin-Anfrage ist fehlgeschlagen. Bitte überprüfen Sie, ob die Eingabe mit den API-Beschreibungsinformationen übereinstimmt",
"PluginFailToTransformArguments": "Es tut uns leid, die Plugin-Aufrufargumente konnten nicht transformiert werden. Bitte versuchen Sie, die Assistentennachricht erneut zu generieren, oder wechseln Sie zu einem leistungsstärkeren AI-Modell mit Tools Calling-Fähigkeiten und versuchen Sie es erneut.",
"PluginGatewayError": "Entschuldigung, es ist ein Fehler im Plugin-Gateway aufgetreten. Bitte überprüfen Sie die Plugin-Gateway-Konfiguration auf Richtigkeit",
"PluginManifestInvalid": "Entschuldigung, das Manifest des Plugins hat die Überprüfung nicht bestanden. Bitte überprüfen Sie das Format des Manifests",
"PluginManifestNotFound": "Entschuldigung, der Server konnte das Manifest (manifest.json) des Plugins nicht finden. Bitte überprüfen Sie die Adresse der Plugin-Beschreibungsdatei",

View File

@@ -67,6 +67,7 @@
"OpenAIBizError": "Error requesting OpenAI service, please troubleshoot or retry based on the following information",
"PluginApiNotFound": "Sorry, the API does not exist in the plugin's manifest. Please check if your request method matches the plugin manifest API",
"PluginApiParamsError": "Sorry, the input parameter validation for the plugin request failed. Please check if the input parameters match the API description",
"PluginFailToTransformArguments": "Sorry, the plugin failed to parse the arguments. Please try regenerating the assistant message or switch to a more powerful AI model with Tools Calling capability and try again",
"PluginGatewayError": "Sorry, there was an error with the plugin gateway. Please check if the plugin gateway configuration is correct.",
"PluginManifestInvalid": "Sorry, the plugin's manifest validation failed. Please check if the manifest format is correct",
"PluginManifestNotFound": "Sorry, the server could not find the plugin's manifest file (manifest.json). Please check if the plugin manifest file address is correct",

View File

@@ -67,6 +67,7 @@
"OpenAIBizError": "Se produjo un error al solicitar el servicio de OpenAI, por favor, revise la siguiente información o inténtelo de nuevo",
"PluginApiNotFound": "Lo sentimos, el API especificado no existe en el manifiesto del complemento. Verifique si su método de solicitud coincide con el API del manifiesto del complemento",
"PluginApiParamsError": "Lo sentimos, la validación de los parámetros de entrada de la solicitud del complemento no ha pasado. Verifique si los parámetros de entrada coinciden con la información de descripción del API",
"PluginFailToTransformArguments": "Lo siento, no se pudieron transformar los argumentos de la llamada al plugin. Por favor, intenta generar de nuevo el mensaje del asistente o prueba con un modelo de IA de Tools Calling más potente.",
"PluginGatewayError": "Lo sentimos, se ha producido un error en la puerta de enlace del complemento. Verifique si la configuración de la puerta de enlace del complemento es correcta",
"PluginManifestInvalid": "Lo sentimos, la validación del manifiesto del complemento no ha pasado. Por favor, verifique si el formato del manifiesto es correcto",
"PluginManifestNotFound": "Lo sentimos, el servidor no puede encontrar el manifiesto de descripción del complemento (manifest.json). Verifique si la dirección del archivo de descripción del complemento es correcta",

View File

@@ -67,6 +67,7 @@
"OpenAIBizError": "Erreur de service OpenAI. Veuillez vérifier les informations suivantes ou réessayer.",
"PluginApiNotFound": "Désolé, l'API spécifiée n'existe pas dans le manifeste du plugin. Veuillez vérifier que votre méthode de requête correspond à l'API du manifeste du plugin",
"PluginApiParamsError": "Désolé, la validation des paramètres d'entrée de la requête de ce plugin a échoué. Veuillez vérifier que les paramètres d'entrée correspondent aux informations de l'API",
"PluginFailToTransformArguments": "Désolé, échec de la transformation des arguments de l'appel du plugin. Veuillez essayer de régénérer le message d'assistance ou de changer de modèle d'IA avec une capacité d'appel d'outils plus puissante, puis réessayer.",
"PluginGatewayError": "Désolé, une erreur est survenue avec la passerelle du plugin. Veuillez vérifier la configuration de la passerelle du plugin.",
"PluginManifestInvalid": "Désolé, la validation du manifeste de ce plugin a échoué. Veuillez vérifier le format du manifeste",
"PluginManifestNotFound": "Désolé, le serveur n'a pas trouvé le manifeste de description de ce plugin (manifest.json). Veuillez vérifier l'adresse du fichier de description du plugin",

View File

@@ -67,6 +67,7 @@
"OpenAIBizError": "Errore di business di OpenAI. Si prega di controllare le informazioni seguenti o riprovare.",
"PluginApiNotFound": "Spiacenti, l'API specificata non esiste nel manifesto del plugin. Verifica che il metodo di richiesta corrisponda all'API del manifesto del plugin",
"PluginApiParamsError": "Spiacenti, la convalida dei parametri di input della richiesta del plugin non è riuscita. Verifica che i parametri di input corrispondano alle informazioni dell'API",
"PluginFailToTransformArguments": "Spiacenti, la trasformazione degli argomenti della chiamata al plugin non è riuscita. Si prega di provare a rigenerare il messaggio dell'assistente o riprovare dopo aver cambiato il modello AI di Tools Calling con capacità più avanzate.",
"PluginGatewayError": "Spiacenti, si è verificato un errore nel gateway del plugin. Verifica che la configurazione del gateway del plugin sia corretta",
"PluginManifestInvalid": "Spiacenti, la convalida del manifesto descrittivo del plugin non è riuscita. Verifica che il formato del manifesto descrittivo sia conforme alle specifiche",
"PluginManifestNotFound": "Spiacenti, il server non trova il manifesto descrittivo del plugin (manifest.json). Verifica che l'indirizzo del file descrittivo del plugin sia corretto",

View File

@@ -67,6 +67,7 @@
"OpenAIBizError": "リクエスト OpenAI サービスでエラーが発生しました。以下の情報を確認して再試行してください。",
"PluginApiNotFound": "申し訳ありませんが、プラグインのマニフェストに指定されたAPIが見つかりませんでした。リクエストメソッドとプラグインのマニフェストのAPIが一致しているかどうかを確認してください",
"PluginApiParamsError": "申し訳ありませんが、プラグインのリクエストパラメータの検証に失敗しました。パラメータとAPIの説明が一致しているかどうか確認してください",
"PluginFailToTransformArguments": "申し訳ありませんが、プラグインの引数変換に失敗しました。助手メッセージを再生成するか、より強力な Tools Calling 機能を持つAIモデルに切り替えて再試行してください",
"PluginGatewayError": "申し訳ありませんが、プラグインゲートウェイでエラーが発生しました。プラグインゲートウェイの設定を確認してください。",
"PluginManifestInvalid": "申し訳ありませんが、このプラグインのマニフェストの検証に失敗しました。マニフェストの形式が正しいかどうかを確認してください",
"PluginManifestNotFound": "申し訳ありませんが、サーバーでプラグインのマニフェストファイル (manifest.json) が見つかりませんでした。プラグインのマニフェストファイルのアドレスが正しいかどうかを確認してください",

View File

@@ -67,6 +67,7 @@
"OpenAIBizError": "OpenAI 서비스 요청 중 오류가 발생했습니다. 아래 정보를 확인하고 다시 시도해주세요.",
"PluginApiNotFound": "죄송합니다. 플러그인 설명서에 해당 API가 없습니다. 요청 메서드와 플러그인 설명서 API가 일치하는지 확인해주세요.",
"PluginApiParamsError": "죄송합니다. 플러그인 요청의 입력 매개변수 유효성 검사에 실패했습니다. 입력 매개변수와 API 설명 정보가 일치하는지 확인해주세요.",
"PluginFailToTransformArguments": "죄송합니다. 플러그인 호출 인수 변환에 실패했습니다. 도우미 메시지를 다시 생성하거나 더 강력한 AI 모델로 Tools Calling 능력을 변경한 후 다시 시도해주세요.",
"PluginGatewayError": "죄송합니다. 플러그인 게이트웨이에 오류가 발생했습니다. 플러그인 게이트웨이 구성을 확인해주세요.",
"PluginManifestInvalid": "죄송합니다. 해당 플러그인의 설명서 유효성 검사에 실패했습니다. 설명서 형식이 올바른지 확인해주세요.",
"PluginManifestNotFound": "죄송합니다. 서버에서 해당 플러그인의 설명서 (manifest.json)를 찾을 수 없습니다. 플러그인 설명 파일 주소가 올바른지 확인해주세요.",

View File

@@ -67,6 +67,7 @@
"OpenAIBizError": "Er is een fout opgetreden bij het aanvragen van de OpenAI-service. Controleer de volgende informatie of probeer het opnieuw.",
"PluginApiNotFound": "Sorry, de API van de plug-inbeschrijvingslijst bestaat niet. Controleer of uw verzoeksmethode overeenkomt met de plug-inbeschrijvingslijst API",
"PluginApiParamsError": "Sorry, de validatie van de invoerparameters van de plug-in is mislukt. Controleer of de invoerparameters overeenkomen met de API-beschrijving",
"PluginFailToTransformArguments": "Sorry, the plugin failed to parse the arguments. Please try regenerating the assistant message or retry with a more powerful AI model with Tools Calling capability.",
"PluginGatewayError": "Sorry, er is een fout opgetreden in de plug-in gateway. Controleer of de plug-in gatewayconfiguratie juist is",
"PluginManifestInvalid": "Sorry, de validatie van de beschrijvingslijst van de plug-in is mislukt. Controleer of het formaat van de beschrijvingslijst correct is",
"PluginManifestNotFound": "Sorry, de server kon de beschrijvingslijst (manifest.json) van de plug-in niet vinden. Controleer of het adres van de plug-inbeschrijvingsbestand juist is",

View File

@@ -67,6 +67,7 @@
"OpenAIBizError": "Wystąpił błąd usługi OpenAI, proszę sprawdzić poniższe informacje lub spróbować ponownie",
"PluginApiNotFound": "Przepraszamy, w manifestach wtyczki nie istnieje to API. Proszę sprawdź, czy metoda żądania jest zgodna z API w manifestach wtyczki",
"PluginApiParamsError": "Przepraszamy, walidacja parametrów wejściowych żądanej wtyczki nie powiodła się. Proszę sprawdź, czy parametry wejściowe są zgodne z informacjami opisującymi API",
"PluginFailToTransformArguments": "Przepraszamy, nie udało się przekształcić argumentów wywołania wtyczki. Spróbuj ponownie wygenerować wiadomość pomocnika lub zmień model AI o większej zdolności do wywoływania narzędzi i spróbuj ponownie",
"PluginGatewayError": "Przepraszamy, wystąpił błąd bramy wtyczki. Proszę sprawdź, czy konfiguracja bramy wtyczki jest poprawna",
"PluginManifestInvalid": "Przepraszamy, walidacja manifestu opisowego wtyczki nie powiodła się. Proszę sprawdź, czy format pliku opisowego wtyczki jest zgodny z normami",
"PluginManifestNotFound": "Przepraszamy, serwer nie odnalazł manifestu opisowego wtyczki (manifest.json). Proszę sprawdź, czy adres pliku opisowego wtyczki jest poprawny",

View File

@@ -67,6 +67,7 @@
"OpenAIBizError": "Erro no serviço OpenAI solicitado. Por favor, verifique as informações abaixo ou tente novamente.",
"PluginApiNotFound": "Desculpe, o API especificado não existe no manifesto do plugin. Verifique se o método de solicitação corresponde ao API do manifesto do plugin",
"PluginApiParamsError": "Desculpe, a validação dos parâmetros de entrada da solicitação do plugin falhou. Verifique se os parâmetros de entrada correspondem às informações de descrição do API",
"PluginFailToTransformArguments": "Desculpe, falha ao transformar os argumentos da chamada do plugin. Por favor, tente regerar a mensagem do assistente ou tente novamente com um modelo de IA de chamada de ferramentas mais robusto.",
"PluginGatewayError": "Desculpe, ocorreu um erro no gateway do plugin. Verifique se a configuração do gateway do plugin está correta",
"PluginManifestInvalid": "Desculpe, a validação do manifesto de descrição do plugin falhou. Verifique se o formato do manifesto de descrição está correto",
"PluginManifestNotFound": "Desculpe, o servidor não encontrou o manifesto de descrição do plugin (manifest.json). Verifique se o endereço do arquivo de descrição do plugin está correto",

View File

@@ -67,6 +67,7 @@
"OpenAIBizError": "Ошибка обслуживания OpenAI. Пожалуйста, проверьте следующую информацию или повторите попытку",
"PluginApiNotFound": "К сожалению, API не существует в манифесте плагина. Пожалуйста, проверьте, соответствует ли ваш метод запроса API манифеста плагина",
"PluginApiParamsError": "К сожалению, проверка входных параметров для запроса плагина не удалась. Пожалуйста, проверьте, соответствуют ли входные параметры описанию API",
"PluginFailToTransformArguments": "Извините, не удалось преобразовать аргументы вызова плагина. Попробуйте сгенерировать помощь заново или повторите попытку с более мощной моделью искусственного интеллекта для вызова инструментов.",
"PluginGatewayError": "Извините, возникла ошибка шлюза плагина. Пожалуйста, проверьте правильность конфигурации шлюза плагина.",
"PluginManifestInvalid": "К сожалению, проверка манифеста плагина не удалась. Пожалуйста, проверьте правильность формата манифеста",
"PluginManifestNotFound": "К сожалению, серверу не удалось найти файл манифеста плагина (manifest.json). Пожалуйста, проверьте правильность адреса файла манифеста плагина",

View File

@@ -67,6 +67,7 @@
"OpenAIBizError": "OpenAI hizmetinde bir hata oluştu, lütfen aşağıdaki bilgilere göre sorunu giderin veya tekrar deneyin",
"PluginApiNotFound": "Üzgünüm, eklentinin bildiriminde API mevcut değil. Lütfen istek yönteminizin eklenti bildirim API'sı ile eşleşip eşleşmediğini kontrol edin",
"PluginApiParamsError": "Üzgünüm, eklenti isteği için giriş parametre doğrulaması başarısız oldu. Lütfen giriş parametrelerinin API açıklamasıyla eşleşip eşleşmediğini kontrol edin",
"PluginFailToTransformArguments": "Özür dilerim, eklenti çağrı parametrelerini dönüştürme başarısız oldu, lütfen yardımcı mesajı yeniden oluşturmayı deneyin veya daha güçlü bir AI modeli olan Tools Calling'i değiştirip tekrar deneyin",
"PluginGatewayError": "Üzgünüz, eklenti ağ geçidinde bir hata oluştu, lütfen eklenti ağ geçidi yapılandırmasını kontrol edin",
"PluginManifestInvalid": "Üzgünüm, eklentinin bildirim doğrulaması başarısız oldu. Lütfen bildirim formatının doğru olup olmadığını kontrol edin",
"PluginManifestNotFound": "Üzgünüm, sunucu eklentinin bildirim dosyasını (manifest.json) bulamadı. Lütfen eklenti bildirim dosyası adresinin doğru olup olmadığını kontrol edin",

View File

@@ -67,6 +67,7 @@
"OpenAIBizError": "Yêu cầu dịch vụ OpenAI gặp sự cố, vui lòng kiểm tra thông tin dưới đây hoặc thử lại",
"PluginApiNotFound": "Xin lỗi, không có API nào trong tệp mô tả plugin, vui lòng kiểm tra phương thức yêu cầu của bạn có khớp với API mô tả plugin không",
"PluginApiParamsError": "Xin lỗi, kiểm tra tham số đầu vào yêu cầu của plugin không thông qua, vui lòng kiểm tra tham số đầu vào có khớp với thông tin mô tả API không",
"PluginFailToTransformArguments": "Xin lỗi, không thể chuyển đổi đối số của plugin, vui lòng thử tạo lại tin nhắn trợ giúp hoặc thay đổi mô hình AI có khả năng gọi Tools mạnh hơn và thử lại",
"PluginGatewayError": "Xin lỗi, cổng plugin gặp lỗi, vui lòng kiểm tra cấu hình cổng plugin có đúng không",
"PluginManifestInvalid": "Xin lỗi, kiểm tra mô tả plugin không thông qua, vui lòng kiểm tra định dạng mô tả có đúng không",
"PluginManifestNotFound": "Xin lỗi, máy chủ không tìm thấy tệp mô tả plugin (manifest.json), vui lòng kiểm tra địa chỉ tệp mô tả plugin có đúng không",

View File

@@ -65,6 +65,7 @@
"PluginServerError": "插件服务端请求返回出错,请检查根据下面的报错信息检查你的插件描述文件、插件配置或服务端实现",
"PluginGatewayError": "很抱歉,插件网关出现错误,请检查插件网关配置是否正确",
"PluginOpenApiInitError": "很抱歉OpenAPI 客户端初始化失败,请检查 OpenAPI 的配置信息是否正确",
"PluginFailToTransformArguments": "很抱歉,插件调用参数解析失败,请尝试重新生成助手消息,或更换 Tools Calling 能力更强的 AI 模型后重试",
"InvalidAccessCode": "密码不正确或为空,请输入正确的访问密码,或者添加自定义 API Key",
"InvalidClerkUser": "很抱歉,你当前尚未登录,请先登录或注册账号后继续操作",
"LocationNotSupportError": "很抱歉,你的所在地区不支持此模型服务,可能是由于区域限制或服务未开通。请确认当前地区是否支持使用此服务,或尝试使用切换到其他地区后重试。",

View File

@@ -67,6 +67,7 @@
"OpenAIBizError": "請求 OpenAI 服務出錯,請根據以下資訊排查或重試",
"PluginApiNotFound": "抱歉,外掛描述檔案中不存在該 API。請檢查您的請求方法與外掛清單 API 是否相符",
"PluginApiParamsError": "抱歉,該外掛請求的輸入參數驗證失敗。請檢查輸入參數與 API 描述資訊是否相符",
"PluginFailToTransformArguments": "很抱歉,插件無法轉換參數,請嘗試重新生成助手消息,或更換功能更強大的 AI 模型後重試",
"PluginGatewayError": "很抱歉,插件網關出現錯誤,請檢查插件網關配置是否正確",
"PluginManifestInvalid": "抱歉,外掛的描述檔案驗證失敗。請檢查描述檔案格式是否正確",
"PluginManifestNotFound": "抱歉,伺服器找不到該外掛的描述檔案 (manifest.json)。請檢查外掛描述檔案地址是否正確",

View File

@@ -106,7 +106,7 @@
"@azure/openai": "1.0.0-beta.12",
"@cfworker/json-schema": "^1.12.8",
"@clerk/localizations": "2.0.0",
"@clerk/nextjs": "5.1.6",
"@clerk/nextjs": "^5.2.2",
"@clerk/themes": "^2.1.10",
"@google/generative-ai": "^0.13.0",
"@icons-pack/react-simple-icons": "^9.5.0",

View File

@@ -5,10 +5,11 @@ export const useStyles = createStyles(({ css, token }) => ({
overflow: hidden;
display: -webkit-box;
-webkit-box-orient: vertical;
-webkit-line-clamp: 1;
font-size: 12px;
text-overflow: ellipsis;
-webkit-line-clamp: 1;
`,
container: css`
cursor: pointer;

View File

@@ -71,6 +71,9 @@ export default {
PluginGatewayError: '很抱歉,插件网关出现错误,请检查插件网关配置是否正确',
PluginOpenApiInitError: '很抱歉OpenAPI 客户端初始化失败,请检查 OpenAPI 的配置信息是否正确',
PluginFailToTransformArguments:
'很抱歉,插件调用参数解析失败,请尝试重新生成助手消息,或更换 Tools Calling 能力更强的 AI 模型后重试',
InvalidAccessCode: '密码不正确或为空,请输入正确的访问密码,或者添加自定义 API Key',
InvalidClerkUser: '很抱歉,你当前尚未登录,请先登录或注册账号后继续操作',
LocationNotSupportError:

View File

@@ -10,6 +10,7 @@ import { chatSelectors } from '@/store/chat/selectors';
import { messageMapKey } from '@/store/chat/slices/message/utils';
import { useChatStore } from '@/store/chat/store';
import { useToolStore } from '@/store/tool';
import { ChatErrorType } from '@/types/fetch';
import { ChatMessage, ChatToolPayload, MessageToolCall } from '@/types/message';
const invokeStandaloneTypePlugin = useChatStore.getState().invokeStandaloneTypePlugin;
@@ -491,12 +492,20 @@ describe('ChatPluginAction', () => {
);
// Verify that loading was toggled correctly
expect(result.current.internal_togglePluginApiCalling).toHaveBeenCalledWith(
expect(result.current.internal_togglePluginApiCalling).toHaveBeenCalledTimes(2);
expect(result.current.internal_togglePluginApiCalling).toHaveBeenNthCalledWith(
1,
true,
messageId,
expect.any(String),
);
expect(result.current.internal_togglePluginApiCalling).toHaveBeenCalledWith(false);
expect(result.current.internal_togglePluginApiCalling).toHaveBeenNthCalledWith(
2,
false,
messageId,
expect.any(String),
);
expect(useChatStore.getState().text2image).toHaveBeenCalled();
});
@@ -534,37 +543,47 @@ describe('ChatPluginAction', () => {
);
// Verify that the message content was updated with the tool response
expect(result.current.internal_togglePluginApiCalling).toHaveBeenCalledTimes(2);
expect(result.current.internal_updateMessageContent).toHaveBeenCalledWith(
messageId,
toolResponse,
);
// Verify that loading was toggled correctly
expect(result.current.internal_togglePluginApiCalling).toHaveBeenCalledWith(
expect(result.current.internal_togglePluginApiCalling).toHaveBeenNthCalledWith(
1,
true,
messageId,
expect.any(String),
);
expect(result.current.internal_togglePluginApiCalling).toHaveBeenCalledWith(false);
expect(result.current.internal_togglePluginApiCalling).toHaveBeenNthCalledWith(
2,
false,
messageId,
expect.any(String),
);
expect(useChatStore.getState().text2image).not.toHaveBeenCalled();
});
it('should handle errors when invoking a builtin tool fails', async () => {
it('should handle errors when transformApiArgumentsToAiState throw error', async () => {
const args = { key: 'value' };
const payload = {
apiName: 'builtinApi',
arguments: JSON.stringify({ key: 'value' }),
arguments: JSON.stringify(args),
} as ChatToolPayload;
const messageId = 'message-id';
const error = new Error('Builtin tool failed');
useToolStore.setState({
transformApiArgumentsToAiState: vi.fn().mockRejectedValue(error),
transformApiArgumentsToAiState: vi
.fn()
.mockRejectedValue({ error: 'transformApiArgumentsToAiState throw error' }),
});
useChatStore.setState({
internal_togglePluginApiCalling: vi.fn(),
internal_updateMessageContent: vi.fn(),
internal_updatePluginError: vi.fn(),
text2image: vi.fn(),
refreshMessages: vi.fn(),
});
@@ -575,19 +594,34 @@ describe('ChatPluginAction', () => {
await result.current.invokeBuiltinTool(messageId, payload);
});
expect(result.current.internal_updatePluginError).toHaveBeenCalledWith('message-id', {
type: 'PluginFailToTransformArguments',
body: {
message: expect.any(String),
stack: undefined,
arguments: args,
schema: undefined,
},
message: expect.any(String),
});
// Verify that loading was toggled correctly
expect(result.current.internal_togglePluginApiCalling).toHaveBeenCalledWith(
expect(result.current.internal_togglePluginApiCalling).toHaveBeenNthCalledWith(
1,
true,
messageId,
expect.any(String),
);
expect(result.current.internal_togglePluginApiCalling).toHaveBeenCalledWith(false);
expect(result.current.internal_togglePluginApiCalling).toHaveBeenNthCalledWith(
2,
false,
messageId,
expect.any(String),
);
// Verify that the message content was not updated
expect(result.current.internal_updateMessageContent).not.toHaveBeenCalled();
// Verify that messages were not refreshed
expect(result.current.refreshMessages).not.toHaveBeenCalled();
expect(useChatStore.getState().text2image).not.toHaveBeenCalled();
});
});
@@ -946,7 +980,7 @@ describe('ChatPluginAction', () => {
describe('internal_updatePluginError', () => {
it('should update plugin error and refresh messages', async () => {
const messageId = 'message-id';
const error = { message: 'Plugin error' };
const error = { message: 'Plugin error' } as any;
act(() => {
useChatStore.setState({
@@ -960,7 +994,7 @@ describe('ChatPluginAction', () => {
await result.current.internal_updatePluginError(messageId, error);
});
expect(messageService.updateMessage).toHaveBeenCalledWith(messageId, { pluginError: error });
expect(messageService.updateMessage).toHaveBeenCalledWith(messageId, { error });
expect(result.current.refreshMessages).toHaveBeenCalled();
});
});

View File

@@ -12,7 +12,9 @@ import { CreateMessageParams, messageService } from '@/services/message';
import { ChatStore } from '@/store/chat/store';
import { useToolStore } from '@/store/tool';
import { pluginSelectors } from '@/store/tool/selectors';
import { ChatMessage, ChatToolPayload, MessageToolCall } from '@/types/message';
import { builtinTools } from '@/tools';
import { ChatErrorType } from '@/types/fetch';
import { ChatMessage, ChatMessageError, ChatToolPayload, MessageToolCall } from '@/types/message';
import { merge } from '@/utils/merge';
import { safeParseJSON } from '@/utils/safeParseJSON';
import { setNamespace } from '@/utils/storeDebug';
@@ -58,7 +60,7 @@ export interface ChatPluginAction {
action?: string,
) => AbortController | undefined;
internal_transformToolCalls: (toolCalls: MessageToolCall[]) => ChatToolPayload[];
internal_updatePluginError: (id: string, error: any) => Promise<void>;
internal_updatePluginError: (id: string, error: ChatMessageError) => Promise<void>;
}
export const chatPlugin: StateCreator<
@@ -88,16 +90,36 @@ export const chatPlugin: StateCreator<
if (triggerAiMessage) await triggerAIMessage({ parentId: id });
},
invokeBuiltinTool: async (id, payload) => {
const { internal_togglePluginApiCalling, internal_updateMessageContent } = get();
const {
internal_togglePluginApiCalling,
internal_updateMessageContent,
internal_updatePluginError,
} = get();
const params = JSON.parse(payload.arguments);
internal_togglePluginApiCalling(true, id, n('invokeBuiltinTool') as string);
internal_togglePluginApiCalling(true, id, n('invokeBuiltinTool/start') as string);
let data;
try {
data = await useToolStore.getState().transformApiArgumentsToAiState(payload.apiName, params);
} catch (error) {
console.log(error);
const err = error as Error;
console.error(err);
const tool = builtinTools.find((tool) => tool.identifier === payload.identifier);
const schema = tool?.manifest?.api.find((api) => api.name === payload.apiName)?.parameters;
await internal_updatePluginError(id, {
type: ChatErrorType.PluginFailToTransformArguments,
body: {
message:
"[plugin] fail to transform plugin arguments to ai state, it may due to model's limited tools calling capacity. You can refer to https://lobehub.com/docs/usage/tools-calling for more detail.",
stack: err.stack,
arguments: params,
schema,
},
message: '',
});
}
internal_togglePluginApiCalling(false);
internal_togglePluginApiCalling(false, id, n('invokeBuiltinTool/end') as string);
if (!data) return;
@@ -435,7 +457,7 @@ export const chatPlugin: StateCreator<
const { refreshMessages } = get();
get().internal_dispatchMessage({ id, type: 'updateMessage', value: { error } });
await messageService.updateMessage(id, { pluginError: error });
await messageService.updateMessage(id, { error });
await refreshMessages();
},
});

View File

@@ -35,7 +35,6 @@ export const createBuiltinToolSlice: StateCreator<
transformApiArgumentsToAiState: async (key, params) => {
const { builtinToolLoading, toggleBuiltinToolLoading } = get();
if (builtinToolLoading[key]) return;
const { [key as keyof BuiltinToolAction]: action } = get();
@@ -44,11 +43,16 @@ export const createBuiltinToolSlice: StateCreator<
toggleBuiltinToolLoading(key, true);
// @ts-ignore
const result = await action(params);
try {
// @ts-ignore
const result = await action(params);
toggleBuiltinToolLoading(key, false);
toggleBuiltinToolLoading(key, false);
return JSON.stringify(result);
return JSON.stringify(result);
} catch (e) {
toggleBuiltinToolLoading(key, false);
throw e;
}
},
});

View File

@@ -4,13 +4,14 @@ import { ILobeAgentRuntimeErrorType } from '@/libs/agent-runtime';
export const ChatErrorType = {
// ******* 业务错误语义 ******* //
InvalidAccessCode: 'InvalidAccessCode', // 密码无效
InvalidAccessCode: 'InvalidAccessCode', // is in valid password
InvalidClerkUser: 'InvalidClerkUser', // is not Clerk User
/**
* @deprecated
*/
NoOpenAIAPIKey: 'NoOpenAIAPIKey',
OllamaServiceUnavailable: 'OllamaServiceUnavailable', // 未启动/检测到 Ollama 服务
PluginFailToTransformArguments: 'PluginFailToTransformArguments',
// ******* 客户端错误 ******* //
BadRequest: 400,
@@ -20,7 +21,7 @@ export const ChatErrorType = {
MethodNotAllowed: 405, // 不支持
TooManyRequests: 429,
// ******* 服务端错误 ******* //
// ******* 服务端错误 ******* //InvalidPluginArgumentsTransform
InternalServerError: 500,
BadGateway: 502,
ServiceUnavailable: 503,