@genbounty/ailp 0.2.0 → 0.2.2
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/README.md +42 -15
- package/dist/react.d.ts +23 -3
- package/dist/react.d.ts.map +1 -1
- package/dist/react.js +115 -11
- package/dist/react.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -116,28 +116,25 @@ const response = await wrapLlmCall(
|
|
|
116
116
|
|
|
117
117
|
---
|
|
118
118
|
|
|
119
|
-
## React
|
|
119
|
+
## React
|
|
120
120
|
|
|
121
|
-
Import from `@genbounty/ailp/react` to keep React out of the core bundle
|
|
121
|
+
Import from `@genbounty/ailp/react` to keep React out of the core bundle.
|
|
122
122
|
|
|
123
|
-
|
|
124
|
-
import { createAilp } from "@genbounty/ailp";
|
|
125
|
-
import { useAssess } from "@genbounty/ailp/react";
|
|
123
|
+
### `useAilp()` — recommended
|
|
126
124
|
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
125
|
+
One hook: memoized client + `assess` / `result` / `loading` / `error` / `reset`.
|
|
126
|
+
Configure with **environment variables** (Next.js `NEXT_PUBLIC_*`, Vite `VITE_*`) so you do not need `useMemo` or `createAilp` in every component.
|
|
127
|
+
|
|
128
|
+
Each call to `assess()` clears the previous `result` and `error` before the new request, so you do not need to call `reset()` between chat turns. Use `reset()` only when you want to clear the UI without assessing (for example when leaving a view).
|
|
129
|
+
|
|
130
|
+
```tsx
|
|
131
|
+
import { useAilp } from "@genbounty/ailp/react";
|
|
132
132
|
|
|
133
133
|
function ChatWidget() {
|
|
134
|
-
const { assess, result, loading, error } =
|
|
134
|
+
const { assess, result, loading, error } = useAilp();
|
|
135
135
|
|
|
136
136
|
async function handleSend(userMessage: string, llmOutput: string) {
|
|
137
|
-
await assess(
|
|
138
|
-
[{ role: "user", content: userMessage }],
|
|
139
|
-
llmOutput,
|
|
140
|
-
);
|
|
137
|
+
await assess([{ role: "user", content: userMessage }], llmOutput);
|
|
141
138
|
}
|
|
142
139
|
|
|
143
140
|
return (
|
|
@@ -155,6 +152,36 @@ function ChatWidget() {
|
|
|
155
152
|
}
|
|
156
153
|
```
|
|
157
154
|
|
|
155
|
+
**Env vars** (override any field by passing options to `useAilp({ ... })` instead):
|
|
156
|
+
|
|
157
|
+
| Variable | Required | Default |
|
|
158
|
+
|----------|----------|---------|
|
|
159
|
+
| `NEXT_PUBLIC_GENBOUNTY_PROGRAM_ID` or `VITE_GENBOUNTY_PROGRAM_ID` | Yes (unless you pass `programId`) | — |
|
|
160
|
+
| `NEXT_PUBLIC_AILP_BASE_URL` or `VITE_AILP_BASE_URL` | No | `http://127.0.0.1:8000` |
|
|
161
|
+
| `NEXT_PUBLIC_AILP_FRAMEWORKS` or `VITE_AILP_FRAMEWORKS` | No | `eu-ai-act` |
|
|
162
|
+
|
|
163
|
+
Frameworks in env: comma-separated (`eu-ai-act,owasp-llm`) or a JSON array string (`["eu-ai-act","owasp-llm"]`).
|
|
164
|
+
|
|
165
|
+
Partial override example:
|
|
166
|
+
|
|
167
|
+
```tsx
|
|
168
|
+
const { assess, result, loading, error } = useAilp({ programId: "hardcoded-for-demo" });
|
|
169
|
+
```
|
|
170
|
+
|
|
171
|
+
The hook also returns `ailp` (the underlying `AilpFn`) if you need it outside `assess`.
|
|
172
|
+
|
|
173
|
+
### `useAssess(ailp)` — advanced
|
|
174
|
+
|
|
175
|
+
If you already have an `AilpFn` from `createAilp()`:
|
|
176
|
+
|
|
177
|
+
```tsx
|
|
178
|
+
import { createAilp } from "@genbounty/ailp";
|
|
179
|
+
import { useAssess } from "@genbounty/ailp/react";
|
|
180
|
+
|
|
181
|
+
const ailp = createAilp({ baseUrl, programId, frameworks });
|
|
182
|
+
const { assess, result, loading, error } = useAssess(ailp);
|
|
183
|
+
```
|
|
184
|
+
|
|
158
185
|
---
|
|
159
186
|
|
|
160
187
|
## Framework slugs
|
package/dist/react.d.ts
CHANGED
|
@@ -1,5 +1,25 @@
|
|
|
1
|
-
import type { AilpAssessResponse, AilpCallOptions, AilpMessage } from "./types.js";
|
|
2
1
|
import type { AilpFn } from "./ailp.js";
|
|
2
|
+
import type { AilpAssessResponse, AilpCallOptions, AilpMessage, AilpOptions } from "./types.js";
|
|
3
|
+
/**
|
|
4
|
+
* Resolve config from optional overrides + environment variables.
|
|
5
|
+
* Throws if programId cannot be determined.
|
|
6
|
+
*/
|
|
7
|
+
export declare function resolveAilpConfigFromEnv(overrides?: Partial<AilpOptions>): AilpOptions;
|
|
8
|
+
/** Optional overrides; omitted fields are read from env (see README). */
|
|
9
|
+
export type UseAilpOptions = Partial<AilpOptions>;
|
|
10
|
+
export type UseAilpResult = UseAssessState & {
|
|
11
|
+
ailp: AilpFn;
|
|
12
|
+
};
|
|
13
|
+
/**
|
|
14
|
+
* One-liner for React apps: memoized `createAilp` + assessment state.
|
|
15
|
+
* Reads `NEXT_PUBLIC_*` (Next.js) or `VITE_*` (Vite) when options are omitted.
|
|
16
|
+
*
|
|
17
|
+
* Env vars:
|
|
18
|
+
* - `NEXT_PUBLIC_AILP_BASE_URL` / `VITE_AILP_BASE_URL` — default `http://127.0.0.1:8000`
|
|
19
|
+
* - `NEXT_PUBLIC_GENBOUNTY_PROGRAM_ID` / `VITE_GENBOUNTY_PROGRAM_ID` — **required** unless you pass `programId`
|
|
20
|
+
* - `NEXT_PUBLIC_AILP_FRAMEWORKS` / `VITE_AILP_FRAMEWORKS` — comma-separated or JSON array; default `eu-ai-act`
|
|
21
|
+
*/
|
|
22
|
+
export declare function useAilp(options?: UseAilpOptions): UseAilpResult;
|
|
3
23
|
export interface UseAssessState {
|
|
4
24
|
/** Last successful response, or null if not yet assessed. */
|
|
5
25
|
result: AilpAssessResponse | null;
|
|
@@ -7,9 +27,9 @@ export interface UseAssessState {
|
|
|
7
27
|
loading: boolean;
|
|
8
28
|
/** Last error thrown by assess, or null. */
|
|
9
29
|
error: Error | null;
|
|
10
|
-
/** Submit messages and LLM output for assessment. Returns the response, or null on error. */
|
|
30
|
+
/** Submit messages and LLM output for assessment. Returns the response, or null on error. Clears any previous result and error before the request starts. */
|
|
11
31
|
assess: (messages: AilpMessage[], output: string, options?: AilpCallOptions) => Promise<AilpAssessResponse | null>;
|
|
12
|
-
/** Clear result and error
|
|
32
|
+
/** Clear result and error without starting an assessment (e.g. leaving a screen). */
|
|
13
33
|
reset: () => void;
|
|
14
34
|
}
|
|
15
35
|
export declare function useAssess(ailp: AilpFn): UseAssessState;
|
package/dist/react.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"react.d.ts","sourceRoot":"","sources":["../src/react.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"react.d.ts","sourceRoot":"","sources":["../src/react.ts"],"names":[],"mappings":"AAqBA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,KAAK,EACV,kBAAkB,EAClB,eAAe,EAEf,WAAW,EACX,WAAW,EACZ,MAAM,YAAY,CAAC;AAwCpB;;;GAGG;AACH,wBAAgB,wBAAwB,CAAC,SAAS,CAAC,EAAE,OAAO,CAAC,WAAW,CAAC,GAAG,WAAW,CAiCtF;AAaD,yEAAyE;AACzE,MAAM,MAAM,cAAc,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC;AAElD,MAAM,MAAM,aAAa,GAAG,cAAc,GAAG;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC;AAE9D;;;;;;;;GAQG;AACH,wBAAgB,OAAO,CAAC,OAAO,CAAC,EAAE,cAAc,GAAG,aAAa,CAsB/D;AAMD,MAAM,WAAW,cAAc;IAC7B,6DAA6D;IAC7D,MAAM,EAAE,kBAAkB,GAAG,IAAI,CAAC;IAClC,iDAAiD;IACjD,OAAO,EAAE,OAAO,CAAC;IACjB,4CAA4C;IAC5C,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;IACpB,6JAA6J;IAC7J,MAAM,EAAE,CAAC,QAAQ,EAAE,WAAW,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,eAAe,KAAK,OAAO,CAAC,kBAAkB,GAAG,IAAI,CAAC,CAAC;IACnH,qFAAqF;IACrF,KAAK,EAAE,MAAM,IAAI,CAAC;CACnB;AAED,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,cAAc,CAmCtD"}
|
package/dist/react.js
CHANGED
|
@@ -1,28 +1,132 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* React
|
|
2
|
+
* React hooks for AILP assess.
|
|
3
3
|
* Import from "@genbounty/ailp/react" to keep React out of the main bundle.
|
|
4
4
|
*
|
|
5
|
-
* @example
|
|
5
|
+
* @example Recommended — env-driven Next.js / Vite (no useMemo boilerplate)
|
|
6
|
+
* import { useAilp } from "@genbounty/ailp/react";
|
|
7
|
+
*
|
|
8
|
+
* function ChatWidget() {
|
|
9
|
+
* const { assess, result, loading, error, reset } = useAilp();
|
|
10
|
+
* // ...
|
|
11
|
+
* }
|
|
12
|
+
*
|
|
13
|
+
* @example Advanced — reuse an existing AilpFn
|
|
6
14
|
* import { createAilp } from "@genbounty/ailp";
|
|
7
15
|
* import { useAssess } from "@genbounty/ailp/react";
|
|
8
16
|
*
|
|
9
|
-
* const ailp = createAilp({ baseUrl
|
|
17
|
+
* const ailp = createAilp({ baseUrl, programId, frameworks });
|
|
18
|
+
* const { assess, result, loading, error } = useAssess(ailp);
|
|
19
|
+
*/
|
|
20
|
+
import { useCallback, useMemo, useState } from "react";
|
|
21
|
+
import { createAilp } from "./ailp.js";
|
|
22
|
+
// -------------------------------------------------------------------------
|
|
23
|
+
// Env helpers (Next.js NEXT_PUBLIC_*, Vite VITE_*)
|
|
24
|
+
// -------------------------------------------------------------------------
|
|
25
|
+
function getNodeEnv() {
|
|
26
|
+
const g = globalThis;
|
|
27
|
+
return g.process?.env;
|
|
28
|
+
}
|
|
29
|
+
function readEnv(key) {
|
|
30
|
+
const v = getNodeEnv()?.[key];
|
|
31
|
+
if (v != null && v !== "")
|
|
32
|
+
return v;
|
|
33
|
+
try {
|
|
34
|
+
const im = import.meta;
|
|
35
|
+
const v = im.env?.[key];
|
|
36
|
+
if (typeof v === "string" && v !== "")
|
|
37
|
+
return v;
|
|
38
|
+
}
|
|
39
|
+
catch {
|
|
40
|
+
/* import.meta unavailable */
|
|
41
|
+
}
|
|
42
|
+
return undefined;
|
|
43
|
+
}
|
|
44
|
+
function parseFrameworksFromEnv(raw) {
|
|
45
|
+
if (raw == null || raw.trim() === "")
|
|
46
|
+
return undefined;
|
|
47
|
+
const t = raw.trim();
|
|
48
|
+
if (t.startsWith("[")) {
|
|
49
|
+
try {
|
|
50
|
+
const j = JSON.parse(t);
|
|
51
|
+
if (Array.isArray(j) && j.every((x) => typeof x === "string")) {
|
|
52
|
+
return j;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
catch {
|
|
56
|
+
/* fall through */
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
return t.split(",").map((s) => s.trim()).filter(Boolean);
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Resolve config from optional overrides + environment variables.
|
|
63
|
+
* Throws if programId cannot be determined.
|
|
64
|
+
*/
|
|
65
|
+
export function resolveAilpConfigFromEnv(overrides) {
|
|
66
|
+
const baseUrl = overrides?.baseUrl ??
|
|
67
|
+
readEnv("NEXT_PUBLIC_AILP_BASE_URL") ??
|
|
68
|
+
readEnv("VITE_AILP_BASE_URL") ??
|
|
69
|
+
"http://127.0.0.1:8000";
|
|
70
|
+
const programIdRaw = overrides?.programId ??
|
|
71
|
+
readEnv("NEXT_PUBLIC_GENBOUNTY_PROGRAM_ID") ??
|
|
72
|
+
readEnv("VITE_GENBOUNTY_PROGRAM_ID");
|
|
73
|
+
if (programIdRaw == null || String(programIdRaw).trim() === "") {
|
|
74
|
+
throw new Error("AILP: missing programId. Set NEXT_PUBLIC_GENBOUNTY_PROGRAM_ID or VITE_GENBOUNTY_PROGRAM_ID, or pass programId to useAilp().");
|
|
75
|
+
}
|
|
76
|
+
let frameworks;
|
|
77
|
+
if (overrides?.frameworks != null) {
|
|
78
|
+
frameworks = overrides.frameworks;
|
|
79
|
+
}
|
|
80
|
+
else {
|
|
81
|
+
const raw = readEnv("NEXT_PUBLIC_AILP_FRAMEWORKS") ?? readEnv("VITE_AILP_FRAMEWORKS");
|
|
82
|
+
frameworks = parseFrameworksFromEnv(raw) ?? ["eu-ai-act"];
|
|
83
|
+
}
|
|
84
|
+
return {
|
|
85
|
+
baseUrl: baseUrl.replace(/\/$/, ""),
|
|
86
|
+
programId: String(programIdRaw),
|
|
87
|
+
frameworks,
|
|
88
|
+
timeoutMs: overrides?.timeoutMs,
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
function frameworksDepKey(fw) {
|
|
92
|
+
if (fw === undefined)
|
|
93
|
+
return "__env__";
|
|
94
|
+
return Array.isArray(fw) ? JSON.stringify(fw) : String(fw);
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* One-liner for React apps: memoized `createAilp` + assessment state.
|
|
98
|
+
* Reads `NEXT_PUBLIC_*` (Next.js) or `VITE_*` (Vite) when options are omitted.
|
|
10
99
|
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
*
|
|
14
|
-
*
|
|
100
|
+
* Env vars:
|
|
101
|
+
* - `NEXT_PUBLIC_AILP_BASE_URL` / `VITE_AILP_BASE_URL` — default `http://127.0.0.1:8000`
|
|
102
|
+
* - `NEXT_PUBLIC_GENBOUNTY_PROGRAM_ID` / `VITE_GENBOUNTY_PROGRAM_ID` — **required** unless you pass `programId`
|
|
103
|
+
* - `NEXT_PUBLIC_AILP_FRAMEWORKS` / `VITE_AILP_FRAMEWORKS` — comma-separated or JSON array; default `eu-ai-act`
|
|
15
104
|
*/
|
|
16
|
-
|
|
105
|
+
export function useAilp(options) {
|
|
106
|
+
const baseUrl = options?.baseUrl;
|
|
107
|
+
const programId = options?.programId;
|
|
108
|
+
const frameworks = options?.frameworks;
|
|
109
|
+
const timeoutMs = options?.timeoutMs;
|
|
110
|
+
const config = useMemo(() => resolveAilpConfigFromEnv({
|
|
111
|
+
baseUrl,
|
|
112
|
+
programId,
|
|
113
|
+
frameworks,
|
|
114
|
+
timeoutMs,
|
|
115
|
+
}), [baseUrl, programId, frameworksDepKey(frameworks), timeoutMs]);
|
|
116
|
+
const ailp = useMemo(() => createAilp(config), [config]);
|
|
117
|
+
const state = useAssess(ailp);
|
|
118
|
+
return { ...state, ailp };
|
|
119
|
+
}
|
|
17
120
|
export function useAssess(ailp) {
|
|
18
121
|
const [result, setResult] = useState(null);
|
|
19
122
|
const [loading, setLoading] = useState(false);
|
|
20
123
|
const [error, setError] = useState(null);
|
|
21
|
-
const assess = useCallback(async (messages, output,
|
|
22
|
-
|
|
124
|
+
const assess = useCallback(async (messages, output, callOptions) => {
|
|
125
|
+
setResult(null);
|
|
23
126
|
setError(null);
|
|
127
|
+
setLoading(true);
|
|
24
128
|
try {
|
|
25
|
-
const res = await ailp(messages, output,
|
|
129
|
+
const res = await ailp(messages, output, callOptions);
|
|
26
130
|
setResult(res);
|
|
27
131
|
return res;
|
|
28
132
|
}
|
package/dist/react.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"react.js","sourceRoot":"","sources":["../src/react.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"react.js","sourceRoot":"","sources":["../src/react.ts"],"names":[],"mappings":"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"}
|