@arnilo/prism-provider-zai 0.0.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/CHANGELOG.md +26 -0
- package/LICENSE +21 -0
- package/README.md +20 -0
- package/dist/index.d.ts +11 -0
- package/dist/index.js +20 -0
- package/dist/models.d.ts +11 -0
- package/dist/models.js +18 -0
- package/dist/provider.d.ts +10 -0
- package/dist/provider.js +153 -0
- package/dist/sse.d.ts +1 -0
- package/dist/sse.js +24 -0
- package/dist/thinking.d.ts +4 -0
- package/dist/thinking.js +17 -0
- package/package.json +57 -0
package/CHANGELOG.md
ADDED
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
All notable changes to @arnilo/prism-provider-zai will be documented in this file.
|
|
4
|
+
|
|
5
|
+
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
|
|
6
|
+
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
7
|
+
|
|
8
|
+
## [Unreleased]
|
|
9
|
+
|
|
10
|
+
### Added
|
|
11
|
+
|
|
12
|
+
- Added `LICENSE` (MIT) and `CHANGELOG.md`.
|
|
13
|
+
- Added npm package metadata: `license`, `repository`, `bugs`, `homepage`,
|
|
14
|
+
`keywords`, and `sideEffects`.
|
|
15
|
+
|
|
16
|
+
### Changed
|
|
17
|
+
|
|
18
|
+
- `files` whitelist now explicitly excludes `dist/__tests__/` and
|
|
19
|
+
`dist/**/*.map` from published tarballs.
|
|
20
|
+
- Made `prism` a required peer dependency; it is no longer optional.
|
|
21
|
+
|
|
22
|
+
## [0.0.1] - 2026-06-22
|
|
23
|
+
|
|
24
|
+
### Added
|
|
25
|
+
|
|
26
|
+
- Initial release of @arnilo/prism-provider-zai.
|
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Prism contributors
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
# @arnilo/prism-provider-zai
|
|
2
|
+
|
|
3
|
+
Z.AI GLM provider package for Prism.
|
|
4
|
+
|
|
5
|
+
```ts
|
|
6
|
+
import { createZaiProviderPackage } from "@arnilo/prism-provider-zai";
|
|
7
|
+
|
|
8
|
+
api.registerProviderPackage(createZaiProviderPackage({ apiKey: "fake-zai-key" }));
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
Exports:
|
|
12
|
+
- `createZaiProviderPackage()`
|
|
13
|
+
- `createZaiProvider()`
|
|
14
|
+
- `defineZaiModel()`
|
|
15
|
+
- `zaiModels`
|
|
16
|
+
|
|
17
|
+
Security defaults:
|
|
18
|
+
- No network calls during import, setup, build, or default tests.
|
|
19
|
+
- No automatic environment, file, keychain, or shell credential lookup.
|
|
20
|
+
- API keys are resolved per request from caller-supplied values or resolvers.
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { type CredentialValueSource, type ModelConfig, type ProviderPackage } from "@arnilo/prism";
|
|
2
|
+
export interface ZaiProviderPackageOptions {
|
|
3
|
+
readonly apiKey?: CredentialValueSource;
|
|
4
|
+
readonly fetch?: typeof fetch;
|
|
5
|
+
readonly baseUrl?: string;
|
|
6
|
+
readonly id?: string;
|
|
7
|
+
readonly models?: readonly ModelConfig[];
|
|
8
|
+
}
|
|
9
|
+
export declare function createZaiProviderPackage(options?: ZaiProviderPackageOptions): ProviderPackage;
|
|
10
|
+
export { defineZaiModel, zaiModels, type ZaiModelConfig } from "./models.js";
|
|
11
|
+
export { createZaiProvider, zaiBody, zaiEvents, type ZaiProviderOptions } from "./provider.js";
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { defineProviderPackage } from "@arnilo/prism";
|
|
2
|
+
import { createZaiProvider } from "./provider.js";
|
|
3
|
+
import { zaiModels } from "./models.js";
|
|
4
|
+
export function createZaiProviderPackage(options = {}) {
|
|
5
|
+
const providerId = options.id ?? "zai";
|
|
6
|
+
return defineProviderPackage({
|
|
7
|
+
name: "@arnilo/prism-provider-zai",
|
|
8
|
+
description: "Z.AI provider package for Prism.",
|
|
9
|
+
docs: { links: ["docs/providers/zai.md"] },
|
|
10
|
+
setup(api) {
|
|
11
|
+
api.registerProvider(createZaiProvider(options));
|
|
12
|
+
for (const model of options.models ?? zaiModels)
|
|
13
|
+
api.registerModel({ ...model, provider: providerId });
|
|
14
|
+
api.registerAuthMethod({ kind: "api_key", provider: providerId, credentialName: "apiKey" });
|
|
15
|
+
},
|
|
16
|
+
});
|
|
17
|
+
}
|
|
18
|
+
export { defineZaiModel, zaiModels } from "./models.js";
|
|
19
|
+
export { createZaiProvider, zaiBody, zaiEvents } from "./provider.js";
|
|
20
|
+
//# sourceMappingURL=index.js.map
|
package/dist/models.d.ts
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { JsonObject, ModelConfig } from "@arnilo/prism";
|
|
2
|
+
export interface ZaiModelConfig extends Omit<ModelConfig, "provider" | "compat"> {
|
|
3
|
+
readonly provider?: "zai";
|
|
4
|
+
readonly compat?: JsonObject & {
|
|
5
|
+
readonly thinking?: boolean | JsonObject;
|
|
6
|
+
readonly reasoning_effort?: string;
|
|
7
|
+
readonly tool_stream?: boolean;
|
|
8
|
+
};
|
|
9
|
+
}
|
|
10
|
+
export declare function defineZaiModel(config: ZaiModelConfig): ModelConfig;
|
|
11
|
+
export declare const zaiModels: readonly [ModelConfig, ModelConfig];
|
package/dist/models.js
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
export function defineZaiModel(config) {
|
|
2
|
+
return { ...config, provider: "zai", capabilities: { input: ["text"], output: ["text"], reasoning: true, tools: true, streaming: true, ...config.capabilities } };
|
|
3
|
+
}
|
|
4
|
+
export const zaiModels = [
|
|
5
|
+
defineZaiModel({
|
|
6
|
+
model: "glm-4.7",
|
|
7
|
+
displayName: "GLM-4.7",
|
|
8
|
+
limits: { contextWindow: 128_000, maxOutputTokens: 32_000 },
|
|
9
|
+
compat: { thinking: true, reasoning_effort: "medium", tool_stream: true },
|
|
10
|
+
}),
|
|
11
|
+
defineZaiModel({
|
|
12
|
+
model: "glm-4.5",
|
|
13
|
+
displayName: "GLM-4.5",
|
|
14
|
+
limits: { contextWindow: 128_000, maxOutputTokens: 32_000 },
|
|
15
|
+
compat: { thinking: true, reasoning_effort: "medium", tool_stream: true },
|
|
16
|
+
}),
|
|
17
|
+
];
|
|
18
|
+
//# sourceMappingURL=models.js.map
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { AIProvider, CredentialValueSource, JsonObject, ProviderEvent, ProviderRequest } from "@arnilo/prism";
|
|
2
|
+
export interface ZaiProviderOptions {
|
|
3
|
+
readonly id?: string;
|
|
4
|
+
readonly baseUrl?: string;
|
|
5
|
+
readonly apiKey?: CredentialValueSource;
|
|
6
|
+
readonly fetch?: typeof fetch;
|
|
7
|
+
}
|
|
8
|
+
export declare function createZaiProvider(options?: ZaiProviderOptions): AIProvider;
|
|
9
|
+
export declare function zaiBody(request: ProviderRequest): JsonObject;
|
|
10
|
+
export declare function zaiEvents(body: ReadableStream<Uint8Array>): AsyncIterable<ProviderEvent>;
|
package/dist/provider.js
ADDED
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
import { providerDone, providerError, providerTextDelta, providerThinkingDelta, providerToolCall, providerToolCallDelta, providerUsage, resolveCredentialValue, toolCallContent } from "@arnilo/prism";
|
|
2
|
+
import { readSseData } from "./sse.js";
|
|
3
|
+
import { zaiReasoningEffort, zaiThinking, zaiToolStream } from "./thinking.js";
|
|
4
|
+
export function createZaiProvider(options = {}) {
|
|
5
|
+
const id = options.id ?? "zai";
|
|
6
|
+
const baseUrl = (options.baseUrl ?? "https://open.bigmodel.cn/api/paas/v4").replace(/\/$/, "");
|
|
7
|
+
return {
|
|
8
|
+
id,
|
|
9
|
+
async *generate(request) {
|
|
10
|
+
if (request.signal?.aborted)
|
|
11
|
+
throw request.signal.reason ?? new Error("aborted");
|
|
12
|
+
const token = await resolveCredentialValue(options.apiKey, { provider: id, name: "apiKey" });
|
|
13
|
+
const secrets = [token];
|
|
14
|
+
try {
|
|
15
|
+
const response = await (options.fetch ?? fetch)(`${baseUrl}/chat/completions`, {
|
|
16
|
+
method: "POST",
|
|
17
|
+
headers: { "content-type": "application/json", ...request.options?.headers, ...(token ? { authorization: `Bearer ${token}` } : {}) },
|
|
18
|
+
body: JSON.stringify(zaiBody(request)),
|
|
19
|
+
signal: request.signal,
|
|
20
|
+
});
|
|
21
|
+
if (!response.ok)
|
|
22
|
+
return yield providerError(new Error(`Z.AI request failed: ${response.status} ${await safeText(response)}`), secrets);
|
|
23
|
+
if (!response.body)
|
|
24
|
+
return yield providerError(new Error("Z.AI response had no body"), secrets);
|
|
25
|
+
yield* zaiEvents(response.body);
|
|
26
|
+
}
|
|
27
|
+
catch (error) {
|
|
28
|
+
yield providerError(error, secrets);
|
|
29
|
+
}
|
|
30
|
+
},
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
export function zaiBody(request) {
|
|
34
|
+
return clean({
|
|
35
|
+
model: request.model.model,
|
|
36
|
+
messages: request.messages.map((message) => toMessage(message, request.model.capabilities ?? {})),
|
|
37
|
+
tools: request.tools?.map(toTool),
|
|
38
|
+
stream: true,
|
|
39
|
+
tool_stream: zaiToolStream(request),
|
|
40
|
+
thinking: zaiThinking(request),
|
|
41
|
+
reasoning_effort: zaiReasoningEffort(request),
|
|
42
|
+
max_tokens: request.model.limits?.maxOutputTokens,
|
|
43
|
+
...request.model.parameters,
|
|
44
|
+
...request.options?.compat,
|
|
45
|
+
...request.options?.extra,
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
export async function* zaiEvents(body) {
|
|
49
|
+
const tools = new Map();
|
|
50
|
+
let usage;
|
|
51
|
+
for await (const data of readSseData(body)) {
|
|
52
|
+
if (data === "[DONE]")
|
|
53
|
+
break;
|
|
54
|
+
const chunk = JSON.parse(data);
|
|
55
|
+
usage = toUsage(chunk.usage) ?? usage;
|
|
56
|
+
if (chunk.usage)
|
|
57
|
+
yield providerUsage(toUsage(chunk.usage));
|
|
58
|
+
for (const choice of chunk.choices ?? []) {
|
|
59
|
+
const delta = choice.delta ?? {};
|
|
60
|
+
if (delta.content)
|
|
61
|
+
yield providerTextDelta(delta.content);
|
|
62
|
+
if (delta.reasoning_content)
|
|
63
|
+
yield providerThinkingDelta(delta.reasoning_content);
|
|
64
|
+
for (const tool of delta.tool_calls ?? []) {
|
|
65
|
+
const index = tool.index ?? 0;
|
|
66
|
+
const current = tools.get(index) ?? { argumentsText: "" };
|
|
67
|
+
current.id = tool.id ?? current.id;
|
|
68
|
+
current.name = tool.function?.name ?? current.name;
|
|
69
|
+
current.argumentsText += tool.function?.arguments ?? "";
|
|
70
|
+
tools.set(index, current);
|
|
71
|
+
yield providerToolCallDelta({ index, id: tool.id, name: tool.function?.name, argumentsText: tool.function?.arguments });
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
for (const call of tools.values())
|
|
76
|
+
if (call.id && call.name)
|
|
77
|
+
yield providerToolCall(toolCallContent(call.id, call.name, parseArgs(call.argumentsText)));
|
|
78
|
+
yield providerDone(usage);
|
|
79
|
+
}
|
|
80
|
+
function toMessage(message, capabilities = {}) {
|
|
81
|
+
if (message.role === "tool") {
|
|
82
|
+
const result = message.content.find((part) => part.type === "tool_result");
|
|
83
|
+
return {
|
|
84
|
+
role: "tool",
|
|
85
|
+
tool_call_id: result?.toolCallId ?? "",
|
|
86
|
+
content: result ? JSON.stringify(result.result ?? result.error ?? null) : "",
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
if (message.role === "assistant") {
|
|
90
|
+
const toolCalls = message.content.filter((part) => part.type === "tool_call");
|
|
91
|
+
const textParts = message.content.filter((part) => part.type === "text" || part.type === "thinking");
|
|
92
|
+
if (toolCalls.length > 0) {
|
|
93
|
+
return {
|
|
94
|
+
role: "assistant",
|
|
95
|
+
content: textParts.map((part) => part.text).join("\n") || null,
|
|
96
|
+
tool_calls: toolCalls.map((call) => ({
|
|
97
|
+
id: call.id,
|
|
98
|
+
type: "function",
|
|
99
|
+
function: { name: call.name, arguments: JSON.stringify(call.arguments) },
|
|
100
|
+
})),
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
const content = [];
|
|
105
|
+
for (const part of message.content) {
|
|
106
|
+
if (part.type === "text" || part.type === "thinking") {
|
|
107
|
+
content.push({ type: "text", text: part.text });
|
|
108
|
+
}
|
|
109
|
+
else if (part.type === "image") {
|
|
110
|
+
if (!capabilities.input?.includes("image")) {
|
|
111
|
+
throw new Error(`Z.AI request includes image but model does not declare image input capability`);
|
|
112
|
+
}
|
|
113
|
+
const url = part.url ?? (part.data ? `data:${part.mimeType ?? "image/png"};base64,${part.data}` : undefined);
|
|
114
|
+
if (!url)
|
|
115
|
+
throw new Error("Z.AI image block missing url or data");
|
|
116
|
+
content.push({ type: "image_url", image_url: { url } });
|
|
117
|
+
}
|
|
118
|
+
else if (part.type === "tool_call") {
|
|
119
|
+
throw new Error("Z.AI assistant tool_call blocks must be the only content on the message");
|
|
120
|
+
}
|
|
121
|
+
else if (part.type === "tool_result") {
|
|
122
|
+
throw new Error("Z.AI tool_result blocks must appear in role=tool messages");
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
if (content.length === 1 && content[0].type === "text") {
|
|
126
|
+
return { role: message.role, content: content[0].text };
|
|
127
|
+
}
|
|
128
|
+
return { role: message.role, content };
|
|
129
|
+
}
|
|
130
|
+
function toTool(tool) {
|
|
131
|
+
return clean({ type: "function", function: { name: tool.name, description: tool.description, parameters: tool.parameters ?? { type: "object" } } });
|
|
132
|
+
}
|
|
133
|
+
function toUsage(usage) {
|
|
134
|
+
return usage ? { inputTokens: usage.prompt_tokens, outputTokens: usage.completion_tokens, totalTokens: usage.total_tokens, cacheReadTokens: usage.prompt_tokens_details?.cached_tokens, cacheWriteTokens: usage.prompt_tokens_details?.cache_write_tokens } : undefined;
|
|
135
|
+
}
|
|
136
|
+
function parseArgs(text) {
|
|
137
|
+
if (!text)
|
|
138
|
+
return {};
|
|
139
|
+
const parsed = JSON.parse(text);
|
|
140
|
+
return parsed && typeof parsed === "object" && !Array.isArray(parsed) ? parsed : {};
|
|
141
|
+
}
|
|
142
|
+
function clean(value) {
|
|
143
|
+
return Object.fromEntries(Object.entries(value).filter(([, item]) => item !== undefined));
|
|
144
|
+
}
|
|
145
|
+
async function safeText(response) {
|
|
146
|
+
try {
|
|
147
|
+
return await response.text();
|
|
148
|
+
}
|
|
149
|
+
catch {
|
|
150
|
+
return "";
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
//# sourceMappingURL=provider.js.map
|
package/dist/sse.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function readSseData(body: ReadableStream<Uint8Array>): AsyncIterable<string>;
|
package/dist/sse.js
ADDED
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
export async function* readSseData(body) {
|
|
2
|
+
const reader = body.getReader();
|
|
3
|
+
const decoder = new TextDecoder();
|
|
4
|
+
let buffer = "";
|
|
5
|
+
while (true) {
|
|
6
|
+
const { done, value } = await reader.read();
|
|
7
|
+
if (done)
|
|
8
|
+
break;
|
|
9
|
+
buffer += decoder.decode(value, { stream: true });
|
|
10
|
+
const parts = buffer.split(/\r?\n\r?\n/);
|
|
11
|
+
buffer = parts.pop() ?? "";
|
|
12
|
+
for (const part of parts)
|
|
13
|
+
yield* eventData(part);
|
|
14
|
+
}
|
|
15
|
+
buffer += decoder.decode();
|
|
16
|
+
if (buffer)
|
|
17
|
+
yield* eventData(buffer);
|
|
18
|
+
}
|
|
19
|
+
function* eventData(event) {
|
|
20
|
+
const data = event.split(/\r?\n/).filter((line) => line.startsWith("data:")).map((line) => line.slice(5).trimStart()).join("\n").trim();
|
|
21
|
+
if (data)
|
|
22
|
+
yield data;
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=sse.js.map
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { JsonObject, ProviderRequest } from "@arnilo/prism";
|
|
2
|
+
export declare function zaiThinking(request: ProviderRequest): JsonObject | undefined;
|
|
3
|
+
export declare function zaiReasoningEffort(request: ProviderRequest): string | undefined;
|
|
4
|
+
export declare function zaiToolStream(request: ProviderRequest): boolean | undefined;
|
package/dist/thinking.js
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
export function zaiThinking(request) {
|
|
2
|
+
const value = request.options?.compat?.thinking ?? request.model.compat?.thinking;
|
|
3
|
+
if (value === false || request.options?.cacheRetention === "none")
|
|
4
|
+
return { type: "disabled" };
|
|
5
|
+
if (value && typeof value === "object")
|
|
6
|
+
return value;
|
|
7
|
+
return value === true ? { type: "enabled" } : undefined;
|
|
8
|
+
}
|
|
9
|
+
export function zaiReasoningEffort(request) {
|
|
10
|
+
const effort = request.options?.compat?.reasoning_effort ?? request.options?.compat?.reasoningEffort ?? request.model.compat?.reasoning_effort;
|
|
11
|
+
return typeof effort === "string" ? effort : undefined;
|
|
12
|
+
}
|
|
13
|
+
export function zaiToolStream(request) {
|
|
14
|
+
const value = request.options?.compat?.tool_stream ?? request.model.compat?.tool_stream;
|
|
15
|
+
return typeof value === "boolean" ? value : undefined;
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=thinking.js.map
|
package/package.json
ADDED
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@arnilo/prism-provider-zai",
|
|
3
|
+
"version": "0.0.1",
|
|
4
|
+
"description": "Z.AI provider package for Prism.",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "./dist/index.js",
|
|
7
|
+
"types": "./dist/index.d.ts",
|
|
8
|
+
"exports": {
|
|
9
|
+
".": {
|
|
10
|
+
"types": "./dist/index.d.ts",
|
|
11
|
+
"default": "./dist/index.js"
|
|
12
|
+
}
|
|
13
|
+
},
|
|
14
|
+
"files": [
|
|
15
|
+
"dist",
|
|
16
|
+
"!dist/__tests__",
|
|
17
|
+
"!dist/**/*.map",
|
|
18
|
+
"README.md",
|
|
19
|
+
"CHANGELOG.md"
|
|
20
|
+
],
|
|
21
|
+
"scripts": {
|
|
22
|
+
"build": "tsc -p tsconfig.json",
|
|
23
|
+
"typecheck": "tsc -p tsconfig.json --noEmit",
|
|
24
|
+
"test": "node --test dist/__tests__/*.test.js",
|
|
25
|
+
"pack:dry-run": "npm pack --dry-run"
|
|
26
|
+
},
|
|
27
|
+
"peerDependencies": {
|
|
28
|
+
"@arnilo/prism": "0.0.1"
|
|
29
|
+
},
|
|
30
|
+
"devDependencies": {
|
|
31
|
+
"@arnilo/prism": "file:../.."
|
|
32
|
+
},
|
|
33
|
+
"engines": {
|
|
34
|
+
"node": ">=20"
|
|
35
|
+
},
|
|
36
|
+
"license": "MIT",
|
|
37
|
+
"repository": {
|
|
38
|
+
"type": "git",
|
|
39
|
+
"url": "git+https://github.com/ashiqrniloy/prism.git",
|
|
40
|
+
"directory": "packages/provider-zai"
|
|
41
|
+
},
|
|
42
|
+
"bugs": {
|
|
43
|
+
"url": "https://github.com/ashiqrniloy/prism/issues"
|
|
44
|
+
},
|
|
45
|
+
"homepage": "https://github.com/ashiqrniloy/prism/tree/main/packages/provider-zai#readme",
|
|
46
|
+
"keywords": [
|
|
47
|
+
"prism",
|
|
48
|
+
"provider",
|
|
49
|
+
"zai",
|
|
50
|
+
"agent",
|
|
51
|
+
"llm"
|
|
52
|
+
],
|
|
53
|
+
"sideEffects": false,
|
|
54
|
+
"publishConfig": {
|
|
55
|
+
"access": "public"
|
|
56
|
+
}
|
|
57
|
+
}
|