@arnilo/prism-provider-kimi 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 +22 -0
- package/dist/index.d.ts +14 -0
- package/dist/index.js +23 -0
- package/dist/models.d.ts +11 -0
- package/dist/models.js +22 -0
- package/dist/provider.d.ts +11 -0
- package/dist/provider.js +158 -0
- package/dist/sse.d.ts +1 -0
- package/dist/sse.js +24 -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-kimi 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-kimi.
|
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,22 @@
|
|
|
1
|
+
# @arnilo/prism-provider-kimi
|
|
2
|
+
|
|
3
|
+
Kimi provider package for Prism.
|
|
4
|
+
|
|
5
|
+
```ts
|
|
6
|
+
import { createKimiProviderPackage } from "@arnilo/prism-provider-kimi";
|
|
7
|
+
|
|
8
|
+
api.registerProviderPackage(createKimiProviderPackage({ kimiApiKey: "fake-kimi-key" }));
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
Exports:
|
|
12
|
+
- `createKimiProviderPackage()`
|
|
13
|
+
- `createKimiCodingProvider()`
|
|
14
|
+
- `kimiCodingModels`
|
|
15
|
+
- `moonshotKimiModels`
|
|
16
|
+
- `defineKimiModel()`
|
|
17
|
+
|
|
18
|
+
Security defaults:
|
|
19
|
+
- No network calls during import, setup, build, or default tests.
|
|
20
|
+
- No automatic environment, file, keychain, or shell credential lookup.
|
|
21
|
+
- Kimi credentials are resolved per request from caller-supplied values or resolvers.
|
|
22
|
+
- Moonshot/Open Platform model metadata is registered only with `includeMoonshotModels: true`.
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { type CredentialValueSource, type ModelConfig, type ProviderPackage } from "@arnilo/prism";
|
|
2
|
+
export interface KimiProviderPackageOptions {
|
|
3
|
+
readonly kimiApiKey?: CredentialValueSource;
|
|
4
|
+
readonly fetch?: typeof fetch;
|
|
5
|
+
readonly baseUrl?: string;
|
|
6
|
+
readonly id?: string;
|
|
7
|
+
readonly userAgent?: string;
|
|
8
|
+
readonly models?: readonly ModelConfig[];
|
|
9
|
+
readonly includeMoonshotModels?: boolean;
|
|
10
|
+
readonly moonshotModels?: readonly ModelConfig[];
|
|
11
|
+
}
|
|
12
|
+
export declare function createKimiProviderPackage(options?: KimiProviderPackageOptions): ProviderPackage;
|
|
13
|
+
export { defineKimiModel, kimiCodingModels, moonshotKimiModels, type KimiModelConfig } from "./models.js";
|
|
14
|
+
export { createKimiCodingProvider, kimiAnthropicBody, kimiAnthropicEvents, type KimiCodingProviderOptions } from "./provider.js";
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { defineProviderPackage } from "@arnilo/prism";
|
|
2
|
+
import { kimiCodingModels, moonshotKimiModels } from "./models.js";
|
|
3
|
+
import { createKimiCodingProvider } from "./provider.js";
|
|
4
|
+
export function createKimiProviderPackage(options = {}) {
|
|
5
|
+
const providerId = options.id ?? "kimi-coding";
|
|
6
|
+
return defineProviderPackage({
|
|
7
|
+
name: "@arnilo/prism-provider-kimi",
|
|
8
|
+
description: "Kimi provider package for Prism.",
|
|
9
|
+
docs: { links: ["docs/providers/kimi.md"] },
|
|
10
|
+
setup(api) {
|
|
11
|
+
api.registerProvider(createKimiCodingProvider({ ...options, id: providerId, apiKey: options.kimiApiKey }));
|
|
12
|
+
for (const model of options.models ?? kimiCodingModels)
|
|
13
|
+
api.registerModel({ ...model, provider: providerId });
|
|
14
|
+
if (options.includeMoonshotModels)
|
|
15
|
+
for (const model of options.moonshotModels ?? moonshotKimiModels)
|
|
16
|
+
api.registerModel(model);
|
|
17
|
+
api.registerAuthMethod({ kind: "api_key", provider: providerId, credentialName: "apiKey" });
|
|
18
|
+
},
|
|
19
|
+
});
|
|
20
|
+
}
|
|
21
|
+
export { defineKimiModel, kimiCodingModels, moonshotKimiModels } from "./models.js";
|
|
22
|
+
export { createKimiCodingProvider, kimiAnthropicBody, kimiAnthropicEvents } from "./provider.js";
|
|
23
|
+
//# 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 KimiModelConfig extends Omit<ModelConfig, "provider" | "compat"> {
|
|
3
|
+
readonly provider?: "kimi-coding" | "moonshot";
|
|
4
|
+
readonly compat?: JsonObject & {
|
|
5
|
+
readonly route?: "anthropic" | "openai";
|
|
6
|
+
readonly preserveThinking?: boolean;
|
|
7
|
+
};
|
|
8
|
+
}
|
|
9
|
+
export declare function defineKimiModel(config: KimiModelConfig): ModelConfig;
|
|
10
|
+
export declare const kimiCodingModels: readonly [ModelConfig];
|
|
11
|
+
export declare const moonshotKimiModels: readonly [ModelConfig];
|
package/dist/models.js
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
export function defineKimiModel(config) {
|
|
2
|
+
return { ...config, provider: config.provider ?? "kimi-coding", capabilities: { input: ["text"], output: ["text"], reasoning: true, tools: true, streaming: true, ...config.capabilities } };
|
|
3
|
+
}
|
|
4
|
+
export const kimiCodingModels = [
|
|
5
|
+
defineKimiModel({
|
|
6
|
+
provider: "kimi-coding",
|
|
7
|
+
model: "kimi-k2.7-code",
|
|
8
|
+
displayName: "Kimi K2.7 Code",
|
|
9
|
+
limits: { contextWindow: 256_000, maxOutputTokens: 64_000 },
|
|
10
|
+
compat: { route: "anthropic", preserveThinking: true },
|
|
11
|
+
}),
|
|
12
|
+
];
|
|
13
|
+
export const moonshotKimiModels = [
|
|
14
|
+
defineKimiModel({
|
|
15
|
+
provider: "moonshot",
|
|
16
|
+
model: "kimi-k2.7-code-preview",
|
|
17
|
+
displayName: "Kimi K2.7 Code Preview",
|
|
18
|
+
limits: { contextWindow: 256_000, maxOutputTokens: 64_000 },
|
|
19
|
+
compat: { route: "openai", preserveThinking: true },
|
|
20
|
+
}),
|
|
21
|
+
];
|
|
22
|
+
//# sourceMappingURL=models.js.map
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { AIProvider, CredentialValueSource, JsonObject, ProviderEvent, ProviderRequest } from "@arnilo/prism";
|
|
2
|
+
export interface KimiCodingProviderOptions {
|
|
3
|
+
readonly id?: string;
|
|
4
|
+
readonly baseUrl?: string;
|
|
5
|
+
readonly apiKey?: CredentialValueSource;
|
|
6
|
+
readonly fetch?: typeof fetch;
|
|
7
|
+
readonly userAgent?: string;
|
|
8
|
+
}
|
|
9
|
+
export declare function createKimiCodingProvider(options?: KimiCodingProviderOptions): AIProvider;
|
|
10
|
+
export declare function kimiAnthropicBody(request: ProviderRequest): JsonObject;
|
|
11
|
+
export declare function kimiAnthropicEvents(body: ReadableStream<Uint8Array>): AsyncIterable<ProviderEvent>;
|
package/dist/provider.js
ADDED
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
import { providerDone, providerError, providerTextDelta, providerThinkingDelta, providerToolCall, providerToolCallDelta, providerUsage, resolveCredentialValue, toolCallContent } from "@arnilo/prism";
|
|
2
|
+
import { readSseData } from "./sse.js";
|
|
3
|
+
export function createKimiCodingProvider(options = {}) {
|
|
4
|
+
const id = options.id ?? "kimi-coding";
|
|
5
|
+
const baseUrl = (options.baseUrl ?? "https://api.kimi.com/coding").replace(/\/$/, "");
|
|
6
|
+
return {
|
|
7
|
+
id,
|
|
8
|
+
async *generate(request) {
|
|
9
|
+
if (request.signal?.aborted)
|
|
10
|
+
throw request.signal.reason ?? new Error("aborted");
|
|
11
|
+
const token = await resolveCredentialValue(options.apiKey, { provider: id, name: "apiKey" });
|
|
12
|
+
const secrets = [token];
|
|
13
|
+
try {
|
|
14
|
+
const response = await (options.fetch ?? fetch)(`${baseUrl}/messages`, {
|
|
15
|
+
method: "POST",
|
|
16
|
+
headers: {
|
|
17
|
+
"content-type": "application/json",
|
|
18
|
+
"user-agent": options.userAgent ?? "KimiCLI/1.5",
|
|
19
|
+
...request.options?.headers,
|
|
20
|
+
...(token ? { authorization: `Bearer ${token}` } : {}),
|
|
21
|
+
},
|
|
22
|
+
body: JSON.stringify(kimiAnthropicBody(request)),
|
|
23
|
+
signal: request.signal,
|
|
24
|
+
});
|
|
25
|
+
if (!response.ok)
|
|
26
|
+
return yield providerError(new Error(`Kimi request failed: ${response.status} ${await safeText(response)}`), secrets);
|
|
27
|
+
if (!response.body)
|
|
28
|
+
return yield providerError(new Error("Kimi response had no body"), secrets);
|
|
29
|
+
yield* kimiAnthropicEvents(response.body);
|
|
30
|
+
}
|
|
31
|
+
catch (error) {
|
|
32
|
+
yield providerError(error, secrets);
|
|
33
|
+
}
|
|
34
|
+
},
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
export function kimiAnthropicBody(request) {
|
|
38
|
+
const preserveThinking = request.model.compat?.preserveThinking === true;
|
|
39
|
+
return clean({
|
|
40
|
+
model: request.model.model,
|
|
41
|
+
messages: request.messages.filter((m) => m.role !== "system").map((message) => toMessage(message, request.model.capabilities ?? {}, preserveThinking)),
|
|
42
|
+
system: request.messages.filter((m) => m.role === "system").map((m) => text(m, preserveThinking)).join("\n\n") || undefined,
|
|
43
|
+
tools: request.tools?.map(toTool),
|
|
44
|
+
stream: true,
|
|
45
|
+
max_tokens: request.model.limits?.maxOutputTokens ?? 4096,
|
|
46
|
+
...request.model.parameters,
|
|
47
|
+
...request.options?.compat,
|
|
48
|
+
...request.options?.extra,
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
export async function* kimiAnthropicEvents(body) {
|
|
52
|
+
const blocks = new Map();
|
|
53
|
+
let usage;
|
|
54
|
+
for await (const data of readSseData(body)) {
|
|
55
|
+
if (data === "[DONE]")
|
|
56
|
+
break;
|
|
57
|
+
const event = JSON.parse(data);
|
|
58
|
+
if (event.type === "content_block_start" && event.content_block?.type === "tool_use")
|
|
59
|
+
blocks.set(event.index ?? 0, { id: event.content_block.id, name: event.content_block.name, argumentsText: "" });
|
|
60
|
+
if (event.type === "content_block_delta") {
|
|
61
|
+
const delta = event.delta;
|
|
62
|
+
if (delta?.type === "text_delta" && delta.text)
|
|
63
|
+
yield providerTextDelta(delta.text);
|
|
64
|
+
if ((delta?.type === "thinking_delta" || delta?.type === "reasoning_delta") && (delta.thinking ?? delta.reasoning))
|
|
65
|
+
yield providerThinkingDelta(delta.thinking ?? delta.reasoning ?? "");
|
|
66
|
+
if (delta?.type === "input_json_delta") {
|
|
67
|
+
const index = event.index ?? 0;
|
|
68
|
+
const current = blocks.get(index) ?? { argumentsText: "" };
|
|
69
|
+
current.argumentsText += delta.partial_json ?? "";
|
|
70
|
+
blocks.set(index, current);
|
|
71
|
+
yield providerToolCallDelta({ index, id: current.id, name: current.name, argumentsText: delta.partial_json });
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
usage = toUsage(event.message?.usage ?? event.usage) ?? usage;
|
|
75
|
+
if (event.type === "message_delta" && usage)
|
|
76
|
+
yield providerUsage(usage);
|
|
77
|
+
}
|
|
78
|
+
for (const call of blocks.values())
|
|
79
|
+
if (call.id && call.name)
|
|
80
|
+
yield providerToolCall(toolCallContent(call.id, call.name, parseArgs(call.argumentsText)));
|
|
81
|
+
yield providerDone(usage);
|
|
82
|
+
}
|
|
83
|
+
function toMessage(message, capabilities = {}, preserveThinking = false) {
|
|
84
|
+
if (message.role === "tool") {
|
|
85
|
+
const result = message.content.find((part) => part.type === "tool_result");
|
|
86
|
+
return {
|
|
87
|
+
role: "user",
|
|
88
|
+
content: [{
|
|
89
|
+
type: "tool_result",
|
|
90
|
+
tool_use_id: result?.toolCallId ?? "",
|
|
91
|
+
content: result ? JSON.stringify(result.result ?? result.error ?? null) : "",
|
|
92
|
+
}],
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
const content = [];
|
|
96
|
+
for (const part of message.content) {
|
|
97
|
+
if (part.type === "text") {
|
|
98
|
+
content.push({ type: "text", text: part.text });
|
|
99
|
+
}
|
|
100
|
+
else if (part.type === "thinking") {
|
|
101
|
+
if (preserveThinking) {
|
|
102
|
+
content.push(part.signature ? { type: "thinking", thinking: part.text, signature: part.signature } : { type: "thinking", thinking: part.text });
|
|
103
|
+
}
|
|
104
|
+
else {
|
|
105
|
+
content.push({ type: "text", text: part.text });
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
else if (part.type === "image") {
|
|
109
|
+
if (!capabilities.input?.includes("image")) {
|
|
110
|
+
throw new Error(`Kimi request includes image but model does not declare image input capability`);
|
|
111
|
+
}
|
|
112
|
+
const source = part.url
|
|
113
|
+
? { type: "url", url: part.url }
|
|
114
|
+
: { type: "base64", media_type: part.mimeType ?? "image/png", data: part.data ?? "" };
|
|
115
|
+
content.push({ type: "image", source });
|
|
116
|
+
}
|
|
117
|
+
else if (part.type === "tool_call") {
|
|
118
|
+
content.push({ type: "tool_use", id: part.id, name: part.name, input: part.arguments });
|
|
119
|
+
}
|
|
120
|
+
else if (part.type === "tool_result") {
|
|
121
|
+
throw new Error("Kimi tool_result blocks must appear in role=tool messages");
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
return { role: message.role === "assistant" ? "assistant" : "user", content: content.length > 0 ? content : [{ type: "text", text: "" }] };
|
|
125
|
+
}
|
|
126
|
+
function toTool(tool) {
|
|
127
|
+
return clean({ name: tool.name, description: tool.description, input_schema: tool.parameters ?? { type: "object" } });
|
|
128
|
+
}
|
|
129
|
+
function text(message, preserveThinking = false) {
|
|
130
|
+
return message.content.map((part) => {
|
|
131
|
+
if (part.type === "text")
|
|
132
|
+
return part.text;
|
|
133
|
+
if (part.type === "thinking")
|
|
134
|
+
return preserveThinking ? part.text : part.text;
|
|
135
|
+
return "";
|
|
136
|
+
}).join("");
|
|
137
|
+
}
|
|
138
|
+
function toUsage(usage) {
|
|
139
|
+
return usage ? { inputTokens: usage.input_tokens, outputTokens: usage.output_tokens, cacheReadTokens: usage.cache_read_input_tokens, cacheWriteTokens: usage.cache_creation_input_tokens } : undefined;
|
|
140
|
+
}
|
|
141
|
+
function parseArgs(text) {
|
|
142
|
+
if (!text)
|
|
143
|
+
return {};
|
|
144
|
+
const parsed = JSON.parse(text);
|
|
145
|
+
return parsed && typeof parsed === "object" && !Array.isArray(parsed) ? parsed : {};
|
|
146
|
+
}
|
|
147
|
+
function clean(value) {
|
|
148
|
+
return Object.fromEntries(Object.entries(value).filter(([, item]) => item !== undefined && !(Array.isArray(item) && item.length === 0)));
|
|
149
|
+
}
|
|
150
|
+
async function safeText(response) {
|
|
151
|
+
try {
|
|
152
|
+
return await response.text();
|
|
153
|
+
}
|
|
154
|
+
catch {
|
|
155
|
+
return "";
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
//# 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
|
package/package.json
ADDED
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@arnilo/prism-provider-kimi",
|
|
3
|
+
"version": "0.0.1",
|
|
4
|
+
"description": "Kimi 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-kimi"
|
|
41
|
+
},
|
|
42
|
+
"bugs": {
|
|
43
|
+
"url": "https://github.com/ashiqrniloy/prism/issues"
|
|
44
|
+
},
|
|
45
|
+
"homepage": "https://github.com/ashiqrniloy/prism/tree/main/packages/provider-kimi#readme",
|
|
46
|
+
"keywords": [
|
|
47
|
+
"prism",
|
|
48
|
+
"provider",
|
|
49
|
+
"kimi",
|
|
50
|
+
"agent",
|
|
51
|
+
"llm"
|
|
52
|
+
],
|
|
53
|
+
"sideEffects": false,
|
|
54
|
+
"publishConfig": {
|
|
55
|
+
"access": "public"
|
|
56
|
+
}
|
|
57
|
+
}
|