@kb-labs/adapters-vibeproxy 2.119.0-canary.e120bc0ee → 2.119.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/dist/index.js.map +1 -1
- package/dist/llm.js.map +1 -1
- package/dist/manifest.js.map +1 -1
- package/package.json +3 -3
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/llm.ts","../src/manifest.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["/**\n * @module @kb-labs/adapters-vibeproxy/llm\n * VibeProxy implementation of ILLM interface.\n * Connects to local VibeProxy server (supports Claude, GPT, and other models).\n */\n\nimport type {\n ILLM,\n LLMOptions,\n LLMResponse,\n LLMMessage,\n LLMToolCallOptions,\n LLMToolCallResponse,\n LLMTool,\n LLMToolCall,\n LLMProtocolCapabilities,\n LLMExecutionPolicy,\n} from \"@kb-labs/sdk/adapters\";\n\n/**\n * Configuration for VibeProxy LLM adapter.\n */\nexport interface VibeProxyLLMConfig {\n /** Base URL for VibeProxy (defaults to http://localhost:8317) */\n baseURL?: string;\n /** API key (can be any string for VibeProxy) */\n apiKey?: string;\n /** Default model to use */\n defaultModel?: string;\n /** Request timeout in ms (defaults to 120000) */\n timeout?: number;\n /** Default max output tokens when caller does not specify. Overrides the hardcoded 4096. */\n defaultMaxTokens?: number;\n}\n\n/** Default max output tokens — avoids hitting the 4096 hardcoded limit mid-response. */\nconst DEFAULT_MAX_TOKENS = 16_384;\n\n/**\n * VibeProxy Messages API request format.\n */\ninterface VibeProxyMessagesRequest {\n model: string;\n max_tokens: number;\n messages: Array<{\n role: \"user\" | \"assistant\";\n content:\n | string\n | Array<\n | { type: \"text\"; text: string }\n | { type: \"tool_use\"; id: string; name: string; input: unknown }\n | { type: \"tool_result\"; tool_use_id: string; content: string }\n >;\n }>;\n system?: string;\n temperature?: number;\n stop_sequences?: string[];\n tools?: Array<{\n name: string;\n description: string;\n input_schema: Record<string, unknown>;\n }>;\n tool_choice?:\n | { type: \"auto\" }\n | { type: \"any\" }\n | { type: \"tool\"; name: string };\n}\n\n/**\n * VibeProxy Messages API response format.\n */\ninterface VibeProxyMessagesResponse {\n id: string;\n type: \"message\";\n role: \"assistant\";\n model: string;\n content: Array<\n | { type: \"text\"; text: string }\n | { type: \"tool_use\"; id: string; name: string; input: unknown }\n >;\n stop_reason: \"end_turn\" | \"max_tokens\" | \"stop_sequence\" | \"tool_use\";\n stop_sequence: string | null;\n usage: {\n input_tokens: number;\n output_tokens: number;\n cache_creation_input_tokens?: number;\n cache_read_input_tokens?: number;\n };\n}\n\n/**\n * VibeProxy implementation of ILLM interface.\n * Supports multiple model providers through local VibeProxy server.\n */\nexport class VibeProxyLLM implements ILLM {\n private baseURL: string;\n private apiKey: string;\n private defaultModel: string;\n private timeout: number;\n private defaultMaxTokens: number;\n\n constructor(config: VibeProxyLLMConfig = {}) {\n this.baseURL =\n config.baseURL ?? process.env.VIBEPROXY_URL ?? \"http://localhost:8317\";\n this.apiKey =\n config.apiKey ?? process.env.VIBEPROXY_API_KEY ?? \"any-string\";\n this.defaultModel =\n config.defaultModel ??\n process.env.VIBEPROXY_MODEL ??\n \"claude-sonnet-4-20250514\";\n this.timeout = config.timeout ?? 120000;\n this.defaultMaxTokens = config.defaultMaxTokens ?? DEFAULT_MAX_TOKENS;\n }\n\n getProtocolCapabilities(): LLMProtocolCapabilities {\n return {\n cache: {\n supported: true,\n protocol: \"explicit_handle\",\n scopes: [\"prefix\", \"segments\", \"full_request\"],\n },\n // Current implementation yields complete() as one chunk (not true streaming)\n stream: { supported: false },\n };\n }\n\n /**\n * Make a request to VibeProxy.\n */\n private async request<T>(\n endpoint: string,\n body: unknown,\n headers?: Record<string, string>,\n ): Promise<T> {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.timeout);\n\n try {\n const response = await fetch(`${this.baseURL}${endpoint}`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"x-api-key\": this.apiKey,\n ...headers,\n },\n body: JSON.stringify(body),\n signal: controller.signal,\n });\n\n if (!response.ok) {\n const errorBody = (await response\n .json()\n .catch(() => ({ error: { message: response.statusText } }))) as {\n error?: { message?: string };\n };\n throw new Error(\n `VibeProxy error: ${errorBody.error?.message ?? response.statusText}`,\n );\n }\n\n return response.json() as Promise<T>;\n } finally {\n clearTimeout(timeoutId);\n }\n }\n\n private buildExecutionHeaders(execution?: LLMExecutionPolicy): Record<string, string> {\n const headers: Record<string, string> = {};\n const cache = execution?.cache;\n if (!cache) {\n return headers;\n }\n\n headers[\"x-kb-cache-mode\"] = cache.mode ?? \"prefer\";\n if (cache.scope) {\n headers[\"x-kb-cache-scope\"] = cache.scope;\n }\n if (typeof cache.ttlSec === \"number\") {\n headers[\"x-kb-cache-ttl-sec\"] = String(cache.ttlSec);\n }\n if (cache.key) {\n headers[\"x-kb-cache-key\"] = cache.key;\n }\n\n return headers;\n }\n\n private buildTraceHeaders(options?: LLMOptions): Record<string, string> {\n const trace = options?.metadata?.cacheDecisionTrace;\n if (!trace) {\n return {};\n }\n return {\n \"x-kb-cache-decision\": JSON.stringify(trace),\n };\n }\n\n private extractTextContent(response: VibeProxyMessagesResponse): string {\n return response.content\n .filter((c): c is { type: \"text\"; text: string } => c.type === \"text\")\n .map((c) => c.text)\n .join(\"\");\n }\n\n private convertMessagesForTools(\n messages: LLMMessage[],\n ): {\n messages: VibeProxyMessagesRequest[\"messages\"];\n systemPrompt?: string;\n } {\n const vibeProxyMessages: VibeProxyMessagesRequest[\"messages\"] = [];\n let systemPrompt: string | undefined;\n\n for (const msg of messages) {\n if (msg.role === \"system\") {\n systemPrompt = msg.content;\n continue;\n }\n if (msg.role === \"tool\") {\n vibeProxyMessages.push({\n role: \"user\",\n content: [\n {\n type: \"tool_result\",\n tool_use_id: msg.toolCallId || \"\",\n content: msg.content,\n },\n ],\n });\n continue;\n }\n if (msg.role === \"assistant\" && msg.toolCalls && msg.toolCalls.length > 0) {\n vibeProxyMessages.push({\n role: \"assistant\",\n content: this.toAssistantToolContent(msg),\n });\n continue;\n }\n vibeProxyMessages.push({\n role: msg.role as \"user\" | \"assistant\",\n content: msg.content,\n });\n }\n\n return { messages: vibeProxyMessages, systemPrompt };\n }\n\n private toAssistantToolContent(\n message: LLMMessage,\n ): Array<\n | { type: \"text\"; text: string }\n | { type: \"tool_use\"; id: string; name: string; input: unknown }\n > {\n const contentBlocks: Array<\n | { type: \"text\"; text: string }\n | { type: \"tool_use\"; id: string; name: string; input: unknown }\n > = [];\n\n if (message.content && message.content.trim()) {\n contentBlocks.push({\n type: \"text\",\n text: message.content,\n });\n }\n\n for (const toolCall of message.toolCalls ?? []) {\n contentBlocks.push({\n type: \"tool_use\",\n id: toolCall.id,\n name: toolCall.name,\n input: toolCall.input,\n });\n }\n return contentBlocks;\n }\n\n private buildToolChoice(\n toolChoice: LLMToolCallOptions[\"toolChoice\"],\n ): VibeProxyMessagesRequest[\"tool_choice\"] {\n if (toolChoice === \"auto\") {\n return { type: \"auto\" };\n }\n if (toolChoice === \"required\") {\n return { type: \"any\" };\n }\n if (toolChoice && typeof toolChoice === \"object\") {\n return { type: \"tool\", name: toolChoice.function.name };\n }\n return undefined;\n }\n\n private extractToolCalls(response: VibeProxyMessagesResponse): LLMToolCall[] {\n return response.content\n .filter(\n (\n c,\n ): c is {\n type: \"tool_use\";\n id: string;\n name: string;\n input: unknown;\n } => c.type === \"tool_use\",\n )\n .map((tc) => ({\n id: tc.id,\n name: tc.name,\n input: tc.input,\n }));\n }\n\n async complete(prompt: string, options?: LLMOptions): Promise<LLMResponse> {\n const model = options?.model ?? this.defaultModel;\n\n const requestBody: VibeProxyMessagesRequest = {\n model,\n max_tokens: options?.maxTokens ?? this.defaultMaxTokens,\n messages: [{ role: \"user\", content: prompt }],\n };\n\n if (options?.systemPrompt) {\n requestBody.system = options.systemPrompt;\n }\n if (options?.temperature !== undefined) {\n requestBody.temperature = options.temperature;\n }\n if (options?.stop) {\n requestBody.stop_sequences = options.stop;\n }\n\n const response = await this.request<VibeProxyMessagesResponse>(\n \"/v1/messages\",\n requestBody,\n {\n ...this.buildExecutionHeaders(options?.execution),\n ...this.buildTraceHeaders(options),\n },\n );\n\n return {\n content: this.extractTextContent(response),\n usage: {\n promptTokens: response.usage.input_tokens,\n completionTokens: response.usage.output_tokens,\n cacheReadTokens: response.usage.cache_read_input_tokens ?? 0,\n cacheWriteTokens: response.usage.cache_creation_input_tokens ?? 0,\n providerUsage: {\n stopReason: response.stop_reason,\n },\n },\n model: response.model,\n };\n }\n\n async *stream(prompt: string, options?: LLMOptions): AsyncIterable<string> {\n // VibeProxy supports streaming via SSE, but for simplicity we'll use non-streaming\n // and yield the full response. Can be enhanced later with proper SSE support.\n const response = await this.complete(prompt, options);\n yield response.content;\n }\n\n /**\n * Chat with native tool calling support.\n */\n async chatWithTools(\n messages: LLMMessage[],\n options: LLMToolCallOptions,\n ): Promise<LLMToolCallResponse> {\n const model = options?.model ?? this.defaultModel;\n const converted = this.convertMessagesForTools(messages);\n\n // Convert LLMTool[] to VibeProxy tools format\n const tools: VibeProxyMessagesRequest[\"tools\"] = options.tools.map(\n (tool: LLMTool) => ({\n name: tool.name,\n description: tool.description,\n input_schema: tool.inputSchema,\n }),\n );\n const toolChoice = this.buildToolChoice(options.toolChoice);\n\n const requestBody: VibeProxyMessagesRequest = {\n model,\n max_tokens: options?.maxTokens ?? this.defaultMaxTokens,\n messages: converted.messages,\n tools: options.toolChoice !== \"none\" ? tools : undefined,\n tool_choice: options.toolChoice !== \"none\" ? toolChoice : undefined,\n };\n\n if (converted.systemPrompt || options?.systemPrompt) {\n requestBody.system = converted.systemPrompt ?? options.systemPrompt;\n }\n if (options?.temperature !== undefined) {\n requestBody.temperature = options.temperature;\n }\n if (options?.stop) {\n requestBody.stop_sequences = options.stop;\n }\n\n const response = await this.request<VibeProxyMessagesResponse>(\n \"/v1/messages\",\n requestBody,\n {\n ...this.buildExecutionHeaders(options?.execution),\n ...this.buildTraceHeaders(options),\n },\n );\n const textContent = this.extractTextContent(response);\n const toolCalls = this.extractToolCalls(response);\n\n return {\n content: textContent,\n usage: {\n promptTokens: response.usage.input_tokens,\n completionTokens: response.usage.output_tokens,\n cacheReadTokens: response.usage.cache_read_input_tokens ?? 0,\n cacheWriteTokens: response.usage.cache_creation_input_tokens ?? 0,\n providerUsage: {\n stopReason: response.stop_reason,\n },\n },\n model: response.model,\n toolCalls: toolCalls.length > 0 ? toolCalls : undefined,\n stopReason: response.stop_reason,\n };\n }\n}\n\n/**\n * Create VibeProxy LLM adapter.\n * This is the factory function called by initPlatform() when loading adapters.\n */\nexport function createAdapter(config?: VibeProxyLLMConfig): VibeProxyLLM {\n return new VibeProxyLLM(config);\n}\n\n// Default export for direct import\nexport default createAdapter;\n","/**\n * @module @kb-labs/adapters-vibeproxy/manifest\n * Adapter manifest for VibeProxy LLM.\n */\n\nimport type { AdapterManifest } from \"@kb-labs/sdk/adapters\";\n\n/**\n * Adapter manifest for VibeProxy LLM.\n */\nexport const manifest: AdapterManifest = {\n manifestVersion: \"1.0.0\",\n id: \"vibeproxy-llm\",\n name: \"VibeProxy LLM\",\n version: \"0.1.0\",\n description:\n \"VibeProxy local adapter supporting multiple LLM providers (Claude, GPT, etc.)\",\n author: \"KB Labs Team\",\n license: \"KBPL-1.1\",\n type: \"core\",\n implements: \"ILLM\",\n capabilities: {\n streaming: false, // TODO: implement SSE streaming\n custom: {\n functionCalling: true,\n multiProvider: true,\n },\n },\n configSchema: {\n baseURL: {\n type: \"string\",\n default: \"http://localhost:8317\",\n description: \"VibeProxy server URL\",\n },\n apiKey: {\n type: \"string\",\n default: \"any-string\",\n description: \"API key (any string works for local VibeProxy)\",\n },\n model: {\n type: \"string\",\n default: \"claude-sonnet-4-20250514\",\n description: \"Model to use (claude-*, gpt-*, etc.)\",\n },\n timeout: {\n type: \"number\",\n default: 120000,\n description: \"Request timeout in milliseconds\",\n },\n },\n};\n"]}
|
|
1
|
+
{"version":3,"sources":["../../home/runner/work/kb-labs/kb-labs/adapters/vibeproxy/src/llm.ts","../../home/runner/work/kb-labs/kb-labs/adapters/vibeproxy/src/manifest.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["/**\n * @module @kb-labs/adapters-vibeproxy/llm\n * VibeProxy implementation of ILLM interface.\n * Connects to local VibeProxy server (supports Claude, GPT, and other models).\n */\n\nimport type {\n ILLM,\n LLMOptions,\n LLMResponse,\n LLMMessage,\n LLMToolCallOptions,\n LLMToolCallResponse,\n LLMTool,\n LLMToolCall,\n LLMProtocolCapabilities,\n LLMExecutionPolicy,\n} from \"@kb-labs/sdk/adapters\";\n\n/**\n * Configuration for VibeProxy LLM adapter.\n */\nexport interface VibeProxyLLMConfig {\n /** Base URL for VibeProxy (defaults to http://localhost:8317) */\n baseURL?: string;\n /** API key (can be any string for VibeProxy) */\n apiKey?: string;\n /** Default model to use */\n defaultModel?: string;\n /** Request timeout in ms (defaults to 120000) */\n timeout?: number;\n /** Default max output tokens when caller does not specify. Overrides the hardcoded 4096. */\n defaultMaxTokens?: number;\n}\n\n/** Default max output tokens — avoids hitting the 4096 hardcoded limit mid-response. */\nconst DEFAULT_MAX_TOKENS = 16_384;\n\n/**\n * VibeProxy Messages API request format.\n */\ninterface VibeProxyMessagesRequest {\n model: string;\n max_tokens: number;\n messages: Array<{\n role: \"user\" | \"assistant\";\n content:\n | string\n | Array<\n | { type: \"text\"; text: string }\n | { type: \"tool_use\"; id: string; name: string; input: unknown }\n | { type: \"tool_result\"; tool_use_id: string; content: string }\n >;\n }>;\n system?: string;\n temperature?: number;\n stop_sequences?: string[];\n tools?: Array<{\n name: string;\n description: string;\n input_schema: Record<string, unknown>;\n }>;\n tool_choice?:\n | { type: \"auto\" }\n | { type: \"any\" }\n | { type: \"tool\"; name: string };\n}\n\n/**\n * VibeProxy Messages API response format.\n */\ninterface VibeProxyMessagesResponse {\n id: string;\n type: \"message\";\n role: \"assistant\";\n model: string;\n content: Array<\n | { type: \"text\"; text: string }\n | { type: \"tool_use\"; id: string; name: string; input: unknown }\n >;\n stop_reason: \"end_turn\" | \"max_tokens\" | \"stop_sequence\" | \"tool_use\";\n stop_sequence: string | null;\n usage: {\n input_tokens: number;\n output_tokens: number;\n cache_creation_input_tokens?: number;\n cache_read_input_tokens?: number;\n };\n}\n\n/**\n * VibeProxy implementation of ILLM interface.\n * Supports multiple model providers through local VibeProxy server.\n */\nexport class VibeProxyLLM implements ILLM {\n private baseURL: string;\n private apiKey: string;\n private defaultModel: string;\n private timeout: number;\n private defaultMaxTokens: number;\n\n constructor(config: VibeProxyLLMConfig = {}) {\n this.baseURL =\n config.baseURL ?? process.env.VIBEPROXY_URL ?? \"http://localhost:8317\";\n this.apiKey =\n config.apiKey ?? process.env.VIBEPROXY_API_KEY ?? \"any-string\";\n this.defaultModel =\n config.defaultModel ??\n process.env.VIBEPROXY_MODEL ??\n \"claude-sonnet-4-20250514\";\n this.timeout = config.timeout ?? 120000;\n this.defaultMaxTokens = config.defaultMaxTokens ?? DEFAULT_MAX_TOKENS;\n }\n\n getProtocolCapabilities(): LLMProtocolCapabilities {\n return {\n cache: {\n supported: true,\n protocol: \"explicit_handle\",\n scopes: [\"prefix\", \"segments\", \"full_request\"],\n },\n // Current implementation yields complete() as one chunk (not true streaming)\n stream: { supported: false },\n };\n }\n\n /**\n * Make a request to VibeProxy.\n */\n private async request<T>(\n endpoint: string,\n body: unknown,\n headers?: Record<string, string>,\n ): Promise<T> {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.timeout);\n\n try {\n const response = await fetch(`${this.baseURL}${endpoint}`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"x-api-key\": this.apiKey,\n ...headers,\n },\n body: JSON.stringify(body),\n signal: controller.signal,\n });\n\n if (!response.ok) {\n const errorBody = (await response\n .json()\n .catch(() => ({ error: { message: response.statusText } }))) as {\n error?: { message?: string };\n };\n throw new Error(\n `VibeProxy error: ${errorBody.error?.message ?? response.statusText}`,\n );\n }\n\n return response.json() as Promise<T>;\n } finally {\n clearTimeout(timeoutId);\n }\n }\n\n private buildExecutionHeaders(execution?: LLMExecutionPolicy): Record<string, string> {\n const headers: Record<string, string> = {};\n const cache = execution?.cache;\n if (!cache) {\n return headers;\n }\n\n headers[\"x-kb-cache-mode\"] = cache.mode ?? \"prefer\";\n if (cache.scope) {\n headers[\"x-kb-cache-scope\"] = cache.scope;\n }\n if (typeof cache.ttlSec === \"number\") {\n headers[\"x-kb-cache-ttl-sec\"] = String(cache.ttlSec);\n }\n if (cache.key) {\n headers[\"x-kb-cache-key\"] = cache.key;\n }\n\n return headers;\n }\n\n private buildTraceHeaders(options?: LLMOptions): Record<string, string> {\n const trace = options?.metadata?.cacheDecisionTrace;\n if (!trace) {\n return {};\n }\n return {\n \"x-kb-cache-decision\": JSON.stringify(trace),\n };\n }\n\n private extractTextContent(response: VibeProxyMessagesResponse): string {\n return response.content\n .filter((c): c is { type: \"text\"; text: string } => c.type === \"text\")\n .map((c) => c.text)\n .join(\"\");\n }\n\n private convertMessagesForTools(\n messages: LLMMessage[],\n ): {\n messages: VibeProxyMessagesRequest[\"messages\"];\n systemPrompt?: string;\n } {\n const vibeProxyMessages: VibeProxyMessagesRequest[\"messages\"] = [];\n let systemPrompt: string | undefined;\n\n for (const msg of messages) {\n if (msg.role === \"system\") {\n systemPrompt = msg.content;\n continue;\n }\n if (msg.role === \"tool\") {\n vibeProxyMessages.push({\n role: \"user\",\n content: [\n {\n type: \"tool_result\",\n tool_use_id: msg.toolCallId || \"\",\n content: msg.content,\n },\n ],\n });\n continue;\n }\n if (msg.role === \"assistant\" && msg.toolCalls && msg.toolCalls.length > 0) {\n vibeProxyMessages.push({\n role: \"assistant\",\n content: this.toAssistantToolContent(msg),\n });\n continue;\n }\n vibeProxyMessages.push({\n role: msg.role as \"user\" | \"assistant\",\n content: msg.content,\n });\n }\n\n return { messages: vibeProxyMessages, systemPrompt };\n }\n\n private toAssistantToolContent(\n message: LLMMessage,\n ): Array<\n | { type: \"text\"; text: string }\n | { type: \"tool_use\"; id: string; name: string; input: unknown }\n > {\n const contentBlocks: Array<\n | { type: \"text\"; text: string }\n | { type: \"tool_use\"; id: string; name: string; input: unknown }\n > = [];\n\n if (message.content && message.content.trim()) {\n contentBlocks.push({\n type: \"text\",\n text: message.content,\n });\n }\n\n for (const toolCall of message.toolCalls ?? []) {\n contentBlocks.push({\n type: \"tool_use\",\n id: toolCall.id,\n name: toolCall.name,\n input: toolCall.input,\n });\n }\n return contentBlocks;\n }\n\n private buildToolChoice(\n toolChoice: LLMToolCallOptions[\"toolChoice\"],\n ): VibeProxyMessagesRequest[\"tool_choice\"] {\n if (toolChoice === \"auto\") {\n return { type: \"auto\" };\n }\n if (toolChoice === \"required\") {\n return { type: \"any\" };\n }\n if (toolChoice && typeof toolChoice === \"object\") {\n return { type: \"tool\", name: toolChoice.function.name };\n }\n return undefined;\n }\n\n private extractToolCalls(response: VibeProxyMessagesResponse): LLMToolCall[] {\n return response.content\n .filter(\n (\n c,\n ): c is {\n type: \"tool_use\";\n id: string;\n name: string;\n input: unknown;\n } => c.type === \"tool_use\",\n )\n .map((tc) => ({\n id: tc.id,\n name: tc.name,\n input: tc.input,\n }));\n }\n\n async complete(prompt: string, options?: LLMOptions): Promise<LLMResponse> {\n const model = options?.model ?? this.defaultModel;\n\n const requestBody: VibeProxyMessagesRequest = {\n model,\n max_tokens: options?.maxTokens ?? this.defaultMaxTokens,\n messages: [{ role: \"user\", content: prompt }],\n };\n\n if (options?.systemPrompt) {\n requestBody.system = options.systemPrompt;\n }\n if (options?.temperature !== undefined) {\n requestBody.temperature = options.temperature;\n }\n if (options?.stop) {\n requestBody.stop_sequences = options.stop;\n }\n\n const response = await this.request<VibeProxyMessagesResponse>(\n \"/v1/messages\",\n requestBody,\n {\n ...this.buildExecutionHeaders(options?.execution),\n ...this.buildTraceHeaders(options),\n },\n );\n\n return {\n content: this.extractTextContent(response),\n usage: {\n promptTokens: response.usage.input_tokens,\n completionTokens: response.usage.output_tokens,\n cacheReadTokens: response.usage.cache_read_input_tokens ?? 0,\n cacheWriteTokens: response.usage.cache_creation_input_tokens ?? 0,\n providerUsage: {\n stopReason: response.stop_reason,\n },\n },\n model: response.model,\n };\n }\n\n async *stream(prompt: string, options?: LLMOptions): AsyncIterable<string> {\n // VibeProxy supports streaming via SSE, but for simplicity we'll use non-streaming\n // and yield the full response. Can be enhanced later with proper SSE support.\n const response = await this.complete(prompt, options);\n yield response.content;\n }\n\n /**\n * Chat with native tool calling support.\n */\n async chatWithTools(\n messages: LLMMessage[],\n options: LLMToolCallOptions,\n ): Promise<LLMToolCallResponse> {\n const model = options?.model ?? this.defaultModel;\n const converted = this.convertMessagesForTools(messages);\n\n // Convert LLMTool[] to VibeProxy tools format\n const tools: VibeProxyMessagesRequest[\"tools\"] = options.tools.map(\n (tool: LLMTool) => ({\n name: tool.name,\n description: tool.description,\n input_schema: tool.inputSchema,\n }),\n );\n const toolChoice = this.buildToolChoice(options.toolChoice);\n\n const requestBody: VibeProxyMessagesRequest = {\n model,\n max_tokens: options?.maxTokens ?? this.defaultMaxTokens,\n messages: converted.messages,\n tools: options.toolChoice !== \"none\" ? tools : undefined,\n tool_choice: options.toolChoice !== \"none\" ? toolChoice : undefined,\n };\n\n if (converted.systemPrompt || options?.systemPrompt) {\n requestBody.system = converted.systemPrompt ?? options.systemPrompt;\n }\n if (options?.temperature !== undefined) {\n requestBody.temperature = options.temperature;\n }\n if (options?.stop) {\n requestBody.stop_sequences = options.stop;\n }\n\n const response = await this.request<VibeProxyMessagesResponse>(\n \"/v1/messages\",\n requestBody,\n {\n ...this.buildExecutionHeaders(options?.execution),\n ...this.buildTraceHeaders(options),\n },\n );\n const textContent = this.extractTextContent(response);\n const toolCalls = this.extractToolCalls(response);\n\n return {\n content: textContent,\n usage: {\n promptTokens: response.usage.input_tokens,\n completionTokens: response.usage.output_tokens,\n cacheReadTokens: response.usage.cache_read_input_tokens ?? 0,\n cacheWriteTokens: response.usage.cache_creation_input_tokens ?? 0,\n providerUsage: {\n stopReason: response.stop_reason,\n },\n },\n model: response.model,\n toolCalls: toolCalls.length > 0 ? toolCalls : undefined,\n stopReason: response.stop_reason,\n };\n }\n}\n\n/**\n * Create VibeProxy LLM adapter.\n * This is the factory function called by initPlatform() when loading adapters.\n */\nexport function createAdapter(config?: VibeProxyLLMConfig): VibeProxyLLM {\n return new VibeProxyLLM(config);\n}\n\n// Default export for direct import\nexport default createAdapter;\n","/**\n * @module @kb-labs/adapters-vibeproxy/manifest\n * Adapter manifest for VibeProxy LLM.\n */\n\nimport type { AdapterManifest } from \"@kb-labs/sdk/adapters\";\n\n/**\n * Adapter manifest for VibeProxy LLM.\n */\nexport const manifest: AdapterManifest = {\n manifestVersion: \"1.0.0\",\n id: \"vibeproxy-llm\",\n name: \"VibeProxy LLM\",\n version: \"0.1.0\",\n description:\n \"VibeProxy local adapter supporting multiple LLM providers (Claude, GPT, etc.)\",\n author: \"KB Labs Team\",\n license: \"KBPL-1.1\",\n type: \"core\",\n implements: \"ILLM\",\n capabilities: {\n streaming: false, // TODO: implement SSE streaming\n custom: {\n functionCalling: true,\n multiProvider: true,\n },\n },\n configSchema: {\n baseURL: {\n type: \"string\",\n default: \"http://localhost:8317\",\n description: \"VibeProxy server URL\",\n },\n apiKey: {\n type: \"string\",\n default: \"any-string\",\n description: \"API key (any string works for local VibeProxy)\",\n },\n model: {\n type: \"string\",\n default: \"claude-sonnet-4-20250514\",\n description: \"Model to use (claude-*, gpt-*, etc.)\",\n },\n timeout: {\n type: \"number\",\n default: 120000,\n description: \"Request timeout in milliseconds\",\n },\n },\n};\n"]}
|
package/dist/llm.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/llm.ts"],"names":[],"mappings":"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","file":"llm.js","sourcesContent":["/**\n * @module @kb-labs/adapters-vibeproxy/llm\n * VibeProxy implementation of ILLM interface.\n * Connects to local VibeProxy server (supports Claude, GPT, and other models).\n */\n\nimport type {\n ILLM,\n LLMOptions,\n LLMResponse,\n LLMMessage,\n LLMToolCallOptions,\n LLMToolCallResponse,\n LLMTool,\n LLMToolCall,\n LLMProtocolCapabilities,\n LLMExecutionPolicy,\n} from \"@kb-labs/sdk/adapters\";\n\n/**\n * Configuration for VibeProxy LLM adapter.\n */\nexport interface VibeProxyLLMConfig {\n /** Base URL for VibeProxy (defaults to http://localhost:8317) */\n baseURL?: string;\n /** API key (can be any string for VibeProxy) */\n apiKey?: string;\n /** Default model to use */\n defaultModel?: string;\n /** Request timeout in ms (defaults to 120000) */\n timeout?: number;\n /** Default max output tokens when caller does not specify. Overrides the hardcoded 4096. */\n defaultMaxTokens?: number;\n}\n\n/** Default max output tokens — avoids hitting the 4096 hardcoded limit mid-response. */\nconst DEFAULT_MAX_TOKENS = 16_384;\n\n/**\n * VibeProxy Messages API request format.\n */\ninterface VibeProxyMessagesRequest {\n model: string;\n max_tokens: number;\n messages: Array<{\n role: \"user\" | \"assistant\";\n content:\n | string\n | Array<\n | { type: \"text\"; text: string }\n | { type: \"tool_use\"; id: string; name: string; input: unknown }\n | { type: \"tool_result\"; tool_use_id: string; content: string }\n >;\n }>;\n system?: string;\n temperature?: number;\n stop_sequences?: string[];\n tools?: Array<{\n name: string;\n description: string;\n input_schema: Record<string, unknown>;\n }>;\n tool_choice?:\n | { type: \"auto\" }\n | { type: \"any\" }\n | { type: \"tool\"; name: string };\n}\n\n/**\n * VibeProxy Messages API response format.\n */\ninterface VibeProxyMessagesResponse {\n id: string;\n type: \"message\";\n role: \"assistant\";\n model: string;\n content: Array<\n | { type: \"text\"; text: string }\n | { type: \"tool_use\"; id: string; name: string; input: unknown }\n >;\n stop_reason: \"end_turn\" | \"max_tokens\" | \"stop_sequence\" | \"tool_use\";\n stop_sequence: string | null;\n usage: {\n input_tokens: number;\n output_tokens: number;\n cache_creation_input_tokens?: number;\n cache_read_input_tokens?: number;\n };\n}\n\n/**\n * VibeProxy implementation of ILLM interface.\n * Supports multiple model providers through local VibeProxy server.\n */\nexport class VibeProxyLLM implements ILLM {\n private baseURL: string;\n private apiKey: string;\n private defaultModel: string;\n private timeout: number;\n private defaultMaxTokens: number;\n\n constructor(config: VibeProxyLLMConfig = {}) {\n this.baseURL =\n config.baseURL ?? process.env.VIBEPROXY_URL ?? \"http://localhost:8317\";\n this.apiKey =\n config.apiKey ?? process.env.VIBEPROXY_API_KEY ?? \"any-string\";\n this.defaultModel =\n config.defaultModel ??\n process.env.VIBEPROXY_MODEL ??\n \"claude-sonnet-4-20250514\";\n this.timeout = config.timeout ?? 120000;\n this.defaultMaxTokens = config.defaultMaxTokens ?? DEFAULT_MAX_TOKENS;\n }\n\n getProtocolCapabilities(): LLMProtocolCapabilities {\n return {\n cache: {\n supported: true,\n protocol: \"explicit_handle\",\n scopes: [\"prefix\", \"segments\", \"full_request\"],\n },\n // Current implementation yields complete() as one chunk (not true streaming)\n stream: { supported: false },\n };\n }\n\n /**\n * Make a request to VibeProxy.\n */\n private async request<T>(\n endpoint: string,\n body: unknown,\n headers?: Record<string, string>,\n ): Promise<T> {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.timeout);\n\n try {\n const response = await fetch(`${this.baseURL}${endpoint}`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"x-api-key\": this.apiKey,\n ...headers,\n },\n body: JSON.stringify(body),\n signal: controller.signal,\n });\n\n if (!response.ok) {\n const errorBody = (await response\n .json()\n .catch(() => ({ error: { message: response.statusText } }))) as {\n error?: { message?: string };\n };\n throw new Error(\n `VibeProxy error: ${errorBody.error?.message ?? response.statusText}`,\n );\n }\n\n return response.json() as Promise<T>;\n } finally {\n clearTimeout(timeoutId);\n }\n }\n\n private buildExecutionHeaders(execution?: LLMExecutionPolicy): Record<string, string> {\n const headers: Record<string, string> = {};\n const cache = execution?.cache;\n if (!cache) {\n return headers;\n }\n\n headers[\"x-kb-cache-mode\"] = cache.mode ?? \"prefer\";\n if (cache.scope) {\n headers[\"x-kb-cache-scope\"] = cache.scope;\n }\n if (typeof cache.ttlSec === \"number\") {\n headers[\"x-kb-cache-ttl-sec\"] = String(cache.ttlSec);\n }\n if (cache.key) {\n headers[\"x-kb-cache-key\"] = cache.key;\n }\n\n return headers;\n }\n\n private buildTraceHeaders(options?: LLMOptions): Record<string, string> {\n const trace = options?.metadata?.cacheDecisionTrace;\n if (!trace) {\n return {};\n }\n return {\n \"x-kb-cache-decision\": JSON.stringify(trace),\n };\n }\n\n private extractTextContent(response: VibeProxyMessagesResponse): string {\n return response.content\n .filter((c): c is { type: \"text\"; text: string } => c.type === \"text\")\n .map((c) => c.text)\n .join(\"\");\n }\n\n private convertMessagesForTools(\n messages: LLMMessage[],\n ): {\n messages: VibeProxyMessagesRequest[\"messages\"];\n systemPrompt?: string;\n } {\n const vibeProxyMessages: VibeProxyMessagesRequest[\"messages\"] = [];\n let systemPrompt: string | undefined;\n\n for (const msg of messages) {\n if (msg.role === \"system\") {\n systemPrompt = msg.content;\n continue;\n }\n if (msg.role === \"tool\") {\n vibeProxyMessages.push({\n role: \"user\",\n content: [\n {\n type: \"tool_result\",\n tool_use_id: msg.toolCallId || \"\",\n content: msg.content,\n },\n ],\n });\n continue;\n }\n if (msg.role === \"assistant\" && msg.toolCalls && msg.toolCalls.length > 0) {\n vibeProxyMessages.push({\n role: \"assistant\",\n content: this.toAssistantToolContent(msg),\n });\n continue;\n }\n vibeProxyMessages.push({\n role: msg.role as \"user\" | \"assistant\",\n content: msg.content,\n });\n }\n\n return { messages: vibeProxyMessages, systemPrompt };\n }\n\n private toAssistantToolContent(\n message: LLMMessage,\n ): Array<\n | { type: \"text\"; text: string }\n | { type: \"tool_use\"; id: string; name: string; input: unknown }\n > {\n const contentBlocks: Array<\n | { type: \"text\"; text: string }\n | { type: \"tool_use\"; id: string; name: string; input: unknown }\n > = [];\n\n if (message.content && message.content.trim()) {\n contentBlocks.push({\n type: \"text\",\n text: message.content,\n });\n }\n\n for (const toolCall of message.toolCalls ?? []) {\n contentBlocks.push({\n type: \"tool_use\",\n id: toolCall.id,\n name: toolCall.name,\n input: toolCall.input,\n });\n }\n return contentBlocks;\n }\n\n private buildToolChoice(\n toolChoice: LLMToolCallOptions[\"toolChoice\"],\n ): VibeProxyMessagesRequest[\"tool_choice\"] {\n if (toolChoice === \"auto\") {\n return { type: \"auto\" };\n }\n if (toolChoice === \"required\") {\n return { type: \"any\" };\n }\n if (toolChoice && typeof toolChoice === \"object\") {\n return { type: \"tool\", name: toolChoice.function.name };\n }\n return undefined;\n }\n\n private extractToolCalls(response: VibeProxyMessagesResponse): LLMToolCall[] {\n return response.content\n .filter(\n (\n c,\n ): c is {\n type: \"tool_use\";\n id: string;\n name: string;\n input: unknown;\n } => c.type === \"tool_use\",\n )\n .map((tc) => ({\n id: tc.id,\n name: tc.name,\n input: tc.input,\n }));\n }\n\n async complete(prompt: string, options?: LLMOptions): Promise<LLMResponse> {\n const model = options?.model ?? this.defaultModel;\n\n const requestBody: VibeProxyMessagesRequest = {\n model,\n max_tokens: options?.maxTokens ?? this.defaultMaxTokens,\n messages: [{ role: \"user\", content: prompt }],\n };\n\n if (options?.systemPrompt) {\n requestBody.system = options.systemPrompt;\n }\n if (options?.temperature !== undefined) {\n requestBody.temperature = options.temperature;\n }\n if (options?.stop) {\n requestBody.stop_sequences = options.stop;\n }\n\n const response = await this.request<VibeProxyMessagesResponse>(\n \"/v1/messages\",\n requestBody,\n {\n ...this.buildExecutionHeaders(options?.execution),\n ...this.buildTraceHeaders(options),\n },\n );\n\n return {\n content: this.extractTextContent(response),\n usage: {\n promptTokens: response.usage.input_tokens,\n completionTokens: response.usage.output_tokens,\n cacheReadTokens: response.usage.cache_read_input_tokens ?? 0,\n cacheWriteTokens: response.usage.cache_creation_input_tokens ?? 0,\n providerUsage: {\n stopReason: response.stop_reason,\n },\n },\n model: response.model,\n };\n }\n\n async *stream(prompt: string, options?: LLMOptions): AsyncIterable<string> {\n // VibeProxy supports streaming via SSE, but for simplicity we'll use non-streaming\n // and yield the full response. Can be enhanced later with proper SSE support.\n const response = await this.complete(prompt, options);\n yield response.content;\n }\n\n /**\n * Chat with native tool calling support.\n */\n async chatWithTools(\n messages: LLMMessage[],\n options: LLMToolCallOptions,\n ): Promise<LLMToolCallResponse> {\n const model = options?.model ?? this.defaultModel;\n const converted = this.convertMessagesForTools(messages);\n\n // Convert LLMTool[] to VibeProxy tools format\n const tools: VibeProxyMessagesRequest[\"tools\"] = options.tools.map(\n (tool: LLMTool) => ({\n name: tool.name,\n description: tool.description,\n input_schema: tool.inputSchema,\n }),\n );\n const toolChoice = this.buildToolChoice(options.toolChoice);\n\n const requestBody: VibeProxyMessagesRequest = {\n model,\n max_tokens: options?.maxTokens ?? this.defaultMaxTokens,\n messages: converted.messages,\n tools: options.toolChoice !== \"none\" ? tools : undefined,\n tool_choice: options.toolChoice !== \"none\" ? toolChoice : undefined,\n };\n\n if (converted.systemPrompt || options?.systemPrompt) {\n requestBody.system = converted.systemPrompt ?? options.systemPrompt;\n }\n if (options?.temperature !== undefined) {\n requestBody.temperature = options.temperature;\n }\n if (options?.stop) {\n requestBody.stop_sequences = options.stop;\n }\n\n const response = await this.request<VibeProxyMessagesResponse>(\n \"/v1/messages\",\n requestBody,\n {\n ...this.buildExecutionHeaders(options?.execution),\n ...this.buildTraceHeaders(options),\n },\n );\n const textContent = this.extractTextContent(response);\n const toolCalls = this.extractToolCalls(response);\n\n return {\n content: textContent,\n usage: {\n promptTokens: response.usage.input_tokens,\n completionTokens: response.usage.output_tokens,\n cacheReadTokens: response.usage.cache_read_input_tokens ?? 0,\n cacheWriteTokens: response.usage.cache_creation_input_tokens ?? 0,\n providerUsage: {\n stopReason: response.stop_reason,\n },\n },\n model: response.model,\n toolCalls: toolCalls.length > 0 ? toolCalls : undefined,\n stopReason: response.stop_reason,\n };\n }\n}\n\n/**\n * Create VibeProxy LLM adapter.\n * This is the factory function called by initPlatform() when loading adapters.\n */\nexport function createAdapter(config?: VibeProxyLLMConfig): VibeProxyLLM {\n return new VibeProxyLLM(config);\n}\n\n// Default export for direct import\nexport default createAdapter;\n"]}
|
|
1
|
+
{"version":3,"sources":["../../home/runner/work/kb-labs/kb-labs/adapters/vibeproxy/src/llm.ts"],"names":[],"mappings":"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","file":"llm.js","sourcesContent":["/**\n * @module @kb-labs/adapters-vibeproxy/llm\n * VibeProxy implementation of ILLM interface.\n * Connects to local VibeProxy server (supports Claude, GPT, and other models).\n */\n\nimport type {\n ILLM,\n LLMOptions,\n LLMResponse,\n LLMMessage,\n LLMToolCallOptions,\n LLMToolCallResponse,\n LLMTool,\n LLMToolCall,\n LLMProtocolCapabilities,\n LLMExecutionPolicy,\n} from \"@kb-labs/sdk/adapters\";\n\n/**\n * Configuration for VibeProxy LLM adapter.\n */\nexport interface VibeProxyLLMConfig {\n /** Base URL for VibeProxy (defaults to http://localhost:8317) */\n baseURL?: string;\n /** API key (can be any string for VibeProxy) */\n apiKey?: string;\n /** Default model to use */\n defaultModel?: string;\n /** Request timeout in ms (defaults to 120000) */\n timeout?: number;\n /** Default max output tokens when caller does not specify. Overrides the hardcoded 4096. */\n defaultMaxTokens?: number;\n}\n\n/** Default max output tokens — avoids hitting the 4096 hardcoded limit mid-response. */\nconst DEFAULT_MAX_TOKENS = 16_384;\n\n/**\n * VibeProxy Messages API request format.\n */\ninterface VibeProxyMessagesRequest {\n model: string;\n max_tokens: number;\n messages: Array<{\n role: \"user\" | \"assistant\";\n content:\n | string\n | Array<\n | { type: \"text\"; text: string }\n | { type: \"tool_use\"; id: string; name: string; input: unknown }\n | { type: \"tool_result\"; tool_use_id: string; content: string }\n >;\n }>;\n system?: string;\n temperature?: number;\n stop_sequences?: string[];\n tools?: Array<{\n name: string;\n description: string;\n input_schema: Record<string, unknown>;\n }>;\n tool_choice?:\n | { type: \"auto\" }\n | { type: \"any\" }\n | { type: \"tool\"; name: string };\n}\n\n/**\n * VibeProxy Messages API response format.\n */\ninterface VibeProxyMessagesResponse {\n id: string;\n type: \"message\";\n role: \"assistant\";\n model: string;\n content: Array<\n | { type: \"text\"; text: string }\n | { type: \"tool_use\"; id: string; name: string; input: unknown }\n >;\n stop_reason: \"end_turn\" | \"max_tokens\" | \"stop_sequence\" | \"tool_use\";\n stop_sequence: string | null;\n usage: {\n input_tokens: number;\n output_tokens: number;\n cache_creation_input_tokens?: number;\n cache_read_input_tokens?: number;\n };\n}\n\n/**\n * VibeProxy implementation of ILLM interface.\n * Supports multiple model providers through local VibeProxy server.\n */\nexport class VibeProxyLLM implements ILLM {\n private baseURL: string;\n private apiKey: string;\n private defaultModel: string;\n private timeout: number;\n private defaultMaxTokens: number;\n\n constructor(config: VibeProxyLLMConfig = {}) {\n this.baseURL =\n config.baseURL ?? process.env.VIBEPROXY_URL ?? \"http://localhost:8317\";\n this.apiKey =\n config.apiKey ?? process.env.VIBEPROXY_API_KEY ?? \"any-string\";\n this.defaultModel =\n config.defaultModel ??\n process.env.VIBEPROXY_MODEL ??\n \"claude-sonnet-4-20250514\";\n this.timeout = config.timeout ?? 120000;\n this.defaultMaxTokens = config.defaultMaxTokens ?? DEFAULT_MAX_TOKENS;\n }\n\n getProtocolCapabilities(): LLMProtocolCapabilities {\n return {\n cache: {\n supported: true,\n protocol: \"explicit_handle\",\n scopes: [\"prefix\", \"segments\", \"full_request\"],\n },\n // Current implementation yields complete() as one chunk (not true streaming)\n stream: { supported: false },\n };\n }\n\n /**\n * Make a request to VibeProxy.\n */\n private async request<T>(\n endpoint: string,\n body: unknown,\n headers?: Record<string, string>,\n ): Promise<T> {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.timeout);\n\n try {\n const response = await fetch(`${this.baseURL}${endpoint}`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"x-api-key\": this.apiKey,\n ...headers,\n },\n body: JSON.stringify(body),\n signal: controller.signal,\n });\n\n if (!response.ok) {\n const errorBody = (await response\n .json()\n .catch(() => ({ error: { message: response.statusText } }))) as {\n error?: { message?: string };\n };\n throw new Error(\n `VibeProxy error: ${errorBody.error?.message ?? response.statusText}`,\n );\n }\n\n return response.json() as Promise<T>;\n } finally {\n clearTimeout(timeoutId);\n }\n }\n\n private buildExecutionHeaders(execution?: LLMExecutionPolicy): Record<string, string> {\n const headers: Record<string, string> = {};\n const cache = execution?.cache;\n if (!cache) {\n return headers;\n }\n\n headers[\"x-kb-cache-mode\"] = cache.mode ?? \"prefer\";\n if (cache.scope) {\n headers[\"x-kb-cache-scope\"] = cache.scope;\n }\n if (typeof cache.ttlSec === \"number\") {\n headers[\"x-kb-cache-ttl-sec\"] = String(cache.ttlSec);\n }\n if (cache.key) {\n headers[\"x-kb-cache-key\"] = cache.key;\n }\n\n return headers;\n }\n\n private buildTraceHeaders(options?: LLMOptions): Record<string, string> {\n const trace = options?.metadata?.cacheDecisionTrace;\n if (!trace) {\n return {};\n }\n return {\n \"x-kb-cache-decision\": JSON.stringify(trace),\n };\n }\n\n private extractTextContent(response: VibeProxyMessagesResponse): string {\n return response.content\n .filter((c): c is { type: \"text\"; text: string } => c.type === \"text\")\n .map((c) => c.text)\n .join(\"\");\n }\n\n private convertMessagesForTools(\n messages: LLMMessage[],\n ): {\n messages: VibeProxyMessagesRequest[\"messages\"];\n systemPrompt?: string;\n } {\n const vibeProxyMessages: VibeProxyMessagesRequest[\"messages\"] = [];\n let systemPrompt: string | undefined;\n\n for (const msg of messages) {\n if (msg.role === \"system\") {\n systemPrompt = msg.content;\n continue;\n }\n if (msg.role === \"tool\") {\n vibeProxyMessages.push({\n role: \"user\",\n content: [\n {\n type: \"tool_result\",\n tool_use_id: msg.toolCallId || \"\",\n content: msg.content,\n },\n ],\n });\n continue;\n }\n if (msg.role === \"assistant\" && msg.toolCalls && msg.toolCalls.length > 0) {\n vibeProxyMessages.push({\n role: \"assistant\",\n content: this.toAssistantToolContent(msg),\n });\n continue;\n }\n vibeProxyMessages.push({\n role: msg.role as \"user\" | \"assistant\",\n content: msg.content,\n });\n }\n\n return { messages: vibeProxyMessages, systemPrompt };\n }\n\n private toAssistantToolContent(\n message: LLMMessage,\n ): Array<\n | { type: \"text\"; text: string }\n | { type: \"tool_use\"; id: string; name: string; input: unknown }\n > {\n const contentBlocks: Array<\n | { type: \"text\"; text: string }\n | { type: \"tool_use\"; id: string; name: string; input: unknown }\n > = [];\n\n if (message.content && message.content.trim()) {\n contentBlocks.push({\n type: \"text\",\n text: message.content,\n });\n }\n\n for (const toolCall of message.toolCalls ?? []) {\n contentBlocks.push({\n type: \"tool_use\",\n id: toolCall.id,\n name: toolCall.name,\n input: toolCall.input,\n });\n }\n return contentBlocks;\n }\n\n private buildToolChoice(\n toolChoice: LLMToolCallOptions[\"toolChoice\"],\n ): VibeProxyMessagesRequest[\"tool_choice\"] {\n if (toolChoice === \"auto\") {\n return { type: \"auto\" };\n }\n if (toolChoice === \"required\") {\n return { type: \"any\" };\n }\n if (toolChoice && typeof toolChoice === \"object\") {\n return { type: \"tool\", name: toolChoice.function.name };\n }\n return undefined;\n }\n\n private extractToolCalls(response: VibeProxyMessagesResponse): LLMToolCall[] {\n return response.content\n .filter(\n (\n c,\n ): c is {\n type: \"tool_use\";\n id: string;\n name: string;\n input: unknown;\n } => c.type === \"tool_use\",\n )\n .map((tc) => ({\n id: tc.id,\n name: tc.name,\n input: tc.input,\n }));\n }\n\n async complete(prompt: string, options?: LLMOptions): Promise<LLMResponse> {\n const model = options?.model ?? this.defaultModel;\n\n const requestBody: VibeProxyMessagesRequest = {\n model,\n max_tokens: options?.maxTokens ?? this.defaultMaxTokens,\n messages: [{ role: \"user\", content: prompt }],\n };\n\n if (options?.systemPrompt) {\n requestBody.system = options.systemPrompt;\n }\n if (options?.temperature !== undefined) {\n requestBody.temperature = options.temperature;\n }\n if (options?.stop) {\n requestBody.stop_sequences = options.stop;\n }\n\n const response = await this.request<VibeProxyMessagesResponse>(\n \"/v1/messages\",\n requestBody,\n {\n ...this.buildExecutionHeaders(options?.execution),\n ...this.buildTraceHeaders(options),\n },\n );\n\n return {\n content: this.extractTextContent(response),\n usage: {\n promptTokens: response.usage.input_tokens,\n completionTokens: response.usage.output_tokens,\n cacheReadTokens: response.usage.cache_read_input_tokens ?? 0,\n cacheWriteTokens: response.usage.cache_creation_input_tokens ?? 0,\n providerUsage: {\n stopReason: response.stop_reason,\n },\n },\n model: response.model,\n };\n }\n\n async *stream(prompt: string, options?: LLMOptions): AsyncIterable<string> {\n // VibeProxy supports streaming via SSE, but for simplicity we'll use non-streaming\n // and yield the full response. Can be enhanced later with proper SSE support.\n const response = await this.complete(prompt, options);\n yield response.content;\n }\n\n /**\n * Chat with native tool calling support.\n */\n async chatWithTools(\n messages: LLMMessage[],\n options: LLMToolCallOptions,\n ): Promise<LLMToolCallResponse> {\n const model = options?.model ?? this.defaultModel;\n const converted = this.convertMessagesForTools(messages);\n\n // Convert LLMTool[] to VibeProxy tools format\n const tools: VibeProxyMessagesRequest[\"tools\"] = options.tools.map(\n (tool: LLMTool) => ({\n name: tool.name,\n description: tool.description,\n input_schema: tool.inputSchema,\n }),\n );\n const toolChoice = this.buildToolChoice(options.toolChoice);\n\n const requestBody: VibeProxyMessagesRequest = {\n model,\n max_tokens: options?.maxTokens ?? this.defaultMaxTokens,\n messages: converted.messages,\n tools: options.toolChoice !== \"none\" ? tools : undefined,\n tool_choice: options.toolChoice !== \"none\" ? toolChoice : undefined,\n };\n\n if (converted.systemPrompt || options?.systemPrompt) {\n requestBody.system = converted.systemPrompt ?? options.systemPrompt;\n }\n if (options?.temperature !== undefined) {\n requestBody.temperature = options.temperature;\n }\n if (options?.stop) {\n requestBody.stop_sequences = options.stop;\n }\n\n const response = await this.request<VibeProxyMessagesResponse>(\n \"/v1/messages\",\n requestBody,\n {\n ...this.buildExecutionHeaders(options?.execution),\n ...this.buildTraceHeaders(options),\n },\n );\n const textContent = this.extractTextContent(response);\n const toolCalls = this.extractToolCalls(response);\n\n return {\n content: textContent,\n usage: {\n promptTokens: response.usage.input_tokens,\n completionTokens: response.usage.output_tokens,\n cacheReadTokens: response.usage.cache_read_input_tokens ?? 0,\n cacheWriteTokens: response.usage.cache_creation_input_tokens ?? 0,\n providerUsage: {\n stopReason: response.stop_reason,\n },\n },\n model: response.model,\n toolCalls: toolCalls.length > 0 ? toolCalls : undefined,\n stopReason: response.stop_reason,\n };\n }\n}\n\n/**\n * Create VibeProxy LLM adapter.\n * This is the factory function called by initPlatform() when loading adapters.\n */\nexport function createAdapter(config?: VibeProxyLLMConfig): VibeProxyLLM {\n return new VibeProxyLLM(config);\n}\n\n// Default export for direct import\nexport default createAdapter;\n"]}
|
package/dist/manifest.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["
|
|
1
|
+
{"version":3,"sources":["../../home/runner/work/kb-labs/kb-labs/adapters/vibeproxy/src/manifest.ts"],"names":[],"mappings":";AAUO,IAAM,QAAA,GAA4B;AAAA,EACvC,eAAA,EAAiB,OAAA;AAAA,EACjB,EAAA,EAAI,eAAA;AAAA,EACJ,IAAA,EAAM,eAAA;AAAA,EACN,OAAA,EAAS,OAAA;AAAA,EACT,WAAA,EACE,+EAAA;AAAA,EACF,MAAA,EAAQ,cAAA;AAAA,EACR,OAAA,EAAS,UAAA;AAAA,EACT,IAAA,EAAM,MAAA;AAAA,EACN,UAAA,EAAY,MAAA;AAAA,EACZ,YAAA,EAAc;AAAA,IACZ,SAAA,EAAW,KAAA;AAAA;AAAA,IACX,MAAA,EAAQ;AAAA,MACN,eAAA,EAAiB,IAAA;AAAA,MACjB,aAAA,EAAe;AAAA;AACjB,GACF;AAAA,EACA,YAAA,EAAc;AAAA,IACZ,OAAA,EAAS;AAAA,MACP,IAAA,EAAM,QAAA;AAAA,MACN,OAAA,EAAS,uBAAA;AAAA,MACT,WAAA,EAAa;AAAA,KACf;AAAA,IACA,MAAA,EAAQ;AAAA,MACN,IAAA,EAAM,QAAA;AAAA,MACN,OAAA,EAAS,YAAA;AAAA,MACT,WAAA,EAAa;AAAA,KACf;AAAA,IACA,KAAA,EAAO;AAAA,MACL,IAAA,EAAM,QAAA;AAAA,MACN,OAAA,EAAS,0BAAA;AAAA,MACT,WAAA,EAAa;AAAA,KACf;AAAA,IACA,OAAA,EAAS;AAAA,MACP,IAAA,EAAM,QAAA;AAAA,MACN,OAAA,EAAS,IAAA;AAAA,MACT,WAAA,EAAa;AAAA;AACf;AAEJ","file":"manifest.js","sourcesContent":["/**\n * @module @kb-labs/adapters-vibeproxy/manifest\n * Adapter manifest for VibeProxy LLM.\n */\n\nimport type { AdapterManifest } from \"@kb-labs/sdk/adapters\";\n\n/**\n * Adapter manifest for VibeProxy LLM.\n */\nexport const manifest: AdapterManifest = {\n manifestVersion: \"1.0.0\",\n id: \"vibeproxy-llm\",\n name: \"VibeProxy LLM\",\n version: \"0.1.0\",\n description:\n \"VibeProxy local adapter supporting multiple LLM providers (Claude, GPT, etc.)\",\n author: \"KB Labs Team\",\n license: \"KBPL-1.1\",\n type: \"core\",\n implements: \"ILLM\",\n capabilities: {\n streaming: false, // TODO: implement SSE streaming\n custom: {\n functionCalling: true,\n multiProvider: true,\n },\n },\n configSchema: {\n baseURL: {\n type: \"string\",\n default: \"http://localhost:8317\",\n description: \"VibeProxy server URL\",\n },\n apiKey: {\n type: \"string\",\n default: \"any-string\",\n description: \"API key (any string works for local VibeProxy)\",\n },\n model: {\n type: \"string\",\n default: \"claude-sonnet-4-20250514\",\n description: \"Model to use (claude-*, gpt-*, etc.)\",\n },\n timeout: {\n type: \"number\",\n default: 120000,\n description: \"Request timeout in milliseconds\",\n },\n },\n};\n"]}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@kb-labs/adapters-vibeproxy",
|
|
3
3
|
"description": "VibeProxy adapter implementing ILLM interface for local Anthropic API proxy",
|
|
4
|
-
"version": "2.119.0
|
|
4
|
+
"version": "2.119.0",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
7
7
|
"types": "./dist/index.d.ts",
|
|
@@ -26,11 +26,11 @@
|
|
|
26
26
|
"tsup": "^8.5.0",
|
|
27
27
|
"typescript": "^5.6.3",
|
|
28
28
|
"vitest": "^3.2.6",
|
|
29
|
-
"@kb-labs/devkit": "2.119.0
|
|
29
|
+
"@kb-labs/devkit": "2.119.0",
|
|
30
30
|
"@kb-labs/sdk": "2.115.4"
|
|
31
31
|
},
|
|
32
32
|
"engines": {
|
|
33
|
-
"node": ">=
|
|
33
|
+
"node": ">=24.0.0",
|
|
34
34
|
"pnpm": ">=9.0.0"
|
|
35
35
|
},
|
|
36
36
|
"kb": {
|