@vibeframe/cli 0.113.7 → 0.113.8
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/dist/agent/adapters/evolink.d.ts +15 -0
- package/dist/agent/adapters/evolink.test.d.ts +4 -0
- package/dist/agent/adapters/index.d.ts +3 -0
- package/dist/agent/index.test.d.ts +1 -0
- package/dist/agent/types.d.ts +1 -1
- package/dist/config/schema.d.ts +2 -1
- package/dist/index.js +154 -11
- package/dist/tools/manifest/index.js +129 -2
- package/package.json +3 -3
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Evolink LLM Adapter (OpenAI-compatible)
|
|
3
|
+
* Routes to GPT-5, Claude, Gemini, DeepSeek & more via https://direct.evolink.ai/v1
|
|
4
|
+
*/
|
|
5
|
+
import type { LLMAdapter } from "./index.js";
|
|
6
|
+
import type { ToolDefinition, LLMResponse, AgentMessage, LLMProvider } from "../types.js";
|
|
7
|
+
export declare class EvolinkAdapter implements LLMAdapter {
|
|
8
|
+
readonly provider: LLMProvider;
|
|
9
|
+
private client;
|
|
10
|
+
private model;
|
|
11
|
+
initialize(apiKey: string): Promise<void>;
|
|
12
|
+
isInitialized(): boolean;
|
|
13
|
+
setModel(model: string): void;
|
|
14
|
+
chat(messages: AgentMessage[], tools: ToolDefinition[]): Promise<LLMResponse>;
|
|
15
|
+
}
|
|
@@ -12,6 +12,8 @@ export interface LLMAdapter {
|
|
|
12
12
|
initialize(apiKey: string): Promise<void>;
|
|
13
13
|
/** Check if adapter is initialized */
|
|
14
14
|
isInitialized(): boolean;
|
|
15
|
+
/** Override the provider model for this session. */
|
|
16
|
+
setModel?(model: string): void;
|
|
15
17
|
/** Send messages with tools and get response */
|
|
16
18
|
chat(messages: AgentMessage[], tools: ToolDefinition[]): Promise<LLMResponse>;
|
|
17
19
|
}
|
|
@@ -25,3 +27,4 @@ export { GeminiAdapter } from "./gemini.js";
|
|
|
25
27
|
export { OllamaAdapter } from "./ollama.js";
|
|
26
28
|
export { XAIAdapter } from "./xai.js";
|
|
27
29
|
export { OpenRouterAdapter } from "./openrouter.js";
|
|
30
|
+
export { EvolinkAdapter } from "./evolink.js";
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
package/dist/agent/types.d.ts
CHANGED
|
@@ -55,7 +55,7 @@ export interface AgentConfig {
|
|
|
55
55
|
maxTurns?: number;
|
|
56
56
|
verbose?: boolean;
|
|
57
57
|
}
|
|
58
|
-
export type LLMProvider = "openai" | "claude" | "gemini" | "ollama" | "xai" | "openrouter";
|
|
58
|
+
export type LLMProvider = "openai" | "claude" | "gemini" | "ollama" | "xai" | "openrouter" | "evolink";
|
|
59
59
|
export interface LLMResponse {
|
|
60
60
|
content: string;
|
|
61
61
|
toolCalls?: ToolCall[];
|
package/dist/config/schema.d.ts
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* Configuration schema for VibeFrame CLI
|
|
3
3
|
* Stored at ~/.vibeframe/config.yaml by default.
|
|
4
4
|
*/
|
|
5
|
-
export type LLMProvider = "claude" | "openai" | "gemini" | "ollama" | "xai" | "openrouter";
|
|
5
|
+
export type LLMProvider = "claude" | "openai" | "gemini" | "ollama" | "xai" | "openrouter" | "evolink";
|
|
6
6
|
export interface VibeConfig {
|
|
7
7
|
/** Config file version */
|
|
8
8
|
version: string;
|
|
@@ -24,6 +24,7 @@ export interface VibeConfig {
|
|
|
24
24
|
replicate?: string;
|
|
25
25
|
xai?: string;
|
|
26
26
|
openrouter?: string;
|
|
27
|
+
evolink?: string;
|
|
27
28
|
};
|
|
28
29
|
/** Default settings for new projects */
|
|
29
30
|
defaults: {
|
package/dist/index.js
CHANGED
|
@@ -7165,6 +7165,16 @@ var init_api_keys = __esm({
|
|
|
7165
7165
|
envExampleUrl: "https://openrouter.ai/keys",
|
|
7166
7166
|
keyFormat: { prefix: /^sk-or-/, example: "sk-or-..." }
|
|
7167
7167
|
});
|
|
7168
|
+
defineApiKey({
|
|
7169
|
+
configKey: "evolink",
|
|
7170
|
+
envVar: "EVOLINK_API_KEY",
|
|
7171
|
+
label: "Evolink",
|
|
7172
|
+
showInSetup: true,
|
|
7173
|
+
setupDescription: "GPT-5, Claude, Gemini, DeepSeek & more via one key \u2014 Agent only (pay per model)",
|
|
7174
|
+
envExampleComment: "Evolink API Key (GPT-5, Claude, Gemini, DeepSeek & more via unified API, used by `vibe agent`)",
|
|
7175
|
+
envExampleUrl: "https://evolink.ai/dashboard/keys",
|
|
7176
|
+
keyFormat: { prefix: /^el-/, example: "el-..." }
|
|
7177
|
+
});
|
|
7168
7178
|
defineApiKey({
|
|
7169
7179
|
configKey: "imgbb",
|
|
7170
7180
|
envVar: "IMGBB_API_KEY",
|
|
@@ -7187,6 +7197,12 @@ var init_api_keys = __esm({
|
|
|
7187
7197
|
apiKey: "openrouter",
|
|
7188
7198
|
kinds: ["llm"]
|
|
7189
7199
|
});
|
|
7200
|
+
defineProvider({
|
|
7201
|
+
id: "evolink",
|
|
7202
|
+
label: "Evolink",
|
|
7203
|
+
apiKey: "evolink",
|
|
7204
|
+
kinds: ["llm"]
|
|
7205
|
+
});
|
|
7190
7206
|
}
|
|
7191
7207
|
});
|
|
7192
7208
|
|
|
@@ -26079,7 +26095,8 @@ var init_schema = __esm({
|
|
|
26079
26095
|
gemini: "Gemini (Google)",
|
|
26080
26096
|
ollama: "Ollama (Local)",
|
|
26081
26097
|
xai: "Grok (xAI)",
|
|
26082
|
-
openrouter: "OpenRouter"
|
|
26098
|
+
openrouter: "OpenRouter",
|
|
26099
|
+
evolink: "Evolink"
|
|
26083
26100
|
};
|
|
26084
26101
|
PROVIDER_ENV_VARS = getProviderEnvVars();
|
|
26085
26102
|
PROVIDER_ENV_ALIASES = getProviderEnvAliases();
|
|
@@ -26475,6 +26492,7 @@ var init_api_key = __esm({
|
|
|
26475
26492
|
RUNWAY_API_SECRET: "runway",
|
|
26476
26493
|
KLING_API_KEY: "kling",
|
|
26477
26494
|
OPENROUTER_API_KEY: "openrouter",
|
|
26495
|
+
EVOLINK_API_KEY: "evolink",
|
|
26478
26496
|
IMGBB_API_KEY: "imgbb",
|
|
26479
26497
|
REPLICATE_API_TOKEN: "replicate"
|
|
26480
26498
|
};
|
|
@@ -26489,7 +26507,8 @@ var init_api_key = __esm({
|
|
|
26489
26507
|
RUNWAY_API_SECRET: "https://app.runwayml.com/settings/api-keys",
|
|
26490
26508
|
KLING_API_KEY: "https://klingai.com/dev",
|
|
26491
26509
|
REPLICATE_API_TOKEN: "https://replicate.com/account/api-tokens",
|
|
26492
|
-
IMGBB_API_KEY: "https://api.imgbb.com/"
|
|
26510
|
+
IMGBB_API_KEY: "https://api.imgbb.com/",
|
|
26511
|
+
EVOLINK_API_KEY: "https://evolink.ai/dashboard/keys"
|
|
26493
26512
|
};
|
|
26494
26513
|
ApiKeyError = class extends Error {
|
|
26495
26514
|
envVar;
|
|
@@ -59230,6 +59249,14 @@ var init_key_live_test = __esm({
|
|
|
59230
59249
|
signal
|
|
59231
59250
|
)
|
|
59232
59251
|
},
|
|
59252
|
+
evolink: {
|
|
59253
|
+
name: "Evolink",
|
|
59254
|
+
test: (key, signal) => getOk(
|
|
59255
|
+
"https://direct.evolink.ai/v1/models",
|
|
59256
|
+
{ Authorization: `Bearer ${key}` },
|
|
59257
|
+
signal
|
|
59258
|
+
)
|
|
59259
|
+
},
|
|
59233
59260
|
// Runway: /v1/organization is a read-only GET that returns tier info
|
|
59234
59261
|
// (free, doesn't consume credits). Requires the X-Runway-Version
|
|
59235
59262
|
// header alongside the Bearer token — without it the request 401s.
|
|
@@ -59998,6 +60025,109 @@ var init_openrouter = __esm({
|
|
|
59998
60025
|
}
|
|
59999
60026
|
});
|
|
60000
60027
|
|
|
60028
|
+
// src/agent/adapters/evolink.ts
|
|
60029
|
+
var evolink_exports = {};
|
|
60030
|
+
__export(evolink_exports, {
|
|
60031
|
+
EvolinkAdapter: () => EvolinkAdapter
|
|
60032
|
+
});
|
|
60033
|
+
import OpenAI5 from "openai";
|
|
60034
|
+
var EvolinkAdapter;
|
|
60035
|
+
var init_evolink = __esm({
|
|
60036
|
+
"src/agent/adapters/evolink.ts"() {
|
|
60037
|
+
"use strict";
|
|
60038
|
+
EvolinkAdapter = class {
|
|
60039
|
+
provider = "evolink";
|
|
60040
|
+
client = null;
|
|
60041
|
+
model = "gpt-5.2";
|
|
60042
|
+
async initialize(apiKey) {
|
|
60043
|
+
this.client = new OpenAI5({
|
|
60044
|
+
apiKey,
|
|
60045
|
+
baseURL: "https://direct.evolink.ai/v1",
|
|
60046
|
+
defaultHeaders: {
|
|
60047
|
+
"HTTP-Referer": "https://vibeframe.dev",
|
|
60048
|
+
"X-Title": "VibeFrame"
|
|
60049
|
+
}
|
|
60050
|
+
});
|
|
60051
|
+
}
|
|
60052
|
+
isInitialized() {
|
|
60053
|
+
return this.client !== null;
|
|
60054
|
+
}
|
|
60055
|
+
setModel(model) {
|
|
60056
|
+
this.model = model;
|
|
60057
|
+
}
|
|
60058
|
+
async chat(messages, tools) {
|
|
60059
|
+
if (!this.client) {
|
|
60060
|
+
throw new Error("Evolink adapter not initialized");
|
|
60061
|
+
}
|
|
60062
|
+
const openaiMessages = messages.map(
|
|
60063
|
+
(msg) => {
|
|
60064
|
+
if (msg.role === "tool") {
|
|
60065
|
+
return {
|
|
60066
|
+
role: "tool",
|
|
60067
|
+
tool_call_id: msg.toolCallId,
|
|
60068
|
+
content: msg.content
|
|
60069
|
+
};
|
|
60070
|
+
}
|
|
60071
|
+
if (msg.role === "assistant" && msg.toolCalls) {
|
|
60072
|
+
return {
|
|
60073
|
+
role: "assistant",
|
|
60074
|
+
content: msg.content || null,
|
|
60075
|
+
tool_calls: msg.toolCalls.map((tc) => ({
|
|
60076
|
+
id: tc.id,
|
|
60077
|
+
type: "function",
|
|
60078
|
+
function: {
|
|
60079
|
+
name: tc.name,
|
|
60080
|
+
arguments: JSON.stringify(tc.arguments)
|
|
60081
|
+
}
|
|
60082
|
+
}))
|
|
60083
|
+
};
|
|
60084
|
+
}
|
|
60085
|
+
return {
|
|
60086
|
+
role: msg.role,
|
|
60087
|
+
content: msg.content
|
|
60088
|
+
};
|
|
60089
|
+
}
|
|
60090
|
+
);
|
|
60091
|
+
const openaiTools = tools.map((tool) => ({
|
|
60092
|
+
type: "function",
|
|
60093
|
+
function: {
|
|
60094
|
+
name: tool.name,
|
|
60095
|
+
description: tool.description,
|
|
60096
|
+
parameters: tool.parameters
|
|
60097
|
+
}
|
|
60098
|
+
}));
|
|
60099
|
+
const response = await this.client.chat.completions.create({
|
|
60100
|
+
model: this.model,
|
|
60101
|
+
messages: openaiMessages,
|
|
60102
|
+
tools: openaiTools.length > 0 ? openaiTools : void 0,
|
|
60103
|
+
tool_choice: openaiTools.length > 0 ? "auto" : void 0
|
|
60104
|
+
});
|
|
60105
|
+
const choice = response.choices[0];
|
|
60106
|
+
const message = choice.message;
|
|
60107
|
+
let toolCalls;
|
|
60108
|
+
if (message.tool_calls && message.tool_calls.length > 0) {
|
|
60109
|
+
toolCalls = message.tool_calls.map((tc) => ({
|
|
60110
|
+
id: tc.id,
|
|
60111
|
+
name: tc.function.name,
|
|
60112
|
+
arguments: JSON.parse(tc.function.arguments)
|
|
60113
|
+
}));
|
|
60114
|
+
}
|
|
60115
|
+
let finishReason = "stop";
|
|
60116
|
+
if (choice.finish_reason === "tool_calls") {
|
|
60117
|
+
finishReason = "tool_calls";
|
|
60118
|
+
} else if (choice.finish_reason === "length") {
|
|
60119
|
+
finishReason = "length";
|
|
60120
|
+
}
|
|
60121
|
+
return {
|
|
60122
|
+
content: message.content || "",
|
|
60123
|
+
toolCalls,
|
|
60124
|
+
finishReason
|
|
60125
|
+
};
|
|
60126
|
+
}
|
|
60127
|
+
};
|
|
60128
|
+
}
|
|
60129
|
+
});
|
|
60130
|
+
|
|
60001
60131
|
// src/agent/adapters/index.ts
|
|
60002
60132
|
async function createAdapter(provider) {
|
|
60003
60133
|
switch (provider) {
|
|
@@ -60025,6 +60155,10 @@ async function createAdapter(provider) {
|
|
|
60025
60155
|
const { OpenRouterAdapter: OpenRouterAdapter2 } = await Promise.resolve().then(() => (init_openrouter(), openrouter_exports));
|
|
60026
60156
|
return new OpenRouterAdapter2();
|
|
60027
60157
|
}
|
|
60158
|
+
case "evolink": {
|
|
60159
|
+
const { EvolinkAdapter: EvolinkAdapter2 } = await Promise.resolve().then(() => (init_evolink(), evolink_exports));
|
|
60160
|
+
return new EvolinkAdapter2();
|
|
60161
|
+
}
|
|
60028
60162
|
default:
|
|
60029
60163
|
throw new Error(`Unknown provider: ${provider}`);
|
|
60030
60164
|
}
|
|
@@ -60038,6 +60172,7 @@ var init_adapters = __esm({
|
|
|
60038
60172
|
init_ollama2();
|
|
60039
60173
|
init_xai();
|
|
60040
60174
|
init_openrouter();
|
|
60175
|
+
init_evolink();
|
|
60041
60176
|
}
|
|
60042
60177
|
});
|
|
60043
60178
|
|
|
@@ -74861,7 +74996,7 @@ init_source();
|
|
|
74861
74996
|
// package.json
|
|
74862
74997
|
var package_default = {
|
|
74863
74998
|
name: "@vibeframe/cli",
|
|
74864
|
-
version: "0.113.
|
|
74999
|
+
version: "0.113.8",
|
|
74865
75000
|
description: "VibeFrame CLI - agentic video workflow runtime",
|
|
74866
75001
|
private: false,
|
|
74867
75002
|
license: "MIT",
|
|
@@ -82068,7 +82203,8 @@ var VALID_LLM_PROVIDERS = [
|
|
|
82068
82203
|
"gemini",
|
|
82069
82204
|
"ollama",
|
|
82070
82205
|
"xai",
|
|
82071
|
-
"openrouter"
|
|
82206
|
+
"openrouter",
|
|
82207
|
+
"evolink"
|
|
82072
82208
|
];
|
|
82073
82209
|
var VALID_SCOPES = ["user", "project"];
|
|
82074
82210
|
function envValueFor(meta) {
|
|
@@ -82091,7 +82227,7 @@ var setupCommand = new Command("setup").description("Configure VibeFrame (LLM pr
|
|
|
82091
82227
|
"With --show: include unset providers + Resolution order + Defaults block"
|
|
82092
82228
|
).option("--claude-code", "Show Claude Code integration guide").option("-y, --yes", "Non-interactive: write config without prompting (CI / devcontainer)").option(
|
|
82093
82229
|
"--provider <id>",
|
|
82094
|
-
"Set the Agent LLM provider (claude | openai | gemini | xai | openrouter | ollama)"
|
|
82230
|
+
"Set the Agent LLM provider (claude | openai | gemini | xai | openrouter | evolink | ollama)"
|
|
82095
82231
|
).option("--import-env", "Promote API keys from .env / shell env into config.yaml").option("--test", "After save, live-test each configured key (exits 7 if any FAIL)").option(
|
|
82096
82232
|
"--scope <scope>",
|
|
82097
82233
|
"Where to save: 'user' (~/.vibeframe/config.yaml, shared) or 'project' (./.vibeframe/config.yaml, gitignored, this project only)",
|
|
@@ -82995,13 +83131,14 @@ async function runCustomSetup(config2, scope = "user", opts = {}) {
|
|
|
82995
83131
|
)
|
|
82996
83132
|
);
|
|
82997
83133
|
console.log();
|
|
82998
|
-
const providers = ["claude", "openai", "gemini", "xai", "openrouter", "ollama"];
|
|
83134
|
+
const providers = ["claude", "openai", "gemini", "xai", "openrouter", "evolink", "ollama"];
|
|
82999
83135
|
const providerDescriptions = {
|
|
83000
83136
|
claude: "Best reasoning, most capable for complex tasks",
|
|
83001
83137
|
openai: "GPT-5-mini, reliable and fast, good default",
|
|
83002
83138
|
gemini: "Google AI, strong multimodal understanding",
|
|
83003
83139
|
xai: "Grok 4.1 Fast, 2M context, great for tool calling",
|
|
83004
83140
|
openrouter: "300+ models via one API key (Claude, GPT, Gemini, Llama, etc.)",
|
|
83141
|
+
evolink: "GPT-5, Claude, Gemini, DeepSeek & more via one key",
|
|
83005
83142
|
ollama: "Free, local, no API key \u2014 offline capable (default: llama3.2)"
|
|
83006
83143
|
};
|
|
83007
83144
|
const providerLabels = providers.map((p) => {
|
|
@@ -83010,7 +83147,7 @@ async function runCustomSetup(config2, scope = "user", opts = {}) {
|
|
|
83010
83147
|
});
|
|
83011
83148
|
const currentIndex = providers.indexOf(config2.llm.provider);
|
|
83012
83149
|
const providerIndex = await promptSelect(
|
|
83013
|
-
source_default.cyan(" Select [1-
|
|
83150
|
+
source_default.cyan(" Select [1-7]: "),
|
|
83014
83151
|
providerLabels,
|
|
83015
83152
|
currentIndex >= 0 ? currentIndex : 0
|
|
83016
83153
|
);
|
|
@@ -83226,7 +83363,8 @@ async function showConfig(opts = { verbose: false }) {
|
|
|
83226
83363
|
{ key: "kling", name: "Kling", env: "KLING_API_KEY" },
|
|
83227
83364
|
{ key: "imgbb", name: "ImgBB", env: "IMGBB_API_KEY" },
|
|
83228
83365
|
{ key: "replicate", name: "Replicate", env: "REPLICATE_API_TOKEN" },
|
|
83229
|
-
{ key: "openrouter", name: "OpenRouter", env: "OPENROUTER_API_KEY" }
|
|
83366
|
+
{ key: "openrouter", name: "OpenRouter", env: "OPENROUTER_API_KEY" },
|
|
83367
|
+
{ key: "evolink", name: "Evolink", env: "EVOLINK_API_KEY" }
|
|
83230
83368
|
];
|
|
83231
83369
|
let unsetCount = 0;
|
|
83232
83370
|
for (const p of providerKeys) {
|
|
@@ -87691,6 +87829,9 @@ var AgentExecutor = class {
|
|
|
87691
87829
|
async initialize() {
|
|
87692
87830
|
if (this.initialized) return;
|
|
87693
87831
|
this.adapter = await createAdapter(this.config.provider);
|
|
87832
|
+
if (this.config.model) {
|
|
87833
|
+
this.adapter.setModel?.(this.config.model);
|
|
87834
|
+
}
|
|
87694
87835
|
await this.adapter.initialize(this.config.apiKey);
|
|
87695
87836
|
await registerAllTools(this.registry);
|
|
87696
87837
|
const systemPrompt = getSystemPrompt(this.context);
|
|
@@ -87902,7 +88043,8 @@ async function startAgent(options = {}) {
|
|
|
87902
88043
|
ollama: "ollama",
|
|
87903
88044
|
// Ollama doesn't need API key
|
|
87904
88045
|
xai: "xai",
|
|
87905
|
-
openrouter: "openrouter"
|
|
88046
|
+
openrouter: "openrouter",
|
|
88047
|
+
evolink: "evolink"
|
|
87906
88048
|
};
|
|
87907
88049
|
if (provider !== "ollama") {
|
|
87908
88050
|
apiKey = await getApiKeyFromConfig(providerKeyMap[provider]);
|
|
@@ -88088,7 +88230,7 @@ async function startAgent(options = {}) {
|
|
|
88088
88230
|
rl.prompt();
|
|
88089
88231
|
});
|
|
88090
88232
|
}
|
|
88091
|
-
var agentCommand = new Command("agent").description("Optional built-in natural-language agent (fallback when no external coding agent is driving vibe)").option("-p, --provider <provider>", "LLM provider (openai, claude, gemini, ollama, xai, openrouter)", "openai").option("-m, --model <model>", "Model to use (provider-specific)").option("--project <path>", "Timeline file or directory to load").option("-v, --verbose", "Show verbose output including tool calls").option("--max-turns <n>", "Maximum turns per request", "10").option("-i, --input <query>", "Run a single query and exit (non-interactive)").option("-c, --confirm", "Confirm before every tool \u2014 broadens the default cost gate (paid only) to all calls").option("--no-confirm", "Disable all confirm prompts including the high/very-high cost gate (CI / automation)").option("--budget-usd <usd>", "Reject tool calls past this cumulative USD ceiling using conservative tier estimates", parseFloat).action(async (options) => {
|
|
88233
|
+
var agentCommand = new Command("agent").description("Optional built-in natural-language agent (fallback when no external coding agent is driving vibe)").option("-p, --provider <provider>", "LLM provider (openai, claude, gemini, ollama, xai, openrouter, evolink)", "openai").option("-m, --model <model>", "Model to use (provider-specific)").option("--project <path>", "Timeline file or directory to load").option("-v, --verbose", "Show verbose output including tool calls").option("--max-turns <n>", "Maximum turns per request", "10").option("-i, --input <query>", "Run a single query and exit (non-interactive)").option("-c, --confirm", "Confirm before every tool \u2014 broadens the default cost gate (paid only) to all calls").option("--no-confirm", "Disable all confirm prompts including the high/very-high cost gate (CI / automation)").option("--budget-usd <usd>", "Reject tool calls past this cumulative USD ceiling using conservative tier estimates", parseFloat).action(async (options) => {
|
|
88092
88234
|
await startAgent(options);
|
|
88093
88235
|
});
|
|
88094
88236
|
function getEnvVar(provider) {
|
|
@@ -88098,7 +88240,8 @@ function getEnvVar(provider) {
|
|
|
88098
88240
|
gemini: "GOOGLE_API_KEY",
|
|
88099
88241
|
ollama: "(no API key needed)",
|
|
88100
88242
|
xai: "XAI_API_KEY",
|
|
88101
|
-
openrouter: "OPENROUTER_API_KEY"
|
|
88243
|
+
openrouter: "OPENROUTER_API_KEY",
|
|
88244
|
+
evolink: "EVOLINK_API_KEY"
|
|
88102
88245
|
};
|
|
88103
88246
|
return envVars[provider] || "API_KEY";
|
|
88104
88247
|
}
|
|
@@ -290,6 +290,16 @@ var init_api_keys = __esm({
|
|
|
290
290
|
envExampleUrl: "https://openrouter.ai/keys",
|
|
291
291
|
keyFormat: { prefix: /^sk-or-/, example: "sk-or-..." }
|
|
292
292
|
});
|
|
293
|
+
defineApiKey({
|
|
294
|
+
configKey: "evolink",
|
|
295
|
+
envVar: "EVOLINK_API_KEY",
|
|
296
|
+
label: "Evolink",
|
|
297
|
+
showInSetup: true,
|
|
298
|
+
setupDescription: "GPT-5, Claude, Gemini, DeepSeek & more via one key \u2014 Agent only (pay per model)",
|
|
299
|
+
envExampleComment: "Evolink API Key (GPT-5, Claude, Gemini, DeepSeek & more via unified API, used by `vibe agent`)",
|
|
300
|
+
envExampleUrl: "https://evolink.ai/dashboard/keys",
|
|
301
|
+
keyFormat: { prefix: /^el-/, example: "el-..." }
|
|
302
|
+
});
|
|
293
303
|
defineApiKey({
|
|
294
304
|
configKey: "imgbb",
|
|
295
305
|
envVar: "IMGBB_API_KEY",
|
|
@@ -312,6 +322,12 @@ var init_api_keys = __esm({
|
|
|
312
322
|
apiKey: "openrouter",
|
|
313
323
|
kinds: ["llm"]
|
|
314
324
|
});
|
|
325
|
+
defineProvider({
|
|
326
|
+
id: "evolink",
|
|
327
|
+
label: "Evolink",
|
|
328
|
+
apiKey: "evolink",
|
|
329
|
+
kinds: ["llm"]
|
|
330
|
+
});
|
|
315
331
|
}
|
|
316
332
|
});
|
|
317
333
|
|
|
@@ -18807,7 +18823,8 @@ var init_schema = __esm({
|
|
|
18807
18823
|
gemini: "Gemini (Google)",
|
|
18808
18824
|
ollama: "Ollama (Local)",
|
|
18809
18825
|
xai: "Grok (xAI)",
|
|
18810
|
-
openrouter: "OpenRouter"
|
|
18826
|
+
openrouter: "OpenRouter",
|
|
18827
|
+
evolink: "Evolink"
|
|
18811
18828
|
};
|
|
18812
18829
|
PROVIDER_ENV_VARS = getProviderEnvVars();
|
|
18813
18830
|
PROVIDER_ENV_ALIASES = getProviderEnvAliases();
|
|
@@ -20631,6 +20648,7 @@ var init_api_key = __esm({
|
|
|
20631
20648
|
RUNWAY_API_SECRET: "runway",
|
|
20632
20649
|
KLING_API_KEY: "kling",
|
|
20633
20650
|
OPENROUTER_API_KEY: "openrouter",
|
|
20651
|
+
EVOLINK_API_KEY: "evolink",
|
|
20634
20652
|
IMGBB_API_KEY: "imgbb",
|
|
20635
20653
|
REPLICATE_API_TOKEN: "replicate"
|
|
20636
20654
|
};
|
|
@@ -20645,7 +20663,8 @@ var init_api_key = __esm({
|
|
|
20645
20663
|
RUNWAY_API_SECRET: "https://app.runwayml.com/settings/api-keys",
|
|
20646
20664
|
KLING_API_KEY: "https://klingai.com/dev",
|
|
20647
20665
|
REPLICATE_API_TOKEN: "https://replicate.com/account/api-tokens",
|
|
20648
|
-
IMGBB_API_KEY: "https://api.imgbb.com/"
|
|
20666
|
+
IMGBB_API_KEY: "https://api.imgbb.com/",
|
|
20667
|
+
EVOLINK_API_KEY: "https://evolink.ai/dashboard/keys"
|
|
20649
20668
|
};
|
|
20650
20669
|
ApiKeyError = class extends Error {
|
|
20651
20670
|
envVar;
|
|
@@ -47754,6 +47773,109 @@ var init_openrouter = __esm({
|
|
|
47754
47773
|
}
|
|
47755
47774
|
});
|
|
47756
47775
|
|
|
47776
|
+
// src/agent/adapters/evolink.ts
|
|
47777
|
+
var evolink_exports = {};
|
|
47778
|
+
__export(evolink_exports, {
|
|
47779
|
+
EvolinkAdapter: () => EvolinkAdapter
|
|
47780
|
+
});
|
|
47781
|
+
import OpenAI5 from "openai";
|
|
47782
|
+
var EvolinkAdapter;
|
|
47783
|
+
var init_evolink = __esm({
|
|
47784
|
+
"src/agent/adapters/evolink.ts"() {
|
|
47785
|
+
"use strict";
|
|
47786
|
+
EvolinkAdapter = class {
|
|
47787
|
+
provider = "evolink";
|
|
47788
|
+
client = null;
|
|
47789
|
+
model = "gpt-5.2";
|
|
47790
|
+
async initialize(apiKey) {
|
|
47791
|
+
this.client = new OpenAI5({
|
|
47792
|
+
apiKey,
|
|
47793
|
+
baseURL: "https://direct.evolink.ai/v1",
|
|
47794
|
+
defaultHeaders: {
|
|
47795
|
+
"HTTP-Referer": "https://vibeframe.dev",
|
|
47796
|
+
"X-Title": "VibeFrame"
|
|
47797
|
+
}
|
|
47798
|
+
});
|
|
47799
|
+
}
|
|
47800
|
+
isInitialized() {
|
|
47801
|
+
return this.client !== null;
|
|
47802
|
+
}
|
|
47803
|
+
setModel(model) {
|
|
47804
|
+
this.model = model;
|
|
47805
|
+
}
|
|
47806
|
+
async chat(messages, tools) {
|
|
47807
|
+
if (!this.client) {
|
|
47808
|
+
throw new Error("Evolink adapter not initialized");
|
|
47809
|
+
}
|
|
47810
|
+
const openaiMessages = messages.map(
|
|
47811
|
+
(msg) => {
|
|
47812
|
+
if (msg.role === "tool") {
|
|
47813
|
+
return {
|
|
47814
|
+
role: "tool",
|
|
47815
|
+
tool_call_id: msg.toolCallId,
|
|
47816
|
+
content: msg.content
|
|
47817
|
+
};
|
|
47818
|
+
}
|
|
47819
|
+
if (msg.role === "assistant" && msg.toolCalls) {
|
|
47820
|
+
return {
|
|
47821
|
+
role: "assistant",
|
|
47822
|
+
content: msg.content || null,
|
|
47823
|
+
tool_calls: msg.toolCalls.map((tc) => ({
|
|
47824
|
+
id: tc.id,
|
|
47825
|
+
type: "function",
|
|
47826
|
+
function: {
|
|
47827
|
+
name: tc.name,
|
|
47828
|
+
arguments: JSON.stringify(tc.arguments)
|
|
47829
|
+
}
|
|
47830
|
+
}))
|
|
47831
|
+
};
|
|
47832
|
+
}
|
|
47833
|
+
return {
|
|
47834
|
+
role: msg.role,
|
|
47835
|
+
content: msg.content
|
|
47836
|
+
};
|
|
47837
|
+
}
|
|
47838
|
+
);
|
|
47839
|
+
const openaiTools = tools.map((tool) => ({
|
|
47840
|
+
type: "function",
|
|
47841
|
+
function: {
|
|
47842
|
+
name: tool.name,
|
|
47843
|
+
description: tool.description,
|
|
47844
|
+
parameters: tool.parameters
|
|
47845
|
+
}
|
|
47846
|
+
}));
|
|
47847
|
+
const response = await this.client.chat.completions.create({
|
|
47848
|
+
model: this.model,
|
|
47849
|
+
messages: openaiMessages,
|
|
47850
|
+
tools: openaiTools.length > 0 ? openaiTools : void 0,
|
|
47851
|
+
tool_choice: openaiTools.length > 0 ? "auto" : void 0
|
|
47852
|
+
});
|
|
47853
|
+
const choice = response.choices[0];
|
|
47854
|
+
const message = choice.message;
|
|
47855
|
+
let toolCalls;
|
|
47856
|
+
if (message.tool_calls && message.tool_calls.length > 0) {
|
|
47857
|
+
toolCalls = message.tool_calls.map((tc) => ({
|
|
47858
|
+
id: tc.id,
|
|
47859
|
+
name: tc.function.name,
|
|
47860
|
+
arguments: JSON.parse(tc.function.arguments)
|
|
47861
|
+
}));
|
|
47862
|
+
}
|
|
47863
|
+
let finishReason = "stop";
|
|
47864
|
+
if (choice.finish_reason === "tool_calls") {
|
|
47865
|
+
finishReason = "tool_calls";
|
|
47866
|
+
} else if (choice.finish_reason === "length") {
|
|
47867
|
+
finishReason = "length";
|
|
47868
|
+
}
|
|
47869
|
+
return {
|
|
47870
|
+
content: message.content || "",
|
|
47871
|
+
toolCalls,
|
|
47872
|
+
finishReason
|
|
47873
|
+
};
|
|
47874
|
+
}
|
|
47875
|
+
};
|
|
47876
|
+
}
|
|
47877
|
+
});
|
|
47878
|
+
|
|
47757
47879
|
// src/commands/detect.ts
|
|
47758
47880
|
var detect_exports = {};
|
|
47759
47881
|
__export(detect_exports, {
|
|
@@ -58351,6 +58473,7 @@ init_gemini2();
|
|
|
58351
58473
|
init_ollama2();
|
|
58352
58474
|
init_xai();
|
|
58353
58475
|
init_openrouter();
|
|
58476
|
+
init_evolink();
|
|
58354
58477
|
async function createAdapter(provider) {
|
|
58355
58478
|
switch (provider) {
|
|
58356
58479
|
case "openai": {
|
|
@@ -58377,6 +58500,10 @@ async function createAdapter(provider) {
|
|
|
58377
58500
|
const { OpenRouterAdapter: OpenRouterAdapter2 } = await Promise.resolve().then(() => (init_openrouter(), openrouter_exports));
|
|
58378
58501
|
return new OpenRouterAdapter2();
|
|
58379
58502
|
}
|
|
58503
|
+
case "evolink": {
|
|
58504
|
+
const { EvolinkAdapter: EvolinkAdapter2 } = await Promise.resolve().then(() => (init_evolink(), evolink_exports));
|
|
58505
|
+
return new EvolinkAdapter2();
|
|
58506
|
+
}
|
|
58380
58507
|
default:
|
|
58381
58508
|
throw new Error(`Unknown provider: ${provider}`);
|
|
58382
58509
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@vibeframe/cli",
|
|
3
|
-
"version": "0.113.
|
|
3
|
+
"version": "0.113.8",
|
|
4
4
|
"description": "VibeFrame CLI - agentic video workflow runtime",
|
|
5
5
|
"private": false,
|
|
6
6
|
"license": "MIT",
|
|
@@ -83,8 +83,8 @@
|
|
|
83
83
|
"tsx": "^4.21.0",
|
|
84
84
|
"typescript": "^5.3.3",
|
|
85
85
|
"vitest": "^1.2.2",
|
|
86
|
-
"@vibeframe/ai-providers": "0.113.
|
|
87
|
-
"@vibeframe/core": "0.113.
|
|
86
|
+
"@vibeframe/ai-providers": "0.113.8",
|
|
87
|
+
"@vibeframe/core": "0.113.8"
|
|
88
88
|
},
|
|
89
89
|
"engines": {
|
|
90
90
|
"node": ">=20"
|