Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[docs] Add guide for implementing typescript agent #452

Open
wants to merge 1 commit into
base: main
Choose a base branch
from

Conversation

piligrinik
Copy link

@piligrinik piligrinik commented Dec 18, 2024

Added guide for implementing ts agent with corresponding example code.


Important

Add a detailed guide and example code for implementing TypeScript agents in the documentation.

  • Documentation:
    • Added ts_agent_guide.md to provide a detailed guide for implementing TypeScript agents.
    • Updated index.md to include a link to the new TypeScript agent guide.
  • Examples:
    • Added agent.ts and client.ts in docs/examples/TypeScript/ to demonstrate TypeScript agent implementation.
  • Guide Content:
    • Covers steps for setting up input/output constructions, creating ScClient, implementing agent logic, and registering the agent.
    • Includes FAQs addressing differences between C++ and TypeScript agents.

This description was created by Ellipsis for 57bb8fb. It will automatically update as commits are pushed.

@piligrinik piligrinik closed this Dec 18, 2024
@piligrinik piligrinik reopened this Dec 18, 2024
@NikitaZotov NikitaZotov changed the title Added guide for implementing typescript agent. [docs] Added guide for implementing typescript agent Dec 22, 2024
@NikitaZotov NikitaZotov changed the title [docs] Added guide for implementing typescript agent [docs] Add guide for implementing typescript agent Dec 22, 2024
Comment on lines +3 to +19


export const check = async(action: ScAddr,keynodes: Record<string, ScAddr>) => {
const checkTemplate = new ScTemplate();
checkTemplate.triple( // класс_действия
keynodes["get_set_power_action"], // |
ScType.EdgeAccessVarPosPerm, // \/
action, // действие
);
const checkResult = await client.templateSearch(checkTemplate);
if (checkResult.length==0)
{
return false;

}
return true;
}
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
export const check = async(action: ScAddr,keynodes: Record<string, ScAddr>) => {
const checkTemplate = new ScTemplate();
checkTemplate.triple( // класс_действия
keynodes["get_set_power_action"], // |
ScType.EdgeAccessVarPosPerm, // \/
action, // действие
);
const checkResult = await client.templateSearch(checkTemplate);
if (checkResult.length==0)
{
return false;
}
return true;
}
export const check = async(action: ScAddr,keynodes: Record<string, ScAddr>) => {
const checkTemplate = new ScTemplate();
checkTemplate.triple( // класс_действия
keynodes["get_set_power_action"], // |
ScType.EdgeAccessVarPosPerm, // \/
action, // действие
);
const checkResult = await client.templateSearch(checkTemplate);
return checkResult.length === 0;
}

const actionFinishedSuccessfully = 'action_finished_successfully';
const actionFinishedUnsuccessfully = 'action_finished_unsuccessfully';
const nrelResult = 'nrel_result';
const nrelSetPower="nrel_set_power";
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
const nrelSetPower="nrel_set_power";
const nrelSetPower = "nrel_set_power";

{ id: actionInitiated, type: ScType.NodeConstClass },
];
const keynodes = await client.resolveKeynodes(baseKeynodes); //собрали все кейноды из БЗ
if(await check(actionNode,keynodes)===false) //сделали проверку на класс действия
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
if(await check(actionNode,keynodes)===false) //сделали проверку на класс действия
if (await check(actionNode,keynodes) === false) // сделали проверку на класс действия

{ id: action, type: ScType.NodeConstClass },
{ id: actionInitiated, type: ScType.NodeConstClass },
];
const keynodes = await client.resolveKeynodes(baseKeynodes); //собрали все кейноды из БЗ
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
const keynodes = await client.resolveKeynodes(baseKeynodes); //собрали все кейноды из БЗ
const keynodes = await client.resolveKeynodes(baseKeynodes); // собрали все кейноды из БЗ

Comment on lines +48 to +49
const setAlias = '_set'; //узел множества
const elAlias = '_el'; //узел элемента множества
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
const setAlias = '_set'; //узел множества
const elAlias = '_el'; //узел элемента множества
const setAlias = '_set'; // узел множества
const elAlias = '_el'; // узел элемента множества

