OpenHive

Error Codes

The Protocol uses a minimal set of essential error codes optimized for simplicity and fast implementation.

Essential Error Codes

Total 8 error codes that cover 95% of scenarios:

Error CodeDescriptionRetry?HTTP Status
invalid_signatureMessage signature verification failedNo401
capability_not_foundRequested capability not availableNo404
invalid_parametersMissing or invalid task parametersNo400
processing_failedError during task executionYes500
resource_unavailableService temporarily unavailableYes503
rate_limitedToo many requests from this agentYes429
invalid_message_formatMessage doesn't match expected formatNo400
agent_not_foundTarget agent doesn't existNo404

Error Message Format

{
  "from": "hive:agentid:provider456",
  "to": "hive:agentid:client123",
  "type": "task_error",
  "data": {
    "task_id": "task-123",
    "error": "capability_not_found",
    "message": "text-translation not available",
    "retry": false
  },
  "sig": "ed25519_signature"
}

Implementation Examples

Basic Error Handling

// Simple error response function
function sendError(taskId, requester, errorCode, message, canRetry = false) {
  const errorResponse = {
    from: AGENT_ID,
    to: requester,
    type: "task_error",
    data: {
      task_id: taskId,
      error: errorCode,
      message: message,
      retry: canRetry,
    },
  };

  return {
    ...errorResponse,
    sig: signMessage(errorResponse),
  };
}

// Usage in endpoint
app.post("/tasks", (req, res) => {
  const message = req.body;

  // Validate signature
  if (!verifySignature(message)) {
    return res
      .status(401)
      .json(
        sendError(
          message.data?.task_id,
          message.from,
          "invalid_signature",
          "Signature verification failed"
        )
      );
  }

  // Check capability
  const capability = findCapability(message.data.capability);
  if (!capability) {
    return res
      .status(404)
      .json(
        sendError(
          message.data.task_id,
          message.from,
          "capability_not_found",
          `${message.data.capability} not available`
        )
      );
  }

  // Validate parameters
  if (!validateParameters(capability, message.data)) {
    return res
      .status(400)
      .json(
        sendError(
          message.data.task_id,
          message.from,
          "invalid_parameters",
          "Required parameters missing"
        )
      );
  }

  try {
    // Process task
    const result = processTask(message.data.capability, message.data);
    res.json(createSuccessResponse(message.data.task_id, message.from, result));
  } catch (error) {
    res
      .status(500)
      .json(
        sendError(
          message.data.task_id,
          message.from,
          "processing_failed",
          error.message,
          true
        )
      );
  }
});

Error Handling Best Practices

// Rate limiting implementation
const rateLimiter = new Map();

function checkRateLimit(agentId) {
  const now = Date.now();
  const requests = rateLimiter.get(agentId) || [];

  // Remove requests older than 1 minute
  const recentRequests = requests.filter((time) => now - time < 60000);

  if (recentRequests.length >= 60) {
    // 60 requests per minute
    return false;
  }

  recentRequests.push(now);
  rateLimiter.set(agentId, recentRequests);
  return true;
}

// Resource availability check
function checkResourceAvailability() {
  // Simple health check
  const memoryUsage = process.memoryUsage();
  const cpuUsage = process.cpuUsage();

  if (memoryUsage.heapUsed > 500 * 1024 * 1024) {
    // 500MB limit
    return false;
  }

  return true;
}

Optional: Extended Error Codes

Additional error codes for advanced implementations:

Error CodeDescriptionWhen to Use
timeoutTask execution timeoutLong-running tasks
insufficient_resourcesNot enough compute/memoryResource-intensive tasks
dependency_failedRequired service unavailableMulti-service tasks
validation_failedResult validation failedQuality assurance
permission_deniedAuthorization failedAccess control

Client Error Handling

// Simple client-side error handling
async function sendTaskRequest(agentEndpoint, taskRequest) {
  try {
    const response = await fetch(`${agentEndpoint}/tasks`, {
      method: "POST",
      headers: { "Content-Type": "application/json" },
      body: JSON.stringify(taskRequest),
    });

    const result = await response.json();

    if (result.type === "task_error") {
      const { error, message, retry } = result.data;

      switch (error) {
        case "capability_not_found":
          console.log(`❌ Capability not available: ${message}`);
          break;
        case "processing_failed":
          if (retry) {
            console.log(`🔄 Retrying task: ${message}`);
            // Implement retry logic
          } else {
            console.log(`❌ Task failed: ${message}`);
          }
          break;
        case "rate_limited":
          console.log(`⏳ Rate limited, waiting before retry: ${message}`);
          // Implement backoff
          break;
        default:
          console.log(`❌ Unknown error: ${error} - ${message}`);
      }
    }

    return result;
  } catch (error) {
    console.error("Network error:", error);
    throw error;
  }
}

Simplicity Focus: The 8 essential error codes handle 95% of real-world scenarios. Start with these and add more only if you encounter specific errors that don't fit.

Security: Never include sensitive information in error messages. Keep error details generic to prevent information leakage.