Spaces:
Running
on
CPU Upgrade
Running
on
CPU Upgrade
| /* eslint-disable no-useless-escape */ | |
| import { describe, it, expect } from "vitest"; | |
| import { modifySnippet } from "./snippets.js"; | |
| // Shared object to add, including various types | |
| const SHARED_OBJ_TO_ADD = { | |
| maxTokens: 200, | |
| frequencyPenalty: 0.3, | |
| presencePenalty: null, | |
| stopSequences: ["stop1", "stop2"], | |
| complexObject: { | |
| nestedKey: "nestedValue", | |
| nestedNum: 123, | |
| nestedBool: false, | |
| nestedArr: ["a", 1, true, null], | |
| }, | |
| anotherString: "test string", | |
| isStreaming: true, | |
| }; | |
| // Helper to create regex for matching stringified values (JS/JSON and Python) | |
| // This version is updated to handle multi-line, indented ("pretty-printed") structures. | |
| function createValueRegex(value: unknown, language: "js" | "python" | "json"): string { | |
| // Flexible whitespace: matches any number of spaces, tabs, or newlines. | |
| const ws = "(?:\\s|\\n)*"; | |
| if (typeof value === "string") { | |
| return `"${value.replace(/[.*+?^${}()|[\]\\]/g, "\\$&")}"`; // Escape special regex chars in string | |
| } | |
| if (value === null) { | |
| return language === "python" ? "None" : "null"; | |
| } | |
| if (typeof value === "boolean") { | |
| return language === "python" ? (value ? "True" : "False") : String(value); | |
| } | |
| if (typeof value === "number") { | |
| return String(value); | |
| } | |
| if (Array.isArray(value)) { | |
| if (value.length === 0) { | |
| return `\\[${ws}\\]`; // Matches "[]" or "[ \n ]" etc. | |
| } | |
| const itemRegexes = value.map(item => createValueRegex(item, language)).join(`${ws},${ws}`); | |
| return `\\[${ws}${itemRegexes}${ws}\\]`; | |
| } | |
| if (typeof value === "object" && value !== null) { | |
| const entries = Object.entries(value); | |
| if (entries.length === 0) { | |
| return `\\{${ws}\\}`; // Matches "{}" or "{ \n }" etc. | |
| } | |
| const entriesRegex = entries | |
| .map(([k, v]) => { | |
| // In Python kwargs, keys are not quoted. This regex builder is for values that look like JSON/Python dicts. | |
| // The main test loops handle Python kwarg key formatting separately. | |
| const keyRegex = `"${k.replace(/[.*+?^${}()|[\]\\]/g, "\\$&")}"`; | |
| const valueRegexPart = createValueRegex(v, language); | |
| return `${keyRegex}${ws}:${ws}${valueRegexPart}`; | |
| }) | |
| .join(`${ws},${ws}`); // Join key-value pairs with a comma and flexible whitespace | |
| return `\\{${ws}${entriesRegex}${ws}\\}`; | |
| } | |
| return String(value).replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); // Fallback for other primitive types | |
| } | |
| type TestCase = { | |
| snippet: string; | |
| objToAdd: Record<string, unknown>; | |
| description: string; // Optional description for the test | |
| pythonSyntax?: "kwargs" | "dict"; // Add this field | |
| }; | |
| // JavaScript/TypeScript test cases | |
| const jsTestCases: TestCase[] = [ | |
| { | |
| description: "JavaScript InferenceClient with chatCompletionStream", | |
| snippet: ` | |
| import { InferenceClient } from "@huggingface/inference"; | |
| const client = new InferenceClient("YOUR_HF_TOKEN"); | |
| let out = ""; | |
| const stream = client.chatCompletionStream({ | |
| provider: "cerebras", | |
| model: "Qwen/Qwen3-32B", | |
| messages: [ | |
| { | |
| role: "user", | |
| content: "What is the capital of Brazil?", | |
| }, | |
| { | |
| content: "{\"answer_the_question\": 5, \"how_many_legs_does_a_dog_have\": true, \"answer_the_question_HERE\": \"elderberry\"}", | |
| role: "assistant", | |
| }, | |
| ], | |
| temperature: 0.5, | |
| top_p: 0.7, | |
| }); | |
| for await (const chunk of stream) { | |
| if (chunk.choices && chunk.choices.length > 0) { | |
| const newContent = chunk.choices[0].delta.content; | |
| out += newContent; | |
| console.log(newContent); | |
| } | |
| } | |
| `, | |
| objToAdd: SHARED_OBJ_TO_ADD, | |
| }, | |
| { | |
| description: "JavaScript InferenceClient without streaming", | |
| snippet: `import { InferenceClient } from "@huggingface/inference"; | |
| const client = new InferenceClient("YOUR_HF_TOKEN"); | |
| const chatCompletion = await client.chatCompletion({ | |
| provider: "cohere", | |
| model: "CohereLabs/c4ai-command-r-plus", | |
| messages: [ | |
| { | |
| role: "user", | |
| content: "hey, how are you???", | |
| }, | |
| { | |
| role: "assistant", | |
| content: "{ \"answer_the_question\": \n\n\n\n \n \n\n-1.175\n\n\n\n, \n \"how_many_legs_does_a_dog_have\": \nfalse, \n\n\"answer_the_question_HERE\": \n\n\"A\"\n\n\n}", | |
| }, | |
| ], | |
| temperature: 0.5, | |
| top_p: 0.7, | |
| }); | |
| console.log(chatCompletion.choices[0].message);`, | |
| objToAdd: SHARED_OBJ_TO_ADD, | |
| }, | |
| { | |
| description: "JavaScript with OpenAI library", | |
| snippet: `import { OpenAI } from "openai"; | |
| const client = new OpenAI({ | |
| baseURL: "https://api.cerebras.ai/v1", | |
| apiKey: "YOUR_HF_TOKEN", | |
| }); | |
| const stream = await client.chat.completions.create({ | |
| model: "qwen-3-32b", | |
| messages: [ | |
| { | |
| role: "user", | |
| content: "What is the capital of Brazil?", | |
| }, | |
| { | |
| content: "{\"answer_the_question\": 5, \"how_many_legs_does_a_dog_have\": true, \"answer_the_question_HERE\": \"elderberry\"}", | |
| role: "assistant", | |
| }, | |
| ], | |
| temperature: 0.5, | |
| top_p: 0.7, | |
| stream: true, | |
| }); | |
| for await (const chunk of stream) { | |
| process.stdout.write(chunk.choices[0]?.delta?.content || ""); | |
| }`, | |
| objToAdd: SHARED_OBJ_TO_ADD, | |
| }, | |
| ]; | |
| // Python test cases | |
| const pythonTestCases: TestCase[] = [ | |
| { | |
| description: "Python HuggingFace client", | |
| snippet: `from huggingface_hub import InferenceClient | |
| client = InferenceClient( | |
| provider="cerebras", | |
| api_key="YOUR_HF_TOKEN", | |
| ) | |
| stream = client.chat.completions.create( | |
| model="Qwen/Qwen3-32B", | |
| messages=[ | |
| { | |
| "role": "user", | |
| "content": "What is the capital of Brazil?" | |
| }, | |
| { | |
| "content": "{\"answer_the_question\": 5, \"how_many_legs_does_a_dog_have\": true, \"answer_the_question_HERE\": \"elderberry\"}", | |
| "role": "assistant" | |
| } | |
| ], | |
| temperature=0.5, | |
| top_p=0.7, | |
| stream=True, | |
| ) | |
| for chunk in stream: | |
| print(chunk.choices[0].delta.content, end="")`, | |
| objToAdd: SHARED_OBJ_TO_ADD, // Use shared object | |
| pythonSyntax: "kwargs", | |
| }, | |
| { | |
| description: "Python with Requests", | |
| snippet: `import json | |
| import requests | |
| API_URL = "https://api.cerebras.ai/v1/chat/completions" | |
| headers = { | |
| "Authorization": "Bearer YOUR_HF_TOKEN", | |
| } | |
| def query(payload): | |
| response = requests.post(API_URL, headers=headers, json=payload, stream=True) | |
| for line in response.iter_lines(): | |
| if not line.startswith(b"data:"): | |
| continue | |
| if line.strip() == b"data: [DONE]": | |
| return | |
| yield json.loads(line.decode("utf-8").lstrip("data:").rstrip("/n")) | |
| chunks = query({ | |
| "messages": [ | |
| { | |
| "role": "user", | |
| "content": "What is the capital of Brazil?" | |
| }, | |
| { | |
| "content": "{\"answer_the_question\": 5, \"how_many_legs_does_a_dog_have\": true, \"answer_the_question_HERE\": \"elderberry\"}", | |
| "role": "assistant" | |
| } | |
| ], | |
| "temperature": 0.5, | |
| "top_p": 0.7, | |
| "model": "qwen-3-32b", | |
| "stream": True, | |
| }) | |
| for chunk in chunks: | |
| print(chunk["choices"][0]["delta"]["content"], end="")`, | |
| objToAdd: SHARED_OBJ_TO_ADD, // Use shared object | |
| pythonSyntax: "dict", | |
| }, | |
| { | |
| description: "Python OpenAI client", | |
| snippet: `from openai import OpenAI | |
| client = OpenAI( | |
| base_url="https://api.cerebras.ai/v1", | |
| api_key="YOUR_HF_TOKEN", | |
| ) | |
| stream = client.chat.completions.create( | |
| model="qwen-3-32b", | |
| messages=[ | |
| { | |
| "role": "user", | |
| "content": "What is the capital of Brazil?" | |
| }, | |
| { | |
| "content": "{\"answer_the_question\": 5, \"how_many_legs_does_a_dog_have\": true, \"answer_the_question_HERE\": \"elderberry\"}", | |
| "role": "assistant" | |
| } | |
| ], | |
| temperature=0.5, | |
| top_p=0.7, | |
| stream=True, | |
| ) | |
| for chunk in stream: | |
| print(chunk.choices[0].delta.content, end="")`, | |
| objToAdd: SHARED_OBJ_TO_ADD, // Use shared object | |
| pythonSyntax: "kwargs", | |
| }, | |
| // Add more Python test cases as needed | |
| ]; | |
| // Shell/curl test cases | |
| const shellTestCases: TestCase[] = [ | |
| { | |
| description: "curl request to Cerebras API", | |
| snippet: ` | |
| curl https://api.cerebras.ai/v1/chat/completions \\ | |
| -H 'Authorization: Bearer YOUR_HF_TOKEN' \\ | |
| -H 'Content-Type: application/json' \\ | |
| -d '{ | |
| "messages": [ | |
| { | |
| "role": "user", | |
| "content": "What is the capital of Brazil?" | |
| }, | |
| { | |
| "content": "{\"answer_the_question\": 5, \"how_many_legs_does_a_dog_have\": true, \"answer_the_question_HERE\": \"elderberry\"}", | |
| "role": "assistant" | |
| } | |
| ], | |
| "temperature": 0.5, | |
| "top_p": 0.7, | |
| "model": "qwen-3-32b", | |
| "stream": false | |
| }' | |
| `, | |
| objToAdd: SHARED_OBJ_TO_ADD, // Use shared object | |
| }, | |
| // Add more shell test cases as needed | |
| ]; | |
| describe("modifySnippet", () => { | |
| // Test JavaScript/TypeScript snippets | |
| describe("JavaScript/TypeScript", () => { | |
| jsTestCases.forEach((testCase, index) => { | |
| it(`should add properties to JS snippet #${index + 1}: ${testCase.description}`, () => { | |
| const result = modifySnippet(testCase.snippet, testCase.objToAdd); | |
| // Check that all new properties are added with correct JS syntax | |
| Object.entries(testCase.objToAdd).forEach(([key, value]) => { | |
| // For JS, keys are typically camelCase or as-is from the object. | |
| // The value needs to be regex-matched due to potential complex structures. | |
| const valueRegexStr = createValueRegex(value, "js"); | |
| // Regex to match 'key: value' or '"key": value' (for keys that might be quoted if they have special chars, though not in SHARED_OBJ_TO_ADD) | |
| // Allowing for flexible spacing around colon. | |
| const propertyPattern = new RegExp(`"${key}"\\s*:\\s*${valueRegexStr}|${key}\\s*:\\s*${valueRegexStr}`); | |
| expect(result).toMatch(propertyPattern); | |
| }); | |
| // Check that original properties are preserved | |
| expect(result).toContain("temperature: 0.5"); | |
| expect(result).toContain("top_p: 0.7"); | |
| // Check that the structure is maintained | |
| expect(result.includes("{") && result.includes("}")).toBeTruthy(); | |
| }); | |
| }); | |
| }); | |
| // Test Python snippets | |
| describe("Python", () => { | |
| pythonTestCases.forEach((testCase, index) => { | |
| it(`should add properties to Python snippet #${index + 1}: ${testCase.description}`, () => { | |
| const result = modifySnippet(testCase.snippet, testCase.objToAdd); | |
| // Check that all new properties are added with correct Python syntax | |
| Object.entries(testCase.objToAdd).forEach(([key, value]) => { | |
| const valueRegexStr = createValueRegex(value, "python"); | |
| let propertyPattern; | |
| if (testCase.pythonSyntax === "dict") { | |
| // Python dict: "key": value | |
| propertyPattern = new RegExp(`"${key}"\\s*:\\s*${valueRegexStr}`); | |
| } else { | |
| // Python kwargs: key=value | |
| // Convert camelCase keys from SHARED_OBJ_TO_ADD to snake_case for Python kwargs | |
| const snakeKey = key.replace(/([A-Z])/g, "_$1").toLowerCase(); | |
| propertyPattern = new RegExp(`${snakeKey}\\s*=\\s*${valueRegexStr}`); | |
| } | |
| expect(result).toMatch(propertyPattern); | |
| }); | |
| // Check that original properties are preserved | |
| if (testCase.pythonSyntax === "dict") { | |
| expect(result).toContain('"temperature": 0.5'); | |
| expect(result).toContain('"top_p": 0.7'); | |
| expect(result.includes("{") && result.includes("}")).toBeTruthy(); | |
| } else { | |
| // kwargs | |
| expect(result).toContain("temperature=0.5"); | |
| expect(result).toContain("top_p=0.7"); | |
| expect(result.includes("(") && result.includes(")")).toBeTruthy(); | |
| } | |
| }); | |
| }); | |
| }); | |
| // Test Shell/curl snippets | |
| describe("Shell/curl", () => { | |
| shellTestCases.forEach((testCase, index) => { | |
| it(`should add properties to shell snippet #${index + 1}: ${testCase.description}`, () => { | |
| const result = modifySnippet(testCase.snippet, testCase.objToAdd); | |
| // Check that all new properties are added with correct JSON syntax | |
| Object.entries(testCase.objToAdd).forEach(([key, value]) => { | |
| // For shell/JSON, keys are typically snake_case or as-is. | |
| // Values need to be regex-matched. | |
| // Convert camelCase keys from SHARED_OBJ_TO_ADD to snake_case for JSON | |
| const snakeKey = key.replace(/([A-Z])/g, "_$1").toLowerCase(); | |
| const valueRegexStr = createValueRegex(value, "json"); | |
| const propertyPattern = new RegExp(`"${snakeKey}"\\s*:\\s*${valueRegexStr}`); | |
| expect(result).toMatch(propertyPattern); | |
| }); | |
| // Check that original properties are preserved | |
| expect(result).toContain(`"temperature": 0.5`); | |
| expect(result).toContain(`"top_p": 0.7`); | |
| // Check that the structure is maintained | |
| expect(result.includes("{") && result.includes("}")).toBeTruthy(); | |
| }); | |
| }); | |
| }); | |
| }); | |