@ap3x/ai 0.1.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 -0
- package/README.md +28 -0
- package/dist/api-registry.d.ts +23 -0
- package/dist/api-registry.d.ts.map +1 -0
- package/dist/auth/config-dir.d.ts +25 -0
- package/dist/auth/config-dir.d.ts.map +1 -0
- package/dist/auth/github-copilot.d.ts +74 -0
- package/dist/auth/github-copilot.d.ts.map +1 -0
- package/dist/auth/index.d.ts +10 -0
- package/dist/auth/index.d.ts.map +1 -0
- package/dist/auth/jwt.d.ts +32 -0
- package/dist/auth/jwt.d.ts.map +1 -0
- package/dist/auth/oauth-flow.d.ts +84 -0
- package/dist/auth/oauth-flow.d.ts.map +1 -0
- package/dist/auth/pkce.d.ts +20 -0
- package/dist/auth/pkce.d.ts.map +1 -0
- package/dist/auth/providers.d.ts +33 -0
- package/dist/auth/providers.d.ts.map +1 -0
- package/dist/auth/storage.d.ts +55 -0
- package/dist/auth/storage.d.ts.map +1 -0
- package/dist/auth/types.d.ts +88 -0
- package/dist/auth/types.d.ts.map +1 -0
- package/dist/auth/unified.d.ts +29 -0
- package/dist/auth/unified.d.ts.map +1 -0
- package/dist/env-api-keys.d.ts +16 -0
- package/dist/env-api-keys.d.ts.map +1 -0
- package/dist/event-stream.d.ts +33 -0
- package/dist/event-stream.d.ts.map +1 -0
- package/dist/generate-object.d.ts +63 -0
- package/dist/generate-object.d.ts.map +1 -0
- package/dist/images-models.d.ts +114 -0
- package/dist/images-models.d.ts.map +1 -0
- package/dist/images-registry.d.ts +23 -0
- package/dist/images-registry.d.ts.map +1 -0
- package/dist/images-schema.d.ts +21 -0
- package/dist/images-schema.d.ts.map +1 -0
- package/dist/images.d.ts +13 -0
- package/dist/images.d.ts.map +1 -0
- package/dist/index.d.ts +59 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +15656 -0
- package/dist/models/amazon-bedrock.models.generated.d.ts +1858 -0
- package/dist/models/amazon-bedrock.models.generated.d.ts.map +1 -0
- package/dist/models/ant-ling.models.generated.d.ts +86 -0
- package/dist/models/ant-ling.models.generated.d.ts.map +1 -0
- package/dist/models/anthropic.models.generated.d.ts +450 -0
- package/dist/models/anthropic.models.generated.d.ts.map +1 -0
- package/dist/models/azure-openai-responses.models.generated.d.ts +804 -0
- package/dist/models/azure-openai-responses.models.generated.d.ts.map +1 -0
- package/dist/models/cerebras.models.generated.d.ts +66 -0
- package/dist/models/cerebras.models.generated.d.ts.map +1 -0
- package/dist/models/cloudflare-ai-gateway.models.generated.d.ts +786 -0
- package/dist/models/cloudflare-ai-gateway.models.generated.d.ts.map +1 -0
- package/dist/models/cloudflare-workers-ai.models.generated.d.ts +302 -0
- package/dist/models/cloudflare-workers-ai.models.generated.d.ts.map +1 -0
- package/dist/models/deepseek.models.generated.d.ts +63 -0
- package/dist/models/deepseek.models.generated.d.ts.map +1 -0
- package/dist/models/fireworks.models.generated.d.ts +381 -0
- package/dist/models/fireworks.models.generated.d.ts.map +1 -0
- package/dist/models/github-copilot.models.generated.d.ts +698 -0
- package/dist/models/github-copilot.models.generated.d.ts.map +1 -0
- package/dist/models/google-vertex.models.generated.d.ts +202 -0
- package/dist/models/google-vertex.models.generated.d.ts.map +1 -0
- package/dist/models/google.models.generated.d.ts +351 -0
- package/dist/models/google.models.generated.d.ts.map +1 -0
- package/dist/models/groq.models.generated.d.ts +128 -0
- package/dist/models/groq.models.generated.d.ts.map +1 -0
- package/dist/models/huggingface.models.generated.d.ts +63 -0
- package/dist/models/huggingface.models.generated.d.ts.map +1 -0
- package/dist/models/kimi-coding.models.generated.d.ts +63 -0
- package/dist/models/kimi-coding.models.generated.d.ts.map +1 -0
- package/dist/models/minimax-cn.models.generated.d.ts +54 -0
- package/dist/models/minimax-cn.models.generated.d.ts.map +1 -0
- package/dist/models/minimax.models.generated.d.ts +54 -0
- package/dist/models/minimax.models.generated.d.ts.map +1 -0
- package/dist/models/mistral.models.generated.d.ts +513 -0
- package/dist/models/mistral.models.generated.d.ts.map +1 -0
- package/dist/models/moonshotai-cn.models.generated.d.ts +234 -0
- package/dist/models/moonshotai-cn.models.generated.d.ts.map +1 -0
- package/dist/models/moonshotai.models.generated.d.ts +234 -0
- package/dist/models/moonshotai.models.generated.d.ts.map +1 -0
- package/dist/models/nvidia.models.generated.d.ts +563 -0
- package/dist/models/nvidia.models.generated.d.ts.map +1 -0
- package/dist/models/openai.models.generated.d.ts +827 -0
- package/dist/models/openai.models.generated.d.ts.map +1 -0
- package/dist/models/opencode.models.generated.d.ts +69 -0
- package/dist/models/opencode.models.generated.d.ts.map +1 -0
- package/dist/models/openrouter.models.generated.d.ts +87 -0
- package/dist/models/openrouter.models.generated.d.ts.map +1 -0
- package/dist/models/together.models.generated.d.ts +598 -0
- package/dist/models/together.models.generated.d.ts.map +1 -0
- package/dist/models/vercel-ai-gateway.models.generated.d.ts +63 -0
- package/dist/models/vercel-ai-gateway.models.generated.d.ts.map +1 -0
- package/dist/models/xai.models.generated.d.ts +157 -0
- package/dist/models/xai.models.generated.d.ts.map +1 -0
- package/dist/models/xiaomi-token-plan-ams.models.generated.d.ts +108 -0
- package/dist/models/xiaomi-token-plan-ams.models.generated.d.ts.map +1 -0
- package/dist/models/xiaomi-token-plan-cn.models.generated.d.ts +108 -0
- package/dist/models/xiaomi-token-plan-cn.models.generated.d.ts.map +1 -0
- package/dist/models/xiaomi-token-plan-sgp.models.generated.d.ts +108 -0
- package/dist/models/xiaomi-token-plan-sgp.models.generated.d.ts.map +1 -0
- package/dist/models/xiaomi.models.generated.d.ts +129 -0
- package/dist/models/xiaomi.models.generated.d.ts.map +1 -0
- package/dist/models/zai-coding-cn.models.generated.d.ts +153 -0
- package/dist/models/zai-coding-cn.models.generated.d.ts.map +1 -0
- package/dist/models/zai.models.generated.d.ts +153 -0
- package/dist/models/zai.models.generated.d.ts.map +1 -0
- package/dist/models.d.ts +10734 -0
- package/dist/models.d.ts.map +1 -0
- package/dist/providers/amazon-bedrock.d.ts +173 -0
- package/dist/providers/amazon-bedrock.d.ts.map +1 -0
- package/dist/providers/anthropic.d.ts +25 -0
- package/dist/providers/anthropic.d.ts.map +1 -0
- package/dist/providers/azure-openai-responses.d.ts +17 -0
- package/dist/providers/azure-openai-responses.d.ts.map +1 -0
- package/dist/providers/cloudflare.d.ts +13 -0
- package/dist/providers/cloudflare.d.ts.map +1 -0
- package/dist/providers/faux-images.d.ts +41 -0
- package/dist/providers/faux-images.d.ts.map +1 -0
- package/dist/providers/faux.d.ts +61 -0
- package/dist/providers/faux.d.ts.map +1 -0
- package/dist/providers/github-copilot-headers.d.ts +14 -0
- package/dist/providers/github-copilot-headers.d.ts.map +1 -0
- package/dist/providers/google-images.d.ts +14 -0
- package/dist/providers/google-images.d.ts.map +1 -0
- package/dist/providers/google-shared.d.ts +53 -0
- package/dist/providers/google-shared.d.ts.map +1 -0
- package/dist/providers/google-vertex.d.ts +48 -0
- package/dist/providers/google-vertex.d.ts.map +1 -0
- package/dist/providers/google.d.ts +47 -0
- package/dist/providers/google.d.ts.map +1 -0
- package/dist/providers/mistral.d.ts +67 -0
- package/dist/providers/mistral.d.ts.map +1 -0
- package/dist/providers/openai-codex-responses.d.ts +17 -0
- package/dist/providers/openai-codex-responses.d.ts.map +1 -0
- package/dist/providers/openai-completions.d.ts +69 -0
- package/dist/providers/openai-completions.d.ts.map +1 -0
- package/dist/providers/openai-images.d.ts +17 -0
- package/dist/providers/openai-images.d.ts.map +1 -0
- package/dist/providers/openai-prompt-cache.d.ts +8 -0
- package/dist/providers/openai-prompt-cache.d.ts.map +1 -0
- package/dist/providers/openai-responses-shared.d.ts +128 -0
- package/dist/providers/openai-responses-shared.d.ts.map +1 -0
- package/dist/providers/openai-responses.d.ts +63 -0
- package/dist/providers/openai-responses.d.ts.map +1 -0
- package/dist/providers/provider-runtime.d.ts +34 -0
- package/dist/providers/provider-runtime.d.ts.map +1 -0
- package/dist/providers/register-builtins.d.ts +11 -0
- package/dist/providers/register-builtins.d.ts.map +1 -0
- package/dist/providers/register-images.d.ts +8 -0
- package/dist/providers/register-images.d.ts.map +1 -0
- package/dist/providers/request-dispatch.d.ts +52 -0
- package/dist/providers/request-dispatch.d.ts.map +1 -0
- package/dist/providers/simple-options.d.ts +42 -0
- package/dist/providers/simple-options.d.ts.map +1 -0
- package/dist/providers/tool-call-id.d.ts +46 -0
- package/dist/providers/tool-call-id.d.ts.map +1 -0
- package/dist/providers/transform-messages.d.ts +22 -0
- package/dist/providers/transform-messages.d.ts.map +1 -0
- package/dist/stream.d.ts +18 -0
- package/dist/stream.d.ts.map +1 -0
- package/dist/types.d.ts +448 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/utils/abort-signals.d.ts +16 -0
- package/dist/utils/abort-signals.d.ts.map +1 -0
- package/dist/utils/estimate.d.ts +35 -0
- package/dist/utils/estimate.d.ts.map +1 -0
- package/dist/utils/hash.d.ts +7 -0
- package/dist/utils/hash.d.ts.map +1 -0
- package/dist/utils/json-parse.d.ts +16 -0
- package/dist/utils/json-parse.d.ts.map +1 -0
- package/dist/utils/node-http-proxy.d.ts +34 -0
- package/dist/utils/node-http-proxy.d.ts.map +1 -0
- package/dist/utils/overflow.d.ts +25 -0
- package/dist/utils/overflow.d.ts.map +1 -0
- package/dist/utils/sanitize-unicode.d.ts +9 -0
- package/dist/utils/sanitize-unicode.d.ts.map +1 -0
- package/dist/utils/sse.d.ts +21 -0
- package/dist/utils/sse.d.ts.map +1 -0
- package/dist/validation.d.ts +31 -0
- package/dist/validation.d.ts.map +1 -0
- package/package.json +35 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"node-http-proxy.d.ts","sourceRoot":"","sources":["../../src/utils/node-http-proxy.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,oFAAoF;AACpF,MAAM,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC;AAY1D,yEAAyE;AACzE,eAAO,MAAM,kCAAkC,gHACgE,CAAC;AA8DhH;;;;;;;;GAQG;AACH,wBAAgB,4BAA4B,CAC1C,SAAS,EAAE,MAAM,GAAG,GAAG,EACvB,GAAG,GAAE,QAAsB,GAC1B,GAAG,GAAG,SAAS,CAiBjB"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { AssistantMessage } from "../types";
|
|
2
|
+
/**
|
|
3
|
+
* Decide whether an assistant message represents a context-window overflow.
|
|
4
|
+
*
|
|
5
|
+
* Three signals are considered:
|
|
6
|
+
*
|
|
7
|
+
* 1. Error text: an `error` message whose `errorMessage` matches a known
|
|
8
|
+
* overflow signature (and is not excluded as a throttling/rate-limit error).
|
|
9
|
+
* 2. Silent overflow: a successful `stop` message whose reported input tokens
|
|
10
|
+
* exceed the supplied context window (e.g. z.ai accepts the request anyway).
|
|
11
|
+
* 3. Length-stop overflow: a `length` stop with zero output where the input
|
|
12
|
+
* nearly fills the context window, i.e. the server truncated an oversized
|
|
13
|
+
* prompt leaving no room to generate (e.g. Xiaomi MiMo).
|
|
14
|
+
*
|
|
15
|
+
* Cases 2 and 3 require the optional `contextWindow` argument. The function is
|
|
16
|
+
* total: it never throws for any message shape.
|
|
17
|
+
*
|
|
18
|
+
* @param message - The assistant message to classify.
|
|
19
|
+
* @param contextWindow - Optional context-window size enabling silent-overflow
|
|
20
|
+
* and length-stop detection.
|
|
21
|
+
*/
|
|
22
|
+
export declare function isContextOverflow(message: AssistantMessage, contextWindow?: number): boolean;
|
|
23
|
+
/** Return a copy of the overflow error signatures (primarily for tests). */
|
|
24
|
+
export declare function getOverflowPatterns(): RegExp[];
|
|
25
|
+
//# sourceMappingURL=overflow.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"overflow.d.ts","sourceRoot":"","sources":["../../src/utils/overflow.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAuEjD;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,gBAAgB,EAAE,aAAa,CAAC,EAAE,MAAM,GAAG,OAAO,CAuB5F;AAED,4EAA4E;AAC5E,wBAAgB,mBAAmB,IAAI,MAAM,EAAE,CAE9C"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Strip unpaired UTF-16 surrogate code units from a string. Unpaired
|
|
3
|
+
* surrogates break JSON serialization at many providers; correctly paired
|
|
4
|
+
* surrogates (valid emoji and other astral-plane characters) are preserved.
|
|
5
|
+
*
|
|
6
|
+
* @example sanitizeSurrogates("Hello \u{1F648} World") // => "Hello \u{1F648} World"
|
|
7
|
+
*/
|
|
8
|
+
export declare function sanitizeSurrogates(text: string): string;
|
|
9
|
+
//# sourceMappingURL=sanitize-unicode.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sanitize-unicode.d.ts","sourceRoot":"","sources":["../../src/utils/sanitize-unicode.ts"],"names":[],"mappings":"AAGA;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEvD"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A decoded Server-Sent Event: the `event:` type (or null), the joined `data:`
|
|
3
|
+
* payload, and the raw source lines (for diagnostics on a parse failure).
|
|
4
|
+
*/
|
|
5
|
+
export interface ServerSentEvent {
|
|
6
|
+
event: string | null;
|
|
7
|
+
data: string;
|
|
8
|
+
raw: string[];
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Parse a `ReadableStream` of bytes into Server-Sent Events. Handles `\n`,
|
|
12
|
+
* `\r`, and `\r\n` line breaks and flushes a trailing event at end-of-stream.
|
|
13
|
+
* Throws `Request was aborted` if `signal` aborts mid-read.
|
|
14
|
+
*/
|
|
15
|
+
export declare function iterateServerSentEvents(body: ReadableStream<Uint8Array>, signal?: AbortSignal): AsyncGenerator<ServerSentEvent>;
|
|
16
|
+
/**
|
|
17
|
+
* Parse SSE events from an in-memory string. Convenience wrapper used by tests
|
|
18
|
+
* to feed canned SSE through the same decoder the network path uses.
|
|
19
|
+
*/
|
|
20
|
+
export declare function parseServerSentEventsFromString(text: string): Generator<ServerSentEvent>;
|
|
21
|
+
//# sourceMappingURL=sse.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sse.d.ts","sourceRoot":"","sources":["../../src/utils/sse.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,EAAE,CAAC;CACf;AAmED;;;;GAIG;AACH,wBAAuB,uBAAuB,CAC5C,IAAI,EAAE,cAAc,CAAC,UAAU,CAAC,EAChC,MAAM,CAAC,EAAE,WAAW,GACnB,cAAc,CAAC,eAAe,CAAC,CAyCjC;AAED;;;GAGG;AACH,wBAAiB,+BAA+B,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,CAAC,eAAe,CAAC,CAgBzF"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { type TUnsafe } from "@sinclair/typebox";
|
|
2
|
+
import type { Tool, ToolCall } from "./types";
|
|
3
|
+
export type { Static, TSchema } from "@sinclair/typebox";
|
|
4
|
+
export { Type } from "@sinclair/typebox";
|
|
5
|
+
/**
|
|
6
|
+
* Build a JSON-Schema string-enum (`{ type: "string", enum: [...] }`). This is
|
|
7
|
+
* compatible with providers (e.g. Google) that reject `anyOf`/`const` unions.
|
|
8
|
+
*
|
|
9
|
+
* @example const Op = StringEnum(["add", "sub"], { description: "operation" });
|
|
10
|
+
*/
|
|
11
|
+
export declare function StringEnum<T extends readonly string[]>(values: T, options?: {
|
|
12
|
+
description?: string;
|
|
13
|
+
default?: T[number];
|
|
14
|
+
}): TUnsafe<T[number]>;
|
|
15
|
+
/**
|
|
16
|
+
* Find a tool by name and validate the call's arguments against its schema.
|
|
17
|
+
* @throws if the tool is missing or validation fails.
|
|
18
|
+
*/
|
|
19
|
+
export declare function validateToolCall(tools: Tool[], toolCall: ToolCall): Record<string, any>;
|
|
20
|
+
/**
|
|
21
|
+
* Validate (and coerce) a tool call's arguments against the tool schema.
|
|
22
|
+
*
|
|
23
|
+
* The args are cloned, then validated by the appropriate engine: TypeBox
|
|
24
|
+
* schemas (carrying the `Kind` metadata symbol) go through `Value.Convert` +
|
|
25
|
+
* a compiled `TypeCheck`; plain JSON schemas go through AJV (which compiles to
|
|
26
|
+
* a guard and performs permissive in-place type coercion). On failure a
|
|
27
|
+
* multi-line error listing each failing path plus the received arguments is
|
|
28
|
+
* thrown.
|
|
29
|
+
*/
|
|
30
|
+
export declare function validateToolArguments(tool: Tool, toolCall: ToolCall): Record<string, any>;
|
|
31
|
+
//# sourceMappingURL=validation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validation.d.ts","sourceRoot":"","sources":["../src/validation.ts"],"names":[],"mappings":"AAAA,OAAO,EAAmC,KAAK,OAAO,EAAQ,MAAM,mBAAmB,CAAC;AAIxF,OAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAE9C,YAAY,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AACzD,OAAO,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AAEzC;;;;;GAKG;AACH,wBAAgB,UAAU,CAAC,CAAC,SAAS,SAAS,MAAM,EAAE,EACpD,MAAM,EAAE,CAAC,EACT,OAAO,CAAC,EAAE;IAAE,WAAW,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,CAAA;CAAE,GACtD,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAOpB;AAqHD;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,QAAQ,EAAE,QAAQ,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAMvF;AAED;;;;;;;;;GASG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CASzF"}
|
package/package.json
ADDED
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@ap3x/ai",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Unified multi-provider LLM API (OpenAI, Anthropic, Google, Bedrock, Mistral, …)",
|
|
5
|
+
"repository": {
|
|
6
|
+
"type": "git",
|
|
7
|
+
"url": "git+https://github.com/AP3X-Dev/AP3X.git",
|
|
8
|
+
"directory": "packages/ai"
|
|
9
|
+
},
|
|
10
|
+
"license": "MIT",
|
|
11
|
+
"publishConfig": {
|
|
12
|
+
"access": "public"
|
|
13
|
+
},
|
|
14
|
+
"type": "module",
|
|
15
|
+
"main": "./dist/index.js",
|
|
16
|
+
"types": "./dist/index.d.ts",
|
|
17
|
+
"exports": {
|
|
18
|
+
".": {
|
|
19
|
+
"types": "./dist/index.d.ts",
|
|
20
|
+
"default": "./dist/index.js"
|
|
21
|
+
}
|
|
22
|
+
},
|
|
23
|
+
"files": ["dist"],
|
|
24
|
+
"scripts": {
|
|
25
|
+
"build": "tsup src/index.ts --format esm --clean --tsconfig tsconfig.build.json && tsc -p tsconfig.build.json",
|
|
26
|
+
"prepublishOnly": "node ../../scripts/publish-gate.mjs",
|
|
27
|
+
"test": "vitest run"
|
|
28
|
+
},
|
|
29
|
+
"dependencies": {
|
|
30
|
+
"@sinclair/typebox": "^0.34.49",
|
|
31
|
+
"ajv": "^8.20.0",
|
|
32
|
+
"partial-json": "^0.1.7",
|
|
33
|
+
"undici": "^6.21.3"
|
|
34
|
+
}
|
|
35
|
+
}
|