@actuate-media/plugin-ai 0.0.11 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -21
- package/dist/__tests__/content-generator.test.d.ts +2 -0
- package/dist/__tests__/content-generator.test.d.ts.map +1 -0
- package/dist/__tests__/content-generator.test.js +200 -0
- package/dist/__tests__/content-generator.test.js.map +1 -0
- package/dist/__tests__/index.test.js.map +1 -1
- package/dist/admin/AIScorePanel.d.ts +1 -1
- package/dist/admin/AIScorePanel.d.ts.map +1 -1
- package/dist/admin/AIScorePanel.js +34 -17
- package/dist/admin/AIScorePanel.js.map +1 -1
- package/dist/admin/BrandVoiceSettings.d.ts +2 -2
- package/dist/admin/BrandVoiceSettings.d.ts.map +1 -1
- package/dist/admin/BrandVoiceSettings.js +123 -34
- package/dist/admin/BrandVoiceSettings.js.map +1 -1
- package/dist/admin/ContentScoreDashboard.d.ts +1 -1
- package/dist/admin/ContentScoreDashboard.d.ts.map +1 -1
- package/dist/admin/ContentScoreDashboard.js +50 -16
- package/dist/admin/ContentScoreDashboard.js.map +1 -1
- package/dist/admin/WritingAssistantToolbar.d.ts.map +1 -1
- package/dist/admin/WritingAssistantToolbar.js +21 -21
- package/dist/admin/WritingAssistantToolbar.js.map +1 -1
- package/dist/brand/consistency-checker.d.ts +3 -3
- package/dist/brand/consistency-checker.d.ts.map +1 -1
- package/dist/brand/consistency-checker.js +7 -7
- package/dist/brand/consistency-checker.js.map +1 -1
- package/dist/brand/profile-builder.d.ts +2 -2
- package/dist/brand/profile-builder.d.ts.map +1 -1
- package/dist/brand/profile-builder.js +20 -19
- package/dist/brand/profile-builder.js.map +1 -1
- package/dist/brand/voice-profile.d.ts +4 -4
- package/dist/brand/voice-profile.d.ts.map +1 -1
- package/dist/collections.d.ts +1 -1
- package/dist/collections.d.ts.map +1 -1
- package/dist/collections.js.map +1 -1
- package/dist/fields.d.ts +1 -1
- package/dist/fields.d.ts.map +1 -1
- package/dist/fields.js.map +1 -1
- package/dist/hooks.d.ts.map +1 -1
- package/dist/hooks.js +16 -14
- package/dist/hooks.js.map +1 -1
- package/dist/index.d.ts +33 -29
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +36 -34
- package/dist/index.js.map +1 -1
- package/dist/links/smart-links.d.ts.map +1 -1
- package/dist/links/smart-links.js +2 -2
- package/dist/links/smart-links.js.map +1 -1
- package/dist/media/alt-text-generator.d.ts +2 -2
- package/dist/media/alt-text-generator.d.ts.map +1 -1
- package/dist/media/alt-text-generator.js +14 -9
- package/dist/media/alt-text-generator.js.map +1 -1
- package/dist/media/auto-tagger.d.ts +1 -1
- package/dist/media/auto-tagger.d.ts.map +1 -1
- package/dist/media/auto-tagger.js +8 -5
- package/dist/media/auto-tagger.js.map +1 -1
- package/dist/page-builder/generate.d.ts +23 -0
- package/dist/page-builder/generate.d.ts.map +1 -0
- package/dist/page-builder/generate.js +422 -0
- package/dist/page-builder/generate.js.map +1 -0
- package/dist/page-builder/index.d.ts +3 -0
- package/dist/page-builder/index.d.ts.map +1 -0
- package/dist/page-builder/index.js +2 -0
- package/dist/page-builder/index.js.map +1 -0
- package/dist/providers/anthropic.d.ts +1 -1
- package/dist/providers/anthropic.d.ts.map +1 -1
- package/dist/providers/anthropic.js +32 -32
- package/dist/providers/anthropic.js.map +1 -1
- package/dist/providers/index.d.ts +1 -1
- package/dist/providers/index.d.ts.map +1 -1
- package/dist/providers/index.js +6 -6
- package/dist/providers/index.js.map +1 -1
- package/dist/providers/openai.d.ts +1 -1
- package/dist/providers/openai.d.ts.map +1 -1
- package/dist/providers/openai.js +24 -24
- package/dist/providers/openai.js.map +1 -1
- package/dist/scoring/accessibility.d.ts +1 -1
- package/dist/scoring/accessibility.d.ts.map +1 -1
- package/dist/scoring/accessibility.js +22 -22
- package/dist/scoring/accessibility.js.map +1 -1
- package/dist/scoring/brand-alignment.d.ts +1 -1
- package/dist/scoring/brand-alignment.d.ts.map +1 -1
- package/dist/scoring/brand-alignment.js +14 -12
- package/dist/scoring/brand-alignment.js.map +1 -1
- package/dist/scoring/composite.d.ts +1 -1
- package/dist/scoring/composite.d.ts.map +1 -1
- package/dist/scoring/composite.js +5 -5
- package/dist/scoring/composite.js.map +1 -1
- package/dist/scoring/freshness.d.ts +1 -1
- package/dist/scoring/freshness.d.ts.map +1 -1
- package/dist/scoring/freshness.js +5 -7
- package/dist/scoring/freshness.js.map +1 -1
- package/dist/scoring/readability.d.ts +1 -1
- package/dist/scoring/readability.d.ts.map +1 -1
- package/dist/scoring/readability.js +8 -8
- package/dist/scoring/readability.js.map +1 -1
- package/dist/scoring/seo-score.d.ts.map +1 -1
- package/dist/scoring/seo-score.js +82 -16
- package/dist/scoring/seo-score.js.map +1 -1
- package/dist/search/clustering.d.ts +1 -1
- package/dist/search/clustering.d.ts.map +1 -1
- package/dist/search/clustering.js +7 -9
- package/dist/search/clustering.js.map +1 -1
- package/dist/search/embeddings.d.ts +1 -1
- package/dist/search/embeddings.d.ts.map +1 -1
- package/dist/search/embeddings.js +3 -3
- package/dist/search/embeddings.js.map +1 -1
- package/dist/search/semantic-search.d.ts +1 -1
- package/dist/search/semantic-search.d.ts.map +1 -1
- package/dist/search/semantic-search.js +5 -5
- package/dist/search/semantic-search.js.map +1 -1
- package/dist/translation/translator.d.ts +2 -2
- package/dist/translation/translator.d.ts.map +1 -1
- package/dist/translation/translator.js +8 -8
- package/dist/translation/translator.js.map +1 -1
- package/dist/writing/assistant.d.ts +3 -3
- package/dist/writing/assistant.d.ts.map +1 -1
- package/dist/writing/assistant.js +19 -16
- package/dist/writing/assistant.js.map +1 -1
- package/dist/writing/content-generator.d.ts +107 -0
- package/dist/writing/content-generator.d.ts.map +1 -0
- package/dist/writing/content-generator.js +273 -0
- package/dist/writing/content-generator.js.map +1 -0
- package/dist/writing/inline-suggestions.d.ts +2 -2
- package/dist/writing/inline-suggestions.d.ts.map +1 -1
- package/dist/writing/inline-suggestions.js +8 -5
- package/dist/writing/inline-suggestions.js.map +1 -1
- package/dist/writing/meta-generator.d.ts +2 -2
- package/dist/writing/meta-generator.d.ts.map +1 -1
- package/dist/writing/meta-generator.js +21 -9
- package/dist/writing/meta-generator.js.map +1 -1
- package/package.json +3 -2
|
@@ -1,36 +1,36 @@
|
|
|
1
|
-
const DEFAULT_MODEL =
|
|
2
|
-
const API_BASE =
|
|
3
|
-
const API_VERSION =
|
|
1
|
+
const DEFAULT_MODEL = 'claude-sonnet-4-20250514';
|
|
2
|
+
const API_BASE = 'https://api.anthropic.com/v1';
|
|
3
|
+
const API_VERSION = '2023-06-01';
|
|
4
4
|
/** Creates an Anthropic-backed AI provider. */
|
|
5
5
|
export function createAnthropicProvider(config) {
|
|
6
6
|
const model = config.model ?? DEFAULT_MODEL;
|
|
7
7
|
const headers = {
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
8
|
+
'x-api-key': config.apiKey,
|
|
9
|
+
'anthropic-version': API_VERSION,
|
|
10
|
+
'Content-Type': 'application/json',
|
|
11
11
|
};
|
|
12
12
|
return {
|
|
13
13
|
async generateText(prompt, options) {
|
|
14
14
|
const response = await fetch(`${API_BASE}/messages`, {
|
|
15
|
-
method:
|
|
15
|
+
method: 'POST',
|
|
16
16
|
headers,
|
|
17
17
|
body: JSON.stringify({
|
|
18
18
|
model,
|
|
19
19
|
max_tokens: options?.maxTokens ?? 1024,
|
|
20
20
|
...(options?.temperature !== undefined ? { temperature: options.temperature } : {}),
|
|
21
21
|
...(options?.systemPrompt ? { system: options.systemPrompt } : {}),
|
|
22
|
-
messages: [{ role:
|
|
22
|
+
messages: [{ role: 'user', content: prompt }],
|
|
23
23
|
}),
|
|
24
24
|
});
|
|
25
25
|
if (!response.ok) {
|
|
26
|
-
const err = await response.text().catch(() =>
|
|
26
|
+
const err = await response.text().catch(() => 'Unknown error');
|
|
27
27
|
throw new Error(`Anthropic API error (${response.status}): ${err}`);
|
|
28
28
|
}
|
|
29
|
-
const data = await response.json();
|
|
29
|
+
const data = (await response.json());
|
|
30
30
|
const text = data.content
|
|
31
|
-
?.filter((b) => b.type ===
|
|
31
|
+
?.filter((b) => b.type === 'text')
|
|
32
32
|
.map((b) => b.text)
|
|
33
|
-
.join(
|
|
33
|
+
.join('') ?? '';
|
|
34
34
|
return {
|
|
35
35
|
text,
|
|
36
36
|
usage: {
|
|
@@ -41,31 +41,31 @@ export function createAnthropicProvider(config) {
|
|
|
41
41
|
},
|
|
42
42
|
async generateEmbedding(text) {
|
|
43
43
|
if (config.openaiApiKey) {
|
|
44
|
-
const response = await fetch(
|
|
45
|
-
method:
|
|
44
|
+
const response = await fetch('https://api.openai.com/v1/embeddings', {
|
|
45
|
+
method: 'POST',
|
|
46
46
|
headers: {
|
|
47
|
-
|
|
48
|
-
|
|
47
|
+
Authorization: `Bearer ${config.openaiApiKey}`,
|
|
48
|
+
'Content-Type': 'application/json',
|
|
49
49
|
},
|
|
50
50
|
body: JSON.stringify({
|
|
51
|
-
model:
|
|
51
|
+
model: 'text-embedding-3-small',
|
|
52
52
|
input: text,
|
|
53
53
|
}),
|
|
54
54
|
});
|
|
55
55
|
if (!response.ok) {
|
|
56
|
-
const err = await response.text().catch(() =>
|
|
56
|
+
const err = await response.text().catch(() => 'Unknown error');
|
|
57
57
|
throw new Error(`OpenAI embeddings error (${response.status}): ${err}`);
|
|
58
58
|
}
|
|
59
|
-
const data = await response.json();
|
|
59
|
+
const data = (await response.json());
|
|
60
60
|
return data.data[0]?.embedding ?? [];
|
|
61
61
|
}
|
|
62
|
-
throw new Error(
|
|
63
|
-
|
|
64
|
-
|
|
62
|
+
throw new Error('Anthropic does not provide a native embeddings API. ' +
|
|
63
|
+
'Pass openaiApiKey in the Anthropic provider config to use OpenAI embeddings as a fallback, ' +
|
|
64
|
+
'or use the OpenAI provider directly for embedding tasks.');
|
|
65
65
|
},
|
|
66
66
|
async *streamText(prompt, options) {
|
|
67
67
|
const response = await fetch(`${API_BASE}/messages`, {
|
|
68
|
-
method:
|
|
68
|
+
method: 'POST',
|
|
69
69
|
headers,
|
|
70
70
|
body: JSON.stringify({
|
|
71
71
|
model,
|
|
@@ -73,37 +73,37 @@ export function createAnthropicProvider(config) {
|
|
|
73
73
|
...(options?.temperature !== undefined ? { temperature: options.temperature } : {}),
|
|
74
74
|
...(options?.systemPrompt ? { system: options.systemPrompt } : {}),
|
|
75
75
|
stream: true,
|
|
76
|
-
messages: [{ role:
|
|
76
|
+
messages: [{ role: 'user', content: prompt }],
|
|
77
77
|
}),
|
|
78
78
|
});
|
|
79
79
|
if (!response.ok) {
|
|
80
|
-
const err = await response.text().catch(() =>
|
|
80
|
+
const err = await response.text().catch(() => 'Unknown error');
|
|
81
81
|
throw new Error(`Anthropic stream error (${response.status}): ${err}`);
|
|
82
82
|
}
|
|
83
83
|
const reader = response.body?.getReader();
|
|
84
84
|
if (!reader)
|
|
85
|
-
throw new Error(
|
|
85
|
+
throw new Error('No response body for streaming');
|
|
86
86
|
const decoder = new TextDecoder();
|
|
87
|
-
let buffer =
|
|
87
|
+
let buffer = '';
|
|
88
88
|
try {
|
|
89
89
|
while (true) {
|
|
90
90
|
const { done, value } = await reader.read();
|
|
91
91
|
if (done)
|
|
92
92
|
break;
|
|
93
93
|
buffer += decoder.decode(value, { stream: true });
|
|
94
|
-
const lines = buffer.split(
|
|
95
|
-
buffer = lines.pop() ??
|
|
94
|
+
const lines = buffer.split('\n');
|
|
95
|
+
buffer = lines.pop() ?? '';
|
|
96
96
|
for (const line of lines) {
|
|
97
97
|
const trimmed = line.trim();
|
|
98
|
-
if (!trimmed.startsWith(
|
|
98
|
+
if (!trimmed.startsWith('data: '))
|
|
99
99
|
continue;
|
|
100
100
|
const payload = trimmed.slice(6);
|
|
101
101
|
try {
|
|
102
102
|
const event = JSON.parse(payload);
|
|
103
|
-
if (event.type ===
|
|
103
|
+
if (event.type === 'content_block_delta' && event.delta?.text) {
|
|
104
104
|
yield event.delta.text;
|
|
105
105
|
}
|
|
106
|
-
if (event.type ===
|
|
106
|
+
if (event.type === 'message_stop')
|
|
107
107
|
return;
|
|
108
108
|
}
|
|
109
109
|
catch { }
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"anthropic.js","sourceRoot":"","sources":["../../src/providers/anthropic.ts"],"names":[],"mappings":"AAEA,MAAM,aAAa,GAAG,0BAA0B,
|
|
1
|
+
{"version":3,"file":"anthropic.js","sourceRoot":"","sources":["../../src/providers/anthropic.ts"],"names":[],"mappings":"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"}
|
|
@@ -18,7 +18,7 @@ export interface AIProvider {
|
|
|
18
18
|
streamText(prompt: string, options?: StreamOptions): AsyncIterable<string>;
|
|
19
19
|
}
|
|
20
20
|
export interface AIProviderConfig {
|
|
21
|
-
provider:
|
|
21
|
+
provider: 'anthropic' | 'openai';
|
|
22
22
|
apiKey: string;
|
|
23
23
|
model?: string;
|
|
24
24
|
openaiApiKey?: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/providers/index.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,eAAe;IAC9B,SAAS,CAAC,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/providers/index.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,eAAe;IAC9B,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,YAAY,CAAC,EAAE,MAAM,CAAA;CACtB;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,EAAE;QAAE,YAAY,EAAE,MAAM,CAAC;QAAC,gBAAgB,EAAE,MAAM,CAAA;KAAE,CAAA;CAC1D;AAED,MAAM,WAAW,aAAc,SAAQ,eAAe;CAAG;AAEzD,MAAM,WAAW,UAAU;IACzB,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,eAAe,GAAG,OAAO,CAAC,cAAc,CAAC,CAAA;IAChF,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAAA;IAClD,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,aAAa,GAAG,aAAa,CAAC,MAAM,CAAC,CAAA;CAC3E;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,WAAW,GAAG,QAAQ,CAAA;IAChC,MAAM,EAAE,MAAM,CAAA;IACd,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,YAAY,CAAC,EAAE,MAAM,CAAA;CACtB;AAID,iEAAiE;AACjE,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,gBAAgB,GAAG,UAAU,CAarE;AAED,8DAA8D;AAC9D,wBAAgB,aAAa,CAAC,QAAQ,EAAE,UAAU,GAAG,IAAI,CAExD;AAED,kEAAkE;AAClE,wBAAgB,aAAa,IAAI,UAAU,GAAG,IAAI,CAEjD;AAED,6DAA6D;AAC7D,wBAAgB,iBAAiB,IAAI,UAAU,CAQ9C"}
|
package/dist/providers/index.js
CHANGED
|
@@ -1,16 +1,16 @@
|
|
|
1
|
-
import { createAnthropicProvider } from
|
|
2
|
-
import { createOpenAIProvider } from
|
|
1
|
+
import { createAnthropicProvider } from './anthropic.js';
|
|
2
|
+
import { createOpenAIProvider } from './openai.js';
|
|
3
3
|
let _globalProvider = null;
|
|
4
4
|
/** Creates an AI provider instance for the specified backend. */
|
|
5
5
|
export function createAIProvider(config) {
|
|
6
6
|
switch (config.provider) {
|
|
7
|
-
case
|
|
7
|
+
case 'anthropic':
|
|
8
8
|
return createAnthropicProvider({
|
|
9
9
|
apiKey: config.apiKey,
|
|
10
10
|
model: config.model,
|
|
11
11
|
openaiApiKey: config.openaiApiKey,
|
|
12
12
|
});
|
|
13
|
-
case
|
|
13
|
+
case 'openai':
|
|
14
14
|
return createOpenAIProvider({ apiKey: config.apiKey, model: config.model });
|
|
15
15
|
default:
|
|
16
16
|
throw new Error(`Unsupported AI provider: ${config.provider}`);
|
|
@@ -27,8 +27,8 @@ export function getAIProvider() {
|
|
|
27
27
|
/** Get the global AI provider or throw if not configured. */
|
|
28
28
|
export function requireAIProvider() {
|
|
29
29
|
if (!_globalProvider) {
|
|
30
|
-
throw new Error(
|
|
31
|
-
|
|
30
|
+
throw new Error('AI provider not configured. Call aiPlugin({ provider, apiKey }) ' +
|
|
31
|
+
'or setAIProvider() before using AI features.');
|
|
32
32
|
}
|
|
33
33
|
return _globalProvider;
|
|
34
34
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/providers/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,EAAE,MAAM,gBAAgB,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/providers/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,EAAE,MAAM,gBAAgB,CAAA;AACxD,OAAO,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAA;AA4BlD,IAAI,eAAe,GAAsB,IAAI,CAAA;AAE7C,iEAAiE;AACjE,MAAM,UAAU,gBAAgB,CAAC,MAAwB;IACvD,QAAQ,MAAM,CAAC,QAAQ,EAAE,CAAC;QACxB,KAAK,WAAW;YACd,OAAO,uBAAuB,CAAC;gBAC7B,MAAM,EAAE,MAAM,CAAC,MAAM;gBACrB,KAAK,EAAE,MAAM,CAAC,KAAK;gBACnB,YAAY,EAAE,MAAM,CAAC,YAAY;aAClC,CAAC,CAAA;QACJ,KAAK,QAAQ;YACX,OAAO,oBAAoB,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC,CAAA;QAC7E;YACE,MAAM,IAAI,KAAK,CAAC,4BAA4B,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAA;IAClE,CAAC;AACH,CAAC;AAED,8DAA8D;AAC9D,MAAM,UAAU,aAAa,CAAC,QAAoB;IAChD,eAAe,GAAG,QAAQ,CAAA;AAC5B,CAAC;AAED,kEAAkE;AAClE,MAAM,UAAU,aAAa;IAC3B,OAAO,eAAe,CAAA;AACxB,CAAC;AAED,6DAA6D;AAC7D,MAAM,UAAU,iBAAiB;IAC/B,IAAI,CAAC,eAAe,EAAE,CAAC;QACrB,MAAM,IAAI,KAAK,CACb,kEAAkE;YAChE,8CAA8C,CACjD,CAAA;IACH,CAAC;IACD,OAAO,eAAe,CAAA;AACxB,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"openai.d.ts","sourceRoot":"","sources":["../../src/providers/openai.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAkD,MAAM,YAAY,
|
|
1
|
+
{"version":3,"file":"openai.d.ts","sourceRoot":"","sources":["../../src/providers/openai.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAkD,MAAM,YAAY,CAAA;AAM5F,4CAA4C;AAC5C,wBAAgB,oBAAoB,CAAC,MAAM,EAAE;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,UAAU,CAyH3F"}
|
package/dist/providers/openai.js
CHANGED
|
@@ -1,35 +1,35 @@
|
|
|
1
|
-
const DEFAULT_MODEL =
|
|
2
|
-
const EMBEDDING_MODEL =
|
|
3
|
-
const API_BASE =
|
|
1
|
+
const DEFAULT_MODEL = 'gpt-4o';
|
|
2
|
+
const EMBEDDING_MODEL = 'text-embedding-3-small';
|
|
3
|
+
const API_BASE = 'https://api.openai.com/v1';
|
|
4
4
|
/** Creates an OpenAI-backed AI provider. */
|
|
5
5
|
export function createOpenAIProvider(config) {
|
|
6
6
|
const model = config.model ?? DEFAULT_MODEL;
|
|
7
7
|
const headers = {
|
|
8
|
-
|
|
9
|
-
|
|
8
|
+
Authorization: `Bearer ${config.apiKey}`,
|
|
9
|
+
'Content-Type': 'application/json',
|
|
10
10
|
};
|
|
11
11
|
return {
|
|
12
12
|
async generateText(prompt, options) {
|
|
13
13
|
const response = await fetch(`${API_BASE}/chat/completions`, {
|
|
14
|
-
method:
|
|
14
|
+
method: 'POST',
|
|
15
15
|
headers,
|
|
16
16
|
body: JSON.stringify({
|
|
17
17
|
model,
|
|
18
18
|
max_tokens: options?.maxTokens ?? 1024,
|
|
19
19
|
temperature: options?.temperature ?? 0.7,
|
|
20
20
|
messages: [
|
|
21
|
-
...(options?.systemPrompt ? [{ role:
|
|
22
|
-
{ role:
|
|
21
|
+
...(options?.systemPrompt ? [{ role: 'system', content: options.systemPrompt }] : []),
|
|
22
|
+
{ role: 'user', content: prompt },
|
|
23
23
|
],
|
|
24
24
|
}),
|
|
25
25
|
});
|
|
26
26
|
if (!response.ok) {
|
|
27
|
-
const err = await response.text().catch(() =>
|
|
27
|
+
const err = await response.text().catch(() => 'Unknown error');
|
|
28
28
|
throw new Error(`OpenAI API error (${response.status}): ${err}`);
|
|
29
29
|
}
|
|
30
|
-
const data = await response.json();
|
|
30
|
+
const data = (await response.json());
|
|
31
31
|
return {
|
|
32
|
-
text: data.choices[0]?.message?.content ??
|
|
32
|
+
text: data.choices[0]?.message?.content ?? '',
|
|
33
33
|
usage: {
|
|
34
34
|
promptTokens: data.usage?.prompt_tokens ?? 0,
|
|
35
35
|
completionTokens: data.usage?.completion_tokens ?? 0,
|
|
@@ -38,7 +38,7 @@ export function createOpenAIProvider(config) {
|
|
|
38
38
|
},
|
|
39
39
|
async generateEmbedding(text) {
|
|
40
40
|
const response = await fetch(`${API_BASE}/embeddings`, {
|
|
41
|
-
method:
|
|
41
|
+
method: 'POST',
|
|
42
42
|
headers,
|
|
43
43
|
body: JSON.stringify({
|
|
44
44
|
model: EMBEDDING_MODEL,
|
|
@@ -46,15 +46,15 @@ export function createOpenAIProvider(config) {
|
|
|
46
46
|
}),
|
|
47
47
|
});
|
|
48
48
|
if (!response.ok) {
|
|
49
|
-
const err = await response.text().catch(() =>
|
|
49
|
+
const err = await response.text().catch(() => 'Unknown error');
|
|
50
50
|
throw new Error(`OpenAI embeddings error (${response.status}): ${err}`);
|
|
51
51
|
}
|
|
52
|
-
const data = await response.json();
|
|
52
|
+
const data = (await response.json());
|
|
53
53
|
return data.data[0]?.embedding ?? [];
|
|
54
54
|
},
|
|
55
55
|
async *streamText(prompt, options) {
|
|
56
56
|
const response = await fetch(`${API_BASE}/chat/completions`, {
|
|
57
|
-
method:
|
|
57
|
+
method: 'POST',
|
|
58
58
|
headers,
|
|
59
59
|
body: JSON.stringify({
|
|
60
60
|
model,
|
|
@@ -62,34 +62,34 @@ export function createOpenAIProvider(config) {
|
|
|
62
62
|
temperature: options?.temperature ?? 0.7,
|
|
63
63
|
stream: true,
|
|
64
64
|
messages: [
|
|
65
|
-
...(options?.systemPrompt ? [{ role:
|
|
66
|
-
{ role:
|
|
65
|
+
...(options?.systemPrompt ? [{ role: 'system', content: options.systemPrompt }] : []),
|
|
66
|
+
{ role: 'user', content: prompt },
|
|
67
67
|
],
|
|
68
68
|
}),
|
|
69
69
|
});
|
|
70
70
|
if (!response.ok) {
|
|
71
|
-
const err = await response.text().catch(() =>
|
|
71
|
+
const err = await response.text().catch(() => 'Unknown error');
|
|
72
72
|
throw new Error(`OpenAI stream error (${response.status}): ${err}`);
|
|
73
73
|
}
|
|
74
74
|
const reader = response.body?.getReader();
|
|
75
75
|
if (!reader)
|
|
76
|
-
throw new Error(
|
|
76
|
+
throw new Error('No response body for streaming');
|
|
77
77
|
const decoder = new TextDecoder();
|
|
78
|
-
let buffer =
|
|
78
|
+
let buffer = '';
|
|
79
79
|
try {
|
|
80
80
|
while (true) {
|
|
81
81
|
const { done, value } = await reader.read();
|
|
82
82
|
if (done)
|
|
83
83
|
break;
|
|
84
84
|
buffer += decoder.decode(value, { stream: true });
|
|
85
|
-
const lines = buffer.split(
|
|
86
|
-
buffer = lines.pop() ??
|
|
85
|
+
const lines = buffer.split('\n');
|
|
86
|
+
buffer = lines.pop() ?? '';
|
|
87
87
|
for (const line of lines) {
|
|
88
88
|
const trimmed = line.trim();
|
|
89
|
-
if (!trimmed || !trimmed.startsWith(
|
|
89
|
+
if (!trimmed || !trimmed.startsWith('data: '))
|
|
90
90
|
continue;
|
|
91
91
|
const payload = trimmed.slice(6);
|
|
92
|
-
if (payload ===
|
|
92
|
+
if (payload === '[DONE]')
|
|
93
93
|
return;
|
|
94
94
|
try {
|
|
95
95
|
const chunk = JSON.parse(payload);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"openai.js","sourceRoot":"","sources":["../../src/providers/openai.ts"],"names":[],"mappings":"AAEA,MAAM,aAAa,GAAG,QAAQ,
|
|
1
|
+
{"version":3,"file":"openai.js","sourceRoot":"","sources":["../../src/providers/openai.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"accessibility.d.ts","sourceRoot":"","sources":["../../src/scoring/accessibility.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"accessibility.d.ts","sourceRoot":"","sources":["../../src/scoring/accessibility.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,MAAM,CAAA;IACZ,MAAM,EAAE,KAAK,CAAC;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,GAAG,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;IAC5C,QAAQ,EAAE,MAAM,EAAE,CAAA;IAClB,KAAK,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CAC7C;AAED,MAAM,WAAW,mBAAmB;IAClC,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,EAAE,KAAK,CAAC;QACZ,IAAI,EAAE,OAAO,GAAG,SAAS,GAAG,MAAM,CAAA;QAClC,IAAI,EAAE,MAAM,CAAA;QACZ,OAAO,EAAE,MAAM,CAAA;QACf,OAAO,CAAC,EAAE,MAAM,CAAA;KACjB,CAAC,CAAA;CACH;AAED,uEAAuE;AACvE,wBAAgB,2BAA2B,CAAC,OAAO,EAAE,oBAAoB,GAAG,mBAAmB,CA0F9F"}
|
|
@@ -5,18 +5,18 @@ export function calculateAccessibilityScore(content) {
|
|
|
5
5
|
for (const img of content.images) {
|
|
6
6
|
if (!img.alt || img.alt.trim().length === 0) {
|
|
7
7
|
issues.push({
|
|
8
|
-
type:
|
|
9
|
-
rule:
|
|
10
|
-
message:
|
|
8
|
+
type: 'error',
|
|
9
|
+
rule: 'img-alt',
|
|
10
|
+
message: 'Image is missing alt text',
|
|
11
11
|
element: `<img src="${img.src}">`,
|
|
12
12
|
});
|
|
13
13
|
deductions += 10;
|
|
14
14
|
}
|
|
15
15
|
else if (img.alt.length > 125) {
|
|
16
16
|
issues.push({
|
|
17
|
-
type:
|
|
18
|
-
rule:
|
|
19
|
-
message:
|
|
17
|
+
type: 'warning',
|
|
18
|
+
rule: 'img-alt-length',
|
|
19
|
+
message: 'Alt text exceeds recommended 125 characters',
|
|
20
20
|
element: `<img alt="${img.alt.slice(0, 30)}...">`,
|
|
21
21
|
});
|
|
22
22
|
deductions += 3;
|
|
@@ -25,18 +25,18 @@ export function calculateAccessibilityScore(content) {
|
|
|
25
25
|
for (const link of content.links) {
|
|
26
26
|
if (!link.text || link.text.trim().length === 0) {
|
|
27
27
|
issues.push({
|
|
28
|
-
type:
|
|
29
|
-
rule:
|
|
30
|
-
message:
|
|
28
|
+
type: 'error',
|
|
29
|
+
rule: 'link-text',
|
|
30
|
+
message: 'Link has no accessible text',
|
|
31
31
|
element: `<a href="${link.href}">`,
|
|
32
32
|
});
|
|
33
33
|
deductions += 10;
|
|
34
34
|
}
|
|
35
|
-
const genericTexts = [
|
|
35
|
+
const genericTexts = ['click here', 'read more', 'here', 'link', 'more'];
|
|
36
36
|
if (genericTexts.includes(link.text.toLowerCase().trim())) {
|
|
37
37
|
issues.push({
|
|
38
|
-
type:
|
|
39
|
-
rule:
|
|
38
|
+
type: 'warning',
|
|
39
|
+
rule: 'link-text-descriptive',
|
|
40
40
|
message: `Link text "${link.text}" is not descriptive`,
|
|
41
41
|
element: `<a href="${link.href}">${link.text}</a>`,
|
|
42
42
|
});
|
|
@@ -48,11 +48,11 @@ export function calculateAccessibilityScore(content) {
|
|
|
48
48
|
for (const heading of content.headings) {
|
|
49
49
|
const match = heading.match(headingPattern);
|
|
50
50
|
if (match) {
|
|
51
|
-
const level = parseInt(match[1] ??
|
|
51
|
+
const level = parseInt(match[1] ?? '0', 10);
|
|
52
52
|
if (level > prevLevel + 1 && prevLevel > 0) {
|
|
53
53
|
issues.push({
|
|
54
|
-
type:
|
|
55
|
-
rule:
|
|
54
|
+
type: 'warning',
|
|
55
|
+
rule: 'heading-order',
|
|
56
56
|
message: `Heading level skipped from h${prevLevel} to h${level}`,
|
|
57
57
|
element: heading,
|
|
58
58
|
});
|
|
@@ -63,21 +63,21 @@ export function calculateAccessibilityScore(content) {
|
|
|
63
63
|
}
|
|
64
64
|
if (content.headings.length === 0) {
|
|
65
65
|
issues.push({
|
|
66
|
-
type:
|
|
67
|
-
rule:
|
|
68
|
-
message:
|
|
66
|
+
type: 'info',
|
|
67
|
+
rule: 'heading-presence',
|
|
68
|
+
message: 'No headings found — headings improve navigation for screen readers',
|
|
69
69
|
});
|
|
70
70
|
deductions += 5;
|
|
71
71
|
}
|
|
72
|
-
const plainText = content.html.replace(/<[^>]*>/g,
|
|
72
|
+
const plainText = content.html.replace(/<[^>]*>/g, '');
|
|
73
73
|
const words = plainText.split(/\s+/).filter(Boolean);
|
|
74
74
|
const longWords = words.filter((w) => w.length > 14).length;
|
|
75
75
|
const longWordRatio = words.length > 0 ? longWords / words.length : 0;
|
|
76
76
|
if (longWordRatio > 0.15) {
|
|
77
77
|
issues.push({
|
|
78
|
-
type:
|
|
79
|
-
rule:
|
|
80
|
-
message:
|
|
78
|
+
type: 'info',
|
|
79
|
+
rule: 'reading-level',
|
|
80
|
+
message: 'Content may be difficult to read — high proportion of complex words',
|
|
81
81
|
});
|
|
82
82
|
deductions += 3;
|
|
83
83
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"accessibility.js","sourceRoot":"","sources":["../../src/scoring/accessibility.ts"],"names":[],"mappings":"AAiBA,uEAAuE;AACvE,MAAM,UAAU,2BAA2B,
|
|
1
|
+
{"version":3,"file":"accessibility.js","sourceRoot":"","sources":["../../src/scoring/accessibility.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"brand-alignment.d.ts","sourceRoot":"","sources":["../../src/scoring/brand-alignment.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,
|
|
1
|
+
{"version":3,"file":"brand-alignment.d.ts","sourceRoot":"","sources":["../../src/scoring/brand-alignment.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAA;AAElE,MAAM,WAAW,oBAAoB;IACnC,KAAK,EAAE,MAAM,CAAA;IACb,UAAU,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CACrE;AAED,+EAA+E;AAC/E,wBAAgB,uBAAuB,CACrC,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,iBAAiB,GACzB,oBAAoB,CA8DtB"}
|
|
@@ -9,27 +9,31 @@ export function calculateBrandAlignment(content, profile) {
|
|
|
9
9
|
const sentenceDelta = Math.abs(avgSentenceLength - targetLen);
|
|
10
10
|
const sentenceScore = Math.max(0, 100 - sentenceDelta * 5);
|
|
11
11
|
dimensions.push({
|
|
12
|
-
name:
|
|
12
|
+
name: 'Sentence length',
|
|
13
13
|
score: Math.round(sentenceScore),
|
|
14
|
-
feedback: sentenceDelta < 3
|
|
14
|
+
feedback: sentenceDelta < 3
|
|
15
|
+
? 'Sentence length matches brand style'
|
|
16
|
+
: `Average sentence length (${Math.round(avgSentenceLength)}) differs from target (${targetLen})`,
|
|
15
17
|
});
|
|
16
18
|
const preferredHits = profile.vocabulary.preferred.filter((w) => content.toLowerCase().includes(w.toLowerCase())).length;
|
|
17
19
|
const preferredRatio = profile.vocabulary.preferred.length > 0
|
|
18
20
|
? (preferredHits / profile.vocabulary.preferred.length) * 100
|
|
19
21
|
: 100;
|
|
20
22
|
dimensions.push({
|
|
21
|
-
name:
|
|
23
|
+
name: 'Preferred vocabulary',
|
|
22
24
|
score: Math.round(preferredRatio),
|
|
23
|
-
feedback: preferredRatio > 70
|
|
25
|
+
feedback: preferredRatio > 70
|
|
26
|
+
? 'Good use of brand vocabulary'
|
|
27
|
+
: 'Consider using more brand-preferred terms',
|
|
24
28
|
});
|
|
25
29
|
const avoidedHits = profile.vocabulary.avoided.filter((w) => content.toLowerCase().includes(w.toLowerCase())).length;
|
|
26
|
-
const avoidedScore = profile.vocabulary.avoided.length > 0
|
|
27
|
-
? Math.max(0, 100 - avoidedHits * 25)
|
|
28
|
-
: 100;
|
|
30
|
+
const avoidedScore = profile.vocabulary.avoided.length > 0 ? Math.max(0, 100 - avoidedHits * 25) : 100;
|
|
29
31
|
dimensions.push({
|
|
30
|
-
name:
|
|
32
|
+
name: 'Avoided vocabulary',
|
|
31
33
|
score: Math.round(avoidedScore),
|
|
32
|
-
feedback: avoidedHits === 0
|
|
34
|
+
feedback: avoidedHits === 0
|
|
35
|
+
? 'No off-brand terms detected'
|
|
36
|
+
: `Found ${avoidedHits} term(s) that should be avoided`,
|
|
33
37
|
});
|
|
34
38
|
for (const tone of profile.tone) {
|
|
35
39
|
dimensions.push({
|
|
@@ -38,9 +42,7 @@ export function calculateBrandAlignment(content, profile) {
|
|
|
38
42
|
feedback: `Tone dimension "${tone.dimension}" requires AI analysis for accurate measurement`,
|
|
39
43
|
});
|
|
40
44
|
}
|
|
41
|
-
const avgScore = dimensions.length > 0
|
|
42
|
-
? dimensions.reduce((sum, d) => sum + d.score, 0) / dimensions.length
|
|
43
|
-
: 0;
|
|
45
|
+
const avgScore = dimensions.length > 0 ? dimensions.reduce((sum, d) => sum + d.score, 0) / dimensions.length : 0;
|
|
44
46
|
return { score: Math.round(avgScore), dimensions };
|
|
45
47
|
}
|
|
46
48
|
//# sourceMappingURL=brand-alignment.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"brand-alignment.js","sourceRoot":"","sources":["../../src/scoring/brand-alignment.ts"],"names":[],"mappings":"AAOA,+EAA+E;AAC/E,MAAM,UAAU,uBAAuB,CACrC,OAAe,EACf,OAA0B;IAE1B,MAAM,UAAU,GAAuC,EAAE,
|
|
1
|
+
{"version":3,"file":"brand-alignment.js","sourceRoot":"","sources":["../../src/scoring/brand-alignment.ts"],"names":[],"mappings":"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"}
|
|
@@ -12,7 +12,7 @@ export interface CompositeScore {
|
|
|
12
12
|
weight: number;
|
|
13
13
|
weighted: number;
|
|
14
14
|
}>;
|
|
15
|
-
grade:
|
|
15
|
+
grade: 'A' | 'B' | 'C' | 'D' | 'F';
|
|
16
16
|
}
|
|
17
17
|
/** Calculates a weighted composite score from individual content quality dimensions. */
|
|
18
18
|
export declare function calculateCompositeScore(scores: ScoreInputs, weights?: Partial<Record<keyof ScoreInputs, number>>): CompositeScore;
|