@genbounty/ailp 0.2.0 → 0.2.1
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 +40 -15
- package/dist/react.d.ts +21 -1
- package/dist/react.d.ts.map +1 -1
- package/dist/react.js +113 -10
- package/dist/react.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -116,28 +116,23 @@ 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
|
+
```tsx
|
|
129
|
+
import { useAilp } from "@genbounty/ailp/react";
|
|
132
130
|
|
|
133
131
|
function ChatWidget() {
|
|
134
|
-
const { assess, result, loading, error } =
|
|
132
|
+
const { assess, result, loading, error, reset } = useAilp();
|
|
135
133
|
|
|
136
134
|
async function handleSend(userMessage: string, llmOutput: string) {
|
|
137
|
-
await assess(
|
|
138
|
-
[{ role: "user", content: userMessage }],
|
|
139
|
-
llmOutput,
|
|
140
|
-
);
|
|
135
|
+
await assess([{ role: "user", content: userMessage }], llmOutput);
|
|
141
136
|
}
|
|
142
137
|
|
|
143
138
|
return (
|
|
@@ -155,6 +150,36 @@ function ChatWidget() {
|
|
|
155
150
|
}
|
|
156
151
|
```
|
|
157
152
|
|
|
153
|
+
**Env vars** (override any field by passing options to `useAilp({ ... })` instead):
|
|
154
|
+
|
|
155
|
+
| Variable | Required | Default |
|
|
156
|
+
|----------|----------|---------|
|
|
157
|
+
| `NEXT_PUBLIC_GENBOUNTY_PROGRAM_ID` or `VITE_GENBOUNTY_PROGRAM_ID` | Yes (unless you pass `programId`) | — |
|
|
158
|
+
| `NEXT_PUBLIC_AILP_BASE_URL` or `VITE_AILP_BASE_URL` | No | `http://127.0.0.1:8000` |
|
|
159
|
+
| `NEXT_PUBLIC_AILP_FRAMEWORKS` or `VITE_AILP_FRAMEWORKS` | No | `eu-ai-act` |
|
|
160
|
+
|
|
161
|
+
Frameworks in env: comma-separated (`eu-ai-act,owasp-llm`) or a JSON array string (`["eu-ai-act","owasp-llm"]`).
|
|
162
|
+
|
|
163
|
+
Partial override example:
|
|
164
|
+
|
|
165
|
+
```tsx
|
|
166
|
+
const { assess, result, loading, error } = useAilp({ programId: "hardcoded-for-demo" });
|
|
167
|
+
```
|
|
168
|
+
|
|
169
|
+
The hook also returns `ailp` (the underlying `AilpFn`) if you need it outside `assess`.
|
|
170
|
+
|
|
171
|
+
### `useAssess(ailp)` — advanced
|
|
172
|
+
|
|
173
|
+
If you already have an `AilpFn` from `createAilp()`:
|
|
174
|
+
|
|
175
|
+
```tsx
|
|
176
|
+
import { createAilp } from "@genbounty/ailp";
|
|
177
|
+
import { useAssess } from "@genbounty/ailp/react";
|
|
178
|
+
|
|
179
|
+
const ailp = createAilp({ baseUrl, programId, frameworks });
|
|
180
|
+
const { assess, result, loading, error } = useAssess(ailp);
|
|
181
|
+
```
|
|
182
|
+
|
|
158
183
|
---
|
|
159
184
|
|
|
160
185
|
## 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;
|
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,6FAA6F;IAC7F,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,oDAAoD;IACpD,KAAK,EAAE,MAAM,IAAI,CAAC;CACnB;AAED,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,cAAc,CAkCtD"}
|
package/dist/react.js
CHANGED
|
@@ -1,28 +1,131 @@
|
|
|
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,
|
|
124
|
+
const assess = useCallback(async (messages, output, callOptions) => {
|
|
22
125
|
setLoading(true);
|
|
23
126
|
setError(null);
|
|
24
127
|
try {
|
|
25
|
-
const res = await ailp(messages, output,
|
|
128
|
+
const res = await ailp(messages, output, callOptions);
|
|
26
129
|
setResult(res);
|
|
27
130
|
return res;
|
|
28
131
|
}
|
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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"}
|