diff --git a/src/data/languages/languageData.ts b/src/data/languages/languageData.ts index 0b08361592..507ce00839 100644 --- a/src/data/languages/languageData.ts +++ b/src/data/languages/languageData.ts @@ -44,6 +44,8 @@ export default { }, aiTransport: { javascript: '2.11', + java: '1.6', + python: '3.0', }, spaces: { javascript: '0.4', diff --git a/src/pages/docs/ai-transport/messaging/accepting-user-input.mdx b/src/pages/docs/ai-transport/messaging/accepting-user-input.mdx index 2a66b7f43d..9ec4af4b8f 100644 --- a/src/pages/docs/ai-transport/messaging/accepting-user-input.mdx +++ b/src/pages/docs/ai-transport/messaging/accepting-user-input.mdx @@ -43,6 +43,15 @@ const claims = { 'x-ably-clientId': 'user-123' }; ``` +```python +claims = { + 'x-ably-clientId': 'user-123' +} +``` +```java +Map claims = new HashMap<>(); +claims.put("x-ably-clientId", "user-123"); +``` The `clientId` is automatically attached to every message the user publishes, so agents can trust this identity. @@ -58,6 +67,30 @@ await channel.subscribe('user-input', (message) => { processAndRespond(channel, text, promptId, userId); }); ``` +```python +def on_user_input(message): + user_id = message.client_id + # promptId is a user-generated UUID for correlating responses + prompt_id = message.data['promptId'] + text = message.data['text'] + + print(f'Received prompt from user {user_id}') + process_and_respond(channel, text, prompt_id, user_id) + +await channel.subscribe('user-input', on_user_input) +``` +```java +channel.subscribe("user-input", message -> { + String userId = message.clientId; + // promptId is a user-generated UUID for correlating responses + JsonObject data = (JsonObject) message.data; + String promptId = data.get("promptId").getAsString(); + String text = data.get("text").getAsString(); + + System.out.println("Received prompt from user " + userId); + processAndRespond(channel, text, promptId, userId); +}); +``` ### Verify by role @@ -72,6 +105,15 @@ const claims = { 'ably.channel.*': 'user' }; ``` +```python +claims = { + 'ably.channel.*': 'user' +} +``` +```java +Map claims = new HashMap<>(); +claims.put("ably.channel.*", "user"); +``` The user claim is automatically attached to every message the user publishes, so agents can trust this role information. @@ -91,6 +133,37 @@ await channel.subscribe('user-input', (message) => { processAndRespond(channel, text, promptId); }); ``` +```python +def on_user_input(message): + role = message.extras.get('userClaim') + # promptId is a user-generated UUID for correlating responses + prompt_id = message.data['promptId'] + text = message.data['text'] + + if role != 'user': + print('Ignoring message from non-user') + return + + process_and_respond(channel, text, prompt_id) + +await channel.subscribe('user-input', on_user_input) +``` +```java +channel.subscribe("user-input", message -> { + String role = message.extras.get("userClaim").getAsString(); + // promptId is a user-generated UUID for correlating responses + JsonObject data = (JsonObject) message.data; + String promptId = data.get("promptId").getAsString(); + String text = data.get("text").getAsString(); + + if (!role.equals("user")) { + System.out.println("Ignoring message from non-user"); + return; + } + + processAndRespond(channel, text, promptId); +}); +``` ## Publish user input @@ -107,6 +180,30 @@ await channel.publish('user-input', { text: 'What is the weather like today?' }); ``` +```python +import uuid + +channel = ably.channels.get('{{RANDOM_CHANNEL_NAME}}') + +prompt_id = str(uuid.uuid4()) +message = Message( + name='user-input', + data={ + 'promptId': prompt_id, + 'text': 'What is the weather like today?' + } +) +await channel.publish(message) +``` +```java +Channel channel = ably.channels.get("{{RANDOM_CHANNEL_NAME}}"); + +String promptId = UUID.randomUUID().toString(); +JsonObject data = new JsonObject(); +data.addProperty("promptId", promptId); +data.addProperty("text", "What is the weather like today?"); +channel.publish("user-input", data); +```