@teneo-protocol/sdk 1.0.0 ā 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.github/workflows/publish-npm.yml +8 -6
- package/CHANGELOG.md +265 -0
- package/README.md +406 -53
- package/dist/core/websocket-client.d.ts +13 -0
- package/dist/core/websocket-client.d.ts.map +1 -1
- package/dist/core/websocket-client.js +34 -3
- package/dist/core/websocket-client.js.map +1 -1
- package/dist/handlers/message-handlers/agent-room-operation-response-handler.d.ts +76 -0
- package/dist/handlers/message-handlers/agent-room-operation-response-handler.d.ts.map +1 -0
- package/dist/handlers/message-handlers/agent-room-operation-response-handler.js +70 -0
- package/dist/handlers/message-handlers/agent-room-operation-response-handler.js.map +1 -0
- package/dist/handlers/message-handlers/agent-selected-handler.d.ts +92 -38
- package/dist/handlers/message-handlers/agent-selected-handler.d.ts.map +1 -1
- package/dist/handlers/message-handlers/agent-status-update-handler.d.ts +904 -0
- package/dist/handlers/message-handlers/agent-status-update-handler.d.ts.map +1 -0
- package/dist/handlers/message-handlers/agent-status-update-handler.js +51 -0
- package/dist/handlers/message-handlers/agent-status-update-handler.js.map +1 -0
- package/dist/handlers/message-handlers/auth-error-handler.d.ts +45 -31
- package/dist/handlers/message-handlers/auth-error-handler.d.ts.map +1 -1
- package/dist/handlers/message-handlers/auth-message-handler.d.ts +6 -0
- package/dist/handlers/message-handlers/auth-message-handler.d.ts.map +1 -1
- package/dist/handlers/message-handlers/auth-message-handler.js +65 -5
- package/dist/handlers/message-handlers/auth-message-handler.js.map +1 -1
- package/dist/handlers/message-handlers/auth-required-handler.d.ts +49 -31
- package/dist/handlers/message-handlers/auth-required-handler.d.ts.map +1 -1
- package/dist/handlers/message-handlers/auth-success-handler.d.ts +6 -0
- package/dist/handlers/message-handlers/auth-success-handler.d.ts.map +1 -1
- package/dist/handlers/message-handlers/auth-success-handler.js +46 -4
- package/dist/handlers/message-handlers/auth-success-handler.js.map +1 -1
- package/dist/handlers/message-handlers/challenge-handler.d.ts +45 -31
- package/dist/handlers/message-handlers/challenge-handler.d.ts.map +1 -1
- package/dist/handlers/message-handlers/error-message-handler.d.ts +49 -31
- package/dist/handlers/message-handlers/error-message-handler.d.ts.map +1 -1
- package/dist/handlers/message-handlers/index.d.ts +5 -0
- package/dist/handlers/message-handlers/index.d.ts.map +1 -1
- package/dist/handlers/message-handlers/index.js +23 -1
- package/dist/handlers/message-handlers/index.js.map +1 -1
- package/dist/handlers/message-handlers/list-available-agents-handler.d.ts +877 -0
- package/dist/handlers/message-handlers/list-available-agents-handler.d.ts.map +1 -0
- package/dist/handlers/message-handlers/list-available-agents-handler.js +38 -0
- package/dist/handlers/message-handlers/list-available-agents-handler.js.map +1 -0
- package/dist/handlers/message-handlers/list-room-agents-handler.d.ts +886 -0
- package/dist/handlers/message-handlers/list-room-agents-handler.d.ts.map +1 -0
- package/dist/handlers/message-handlers/list-room-agents-handler.js +51 -0
- package/dist/handlers/message-handlers/list-room-agents-handler.js.map +1 -0
- package/dist/handlers/message-handlers/list-rooms-response-handler.d.ts +178 -89
- package/dist/handlers/message-handlers/list-rooms-response-handler.d.ts.map +1 -1
- package/dist/handlers/message-handlers/ping-pong-handler.d.ts +62 -58
- package/dist/handlers/message-handlers/ping-pong-handler.d.ts.map +1 -1
- package/dist/handlers/message-handlers/regular-message-handler.d.ts +31 -29
- package/dist/handlers/message-handlers/regular-message-handler.d.ts.map +1 -1
- package/dist/handlers/message-handlers/regular-message-handler.js +1 -0
- package/dist/handlers/message-handlers/regular-message-handler.js.map +1 -1
- package/dist/handlers/message-handlers/room-operation-response-handler.d.ts +328 -0
- package/dist/handlers/message-handlers/room-operation-response-handler.d.ts.map +1 -0
- package/dist/handlers/message-handlers/room-operation-response-handler.js +92 -0
- package/dist/handlers/message-handlers/room-operation-response-handler.js.map +1 -0
- package/dist/handlers/message-handlers/subscribe-response-handler.d.ts +53 -31
- package/dist/handlers/message-handlers/subscribe-response-handler.d.ts.map +1 -1
- package/dist/handlers/message-handlers/types.d.ts +2 -0
- package/dist/handlers/message-handlers/types.d.ts.map +1 -1
- package/dist/handlers/message-handlers/unsubscribe-response-handler.d.ts +53 -31
- package/dist/handlers/message-handlers/unsubscribe-response-handler.d.ts.map +1 -1
- package/dist/managers/agent-room-manager.d.ts +222 -0
- package/dist/managers/agent-room-manager.d.ts.map +1 -0
- package/dist/managers/agent-room-manager.js +508 -0
- package/dist/managers/agent-room-manager.js.map +1 -0
- package/dist/managers/index.d.ts +2 -0
- package/dist/managers/index.d.ts.map +1 -1
- package/dist/managers/index.js +5 -1
- package/dist/managers/index.js.map +1 -1
- package/dist/managers/message-router.d.ts +1 -1
- package/dist/managers/message-router.d.ts.map +1 -1
- package/dist/managers/message-router.js +41 -4
- package/dist/managers/message-router.js.map +1 -1
- package/dist/managers/room-management-manager.d.ts +213 -0
- package/dist/managers/room-management-manager.d.ts.map +1 -0
- package/dist/managers/room-management-manager.js +440 -0
- package/dist/managers/room-management-manager.js.map +1 -0
- package/dist/managers/room-manager.d.ts +4 -4
- package/dist/managers/room-manager.d.ts.map +1 -1
- package/dist/managers/room-manager.js +1 -1
- package/dist/managers/room-manager.js.map +1 -1
- package/dist/teneo-sdk.d.ts +362 -14
- package/dist/teneo-sdk.d.ts.map +1 -1
- package/dist/teneo-sdk.js +497 -7
- package/dist/teneo-sdk.js.map +1 -1
- package/dist/types/config.d.ts +63 -54
- package/dist/types/config.d.ts.map +1 -1
- package/dist/types/config.js +9 -5
- package/dist/types/config.js.map +1 -1
- package/dist/types/error-codes.d.ts +2 -0
- package/dist/types/error-codes.d.ts.map +1 -1
- package/dist/types/error-codes.js +3 -0
- package/dist/types/error-codes.js.map +1 -1
- package/dist/types/events.d.ts +132 -68
- package/dist/types/events.d.ts.map +1 -1
- package/dist/types/events.js.map +1 -1
- package/dist/types/index.d.ts +1 -1
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js +27 -2
- package/dist/types/index.js.map +1 -1
- package/dist/types/messages.d.ts +11396 -2559
- package/dist/types/messages.d.ts.map +1 -1
- package/dist/types/messages.js +294 -27
- package/dist/types/messages.js.map +1 -1
- package/dist/types/validation.d.ts.map +1 -1
- package/dist/types/validation.js +1 -1
- package/dist/types/validation.js.map +1 -1
- package/dist/utils/bounded-queue.d.ts +1 -1
- package/dist/utils/bounded-queue.js +6 -6
- package/dist/utils/circuit-breaker.d.ts.map +1 -1
- package/dist/utils/circuit-breaker.js.map +1 -1
- package/dist/utils/event-waiter.d.ts.map +1 -1
- package/dist/utils/event-waiter.js +2 -1
- package/dist/utils/event-waiter.js.map +1 -1
- package/dist/utils/rate-limiter.d.ts.map +1 -1
- package/dist/utils/rate-limiter.js +4 -6
- package/dist/utils/rate-limiter.js.map +1 -1
- package/dist/utils/secure-private-key.d.ts.map +1 -1
- package/dist/utils/secure-private-key.js +9 -15
- package/dist/utils/secure-private-key.js.map +1 -1
- package/dist/utils/signature-verifier.d.ts +2 -2
- package/dist/utils/signature-verifier.d.ts.map +1 -1
- package/dist/utils/signature-verifier.js +5 -5
- package/dist/utils/signature-verifier.js.map +1 -1
- package/examples/.env.example +1 -1
- package/examples/agent-room-management-example.ts +334 -0
- package/examples/claude-agent-x-follower/.env.example +117 -0
- package/examples/claude-agent-x-follower/QUICKSTART.md +243 -0
- package/examples/claude-agent-x-follower/README.md +540 -0
- package/examples/claude-agent-x-follower/index.ts +248 -0
- package/examples/claude-agent-x-follower/package.json +37 -0
- package/examples/claude-agent-x-follower/tsconfig.json +20 -0
- package/examples/n8n-teneo/.env.example +127 -0
- package/examples/n8n-teneo/Dockerfile +42 -0
- package/examples/n8n-teneo/README.md +564 -0
- package/examples/n8n-teneo/docker-compose.yml +71 -0
- package/examples/n8n-teneo/index.ts +177 -0
- package/examples/n8n-teneo/package.json +22 -0
- package/examples/n8n-teneo/tsconfig.json +12 -0
- package/examples/n8n-teneo/workflows/x-timeline.json +66 -0
- package/examples/openai-teneo/.env.example +130 -0
- package/examples/openai-teneo/README.md +635 -0
- package/examples/openai-teneo/index.ts +280 -0
- package/examples/openai-teneo/package.json +24 -0
- package/examples/openai-teneo/tsconfig.json +16 -0
- package/examples/production-dashboard/.env.example +5 -3
- package/examples/production-dashboard/README.md +839 -0
- package/examples/production-dashboard/pnpm-lock.yaml +92 -0
- package/examples/production-dashboard/public/dashboard.html +1150 -504
- package/examples/production-dashboard/server.ts +428 -12
- package/examples/room-management-example.ts +285 -0
- package/examples/usage/.env.example +17 -0
- package/examples/usage/01-connect.ts +116 -0
- package/examples/usage/02-list-agents.ts +153 -0
- package/examples/usage/03-pick-agent.ts +201 -0
- package/examples/usage/04-find-by-capability.ts +237 -0
- package/examples/usage/05-webhook-example.ts +319 -0
- package/examples/usage/06-simple-api-server.ts +396 -0
- package/examples/usage/07-event-listener.ts +402 -0
- package/examples/usage/README.md +383 -0
- package/examples/usage/package.json +42 -0
- package/package.json +13 -3
- package/src/core/websocket-client.ts +43 -9
- package/src/formatters/response-formatter.test.ts +8 -2
- package/src/handlers/message-handlers/agent-room-operation-response-handler.ts +83 -0
- package/src/handlers/message-handlers/agent-status-update-handler.ts +58 -0
- package/src/handlers/message-handlers/auth-message-handler.ts +73 -5
- package/src/handlers/message-handlers/auth-success-handler.ts +58 -6
- package/src/handlers/message-handlers/index.ts +19 -0
- package/src/handlers/message-handlers/list-available-agents-handler.ts +41 -0
- package/src/handlers/message-handlers/list-room-agents-handler.ts +61 -0
- package/src/handlers/message-handlers/regular-message-handler.ts +1 -0
- package/src/handlers/message-handlers/room-operation-response-handler.ts +105 -0
- package/src/handlers/message-handlers/types.ts +6 -0
- package/src/handlers/webhook-handler.test.ts +13 -10
- package/src/managers/agent-room-manager.ts +609 -0
- package/src/managers/index.ts +2 -0
- package/src/managers/message-router.ts +48 -6
- package/src/managers/room-management-manager.ts +523 -0
- package/src/managers/room-manager.ts +12 -6
- package/src/teneo-sdk.ts +543 -10
- package/src/types/config.ts +13 -6
- package/src/types/error-codes.ts +4 -0
- package/src/types/events.ts +24 -0
- package/src/types/index.ts +55 -0
- package/src/types/messages.ts +374 -41
- package/src/types/validation.ts +4 -1
- package/src/utils/bounded-queue.ts +9 -9
- package/src/utils/circuit-breaker.ts +4 -1
- package/src/utils/deduplication-cache.test.ts +2 -6
- package/src/utils/event-waiter.test.ts +4 -1
- package/src/utils/event-waiter.ts +5 -7
- package/src/utils/rate-limiter.test.ts +5 -17
- package/src/utils/rate-limiter.ts +6 -9
- package/src/utils/secure-private-key.test.ts +66 -59
- package/src/utils/secure-private-key.ts +10 -16
- package/src/utils/signature-verifier.test.ts +75 -70
- package/src/utils/signature-verifier.ts +7 -8
- package/src/utils/ssrf-validator.test.ts +3 -3
- package/tests/integration/room-management.test.ts +514 -0
- package/tests/integration/websocket.test.ts +1 -1
- package/tests/unit/handlers/agent-room-operation-response-handler.test.ts +394 -0
- package/tests/unit/handlers/agent-status-update-handler.test.ts +407 -0
- package/tests/unit/handlers/auth-success-handler-rooms.test.ts +699 -0
- package/tests/unit/handlers/list-available-agents-handler.test.ts +256 -0
- package/tests/unit/handlers/list-room-agents-handler.test.ts +294 -0
- package/tests/unit/handlers/room-operation-response-handler.test.ts +527 -0
- package/tests/unit/managers/agent-room-manager.test.ts +534 -0
- package/tests/unit/managers/room-management-manager.test.ts +438 -0
|
@@ -0,0 +1,280 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Minimal example: Teneo Consumer SDK + OpenAI Codex Integration
|
|
3
|
+
*
|
|
4
|
+
* Simple REST API that combines OpenAI Codex agents with Teneo agents.
|
|
5
|
+
* Uses the OpenAI Codex SDK for thread-based conversations.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import 'dotenv/config';
|
|
9
|
+
import express, { Request, Response } from 'express';
|
|
10
|
+
import { Codex } from '@openai/codex-sdk';
|
|
11
|
+
import { SDKConfigBuilder, TeneoSDK } from '../../dist/index.js';
|
|
12
|
+
|
|
13
|
+
// Load environment variables
|
|
14
|
+
const WS_URL = process.env.WS_URL || '';
|
|
15
|
+
const PRIVATE_KEY = process.env.PRIVATE_KEY || '';
|
|
16
|
+
const WALLET_ADDRESS = process.env.WALLET_ADDRESS || '';
|
|
17
|
+
const DEFAULT_ROOM = process.env.DEFAULT_ROOM || 'general';
|
|
18
|
+
const LOG_LEVEL = (process.env.LOG_LEVEL || 'info') as 'debug' | 'info' | 'warn' | 'error' | 'silent';
|
|
19
|
+
const ENABLE_SIG_VERIFICATION = process.env.ENABLE_SIGNATURE_VERIFICATION === 'true';
|
|
20
|
+
const TRUSTED_ADDRESSES = process.env.TRUSTED_ADDRESSES?.split(',').filter(Boolean) || [];
|
|
21
|
+
const ENABLE_CACHE = process.env.ENABLE_CACHE !== 'false';
|
|
22
|
+
const CACHE_TIMEOUT = parseInt(process.env.CACHE_TIMEOUT || '300000');
|
|
23
|
+
const MAX_CACHE_SIZE = parseInt(process.env.MAX_CACHE_SIZE || '100');
|
|
24
|
+
const ENABLE_RECONNECTION = process.env.ENABLE_RECONNECTION !== 'false';
|
|
25
|
+
const RECONNECT_DELAY = parseInt(process.env.RECONNECT_DELAY || '5000');
|
|
26
|
+
const MAX_RECONNECT_ATTEMPTS = parseInt(process.env.MAX_RECONNECT_ATTEMPTS || '10');
|
|
27
|
+
const OPENAI_API_KEY = process.env.OPENAI_API_KEY || '';
|
|
28
|
+
|
|
29
|
+
// Validate required environment variables
|
|
30
|
+
if (!WS_URL || !PRIVATE_KEY) {
|
|
31
|
+
console.error('Missing required environment variables: WS_URL, PRIVATE_KEY');
|
|
32
|
+
console.error('Note: OPENAI_API_KEY is optional - Codex SDK will use default auth if not provided');
|
|
33
|
+
process.exit(1);
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
const app = express();
|
|
37
|
+
app.use(express.json());
|
|
38
|
+
|
|
39
|
+
// Initialize Teneo SDK using SDKConfigBuilder pattern
|
|
40
|
+
const config = new SDKConfigBuilder()
|
|
41
|
+
.withWebSocketUrl(WS_URL)
|
|
42
|
+
.withAuthentication(PRIVATE_KEY, WALLET_ADDRESS) // Wallet auto-derived if not provided
|
|
43
|
+
.withAutoJoinRooms([DEFAULT_ROOM])
|
|
44
|
+
.withReconnection({
|
|
45
|
+
enabled: ENABLE_RECONNECTION,
|
|
46
|
+
delay: RECONNECT_DELAY,
|
|
47
|
+
maxAttempts: MAX_RECONNECT_ATTEMPTS
|
|
48
|
+
})
|
|
49
|
+
.withResponseFormat({ format: 'both', includeMetadata: true })
|
|
50
|
+
.withLogging(LOG_LEVEL)
|
|
51
|
+
.withCache(ENABLE_CACHE, CACHE_TIMEOUT, MAX_CACHE_SIZE)
|
|
52
|
+
.withSignatureVerification({
|
|
53
|
+
enabled: ENABLE_SIG_VERIFICATION,
|
|
54
|
+
trustedAddresses: TRUSTED_ADDRESSES,
|
|
55
|
+
requireFor: ['task_response', 'agent_selected'],
|
|
56
|
+
strictMode: false
|
|
57
|
+
})
|
|
58
|
+
.build();
|
|
59
|
+
|
|
60
|
+
const teneoSDK = new TeneoSDK(config);
|
|
61
|
+
|
|
62
|
+
// Initialize Codex SDK
|
|
63
|
+
// Explicitly set the API key from environment
|
|
64
|
+
const codex = new Codex({
|
|
65
|
+
apiKey: OPENAI_API_KEY || process.env.OPENAI_API_KEY
|
|
66
|
+
});
|
|
67
|
+
|
|
68
|
+
// Connect to Teneo
|
|
69
|
+
console.log('š” Connecting to Teneo network...');
|
|
70
|
+
await teneoSDK.connect();
|
|
71
|
+
console.log('ā
Connected to Teneo\n');
|
|
72
|
+
|
|
73
|
+
// Health endpoint
|
|
74
|
+
app.get('/health', (_req: Request, res: Response) => {
|
|
75
|
+
const teneoHealth = teneoSDK.getHealth();
|
|
76
|
+
res.json({
|
|
77
|
+
status: 'ok',
|
|
78
|
+
teneo: {
|
|
79
|
+
connected: teneoHealth.connection.status === 'connected',
|
|
80
|
+
authenticated: teneoHealth.connection.authenticated
|
|
81
|
+
},
|
|
82
|
+
codex: {
|
|
83
|
+
initialized: true,
|
|
84
|
+
apiKeyConfigured: !!OPENAI_API_KEY
|
|
85
|
+
}
|
|
86
|
+
});
|
|
87
|
+
});
|
|
88
|
+
|
|
89
|
+
// Query endpoint - Codex analyzes, then routes to Teneo agent
|
|
90
|
+
app.post('/query', async (req: Request, res: Response) => {
|
|
91
|
+
try {
|
|
92
|
+
const { message } = req.body;
|
|
93
|
+
|
|
94
|
+
if (!message) {
|
|
95
|
+
return res.status(400).json({
|
|
96
|
+
success: false,
|
|
97
|
+
error: 'Message is required'
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
console.log(`\nš Query: ${message}`);
|
|
102
|
+
|
|
103
|
+
// Step 1: Get available Teneo agents
|
|
104
|
+
const agents = teneoSDK.getAgents();
|
|
105
|
+
|
|
106
|
+
// Step 2: Ask Codex to select the best agent
|
|
107
|
+
console.log('š¤ Asking Codex to select best agent...');
|
|
108
|
+
|
|
109
|
+
const agentList = agents.map(a =>
|
|
110
|
+
`- ${a.name}: ${a.description || 'No description'}`
|
|
111
|
+
).join('\n');
|
|
112
|
+
|
|
113
|
+
const thread = codex.startThread();
|
|
114
|
+
const codexResponse = await thread.run(
|
|
115
|
+
`You are an agent coordinator. Select the most appropriate agent for the user's query.
|
|
116
|
+
|
|
117
|
+
Available agents:
|
|
118
|
+
${agentList}
|
|
119
|
+
|
|
120
|
+
User query: ${message}
|
|
121
|
+
|
|
122
|
+
Respond with ONLY the agent name, nothing else.`
|
|
123
|
+
);
|
|
124
|
+
|
|
125
|
+
// Extract text from Codex response
|
|
126
|
+
// Codex SDK returns an object with finalResponse property
|
|
127
|
+
let selectedAgentName: string;
|
|
128
|
+
if (typeof codexResponse === 'string') {
|
|
129
|
+
selectedAgentName = codexResponse.trim();
|
|
130
|
+
} else if (codexResponse && typeof codexResponse === 'object') {
|
|
131
|
+
// Extract from finalResponse property
|
|
132
|
+
selectedAgentName = (codexResponse as any).finalResponse
|
|
133
|
+
|| (codexResponse as any).text
|
|
134
|
+
|| (codexResponse as any).content
|
|
135
|
+
|| String(codexResponse);
|
|
136
|
+
if (typeof selectedAgentName === 'object') {
|
|
137
|
+
selectedAgentName = JSON.stringify(selectedAgentName);
|
|
138
|
+
}
|
|
139
|
+
selectedAgentName = selectedAgentName.trim();
|
|
140
|
+
} else {
|
|
141
|
+
selectedAgentName = agents[0]?.name || '';
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
console.log(`ā
Selected agent: ${selectedAgentName}`);
|
|
145
|
+
|
|
146
|
+
// Find the agent by name or ID
|
|
147
|
+
const selectedAgent = agents.find(a =>
|
|
148
|
+
a.name?.toLowerCase() === selectedAgentName.toLowerCase() ||
|
|
149
|
+
a.id?.toLowerCase() === selectedAgentName.toLowerCase()
|
|
150
|
+
);
|
|
151
|
+
|
|
152
|
+
if (!selectedAgent) {
|
|
153
|
+
return res.status(404).json({
|
|
154
|
+
success: false,
|
|
155
|
+
error: `Agent '${selectedAgentName}' not found. Available agents: ${agents.map(a => a.name || a.id).join(', ')}`
|
|
156
|
+
});
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
// Step 3: Send direct command to selected Teneo agent (bypasses coordinator)
|
|
160
|
+
// Use the SDK's built-in waitForResponse feature with the improved fallback matching
|
|
161
|
+
console.log(`š¤ Sending to Teneo agent: ${selectedAgent.name || selectedAgent.id}...`);
|
|
162
|
+
const teneoResponse = await teneoSDK.sendDirectCommand({
|
|
163
|
+
agent: selectedAgent.id,
|
|
164
|
+
command: message,
|
|
165
|
+
room: DEFAULT_ROOM
|
|
166
|
+
}, true); // waitForResponse = true
|
|
167
|
+
|
|
168
|
+
if (!teneoResponse || !teneoResponse.humanized) {
|
|
169
|
+
return res.json({
|
|
170
|
+
success: false,
|
|
171
|
+
error: 'No response from Teneo agent'
|
|
172
|
+
});
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
console.log(`ā
Response received\n`);
|
|
176
|
+
|
|
177
|
+
// Return combined response
|
|
178
|
+
res.json({
|
|
179
|
+
success: true,
|
|
180
|
+
data: {
|
|
181
|
+
query: message,
|
|
182
|
+
selectedAgent: selectedAgent.name || selectedAgent.id,
|
|
183
|
+
selectedAgentId: selectedAgent.id,
|
|
184
|
+
response: teneoResponse.humanized,
|
|
185
|
+
codexSelection: selectedAgentName,
|
|
186
|
+
metadata: teneoResponse.metadata
|
|
187
|
+
}
|
|
188
|
+
});
|
|
189
|
+
|
|
190
|
+
} catch (error) {
|
|
191
|
+
console.error('ā Query error:', error);
|
|
192
|
+
res.status(500).json({
|
|
193
|
+
success: false,
|
|
194
|
+
error: error instanceof Error ? error.message : 'Unknown error'
|
|
195
|
+
});
|
|
196
|
+
}
|
|
197
|
+
});
|
|
198
|
+
|
|
199
|
+
// Direct Codex query (bypass Teneo)
|
|
200
|
+
app.post('/codex', async (req: Request, res: Response) => {
|
|
201
|
+
try {
|
|
202
|
+
const { message, threadId } = req.body;
|
|
203
|
+
|
|
204
|
+
if (!message) {
|
|
205
|
+
return res.status(400).json({
|
|
206
|
+
success: false,
|
|
207
|
+
error: 'Message is required'
|
|
208
|
+
});
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
console.log(`\nš¬ Codex query: ${message}`);
|
|
212
|
+
|
|
213
|
+
// Resume existing thread or start new one
|
|
214
|
+
const thread = threadId ? codex.resumeThread(threadId) : codex.startThread();
|
|
215
|
+
const codexResult = await thread.run(message);
|
|
216
|
+
|
|
217
|
+
// Extract text from Codex response
|
|
218
|
+
// Codex SDK returns an object with finalResponse property
|
|
219
|
+
let responseText: string;
|
|
220
|
+
if (typeof codexResult === 'string') {
|
|
221
|
+
responseText = codexResult;
|
|
222
|
+
} else if (codexResult && typeof codexResult === 'object') {
|
|
223
|
+
responseText = (codexResult as any).finalResponse
|
|
224
|
+
|| (codexResult as any).text
|
|
225
|
+
|| (codexResult as any).content
|
|
226
|
+
|| JSON.stringify(codexResult);
|
|
227
|
+
} else {
|
|
228
|
+
responseText = String(codexResult);
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
res.json({
|
|
232
|
+
success: true,
|
|
233
|
+
data: {
|
|
234
|
+
response: responseText,
|
|
235
|
+
threadId: thread.id || 'new',
|
|
236
|
+
usage: (codexResult as any).usage // Include token usage if available
|
|
237
|
+
}
|
|
238
|
+
});
|
|
239
|
+
|
|
240
|
+
} catch (error) {
|
|
241
|
+
console.error('ā Codex error:', error);
|
|
242
|
+
res.status(500).json({
|
|
243
|
+
success: false,
|
|
244
|
+
error: error instanceof Error ? error.message : 'Unknown error'
|
|
245
|
+
});
|
|
246
|
+
}
|
|
247
|
+
});
|
|
248
|
+
|
|
249
|
+
// List Teneo agents
|
|
250
|
+
app.get('/agents', (_req: Request, res: Response) => {
|
|
251
|
+
const agents = teneoSDK.getAgents();
|
|
252
|
+
res.json({
|
|
253
|
+
success: true,
|
|
254
|
+
agents: agents.map(a => ({
|
|
255
|
+
id: a.id,
|
|
256
|
+
name: a.name,
|
|
257
|
+
description: a.description,
|
|
258
|
+
capabilities: a.capabilities
|
|
259
|
+
}))
|
|
260
|
+
});
|
|
261
|
+
});
|
|
262
|
+
|
|
263
|
+
const PORT = process.env.PORT || 3000;
|
|
264
|
+
app.listen(PORT, () => {
|
|
265
|
+
console.log(`š Codex + Teneo Service running on http://localhost:${PORT}`);
|
|
266
|
+
console.log(` Health: GET http://localhost:${PORT}/health`);
|
|
267
|
+
console.log(` Query: POST http://localhost:${PORT}/query`);
|
|
268
|
+
console.log(` Body: { "message": "your query" }`);
|
|
269
|
+
console.log(` Codex: POST http://localhost:${PORT}/codex`);
|
|
270
|
+
console.log(` Body: { "message": "your query", "threadId": "optional" }`);
|
|
271
|
+
console.log(` Agents: GET http://localhost:${PORT}/agents\n`);
|
|
272
|
+
});
|
|
273
|
+
|
|
274
|
+
// Graceful shutdown
|
|
275
|
+
process.on('SIGINT', () => {
|
|
276
|
+
console.log('\nš Shutting down...');
|
|
277
|
+
teneoSDK.disconnect();
|
|
278
|
+
teneoSDK.destroy();
|
|
279
|
+
process.exit(0);
|
|
280
|
+
});
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "openai-teneo-integration",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "Minimal OpenAI + Teneo Consumer SDK integration example",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "index.ts",
|
|
7
|
+
"scripts": {
|
|
8
|
+
"start": "tsx index.ts",
|
|
9
|
+
"dev": "tsx watch index.ts"
|
|
10
|
+
},
|
|
11
|
+
"dependencies": {
|
|
12
|
+
"@openai/codex-sdk": "^0.46.0",
|
|
13
|
+
"@teneo-protocol/sdk": "file:../..",
|
|
14
|
+
"dotenv": "^16.3.1",
|
|
15
|
+
"express": "^4.18.2",
|
|
16
|
+
"openai": "^4.20.0"
|
|
17
|
+
},
|
|
18
|
+
"devDependencies": {
|
|
19
|
+
"@types/express": "^4.17.21",
|
|
20
|
+
"@types/node": "^20.10.5",
|
|
21
|
+
"tsx": "^4.7.0",
|
|
22
|
+
"typescript": "^5.3.3"
|
|
23
|
+
}
|
|
24
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
{
|
|
2
|
+
"compilerOptions": {
|
|
3
|
+
"module": "ESNext",
|
|
4
|
+
"moduleResolution": "node",
|
|
5
|
+
"target": "ES2022",
|
|
6
|
+
"lib": ["ES2022"],
|
|
7
|
+
"esModuleInterop": true,
|
|
8
|
+
"skipLibCheck": true,
|
|
9
|
+
"strict": true,
|
|
10
|
+
"resolveJsonModule": true,
|
|
11
|
+
"outDir": "./dist",
|
|
12
|
+
"rootDir": "."
|
|
13
|
+
},
|
|
14
|
+
"include": ["*.ts"],
|
|
15
|
+
"exclude": ["node_modules", "dist"]
|
|
16
|
+
}
|
|
@@ -6,15 +6,17 @@
|
|
|
6
6
|
# ============================================================================
|
|
7
7
|
|
|
8
8
|
# WebSocket URL for Teneo AI Network
|
|
9
|
-
|
|
9
|
+
# Production: wss://your-production-server.com/ws
|
|
10
|
+
# Development: wss://your-teneo-server.com/ws
|
|
11
|
+
WS_URL=wss://your-teneo-server.com/ws
|
|
10
12
|
|
|
11
13
|
# Ethereum Private Key (with 0x prefix)
|
|
12
14
|
# IMPORTANT: Never commit your actual private key to version control!
|
|
13
|
-
PRIVATE_KEY=
|
|
15
|
+
PRIVATE_KEY=0x1234567890123456789012345678901234567890123456789012345678901234
|
|
14
16
|
|
|
15
17
|
# Ethereum Wallet Address (with 0x prefix)
|
|
16
18
|
# If not provided, will be derived from the private key
|
|
17
|
-
WALLET_ADDRESS=
|
|
19
|
+
WALLET_ADDRESS=0x1234567890123456789012345678901234567890
|
|
18
20
|
|
|
19
21
|
# ============================================================================
|
|
20
22
|
# OPTIONAL: Room Configuration
|