Rendez votre plateforme exploitable par l’IA.
Call 2,420 named operations through one contract-generated API, with least-privilege scopes, workspace pinning, dry-run validation and replay-safe writes. Subscribe to canonical events through HMAC-signed background webhooks, or build a governed package in the six-stage Connector Builder.
Demande détaillée. Événement signé.
POST une action pour /api/v1.php avec une clé de portage. OpsIQ pins l'espace de travail, valide le contrat d'action et les permissions, puis exécute ou fait fonctionner à sec. Les événements canoniques abonnés partent par une file d'attente de livraison signée HMAC avec des tentatives traçables et des rétries limitées.
De la clé à l'intégration régie dans trois étapes.
Émettre une clé moins privilège, découvrir le contrat généré, faire un essai à sec, puis s'abonner à un webhook lorsque votre application a besoin de la livraison d'un événement de fond.
Obtenez une clé
Inscrivez-vous et générez une clé API Bearer limitée (opq_…) dans les paramètres développeur, et donnez à chaque intégration uniquement les surfaces dont elle a besoin.
Découvrez & valider
Lire meta.actions, meta.action et meta.scopes; utilisation dry_run valider les écrits avant l'exécution.
Exécuter & s'abonner
Ajoutez une clé d'idempotency pour écrire, puis inscrivez votre point final aux événements canoniques dont votre application a besoin.
Un modèle de connecteur. Cinq primitives propres.
Tout ce qui est spécifique à la plateforme vit dans un connecteur. Le cœur d'OpsIQ reste générique, l'IA reste prévisible, et votre intégration reste auditable.
Dites à OpsIQ ce qui vient de se passer.
Émettre des événements canoniques de votre plateforme ou définir un événement personnalisé régi. Les abonnés reçoivent l'événement par le biais des règles de priorité et de livraison enregistrées.
Référence d'événementinvoice.paid, ticket.created, subscription.cancelled, customer.signed_up ou votre propre.
Abonnés en fan-outLe cerveau AI, les règles d'automatisation, les connecteurs miroir et vos points de terminaison webhook réagissent tous.
Ordre de prioritéDispatch déterministe afin que les miroirs écrivent avant que les alertes ne se déclenchent.
Dites à OpsIQ ce que l'IA est autorisée à faire.
Chaque opération nommée reçoit un contrat généré : portée, fonctionnalité, type de lecture ou d'écriture, risque, politique de confirmation, schéma de demande et de réponse, support à sec, idempotency et erreurs stables.
Schéma d ' action{
"action": "tickets.reply",
"kind": "write",
"scopes": ["tickets.write", "admin"],
"feature": "ticket_system",
"risk": "medium",
"confirmation": "recommended",
"idempotency": "supported",
"dry_run": true,
"request": { "type": "object" },
"response": { "required": ["success"] }
}
Poussez des événements vers votre pile - avec preuve cryptographique.
Subscribe any URL to any of the 52 deliverable events. OpsIQ POSTs the JSON payload signed with HMAC-SHA256 over the scheme version, the timestamp, the delivery ID and the body together, not the body alone, so yesterday's delivery cannot be replayed at you today.
$raw = file_get_contents('php://input');
$sig = $_SERVER['HTTP_X_OPSIQ_SIGNATURE'] ?? ''; // "v2=<hex>"
$ts = (int)($_SERVER['HTTP_X_OPSIQ_TIMESTAMP'] ?? 0);
$id = (int)($_SERVER['HTTP_X_OPSIQ_DELIVERY'] ?? 0);
if (abs(time() - $ts) > 300) http_response_code(401); // replay window
[$ver, $hex] = array_pad(explode('=', $sig, 2), 2, ''); // split the prefix
$signed = $ver . '.' . $ts . '.' . $id . '.' . $raw; // NOT the body alone
$expected = hash_hmac('sha256', $signed, $secret);
if (!hash_equals($expected, $hex)) http_response_code(401);
$event = json_decode($raw, true); // $id is stable across retries
Utilisez directement HTTP ou créez le client que vous préférez.
Le général en entierAPI est publié en tant qu'OpenAPI 3.0.3 et Postman. Les expéditeurs de référence PHP plus les clients d'intégration Node et Python couvrent les flux d'événements signés et webhook ; n'importe quelle pile peut appeler la même JSON surface d'action directement.
const response = await fetch(`${base}/api/v1.php`, {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.OPSIQ_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
action: "tickets.reply",
dry_run: true,
idempotency_key: crypto.randomUUID(),
body: "Thanks. We are checking this now."
})
});
$payload = json_encode([
'action' => 'tickets.reply',
'dry_run' => true,
'idempotency_key' => bin2hex(random_bytes(16)),
'body' => 'Thanks - we are checking this now.',
]);
$ch = curl_init($base . '/api/v1.php');
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => $payload,
CURLOPT_HTTPHEADER => [
'Authorization: Bearer ' . getenv('OPSIQ_KEY'),
'Content-Type: application/json',
],
]);
response = requests.post(
f"{base}/api/v1.php",
headers={
"Authorization": f"Bearer {os.environ['OPSIQ_KEY']}",
"Content-Type": "application/json",
},
json={
"action": "tickets.reply",
"dry_run": True,
"idempotency_key": str(uuid.uuid4()),
"body": "Thanks - we are checking this now.",
},
)
Construisez une fois. Branchez-vous à tout.
Un connecteur est un paquet régi généré ou importé par l'intermédiaire de Identity, Auth, Test, Actions, Triggers et Review. Son manifeste déclare que les surfaces de capacité OpsIQ sont autorisées à exposer.
Ouvrir le constructeur en six étapesAnglais simple. Opération audité sortie.
OpsIQ n'invente jamais le bon appel. Il parcourt les contrats enregistrés, prépare la charge utile, demande confirmation lorsque l'action l'exige, et produit une ligne d'audit complète lorsqu'il exécute, donc une IA qui peut agir ne devient jamais une IA à laquelle vous ne pouvez pas faire confiance.
Surface API en un coup d ' œil.
One JSON POST surface exposes 2,420 named actions. Each generated contract declares auth scopes, read/write kind, risk, confirmation, request schema, dry-run, idempotency and stable errors.
ACTION tickets.replytickets.write_cours sec + idempotencyConfiguration / heureACTION security.reportsecurity.write_cours sec + idempotencyConfiguration / heureACTION platform.routes.writeadministrateurconfirmation + cléConfiguration / heureACTION meta.actionsDécouverte publiqueLecture seuleConfiguration / heureACTION tickets.listtickets.readLecture seuleConfiguration / heureACTION connectors.listconnectors.readLecture seuleConfiguration / heurehr.* contrats hr.read / hr.write portéesACTION hr.people.listhr.readLecture seuleConfiguration / heureACTION hr.people.createhr.write_cours sec + idempotencyConfiguration / heureACTION hr.org.treehr.readLecture seuleConfiguration / heurehr On obtient un refus, pas une liste vide. Ce que PeopleOS HR est.Les limites de taux sont configurées par clé sur une fenêtre horaire. X-RateLimit-Limit, X-RateLimit-Remaining et X-RateLimit-Reset; une demande rejetée renvoie 429 avec Retry-After. Utilisez le Contrat OpenAPI 3.0.3 ou Collecte de courrier généré à partir des registres d'exécution identiques.
Construisez, testez et relâchez six étapes.
Commencez par un profil régi ou définissez le contrat vous-même. Le Constructeur valide chaque étape avant de générer un paquet de connecteurs autonome.
Valider en toute sécurité, puis passer la porte de sortie.
Utilisation dry_run sur les actions d'écriture supportées, exécuter le test de connexion limité du constructeur, et inspecter le manifeste généré et le contrat avant la libération. Vérification de validation du paquet noms de capacité, paramètres, provenance et fichiers requis; travailleurs de fond traitent le vote réactif et la livraison sortante.
Un paquet ne peut pas réclamer une capacité son code n'a pas.
OpsIQ\Connectors\ConnectorContract est l'autorité. Découverte d'exécution, le Constructeur, les paquets de première partie, la conformité, le Général API et chaque référence lisait qu'un registre. Déclarer une capacité et trois fichiers doivent être d'accord avant OpsIQ vous mène à une seule rangée.
- 01 connector.php la classe d'exécution
- 02 IdentityProvider.php clé extérieure stable
- 03 SalesIngest.php réconcilierVentes()
- 04 actions.json les opérations désignées
- 05 settings.json configuration de l'opérateur
- 06 connector_contract.json autorité lisible par machine
hmac-sha256 sur une charge utile déterministe de SHA par dossier256 Réponses a été modifié depuis la signature. Une ed25519 réponses à la signature a-t-elle été signée par Nabtech, contrôlable avec la clé publique groupée et aucun secret partagé. Edit un octet et le premier arrête de correspondre.
marketplace.json est en dehors de la signature par définition: l'installateur l'écrit après la signature, donc l'éditeur n'aurait jamais pu la signer.
Un garde qui n'a jamais échoué n'est pas prouvé.
Les tests verts vous disent que rien ne s'est cassé aujourd'hui. Ils ne vous disent pas que le gardien que vous avez écrit arrêterait la chose qu'il a été écrit pour arrêter, parce qu'un garde qui n'est jamais exercé passe exactement comme un gardien qui ne fait rien.
211 /* A read role must never reach a destructive operation. */ 212- if ($isRead && $isDestructive) { 212+ if (false) { 213 $errors[] = "read role '{$role}' points at a destructive op"; 214 return false; 215 }
1[ ok ]hash sha256 4f2a9c1e… remember the file exactly as it is 2[ ok ]control exit 0 green BEFORE anything is touched 3[ ok ]mutate 1 match, lint ok one replacement, then php -l the mutant 4[RED ]prove exit 1 and "read role destructive" IS in the failures 5[ ok ]restore bytes written the original, not a regenerated copy 6[ ok ]verify sha256 matches and the check is green again ══ PROVEN. file restored, hash matched, 1 proof run, 0 failed.
La mutation n'a jamais été appliquée.
Le texte de recherche ne correspond pas, le fichier est intact, la suite passe, et la preuve enregistrée vert sous l'ancien code sur le code qui n'a jamais été vieux. Pris en exigeant exactement une correspondance textuelle et en comparant les hashes de fichier de chaque côté.
La mutation a cassé autre chose.
La suite est devenue rouge parce que le dossier a cessé d'analyser ou que le bootstrap est mort, et la preuve a enregistré un rouge qui n'avait rien à voir avec le garde. nommé test parmi les échecs.
Il ne peut pas laisser un mutant sur le disque.
Chaque mutation copie l'original à un sidecar en dehors de l'arbre Web-servit, écrit un marqueur qui nomme le changement exceptionnel, et est défait par un gestionnaire d'arrêt sur chaque chemin de sortie. Un marqueur d'un parcours écrasé est honoré avant la prochaine mutation de ce fichier.
La certification est une commande avec un code de sortie.
Not a review queue where somebody reads your code and forms an opinion. Run the same suites we run, on your own machine, before you submit. 8 published JSON Schemas under doc/contracts/schemas/ couvrir les paramètres, actions, spécifications du constructeur, cartes d'événements de voyage et de commerce, recettes de workflow, contrats de connecteurs et manifestes de publication.
- manifests parse et d'accord l'un avec l'autre
- capacités existe sur la classe d'exécution
- interfaces mise en œuvre lorsque déclarée
- files chaque fichier requis présent
- Mesures prises correspondre au manifeste des actions
- destructive déclarer confirmation
- identité une clé externe stable, pas un courriel
- rejouer une mise à jour répétée, jamais dupliquée
- entreprise les déclarations correspondent à l'extension
- docs LIRE, DÉVELOPPER, CHANGEMENT
- schémas tous les JSON valide
$ php tools/test_connector_conformance_all.php --connector=acme
$ php tools/test_connector_json_schemas.php
$ php tools/verify_commerce_contracts.php
$ php tools/release_gate_connectors.php --require-signatures
Pointez le premier sur un compte réel non-production avec --live-settings=/secure/test-acme.json. Pendant que vous êtes toujours itératif, échangez le dernier pour --unsigned-ok: il traite une signature manquante comme un avertissement attendu plutôt que de prétendre qu'elle est bonne.
Déclarer ce que vous pouvez vendre est un fichier, pas une inscription.
Un connecteur qui peut vendre déclare lequel de ses propres operations reply OpsIQ_'s canonical commerce role. La présence du fichier est la revendication. Il apparaît dans les paramètres de vente le moment où il déclare et disparaît quand il s'arrête. Il n'y a pas de liste à rejoindre et personne à demander.
Un canonique écrire Le rôle est maped à un enregistrement générique écrire. La correspondance est structurelle: un nom de stockage à côté d'un verbe mutant, quelle que soit votre convention de nommage. recovery soit, donc un délai de non-recoverable.
{
"commerce": {
"roles": {
"catalog_search": { "operation": "acme_search_products", "transport": "http" },
"order_get": { "operation": "acme_get_order", "transport": "http" },
"order_create": { "operation": "acme_create_order", "transport": "http",
"recovery": "acme_get_order" }
}
}
}
connector_contract.json est généré et ses ensembles de schémas additionalProperties:false, donc un bloc d'auteurs à la main là échouerait validation et ensuite être écrasé sur le prochain générateur.
Un rôle qui ne se joue pas dans CommerceRole n'existe pas. OpsIQ ne l'inférera jamais à partir d'un nom d'opération, car un nom n'est pas une promesse.
L'opération doit apparaître dans votre actions.json. Déclarer celui qui n'existe pas promet au client quelque chose qui ne produit alors rien.
Le temps d'absence le plus dangereux est celui après la plate-forme peut déjà avoir fait le travail. Sans un idémpotent "a fait ma terre d'écriture" recherche, les seules options sont de reessayer aveugle ou perdre l'ordre.
Tout rôle de classe paiement déclare également payment_profile avec environnement, webhook_verify utiliser le propre régime du prestataire, et event_map. Un environnement non déclaré est la façon dont un fournisseur de mode test prend un paiement en direct.
OpsIQ vs un Intégration DIY.
Ce qu'une plateforme liée par contrat, signée et auditée vous offre que la création de vos propres webhooks et l'intégration des actions IA ne pourront jamais fournir.
| Capacité | Créez le vôtre | OpsIQ |
|---|---|---|
| Porte-filtre à portée API + HMAC signé webhooks | laminés à la main | ✓ |
| Dry-run écrit + 24 heure replay réussi | Bricolage | ✓ |
| 1m → 5m → 30m →2h → 12h pour les comptes rendus | DIRECTION DU DIY | ✓ |
| Registre des contrats d'action (AI ne peut pas inventer les appels) | — | ✓ |
| Politique de confirmation avant effets secondaires | — | ✓ |
| Erreur stable enveloppe + ID de demande | Enregistrement manuel | ✓ |
| Options client directement HTTP + générées | Écris-toi. | ✓ |
| OpenAPI 3.0.3 contrat lisible par machine | Peut-être | ✓ |
| Constructeur en six étapes + porte de sortie du paquet | Construire une chaîne d'outils | ✓ |
| Clés de l'espace de travail et limites horaires | Varie | ✓ |
| Profil de connecteur: le code de la plate-forme reste isolé | — | ✓ |
Questions des développeurs, répondu.
Authentification, contrats, relevés, génération de clients, tests sûrs et modèle de connecteur, avant la première demande de production.
Authorization: Bearer opq_…. Les clés peuvent être illimitées, restreintes ou en lecture seule, porter des champs de moindre privilège, obéir à une limite horaire et peuvent être épinglées sur un espace de travail. X-OpsIQ-Signature, X-OpsIQ-Timestamp, X-OpsIQ-Event et X-OpsIQ-Delivery.hash_hmac('sha256', $rawBody, $secret) et de comparer son digesteur hexadécimal avec X-OpsIQ-Signature utilisant hash_equals. Valider X-OpsIQ-Timestamp dans votre fenêtre de replay et utiliser X-OpsIQ-Delivery comme l'identificateur de livraison traçable.dry_run sur les actions dont le contrat généré le supporte, exécutez le test de connexion limité du Constructeur de connecteurs, inspectez ses fichiers générés et passez les portes de conformité et de libération du paquet avant de traiter le connecteur comme prêt.settings.json, facultative actions.json, un contrat de capacité généré, documentation et extensions d'entreprise optionnelles. Le constructeur à six étapes l'assemble; le registre le découvre; les portes de conformité et de libération valident.