diff --git a/backend/windmill-api/src/openai.rs b/backend/windmill-api/src/openai.rs index c8409f2f03..2c920b528f 100644 --- a/backend/windmill-api/src/openai.rs +++ b/backend/windmill-api/src/openai.rs @@ -9,6 +9,7 @@ use axum::{ Router, }; use magic_crypt::MagicCryptTrait; +use serde_json::json; use windmill_audit::{audit_log, ActionKind}; use windmill_common::error::{to_anyhow, Error}; @@ -26,6 +27,17 @@ struct OpenaiResource { organization_id: Option, } +fn create_openai_json_error(msg: String) -> Error { + Error::OpenAIError( + serde_json::to_string(&json!({ + "error": { + "message": msg + } + })) + .unwrap(), + ) +} + struct Variable { value: String, is_secret: bool, @@ -72,7 +84,7 @@ async fn proxy( tx.commit().await?; if openai_resource_path.is_none() { - return Err(Error::InternalErr( + return Err(create_openai_json_error( "OpenAI resource not configured".to_string(), )); } @@ -92,7 +104,7 @@ async fn proxy( tx.commit().await?; if resource.is_none() { - return Err(Error::InternalErr( + return Err(create_openai_json_error( "OpenAI resource missing value".to_string(), )); } diff --git a/backend/windmill-common/src/error.rs b/backend/windmill-common/src/error.rs index 3f1c8ef56a..7bfc2c8177 100644 --- a/backend/windmill-common/src/error.rs +++ b/backend/windmill-common/src/error.rs @@ -64,6 +64,8 @@ pub enum Error { JsonErr(serde_json::Value), #[error("Custom Status Code: {0:#?}")] CustomStatusCode(StatusCode, serde_json::Value), + #[error("{0}")] + OpenAIError(String), } impl Error { @@ -87,7 +89,9 @@ impl IntoResponse for Error { Self::NotAuthorized(_) => axum::http::StatusCode::UNAUTHORIZED, Self::RequireAdmin(_) => axum::http::StatusCode::FORBIDDEN, Self::CustomStatusCode(code, _) => code, - Self::SqlErr(_) | Self::BadRequest(_) => axum::http::StatusCode::BAD_REQUEST, + Self::SqlErr(_) | Self::BadRequest(_) | Self::OpenAIError(_) => { + axum::http::StatusCode::BAD_REQUEST + } _ => axum::http::StatusCode::INTERNAL_SERVER_ERROR, }; tracing::error!(error = e.to_string()); diff --git a/frontend/src/lib/components/codeGen/ScriptFix.svelte b/frontend/src/lib/components/codeGen/ScriptFix.svelte index 9c500dc864..318f6f6e49 100644 --- a/frontend/src/lib/components/codeGen/ScriptFix.svelte +++ b/frontend/src/lib/components/codeGen/ScriptFix.svelte @@ -10,6 +10,7 @@ import type DiffEditor from '../DiffEditor.svelte' import { scriptLangToEditorLang } from '$lib/scripts' import Popover from '../Popover.svelte' + import Popup from '../common/popup/Popup.svelte' // props export let lang: SupportedLanguage @@ -27,12 +28,6 @@ return } try { - // close popup ^^ - const elem = document.activeElement as HTMLElement - if (elem.blur) { - elem.blur() - } - genLoading = true const result = await fixScript({ language: lang, @@ -43,8 +38,12 @@ generatedCode = result.code explanation = result.explanation } catch (err) { - sendUserToast('Failed to generate code', true) - console.error(err) + if (err?.message) { + sendUserToast('Failed to generate code: ' + err.message, true) + } else { + sendUserToast('Failed to generate code', true) + console.error(err) + } } finally { genLoading = false } @@ -80,42 +79,42 @@ $: !generatedCode && hideDiff() -{#if error} - {#if existsOpenaiResourcePath && SUPPORTED_LANGUAGES.has(lang)} -
- {#if generatedCode} -
- - {#if explanation} - - {explanation} - - {/if} -
- {:else} +{#if error && SUPPORTED_LANGUAGES.has(lang)} +
+ {#if generatedCode} +
+ {#if explanation} + + {explanation} + + {/if} +
+ {:else} + {#if $existsOpenaiResourcePath} + - {/if}
- {/if} + {:else} + + + + +
+

Enable Windmill AI in the workspace settings.

+
+
+ {/if} + {/if}
{/if} diff --git a/frontend/src/lib/components/codeGen/ScriptGen.svelte b/frontend/src/lib/components/codeGen/ScriptGen.svelte index 59f2e0aedb..8a00b95b2e 100644 --- a/frontend/src/lib/components/codeGen/ScriptGen.svelte +++ b/frontend/src/lib/components/codeGen/ScriptGen.svelte @@ -27,7 +27,6 @@ // state let funcDesc: string = '' let genLoading: boolean = false - let button: HTMLButtonElement | undefined let input: HTMLInputElement | undefined let generatedCode = '' let selection: Selection | undefined @@ -59,8 +58,12 @@ } funcDesc = '' } catch (err) { - sendUserToast('Failed to generate code', true) - console.error(err) + if (err?.message) { + sendUserToast('Failed to generate code: ' + err.message, true) + } else { + sendUserToast('Failed to generate code', true) + console.error(err) + } } finally { genLoading = false } @@ -162,7 +165,6 @@ {#if inlineScript}