#!/usr/bin/env node /** * SAP AI Provider - Generate Text Example * * This example demonstrates basic text generation with different models * using the Vercel AI SDK's generateText function. * * Authentication: * - On SAP BTP: Automatically uses service binding (VCAP_SERVICES) * - Locally: Set AICORE_SERVICE_KEY environment variable with your service key JSON */ // Load environment variables import "dotenv/config"; import { APICallError, LoadAPIKeyError, NoSuchModelError } from "@ai-sdk/provider"; import { generateText } from "ai"; // This example uses relative imports for local development within this repo. // In YOUR production project, use the published package instead: // import { createSAPAIProvider } from "@jerome-benoit/sap-ai-provider"; import { createSAPAIProvider } from "../src/index"; /** * */ async function generateTextExample() { console.log("šŸ“ SAP AI Text Generation Example\n"); // Verify AICORE_SERVICE_KEY is set for local development if (!process.env.AICORE_SERVICE_KEY && !process.env.VCAP_SERVICES) { console.warn("āš ļø Warning: AICORE_SERVICE_KEY environment variable not set."); console.warn(" Set it in your .env file or environment for local development.\n"); } try { const provider = createSAPAIProvider(); // Generate text with gpt-4.1 console.log("šŸ¤– Testing gpt-4.1..."); const { finishReason, text, usage } = await generateText({ messages: [ { content: "How to make a delicious mashed potatoes?", role: "user", }, ], model: provider("gpt-4.1"), }); console.log("šŸ“„ Response:", text); console.log( "šŸ“Š Usage:", `${String(usage.inputTokens)} input + ${String(usage.outputTokens)} output = ${String(usage.totalTokens)} total tokens`, ); console.log("šŸ Finish reason:", finishReason); // Test multiple models (Harmonized API) console.log("\n================================"); console.log("Testing Multiple Models (Harmonized API)"); console.log("================================\n"); const models = ["gemini-2.0-flash", "anthropic--claude-4.5-sonnet"]; for (const modelId of models) { console.log(`\nšŸ¤– Testing ${modelId}...`); try { const { finishReason: modelFinish, text: modelText, usage: modelUsage, } = await generateText({ messages: [ { content: "What is 2 + 2? Reply with just the number.", role: "user", }, ], model: provider(modelId), }); console.log("šŸ“„ Response:", modelText); console.log( "šŸ“Š Usage:", `${String(modelUsage.inputTokens)} input + ${String(modelUsage.outputTokens)} output`, ); console.log("šŸ Finish reason:", modelFinish); } catch (error) { const errorMessage = error instanceof Error ? error.message : String(error); console.log(`āŒ Error with ${modelId}:`, errorMessage); } } console.log("\nāœ… All tests completed!"); } catch (error: unknown) { if (error instanceof LoadAPIKeyError) { console.error("āŒ Authentication Error:", error.message); } else if (error instanceof NoSuchModelError) { console.error("āŒ Model Not Found:", error.modelId); } else if (error instanceof APICallError) { console.error("āŒ API Call Error:", error.statusCode, error.message); // Parse SAP-specific metadata const sapError = JSON.parse(error.responseBody ?? "{}") as { error?: { code?: string; request_id?: string }; }; if (sapError.error?.request_id) { console.error(" SAP Request ID:", sapError.error.request_id); console.error(" SAP Error Code:", sapError.error.code); } } else { const errorMessage = error instanceof Error ? error.message : String(error); console.error("āŒ Example failed:", errorMessage); } console.error("\nšŸ’” Troubleshooting tips:"); console.error(" - Ensure AICORE_SERVICE_KEY is set with valid credentials"); console.error(" - Check that your SAP AI Core instance is accessible"); console.error(" - Verify the model is available in your deployment"); } } generateTextExample().catch(console.error); export { generateTextExample };