Add usePlatform for prompts config

This commit is contained in:
Simon Prévost 2024-02-15 13:34:37 -05:00
parent edec1f74bb
commit f3954c127a
20 changed files with 98 additions and 24 deletions

View File

@ -49,6 +49,11 @@ config :accent, Accent.MachineTranslations,
"deepl" => %{"key" => get_env("DEEPL_TRANSLATIONS_KEY")}
}
config :accent, Accent.Prompts,
default_providers_config: %{
"openai" => %{"key" => get_env("OPENAI_API_KEY")}
}
config :accent, LanguageTool, languages: get_env("LANGUAGE_TOOL_LANGUAGES", :comma_separated_list)
providers = []

View File

@ -11,7 +11,8 @@ defmodule Accent.PromptConfigManager do
"config" => %{
"key" => params[:config_key]
},
"provider" => params[:provider]
"provider" => params[:provider],
"use_platform" => params[:use_platform]
}
}

View File

@ -42,6 +42,7 @@ defmodule Accent.GraphQL.Mutations.Prompt do
arg(:project_id, non_null(:id))
arg(:provider, non_null(:string))
arg(:config_key, :string)
arg(:use_platform, non_null(:boolean))
resolve(project_authorize(:save_project_prompt_config, &Resolver.save_config/3, :project_id))
end

View File

@ -29,6 +29,8 @@ defmodule Accent.GraphQL.Types.Project do
object :prompt_config do
field(:provider, non_null(:string))
field(:use_platform, non_null(:boolean))
field(:use_config_key, non_null(:boolean))
end
object :project do
@ -50,7 +52,7 @@ defmodule Accent.GraphQL.Types.Project do
%{
provider: project.machine_translations_config["provider"],
enabled_actions: project.machine_translations_config["enabled_actions"] || [],
use_platform: project.machine_translations_config["use_platform"],
use_platform: project.machine_translations_config["use_platform"] || false,
use_config_key: not is_nil(project.machine_translations_config["config"]["key"])
}}
else
@ -64,7 +66,9 @@ defmodule Accent.GraphQL.Types.Project do
if project.prompt_config do
{:ok,
%{
provider: project.prompt_config["provider"]
provider: project.prompt_config["provider"],
use_platform: project.prompt_config["use_platform"] || false,
use_config_key: not is_nil(project.prompt_config["config"]["key"])
}}
else
{:ok, nil}

View File

@ -87,15 +87,15 @@ defmodule Accent.MachineTranslations do
defp provider_from_config(nil), do: %Provider.NotImplemented{}
defp provider_from_config(machine_translations_config) do
defp provider_from_config(config) do
struct_module =
case machine_translations_config["provider"] do
case config["provider"] do
"google_translate" -> Provider.GoogleTranslate
"deepl" -> Provider.Deepl
_ -> Provider.NotImplemented
end
struct!(struct_module, config: fetch_config(machine_translations_config))
struct!(struct_module, config: fetch_config(config))
end
defp fetch_config(%{"provider" => provider, "use_platform" => true}) do

View File

@ -17,6 +17,8 @@ defmodule Accent.Prompts do
Provider.enabled?(provider)
end
defp provider_from_config(nil), do: %Provider.NotImplemented{}
defp provider_from_config(config) do
struct_module =
case config["provider"] do
@ -24,6 +26,12 @@ defmodule Accent.Prompts do
_ -> Provider.NotImplemented
end
struct!(struct_module, config: config)
struct!(struct_module, config: fetch_config(config))
end
defp fetch_config(%{"provider" => provider, "use_platform" => true}) do
Map.get(Application.get_env(:accent, __MODULE__)[:default_providers_config], provider)
end
defp fetch_config(%{"config" => config}), do: config
end

View File

