ainvoker 2.0.0 → 3.0.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/README.md +67 -23
- package/dist/index.cjs +6 -7
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +56 -11
- package/dist/index.d.ts +56 -11
- package/dist/index.js +6 -7
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -2,13 +2,19 @@
|
|
|
2
2
|
|
|
3
3
|
Official TypeScript/JavaScript SDK for the AInvoker AI gateway.
|
|
4
4
|
|
|
5
|
+
[Docs](https://ainvoker.com/docs/sdk) · [Getting started](https://ainvoker.com/docs/getting-started) · [API](https://ainvoker-api.onrender.com)
|
|
6
|
+
|
|
7
|
+
AInvoker is an AI gateway. This package calls one HTTP API and routes to providers such as OpenAI and Gemini. Create projects, API keys, and billing in the [dashboard](https://ainvoker.com). Use the SDK to call models from your application.
|
|
8
|
+
|
|
9
|
+
Current release: **2.0.0** (`ai.text.chat` for `POST /v1/text/chat`).
|
|
10
|
+
|
|
5
11
|
## Install
|
|
6
12
|
|
|
7
13
|
```bash
|
|
8
14
|
npm install ainvoker
|
|
9
15
|
```
|
|
10
16
|
|
|
11
|
-
Requires Node.js 18+ (native `fetch`).
|
|
17
|
+
Requires Node.js 18+ (native `fetch`). The package ships ESM and CommonJS.
|
|
12
18
|
|
|
13
19
|
## Quick start
|
|
14
20
|
|
|
@@ -17,13 +23,13 @@ import { AInvoker, isAInvokerError } from "ainvoker"
|
|
|
17
23
|
|
|
18
24
|
const ai = new AInvoker({
|
|
19
25
|
apiKey: process.env.AINVOKER_API_KEY!,
|
|
20
|
-
// optional — defaults to
|
|
21
|
-
// baseUrl: "https://api.example.com",
|
|
26
|
+
// optional — defaults to https://ainvoker-api.onrender.com
|
|
22
27
|
})
|
|
23
28
|
|
|
24
29
|
try {
|
|
25
30
|
const result = await ai.text.chat({
|
|
26
|
-
|
|
31
|
+
provider: "openai",
|
|
32
|
+
model: "gpt-4o-mini",
|
|
27
33
|
messages: [{ role: "user", content: "Hello" }],
|
|
28
34
|
})
|
|
29
35
|
console.log(result.message.content)
|
|
@@ -36,34 +42,72 @@ try {
|
|
|
36
42
|
}
|
|
37
43
|
```
|
|
38
44
|
|
|
39
|
-
|
|
45
|
+
1. [Sign up](https://ainvoker.com/signup) and open your Personal workspace.
|
|
46
|
+
2. Create a project and an API key (`ain_…`). Keep it server-side.
|
|
47
|
+
3. Call `ai.text.chat`. See [Getting Started](https://ainvoker.com/docs/getting-started).
|
|
40
48
|
|
|
41
|
-
|
|
49
|
+
## Client options
|
|
42
50
|
|
|
43
|
-
|
|
44
|
-
|
|
51
|
+
| Option | Required | Notes |
|
|
52
|
+
| --- | --- | --- |
|
|
53
|
+
| `apiKey` | Yes | Project key starting with `ain_`. Sent as `Authorization: Bearer`. |
|
|
54
|
+
| `baseUrl` | No | Defaults to `https://ainvoker-api.onrender.com`. |
|
|
45
55
|
|
|
46
|
-
|
|
47
|
-
npm run smoke
|
|
48
|
-
```
|
|
56
|
+
## Text chat
|
|
49
57
|
|
|
50
|
-
|
|
58
|
+
`ai.text.chat(params)` calls `POST /v1/text/chat` and unwraps the `{ data }` envelope.
|
|
51
59
|
|
|
52
|
-
|
|
60
|
+
| Field | Required | Notes |
|
|
61
|
+
| --- | --- | --- |
|
|
62
|
+
| `provider` | No | Catalog provider, for example `openai` or `gemini`. When set, autocomplete narrows `model` to that provider. When a `model` is chosen first, autocomplete narrows `provider` to matching providers. |
|
|
63
|
+
| `model` | Yes | Short model name (for example `gpt-4o-mini`). With `provider`, the SDK sends `provider/model`. Without `provider`, the bare name is sent and the API resolves it when unique. |
|
|
64
|
+
| `messages` | Yes | At least one message. Roles: `system`, `user`, `assistant`. |
|
|
65
|
+
| `temperature` | No | Sampling temperature from 0 to 2. |
|
|
66
|
+
| `maxTokens` | No | Maximum tokens to generate. When omitted, the gateway reserves and caps output at 8192. |
|
|
53
67
|
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
68
|
+
The result is `{ id, model, message, usage }`. `usage` is `{ inputTokens, outputTokens, totalTokens }` or `null` when the gateway does not report it.
|
|
69
|
+
|
|
70
|
+
For Gemini models, include at least one `user` or `assistant` message. A system-only prompt is not enough. Streaming is not available.
|
|
71
|
+
|
|
72
|
+
Model catalog and plan limits: [Models](https://ainvoker.com/docs/models) · [Limits](https://ainvoker.com/docs/limits).
|
|
73
|
+
|
|
74
|
+
## Errors
|
|
59
75
|
|
|
60
|
-
|
|
76
|
+
Failures throw `AInvokerError` (`status`, `code`, `message`, and `body` when the response was parsed). Use `isAInvokerError` to narrow the type.
|
|
61
77
|
|
|
62
|
-
|
|
78
|
+
| HTTP | Code | Typical cause |
|
|
79
|
+
| --- | --- | --- |
|
|
80
|
+
| 400 | `VALIDATION_ERROR` | Invalid request body |
|
|
81
|
+
| 401 | `UNAUTHORIZED` | Missing, invalid, or expired API key |
|
|
82
|
+
| 402 | `SUBSCRIPTION_REQUIRED` | No active plan on the workspace |
|
|
83
|
+
| 403 | `FORBIDDEN` | Access denied for this project |
|
|
84
|
+
| 403 | `MODEL_NOT_ALLOWED_ON_PLAN` | Model not available on your plan |
|
|
85
|
+
| 403 | `MODEL_DISABLED` | Model disabled on the project allowlist |
|
|
86
|
+
| 404 | `NOT_FOUND` | Unknown model |
|
|
87
|
+
| 429 | `RATE_LIMIT_EXCEEDED` | Monthly request or token quota |
|
|
88
|
+
| 500 | `INTERNAL_ERROR` | Unexpected server error |
|
|
89
|
+
| 502 | `UPSTREAM_ERROR` | Upstream provider failed |
|
|
90
|
+
|
|
91
|
+
Client-side codes (no HTTP success body): `NETWORK_ERROR`, `INVALID_RESPONSE`, `HTTP_ERROR`.
|
|
92
|
+
|
|
93
|
+
See [Errors](https://ainvoker.com/docs/errors).
|
|
94
|
+
|
|
95
|
+
## Browser
|
|
96
|
+
|
|
97
|
+
Do not put `ain_` keys in frontend code. The supported pattern is: the browser calls your backend, and your server uses this SDK with `AINVOKER_API_KEY`.
|
|
98
|
+
|
|
99
|
+
Direct browser calls also need the app origin under **Project → Settings → Allowed app URLs** (exact scheme, host, and port). Node and other server calls have no `Origin` header and do not need an entry. Origin allowlisting does not hide a key shipped in a bundle.
|
|
100
|
+
|
|
101
|
+
See [Browser usage](https://ainvoker.com/docs/sdk/browser).
|
|
102
|
+
|
|
103
|
+
## Local smoke
|
|
63
104
|
|
|
64
105
|
```bash
|
|
65
|
-
npm run
|
|
66
|
-
npm publish # requires npm login + @ainvoker org access
|
|
106
|
+
AINVOKER_API_KEY=ain_... npm run smoke
|
|
67
107
|
```
|
|
68
108
|
|
|
69
|
-
`
|
|
109
|
+
Optional: `AINVOKER_BASE_URL`, `AINVOKER_MODEL` (defaults to `openai/gpt-4o-mini` as a slug; omit `provider` in smoke and send the env value as `model`).
|
|
110
|
+
|
|
111
|
+
## License
|
|
112
|
+
|
|
113
|
+
MIT
|
package/dist/index.cjs
CHANGED
|
@@ -103,14 +103,13 @@ var TextResource = class {
|
|
|
103
103
|
this.http = http;
|
|
104
104
|
}
|
|
105
105
|
http;
|
|
106
|
-
/**
|
|
107
|
-
* Text chat completion via the AInvoker gateway (`POST /v1/text/chat`).
|
|
108
|
-
*
|
|
109
|
-
* Authenticate with a project API key. `model` must be a `provider/model`
|
|
110
|
-
* slug (e.g. `"openai/gpt-4o-mini"` or `"gemini/gemini-2.5-flash"`).
|
|
111
|
-
*/
|
|
112
106
|
chat(params) {
|
|
113
|
-
|
|
107
|
+
const { provider, model, ...rest } = params;
|
|
108
|
+
const gatewayModel = provider !== void 0 && provider !== "" ? `${provider}/${model}` : model;
|
|
109
|
+
return this.http.post("/v1/text/chat", {
|
|
110
|
+
...rest,
|
|
111
|
+
model: gatewayModel
|
|
112
|
+
});
|
|
114
113
|
}
|
|
115
114
|
};
|
|
116
115
|
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/errors.ts","../src/http.ts","../src/resources/text.ts","../src/client.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"sources":["../src/errors.ts","../src/http.ts","../src/resources/text.ts","../src/client.ts"],"names":[],"mappings":"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","file":"index.cjs","sourcesContent":["/**\r\n * Known AInvoker API / SDK error codes.\r\n * Unknown server codes remain assignable via the open string union.\r\n */\r\nexport type AInvokerErrorCode =\r\n | \"UNAUTHORIZED\"\r\n | \"FORBIDDEN\"\r\n | \"NOT_FOUND\"\r\n | \"VALIDATION_ERROR\"\r\n | \"CONFLICT\"\r\n | \"UPSTREAM_ERROR\"\r\n | \"INTERNAL_ERROR\"\r\n | \"NETWORK_ERROR\"\r\n | \"INVALID_RESPONSE\"\r\n | \"HTTP_ERROR\"\r\n | (string & {})\r\n\r\n/**\r\n * Error thrown when the AInvoker API returns a non-success response\r\n * or the response body cannot be parsed as expected.\r\n */\r\nexport class AInvokerError extends Error {\r\n readonly status: number\r\n readonly code: AInvokerErrorCode\r\n /** Parsed response body when available (error envelope or raw JSON). */\r\n readonly body: unknown\r\n\r\n constructor(\r\n status: number,\r\n code: AInvokerErrorCode,\r\n message: string,\r\n body: unknown = undefined,\r\n ) {\r\n super(message)\r\n this.name = \"AInvokerError\"\r\n this.status = status\r\n this.code = code\r\n this.body = body\r\n }\r\n}\r\n\r\n/** Type guard for {@link AInvokerError}. */\r\nexport function isAInvokerError(error: unknown): error is AInvokerError {\r\n return error instanceof AInvokerError\r\n}\r\n","import { AInvokerError } from \"./errors.js\"\r\nimport type { AInvokerErrorCode } from \"./errors.js\"\r\nimport type { DataEnvelope } from \"./types.js\"\r\n\r\nexport interface HttpClientOptions {\r\n apiKey: string\r\n baseUrl: string\r\n}\r\n\r\nfunction isRecord(value: unknown): value is Record<string, unknown> {\r\n return value !== null && typeof value === \"object\"\r\n}\r\n\r\nfunction parseErrorPayload(json: unknown): { code: AInvokerErrorCode; message: string } | null {\r\n if (!isRecord(json) || !isRecord(json.error)) {\r\n return null\r\n }\r\n const { code, message } = json.error\r\n if (typeof code !== \"string\" || typeof message !== \"string\") {\r\n return null\r\n }\r\n return { code, message }\r\n}\r\n\r\nfunction hasDataEnvelope(json: unknown): json is DataEnvelope<unknown> {\r\n return isRecord(json) && \"data\" in json\r\n}\r\n\r\nexport class HttpClient {\r\n private readonly apiKey: string\r\n private readonly baseUrl: string\r\n\r\n constructor(options: HttpClientOptions) {\r\n this.apiKey = options.apiKey\r\n this.baseUrl = options.baseUrl.replace(/\\/+$/, \"\")\r\n }\r\n\r\n /**\r\n * POST JSON to a path under `baseUrl`. Unwraps `{ data: T }` on success.\r\n */\r\n async post<T>(path: string, body: unknown): Promise<T> {\r\n const url = `${this.baseUrl}${path.startsWith(\"/\") ? path : `/${path}`}`\r\n\r\n let response: Response\r\n try {\r\n response = await fetch(url, {\r\n method: \"POST\",\r\n headers: {\r\n Authorization: `Bearer ${this.apiKey}`,\r\n \"Content-Type\": \"application/json\",\r\n Accept: \"application/json\",\r\n },\r\n body: JSON.stringify(body),\r\n })\r\n } catch (cause) {\r\n const message = cause instanceof Error ? cause.message : \"Network request failed\"\r\n throw new AInvokerError(0, \"NETWORK_ERROR\", message)\r\n }\r\n\r\n const text = await response.text()\r\n let json: unknown = undefined\r\n if (text.length > 0) {\r\n try {\r\n json = JSON.parse(text) as unknown\r\n } catch {\r\n throw new AInvokerError(\r\n response.status,\r\n \"INVALID_RESPONSE\",\r\n \"Response body was not valid JSON\",\r\n text,\r\n )\r\n }\r\n }\r\n\r\n if (!response.ok) {\r\n const parsed = parseErrorPayload(json)\r\n throw new AInvokerError(\r\n response.status,\r\n parsed?.code ?? \"HTTP_ERROR\",\r\n parsed?.message ?? `Request failed with status ${response.status}`,\r\n json,\r\n )\r\n }\r\n\r\n if (!hasDataEnvelope(json)) {\r\n throw new AInvokerError(\r\n response.status,\r\n \"INVALID_RESPONSE\",\r\n \"Response missing data envelope\",\r\n json,\r\n )\r\n }\r\n\r\n return json.data as T\r\n }\r\n}\r\n","import type { HttpClient } from \"../http.js\"\r\nimport type {\r\n TextChatEscapeParams,\r\n TextChatParams,\r\n TextChatResult,\r\n} from \"../types.js\"\r\n\r\n/**\r\n * Text modality methods (`/v1/text/...`).\r\n */\r\nexport class TextResource {\r\n constructor(private readonly http: HttpClient) {}\r\n\r\n /**\r\n * Text chat completion via the AInvoker gateway (`POST /v1/text/chat`).\r\n *\r\n * Pass `provider` and `model` for typed autocomplete. When `provider` is set,\r\n * the SDK joins them into a `provider/model` slug. When `provider` is omitted,\r\n * the bare `model` name is sent and the API resolves it.\r\n */\r\n chat(params: TextChatParams): Promise<TextChatResult>\r\n chat<P extends string, M extends string>(\r\n params: TextChatEscapeParams<P, M>,\r\n ): Promise<TextChatResult>\r\n chat(\r\n params: TextChatParams | TextChatEscapeParams<string, string>,\r\n ): Promise<TextChatResult> {\r\n const { provider, model, ...rest } = params\r\n const gatewayModel =\r\n provider !== undefined && provider !== \"\"\r\n ? `${provider}/${model}`\r\n : model\r\n\r\n return this.http.post<TextChatResult>(\"/v1/text/chat\", {\r\n ...rest,\r\n model: gatewayModel,\r\n })\r\n }\r\n}\r\n","import { HttpClient } from \"./http.js\"\r\nimport { TextResource } from \"./resources/text.js\"\r\nimport type { AInvokerOptions } from \"./types.js\"\r\n\r\nconst DEFAULT_BASE_URL = \"https://ainvoker-api.onrender.com\"\r\n\r\n/**\r\n * Official AInvoker SDK client.\r\n *\r\n * Use modality namespaces such as {@link AInvoker.text} for gateway calls.\r\n */\r\nexport class AInvoker {\r\n /** Text modality (`/v1/text/...`). */\r\n readonly text: TextResource\r\n\r\n constructor(options: AInvokerOptions) {\r\n if (!options.apiKey || options.apiKey.trim().length === 0) {\r\n throw new Error(\"AInvoker: apiKey is required\")\r\n }\r\n\r\n const http = new HttpClient({\r\n apiKey: options.apiKey,\r\n baseUrl: options.baseUrl ?? DEFAULT_BASE_URL,\r\n })\r\n\r\n this.text = new TextResource(http)\r\n }\r\n}\r\n"]}
|
package/dist/index.d.cts
CHANGED
|
@@ -35,19 +35,62 @@ interface ChatMessage {
|
|
|
35
35
|
content: string;
|
|
36
36
|
}
|
|
37
37
|
/**
|
|
38
|
-
*
|
|
38
|
+
* Hardcoded text catalog (provider → models). Keep in sync with the API seed.
|
|
39
|
+
* Do not fetch models to generate these types.
|
|
39
40
|
*/
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
41
|
+
type TextCatalog = {
|
|
42
|
+
openai: "gpt-4o-mini";
|
|
43
|
+
gemini: "gemini-3.6-flash";
|
|
44
|
+
};
|
|
45
|
+
type TextProvider = keyof TextCatalog;
|
|
46
|
+
type TextModel = TextCatalog[TextProvider];
|
|
47
|
+
/** Exact provider/model pairs for bidirectional autocomplete. */
|
|
48
|
+
type TextCatalogPair = {
|
|
49
|
+
[P in TextProvider]: {
|
|
50
|
+
provider: P;
|
|
51
|
+
model: TextCatalog[P];
|
|
52
|
+
};
|
|
53
|
+
}[TextProvider];
|
|
54
|
+
type TextChatFields = {
|
|
45
55
|
messages: ChatMessage[];
|
|
46
56
|
/** Sampling temperature (0–2). */
|
|
47
57
|
temperature?: number;
|
|
48
|
-
/**
|
|
58
|
+
/**
|
|
59
|
+
* Maximum tokens to generate.
|
|
60
|
+
* When omitted, the gateway reserves and caps output at 8192.
|
|
61
|
+
*/
|
|
49
62
|
maxTokens?: number;
|
|
50
|
-
}
|
|
63
|
+
};
|
|
64
|
+
/**
|
|
65
|
+
* Provider omitted: model may be any catalog name (or a future API name).
|
|
66
|
+
* The SDK sends the bare model string; the API resolves it.
|
|
67
|
+
*/
|
|
68
|
+
type TextChatWithoutProvider = {
|
|
69
|
+
provider?: undefined;
|
|
70
|
+
model: TextModel | (string & {});
|
|
71
|
+
} & TextChatFields;
|
|
72
|
+
/**
|
|
73
|
+
* Parameters for {@link TextResource.chat}.
|
|
74
|
+
*
|
|
75
|
+
* In the same object literal:
|
|
76
|
+
* - Neither field written: both suggest the full catalog.
|
|
77
|
+
* - `provider` set: `model` narrows to that provider’s models.
|
|
78
|
+
* - `model` set: `provider` narrows to providers that have that model.
|
|
79
|
+
*/
|
|
80
|
+
type TextChatParams = (TextCatalogPair & TextChatFields) | TextChatWithoutProvider;
|
|
81
|
+
/**
|
|
82
|
+
* Reject known catalog mismatches while allowing unknown strings for forward compat.
|
|
83
|
+
*/
|
|
84
|
+
type TextChatEscapeParams<P extends string = string, M extends string = string> = P extends TextProvider ? M extends TextModel ? M extends TextCatalog[P] ? {
|
|
85
|
+
provider: P;
|
|
86
|
+
model: M;
|
|
87
|
+
} & TextChatFields : never : {
|
|
88
|
+
provider: P;
|
|
89
|
+
model: M;
|
|
90
|
+
} & TextChatFields : {
|
|
91
|
+
provider: P;
|
|
92
|
+
model: M;
|
|
93
|
+
} & TextChatFields;
|
|
51
94
|
/**
|
|
52
95
|
* Token usage reported by the gateway (may be null).
|
|
53
96
|
*/
|
|
@@ -75,10 +118,12 @@ declare class TextResource {
|
|
|
75
118
|
/**
|
|
76
119
|
* Text chat completion via the AInvoker gateway (`POST /v1/text/chat`).
|
|
77
120
|
*
|
|
78
|
-
*
|
|
79
|
-
*
|
|
121
|
+
* Pass `provider` and `model` for typed autocomplete. When `provider` is set,
|
|
122
|
+
* the SDK joins them into a `provider/model` slug. When `provider` is omitted,
|
|
123
|
+
* the bare `model` name is sent and the API resolves it.
|
|
80
124
|
*/
|
|
81
125
|
chat(params: TextChatParams): Promise<TextChatResult>;
|
|
126
|
+
chat<P extends string, M extends string>(params: TextChatEscapeParams<P, M>): Promise<TextChatResult>;
|
|
82
127
|
}
|
|
83
128
|
|
|
84
129
|
/**
|
|
@@ -111,4 +156,4 @@ declare class AInvokerError extends Error {
|
|
|
111
156
|
/** Type guard for {@link AInvokerError}. */
|
|
112
157
|
declare function isAInvokerError(error: unknown): error is AInvokerError;
|
|
113
158
|
|
|
114
|
-
export { AInvoker, AInvokerError, type AInvokerErrorCode, type AInvokerOptions, type ChatMessage, type ChatUsage, type TextChatParams, type TextChatResult, isAInvokerError };
|
|
159
|
+
export { AInvoker, AInvokerError, type AInvokerErrorCode, type AInvokerOptions, type ChatMessage, type ChatUsage, type TextCatalog, type TextCatalogPair, type TextChatEscapeParams, type TextChatParams, type TextChatResult, type TextModel, type TextProvider, isAInvokerError };
|
package/dist/index.d.ts
CHANGED
|
@@ -35,19 +35,62 @@ interface ChatMessage {
|
|
|
35
35
|
content: string;
|
|
36
36
|
}
|
|
37
37
|
/**
|
|
38
|
-
*
|
|
38
|
+
* Hardcoded text catalog (provider → models). Keep in sync with the API seed.
|
|
39
|
+
* Do not fetch models to generate these types.
|
|
39
40
|
*/
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
41
|
+
type TextCatalog = {
|
|
42
|
+
openai: "gpt-4o-mini";
|
|
43
|
+
gemini: "gemini-3.6-flash";
|
|
44
|
+
};
|
|
45
|
+
type TextProvider = keyof TextCatalog;
|
|
46
|
+
type TextModel = TextCatalog[TextProvider];
|
|
47
|
+
/** Exact provider/model pairs for bidirectional autocomplete. */
|
|
48
|
+
type TextCatalogPair = {
|
|
49
|
+
[P in TextProvider]: {
|
|
50
|
+
provider: P;
|
|
51
|
+
model: TextCatalog[P];
|
|
52
|
+
};
|
|
53
|
+
}[TextProvider];
|
|
54
|
+
type TextChatFields = {
|
|
45
55
|
messages: ChatMessage[];
|
|
46
56
|
/** Sampling temperature (0–2). */
|
|
47
57
|
temperature?: number;
|
|
48
|
-
/**
|
|
58
|
+
/**
|
|
59
|
+
* Maximum tokens to generate.
|
|
60
|
+
* When omitted, the gateway reserves and caps output at 8192.
|
|
61
|
+
*/
|
|
49
62
|
maxTokens?: number;
|
|
50
|
-
}
|
|
63
|
+
};
|
|
64
|
+
/**
|
|
65
|
+
* Provider omitted: model may be any catalog name (or a future API name).
|
|
66
|
+
* The SDK sends the bare model string; the API resolves it.
|
|
67
|
+
*/
|
|
68
|
+
type TextChatWithoutProvider = {
|
|
69
|
+
provider?: undefined;
|
|
70
|
+
model: TextModel | (string & {});
|
|
71
|
+
} & TextChatFields;
|
|
72
|
+
/**
|
|
73
|
+
* Parameters for {@link TextResource.chat}.
|
|
74
|
+
*
|
|
75
|
+
* In the same object literal:
|
|
76
|
+
* - Neither field written: both suggest the full catalog.
|
|
77
|
+
* - `provider` set: `model` narrows to that provider’s models.
|
|
78
|
+
* - `model` set: `provider` narrows to providers that have that model.
|
|
79
|
+
*/
|
|
80
|
+
type TextChatParams = (TextCatalogPair & TextChatFields) | TextChatWithoutProvider;
|
|
81
|
+
/**
|
|
82
|
+
* Reject known catalog mismatches while allowing unknown strings for forward compat.
|
|
83
|
+
*/
|
|
84
|
+
type TextChatEscapeParams<P extends string = string, M extends string = string> = P extends TextProvider ? M extends TextModel ? M extends TextCatalog[P] ? {
|
|
85
|
+
provider: P;
|
|
86
|
+
model: M;
|
|
87
|
+
} & TextChatFields : never : {
|
|
88
|
+
provider: P;
|
|
89
|
+
model: M;
|
|
90
|
+
} & TextChatFields : {
|
|
91
|
+
provider: P;
|
|
92
|
+
model: M;
|
|
93
|
+
} & TextChatFields;
|
|
51
94
|
/**
|
|
52
95
|
* Token usage reported by the gateway (may be null).
|
|
53
96
|
*/
|
|
@@ -75,10 +118,12 @@ declare class TextResource {
|
|
|
75
118
|
/**
|
|
76
119
|
* Text chat completion via the AInvoker gateway (`POST /v1/text/chat`).
|
|
77
120
|
*
|
|
78
|
-
*
|
|
79
|
-
*
|
|
121
|
+
* Pass `provider` and `model` for typed autocomplete. When `provider` is set,
|
|
122
|
+
* the SDK joins them into a `provider/model` slug. When `provider` is omitted,
|
|
123
|
+
* the bare `model` name is sent and the API resolves it.
|
|
80
124
|
*/
|
|
81
125
|
chat(params: TextChatParams): Promise<TextChatResult>;
|
|
126
|
+
chat<P extends string, M extends string>(params: TextChatEscapeParams<P, M>): Promise<TextChatResult>;
|
|
82
127
|
}
|
|
83
128
|
|
|
84
129
|
/**
|
|
@@ -111,4 +156,4 @@ declare class AInvokerError extends Error {
|
|
|
111
156
|
/** Type guard for {@link AInvokerError}. */
|
|
112
157
|
declare function isAInvokerError(error: unknown): error is AInvokerError;
|
|
113
158
|
|
|
114
|
-
export { AInvoker, AInvokerError, type AInvokerErrorCode, type AInvokerOptions, type ChatMessage, type ChatUsage, type TextChatParams, type TextChatResult, isAInvokerError };
|
|
159
|
+
export { AInvoker, AInvokerError, type AInvokerErrorCode, type AInvokerOptions, type ChatMessage, type ChatUsage, type TextCatalog, type TextCatalogPair, type TextChatEscapeParams, type TextChatParams, type TextChatResult, type TextModel, type TextProvider, isAInvokerError };
|
package/dist/index.js
CHANGED
|
@@ -101,14 +101,13 @@ var TextResource = class {
|
|
|
101
101
|
this.http = http;
|
|
102
102
|
}
|
|
103
103
|
http;
|
|
104
|
-
/**
|
|
105
|
-
* Text chat completion via the AInvoker gateway (`POST /v1/text/chat`).
|
|
106
|
-
*
|
|
107
|
-
* Authenticate with a project API key. `model` must be a `provider/model`
|
|
108
|
-
* slug (e.g. `"openai/gpt-4o-mini"` or `"gemini/gemini-2.5-flash"`).
|
|
109
|
-
*/
|
|
110
104
|
chat(params) {
|
|
111
|
-
|
|
105
|
+
const { provider, model, ...rest } = params;
|
|
106
|
+
const gatewayModel = provider !== void 0 && provider !== "" ? `${provider}/${model}` : model;
|
|
107
|
+
return this.http.post("/v1/text/chat", {
|
|
108
|
+
...rest,
|
|
109
|
+
model: gatewayModel
|
|
110
|
+
});
|
|
112
111
|
}
|
|
113
112
|
};
|
|
114
113
|
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/errors.ts","../src/http.ts","../src/resources/text.ts","../src/client.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"sources":["../src/errors.ts","../src/http.ts","../src/resources/text.ts","../src/client.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["/**\r\n * Known AInvoker API / SDK error codes.\r\n * Unknown server codes remain assignable via the open string union.\r\n */\r\nexport type AInvokerErrorCode =\r\n | \"UNAUTHORIZED\"\r\n | \"FORBIDDEN\"\r\n | \"NOT_FOUND\"\r\n | \"VALIDATION_ERROR\"\r\n | \"CONFLICT\"\r\n | \"UPSTREAM_ERROR\"\r\n | \"INTERNAL_ERROR\"\r\n | \"NETWORK_ERROR\"\r\n | \"INVALID_RESPONSE\"\r\n | \"HTTP_ERROR\"\r\n | (string & {})\r\n\r\n/**\r\n * Error thrown when the AInvoker API returns a non-success response\r\n * or the response body cannot be parsed as expected.\r\n */\r\nexport class AInvokerError extends Error {\r\n readonly status: number\r\n readonly code: AInvokerErrorCode\r\n /** Parsed response body when available (error envelope or raw JSON). */\r\n readonly body: unknown\r\n\r\n constructor(\r\n status: number,\r\n code: AInvokerErrorCode,\r\n message: string,\r\n body: unknown = undefined,\r\n ) {\r\n super(message)\r\n this.name = \"AInvokerError\"\r\n this.status = status\r\n this.code = code\r\n this.body = body\r\n }\r\n}\r\n\r\n/** Type guard for {@link AInvokerError}. */\r\nexport function isAInvokerError(error: unknown): error is AInvokerError {\r\n return error instanceof AInvokerError\r\n}\r\n","import { AInvokerError } from \"./errors.js\"\r\nimport type { AInvokerErrorCode } from \"./errors.js\"\r\nimport type { DataEnvelope } from \"./types.js\"\r\n\r\nexport interface HttpClientOptions {\r\n apiKey: string\r\n baseUrl: string\r\n}\r\n\r\nfunction isRecord(value: unknown): value is Record<string, unknown> {\r\n return value !== null && typeof value === \"object\"\r\n}\r\n\r\nfunction parseErrorPayload(json: unknown): { code: AInvokerErrorCode; message: string } | null {\r\n if (!isRecord(json) || !isRecord(json.error)) {\r\n return null\r\n }\r\n const { code, message } = json.error\r\n if (typeof code !== \"string\" || typeof message !== \"string\") {\r\n return null\r\n }\r\n return { code, message }\r\n}\r\n\r\nfunction hasDataEnvelope(json: unknown): json is DataEnvelope<unknown> {\r\n return isRecord(json) && \"data\" in json\r\n}\r\n\r\nexport class HttpClient {\r\n private readonly apiKey: string\r\n private readonly baseUrl: string\r\n\r\n constructor(options: HttpClientOptions) {\r\n this.apiKey = options.apiKey\r\n this.baseUrl = options.baseUrl.replace(/\\/+$/, \"\")\r\n }\r\n\r\n /**\r\n * POST JSON to a path under `baseUrl`. Unwraps `{ data: T }` on success.\r\n */\r\n async post<T>(path: string, body: unknown): Promise<T> {\r\n const url = `${this.baseUrl}${path.startsWith(\"/\") ? path : `/${path}`}`\r\n\r\n let response: Response\r\n try {\r\n response = await fetch(url, {\r\n method: \"POST\",\r\n headers: {\r\n Authorization: `Bearer ${this.apiKey}`,\r\n \"Content-Type\": \"application/json\",\r\n Accept: \"application/json\",\r\n },\r\n body: JSON.stringify(body),\r\n })\r\n } catch (cause) {\r\n const message = cause instanceof Error ? cause.message : \"Network request failed\"\r\n throw new AInvokerError(0, \"NETWORK_ERROR\", message)\r\n }\r\n\r\n const text = await response.text()\r\n let json: unknown = undefined\r\n if (text.length > 0) {\r\n try {\r\n json = JSON.parse(text) as unknown\r\n } catch {\r\n throw new AInvokerError(\r\n response.status,\r\n \"INVALID_RESPONSE\",\r\n \"Response body was not valid JSON\",\r\n text,\r\n )\r\n }\r\n }\r\n\r\n if (!response.ok) {\r\n const parsed = parseErrorPayload(json)\r\n throw new AInvokerError(\r\n response.status,\r\n parsed?.code ?? \"HTTP_ERROR\",\r\n parsed?.message ?? `Request failed with status ${response.status}`,\r\n json,\r\n )\r\n }\r\n\r\n if (!hasDataEnvelope(json)) {\r\n throw new AInvokerError(\r\n response.status,\r\n \"INVALID_RESPONSE\",\r\n \"Response missing data envelope\",\r\n json,\r\n )\r\n }\r\n\r\n return json.data as T\r\n }\r\n}\r\n","import type { HttpClient } from \"../http.js\"\r\nimport type {\r\n TextChatEscapeParams,\r\n TextChatParams,\r\n TextChatResult,\r\n} from \"../types.js\"\r\n\r\n/**\r\n * Text modality methods (`/v1/text/...`).\r\n */\r\nexport class TextResource {\r\n constructor(private readonly http: HttpClient) {}\r\n\r\n /**\r\n * Text chat completion via the AInvoker gateway (`POST /v1/text/chat`).\r\n *\r\n * Pass `provider` and `model` for typed autocomplete. When `provider` is set,\r\n * the SDK joins them into a `provider/model` slug. When `provider` is omitted,\r\n * the bare `model` name is sent and the API resolves it.\r\n */\r\n chat(params: TextChatParams): Promise<TextChatResult>\r\n chat<P extends string, M extends string>(\r\n params: TextChatEscapeParams<P, M>,\r\n ): Promise<TextChatResult>\r\n chat(\r\n params: TextChatParams | TextChatEscapeParams<string, string>,\r\n ): Promise<TextChatResult> {\r\n const { provider, model, ...rest } = params\r\n const gatewayModel =\r\n provider !== undefined && provider !== \"\"\r\n ? `${provider}/${model}`\r\n : model\r\n\r\n return this.http.post<TextChatResult>(\"/v1/text/chat\", {\r\n ...rest,\r\n model: gatewayModel,\r\n })\r\n }\r\n}\r\n","import { HttpClient } from \"./http.js\"\r\nimport { TextResource } from \"./resources/text.js\"\r\nimport type { AInvokerOptions } from \"./types.js\"\r\n\r\nconst DEFAULT_BASE_URL = \"https://ainvoker-api.onrender.com\"\r\n\r\n/**\r\n * Official AInvoker SDK client.\r\n *\r\n * Use modality namespaces such as {@link AInvoker.text} for gateway calls.\r\n */\r\nexport class AInvoker {\r\n /** Text modality (`/v1/text/...`). */\r\n readonly text: TextResource\r\n\r\n constructor(options: AInvokerOptions) {\r\n if (!options.apiKey || options.apiKey.trim().length === 0) {\r\n throw new Error(\"AInvoker: apiKey is required\")\r\n }\r\n\r\n const http = new HttpClient({\r\n apiKey: options.apiKey,\r\n baseUrl: options.baseUrl ?? DEFAULT_BASE_URL,\r\n })\r\n\r\n this.text = new TextResource(http)\r\n }\r\n}\r\n"]}
|