@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.
@@ -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
+ }
@@ -0,0 +1,4 @@
1
+ /**
2
+ * Evolink adapter unit tests (mock-based, no API calls)
3
+ */
4
+ export {};
@@ -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 {};
@@ -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[];
@@ -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.7",
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-6]: "),
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.7",
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.7",
87
- "@vibeframe/core": "0.113.7"
86
+ "@vibeframe/ai-providers": "0.113.8",
87
+ "@vibeframe/core": "0.113.8"
88
88
  },
89
89
  "engines": {
90
90
  "node": ">=20"