@ -9,7 +9,7 @@ defmodule Accent.Prompts.Provider.OpenAI do
def enabled?(_), do: true
def completions(provider, prompt, user_input) do
config = provider.config["config"]
config = provider.config
params = %{
messages: [

View File

@ -13,9 +13,11 @@ interface Args {
onSave: ({
provider,
configKey,
usePlatform
}: {
provider: string;
configKey: string | null;
usePlatform: boolean;
}) => Promise<any>;
}
@ -26,7 +28,7 @@ const LOGOS = {
openai: 'assets/prompts_providers/openai.svg',
};
export default class ProjectSettingsMachineTranslations extends Component<Args> {
export default class ProjectSettingsPromptsConfig extends Component<Args> {
@service('global-state')
globalState: GlobalState;
@ -37,10 +39,10 @@ export default class ProjectSettingsMachineTranslations extends Component<Args>
intl: IntlService;
@tracked
provider = this.args.project.promptsConfig?.provider || 'openai';
provider = this.args.project.promptConfig?.provider || 'openai';
@tracked
usePlatform = this.args.project.promptsConfig?.usePlatform || false;
usePlatform = this.args.project.promptConfig?.usePlatform || false;
@tracked
configKey: any;
@ -86,10 +88,19 @@ export default class ProjectSettingsMachineTranslations extends Component<Args>
this.configKey = (event.target as HTMLInputElement).value;
}
@action
onUsePlatformChange(event: InputEvent) {
const checked = (event.target as HTMLInputElement).checked;
if (checked) this.configKey = null;
this.usePlatform = checked;
}
submit = dropTask(async () => {
await this.args.onSave({
provider: this.provider,
configKey: this.configKey,
usePlatform: this.usePlatform
});
});

View File

@ -414,6 +414,7 @@
"title": "AI Assistant",
"help": "Instructions will be available on all string inputs to help you improve your content. The clearer the instructions you give to the assistant, to better the output will be.",
"new_button": "Add a new instruction",
"use_platform_label": "Use the platform config if available",
"config_key_help_present": "Config key has been set, but the value will never be exposed via the API.",
"config_key_help_not_present": "Once saved, the config key will never be shown.",
"delete_confirm": "Are you sure you want to delete this instruction?"

View File

@ -403,6 +403,7 @@
"prompts": {
"title": "Assistant IA",
"help": "Des instructions seront disponibles sur chaque entrée de chaîne pour vous aider à améliorer votre contenu. Plus les instructions que vous donnez à lassistant sont claires, meilleur sera le résultat.",
"use_platform_label": "Utilisez la configuration de la plate-forme si disponible",
"new_button": "Ajouter une nouvelle instruction",
"config_key_help_present": "La clé de configuration a été définie, mais la valeur ne sera jamais exposée via lAPI.",
"config_key_help_not_present": "Une fois enregistrée, la clé de configuration ne sera jamais affichée.",

View File

@ -7,8 +7,8 @@ export default gql`
id
machineTranslationsConfig {
provider
usePlatform
enabledActions
usePlatform
useConfigKey
}
}

View File

@ -31,6 +31,8 @@ export default gql`
promptConfig {
provider
usePlatform
useConfigKey
}
}
}

View File

@ -4,6 +4,7 @@ export interface SaveProjectPromptConfigVariables {
projectId: string;
provider: string;
configKey: string;
usePlatform: boolean;
}
export interface SaveProjectPromptConfigResponse {
@ -18,11 +19,13 @@ export default gql`
mutation ProjectPromptConfigSave(
$provider: String!
$configKey: String
$usePlatform: Boolean!
$projectId: ID!
) {
saveProjectPromptConfig(
provider: $provider
configKey: $configKey
usePlatform: $usePlatform
projectId: $projectId
) {
project {

View File

@ -10,7 +10,7 @@
display: none;
padding: 2px 6px;
border-radius: var(--border-radius);
margin: 0 15px 10px;
margin: 0 5px 5px;
background: var(--background-light);
}

View File

@ -12,6 +12,10 @@
}
.revert-button {
position: absolute;
right: 8px;
top: -30px;
:global(.label) {
padding-left: 3px;
padding-right: 3px;
@ -27,6 +31,11 @@
flex-direction: column;
&[data-dir='rtl'] {
.revert-button {
right: auto;
left: 8px;
}
.item-details__column {
align-items: flex-end;
}

View File

@ -24,13 +24,12 @@
}
.prompt-button-quick-access[data-rtl] {
left: 36px;
right: auto;
transform: translateX(36px);
}
.prompt-button-quick-access {
opacity: 1;
right: 36px;
transform: translateX(-36px);
padding: 0 10px;
pointer-events: all;
}

View File

@ -65,6 +65,22 @@
font-size: 12px;
}
.options {
margin: 10px 0 0;
display: flex;
flex-direction: column;
gap: 5px;
}
.option-checkbox {
display: flex;
align-items: center;
width: 100%;
gap: 8px;
font-size: 12px;
font-weight: bold;
}
.actions {
display: flex;
justify-content: flex-end;

View File

@ -77,4 +77,4 @@
</div>
</div>
</div>
</li>
</li>

View File

@ -28,4 +28,4 @@
</LinkTo>
</div>
{{/if}}
</div>
</div>

View File

@ -15,15 +15,28 @@
{{/if}}
</div>
<p local-class='config-key-help'>
{{#if @project.promptConfig}}
{{t 'components.project_settings.prompts.config_key_help_present'}}
<div local-class='options'>
<label local-class='option-checkbox'>
<input value={{this.usePlatform}} type='checkbox' checked={{this.usePlatform}} {{on 'change' (fn this.onUsePlatformChange)}} />
{{t 'components.project_settings.prompts.use_platform_label'}}
</label>
</div>
{{#unless this.usePlatform}}
<p local-class='config-key-help'>
{{#if @project.promptConfig.useConfigKey}}
{{t 'components.project_settings.prompts.config_key_help_present'}}
{{else}}
{{t 'components.project_settings.prompts.config_key_help_not_present'}}
{{/if}}
</p>
</p>
<textarea placeholder={{this.configKeyPlaceholder}} local-class='textInput' rows='1' {{on 'change' (fn this.onConfigKeyChange)}}>{{this.configKey}}</textarea>
<textarea
placeholder={{this.configKeyPlaceholder}}
local-class='textInput'
{{on 'change' (fn this.onConfigKeyChange)}}
>{{this.configKey}}</textarea>
{{/unless}}
<div local-class='actions'>
{{#if @project.promptConfig}}
@ -36,4 +49,4 @@
{{t 'components.project_settings.integrations.save'}}
</AsyncButton>
</div>
</div>
</div>