Comment on lines +86 to +93
const powerSetConstruction = new ScConstruction(); //конструкция,где будет только множество и его мощность
const setPowerLinkAlias="set_power_link"; //метки для всех будущих элементов
const edgeCommonSetPowerAlias="edge_common_set_power";
const edgePosPermSetPowerAlias="edge_pos_perm_set_power";
const resultConstructionNodeAlias="result_construction_node";
const edgePosPermResultAlias="edge_pos_perm_result";
const edgeCommonResultAlias="edge_common_result";
powerSetConstruction.createLink(ScType.LinkConst,new ScLinkContent(power, ScLinkContentType.String),setPowerLinkAlias);//создаем ссылку с числом ссылка
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
const powerSetConstruction = new ScConstruction(); //конструкция,где будет только множество и его мощность
const setPowerLinkAlias="set_power_link"; //метки для всех будущих элементов
const edgeCommonSetPowerAlias="edge_common_set_power";
const edgePosPermSetPowerAlias="edge_pos_perm_set_power";
const resultConstructionNodeAlias="result_construction_node";
const edgePosPermResultAlias="edge_pos_perm_result";
const edgeCommonResultAlias="edge_common_result";
powerSetConstruction.createLink(ScType.LinkConst,new ScLinkContent(power, ScLinkContentType.String),setPowerLinkAlias);//создаем ссылку с числом ссылка
const powerSetConstruction = new ScConstruction(); // конструкция,где будет только множество и его мощность
const setPowerLinkAlias = "set_power_link"; // метки для всех будущих элементов
const edgeCommonSetPowerAlias = "edge_common_set_power";
const edgePosPermSetPowerAlias = "edge_pos_perm_set_power";
const resultConstructionNodeAlias = "result_construction_node";
const edgePosPermResultAlias = "edge_pos_perm_result";
const edgeCommonResultAlias = "edge_common_result";
powerSetConstruction.createLink(ScType.LinkConst, new ScLinkContent(power, ScLinkContentType.String), setPowerLinkAlias); // создаем ссылку с числом ссылка

Comment on lines +94 to +95
powerSetConstruction.createEdge(ScType.EdgeDCommonConst,set,setPowerLinkAlias,edgeCommonSetPowerAlias); //соединяем ее с множеством дугой для отношений /\
powerSetConstruction.createEdge(ScType.EdgeAccessConstPosPerm,keynodes[nrelSetPower],edgeCommonSetPowerAlias,edgePosPermSetPowerAlias); //соедиянемя nrel_set_power с предыдущей дугой ||<--nrel_set_power
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
powerSetConstruction.createEdge(ScType.EdgeDCommonConst,set,setPowerLinkAlias,edgeCommonSetPowerAlias); //соединяем ее с множеством дугой для отношений /\
powerSetConstruction.createEdge(ScType.EdgeAccessConstPosPerm,keynodes[nrelSetPower],edgeCommonSetPowerAlias,edgePosPermSetPowerAlias); //соедиянемя nrel_set_power с предыдущей дугой ||<--nrel_set_power
powerSetConstruction.createEdge(ScType.EdgeDCommonConst, set, setPowerLinkAlias, edgeCommonSetPowerAlias); // соединяем ее с множеством дугой для отношений /\
powerSetConstruction.createEdge(ScType.EdgeAccessConstPosPerm,keynodes[nrelSetPower],edgeCommonSetPowerAlias,edgePosPermSetPowerAlias); //соедиянемя nrel_set_power с предыдущей дугой ||<--nrel_set_power

