Skillshub adobe-hello-world
install
source · Clone the upstream repo
git clone https://github.com/ComeOnOliver/skillshub
Claude Code · Install into ~/.claude/skills/
T=$(mktemp -d) && git clone --depth=1 https://github.com/ComeOnOliver/skillshub "$T" && mkdir -p ~/.claude/skills && cp -r "$T/skills/jeremylongshore/claude-code-plugins-plus-skills/adobe-hello-world" ~/.claude/skills/comeonoliver-skillshub-adobe-hello-world && rm -rf "$T"
manifest:
skills/jeremylongshore/claude-code-plugins-plus-skills/adobe-hello-world/SKILL.mdsource content
Adobe Hello World
Overview
Three minimal working examples covering Adobe's core API surfaces: Firefly AI image generation, PDF content extraction, and Photoshop background removal.
Prerequisites
- Completed
setupadobe-install-auth - Valid OAuth Server-to-Server credentials
- Node.js 18+ with
or@adobe/firefly-apis
installed@adobe/pdfservices-node-sdk
Instructions
Example 1: Firefly Text-to-Image Generation
// hello-firefly.ts import 'dotenv/config'; import { getAdobeAccessToken } from './adobe/auth'; async function generateImage() { const token = await getAdobeAccessToken(); const response = await fetch( 'https://firefly-api.adobe.io/v3/images/generate', { method: 'POST', headers: { 'Authorization': `Bearer ${token}`, 'x-api-key': process.env.ADOBE_CLIENT_ID!, 'Content-Type': 'application/json', }, body: JSON.stringify({ prompt: 'A futuristic cityscape at sunset with flying cars', n: 1, // number of images size: { width: 1024, height: 1024, }, contentClass: 'art', // "art" or "photo" }), } ); if (!response.ok) { throw new Error(`Firefly API error: ${response.status} ${await response.text()}`); } const result = await response.json(); console.log('Generated image URL:', result.outputs[0].image.url); return result; } generateImage().catch(console.error);
Example 2: PDF Text Extraction
// hello-pdf.ts import { ServicePrincipalCredentials, PDFServices, MimeType, ExtractPDFParams, ExtractElementType, ExtractPDFJob, ExtractPDFResult, } from '@adobe/pdfservices-node-sdk'; import * as fs from 'fs'; async function extractPDF() { const credentials = new ServicePrincipalCredentials({ clientId: process.env.ADOBE_CLIENT_ID!, clientSecret: process.env.ADOBE_CLIENT_SECRET!, }); const pdfServices = new PDFServices({ credentials }); // Upload the PDF const inputStream = fs.createReadStream('./sample.pdf'); const inputAsset = await pdfServices.upload({ readStream: inputStream, mimeType: MimeType.PDF, }); // Configure extraction (text + tables) const params = new ExtractPDFParams({ elementsToExtract: [ExtractElementType.TEXT, ExtractElementType.TABLES], }); // Run extraction job const job = new ExtractPDFJob({ inputAsset, params }); const pollingURL = await pdfServices.submit({ job }); const result = await pdfServices.getJobResult({ pollingURL, resultType: ExtractPDFResult, }); // Download result ZIP containing structuredData.json const resultAsset = result.result!.resource; const streamAsset = await pdfServices.getContent({ asset: resultAsset }); const outputStream = fs.createWriteStream('./extracted-output.zip'); streamAsset.readStream.pipe(outputStream); console.log('Extraction complete: ./extracted-output.zip'); } extractPDF().catch(console.error);
Example 3: Photoshop Remove Background
// hello-photoshop.ts import 'dotenv/config'; import { getAdobeAccessToken } from './adobe/auth'; async function removeBackground() { const token = await getAdobeAccessToken(); // Input/output must be pre-signed URLs (S3, Azure Blob, Dropbox) const response = await fetch( 'https://image.adobe.io/sensei/cutout', { method: 'POST', headers: { 'Authorization': `Bearer ${token}`, 'x-api-key': process.env.ADOBE_CLIENT_ID!, 'Content-Type': 'application/json', }, body: JSON.stringify({ input: { href: 'https://your-bucket.s3.amazonaws.com/input-photo.jpg', storage: 'external', }, output: { href: 'https://your-bucket.s3.amazonaws.com/output-cutout.png', storage: 'external', type: 'image/png', }, }), } ); const result = await response.json(); console.log('Job status URL:', result._links.self.href); // Poll for completion let status = result; while (status.status !== 'succeeded' && status.status !== 'failed') { await new Promise(r => setTimeout(r, 2000)); const poll = await fetch(status._links.self.href, { headers: { 'Authorization': `Bearer ${token}`, 'x-api-key': process.env.ADOBE_CLIENT_ID!, }, }); status = await poll.json(); } console.log('Background removal:', status.status); } removeBackground().catch(console.error);
Output
- Generated AI image URL from Firefly API
- Extracted PDF text/tables in structured JSON format
- Background-removed PNG from Photoshop API
Error Handling
| Error | Cause | Solution |
|---|---|---|
| Missing API entitlement | Enable the API in Developer Console project |
on Firefly | Invalid prompt or parameters | Check content policy; prompts cannot request trademarks or people |
on PDF | Wrong MimeType | Ensure input is actually a PDF, not a renamed file |
on Photoshop | Invalid storage URL | Use pre-signed URLs with read/write permissions |
| Rate limit exceeded | Implement backoff; see |
Resources
Next Steps
Proceed to
adobe-local-dev-loop for development workflow setup.