@executioncontrolprotocol/chrome-ai 0.10.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/dist/format-model-context.d.ts +11 -0
- package/dist/format-model-context.d.ts.map +1 -0
- package/dist/format-model-context.js +30 -0
- package/dist/format-model-context.js.map +1 -0
- package/dist/index.d.ts +8 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +72 -0
- package/dist/index.js.map +1 -0
- package/dist/model-install.d.ts +37 -0
- package/dist/model-install.d.ts.map +1 -0
- package/dist/model-install.js +125 -0
- package/dist/model-install.js.map +1 -0
- package/dist/prompt-session.d.ts +44 -0
- package/dist/prompt-session.d.ts.map +1 -0
- package/dist/prompt-session.js +32 -0
- package/dist/prompt-session.js.map +1 -0
- package/package.json +33 -0
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Format resolved model `context` input for Chrome LanguageModel prompt() text.
|
|
3
|
+
* @category Extensions
|
|
4
|
+
*/
|
|
5
|
+
export declare function formatModelContextForPrompt(context: unknown): string;
|
|
6
|
+
/**
|
|
7
|
+
* Append optional context after the user prompt for Chrome single-string prompt() calls.
|
|
8
|
+
* @category Extensions
|
|
9
|
+
*/
|
|
10
|
+
export declare function buildChromePromptWithContext(prompt: string, context?: unknown): string;
|
|
11
|
+
//# sourceMappingURL=format-model-context.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"format-model-context.d.ts","sourceRoot":"","sources":["../src/format-model-context.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,wBAAgB,2BAA2B,CAAC,OAAO,EAAE,OAAO,GAAG,MAAM,CAepE;AAED;;;GAGG;AACH,wBAAgB,4BAA4B,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,GAAG,MAAM,CAMtF"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Format resolved model `context` input for Chrome LanguageModel prompt() text.
|
|
3
|
+
* @category Extensions
|
|
4
|
+
*/
|
|
5
|
+
export function formatModelContextForPrompt(context) {
|
|
6
|
+
if (context === undefined || context === null) {
|
|
7
|
+
return "";
|
|
8
|
+
}
|
|
9
|
+
if (typeof context === "string") {
|
|
10
|
+
return context;
|
|
11
|
+
}
|
|
12
|
+
if (typeof context === "object" &&
|
|
13
|
+
"text" in context &&
|
|
14
|
+
typeof context.text === "string") {
|
|
15
|
+
return context.text;
|
|
16
|
+
}
|
|
17
|
+
return JSON.stringify(context);
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Append optional context after the user prompt for Chrome single-string prompt() calls.
|
|
21
|
+
* @category Extensions
|
|
22
|
+
*/
|
|
23
|
+
export function buildChromePromptWithContext(prompt, context) {
|
|
24
|
+
const ctxText = formatModelContextForPrompt(context);
|
|
25
|
+
if (!ctxText.trim()) {
|
|
26
|
+
return prompt;
|
|
27
|
+
}
|
|
28
|
+
return `${prompt.trimEnd()}\n\n${ctxText}`;
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=format-model-context.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"format-model-context.js","sourceRoot":"","sources":["../src/format-model-context.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,UAAU,2BAA2B,CAAC,OAAgB;IAC1D,IAAI,OAAO,KAAK,SAAS,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;QAC9C,OAAO,EAAE,CAAA;IACX,CAAC;IACD,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE,CAAC;QAChC,OAAO,OAAO,CAAA;IAChB,CAAC;IACD,IACE,OAAO,OAAO,KAAK,QAAQ;QAC3B,MAAM,IAAI,OAAO;QACjB,OAAQ,OAA6B,CAAC,IAAI,KAAK,QAAQ,EACvD,CAAC;QACD,OAAQ,OAA4B,CAAC,IAAI,CAAA;IAC3C,CAAC;IACD,OAAO,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAA;AAChC,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,4BAA4B,CAAC,MAAc,EAAE,OAAiB;IAC5E,MAAM,OAAO,GAAG,2BAA2B,CAAC,OAAO,CAAC,CAAA;IACpD,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC;QACpB,OAAO,MAAM,CAAA;IACf,CAAC;IACD,OAAO,GAAG,MAAM,CAAC,OAAO,EAAE,OAAO,OAAO,EAAE,CAAA;AAC5C,CAAC"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { type Registry } from "@executioncontrolprotocol/core";
|
|
2
|
+
/** Chrome built-in AI provider. @category Extensions */
|
|
3
|
+
export declare const chromeAiExtension: import("@executioncontrolprotocol/core").ExtensionDefinition;
|
|
4
|
+
export type { ChromeAvailabilityStatus, ChromeModelInstallPhase, ChromeModelInstallState } from "./model-install.js";
|
|
5
|
+
export { assertModelReady, getModelInstallState, readAvailability, resetModelInstallState, startModelDownload, } from "./model-install.js";
|
|
6
|
+
/** Register Chrome AI extension. @category Extensions */
|
|
7
|
+
export declare function registerChromeAiExtension(registry?: Registry): Promise<void>;
|
|
8
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAML,KAAK,QAAQ,EACd,MAAM,gCAAgC,CAAA;AAsDvC,wDAAwD;AACxD,eAAO,MAAM,iBAAiB,8DAmCpB,CAAA;AAIV,YAAY,EAAE,wBAAwB,EAAE,uBAAuB,EAAE,uBAAuB,EAAE,MAAM,oBAAoB,CAAA;AACpH,OAAO,EACL,gBAAgB,EAChB,oBAAoB,EACpB,gBAAgB,EAChB,sBAAsB,EACtB,kBAAkB,GACnB,MAAM,oBAAoB,CAAA;AAE3B,yDAAyD;AACzD,wBAAsB,yBAAyB,CAAC,QAAQ,GAAE,QAAyB,GAAG,OAAO,CAAC,IAAI,CAAC,CAIlG"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import { catalogExtension, capabilityFor, defineExtension, globalRegistry, } from "@executioncontrolprotocol/core";
|
|
2
|
+
import { modelGenerateInputSchema, modelGenerateOutputSchema, } from "@executioncontrolprotocol/types";
|
|
3
|
+
import { z } from "zod";
|
|
4
|
+
import { assertModelReady, getModelInstallState, readAvailability, startModelDownload, } from "./model-install.js";
|
|
5
|
+
import { createChromeLanguageModelSession, normalizePromptResponse, } from "./prompt-session.js";
|
|
6
|
+
import { buildChromePromptWithContext } from "./format-model-context.js";
|
|
7
|
+
function chromeAi() {
|
|
8
|
+
return globalThis.LanguageModel;
|
|
9
|
+
}
|
|
10
|
+
async function runChromePrompt(input, ctx) {
|
|
11
|
+
await assertModelReady();
|
|
12
|
+
const model = chromeAi();
|
|
13
|
+
if (!model?.create) {
|
|
14
|
+
throw new Error("Chrome LanguageModel API is not available");
|
|
15
|
+
}
|
|
16
|
+
ctx.usage.increment({ modelCalls: 1 });
|
|
17
|
+
const session = await createChromeLanguageModelSession(model, input.system);
|
|
18
|
+
const effectivePrompt = buildChromePromptWithContext(input.prompt, input.context);
|
|
19
|
+
const response = await session.prompt(effectivePrompt);
|
|
20
|
+
return { text: normalizePromptResponse(response) };
|
|
21
|
+
}
|
|
22
|
+
const InstallStateSchema = z.object({
|
|
23
|
+
phase: z.enum(["idle", "checking", "downloading", "loading", "ready", "error"]),
|
|
24
|
+
status: z
|
|
25
|
+
.enum(["unsupported", "unavailable", "downloadable", "downloading", "available"])
|
|
26
|
+
.optional(),
|
|
27
|
+
loaded: z.number().optional(),
|
|
28
|
+
total: z.number().optional(),
|
|
29
|
+
error: z.string().optional(),
|
|
30
|
+
});
|
|
31
|
+
/** Chrome built-in AI provider. @category Extensions */
|
|
32
|
+
export const chromeAiExtension = defineExtension("@executioncontrolprotocol", "chrome-ai")
|
|
33
|
+
.withSupportedRuntimes(["@executioncontrolprotocol/browser"])
|
|
34
|
+
.withCapabilities([
|
|
35
|
+
capabilityFor("@executioncontrolprotocol/chrome-ai", "checkAvailability")
|
|
36
|
+
.withInput(z.object({}))
|
|
37
|
+
.withOutput(z.object({
|
|
38
|
+
available: z.boolean(),
|
|
39
|
+
supported: z.boolean(),
|
|
40
|
+
status: z.string().optional(),
|
|
41
|
+
}))
|
|
42
|
+
.withHandler(async () => {
|
|
43
|
+
const result = await readAvailability();
|
|
44
|
+
return {
|
|
45
|
+
available: result.available,
|
|
46
|
+
supported: result.supported,
|
|
47
|
+
status: result.status,
|
|
48
|
+
};
|
|
49
|
+
}),
|
|
50
|
+
capabilityFor("@executioncontrolprotocol/chrome-ai", "startModelDownload")
|
|
51
|
+
.withInput(z.object({}))
|
|
52
|
+
.withOutput(z.object({ started: z.boolean() }))
|
|
53
|
+
.withHandler(async () => startModelDownload()),
|
|
54
|
+
capabilityFor("@executioncontrolprotocol/chrome-ai", "getModelInstallState")
|
|
55
|
+
.withInput(z.object({}))
|
|
56
|
+
.withOutput(InstallStateSchema)
|
|
57
|
+
.withHandler(async () => getModelInstallState()),
|
|
58
|
+
capabilityFor("@executioncontrolprotocol/chrome-ai", "generate")
|
|
59
|
+
.withInput(modelGenerateInputSchema)
|
|
60
|
+
.withOutput(modelGenerateOutputSchema)
|
|
61
|
+
.withHandler(async (raw, ctx) => runChromePrompt(modelGenerateInputSchema.parse(raw), ctx)),
|
|
62
|
+
])
|
|
63
|
+
.build();
|
|
64
|
+
catalogExtension(chromeAiExtension);
|
|
65
|
+
export { assertModelReady, getModelInstallState, readAvailability, resetModelInstallState, startModelDownload, } from "./model-install.js";
|
|
66
|
+
/** Register Chrome AI extension. @category Extensions */
|
|
67
|
+
export async function registerChromeAiExtension(registry = globalRegistry) {
|
|
68
|
+
if (!registry.getExtension("@executioncontrolprotocol/chrome-ai")) {
|
|
69
|
+
await registry.registerExtension(chromeAiExtension);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/** Chrome LanguageModel availability status from the browser API. @category Extensions */
|
|
2
|
+
export type ChromeAvailabilityStatus = "unsupported" | "unavailable" | "downloadable" | "downloading" | "available";
|
|
3
|
+
/** Install lifecycle phase for UI polling. @category Extensions */
|
|
4
|
+
export type ChromeModelInstallPhase = "idle" | "checking" | "downloading" | "loading" | "ready" | "error";
|
|
5
|
+
/** Snapshot of Chrome model download/install progress. @category Extensions */
|
|
6
|
+
export interface ChromeModelInstallState {
|
|
7
|
+
/** Current install phase. */
|
|
8
|
+
phase: ChromeModelInstallPhase;
|
|
9
|
+
/** Raw availability status from LanguageModel.availability(). */
|
|
10
|
+
status?: ChromeAvailabilityStatus;
|
|
11
|
+
/** Bytes loaded (when reported by downloadprogress). */
|
|
12
|
+
loaded?: number;
|
|
13
|
+
/** Total bytes (when reported by downloadprogress). */
|
|
14
|
+
total?: number;
|
|
15
|
+
/** Error message when phase is error. */
|
|
16
|
+
error?: string;
|
|
17
|
+
}
|
|
18
|
+
/** Read current LanguageModel availability. @category Extensions */
|
|
19
|
+
export declare function readAvailability(): Promise<{
|
|
20
|
+
status: ChromeAvailabilityStatus;
|
|
21
|
+
available: boolean;
|
|
22
|
+
supported: boolean;
|
|
23
|
+
}>;
|
|
24
|
+
/** Snapshot install state for polling. @category Extensions */
|
|
25
|
+
export declare function getModelInstallState(): ChromeModelInstallState;
|
|
26
|
+
/** Reset install state (for tests). @category Extensions */
|
|
27
|
+
export declare function resetModelInstallState(): void;
|
|
28
|
+
/**
|
|
29
|
+
* Start Gemini Nano download if needed (idempotent).
|
|
30
|
+
* @category Extensions
|
|
31
|
+
*/
|
|
32
|
+
export declare function startModelDownload(): Promise<{
|
|
33
|
+
started: boolean;
|
|
34
|
+
}>;
|
|
35
|
+
/** Whether generate can run (model ready). @category Extensions */
|
|
36
|
+
export declare function assertModelReady(): Promise<void>;
|
|
37
|
+
//# sourceMappingURL=model-install.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"model-install.d.ts","sourceRoot":"","sources":["../src/model-install.ts"],"names":[],"mappings":"AAKA,0FAA0F;AAC1F,MAAM,MAAM,wBAAwB,GAChC,aAAa,GACb,aAAa,GACb,cAAc,GACd,aAAa,GACb,WAAW,CAAA;AAEf,mEAAmE;AACnE,MAAM,MAAM,uBAAuB,GAC/B,MAAM,GACN,UAAU,GACV,aAAa,GACb,SAAS,GACT,OAAO,GACP,OAAO,CAAA;AAEX,+EAA+E;AAC/E,MAAM,WAAW,uBAAuB;IACtC,6BAA6B;IAC7B,KAAK,EAAE,uBAAuB,CAAA;IAC9B,iEAAiE;IACjE,MAAM,CAAC,EAAE,wBAAwB,CAAA;IACjC,wDAAwD;IACxD,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,uDAAuD;IACvD,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,yCAAyC;IACzC,KAAK,CAAC,EAAE,MAAM,CAAA;CACf;AAyBD,oEAAoE;AACpE,wBAAsB,gBAAgB,IAAI,OAAO,CAAC;IAChD,MAAM,EAAE,wBAAwB,CAAA;IAChC,SAAS,EAAE,OAAO,CAAA;IAClB,SAAS,EAAE,OAAO,CAAA;CACnB,CAAC,CAWD;AAED,+DAA+D;AAC/D,wBAAgB,oBAAoB,IAAI,uBAAuB,CAE9D;AAED,4DAA4D;AAC5D,wBAAgB,sBAAsB,IAAI,IAAI,CAG7C;AAgED;;;GAGG;AACH,wBAAsB,kBAAkB,IAAI,OAAO,CAAC;IAAE,OAAO,EAAE,OAAO,CAAA;CAAE,CAAC,CAkBxE;AAED,mEAAmE;AACnE,wBAAsB,gBAAgB,IAAI,OAAO,CAAC,IAAI,CAAC,CAStD"}
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
import { CHROME_LANGUAGE_MODEL_TEXT_OPTIONS, } from "./prompt-session.js";
|
|
2
|
+
let installState = { phase: "idle" };
|
|
3
|
+
let downloadPromise = null;
|
|
4
|
+
function languageModel() {
|
|
5
|
+
return globalThis.LanguageModel;
|
|
6
|
+
}
|
|
7
|
+
function normalizeStatus(raw) {
|
|
8
|
+
if (raw === "unavailable" ||
|
|
9
|
+
raw === "downloadable" ||
|
|
10
|
+
raw === "downloading" ||
|
|
11
|
+
raw === "available") {
|
|
12
|
+
return raw;
|
|
13
|
+
}
|
|
14
|
+
return "unsupported";
|
|
15
|
+
}
|
|
16
|
+
/** Read current LanguageModel availability. @category Extensions */
|
|
17
|
+
export async function readAvailability() {
|
|
18
|
+
const model = languageModel();
|
|
19
|
+
if (!model?.availability) {
|
|
20
|
+
return { status: "unsupported", available: false, supported: false };
|
|
21
|
+
}
|
|
22
|
+
const status = normalizeStatus(await model.availability(CHROME_LANGUAGE_MODEL_TEXT_OPTIONS));
|
|
23
|
+
return {
|
|
24
|
+
status,
|
|
25
|
+
available: status === "available",
|
|
26
|
+
supported: status !== "unsupported",
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
/** Snapshot install state for polling. @category Extensions */
|
|
30
|
+
export function getModelInstallState() {
|
|
31
|
+
return { ...installState };
|
|
32
|
+
}
|
|
33
|
+
/** Reset install state (for tests). @category Extensions */
|
|
34
|
+
export function resetModelInstallState() {
|
|
35
|
+
installState = { phase: "idle" };
|
|
36
|
+
downloadPromise = null;
|
|
37
|
+
}
|
|
38
|
+
async function runModelDownload() {
|
|
39
|
+
const model = languageModel();
|
|
40
|
+
if (!model?.create) {
|
|
41
|
+
installState = { phase: "error", status: "unsupported", error: "LanguageModel API not supported" };
|
|
42
|
+
return;
|
|
43
|
+
}
|
|
44
|
+
installState = { phase: "checking", status: installState.status ?? "downloadable" };
|
|
45
|
+
const avail = await readAvailability();
|
|
46
|
+
installState = { ...installState, status: avail.status };
|
|
47
|
+
if (avail.status === "available") {
|
|
48
|
+
installState = { phase: "ready", status: "available" };
|
|
49
|
+
return;
|
|
50
|
+
}
|
|
51
|
+
if (avail.status === "unavailable" || avail.status === "unsupported") {
|
|
52
|
+
installState = {
|
|
53
|
+
phase: "error",
|
|
54
|
+
status: avail.status,
|
|
55
|
+
error: "Chrome built-in AI is not available on this device",
|
|
56
|
+
};
|
|
57
|
+
return;
|
|
58
|
+
}
|
|
59
|
+
installState = { phase: "downloading", status: avail.status, loaded: 0 };
|
|
60
|
+
try {
|
|
61
|
+
await model.create({
|
|
62
|
+
...CHROME_LANGUAGE_MODEL_TEXT_OPTIONS,
|
|
63
|
+
monitor(m) {
|
|
64
|
+
m.addEventListener("downloadprogress", (e) => {
|
|
65
|
+
installState = {
|
|
66
|
+
phase: "downloading",
|
|
67
|
+
status: "downloading",
|
|
68
|
+
loaded: e.loaded,
|
|
69
|
+
total: e.total,
|
|
70
|
+
};
|
|
71
|
+
});
|
|
72
|
+
},
|
|
73
|
+
});
|
|
74
|
+
installState = { phase: "loading", status: "downloading" };
|
|
75
|
+
const after = await readAvailability();
|
|
76
|
+
if (after.available) {
|
|
77
|
+
installState = { phase: "ready", status: "available" };
|
|
78
|
+
}
|
|
79
|
+
else {
|
|
80
|
+
installState = {
|
|
81
|
+
phase: "error",
|
|
82
|
+
status: after.status,
|
|
83
|
+
error: "Model download did not complete",
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
catch (err) {
|
|
88
|
+
installState = {
|
|
89
|
+
phase: "error",
|
|
90
|
+
status: installState.status,
|
|
91
|
+
error: err instanceof Error ? err.message : String(err),
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Start Gemini Nano download if needed (idempotent).
|
|
97
|
+
* @category Extensions
|
|
98
|
+
*/
|
|
99
|
+
export async function startModelDownload() {
|
|
100
|
+
if (installState.phase === "ready") {
|
|
101
|
+
return { started: false };
|
|
102
|
+
}
|
|
103
|
+
if (downloadPromise) {
|
|
104
|
+
return { started: false };
|
|
105
|
+
}
|
|
106
|
+
const avail = await readAvailability();
|
|
107
|
+
if (avail.available) {
|
|
108
|
+
installState = { phase: "ready", status: "available" };
|
|
109
|
+
return { started: false };
|
|
110
|
+
}
|
|
111
|
+
downloadPromise = runModelDownload().finally(() => {
|
|
112
|
+
downloadPromise = null;
|
|
113
|
+
});
|
|
114
|
+
return { started: true };
|
|
115
|
+
}
|
|
116
|
+
/** Whether generate can run (model ready). @category Extensions */
|
|
117
|
+
export async function assertModelReady() {
|
|
118
|
+
const avail = await readAvailability();
|
|
119
|
+
if (!avail.available) {
|
|
120
|
+
throw new Error(avail.status === "downloading" || avail.status === "downloadable"
|
|
121
|
+
? "Chrome AI model is still downloading. Wait for installation to finish."
|
|
122
|
+
: "Chrome built-in AI is not available");
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
//# sourceMappingURL=model-install.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"model-install.js","sourceRoot":"","sources":["../src/model-install.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
export declare const CHROME_LANGUAGE_MODEL_TEXT_OPTIONS: {
|
|
2
|
+
expectedInputs: {
|
|
3
|
+
type: "text";
|
|
4
|
+
languages: string[];
|
|
5
|
+
}[];
|
|
6
|
+
expectedOutputs: {
|
|
7
|
+
type: "text";
|
|
8
|
+
languages: string[];
|
|
9
|
+
}[];
|
|
10
|
+
};
|
|
11
|
+
interface ChromePromptMessage {
|
|
12
|
+
role: "system" | "user" | "assistant";
|
|
13
|
+
content: string;
|
|
14
|
+
}
|
|
15
|
+
interface ChromeLanguageModelSession {
|
|
16
|
+
prompt(input: string): Promise<unknown>;
|
|
17
|
+
}
|
|
18
|
+
interface ChromeLanguageModelCreateOptions {
|
|
19
|
+
initialPrompts?: ChromePromptMessage[];
|
|
20
|
+
expectedInputs?: Array<{
|
|
21
|
+
type: "text";
|
|
22
|
+
languages: string[];
|
|
23
|
+
}>;
|
|
24
|
+
expectedOutputs?: Array<{
|
|
25
|
+
type: "text";
|
|
26
|
+
languages: string[];
|
|
27
|
+
}>;
|
|
28
|
+
monitor?: (monitor: {
|
|
29
|
+
addEventListener(type: "downloadprogress", listener: (event: {
|
|
30
|
+
loaded: number;
|
|
31
|
+
total?: number;
|
|
32
|
+
}) => void): void;
|
|
33
|
+
}) => void;
|
|
34
|
+
}
|
|
35
|
+
export interface ChromeLanguageModelApi {
|
|
36
|
+
availability(options?: ChromeLanguageModelCreateOptions): Promise<string>;
|
|
37
|
+
create(options?: ChromeLanguageModelCreateOptions): Promise<ChromeLanguageModelSession>;
|
|
38
|
+
}
|
|
39
|
+
/** Normalize Prompt API output (string or legacy `{ text }` shape). */
|
|
40
|
+
export declare function normalizePromptResponse(response: unknown): string;
|
|
41
|
+
/** Create a Prompt API session with optional system instruction. */
|
|
42
|
+
export declare function createChromeLanguageModelSession(model: ChromeLanguageModelApi, system?: string): Promise<ChromeLanguageModelSession>;
|
|
43
|
+
export {};
|
|
44
|
+
//# sourceMappingURL=prompt-session.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prompt-session.d.ts","sourceRoot":"","sources":["../src/prompt-session.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,kCAAkC;;;;;;;;;CAG9C,CAAA;AAED,UAAU,mBAAmB;IAC3B,IAAI,EAAE,QAAQ,GAAG,MAAM,GAAG,WAAW,CAAA;IACrC,OAAO,EAAE,MAAM,CAAA;CAChB;AAED,UAAU,0BAA0B;IAClC,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAA;CACxC;AAED,UAAU,gCAAgC;IACxC,cAAc,CAAC,EAAE,mBAAmB,EAAE,CAAA;IACtC,cAAc,CAAC,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC,CAAA;IAC7D,eAAe,CAAC,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC,CAAA;IAC9D,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE;QAClB,gBAAgB,CACd,IAAI,EAAE,kBAAkB,EACxB,QAAQ,EAAE,CAAC,KAAK,EAAE;YAAE,MAAM,EAAE,MAAM,CAAC;YAAC,KAAK,CAAC,EAAE,MAAM,CAAA;SAAE,KAAK,IAAI,GAC5D,IAAI,CAAA;KACR,KAAK,IAAI,CAAA;CACX;AAED,MAAM,WAAW,sBAAsB;IACrC,YAAY,CAAC,OAAO,CAAC,EAAE,gCAAgC,GAAG,OAAO,CAAC,MAAM,CAAC,CAAA;IACzE,MAAM,CAAC,OAAO,CAAC,EAAE,gCAAgC,GAAG,OAAO,CAAC,0BAA0B,CAAC,CAAA;CACxF;AAED,uEAAuE;AACvE,wBAAgB,uBAAuB,CAAC,QAAQ,EAAE,OAAO,GAAG,MAAM,CAWjE;AAOD,oEAAoE;AACpE,wBAAsB,gCAAgC,CACpD,KAAK,EAAE,sBAAsB,EAC7B,MAAM,CAAC,EAAE,MAAM,GACd,OAAO,CAAC,0BAA0B,CAAC,CASrC"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
const CHROME_TEXT_LANGUAGE = "en";
|
|
2
|
+
export const CHROME_LANGUAGE_MODEL_TEXT_OPTIONS = {
|
|
3
|
+
expectedInputs: [{ type: "text", languages: [CHROME_TEXT_LANGUAGE] }],
|
|
4
|
+
expectedOutputs: [{ type: "text", languages: [CHROME_TEXT_LANGUAGE] }],
|
|
5
|
+
};
|
|
6
|
+
/** Normalize Prompt API output (string or legacy `{ text }` shape). */
|
|
7
|
+
export function normalizePromptResponse(response) {
|
|
8
|
+
if (typeof response === "string")
|
|
9
|
+
return response;
|
|
10
|
+
if (response !== null && typeof response === "object") {
|
|
11
|
+
if ("text" in response && typeof response.text === "string") {
|
|
12
|
+
return response.text;
|
|
13
|
+
}
|
|
14
|
+
if ("content" in response && typeof response.content === "string") {
|
|
15
|
+
return response.content;
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
throw new Error("Chrome LanguageModel prompt returned an unsupported response shape");
|
|
19
|
+
}
|
|
20
|
+
const DEFAULT_SESSION_OPTIONS = CHROME_LANGUAGE_MODEL_TEXT_OPTIONS;
|
|
21
|
+
/** Create a Prompt API session with optional system instruction. */
|
|
22
|
+
export async function createChromeLanguageModelSession(model, system) {
|
|
23
|
+
const options = { ...DEFAULT_SESSION_OPTIONS };
|
|
24
|
+
if (system?.trim()) {
|
|
25
|
+
options.initialPrompts = [{ role: "system", content: system }];
|
|
26
|
+
}
|
|
27
|
+
if (model.availability) {
|
|
28
|
+
await model.availability(options);
|
|
29
|
+
}
|
|
30
|
+
return model.create(options);
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=prompt-session.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prompt-session.js","sourceRoot":"","sources":["../src/prompt-session.ts"],"names":[],"mappings":"AAAA,MAAM,oBAAoB,GAAG,IAAI,CAAA;AAEjC,MAAM,CAAC,MAAM,kCAAkC,GAAG;IAChD,cAAc,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,SAAS,EAAE,CAAC,oBAAoB,CAAC,EAAE,CAAC;IAC9E,eAAe,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,SAAS,EAAE,CAAC,oBAAoB,CAAC,EAAE,CAAC;CAChF,CAAA;AA4BD,uEAAuE;AACvE,MAAM,UAAU,uBAAuB,CAAC,QAAiB;IACvD,IAAI,OAAO,QAAQ,KAAK,QAAQ;QAAE,OAAO,QAAQ,CAAA;IACjD,IAAI,QAAQ,KAAK,IAAI,IAAI,OAAO,QAAQ,KAAK,QAAQ,EAAE,CAAC;QACtD,IAAI,MAAM,IAAI,QAAQ,IAAI,OAAQ,QAA8B,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YACnF,OAAQ,QAA6B,CAAC,IAAI,CAAA;QAC5C,CAAC;QACD,IAAI,SAAS,IAAI,QAAQ,IAAI,OAAQ,QAAiC,CAAC,OAAO,KAAK,QAAQ,EAAE,CAAC;YAC5F,OAAQ,QAAgC,CAAC,OAAO,CAAA;QAClD,CAAC;IACH,CAAC;IACD,MAAM,IAAI,KAAK,CAAC,oEAAoE,CAAC,CAAA;AACvF,CAAC;AAED,MAAM,uBAAuB,GAGzB,kCAAkC,CAAA;AAEtC,oEAAoE;AACpE,MAAM,CAAC,KAAK,UAAU,gCAAgC,CACpD,KAA6B,EAC7B,MAAe;IAEf,MAAM,OAAO,GAAqC,EAAE,GAAG,uBAAuB,EAAE,CAAA;IAChF,IAAI,MAAM,EAAE,IAAI,EAAE,EAAE,CAAC;QACnB,OAAO,CAAC,cAAc,GAAG,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAA;IAChE,CAAC;IACD,IAAI,KAAK,CAAC,YAAY,EAAE,CAAC;QACvB,MAAM,KAAK,CAAC,YAAY,CAAC,OAAO,CAAC,CAAA;IACnC,CAAC;IACD,OAAO,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,CAAA;AAC9B,CAAC"}
|
package/package.json
ADDED
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@executioncontrolprotocol/chrome-ai",
|
|
3
|
+
"version": "0.10.0",
|
|
4
|
+
"description": "Chrome built-in AI provider for ECP browser demo",
|
|
5
|
+
"license": "Apache-2.0",
|
|
6
|
+
"type": "module",
|
|
7
|
+
"main": "./dist/index.js",
|
|
8
|
+
"types": "./dist/index.d.ts",
|
|
9
|
+
"exports": {
|
|
10
|
+
".": {
|
|
11
|
+
"types": "./dist/index.d.ts",
|
|
12
|
+
"import": "./dist/index.js"
|
|
13
|
+
}
|
|
14
|
+
},
|
|
15
|
+
"files": [
|
|
16
|
+
"dist",
|
|
17
|
+
"README.md"
|
|
18
|
+
],
|
|
19
|
+
"scripts": {
|
|
20
|
+
"build": "tsc -b"
|
|
21
|
+
},
|
|
22
|
+
"peerDependencies": {
|
|
23
|
+
"@executioncontrolprotocol/core": "^0.10.0",
|
|
24
|
+
"@executioncontrolprotocol/types": "^0.10.0",
|
|
25
|
+
"zod": "^3.24.0"
|
|
26
|
+
},
|
|
27
|
+
"devDependencies": {
|
|
28
|
+
"@executioncontrolprotocol/core": "0.10.0",
|
|
29
|
+
"@executioncontrolprotocol/types": "0.10.0",
|
|
30
|
+
"typescript": "^5.7.0",
|
|
31
|
+
"zod": "^3.24.0"
|
|
32
|
+
}
|
|
33
|
+
}
|