Comment on lines +98 to +106
const resultConstruction = new ScConstruction(); //конструкция,где действие будет соединяться с предыдущей конструкцией отношением nrel_result
resultConstruction.createNode(ScType.NodeConst,resultConstructionNodeAlias); //создаем узел-посредний
resultConstruction.createEdge(ScType.EdgeDCommonConst,actionNode,resultConstructionNodeAlias,edgePosPermResultAlias);// соединяем с действием дугой для отношений
resultConstruction.createEdge(ScType.EdgeAccessConstPosPerm,keynodes[nrelResult],edgePosPermResultAlias,edgeCommonResultAlias); //соедиянемя nrel_result с предыдущей дугой
resultConstruction.createEdge(ScType.EdgeAccessConstPosPerm,resultConstructionNodeAlias,powerSetRes[powerSetConstruction.getIndex(setPowerLinkAlias)]);// соединяем узел-посредний со всеми элементами powerSetConstruction
resultConstruction.createEdge(ScType.EdgeAccessConstPosPerm,resultConstructionNodeAlias,set);
resultConstruction.createEdge(ScType.EdgeAccessConstPosPerm,resultConstructionNodeAlias,powerSetRes[powerSetConstruction.getIndex(edgeCommonSetPowerAlias)]);
resultConstruction.createEdge(ScType.EdgeAccessConstPosPerm,resultConstructionNodeAlias,powerSetRes[powerSetConstruction.getIndex(edgePosPermSetPowerAlias)]);
resultConstruction.createEdge(ScType.EdgeAccessConstPosPerm,resultConstructionNodeAlias,keynodes[nrelSetPower]);
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
const resultConstruction = new ScConstruction(); //конструкция,где действие будет соединяться с предыдущей конструкцией отношением nrel_result
resultConstruction.createNode(ScType.NodeConst,resultConstructionNodeAlias); //создаем узел-посредний
resultConstruction.createEdge(ScType.EdgeDCommonConst,actionNode,resultConstructionNodeAlias,edgePosPermResultAlias);// соединяем с действием дугой для отношений
resultConstruction.createEdge(ScType.EdgeAccessConstPosPerm,keynodes[nrelResult],edgePosPermResultAlias,edgeCommonResultAlias); //соедиянемя nrel_result с предыдущей дугой
resultConstruction.createEdge(ScType.EdgeAccessConstPosPerm,resultConstructionNodeAlias,powerSetRes[powerSetConstruction.getIndex(setPowerLinkAlias)]);// соединяем узел-посредний со всеми элементами powerSetConstruction
resultConstruction.createEdge(ScType.EdgeAccessConstPosPerm,resultConstructionNodeAlias,set);
resultConstruction.createEdge(ScType.EdgeAccessConstPosPerm,resultConstructionNodeAlias,powerSetRes[powerSetConstruction.getIndex(edgeCommonSetPowerAlias)]);
resultConstruction.createEdge(ScType.EdgeAccessConstPosPerm,resultConstructionNodeAlias,powerSetRes[powerSetConstruction.getIndex(edgePosPermSetPowerAlias)]);
resultConstruction.createEdge(ScType.EdgeAccessConstPosPerm,resultConstructionNodeAlias,keynodes[nrelSetPower]);
const resultConstruction = new ScConstruction(); // конструкция,где действие будет соединяться с предыдущей конструкцией отношением nrel_result
resultConstruction.createNode(ScType.NodeConst, resultConstructionNodeAlias); // создаем узел-посредний
resultConstruction.createEdge(ScType.EdgeDCommonConst, actionNode, resultConstructionNodeAlias, edgePosPermResultAlias); // соединяем с действием дугой для отношений
resultConstruction.createEdge(ScType.EdgeAccessConstPosPerm, keynodes[nrelResult], edgePosPermResultAlias, edgeCommonResultAlias); // соедиянемя nrel_result с предыдущей дугой
resultConstruction.createEdge(ScType.EdgeAccessConstPosPerm, resultConstructionNodeAlias, powerSetRes[powerSetConstruction.getIndex(setPowerLinkAlias)]); // соединяем узел-посредний со всеми элементами powerSetConstruction
resultConstruction.createEdge(ScType.EdgeAccessConstPosPerm, resultConstructionNodeAlias, set);
resultConstruction.createEdge(ScType.EdgeAccessConstPosPerm, resultConstructionNodeAlias, powerSetRes[powerSetConstruction.getIndex(edgeCommonSetPowerAlias)]);
resultConstruction.createEdge(ScType.EdgeAccessConstPosPerm, resultConstructionNodeAlias, powerSetRes[powerSetConstruction.getIndex(edgePosPermSetPowerAlias)]);
resultConstruction.createEdge(ScType.EdgeAccessConstPosPerm, resultConstructionNodeAlias, keynodes[nrelSetPower]);

