Skip to content

Commit a60550a

Browse files
Merge pull request #122 from SmythOS/dev
Add status_message support for tool calls + Fix missing Usage event in the SDK
2 parents 28cded3 + fdec406 commit a60550a

File tree

10 files changed

+25
-8
lines changed

10 files changed

+25
-8
lines changed

examples/01-agent-code-skill/04.1-chat-planner-coder.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import { Agent, Chat, Component, Model, TAgentMode, TLLMEvent } from '@smythos/sdk';
22
import chalk from 'chalk';
33
import * as readline from 'readline';
4-
import { EmitUnit, PluginAPI, PluginBase, TokenLoom } from 'tokenloom';
4+
import { EmitUnit, PluginBase, TokenLoom } from 'tokenloom';
55

66
//Show the tasks list and status to the user at every step before performing the tasks, and also give a tasks status summary after tasks.
77
//When you display the tasks list to a user show it in a concise way with a summary and checkboxes for each task.

examples/03-agent-workflow-components/01-workflow.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ async function main() {
1616
const mdSkill = agent.addSkill({
1717
name: 'MarketData',
1818
description: 'Use this skill to get comprehensive market data and statistics for a cryptocurrency',
19+
status_message: 'Getting market data...',
1920
});
2021

2122
//Defining the inputs of the skill
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
{"version":"1.0.0","id":"cmbhu1l6c2qgv12er6xei99vz","name":"Crypto Info Agent","teamId":"9","parentTeamId":"9","components":[{"id":"CS001","name":"APIEndpoint","outputs":[{"name":"headers","color":"#3C89F9","index":0,"default":true},{"name":"body","color":"#3C89F9","index":1,"default":true},{"name":"query","color":"#3C89F9","index":2,"default":true},{"name":"query.query","color":"#3C89F9","index":3,"default":false}],"inputs":[{"name":"query","type":"String","friendlyInputType":"","coreInputType":"","color":"#F35063","optional":false,"index":0,"default":false}],"data":{"endpoint":"search_coins","description":"Search for cryptocurrencies by name or symbol","method":"GET","ai_exposed":true,"advancedModeEnabled":true,"endpointLabel":"","summary":""},"top":"0px","left":"50px","width":"","height":"","displayName":"APIEndpoint","title":"Search Coins","aiTitle":"","description":"Search for coins by name or symbol"},{"id":"CS002","name":"APICall","outputs":[{"name":"Response","color":"#3C89F9","index":0,"default":true},{"name":"Headers","color":"#3C89F9","index":1,"default":true},{"name":"Response.coins","color":"#3C89F9","index":2,"default":false}],"inputs":[{"name":"search_query","type":"String","friendlyInputType":"","coreInputType":"","color":"#F35063","optional":false,"index":0,"default":false}],"data":{"method":"GET","url":"https://api.coingecko.com/api/v3/search?query={{search_query}}","contentType":"application/json","oauthService":"None","scope":"","authorizationURL":"","tokenURL":"","clientID":"","clientSecret":"","requestTokenURL":"","accessTokenURL":"","userAuthorizationURL":"","consumerKey":"","consumerSecret":""},"top":"0px","left":"500px","width":"","height":"","displayName":"APICall","title":"CoinGecko Search","aiTitle":"","description":"Call CoinGecko search API"},{"id":"CS003","name":"APIOutput","outputs":[{"name":"Output","color":"#3C89F9","index":0,"default":true}],"inputs":[{"name":"coins","type":"Any","friendlyInputType":"","coreInputType":"","color":"#F35063","optional":false,"index":0,"default":false}],"data":{"format":"minimal"},"top":"0px","left":"950px","width":"","height":"","displayName":"APIOutput","title":"Search Results","aiTitle":"","description":"Format search results"},{"id":"CP001","name":"APIEndpoint","outputs":[{"name":"headers","color":"#3C89F9","index":0,"default":true},{"name":"body","color":"#3C89F9","index":1,"default":true},{"name":"query","color":"#3C89F9","index":2,"default":true},{"name":"query.coin_id","color":"#3C89F9","index":3,"default":false}],"inputs":[{"name":"coin_id","type":"String","friendlyInputType":"","coreInputType":"","color":"#F35063","optional":false,"index":0,"default":false}],"data":{"endpoint":"get_price","description":"Get the current price of a cryptocurrency in USD","method":"GET","ai_exposed":true,"advancedModeEnabled":true,"endpointLabel":"","summary":""},"top":"387px","left":"50px","width":"","height":"","displayName":"APIEndpoint","title":"Get Price","aiTitle":"","description":"Get current price in USD"},{"id":"CP002","name":"APICall","outputs":[{"name":"Response","color":"#3C89F9","index":0,"default":true},{"name":"Headers","color":"#3C89F9","index":1,"default":true}],"inputs":[{"name":"coin_id","type":"String","friendlyInputType":"","coreInputType":"","color":"#F35063","optional":false,"index":0,"default":false}],"data":{"method":"GET","url":"https://api.coingecko.com/api/v3/simple/price?ids={{coin_id}}&vs_currencies=usd","contentType":"application/json","oauthService":"None","scope":"","authorizationURL":"","tokenURL":"","clientID":"","clientSecret":"","requestTokenURL":"","accessTokenURL":"","userAuthorizationURL":"","consumerKey":"","consumerSecret":""},"top":"387px","left":"500px","width":"","height":"","displayName":"APICall","title":"CoinGecko Price","aiTitle":"","description":"Call CoinGecko price API"},{"id":"CP003","name":"APIOutput","outputs":[{"name":"Output","color":"#3C89F9","index":0,"default":true}],"inputs":[{"name":"price_data","type":"Any","friendlyInputType":"","coreInputType":"","color":"#F35063","optional":false,"index":0,"default":false}],"data":{"format":"minimal"},"top":"387px","left":"950px","width":"","height":"","displayName":"APIOutput","title":"Price Data","aiTitle":"","description":"Format price data"},{"id":"CM001","name":"APIEndpoint","outputs":[{"name":"headers","color":"#3C89F9","index":0,"default":true},{"name":"body","color":"#3C89F9","index":1,"default":true},{"name":"query","color":"#3C89F9","index":2,"default":true},{"name":"query.coin_id","color":"#3C89F9","index":3,"default":false}],"inputs":[{"name":"coin_id","type":"String","friendlyInputType":"","coreInputType":"","color":"#F35063","optional":false,"index":0,"default":false}],"data":{"endpoint":"get_market_info","description":"Get detailed market information for a cryptocurrency","method":"GET","ai_exposed":true,"advancedModeEnabled":true,"endpointLabel":"","summary":""},"top":"774px","left":"50px","width":"","height":"","displayName":"APIEndpoint","title":"Market Info","aiTitle":"","description":"Get market information"},{"id":"CM002","name":"APICall","outputs":[{"name":"Response","color":"#3C89F9","index":0,"default":true},{"name":"Headers","color":"#3C89F9","index":1,"default":true},{"name":"Response.market_data","color":"#3C89F9","index":2,"default":false}],"inputs":[{"name":"coin_id","type":"String","friendlyInputType":"","coreInputType":"","color":"#F35063","optional":false,"index":0,"default":false}],"data":{"method":"GET","url":"https://api.coingecko.com/api/v3/coins/{{coin_id}}?localization=false&tickers=false&market_data=true&community_data=false&developer_data=false&sparkline=false","contentType":"application/json","oauthService":"None","scope":"","authorizationURL":"","tokenURL":"","clientID":"","clientSecret":"","requestTokenURL":"","accessTokenURL":"","userAuthorizationURL":"","consumerKey":"","consumerSecret":""},"top":"774px","left":"500px","width":"","height":"","displayName":"APICall","title":"CoinGecko Market","aiTitle":"","description":"Call CoinGecko market data API"},{"id":"CM003","name":"APIOutput","outputs":[{"name":"Output","color":"#3C89F9","index":0,"default":true}],"inputs":[{"name":"market_data","type":"Any","friendlyInputType":"","coreInputType":"","color":"#F35063","optional":false,"index":0,"default":false}],"data":{"format":"minimal"},"top":"774px","left":"950px","width":"","height":"","displayName":"APIOutput","title":"Market Data","aiTitle":"","description":"Format market data"}],"connections":[{"sourceId":"CS001","sourceIndex":3,"targetId":"CS002","targetIndex":0},{"sourceId":"CS002","sourceIndex":2,"targetId":"CS003","targetIndex":0},{"sourceId":"CP001","sourceIndex":3,"targetId":"CP002","targetIndex":0},{"sourceId":"CP002","sourceIndex":0,"targetId":"CP003","targetIndex":0},{"sourceId":"CM001","sourceIndex":3,"targetId":"CM002","targetIndex":0},{"sourceId":"CM002","sourceIndex":2,"targetId":"CM003","targetIndex":0}],"description":"","shortDescription":"","behavior":"I am a cryptocurrency information assistant that uses the CoinGecko API. I can help you search for cryptocurrencies by name or symbol, check current prices in USD, and get detailed market information for specific coins. I will provide accurate and up-to-date information from CoinGecko's database. If you're looking for crypto market data, just ask me about any coin and I'll retrieve the information for you.","ui":{"panzoom":{"currentPan":{"x":378.032470703125,"y":-260.9026702880859},"currentZoom":0.5},"agentCard":{"left":"-745px","top":"112px"}},"introMessage":"Hi, I'm Crypto Info Agent. How can I help you today?","templateInfo":{"id":"crypto-info-agent-mbhwct4hp","name":"Crypto Info Agent","description":"","icon":"","category":"","publish":false,"color":"#000000","imageUrl":"","docLink":"","videoLink":"","valueProposition":""}}
1+
{"version":"1.0.0","id":"cmbhu1l6c2qgv12er6xei99vz","name":"Crypto Info Agent","teamId":"9","parentTeamId":"9","components":[{"id":"CS001","name":"APIEndpoint","outputs":[{"name":"headers","color":"#3C89F9","index":0,"default":true},{"name":"body","color":"#3C89F9","index":1,"default":true},{"name":"query","color":"#3C89F9","index":2,"default":true},{"name":"query.query","color":"#3C89F9","index":3,"default":false}],"inputs":[{"name":"query","type":"String","friendlyInputType":"","coreInputType":"","color":"#F35063","optional":false,"index":0,"default":false}],"data":{"endpoint":"search_coins","status_message":"Coin search ...", "description":"Search for cryptocurrencies by name or symbol","method":"GET","ai_exposed":true,"advancedModeEnabled":true,"endpointLabel":"","summary":""},"top":"0px","left":"50px","width":"","height":"","displayName":"APIEndpoint","title":"Search Coins","aiTitle":"","description":"Search for coins by name or symbol"},{"id":"CS002","name":"APICall","outputs":[{"name":"Response","color":"#3C89F9","index":0,"default":true},{"name":"Headers","color":"#3C89F9","index":1,"default":true},{"name":"Response.coins","color":"#3C89F9","index":2,"default":false}],"inputs":[{"name":"search_query","type":"String","friendlyInputType":"","coreInputType":"","color":"#F35063","optional":false,"index":0,"default":false}],"data":{"method":"GET","url":"https://api.coingecko.com/api/v3/search?query={{search_query}}","contentType":"application/json","oauthService":"None","scope":"","authorizationURL":"","tokenURL":"","clientID":"","clientSecret":"","requestTokenURL":"","accessTokenURL":"","userAuthorizationURL":"","consumerKey":"","consumerSecret":""},"top":"0px","left":"500px","width":"","height":"","displayName":"APICall","title":"CoinGecko Search","aiTitle":"","description":"Call CoinGecko search API"},{"id":"CS003","name":"APIOutput","outputs":[{"name":"Output","color":"#3C89F9","index":0,"default":true}],"inputs":[{"name":"coins","type":"Any","friendlyInputType":"","coreInputType":"","color":"#F35063","optional":false,"index":0,"default":false}],"data":{"format":"minimal"},"top":"0px","left":"950px","width":"","height":"","displayName":"APIOutput","title":"Search Results","aiTitle":"","description":"Format search results"},{"id":"CP001","name":"APIEndpoint","outputs":[{"name":"headers","color":"#3C89F9","index":0,"default":true},{"name":"body","color":"#3C89F9","index":1,"default":true},{"name":"query","color":"#3C89F9","index":2,"default":true},{"name":"query.coin_id","color":"#3C89F9","index":3,"default":false}],"inputs":[{"name":"coin_id","type":"String","friendlyInputType":"","coreInputType":"","color":"#F35063","optional":false,"index":0,"default":false}],"data":{"endpoint":"get_price","status_message":"Getting Price ...","description":"Get the current price of a cryptocurrency in USD","method":"GET","ai_exposed":true,"advancedModeEnabled":true,"endpointLabel":"","summary":""},"top":"387px","left":"50px","width":"","height":"","displayName":"APIEndpoint","title":"Get Price","aiTitle":"","description":"Get current price in USD"},{"id":"CP002","name":"APICall","outputs":[{"name":"Response","color":"#3C89F9","index":0,"default":true},{"name":"Headers","color":"#3C89F9","index":1,"default":true}],"inputs":[{"name":"coin_id","type":"String","friendlyInputType":"","coreInputType":"","color":"#F35063","optional":false,"index":0,"default":false}],"data":{"method":"GET","url":"https://api.coingecko.com/api/v3/simple/price?ids={{coin_id}}&vs_currencies=usd","contentType":"application/json","oauthService":"None","scope":"","authorizationURL":"","tokenURL":"","clientID":"","clientSecret":"","requestTokenURL":"","accessTokenURL":"","userAuthorizationURL":"","consumerKey":"","consumerSecret":""},"top":"387px","left":"500px","width":"","height":"","displayName":"APICall","title":"CoinGecko Price","aiTitle":"","description":"Call CoinGecko price API"},{"id":"CP003","name":"APIOutput","outputs":[{"name":"Output","color":"#3C89F9","index":0,"default":true}],"inputs":[{"name":"price_data","type":"Any","friendlyInputType":"","coreInputType":"","color":"#F35063","optional":false,"index":0,"default":false}],"data":{"format":"minimal"},"top":"387px","left":"950px","width":"","height":"","displayName":"APIOutput","title":"Price Data","aiTitle":"","description":"Format price data"},{"id":"CM001","name":"APIEndpoint","outputs":[{"name":"headers","color":"#3C89F9","index":0,"default":true},{"name":"body","color":"#3C89F9","index":1,"default":true},{"name":"query","color":"#3C89F9","index":2,"default":true},{"name":"query.coin_id","color":"#3C89F9","index":3,"default":false}],"inputs":[{"name":"coin_id","type":"String","friendlyInputType":"","coreInputType":"","color":"#F35063","optional":false,"index":0,"default":false}],"data":{"endpoint":"get_market_info","description":"Get detailed market information for a cryptocurrency","method":"GET","ai_exposed":true,"advancedModeEnabled":true,"endpointLabel":"","summary":""},"top":"774px","left":"50px","width":"","height":"","displayName":"APIEndpoint","title":"Market Info","aiTitle":"","description":"Get market information"},{"id":"CM002","name":"APICall","outputs":[{"name":"Response","color":"#3C89F9","index":0,"default":true},{"name":"Headers","color":"#3C89F9","index":1,"default":true},{"name":"Response.market_data","color":"#3C89F9","index":2,"default":false}],"inputs":[{"name":"coin_id","type":"String","friendlyInputType":"","coreInputType":"","color":"#F35063","optional":false,"index":0,"default":false}],"data":{"method":"GET","url":"https://api.coingecko.com/api/v3/coins/{{coin_id}}?localization=false&tickers=false&market_data=true&community_data=false&developer_data=false&sparkline=false","contentType":"application/json","oauthService":"None","scope":"","authorizationURL":"","tokenURL":"","clientID":"","clientSecret":"","requestTokenURL":"","accessTokenURL":"","userAuthorizationURL":"","consumerKey":"","consumerSecret":""},"top":"774px","left":"500px","width":"","height":"","displayName":"APICall","title":"CoinGecko Market","aiTitle":"","description":"Call CoinGecko market data API"},{"id":"CM003","name":"APIOutput","outputs":[{"name":"Output","color":"#3C89F9","index":0,"default":true}],"inputs":[{"name":"market_data","type":"Any","friendlyInputType":"","coreInputType":"","color":"#F35063","optional":false,"index":0,"default":false}],"data":{"format":"minimal"},"top":"774px","left":"950px","width":"","height":"","displayName":"APIOutput","title":"Market Data","aiTitle":"","description":"Format market data"}],"connections":[{"sourceId":"CS001","sourceIndex":3,"targetId":"CS002","targetIndex":0},{"sourceId":"CS002","sourceIndex":2,"targetId":"CS003","targetIndex":0},{"sourceId":"CP001","sourceIndex":3,"targetId":"CP002","targetIndex":0},{"sourceId":"CP002","sourceIndex":0,"targetId":"CP003","targetIndex":0},{"sourceId":"CM001","sourceIndex":3,"targetId":"CM002","targetIndex":0},{"sourceId":"CM002","sourceIndex":2,"targetId":"CM003","targetIndex":0}],"description":"","shortDescription":"","behavior":"I am a cryptocurrency information assistant that uses the CoinGecko API. I can help you search for cryptocurrencies by name or symbol, check current prices in USD, and get detailed market information for specific coins. I will provide accurate and up-to-date information from CoinGecko's database. If you're looking for crypto market data, just ask me about any coin and I'll retrieve the information for you.","ui":{"panzoom":{"currentPan":{"x":378.032470703125,"y":-260.9026702880859},"currentZoom":0.5},"agentCard":{"left":"-745px","top":"112px"}},"introMessage":"Hi, I'm Crypto Info Agent. How can I help you today?","templateInfo":{"id":"crypto-info-agent-mbhwct4hp","name":"Crypto Info Agent","description":"","icon":"","category":"","publish":false,"color":"#000000","imageUrl":"","docLink":"","videoLink":"","valueProposition":""}}

packages/core/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@smythos/sre",
3-
"version": "1.5.63",
3+
"version": "1.5.64",
44
"description": "Smyth Runtime Environment",
55
"author": "Alaa-eddine KADDOURI",
66
"license": "MIT",

packages/core/src/Components/APICall/APICall.class.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -117,8 +117,8 @@ export class APICall extends Component {
117117
// To support both old and new OAuth configuration, we check for both oauth_con_id and oauthService.
118118
logger.debug('checking oauth config', config?.data?.oauth_con_id, config?.data?.oauthService);
119119
if (
120-
(config?.data?.oauth_con_id !== undefined && config?.data?.oauth_con_id !== '' && config?.data?.oauth_con_id !== 'None') ||
121-
(config?.data?.oauthService !== '' && config.data.oauthService !== 'None')
120+
(config?.data?.oauth_con_id && config.data.oauth_con_id !== 'None') ||
121+
(config?.data?.oauthService && config.data.oauthService !== 'None')
122122
) {
123123
const additionalParams = extractAdditionalParamsForOAuth1(reqConfig);
124124
const oauthHeaders = await generateOAuthHeaders(agent, config, reqConfig, logger, additionalParams);

packages/core/src/helpers/Conversation.helper.ts

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@ export class Conversation extends EventEmitter {
5252

5353
private _reqMethods;
5454
private _toolsConfig;
55+
private _toolStatusMap: Record<string, string> = {};
5556
private _endpoints;
5657
private _baseUrl;
5758

@@ -459,7 +460,9 @@ export class Conversation extends EventEmitter {
459460
//await beforeFunctionCall(llmMessage, toolsData[tool.index]);
460461
// TODO [Forhad]: Make sure toolsData[tool.index] and tool do the same thing
461462
this.emit('beforeToolCall', { tool, args }, llmMessage); //deprecated
462-
this.emit(TLLMEvent.ToolCall, { tool, _llmRequest: llmMessage });
463+
464+
const status = tool.name ? this._toolStatusMap?.[tool.name] : undefined;
465+
this.emit(TLLMEvent.ToolCall, { tool, status, _llmRequest: llmMessage });
463466

464467
const toolArgs = {
465468
type: tool?.type,
@@ -981,6 +984,16 @@ export class Conversation extends EventEmitter {
981984
this.systemPrompt = `Assistant Name : ${this.assistantName}\n\n${this.systemPrompt}`;
982985
}
983986

987+
this._toolStatusMap = agentData?.data?.components
988+
?.filter((component) => component.name === 'APIEndpoint')
989+
.reduce((map, component) => {
990+
if (component?.data?.endpoint) {
991+
map[component.data.endpoint] =
992+
component?.data?.status_message || `Calling ${component?.data?.endpointLabel || component.data.endpoint}`;
993+
}
994+
return map;
995+
}, {});
996+
984997
const spec = await agentDataConnector.getOpenAPIJSON(agentData, 'http://localhost/', this._agentVersion, true).catch((error) => null);
985998
return this.patchSpec(spec);
986999
}

packages/sdk/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@smythos/sdk",
3-
"version": "1.1.4",
3+
"version": "1.1.6",
44
"description": "SRE SDK",
55
"keywords": [
66
"smythos",

packages/sdk/src/Agent/Agent.class.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -203,6 +203,7 @@ class AgentCommand {
203203

204204
conversation.on(TLLMEvent.ToolCall, toolCallHandler);
205205
conversation.on(TLLMEvent.ToolResult, toolResultHandler);
206+
conversation.on(TLLMEvent.Usage, usageHandler);
206207
conversation.on(TLLMEvent.End, endHandler);
207208
conversation.on(TLLMEvent.Error, errorHandler);
208209
conversation.on(TLLMEvent.Content, contentHandler);

0 commit comments

Comments
 (0)