multi-llm
Version:
A unified TypeScript/JavaScript package to use LLMs across ALL platforms with support for 17 major providers, streaming, MCP tools, and intelligent response parsing
177 lines • 7.63 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.CohereProvider = void 0;
const axios_1 = __importDefault(require("axios"));
const provider_1 = require("../provider");
const llm_1 = require("../llm");
const parser_1 = require("../utils/parser");
class CohereProvider extends provider_1.Provider {
constructor(apiKey, baseUrl) {
super(apiKey, baseUrl);
this.baseUrl = baseUrl || 'https://api.cohere.com/v2';
}
async getModels() {
// Cohere doesn't have a public models endpoint, return known models
return [
{
id: 'command-r-plus-08-2024',
name: 'Command R+ (08-2024)',
contextWindow: 128000,
maxOutputTokens: 4096,
pricing: { input: 2.5, output: 10.0, currency: 'USD' }
},
{
id: 'command-r-08-2024',
name: 'Command R (08-2024)',
contextWindow: 128000,
maxOutputTokens: 4096,
pricing: { input: 0.15, output: 0.6, currency: 'USD' }
},
{
id: 'command-r-plus',
name: 'Command R+',
contextWindow: 128000,
maxOutputTokens: 4096,
pricing: { input: 3.0, output: 15.0, currency: 'USD' }
},
{
id: 'command-r',
name: 'Command R',
contextWindow: 128000,
maxOutputTokens: 4096,
pricing: { input: 0.5, output: 1.5, currency: 'USD' }
},
{
id: 'command',
name: 'Command',
contextWindow: 4096,
maxOutputTokens: 4096,
pricing: { input: 1.0, output: 2.0, currency: 'USD' }
},
{
id: 'command-nightly',
name: 'Command Nightly',
contextWindow: 4096,
maxOutputTokens: 4096,
pricing: { input: 1.0, output: 2.0, currency: 'USD' }
}
];
}
createLLM(modelId) {
return new llm_1.LLM(this, modelId);
}
async chat(modelId, messages, options, streamCallback) {
try {
const cohereMessages = this.convertMessages(messages);
const systemMessage = messages.find(m => m.role === 'system')?.content;
const payload = {
model: modelId,
messages: cohereMessages,
temperature: options.temperature,
max_tokens: options.maxTokens,
p: options.topP,
k: options.topK,
stream: !!streamCallback,
...(systemMessage && { system: systemMessage })
};
if (streamCallback) {
return this.streamChat(payload, streamCallback);
}
else {
const response = await axios_1.default.post(`${this.baseUrl}/chat`, payload, {
headers: {
'Authorization': `Bearer ${this.apiKey}`,
'Content-Type': 'application/json'
}
});
const content = response.data.message?.content?.[0]?.text || '';
const parsed = parser_1.ResponseParser.parseResponse(content);
return {
raw: response.data,
parsed,
usage: {
inputTokens: response.data.usage?.billed_units?.input_tokens || 0,
outputTokens: response.data.usage?.billed_units?.output_tokens || 0,
totalTokens: (response.data.usage?.billed_units?.input_tokens || 0) + (response.data.usage?.billed_units?.output_tokens || 0)
}
};
}
}
catch (error) {
throw new Error(`Cohere chat failed: ${error}`);
}
}
async streamChat(payload, streamCallback) {
return new Promise((resolve, reject) => {
let fullContent = '';
let rawResponse = null;
const source = axios_1.default.post(`${this.baseUrl}/chat`, payload, {
headers: {
'Authorization': `Bearer ${this.apiKey}`,
'Content-Type': 'application/json'
},
responseType: 'stream'
});
source.then(response => {
response.data.on('data', (chunk) => {
const lines = chunk.toString().split('\n');
for (const line of lines) {
if (line.trim().startsWith('data: ')) {
const data = line.slice(6).trim();
if (data === '[DONE]') {
const parsed = parser_1.ResponseParser.parseResponse(fullContent);
resolve({
raw: rawResponse,
parsed,
usage: undefined
});
return;
}
try {
const parsed = JSON.parse(data);
rawResponse = parsed;
if (parsed.type === 'content-delta') {
const content = parsed.delta?.message?.content?.text || '';
if (content) {
fullContent += content;
streamCallback(content);
}
}
else if (parsed.type === 'message-end') {
const parsedResult = parser_1.ResponseParser.parseResponse(fullContent);
resolve({
raw: rawResponse,
parsed: parsedResult,
usage: {
inputTokens: parsed.delta?.usage?.billed_units?.input_tokens || 0,
outputTokens: parsed.delta?.usage?.billed_units?.output_tokens || 0,
totalTokens: (parsed.delta?.usage?.billed_units?.input_tokens || 0) + (parsed.delta?.usage?.billed_units?.output_tokens || 0)
}
});
return;
}
}
catch (e) {
// Ignore parsing errors for partial chunks
}
}
}
});
response.data.on('error', reject);
}).catch(reject);
});
}
convertMessages(messages) {
return messages
.filter(m => m.role !== 'system') // System message handled separately
.map(msg => ({
role: msg.role,
content: [{ type: 'text', text: msg.content }]
}));
}
}
exports.CohereProvider = CohereProvider;
//# sourceMappingURL=cohere.js.map