Pub/sub for AI agents, when nobody knows the topics yet

You do not know the taxonomy yet, so you are filtering in every consumer. A topic broker asks you to name the content before you have it, and agent systems produce text whose categories nobody has settled. Semantik routes on the content itself, so a subscriber declares what it cares about and starts receiving matches without anyone adding a topic.

An agent event bus in two calls

These calls need an API key. Create one under Developer keys and export it as NOETIVE_KEY_SECRET. Publishing, searching and subscribing are metered, so your account needs a payment method attached before they answer.

Publish what an agent just found
curl -sS https://semantik.noetive.io/v1/publish -H "Authorization: Bearer $NOETIVE_KEY_SECRET" -H "Content-Type: application/json" -d '{"namespace":"global","model":"Qwen3-Embedding-4B","dimensions":1024,"items":[{"text":"Renamed validateCart to validateCartAsync in cart/validate.go. It now returns (Cart, error) instead of bool."}]}'

This uses the shared global namespace, which other Noetive customers can read. Point it at a namespace of your own before you send anything real.

Hear about it by meaning, not by topic name
curl -sS -N https://semantik.noetive.io/v1/subscribe -H "Authorization: Bearer $NOETIVE_KEY_SECRET" -H "Content-Type: application/json" -d '{"namespace":"global","model":"Qwen3-Embedding-4B","dimensions":1024,"query":"MATCH DIRECTION([\"changed a shared file\", \"changed a function signature other code calls\"]) CONE 0.4 AND NOT DISTANCE(\"finished the task, nothing to report\") WITHIN 0.5"}'

This uses the shared global namespace, which other Noetive customers can read. Point it at a namespace of your own before you send anything real.

A topic name is a bet you place before the data arrives

Kafka, NATS and Redis all work the same way at the routing layer. A publisher picks a name. A subscriber picks a name or a pattern. Delivery happens when the two match. That design is correct, and it is why those systems are fast: matching a string is cheap, and every one of them has spent a decade getting very good at moving bytes once the match is made.

It assumes you knew the right name in advance. In an agent system that assumption breaks on the first interesting day. An agent produces a finding that belongs to a category nobody defined. A new consumer wants a slice that cuts across four existing topics. Someone adds alerts.payments.high and now half the useful messages are on alerts.payments because they were published before the split. The taxonomy is always one week behind the content.

Semantik is a semantic message broker, which means the subscriber's predicate replaces the publisher's label. The subscriber says what region of meaning it wants, in SemQL, and every message that lands in that region is delivered. Publishers do not change. Nothing gets renamed.

Kafka NATS Redis Semantik
How a subscriber says what it wants Topic and partition name Subject with wildcards Channel name or glob A SemQL predicate over meaning
Who fixes the taxonomy The publisher, up front The publisher, up front The publisher, up front The subscriber, at any time
An interest no topic covers Add a topic, change publishers Add a subject, change publishers Add a channel, change publishers Write a query, publishers unchanged
Ordering Total order per partition No global ordering None None
Delivery At-least-once, with offsets and consumer groups At-most-once in core, at-least-once with JetStream At-most-once, nothing stored At-least-once, dedupe on message_id
Reading the past Replay by offset Replay with JetStream Not available Search by meaning, not offset replay
Splitting one stream across workers Consumer groups Queue groups Not built in Not built in, one subscription per consumer
Raw throughput Highest Very high Very high Not the design goal, every message is matched against every live query
You operate A cluster A cluster A server Nothing

Reach for Kafka or NATS when

  • You know the taxonomy up front and it is stable. Topic names are the cheapest routing there is when the names are right.
  • You need ordering. Kafka gives total order per partition. Semantik gives none, and does not pretend to.
  • You need the lowest cost per message at very high volume. That is what those systems are built for, and they are extremely good at it.
  • You need a worker pool to split one stream. Consumer groups and queue groups solve that. Semantik has no consumer-group concept, so every matching consumer sees every match.
  • You need to replay from an exact position. Offsets do that.

Reach for Semantik when

  • You do not know the content taxonomy in advance, and it keeps moving. This is the case Semantik exists for.
  • A new subscriber has to start receiving relevant messages without anyone adding a topic or redeploying a publisher.
  • Your subscribers each want a different slice of the same stream, and the slices overlap. One publish matches every subscription it belongs in, with no fan-out wiring.
  • "Like this, but not like that" is the natural way to say what you want. That is a CONTRAST clause, and it has no equivalent in a topic name.
  • The same content needs a live stream and a backward-looking search, in one query language.

What this does not claim

Semantik does not replace Kafka. If raw throughput and ordering are your constraints, a topic broker wins and it is not close. Plenty of systems will want both: a topic broker moving the volume, Semantik carrying the messages whose category nobody agreed on.

It is not an interop standard. It is a service you call over HTTP.

It does not replace agent-to-agent delegation. Semantik tells an agent that something happened. Assigning work, tracking a task and closing it out belong somewhere else.