Significant-Gravitas/AutoGPT · error · ArtifactFetchError

Failed to fetch: ${response.status}

Error message

Failed to fetch: ${response.status}

What it means

NotFoundError raised inside _validate_resource_ownership when a StoreListing transfer target doesn't exist: the storelisting row is missing or flagged isDeleted. Soft-deleted listings are intentionally treated as nonexistent so they cannot be transferred.

Source

Thrown at autogpt_platform/frontend/src/app/(platform)/copilot/components/ArtifactPanel/components/useArtifactContent.ts:103

    }
  } catch {
    return prefix;
  }

  return prefix;
}

async function fetchArtifactResponse(url: string): Promise<Response> {
  for (let attempt = 0; attempt <= CONTENT_FETCH_MAX_RETRIES; attempt++) {
    try {
      const response = await fetch(url);
      if (response.ok) return response;

      if (
        !isTransientArtifactFetchStatus(response.status) ||
        attempt === CONTENT_FETCH_MAX_RETRIES
      ) {
        throw new ArtifactFetchError(await parseArtifactFetchError(response));
      }
    } catch (error) {
      if (error instanceof ArtifactFetchError) throw error;
      if (attempt === CONTENT_FETCH_MAX_RETRIES) {
        throw error instanceof Error
          ? error
          : new Error("Failed to fetch artifact");
      }
    }

    await sleep(CONTENT_FETCH_RETRY_DELAY_MS);
  }

  throw new Error("Failed to fetch artifact");
}

export function getCachedArtifactContent(id: string): string | undefined {
  return contentCache.get(id);

View on GitHub (pinned to 9c8bb5550f)

Solutions

  1. Fetch the listing and confirm it exists and is not deleted before creating the transfer.
  2. Refresh the listing selector when the store data is older than the current session.
  3. Handle 404 by re-querying the store listings.

Example fix

# before
await create_transfer("StoreListing", listing_id, ...)

# after
listing = await get_store_listing(listing_id)
if listing is None or listing.is_deleted:
    raise LookupError("Listing unavailable")
await create_transfer("StoreListing", listing.id, ...)
Defensive patterns

Strategy: validation

Validate before calling

listing = await get_store_listing(resource_id)
if listing is None or listing.is_deleted:
    refresh_listings()

Try / catch

try:
    await create_transfer("StoreListing", lid, ...)
except NotFoundError as e:
    if "StoreListing" in str(e):
        refresh_listings()

Prevention

When it happens

Trigger: Creating a transfer with resourceType='StoreListing' and a resource_id for a listing that was deleted (isDeleted=True) or never existed.

Common situations: Listing removed from the store between page load and transfer submission; stale listing list in the frontend; wrong-environment id.

Related errors


AI-assisted analysis of Significant-Gravitas/AutoGPT@9c8bb5550f (2026-08-14). Data as JSON: /api/errors/034a385edbf6433e. Report an issue: GitHub.