@caretakerai/agent 0.0.12 → 0.0.14

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/README.md CHANGED
@@ -8,8 +8,6 @@ The Agent Framework provides a flexible and extensible environment for building
8
8
 
9
9
  - `Activity`: Represents a single unit of work or thought that the agent performs. Activities can be of different kinds, such as `Observation`, `Thought`, or `Action`.
10
10
 
11
- - `Action`: A subclass of `Activity` that represents a concrete action the agent can take.
12
-
13
11
  - `Optimizer`: A component used to improve the agent's performance by optimizing its activities and decisions.
14
12
 
15
13
  ## Initialization Parameters
@@ -17,21 +15,23 @@ The Agent Framework provides a flexible and extensible environment for building
17
15
  When creating an `Agent`, you must provide an `AgentPrams` object with the following properties:
18
16
 
19
17
  - `name`: The name of the agent.
18
+ - `description`: A description of the agent's purpose and capabilities.
20
19
  - `llm`: The language model the agent will use for understanding and generating text.
21
- - `actions`: A list of `Action` objects that the agent can perform.
22
- - `description`: (Optional) A description of the agent's purpose and capabilities.
20
+ - `isChatModel`: (Optional) A flag to indicate if a chat model is used, affecting prompt formatting.
21
+ - `typeDefs`: GraphQL type definitions for the agent's actions.
22
+ - `resolvers`: (Optional) GraphQL resolvers for implementing the actions.
23
+ - `executor`: (Optional) A custom GraphQL executor to handle agent actions.
23
24
  - `history`: (Optional) A list of `Activity` objects representing the agent's past experiences.
24
25
  - `examples`: (Optional) Examples of activities to guide the agent's behavior.
25
- - `constraints`: (Optional) A list of constraints that the agent must adhere to.
26
26
  - `objective`: (Optional) The goal the agent is trying to achieve.
27
- - `thoughtSuffix`: (Optional) A suffix to append to thoughts in the agent's output.
28
- - `actionSuffix`: (Optional) A suffix to append to actions in the agent's output.
29
- - `maxIterations`: (Optional) The maximum number of iterations the agent can perform in a single run.
27
+ - `instruction`: (Optional) Completion instruction for the language model.
28
+ - `maxIterations`: (Optional) The maximum number of iterations the agent can perform.
30
29
  - `maxRetries`: (Optional) The maximum number of retries for actions.
31
30
  - `optimizer`: The optimizer used to improve the agent's performance.
31
+ - `signal`: (Optional) An abort signal to stop the agent's operation.
32
32
  - `template`: (Optional) The template for generating prompts for the agent.
33
+ - `stop`: (Optional) A list of strings that, if generated by the agent, should cause it to stop.
33
34
  - `logger`: (Optional) The logger the agent will use for outputting information.
34
-
35
35
  ## Objective
36
36
  The `objective` parameter defines the goal or purpose that the Agent is trying to achieve. It is a guiding force for the Agent's behavior and decision-making process. When initializing an Agent, you can optionally provide an objective to inform the Agent's actions and ensure they align with the desired outcomes. Here is an example of how an objective might be set:
37
37
 
