Adobe Firefly

Adobe Firefly and Content-Safe Generation

Adobe competes on training data rather than price: "Adobe Firefly 67 models are trained on licensed content from Adobe Stock and public domain content where copyright has expired, and Adobe does not train on users' personal or generated content," which is why Adobe calls them "commercially safe." Outputs carry Content Credentials. The current Image 5 model generates at a native 4 megapixels and adds Instruct Edit, refinement in plain language.

The Firefly API belongs to Firefly Services, provisioned to enterprise customers through the Adobe Admin Console; an OAuth server-to-server credential calls POST https://firefly-api.adobe.io/v3/images/generate-async 169 . It also trains custom models on a brand's style or products and composites product shots into generated scenes. The Firefly app also hosts partner models from Google, OpenAI 86 , Black Forest Labs 57,408 and others; Adobe's "commercially safe" statement covers its own models only.

Where Firefly's "commercially safe" claim comes from: licensed and public-domain training data, and which models it coversHTMLLive
<!doctype html>
<style>
  body { margin: 0; padding: 8px; background: #fafaf7; font: 12px system-ui, sans-serif; color: #263238; }
  svg { width: 100%; max-width: 600px; display: block; }
  g.m { cursor: pointer; }
</style>
<script src="https://cdn.jsdelivr.net/npm/d3@7.9.0/dist/d3.min.js"></script>
<p>Click a model in the Firefly app to see whether Adobe's statement covers it.</p>
<svg viewBox="0 0 600 270" font-size="11"></svg>
<p id="out"></p>
<script>
  const svg = d3.select('svg');
  const sources = [['Adobe Stock (licensed)', '#1f5f8b'], ['public domain, copyright expired', '#1f5f8b'], ['users\' personal or generated content', '#b0bec5']];
  sources.forEach(([t, c], i) => {
    svg.append('rect').attr('x', 10).attr('y', 20 + i * 50).attr('width', 170).attr('height', 36).attr('rx', 6).attr('fill', '#fff').attr('stroke', c);
    svg.append('text').attr('x', 18).attr('y', 42 + i * 50).attr('fill', c).text(t);
    svg.append('path').attr('d', `M180,${38 + i * 50} C220,${38 + i * 50} 220,95 250,95`).attr('fill', 'none')
      .attr('stroke', c).attr('stroke-dasharray', i === 2 ? '4 4' : null);
  });
  svg.append('text').attr('x', 190).attr('y', 170).attr('fill', '#b5452f').text('✘ not used for training');
  const models = [
    { name: 'Firefly Image 5', own: true, note: 'native 4 MP, Instruct Edit; Content Credentials' },
    { name: 'custom model (brand style)', own: true, note: 'trained on your own brand assets' },
    { name: 'partner: Google', own: false, note: 'hosted in the Firefly app' },
    { name: 'partner: OpenAI', own: false, note: 'hosted in the Firefly app' },
    { name: 'partner: Black Forest Labs', own: false, note: 'hosted in the Firefly app' },
  ];
  svg.append('rect').attr('x', 250).attr('y', 20).attr('width', 330).attr('height', 230).attr('rx', 10).attr('fill', '#fbf3ec').attr('stroke', '#e09a10');
  svg.append('text').attr('x', 262).attr('y', 40).attr('font-weight', 'bold').text('Firefly app / Firefly Services API');
  const m = svg.selectAll('g.m').data(models).join('g').attr('class', 'm').attr('transform', (d, i) => `translate(262,${54 + i * 38})`)
    .on('click', (e, d) => select(d));
  m.append('rect').attr('width', 305).attr('height', 30).attr('rx', 6).attr('fill', '#fff').attr('stroke', d => d.own ? '#3f7d3a' : '#b0bec5');
  m.append('text').attr('x', 10).attr('y', 19).text(d => `${d.own ? '✔' : '?'} ${d.name}`).attr('fill', d => d.own ? '#1f5a33' : '#546e7a');
  function select(d) {
    m.select('rect').attr('stroke-width', x => x === d ? 3 : 1);
    d3.select('#out').text(`${d.name}: ${d.note}. ` + (d.own ? '"Commercially safe" per Adobe.' :
      'Adobe\'s "commercially safe" statement covers its own models only.'));
  }
  select(models[0]);
  svg.append('text').attr('x', 10).attr('y', 250).attr('fill', '#546e7a').text('API: POST firefly-api.adobe.io/v3/images/generate-async (OAuth, enterprise)');
</script>