Comment on lines +107 to +126
const resultRes = await client.createElements(resultConstruction);
if (resultRes && resultRes.length > 0) {
const finalConstruction= new ScConstruction();
finalConstruction.createEdge(ScType.EdgeAccessConstPosPerm,keynodes[actionFinished], actionNode);
finalConstruction.createEdge(ScType.EdgeAccessConstPosPerm,keynodes[actionFinishedSuccessfully], actionNode);
await client.createElements(finalConstruction);
return ;
}
const finalConstruction= new ScConstruction();
finalConstruction.createEdge(ScType.EdgeAccessConstPosPerm,keynodes[actionFinished], actionNode);
finalConstruction.createEdge(ScType.EdgeAccessConstPosPerm,keynodes[actionFinishedUnsuccessfully], actionNode);
await client.createElements(finalConstruction);
return ;
}
const finalConstruction= new ScConstruction();
finalConstruction.createEdge(ScType.EdgeAccessConstPosPerm,keynodes[actionFinished], actionNode);
finalConstruction.createEdge(ScType.EdgeAccessConstPosPerm,keynodes[actionFinishedUnsuccessfully], actionNode);
await client.createElements(finalConstruction);
return ;
};
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
const resultRes = await client.createElements(resultConstruction);
if (resultRes && resultRes.length > 0) {
const finalConstruction= new ScConstruction();
finalConstruction.createEdge(ScType.EdgeAccessConstPosPerm,keynodes[actionFinished], actionNode);
finalConstruction.createEdge(ScType.EdgeAccessConstPosPerm,keynodes[actionFinishedSuccessfully], actionNode);
await client.createElements(finalConstruction);
return ;
}
const finalConstruction= new ScConstruction();
finalConstruction.createEdge(ScType.EdgeAccessConstPosPerm,keynodes[actionFinished], actionNode);
finalConstruction.createEdge(ScType.EdgeAccessConstPosPerm,keynodes[actionFinishedUnsuccessfully], actionNode);
await client.createElements(finalConstruction);
return ;
}
const finalConstruction= new ScConstruction();
finalConstruction.createEdge(ScType.EdgeAccessConstPosPerm,keynodes[actionFinished], actionNode);
finalConstruction.createEdge(ScType.EdgeAccessConstPosPerm,keynodes[actionFinishedUnsuccessfully], actionNode);
await client.createElements(finalConstruction);
return ;
};
const resultRes = await client.createElements(resultConstruction);
if (resultRes && resultRes.length > 0) {
const finalConstruction = new ScConstruction();
finalConstruction.createEdge(ScType.EdgeAccessConstPosPerm, keynodes[actionFinished], actionNode);
finalConstruction.createEdge(ScType.EdgeAccessConstPosPerm, keynodes[actionFinishedSuccessfully], actionNode);
await client.createElements(finalConstruction);
return;
}
const finalConstruction = new ScConstruction();
finalConstruction.createEdge(ScType.EdgeAccessConstPosPerm, keynodes[actionFinished], actionNode);
finalConstruction.createEdge(ScType.EdgeAccessConstPosPerm, keynodes[actionFinishedUnsuccessfully], actionNode);
await client.createElements(finalConstruction);
return;
}
const finalConstruction = new ScConstruction();
finalConstruction.createEdge(ScType.EdgeAccessConstPosPerm, keynodes[actionFinished], actionNode);
finalConstruction.createEdge(ScType.EdgeAccessConstPosPerm, keynodes[actionFinishedUnsuccessfully], actionNode);
await client.createElements(finalConstruction);
return;
};

Comment on lines +1 to +23
import { SC_URL } from '@constants';
import { ScClient,ScType,ScEventParams,ScEventType } from 'ts-sc-client';
import { getSetPowerAgent } from "@agents/agent"

