gionuibk's picture
Upload folder using huggingface_hub
61d39e2 verified
/* eslint-disable */
// TODO: Make these more compatible with eslint
// Define models to test
const TEST_MODELS = [
"openrouter:openai/gpt-5-nano",
"openrouter:anthropic/claude-sonnet-4",
"google/gemini-2.5-pro",
"deepseek-chat",
"gpt-5.1",
"gpt-5-nano",
"openai/gpt-5-nano",
"claude-sonnet-4-latest",
];
// Core test functions that can be reused across models
const testChatBasicPromptCore = async function(model) {
// Test basic string prompt with test mode enabled
const result = await puter.ai.chat("Hello, how are you?", { model: model });
// Check that result is an object and not null
assert(typeof result === 'object', "chat should return an object");
assert(result !== null, "chat should not return null");
// Check response structure
assert(typeof result.message === 'object', "result should have message object");
assert(typeof result.finish_reason === 'string', "result should have finish_reason string");
assert(typeof result.via_ai_chat_service === 'boolean', "result should have via_ai_chat_service boolean");
// Check message structure
assert(typeof result.message.role === 'string', "message should have role string");
assert(result.message.role === 'assistant', "message role should be 'assistant'");
assert(typeof result.message.content === 'string' || Array.isArray(result.message.content), "message should have content string or an array");
// Check that toString() and valueOf() methods exist and work
assert(typeof result.toString === 'function', "result should have toString method");
assert(typeof result.valueOf === 'function', "result should have valueOf method");
// Check that toString() and valueOf() return the message content
assert(result.toString() === result.message.content, "toString() should return message content");
assert(result.valueOf() === result.message.content, "valueOf() should return message content");
// Content should not be empty
assert(result.message.content.length > 0, "message content should not be empty");
};
const testChatWithParametersCore = async function(model) {
// Test chat with parameters object
const result = await puter.ai.chat("What is 2+2?", {
model: model,
temperature: 0.7,
max_tokens: 50,
reasoning: { effort: 'low' },
text: { verbosity: 'low' },
});
// Check basic result structure
assert(typeof result === 'object', "chat should return an object");
assert(result !== null, "chat should not return null");
assert(typeof result.message === 'object', "result should have message object");
assert(typeof result.message.content === 'string' || Array.isArray(result.message.content), "result.message should have content string or an array");
// Check that the methods work
assert(typeof result.toString === 'function', "result should have toString method");
assert(typeof result.valueOf === 'function', "result should have valueOf method");
// Check that finish_reason is present and valid
const validFinishReasons = ['stop', 'length', 'function_call', 'content_filter', 'tool_calls'];
assert(validFinishReasons.includes(result.finish_reason),
`finish_reason should be one of: ${validFinishReasons.join(', ')}`);
// Check that via_ai_chat_service is true
assert(result.via_ai_chat_service === true, "via_ai_chat_service should be true");
};
const testChatWithMessageArrayCore = async function(model) {
// Test chat with message array format
const messages = [
{ role: "system", content: "You are a helpful assistant." },
{ role: "user", content: "Hello!" }
];
const result = await puter.ai.chat(messages, { model: model });
// Check basic structure
assert(typeof result === 'object', "chat should return an object");
assert(typeof result.message === 'object', "result should have message object");
assert(result.message.role === 'assistant', "response should be from assistant");
// Check that content is present and not empty
assert(result.message.content.length > 0, "message content should not be empty");
};
const testChatStreamingCore = async function(model) {
// Test chat with streaming enabled
const result = await puter.ai.chat("Count from 1 to 5", {
model: model,
stream: true,
max_tokens: 100
});
// Check that result is an object and not null
assert(typeof result === 'object', "streaming chat should return an object");
assert(result !== null, "streaming chat should not return null");
// For streaming, we need to check if it's an async iterator or has a different structure
// The exact structure depends on the implementation, but we should verify it's consumable
if (result[Symbol.asyncIterator]) {
// If it's an async iterator, test that we can consume it
let chunks = [];
let chunkCount = 0;
const maxChunks = 10; // Limit to prevent infinite loops in tests
for await (const chunk of result) {
chunks.push(chunk);
chunkCount++;
// Verify each chunk has expected structure
assert(typeof chunk === 'object', "each streaming chunk should be an object");
// Break after reasonable number of chunks for testing
if (chunkCount >= maxChunks) break;
}
assert(chunks.length > 0, "streaming should produce at least one chunk");
} else {
// If not an async iterator, it might be a different streaming implementation
// Check for common streaming response patterns
// Check basic result structure (similar to non-streaming but may have different properties)
assert(typeof result.message === 'object' || typeof result.content === 'string',
"streaming result should have message object or content string");
// Check that it has streaming-specific properties
assert(typeof result.stream === 'boolean' || result.stream === true,
"streaming result should indicate it's a stream");
// Check that toString() and valueOf() methods exist and work
assert(typeof result.toString === 'function', "streaming result should have toString method");
assert(typeof result.valueOf === 'function', "streaming result should have valueOf method");
}
};
// Function to generate test functions for a specific model
const generateTestsForModel = function(model) {
const modelName = model.replace(/[^a-zA-Z0-9]/g, '_'); // Sanitize model name for function names
return {
[`testChatBasicPrompt_${modelName}`]: {
name: `testChatBasicPrompt_${modelName}`,
description: `Test basic AI chat prompt with ${model} model and verify response structure`,
test: async function() {
try {
await testChatBasicPromptCore(model);
pass(`testChatBasicPrompt_${modelName} passed`);
} catch (error) {
fail(`testChatBasicPrompt_${modelName} failed:`, error);
}
}
},
[`testChatWithParameters_${modelName}`]: {
name: `testChatWithParameters_${modelName}`,
description: `Test AI chat with parameters (temperature, max_tokens) using ${model} model`,
test: async function() {
try {
await testChatWithParametersCore(model);
pass(`testChatWithParameters_${modelName} passed`);
} catch (error) {
fail(`testChatWithParameters_${modelName} failed:`, error);
}
}
},
[`testChatWithMessageArray_${modelName}`]: {
name: `testChatWithMessageArray_${modelName}`,
description: `Test AI chat with message array format using ${model} model`,
test: async function() {
try {
await testChatWithMessageArrayCore(model);
pass(`testChatWithMessageArray_${modelName} passed`);
} catch (error) {
fail(`testChatWithMessageArray_${modelName} failed:`, error);
}
}
},
[`testChatStreaming_${modelName}`]: {
name: `testChatStreaming_${modelName}`,
description: `Test AI chat with streaming enabled using ${model} model`,
test: async function() {
try {
await testChatStreamingCore(model);
pass(`testChatStreaming_${modelName} passed`);
} catch (error) {
fail(`testChatStreaming_${modelName} failed:`, error);
}
}
},
};
};
// Generate all test functions for all models
const generateAllTests = function() {
const allTests = [];
TEST_MODELS.forEach(model => {
const modelTests = generateTestsForModel(model);
Object.values(modelTests).forEach(test => {
allTests.push(test);
});
});
return allTests;
};
// Export the generated tests
window.aiTests = generateAllTests();