@@ -45,122 +45,76 @@ const agent = new Agent({
45
45
  The objective will be included in the Agent's prompt template to provide context to the language model, ensuring that the Agent's interactions are focused and relevant to the goal.
46
46
 
47
47
 
48
- ## Action
49
- Actions are the mechanisms through which an AI agent interacts with the application and its environment. They are the operational components that translate the agent's decisions into executable tasks. Each action extends from an abstract `Action` class, which provides a common structure and ensures compatibility with the agent framework.
50
-
51
- Here's an example of an `Action` subclass:
52
-
53
- ```typescript
54
- import { Action, ActionInput } from '@caretaker/agent';
55
-
56
- export class Say extends Action {
57
- async call(input: ActionInput): Promise<void> {
58
- // Logic to perform the action, e.g., output a message
59
- console.log(input.params.message);
60
- }
61
- }
62
- ```
63
-
64
- In this `Say` action example, the `call` method is where the action's specific behavior is implemented. When an agent decides to use the `Say` action, it will call this method, passing in the necessary parameters.
65
-
66
- Actions are defined and added to the agent's configuration, allowing the agent to use them during its processing loop. They serve as the bridge between the AI's decision-making capabilities and the application's functional operations, enabling the agent to perform tasks such as communicating with the user or calculating results.
67
-
68
- The parameters for actions are defined using JSON Schema, which provides a clear and enforceable structure for the data that an action can accept. This ensures that the agent and the actions it performs can interact with consistent and validated data formats.
69
-
70
- For example, in the `Say` action from `@say.ts`, the parameters are defined as follows:
71
-
72
- ```typescript
73
- const SayParamsSchema = z.object({
74
- message: z.string().describe('message to say to the user'),
75
- }).describe('Parameters for Say action');
76
- ```
77
-
78
- This schema is then converted to a JSON Schema, which is used by the `Say` action to validate the parameters before the action is executed:
79
-
80
- ```typescript
81
- const SayParamsJsonSchema = zodToJsonSchema(SayParamsSchema, 'SayParamsSchema')
82
- .definitions!.SayParamsSchema as JSONSchema;
83
- ```
84
-
85
- The use of JSON Schema in action parameters allows for the automatic validation of inputs, ensuring that only the correct data types and structures are passed to the action's `call` method. This is crucial for maintaining the integrity of the agent's operations and preventing runtime errors due to invalid data.
86
-
87
-
88
- The `Multiply` action example above demonstrates how to define an action with input parameters and a return type using Zod schemas and TypeScript. The `params` property is assigned a JSON Schema that is generated from the Zod schema, which is used for runtime validation of the action's input parameters. The `call` method implements the logic to multiply an array of numbers, which are provided as input parameters, and returns the multiplication result. This action can be used by the agent to perform multiplication operations as part of its task execution.
89
-
48
+ ## GraphQL Actions
49
+ In the Agent Framework, actions are defined within a GraphQL schema, which provides a structured and enforceable method for specifying the data the agent can act upon. This schema-driven approach facilitates the declaration of queries and mutations that correspond to the actions available to the agent.
90
50
 
91
- ```typescript
92
- import { z } from 'zod';
93
- import { zodToJsonSchema } from 'zod-to-json-schema';
94
- import { Action, ActionInput } from '@caretaker/agent';
95
- import { JSONSchema } from 'json-schema-to-typescript';
96
-
97
- // Define the parameters schema using Zod for the Multiply action
98
- const MultiplyParamsSchema = z.array(z.number()).describe('Array of numbers to multiply');
99
- // Infer the TypeScript type from the Zod schema
100
- type MultiplyParams = z.infer<typeof MultiplyParamsSchema>;
101
- // Convert the Zod schema to a JSON Schema for runtime validation
102
- const MultiplyParamsJsonSchema = zodToJsonSchema(MultiplyParamsSchema, 'MultiplyParamsSchema')
103
- .definitions!.MultiplyParamsSchema as JSONSchema;
104
-
105
- // Define the result schema using Zod for the Multiply action
106
- const MultiplyResultSchema = z.number().describe('The result of the multiplication');
107
- // Infer the TypeScript type from the Zod schema
108
- type MultiplyResult = z.infer<typeof MultiplyResultSchema>;
109
- // Convert the Zod schema to a JSON Schema for runtime validation
110
- const MultiplyResultJsonSchema = zodToJsonSchema(MultiplyResultSchema, 'MultiplyResultSchema')
111
- .definitions!.MultiplyResultSchema as JSONSchema;
112
-
113
- // Multiply action class definition
114
- export class Multiply extends Action<MultiplyParams, MultiplyResult> {
115
- // Assign the JSON Schema to the params and result properties
116
- readonly params = MultiplyParamsJsonSchema;
117
- readonly result = MultiplyResultJsonSchema;
118
- // Define whether this action should signal the agent to exit
119
- readonly exit = false;
120
- // Define the kind of action, which is the class name
121
- readonly kind = Multiply.name;
122
- // Provide a description for the action
123
- readonly description = 'Multiply the numbers and provide you with the result.';
124
- // Provide examples of usage (optional)
125
- readonly examples = [];
126
-
127
- // The call method is invoked by the agent when this action is performed
128
- async call({ params }: ActionInput<MultiplyParams>): Promise<MultiplyResult> {
129
- // Implement the action logic: multiply the numbers provided in params
130
- return params.reduce((acc, n) => acc * n, 1);
131
- }
132
- }
133
- ```
51
+ Actions are expressed as mutations within the GraphQL schema, and their execution is handled through resolvers. These resolvers implement the logic that the agent performs when an action is invoked. The parameters for these actions are defined using GraphQL's strong typing system, ensuring that the agent receives and acts upon well-structured and validated data.
134
52
 
135
53
  ## Usage
136
54
 
137
- To use the Agent Framework, create an instance of the `Agent` class with the necessary parameters, including the language model, actions, and any optional configurations such as history, objectives, and optimizers. Then, invoke the `agent.invoke()` method to start the agent's processing loop. The agent will utilize the provided actions, such as `Say` to communicate with the user or `Multiply` to perform multiplication tasks, to fulfill its objectives within the given constraints.
55
+ To use the Agent Framework, instantiate the `Agent` class with the necessary initialization parameters, including the language model, GraphQL type definitions, and resolvers. You can also include optional configurations such as history, objectives, and optimizers. Once the agent is configured, call the `agent.invoke()` method to begin the agent's processing loop. The agent will execute actions defined in the GraphQL schema to interact with the user and perform tasks in line with its objectives.
138
56
 
139
- ```typescript
140
- import { Agent, Activity, ActivityKind } from '@caretaker/agent';
141
- import { OpenAI } from 'langchain/llms/openai';
142
- import { Say } from './actions/say';
143
-
144
- const llm = new OpenAI({
145
- modelName: 'gpt-3.5-turbo',
146
- temperature: 0.7,
147
- maxTokens: 256,
148
- });
57
+ Here is an example of how to set up and use the Agent Framework:
58
+ ```ts
149
59
 
150
60
  const agent = new Agent({
151
61
  name: 'CalculatorAI',
152
- description: 'An agent that performs arithmetic operations',
153
- llm,
154
- actions: [
155
- new Say(),
156
- // ... other actions
157
- ],
62
+ llm: new OpenAI(), // Define LLM
63
+ objective: 'Help the user with math.', // Describe the objective for the agent.
64
+ typeDefs: dedent`
65
+ schema {
66
+ query: Query
67
+ mutation: Mutation
68
+ }
69
+
70
+ type Query {
71
+ # No queries for this case
72
+ }
73
+
74
+ type Mutation {
75
+ """
76
+ Relay information to the user and wait for the reply. Note that this is only way of communicating information to the user.
77
+ """
78
+ say(input: SayInput!): SayResult
79
+ add(input: MathInput!): MathResult
80
+ # ... Rest of mutations
81
+ }
82
+
83
+ # ... Rest of schema
84
+ `.trim(),
85
+ resolvers: {
86
+ Mutation: {
87
+ say: async (_, { input: { message } }) => {
88
+ console.log(`${chalk.bold(`${agent.name}:`)} ${message}`);
89
+
90
+ const reply = await inputPrompt({
91
+ message: 'Human:'
92
+ });
93
+
94
+ return { reply };
95
+ },
96
+ add: (_, { input: { left, right } }) => {
97
+ try {
98
+ return { result: left + right };
99
+ } catch (error) {
100
+ return { error };
101
+ }
102
+ },
103
+ // ... rest of resolvers
104
+ }
105
+ },
158
106
  history: [
159
- new Activity({ kind: ActivityKind.Observation, input: 'The user says: How can you help me?' })
107
+ // Add some agent primer
108
+ new Activity({
109
+ kind: ActivityKind.Observation, input: JSON.stringify({
110
+ data: { say: { reply: 'Hi!, how can you help me?' } }
111
+ }, null, 2)
112
+ })
160
113
  ],
161
- // ... other parameters
114
+ optimizer: // Add history optimizer
162
115
  });
163
116
 
117
+ // Invoke the agent
164
118
  await agent.invoke();
165
- ```
166
119
 
120
+ ```
@@ -6,7 +6,6 @@ export declare enum ActivityKind {
6
6
  export type ActivityParams = {
7
7
  kind: ActivityKind;
8
8
  input: string;
9
- attributes?: Record<string, string>;
10
9
  };
11
10
  export declare class Activity implements ActivityParams {
12
11
  kind: ActivityKind;
@@ -15,6 +14,6 @@ export declare class Activity implements ActivityParams {
15
14
  constructor(params: ActivityParams);
16
15
  prompt(): string;
17
16
  toObject(): this;
18
- static fromObject({ kind, attributes, input }: Record<string, any>): Activity;
17
+ static fromObject({ kind, input }: Record<string, any>): Activity;
19
18
  static parse(text: string): Activity[];
20
19
  }
package/dist/activity.js CHANGED
@@ -23,8 +23,8 @@ class Activity {
23
23
  toObject() {
24
24
  return { ...this };
25
25
  }
26
- static fromObject({ kind, attributes, input }) {
27
- return new Activity({ kind, attributes, input });
26
+ static fromObject({ kind, input }) {
27
+ return new Activity({ kind, input });
28
28
  }
29
29
  static parse(text) {
30
30
  const { elements: [root] } = (0, xml_js_1.xml2js)(`<root>${text}</root>`, { trim: true });
@@ -1 +1 @@
1
- {"version":3,"file":"activity.js","sourceRoot":"","sources":["../src/activity.ts"],"names":[],"mappings":";;;AAAA,mCAAiD;AAKjD,IAAY,YAOX;AAPD,WAAY,YAAY;IAEtB,2CAA2B,CAAA;IAE3B,mCAAmB,CAAA;IAEnB,iCAAiB,CAAA;AACnB,CAAC,EAPW,YAAY,4BAAZ,YAAY,QAOvB;AAcD,MAAa,QAAQ;IACnB,IAAI,CAAgB;IACpB,UAAU,CAA0B;IACpC,KAAK,CAAU;IAEf,YAAY,MAAsB;QAChC,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IAC9B,CAAC;IAED,MAAM;QACJ,OAAO,IAAA,eAAM,EACX,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,WAAW,EAAE,IAAI,CAAC,UAAU,IAAI,EAAE,EAAE,KAAK,EAAE,KAAK,IAAI,CAAC,KAAK,IAAI,GAAG,EAAE,EACpF,EAAE,OAAO,EAAE,IAAI,EAAE,CAClB;aACE,UAAU,CAAC,MAAM,EAAE,GAAG,CAAC;aACvB,UAAU,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC7B,CAAC;IAED,QAAQ;QACN,OAAO,EAAE,GAAG,IAAI,EAAE,CAAC;IACrB,CAAC;IAED,MAAM,CAAC,UAAU,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAuB;QAChE,OAAO,IAAI,QAAQ,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC,CAAC;IACnD,CAAC;IAED,MAAM,CAAC,KAAK,CAAC,IAAY;QACvB,MAAM,EAAE,QAAQ,EAAE,CAAC,IAAI,CAAC,EAAE,GAAG,IAAA,eAAM,EAAC,SAAS,IAAI,SAAS,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;QAE5E,OAAQ,IAAI,CAAC,QAAsB;aAChC,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAW,EAAE,EAAE;YAC/C,MAAM,KAAK,GAAG,IAAA,eAAM,EAAC,EAAE,QAAQ,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,IAAI,KAAK,MAAM,CAAE,EAAE,CAAC;iBAChF,UAAU,CAAC,MAAM,EAAE,GAAG,CAAC;iBACvB,UAAU,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;YAE3B,OAAO,QAAQ,CAAC,UAAU,CAAC;gBACzB,IAAI,EAAE,IAAI;gBACV,KAAK,EAAE,KAAK;gBACZ,UAAU,EAAE,UAAU;aACvB,CAAC,CAAC;QACL,CAAC,CAAC;aACD,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,YAAY,CAAC,MAAM,EAAE,YAAY,CAAC,WAAW,EAAE,YAAY,CAAC,OAAO,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;IAC1G,CAAC;CACF;AA3CD,4BA2CC"}
1
+ {"version":3,"file":"activity.js","sourceRoot":"","sources":["../src/activity.ts"],"names":[],"mappings":";;;AAAA,mCAAiD;AAKjD,IAAY,YAOX;AAPD,WAAY,YAAY;IAEtB,2CAA2B,CAAA;IAE3B,mCAAmB,CAAA;IAEnB,iCAAiB,CAAA;AACnB,CAAC,EAPW,YAAY,4BAAZ,YAAY,QAOvB;AAYD,MAAa,QAAQ;IACnB,IAAI,CAAgB;IACpB,UAAU,CAA0B;IACpC,KAAK,CAAU;IAEf,YAAY,MAAsB;QAChC,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IAC9B,CAAC;IAED,MAAM;QACJ,OAAO,IAAA,eAAM,EACX,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,WAAW,EAAE,IAAI,CAAC,UAAU,IAAI,EAAE,EAAE,KAAK,EAAE,KAAK,IAAI,CAAC,KAAK,IAAI,GAAG,EAAE,EACpF,EAAE,OAAO,EAAE,IAAI,EAAE,CAClB;aACE,UAAU,CAAC,MAAM,EAAE,GAAG,CAAC;aACvB,UAAU,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC7B,CAAC;IAED,QAAQ;QACN,OAAO,EAAE,GAAG,IAAI,EAAE,CAAC;IACrB,CAAC;IAED,MAAM,CAAC,UAAU,CAAC,EAAE,IAAI,EAAE,KAAK,EAAuB;QACpD,OAAO,IAAI,QAAQ,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IACvC,CAAC;IAED,MAAM,CAAC,KAAK,CAAC,IAAY;QACvB,MAAM,EAAE,QAAQ,EAAE,CAAC,IAAI,CAAC,EAAE,GAAG,IAAA,eAAM,EAAC,SAAS,IAAI,SAAS,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;QAE5E,OAAQ,IAAI,CAAC,QAAsB;aAChC,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAW,EAAE,EAAE;YAC/C,MAAM,KAAK,GAAG,IAAA,eAAM,EAAC,EAAE,QAAQ,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,IAAI,KAAK,MAAM,CAAE,EAAE,CAAC;iBAChF,UAAU,CAAC,MAAM,EAAE,GAAG,CAAC;iBACvB,UAAU,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;YAE3B,OAAO,QAAQ,CAAC,UAAU,CAAC;gBACzB,IAAI,EAAE,IAAI;gBACV,KAAK,EAAE,KAAK;gBACZ,UAAU,EAAE,UAAU;aACvB,CAAC,CAAC;QACL,CAAC,CAAC;aACD,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,YAAY,CAAC,MAAM,EAAE,YAAY,CAAC,WAAW,EAAE,YAAY,CAAC,OAAO,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;IAC1G,CAAC;CACF;AA3CD,4BA2CC"}
package/dist/agent.d.ts CHANGED
@@ -1,15 +1,19 @@
1
1
  import { Logger } from 'winston';
2
2
  import { BasePromptTemplate } from '@langchain/core/prompts';
3
3
  import { BaseLanguageModel } from '@langchain/core/language_models/base';
4
- import { Action } from './action';
4
+ import type { TypeSource, IResolvers } from '@graphql-tools/utils';
5
+ import { GraphQLSchema } from 'graphql';
5
6
  import { Activity } from './activity';
6
7
  import { Optimizer } from './types';
8
+ type GraphQLExecutor = (query: string) => Promise<Record<string, unknown>>;
7
9
  interface AgentPrams {
8
10
  name: string;
9
11
  description: string;
10
12
  llm: BaseLanguageModel;
11
13
  isChatModel?: boolean;
12
- actions: Action[];
14
+ typeDefs: TypeSource;
15
+ resolvers?: IResolvers;
16
+ executor?: GraphQLExecutor;
13
17
  history?: Activity[];
14
18
  examples?: Activity[];
15
19
  objective?: string;
@@ -17,6 +21,7 @@ interface AgentPrams {
17
21
  maxIterations?: number;
18
22
  maxRetries?: number;
19
23
  optimizer: Optimizer;
24
+ signal?: AbortSignal;
20
25
  template?: BasePromptTemplate;
21
26
  stop?: string[];
22
27
  logger?: Logger;
@@ -25,23 +30,25 @@ export declare class Agent implements AgentPrams {
25
30
  name: string;
26
31
  description: string;
27
32
  llm: BaseLanguageModel;
28
- actions: Action[];
33
+ typeDefs: TypeSource;
34
+ resolvers: IResolvers;
29
35
  history: Activity[];
30
36
  examples: Activity[];
31
37
  objective: string;
32
38
  instruction: string;
33
- actionSuffix: string;
34
39
  maxIterations: number;
35
40
  maxRetries: number;
36
41
  isChatModel: boolean;
42
+ signal: AbortSignal;
37
43
  optimizer: Optimizer;
38
44
  logger: Logger;
39
45
  template?: BasePromptTemplate;
46
+ executor?: GraphQLExecutor;
47
+ readonly schema: GraphQLSchema;
40
48
  static defaults: Partial<AgentPrams>;
41
49
  constructor(params: AgentPrams);
42
50
  addActivities(...activities: Activity[]): void;
43
51
  prompt(params?: Record<string, string>): Promise<void>;
44
- execute({ attributes, input }: Activity): Promise<string>;
45
- invoke(params?: Record<string, any>): Promise<string>;
52
+ invoke(params?: Record<string, any>): Promise<void>;
46
53
  }
47
54
  export {};
package/dist/agent.js CHANGED
@@ -5,37 +5,45 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.Agent = void 0;
7
7
  const dedent_1 = __importDefault(require("dedent"));
8
+ const yaml_1 = require("yaml");
8
9
  const winston_1 = require("winston");
9
10
  const prompts_1 = require("@langchain/core/prompts");
10
11
  const output_parsers_1 = require("@langchain/core/output_parsers");
12
+ const schema_1 = require("@graphql-tools/schema");
13
+ const graphql_1 = require("graphql");
11
14
  const constants_1 = require("./constants");
12
15
  const activity_1 = require("./activity");
13
16
  class Agent {
14
17
  name;
15
18
  description;
16
19
  llm;
17
- actions;
20
+ typeDefs;
21
+ resolvers;
18
22
  history;
19
23
  examples;
20
24
  objective;
21
25
  instruction;
22
- actionSuffix;
23
26
  maxIterations;
24
27
  maxRetries;
25
28
  isChatModel;
29
+ signal;
26
30
  optimizer;
27
31
  logger;
28
32
  template;
33
+ executor;
34
+ schema;
29
35
  static defaults = {
30
36
  template: prompts_1.PromptTemplate.fromTemplate((0, dedent_1.default) `
31
37
  # Objective
32
38
  {objective}
33
39
 
34
- # Actions
40
+ # GraphQL Schema
35
41
  The only permissible actions you may take are listed below:
36
- {actions}
42
+ \`\`\`graphql
43
+ {schema}
44
+ \`\`\`
37
45
 
38
- **Continue the History with the following format in your response:**
46
+ **Continue the History with your thoughts and actions following format in your response:**
39
47
  {examples}
40
48
 
41
49
  # History:
@@ -45,11 +53,12 @@ class Agent {
45
53
  `),
46
54
  objective: 'You are helpful assistant.',
47
55
  instruction: (0, dedent_1.default) `
48
- Think your further actions step by step before taking any.
49
- Your must always explain your choice in your thoughts.
50
- Use only actions listed in Actions section.
51
- Reject any request that are not related to your objective and cannot be fulfilled within the given list of actions.
52
- Provide your Thought and Action here.
56
+ Plan your further actions step by step before taking any.
57
+ Always explain your choice in your thoughts.
58
+ Use only actions listed in the Actions section.
59
+ Do multiple queries or mutations in a single request if possible.
60
+ Reject any requests that are not related to your objective and cannot be fulfilled within the given list of actions.
61
+ Thought and Action goes here.
53
62
  `,
54
63
  maxRetries: 7,
55
64
  isChatModel: false,
@@ -58,30 +67,38 @@ class Agent {
58
67
  examples: [
59
68
  new activity_1.Activity({
60
69
  kind: activity_1.ActivityKind.Observation,
61
- input: 'The result of previously taken action',
70
+ input: (0, dedent_1.default) `
71
+ <!-- The result of the previous action e.g. -->
72
+ data
73
+ theBestNumber:
74
+ result: 73
75
+ `.trim(),
62
76
  }),
63
77
  new activity_1.Activity({
64
78
  kind: activity_1.ActivityKind.Thought,
65
- input: 'You must always think before taking the action',
79
+ input: 'Now I know that the best number is 73. I should share this information with the user immediately.',
66
80
  }),
67
81
  new activity_1.Activity({
68
82
  kind: activity_1.ActivityKind.Action,
69
- attributes: { kind: 'the action kind to take, should be one of listed in Actions section' },
70
83
  input: (0, dedent_1.default) `
71
- <!-- The action input as valid JSON e.g. -->
72
- {
73
- "message": "hello!!"
84
+ <!-- The action must be a single executable GraphQL request e.g. -->
85
+ \`\`\`graphql
86
+ mutation {
87
+ say(input: { message: "The best number is 73!" }) {
88
+ reply
89
+ }
74
90
  }
91
+ \`\`\`
75
92
  `.trim(),
76
93
  }),
77
94
  ],
78
95
  };
79
96
  constructor(params) {
80
- const { actions } = params;
81
- if (!actions.length) {
82
- throw new Error('Actions list must be non empty');
83
- }
84
97
  Object.assign(this, Agent.defaults, params);
98
+ const { typeDefs, resolvers, executor } = params;
99
+ if (!executor) {
100
+ this.schema = (0, schema_1.makeExecutableSchema)({ typeDefs, resolvers });
101
+ }
85
102
  }
86
103
  addActivities(...activities) {
87
104
  activities.forEach(a => this.logger.debug(a));
@@ -101,10 +118,6 @@ class Agent {
101
118
  const activitiesStrings = activities.map(a => a.prompt()).join(constants_1.ACTIVITY_SEP);
102
119
  return activitiesStrings;
103
120
  };
104
- const actions = async () => {
105
- const actionsStrings = await Promise.all(this.actions.map(a => a._prompt()));
106
- return actionsStrings.join(constants_1.ACTION_SEP);
107
- };
108
121
  const instruction = () => this.instruction
109
122
  .split('\n')
110
123
  .filter(i => i)
@@ -116,15 +129,15 @@ class Agent {
116
129
  };
117
130
  const template = await this.template.partial({
118
131
  objective: this.objective,
132
+ schema: this.typeDefs.toString(),
119
133
  history,
120
- actions,
121
134
  examples,
122
135
  instruction,
123
136
  completions,
124
137
  });
125
138
  const chain = template
126
139
  .pipe((prompt) => prompt.toString().trim())
127
- .pipe(this.llm.bind({ stop: [`<${activity_1.ActivityKind.Observation}`] }))
140
+ .pipe(this.llm.bind({ stop: [`<${activity_1.ActivityKind.Observation}>`] }))
128
141
  .pipe(new output_parsers_1.StringOutputParser());
129
142
  for (let i = 0; i < this.maxRetries; ++i) {
130
143
  let completion = await chain.invoke(params ?? {});
@@ -132,7 +145,6 @@ class Agent {
132
145
  completion = `<${activity_1.ActivityKind.Thought}>\n${completion}`;
133
146
  }
134
147
  try {
135
- debugger;
136
148
  let newActivities = activity_1.Activity.parse(completion).slice(0, 2);
137
149
  if (!newActivities.length) {
138
150
  throw new Error('No activities generated!');
@@ -156,11 +168,17 @@ class Agent {
156
168
  continue;
157
169
  }
158
170
  try {
159
- const observation = await this.execute(activity);
171
+ const source = activity.input
172
+ .trim()
173
+ .replace(/^```\w*/, '')
174
+ .replace(/```$/, '')
175
+ .trim();
176
+ const result = this.executor
177
+ ? await this.executor(source)
178
+ : await (0, graphql_1.graphql)({ schema: this.schema, source });
160
179
  this.addActivities(...activities, new activity_1.Activity({
161
180
  kind: activity_1.ActivityKind.Observation,
162
- input: observation,
163
- attributes: { of: activity.attributes.kind }
181
+ input: (0, yaml_1.stringify)(result),
164
182
  }));
165
183
  return;
166
184
  }
@@ -169,7 +187,6 @@ class Agent {
169
187
  activities.push(new activity_1.Activity({
170
188
  kind: activity_1.ActivityKind.Observation,
171
189
  input: err.toString(),
172
- attributes: { of: activity.attributes.kind }
173
190
  }));
174
191
  this.addActivities(...activities);
175
192
  activities = [];
@@ -179,29 +196,16 @@ class Agent {
179
196
  }
180
197
  throw new Error('Max number of retries reached.');
181
198
  }
182
- async execute({ attributes, input }) {
183
- const { kind } = attributes;
184
- const action = this.actions.find(a => a.kind === kind);
185
- if (!action) {
186
- throw new Error(`Action "${kind}" is not allowed. Correct your spelling.`);
187
- }
188
- const observation = await action._call(input, this);
189
- return observation;
190
- }
191
199
  async invoke(params) {
192
200
  if (!this.history.length) {
193
- throw new Error('Activity list must not be empty.');
201
+ throw new Error('History must not be empty.');
194
202
  }
195
203
  if (this.history.at(-1)?.kind !== activity_1.ActivityKind.Observation) {
196
204
  throw new Error('Latest experience must be of Observation kind');
197
205
  }
198
206
  for (let i = 0; i < this.maxIterations; ++i) {
199
207
  await this.prompt(params);
200
- const activity = this.history.at(-2);
201
- const action = this.actions.find(a => a.kind === activity.attributes.kind);
202
- if (action.exit) {
203
- return this.history.at(-1).input;
204
- }
208
+ this.signal?.throwIfAborted();
205
209
  }
206
210
  throw new Error('Max number of iterations reached.');
207
211
  }
package/dist/agent.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"agent.js","sourceRoot":"","sources":["../src/agent.ts"],"names":[],"mappings":";;;;;;AAAA,oDAA4B;AAC5B,qCAA2D;AAC3D,qDAA6E;AAC7E,mEAAoE;AAGpE,2CAAuD;AACvD,yCAAoD;AAuCpD,MAAa,KAAK;IAChB,IAAI,CAAU;IACd,WAAW,CAAU;IACrB,GAAG,CAAqB;IACxB,OAAO,CAAY;IACnB,OAAO,CAAc;IACrB,QAAQ,CAAc;IACtB,SAAS,CAAU;IACnB,WAAW,CAAU;IACrB,YAAY,CAAU;IACtB,aAAa,CAAU;IACvB,UAAU,CAAU;IACpB,WAAW,CAAW;IACtB,SAAS,CAAa;IACtB,MAAM,CAAU;IAChB,QAAQ,CAAsB;IAE9B,MAAM,CAAC,QAAQ,GAAwB;QACrC,QAAQ,EAAE,wBAAc,CAAC,YAAY,CAAC,IAAA,gBAAM,EAAA;;;;;;;;;;;;;;;KAe3C,CAAC;QACF,SAAS,EAAE,4BAA4B;QACvC,WAAW,EAAE,IAAA,gBAAM,EAAA;;;;;;KAMlB;QACD,UAAU,EAAE,CAAC;QACb,WAAW,EAAE,KAAK;QAClB,aAAa,EAAE,MAAM,CAAC,gBAAgB;QACtC,MAAM,EAAE,IAAA,sBAAY,EAAC,EAAE,UAAU,EAAE,CAAC,IAAI,oBAAU,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC;QAChE,QAAQ,EAAE;YACR,IAAI,mBAAQ,CAAC;gBACX,IAAI,EAAE,uBAAY,CAAC,WAAW;gBAC9B,KAAK,EAAE,uCAAuC;aAC/C,CAAC;YACF,IAAI,mBAAQ,CAAC;gBACX,IAAI,EAAE,uBAAY,CAAC,OAAO;gBAC1B,KAAK,EAAE,gDAAgD;aACxD,CAAC;YACF,IAAI,mBAAQ,CAAC;gBACX,IAAI,EAAE,uBAAY,CAAC,MAAM;gBACzB,UAAU,EAAE,EAAE,IAAI,EAAE,qEAAqE,EAAE;gBAC3F,KAAK,EAAE,IAAA,gBAAM,EAAA;;;;;SAKZ,CAAC,IAAI,EAAE;aACT,CAAC;SACH;KACF,CAAA;IAED,YAAY,MAAkB;QAC5B,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,CAAC;QAE3B,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE;YACnB,MAAM,IAAI,KAAK,CAAC,gCAAgC,CAAC,CAAC;SACnD;QAED,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IAC9C,CAAC;IAED,aAAa,CAAC,GAAG,UAAsB;QACrC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QAC9C,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,UAAU,CAAC,CAAA;IAClC,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,MAA+B;QAC1C,IAAI,UAAU,GAAe,EAAE,CAAC;QAEhC,MAAM,OAAO,GAAG,KAAK,IAAI,EAAE;YACzB,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAC5D,MAAM,cAAc,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,wBAAY,CAAC,CAAC;YACvE,OAAO,cAAc,CAAC;QACxB,CAAC,CAAC;QACF,MAAM,WAAW,GAAG,KAAK,IAAI,EAAE;YAE7B,IAAI,CAAC,UAAU,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE;gBAC3C,OAAO,IAAI,uBAAY,CAAC,OAAO,GAAG,CAAC;aACpC;YAED,MAAM,iBAAiB,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,wBAAY,CAAC,CAAC;YAC7E,OAAO,iBAAiB,CAAC;QAC3B,CAAC,CAAC;QAEF,MAAM,OAAO,GAAG,KAAK,IAAI,EAAE;YACzB,MAAM,cAAc,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;YAC7E,OAAO,cAAc,CAAC,IAAI,CAAC,sBAAU,CAAC,CAAC;QACzC,CAAC,CAAC;QAEF,MAAM,WAAW,GAAG,GAAG,EAAE,CAAC,IAAI,CAAC,WAAW;aACvC,KAAK,CAAC,IAAI,CAAC;aACX,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;aACd,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC;aACzB,IAAI,CAAC,IAAI,CAAC,CAAC;QAEd,MAAM,QAAQ,GAAG,KAAK,IAAI,EAAE;YAC1B,MAAM,eAAe,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,wBAAY,CAAC,CAAC;YAC9E,OAAO,eAAe,CAAC;QACzB,CAAC,CAAC;QAEF,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC;YAC3C,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,OAAO;YACP,OAAO;YACP,QAAQ;YACR,WAAW;YACX,WAAW;SACZ,CAAC,CAAC;QAEH,MAAM,KAAK,GAAG,QAAQ;aACnB,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE,CAAC;aAC1C,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,CAAC,IAAI,uBAAY,CAAC,WAAW,EAAE,CAAC,EAAE,CAAC,CAAC;aAC/D,IAAI,CAAC,IAAI,mCAAkB,EAAE,CAAC,CAAC;QAElC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,UAAU,EAAE,EAAE,CAAC,EAAE;YACxC,IAAI,UAAU,GAAG,MAAM,KAAK,CAAC,MAAM,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC;YAGlD,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,GAAG,uBAAY,CAAC,OAAO,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE;gBAC1E,UAAU,GAAG,IAAI,uBAAY,CAAC,OAAO,MAAM,UAAU,EAAE,CAAC;aACzD;YAED,IAAI;gBACF,QAAQ,CAAA;gBACR,IAAI,aAAa,GAAG,mBAAQ,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;gBAE3D,IAAI,CAAC,aAAa,CAAC,MAAM,EAAE;oBACzB,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAC;iBAC7C;gBAGD,IAAI,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,uBAAY,CAAC,OAAO,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE;oBACzE,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAC;iBACjD;gBAGD,MAAM,aAAa,GAAG,aAAa,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,uBAAY,CAAC,MAAM,CAAC,CAAC;gBACnF,aAAa,GAAG,aAAa,CAAC,KAAK,CAAC,CAAC,EAAE,aAAa,GAAG,CAAC,CAAC,CAAA;gBAEzD,UAAU,CAAC,IAAI,CAAC,GAAG,aAAa,CAAC,CAAC;aACnC;YAAC,OAAO,CAAC,EAAE;gBACV,MAAM,GAAG,GAAG,CAAU,CAAC;gBACvB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;gBAC9B,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC,6BAA6B,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;gBAC5E,SAAS;aACV;YAED,MAAM,QAAQ,GAAG,UAAU,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;YAGnC,IAAI,QAAQ,CAAC,IAAI,KAAK,uBAAY,CAAC,OAAO,EAAE;gBAC1C,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC,wBAAwB,CAAC,CAAC;gBAC1D,SAAS;aACV;YAED,IAAI;gBACF,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;gBACjD,IAAI,CAAC,aAAa,CAChB,GAAG,UAAU,EACb,IAAI,mBAAQ,CAAC;oBACX,IAAI,EAAE,uBAAY,CAAC,WAAW;oBAC9B,KAAK,EAAE,WAAW;oBAClB,UAAU,EAAE,EAAE,EAAE,EAAE,QAAQ,CAAC,UAAU,CAAC,IAAI,EAAE;iBAC7C,CAAC,CACH,CAAC;gBACF,OAAO;aACR;YAAC,OAAM,CAAC,EAAE;gBACT,MAAM,GAAG,GAAG,CAAU,CAAC;gBACvB,UAAU,CAAC,IAAI,CAAC,IAAI,mBAAQ,CAAC;oBAC3B,IAAI,EAAE,uBAAY,CAAC,WAAW;oBAC9B,KAAK,EAAE,GAAG,CAAC,QAAQ,EAAE;oBACrB,UAAU,EAAE,EAAE,EAAE,EAAE,QAAQ,CAAC,UAAU,CAAC,IAAI,EAAE;iBAC7C,CAAC,CAAC,CAAA;gBACH,IAAI,CAAC,aAAa,CAAC,GAAG,UAAU,CAAC,CAAC;gBAClC,UAAU,GAAG,EAAE,CAAC;gBAChB,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC,yBAAyB,GAAG,EAAE,CAAC,CAAC;gBAChE,SAAS;aACV;SACF;QAED,MAAM,IAAI,KAAK,CAAC,gCAAgC,CAAC,CAAC;IACpD,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,EAAE,UAAU,EAAE,KAAK,EAAY;QAC3C,MAAM,EAAE,IAAI,EAAE,GAAG,UAAU,CAAC;QAC5B,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;QAEvD,IAAI,CAAC,MAAM,EAAE;YACX,MAAM,IAAI,KAAK,CAAC,WAAW,IAAI,0CAA0C,CAAC,CAAC;SAC5E;QAED,MAAM,WAAW,GAAG,MAAM,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;QACpD,OAAO,WAAW,CAAC;IACrB,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,MAA4B;QACvC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE;YACxB,MAAM,IAAI,KAAK,CAAC,kCAAkC,CAAC,CAAC;SACrD;QAED,IAAI,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,KAAK,uBAAY,CAAC,WAAW,EAAE;YAC1D,MAAM,IAAI,KAAK,CAAC,+CAA+C,CAAC,CAAC;SAClE;QAED,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,aAAa,EAAE,EAAE,CAAC,EAAE;YAC3C,MAAM,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;YAC1B,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,CAAE,CAAC;YACtC,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;YAE3E,IAAI,MAAM,CAAC,IAAI,EAAE;gBACf,OAAO,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;aAClC;SACF;QAED,MAAM,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAC;IACvD,CAAC;;AAxOH,sBAyOC"}
1
+ {"version":3,"file":"agent.js","sourceRoot":"","sources":["../src/agent.ts"],"names":[],"mappings":"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"}
@@ -1,2 +1 @@
1
- export declare const ACTION_SEP = "\n\n";
2
1
  export declare const ACTIVITY_SEP = "\n";
package/dist/constants.js CHANGED
@@ -1,6 +1,5 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.ACTIVITY_SEP = exports.ACTION_SEP = void 0;
4
- exports.ACTION_SEP = '\n\n';
3
+ exports.ACTIVITY_SEP = void 0;
5
4
  exports.ACTIVITY_SEP = '\n';
6
5
  //# sourceMappingURL=constants.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"constants.js","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":";;;AAAa,QAAA,UAAU,GAAG,MAAM,CAAA;AACnB,QAAA,YAAY,GAAG,IAAI,CAAC"}
1
+ {"version":3,"file":"constants.js","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":";;;AAAa,QAAA,YAAY,GAAG,IAAI,CAAC"}
package/dist/index.d.ts CHANGED
@@ -1,4 +1,3 @@
1
- export * from './action';
2
1
  export * from './agent';
3
2
  export * from './constants';
4
3
  export * from './activity';
package/dist/index.js CHANGED
@@ -14,7 +14,6 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
14
  for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
15
  };
16
16
  Object.defineProperty(exports, "__esModule", { value: true });
17
- __exportStar(require("./action"), exports);
18
17
  __exportStar(require("./agent"), exports);
19
18
  __exportStar(require("./constants"), exports);
20
19
  __exportStar(require("./activity"), exports);
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,2CAAyB;AACzB,0CAAwB;AACxB,8CAA4B;AAC5B,6CAA2B;AAC3B,0CAAwB"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,0CAAwB;AACxB,8CAA4B;AAC5B,6CAA2B;AAC3B,0CAAwB"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@caretakerai/agent",
3
- "version": "0.0.12",
3
+ "version": "0.0.14",
4
4
  "description": "Single framework for building text-agents",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -22,10 +22,13 @@
22
22
  "debug": "^4.3.4",
23
23
  "json-schema-to-typescript": "^13.1.1",
24
24
  "winston": "^3.11.0",
25
- "xml-js": "^1.6.11"
25
+ "xml-js": "^1.6.11",
26
+ "yaml": "^2.4.0"
26
27
  },
27
28
  "devDependencies": {
29
+ "@graphql-tools/schema": "^10.0.2",
28
30
  "@types/node": "^20.4.1",
31
+ "graphql": "^16.8.1",
29
32
  "rimraf": "^5.0.5",
30
33
  "tsx": "^3.12.7",
31
34
  "typescript": "^5.2.2"
package/dist/action.d.ts DELETED
@@ -1,23 +0,0 @@
1
- import type { Agent } from './agent';
2
- import { type JSONSchema } from 'json-schema-to-typescript';
3
- import { Activity } from './activity';
4
- export interface ActionInput<T> {
5
- params: T;
6
- agent: Agent;
7
- }
8
- export interface ActionExample {
9
- description?: string;
10
- activities: Activity[];
11
- }
12
- export declare abstract class Action<P = any, R = any> {
13
- abstract get exit(): boolean;
14
- abstract get kind(): string;
15
- abstract get description(): string;
16
- abstract get params(): JSONSchema;
17
- abstract get result(): JSONSchema;
18
- abstract get examples(): ActionExample[];
19
- abstract call(input: ActionInput<P>): Promise<R>;
20
- private _examplesPrompt;
21
- _prompt(template?: string): Promise<string>;
22
- _call(input: string, agent: Agent): Promise<string>;
23
- }
package/dist/action.js DELETED
@@ -1,86 +0,0 @@
1
- "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.Action = void 0;
7
- const dedent_1 = __importDefault(require("dedent"));
8
- const ajv_1 = __importDefault(require("ajv"));
9
- const ajv_errors_1 = __importDefault(require("ajv-errors"));
10
- const prompts_1 = require("@langchain/core/prompts");
11
- const json_schema_to_typescript_1 = require("json-schema-to-typescript");
12
- const constants_1 = require("./constants");
13
- const ajv = (0, ajv_errors_1.default)(new ajv_1.default({
14
- useDefaults: true,
15
- removeAdditional: true,
16
- allErrors: true,
17
- }));
18
- const ACTION_TEMPLATE = (`
19
- \`\`\`ts
20
- /**
21
- * @kind {kind}
22
- {description}
23
- * /
24
-
25
- {params}
26
-
27
- {result}
28
- {examples}\`\`\`
29
- `).trim();
30
- class Action {
31
- _examplesPrompt() {
32
- return this.examples
33
- .map(({ activities, description }) => [
34
- (0, dedent_1.default) `
35
- /**
36
- * @example ${description}`,
37
- activities.map(a => a.prompt())
38
- .join(constants_1.ACTIVITY_SEP)
39
- .split('\n')
40
- .map(s => ` * ${s}`)
41
- .join('\n'),
42
- ' */'
43
- ].join('\n'))
44
- .join('\n\n') + '\n';
45
- }
46
- async _prompt(template = ACTION_TEMPLATE) {
47
- const paramsType = `${this.kind}Params`;
48
- const resultType = `${this.kind}Result`;
49
- const partial = await prompts_1.PromptTemplate.fromTemplate(template).partial({
50
- params: async () => {
51
- const ts = await (0, json_schema_to_typescript_1.compile)(this.params, paramsType, { bannerComment: '', additionalProperties: false });
52
- return ts.replace(/^(export\s*)/gm, '').trim();
53
- },
54
- result: async () => {
55
- const ts = await (0, json_schema_to_typescript_1.compile)(this.result, resultType, { bannerComment: '', additionalProperties: false });
56
- return ts.replace(/^(export\s*)/gm, '').trim();
57
- },
58
- examples: () => this._examplesPrompt(),
59
- kind: this.kind,
60
- description: this.description
61
- .split('\n')
62
- .map(s => ` * ${s}`)
63
- .join('\n'),
64
- paramsType,
65
- resultType,
66
- });
67
- return partial
68
- .pipe(prompt => prompt.toString().trim())
69
- .invoke({});
70
- }
71
- async _call(input, agent) {
72
- const params = JSON.parse(input);
73
- const validator = ajv.compile(this.params);
74
- const isValid = validator(params);
75
- if (!isValid) {
76
- throw new Error(`Action "${this.kind}" params are not valid: ${ajv.errorsText(validator.errors)} `);
77
- }
78
- const result = await this.call({ params, agent });
79
- if (typeof result === 'string') {
80
- return result;
81
- }
82
- return JSON.stringify(result);
83
- }
84
- }
85
- exports.Action = Action;
86
- //# sourceMappingURL=action.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"action.js","sourceRoot":"","sources":["../src/action.ts"],"names":[],"mappings":"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"}