async function testAgent() {
const actionInitiated = "action_initiated";
const keynodes = [
{ id: actionInitiated, type: ScType.NodeConstNoRole },
];

const keynodesAddrs = await client.resolveKeynodes(keynodes);

const eventParams = new ScEventParams(keynodesAddrs[actionInitiated], ScEventType.AddOutgoingEdge, getSetPowerAgent);
await client.eventsCreate([eventParams]);
}

export const client = new ScClient(SC_URL);
testAgent();





Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
import { SC_URL } from '@constants';
import { ScClient,ScType,ScEventParams,ScEventType } from 'ts-sc-client';
import { getSetPowerAgent } from "@agents/agent"
async function testAgent() {
const actionInitiated = "action_initiated";
const keynodes = [
{ id: actionInitiated, type: ScType.NodeConstNoRole },
];
const keynodesAddrs = await client.resolveKeynodes(keynodes);
const eventParams = new ScEventParams(keynodesAddrs[actionInitiated], ScEventType.AddOutgoingEdge, getSetPowerAgent);
await client.eventsCreate([eventParams]);
}
export const client = new ScClient(SC_URL);
testAgent();
import { SC_URL } from '@constants';
import { ScClient, ScType, ScEventParams, ScEventType } from 'ts-sc-client';
import { getSetPowerAgent } from "@agents/agent"
async function testAgent() {
const actionInitiated = "action_initiated";
const keynodes = [
{ id: actionInitiated, type: ScType.NodeConstNoRole },
];
const keynodesAddrs = await client.resolveKeynodes(keynodes);
const eventParams = new ScEventParams(keynodesAddrs[actionInitiated], ScEventType.AddOutgoingEdge, getSetPowerAgent);
await client.eventsCreate([eventParams]);
}
export const client = new ScClient(SC_URL);
testAgent();

@NikitaZotov
Copy link
Member

@ellipsis, review this PR, please

@NikitaZotov NikitaZotov added this to the 0.10.2 milestone Jan 31, 2025
Copy link

@ellipsis-dev ellipsis-dev bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

❌ Changes requested. Reviewed everything up to 57bb8fb in 2 minutes and 13 seconds

More details
  • Looked at 697 lines of code in 4 files
  • Skipped 2 files when reviewing.
  • Skipped posting 2 drafted comments based on config settings.
1. docs/examples/TypeScript/agent.ts:43
  • Draft comment:
    Use '===' instead of '==' for strict equality check.
    if(await check(actionNode,keynodes) === false)
  • Reason this comment was not posted:
    Marked as duplicate.
2. docs/examples/TypeScript/client.ts:18
  • Draft comment:
    Consider renaming the function 'testAgent' to something more descriptive like 'registerAgent' to better reflect its purpose.
  • Reason this comment was not posted:
    Confidence changes required: 50%
    The code uses '==' for comparison, which is not a best practice in JavaScript/TypeScript. '===' should be used instead for strict equality checks.

Workflow ID: wflow_dM6wAwde8VeybEiz


Want Ellipsis to fix these issues? Tag @ellipsis-dev in a comment. You can customize Ellipsis with 👍 / 👎 feedback, review rules, user-specific overrides, quiet mode, and more.

action, // действие
);
const checkResult = await client.templateSearch(checkTemplate);
if (checkResult.length==0)
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Use '===' instead of '==' for strict equality check.

Suggested change
if (checkResult.length==0)
if (checkResult.length === 0)

elements.push(result[i].get(elAlias));
}
const set = result[0].get(setAlias); // выбираем узел самого множества из первой найденной конструкции, потому что узел множества он и в Африке узел множества
const power = elements.length.toString();;
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Remove the extra semicolon at the end of the line.

Suggested change
const power = elements.length.toString();;
const power = elements.length.toString();

@NikitaZotov
Copy link
Member

@ellipsis, could you fix my comments?

Copy link

ellipsis-dev bot commented Jan 31, 2025

It seems that there are no specific comments visible in the provided context that need to be addressed. Could you please clarify or point out the specific comments or issues you would like me to address in this pull request?


Responding to this comment by @NikitaZotov. For more information about Ellipsis, check the documentation.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants