Skip to content

Commit 2da74fa

Browse files
committed
feat(new tool): AI Prompt Splitter
Fix CorentinTh#1195
1 parent 80e46c9 commit 2da74fa

File tree

6 files changed

+95
-39
lines changed

6 files changed

+95
-39
lines changed

components.d.ts

Lines changed: 1 addition & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ declare module '@vue/runtime-core' {
1111
export interface GlobalComponents {
1212
'404.page': typeof import('./src/pages/404.page.vue')['default']
1313
About: typeof import('./src/pages/About.vue')['default']
14+
AiPromptSplitter: typeof import('./src/tools/ai-prompt-splitter/ai-prompt-splitter.vue')['default']
1415
App: typeof import('./src/App.vue')['default']
1516
'Base.layout': typeof import('./src/layouts/base.layout.vue')['default']
1617
Base64FileConverter: typeof import('./src/tools/base64-file-converter/base64-file-converter.vue')['default']
@@ -88,29 +89,17 @@ declare module '@vue/runtime-core' {
8889
HttpStatusCodes: typeof import('./src/tools/http-status-codes/http-status-codes.vue')['default']
8990
IbanValidatorAndParser: typeof import('./src/tools/iban-validator-and-parser/iban-validator-and-parser.vue')['default']
9091
'IconMdi:brushVariant': typeof import('~icons/mdi/brush-variant')['default']
91-
'IconMdi:contentCopy': typeof import('~icons/mdi/content-copy')['default']
9292
'IconMdi:kettleSteamOutline': typeof import('~icons/mdi/kettle-steam-outline')['default']
93-
IconMdiArrowDown: typeof import('~icons/mdi/arrow-down')['default']
94-
IconMdiArrowRight: typeof import('~icons/mdi/arrow-right')['default']
95-
IconMdiArrowRightBottom: typeof import('~icons/mdi/arrow-right-bottom')['default']
96-
IconMdiCamera: typeof import('~icons/mdi/camera')['default']
9793
IconMdiChevronDown: typeof import('~icons/mdi/chevron-down')['default']
9894
IconMdiChevronRight: typeof import('~icons/mdi/chevron-right')['default']
9995
IconMdiClose: typeof import('~icons/mdi/close')['default']
10096
IconMdiContentCopy: typeof import('~icons/mdi/content-copy')['default']
101-
IconMdiDeleteOutline: typeof import('~icons/mdi/delete-outline')['default']
102-
IconMdiDownload: typeof import('~icons/mdi/download')['default']
10397
IconMdiEye: typeof import('~icons/mdi/eye')['default']
10498
IconMdiEyeOff: typeof import('~icons/mdi/eye-off')['default']
10599
IconMdiHeart: typeof import('~icons/mdi/heart')['default']
106-
IconMdiPause: typeof import('~icons/mdi/pause')['default']
107-
IconMdiPlay: typeof import('~icons/mdi/play')['default']
108-
IconMdiRecord: typeof import('~icons/mdi/record')['default']
109-
IconMdiRefresh: typeof import('~icons/mdi/refresh')['default']
110100
IconMdiSearch: typeof import('~icons/mdi/search')['default']
111101
IconMdiTranslate: typeof import('~icons/mdi/translate')['default']
112102
IconMdiTriangleDown: typeof import('~icons/mdi/triangle-down')['default']
113-
IconMdiVideo: typeof import('~icons/mdi/video')['default']
114103
InputCopyable: typeof import('./src/components/InputCopyable.vue')['default']
115104
IntegerBaseConverter: typeof import('./src/tools/integer-base-converter/integer-base-converter.vue')['default']
116105
Ipv4AddressConverter: typeof import('./src/tools/ipv4-address-converter/ipv4-address-converter.vue')['default']
@@ -137,42 +126,24 @@ declare module '@vue/runtime-core' {
137126
MenuLayout: typeof import('./src/components/MenuLayout.vue')['default']
138127
MetaTagGenerator: typeof import('./src/tools/meta-tag-generator/meta-tag-generator.vue')['default']
139128
MimeTypes: typeof import('./src/tools/mime-types/mime-types.vue')['default']
140-
NAlert: typeof import('naive-ui')['NAlert']
141129
NavbarButtons: typeof import('./src/components/NavbarButtons.vue')['default']
142-
NCheckbox: typeof import('naive-ui')['NCheckbox']
143130
NCode: typeof import('naive-ui')['NCode']
144131
NCollapseTransition: typeof import('naive-ui')['NCollapseTransition']
145-
NColorPicker: typeof import('naive-ui')['NColorPicker']
146132
NConfigProvider: typeof import('naive-ui')['NConfigProvider']
147-
NDatePicker: typeof import('naive-ui')['NDatePicker']
148-
NDivider: typeof import('naive-ui')['NDivider']
149-
NDynamicInput: typeof import('naive-ui')['NDynamicInput']
150133
NEllipsis: typeof import('naive-ui')['NEllipsis']
151-
NForm: typeof import('naive-ui')['NForm']
152134
NFormItem: typeof import('naive-ui')['NFormItem']
153135
NGi: typeof import('naive-ui')['NGi']
154136
NGrid: typeof import('naive-ui')['NGrid']
155137
NH1: typeof import('naive-ui')['NH1']
156-
NH2: typeof import('naive-ui')['NH2']
157138
NH3: typeof import('naive-ui')['NH3']
158139
NIcon: typeof import('naive-ui')['NIcon']
159-
NImage: typeof import('naive-ui')['NImage']
160-
NInputGroup: typeof import('naive-ui')['NInputGroup']
161-
NInputGroupLabel: typeof import('naive-ui')['NInputGroupLabel']
162140
NInputNumber: typeof import('naive-ui')['NInputNumber']
163141
NLayout: typeof import('naive-ui')['NLayout']
164142
NLayoutSider: typeof import('naive-ui')['NLayoutSider']
165143
NMenu: typeof import('naive-ui')['NMenu']
166-
NProgress: typeof import('naive-ui')['NProgress']
167144
NScrollbar: typeof import('naive-ui')['NScrollbar']
168-
NSlider: typeof import('naive-ui')['NSlider']
169-
NStatistic: typeof import('naive-ui')['NStatistic']
170-
NSwitch: typeof import('naive-ui')['NSwitch']
171-
NTable: typeof import('naive-ui')['NTable']
172145
NTag: typeof import('naive-ui')['NTag']
173146
NumeronymGenerator: typeof import('./src/tools/numeronym-generator/numeronym-generator.vue')['default']
174-
NUpload: typeof import('naive-ui')['NUpload']
175-
NUploadDragger: typeof import('naive-ui')['NUploadDragger']
176147
OtpCodeGeneratorAndValidator: typeof import('./src/tools/otp-code-generator-and-validator/otp-code-generator-and-validator.vue')['default']
177148
PasswordStrengthAnalyser: typeof import('./src/tools/password-strength-analyser/password-strength-analyser.vue')['default']
178149
PdfSignatureChecker: typeof import('./src/tools/pdf-signature-checker/pdf-signature-checker.vue')['default']

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@
4848
"@vueuse/router": "^10.0.0",
4949
"bcryptjs": "^2.4.3",
5050
"change-case": "^4.1.2",
51+
"chatgpt-prompt-splitter": "^1.0.5",
5152
"colord": "^2.9.3",
5253
"composerize-ts": "^0.6.2",
5354
"country-code-lookup": "^0.1.0",

pnpm-lock.yaml

Lines changed: 16 additions & 8 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
<script setup lang="ts">
2+
import promptSplitter from 'chatgpt-prompt-splitter';
3+
import { useValidation } from '@/composable/validation';
4+
5+
const prompt = ref('');
6+
const splitLength = ref(1024);
7+
8+
const splittedPrompts = computed(() => {
9+
try {
10+
return promptSplitter({
11+
prompt: prompt.value,
12+
splitLength: splitLength.value,
13+
newLine: true,
14+
});
15+
}
16+
catch (e: any) {
17+
return [e.toString()];
18+
}
19+
});
20+
21+
const promptValidation = useValidation({
22+
source: prompt,
23+
rules: [
24+
{
25+
validator: v => v !== '',
26+
message: 'Prompt must not be empty',
27+
},
28+
],
29+
});
30+
</script>
31+
32+
<template>
33+
<div style="max-width: 600px;">
34+
<c-card title="Prompt and options" mb-2>
35+
<c-input-text
36+
v-model:value="prompt"
37+
label="Full Prompt"
38+
multiline
39+
placeholder="Put your full prompt here..."
40+
rows="10"
41+
:validation="promptValidation"
42+
mb-2
43+
/>
44+
<n-form-item label="Character length for each chunk">
45+
<n-input-number v-model:value="splitLength" :min="1" />
46+
</n-form-item>
47+
</c-card>
48+
49+
<c-card title="Splitted prompts">
50+
<div v-for="(splittedPrompt, index) in splittedPrompts" :key="index">
51+
<TextareaCopyable :value="splittedPrompt" />
52+
</div>
53+
</c-card>
54+
</div>
55+
</template>

src/tools/ai-prompt-splitter/index.ts

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
import { Prompt } from '@vicons/tabler';
2+
import { defineTool } from '../tool';
3+
4+
export const tool = defineTool({
5+
name: 'AI Prompt Splitter',
6+
path: '/ai-prompt-splitter',
7+
description: 'Split a long document to multiple chat (ie ChatGPT) priompts',
8+
keywords: ['ai', 'chatgpt', 'gpt', 'prompt', 'splitter'],
9+
component: () => import('./ai-prompt-splitter.vue'),
10+
icon: Prompt,
11+
createdAt: new Date('2024-07-14'),
12+
});

src/tools/index.ts

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import { tool as base64FileConverter } from './base64-file-converter';
22
import { tool as base64StringConverter } from './base64-string-converter';
33
import { tool as basicAuthGenerator } from './basic-auth-generator';
4+
import { tool as aiPromptSplitter } from './ai-prompt-splitter';
45
import { tool as pdfSignatureChecker } from './pdf-signature-checker';
56
import { tool as numeronymGenerator } from './numeronym-generator';
67
import { tool as macAddressGenerator } from './mac-address-generator';
@@ -155,7 +156,15 @@ export const toolsByCategory: ToolCategory[] = [
155156
},
156157
{
157158
name: 'Text',
158-
components: [loremIpsumGenerator, textStatistics, emojiPicker, stringObfuscator, textDiff, numeronymGenerator],
159+
components: [
160+
loremIpsumGenerator,
161+
textStatistics,
162+
emojiPicker,
163+
stringObfuscator,
164+
textDiff,
165+
numeronymGenerator,
166+
aiPromptSplitter,
167+
],
159168
},
160169
{
161170
name: 'Data',

0 commit comments

Comments
 (0)