@jterrazz/intelligence 1.6.1 → 3.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.
Files changed (107) hide show
  1. package/README.md +69 -165
  2. package/dist/index.cjs +649 -1625
  3. package/dist/index.d.ts +5 -12
  4. package/dist/index.js +5 -12
  5. package/dist/index.js.map +1 -1
  6. package/dist/middleware/__tests__/logging.middleware.test.js +390 -0
  7. package/dist/middleware/__tests__/logging.middleware.test.js.map +1 -0
  8. package/dist/middleware/logging.middleware.d.ts +21 -0
  9. package/dist/middleware/logging.middleware.js +296 -0
  10. package/dist/middleware/logging.middleware.js.map +1 -0
  11. package/dist/parsing/__tests__/create-schema-prompt.test.js +53 -0
  12. package/dist/parsing/__tests__/create-schema-prompt.test.js.map +1 -0
  13. package/dist/parsing/__tests__/parse-object.test.d.ts +1 -0
  14. package/dist/parsing/__tests__/parse-object.test.js +193 -0
  15. package/dist/parsing/__tests__/parse-object.test.js.map +1 -0
  16. package/dist/parsing/__tests__/parse-text.test.d.ts +1 -0
  17. package/dist/parsing/__tests__/parse-text.test.js +159 -0
  18. package/dist/parsing/__tests__/parse-text.test.js.map +1 -0
  19. package/dist/parsing/create-schema-prompt.d.ts +28 -0
  20. package/dist/parsing/create-schema-prompt.js +42 -0
  21. package/dist/parsing/create-schema-prompt.js.map +1 -0
  22. package/dist/parsing/parse-object.d.ts +33 -0
  23. package/dist/parsing/parse-object.js +360 -0
  24. package/dist/parsing/parse-object.js.map +1 -0
  25. package/dist/parsing/parse-text.d.ts +14 -0
  26. package/dist/parsing/parse-text.js +80 -0
  27. package/dist/parsing/parse-text.js.map +1 -0
  28. package/dist/providers/openrouter.provider.d.ts +36 -0
  29. package/dist/providers/openrouter.provider.js +58 -0
  30. package/dist/providers/openrouter.provider.js.map +1 -0
  31. package/package.json +15 -14
  32. package/dist/adapters/agents/autonomous-agent.adapter.d.ts +0 -30
  33. package/dist/adapters/agents/autonomous-agent.adapter.js +0 -400
  34. package/dist/adapters/agents/autonomous-agent.adapter.js.map +0 -1
  35. package/dist/adapters/agents/basic-agent.adapter.d.ts +0 -27
  36. package/dist/adapters/agents/basic-agent.adapter.js +0 -339
  37. package/dist/adapters/agents/basic-agent.adapter.js.map +0 -1
  38. package/dist/adapters/agents/retryable-agent.adapter.d.ts +0 -20
  39. package/dist/adapters/agents/retryable-agent.adapter.js +0 -263
  40. package/dist/adapters/agents/retryable-agent.adapter.js.map +0 -1
  41. package/dist/adapters/models/openrouter-model.adapter.d.ts +0 -38
  42. package/dist/adapters/models/openrouter-model.adapter.js +0 -89
  43. package/dist/adapters/models/openrouter-model.adapter.js.map +0 -1
  44. package/dist/adapters/prompts/__tests__/__snapshots__/presets.test.ts.snap +0 -120
  45. package/dist/adapters/prompts/__tests__/presets.test.js +0 -31
  46. package/dist/adapters/prompts/__tests__/presets.test.js.map +0 -1
  47. package/dist/adapters/prompts/library/categories/domain.d.ts +0 -11
  48. package/dist/adapters/prompts/library/categories/domain.js +0 -12
  49. package/dist/adapters/prompts/library/categories/domain.js.map +0 -1
  50. package/dist/adapters/prompts/library/categories/format.d.ts +0 -10
  51. package/dist/adapters/prompts/library/categories/format.js +0 -11
  52. package/dist/adapters/prompts/library/categories/format.js.map +0 -1
  53. package/dist/adapters/prompts/library/categories/foundations.d.ts +0 -12
  54. package/dist/adapters/prompts/library/categories/foundations.js +0 -13
  55. package/dist/adapters/prompts/library/categories/foundations.js.map +0 -1
  56. package/dist/adapters/prompts/library/categories/language.d.ts +0 -11
  57. package/dist/adapters/prompts/library/categories/language.js +0 -12
  58. package/dist/adapters/prompts/library/categories/language.js.map +0 -1
  59. package/dist/adapters/prompts/library/categories/persona.d.ts +0 -13
  60. package/dist/adapters/prompts/library/categories/persona.js +0 -14
  61. package/dist/adapters/prompts/library/categories/persona.js.map +0 -1
  62. package/dist/adapters/prompts/library/categories/response.d.ts +0 -9
  63. package/dist/adapters/prompts/library/categories/response.js +0 -10
  64. package/dist/adapters/prompts/library/categories/response.js.map +0 -1
  65. package/dist/adapters/prompts/library/categories/tone.d.ts +0 -9
  66. package/dist/adapters/prompts/library/categories/tone.js +0 -10
  67. package/dist/adapters/prompts/library/categories/tone.js.map +0 -1
  68. package/dist/adapters/prompts/library/categories/verbosity.d.ts +0 -8
  69. package/dist/adapters/prompts/library/categories/verbosity.js +0 -9
  70. package/dist/adapters/prompts/library/categories/verbosity.js.map +0 -1
  71. package/dist/adapters/prompts/library/index.d.ts +0 -68
  72. package/dist/adapters/prompts/library/index.js +0 -26
  73. package/dist/adapters/prompts/library/index.js.map +0 -1
  74. package/dist/adapters/prompts/library/presets.d.ts +0 -17
  75. package/dist/adapters/prompts/library/presets.js +0 -45
  76. package/dist/adapters/prompts/library/presets.js.map +0 -1
  77. package/dist/adapters/prompts/system-prompt.adapter.d.ts +0 -9
  78. package/dist/adapters/prompts/system-prompt.adapter.js +0 -57
  79. package/dist/adapters/prompts/system-prompt.adapter.js.map +0 -1
  80. package/dist/adapters/prompts/user-prompt.adapter.d.ts +0 -9
  81. package/dist/adapters/prompts/user-prompt.adapter.js +0 -57
  82. package/dist/adapters/prompts/user-prompt.adapter.js.map +0 -1
  83. package/dist/adapters/tools/safe-tool.adapter.d.ts +0 -27
  84. package/dist/adapters/tools/safe-tool.adapter.js +0 -283
  85. package/dist/adapters/tools/safe-tool.adapter.js.map +0 -1
  86. package/dist/adapters/utils/__tests__/ai-response-parser.test.js +0 -289
  87. package/dist/adapters/utils/__tests__/ai-response-parser.test.js.map +0 -1
  88. package/dist/adapters/utils/ai-response-parser-error.d.ts +0 -8
  89. package/dist/adapters/utils/ai-response-parser-error.js +0 -136
  90. package/dist/adapters/utils/ai-response-parser-error.js.map +0 -1
  91. package/dist/adapters/utils/ai-response-parser.d.ts +0 -60
  92. package/dist/adapters/utils/ai-response-parser.js +0 -347
  93. package/dist/adapters/utils/ai-response-parser.js.map +0 -1
  94. package/dist/ports/agent.port.d.ts +0 -17
  95. package/dist/ports/agent.port.js +0 -7
  96. package/dist/ports/agent.port.js.map +0 -1
  97. package/dist/ports/model.port.d.ts +0 -10
  98. package/dist/ports/model.port.js +0 -5
  99. package/dist/ports/model.port.js.map +0 -1
  100. package/dist/ports/prompt.port.d.ts +0 -9
  101. package/dist/ports/prompt.port.js +0 -5
  102. package/dist/ports/prompt.port.js.map +0 -1
  103. package/dist/ports/tool.port.d.ts +0 -11
  104. package/dist/ports/tool.port.js +0 -5
  105. package/dist/ports/tool.port.js.map +0 -1
  106. /package/dist/{adapters/prompts/__tests__/presets.test.d.ts → middleware/__tests__/logging.middleware.test.d.ts} +0 -0
  107. /package/dist/{adapters/utils/__tests__/ai-response-parser.test.d.ts → parsing/__tests__/create-schema-prompt.test.d.ts} +0 -0
package/README.md CHANGED
@@ -1,208 +1,112 @@
1
1
  # @jterrazz/intelligence
2
2
 
3
- **A composable, type-safe, and framework-agnostic AI agent library for TypeScript.**
4
-
5
- [![NPM Version](https://img.shields.io/npm/v/@jterrazz/intelligence.svg)](https://www.npmjs.com/package/@jterrazz/intelligence)
6
- [![License](https://img.shields.io/npm/l/@jterrazz/intelligence.svg)](./LICENSE)
7
-
8
- `@jterrazz/intelligence` provides a clean, structured, and extensible foundation for building sophisticated AI agents. It's designed to help you create reliable and maintainable AI-powered applications by focusing on composability and type safety.
9
-
10
- ---
11
-
12
- ## Core Principles
13
-
14
- - **Composable Prompts**: Instead of monolithic prompts, the library offers a collection of constants. Mix and match them to build a precise system prompt that defines your agent's behavior, personality, and output format.
15
-
16
- - **Safe, Typed Tools**: A `SafeToolAdapter` provides built-in error handling and Zod-based schema validation for any tool you create. This ensures that tool inputs are valid and that your agent can gracefully handle execution errors.
17
-
18
- - **Ports & Adapters Architecture**: The library uses a hexagonal architecture to separate core logic from implementation details. This makes it easy to swap out underlying models or services (e.g., switching from OpenAI to Anthropic) without rewriting your application.
3
+ Lightweight utilities for AI SDK apps structured output parsing, text sanitization, and provider helpers.
19
4
 
20
5
  ## Installation
21
6
 
22
7
  ```bash
23
- npm install @jterrazz/intelligence
8
+ npm install @jterrazz/intelligence ai zod
24
9
  ```
25
10
 
26
- ---
11
+ ## Parsing Utilities
27
12
 
28
- ## Quick Start
13
+ ### `parseObject` — Extract structured data from AI responses
29
14
 
30
- Get your first agent running in minutes. This example creates a helpful agent for a Discord community.
15
+ Extracts and validates JSON from messy AI outputs (markdown blocks, embedded JSON, malformed syntax).
31
16
 
32
17
  ```typescript
33
- import {
34
- AutonomousAgentAdapter,
35
- OpenRouterAdapter,
36
- SystemPromptAdapter,
37
- PROMPT_LIBRARY,
38
- } from '@jterrazz/intelligence';
39
-
40
- // 1. Set up the model provider
41
- const model = new OpenRouterAdapter({
42
- apiKey: process.env.OPENROUTER_API_KEY!, // Make sure to set this environment variable
43
- modelName: 'anthropic/claude-3.5-sonnet',
44
- });
18
+ import { parseObject } from '@jterrazz/intelligence';
19
+ import { z } from 'zod';
45
20
 
46
- // 2. Create an agent using a preset prompt
47
- const agent = new AutonomousAgentAdapter('discord-bot', {
48
- model,
49
- systemPrompt: new SystemPromptAdapter(PROMPT_LIBRARY.PRESETS.COMMUNITY_ANIMATOR),
21
+ const schema = z.object({
22
+ title: z.string(),
23
+ tags: z.array(z.string()),
50
24
  });
51
25
 
52
- // 3. Run the agent
53
- const response = await agent.run();
54
-
55
- console.log(response);
56
- // Output might be: "Hello, community! I'm here to help with any questions and keep the good vibes flowing. What's on your mind today?"
26
+ // Handles markdown code blocks, embedded JSON, trailing commas, etc.
27
+ const text = '```json\n{"title": "Hello", "tags": ["ai", "typescript"]}\n```';
28
+ const result = parseObject(text, schema);
29
+ // → { title: 'Hello', tags: ['ai', 'typescript'] }
57
30
  ```
58
31
 
59
- ## Creating Domain-Specific Agents
60
-
61
- The most powerful feature of `@jterrazz/intelligence` is its ability to create specialized, reusable agents. By extending the base adapters, you can encapsulate an agent's logic, prompts, and tools into a clean, type-safe class.
32
+ ### `createSchemaPrompt` Generate schema instructions for prompts
62
33
 
63
- ### 1. Data Extraction Agent (`BasicAgentAdapter`)
64
-
65
- Use `BasicAgentAdapter` for simpler, one-shot tasks where you need a structured response but don't require complex tool use. This example creates a reusable agent to extract contact information.
34
+ Creates system prompt instructions for models that don't support native structured outputs.
66
35
 
67
36
  ```typescript
68
- import {
69
- BasicAgentAdapter,
70
- ModelPort,
71
- OpenRouterAdapter,
72
- SystemPromptAdapter,
73
- UserPromptAdapter,
74
- PROMPT_LIBRARY,
75
- } from '@jterrazz/intelligence';
37
+ import { generateText } from 'ai';
38
+ import { createSchemaPrompt, parseObject } from '@jterrazz/intelligence';
76
39
  import { z } from 'zod';
77
40
 
78
- // 1. Define the output type for compile-time type-safety
79
- interface Contact {
80
- name: string;
81
- email: string;
82
- }
83
-
84
- // 2. Create a specialized agent by extending BasicAgentAdapter
85
- class ContactExtractorAgent extends BasicAgentAdapter<Contact> {
86
- constructor(model: ModelPort) {
87
- super('contact-extractor', {
88
- model,
89
- // Define the schema for runtime validation and type inference
90
- schema: z.object({
91
- name: z.string().describe('The full name of the person'),
92
- email: z.string().email().describe('The email address'),
93
- }),
94
- // Compose the system prompt from the library
95
- systemPrompt: new SystemPromptAdapter(
96
- PROMPT_LIBRARY.FORMATS.JSON,
97
- 'You are an expert at extracting contact details from text.',
98
- ),
99
- });
100
- }
101
- }
102
-
103
- // 3. Instantiate and use the agent
104
- const model = new OpenRouterAdapter({
105
- apiKey: process.env.OPENROUTER_API_KEY!,
106
- modelName: 'anthropic/claude-3.5-sonnet',
107
- });
108
- const agent = new ContactExtractorAgent(model);
41
+ const schema = z.object({ summary: z.string(), score: z.number() });
109
42
 
110
- const text = 'Say hi to John Doe, you can reach him at john.doe@example.com.';
111
- const contact = await agent.run(new UserPromptAdapter(text));
43
+ const { text } = await generateText({
44
+ model,
45
+ prompt: 'Analyze this article...',
46
+ system: createSchemaPrompt(schema), // Injects JSON schema instructions
47
+ });
112
48
 
113
- console.log(contact);
114
- // Output: { name: 'John Doe', email: 'john.doe@example.com' }
49
+ const result = parseObject(text, schema);
115
50
  ```
116
51
 
117
- ### 2. Autonomous Agent with a Custom Tool (`AutonomousAgentAdapter`)
52
+ ### `parseText` Sanitize AI-generated text
118
53
 
119
- Use `AutonomousAgentAdapter` when you need an agent that can reason and use tools to accomplish a task. This example creates a weather assistant that uses a tool and returns a structured JSON response.
54
+ Removes invisible characters, normalizes typography, and cleans common AI artifacts.
120
55
 
121
56
  ```typescript
122
- import {
123
- AutonomousAgentAdapter,
124
- ModelPort,
125
- OpenRouterAdapter,
126
- SafeToolAdapter,
127
- SystemPromptAdapter,
128
- UserPromptAdapter,
129
- } from '@jterrazz/intelligence';
130
- import { z } from 'zod';
57
+ import { parseText } from '@jterrazz/intelligence';
131
58
 
132
- // 1. Define the agent's final output type
133
- interface WeatherReport {
134
- city: string;
135
- temperature: number;
136
- conditions: string;
137
- forecast: string;
138
- }
139
-
140
- // 2. Define a tool. Its `execute` function should return a string,
141
- // as the agent will process this output to formulate a final answer.
142
- const weatherTool = new SafeToolAdapter({
143
- name: 'get_weather',
144
- description: 'Gets the current weather for a specified city.',
145
- schema: z.object({ city: z.string().describe('The name of the city') }),
146
- execute: async ({ city }) => {
147
- // In a real app, you would call a weather API here.
148
- // The tool returns raw data, often as a JSON string.
149
- if (city.toLowerCase() === 'paris') {
150
- return JSON.stringify({
151
- city: 'Paris',
152
- temperature: 25,
153
- conditions: 'sunny',
154
- forecast: 'clear skies for the next 24 hours',
155
- });
156
- }
157
- return `Sorry, I don't have weather information for ${city}.`;
158
- },
59
+ const clean = parseText(messyAiOutput, {
60
+ normalizeTypography: true, // Smart quotes → straight quotes
61
+ removeInvisibleChars: true, // Zero-width chars, etc.
62
+ trimWhitespace: true,
159
63
  });
64
+ ```
160
65
 
161
- // 3. Create a specialized agent that uses the tool and has a structured output
162
- class WeatherAssistantAgent extends AutonomousAgentAdapter<WeatherReport> {
163
- constructor(model: ModelPort) {
164
- super('weather-assistant', {
165
- model,
166
- tools: [weatherTool],
167
- // This schema defines the agent's FINAL output structure
168
- schema: z.object({
169
- city: z.string(),
170
- temperature: z.number(),
171
- conditions: z.string(),
172
- forecast: z.string(),
173
- }),
174
- systemPrompt: new SystemPromptAdapter(
175
- 'You are a helpful weather assistant.',
176
- 'You must use the provided tools to get weather information and then respond with a structured JSON object.',
177
- ),
178
- });
179
- }
180
- }
181
-
182
- // 4. Instantiate and use the agent
183
- const model = new OpenRouterAdapter({
184
- apiKey: process.env.OPENROUTER_API_KEY!,
185
- modelName: 'anthropic/claude-3.5-sonnet',
186
- });
187
- const agent = new WeatherAssistantAgent(model);
66
+ ## Provider
67
+
68
+ ### `createOpenRouterProvider` — OpenRouter for AI SDK
188
69
 
189
- const response = await agent.run(new UserPromptAdapter("What's the weather like in Paris?"));
70
+ ```typescript
71
+ import { generateText } from 'ai';
72
+ import { createOpenRouterProvider } from '@jterrazz/intelligence';
73
+
74
+ const provider = createOpenRouterProvider({
75
+ apiKey: process.env.OPENROUTER_API_KEY,
76
+ });
190
77
 
191
- console.log(response);
192
- // Output: { city: 'Paris', temperature: 25, conditions: 'sunny', forecast: 'clear skies for the next 24 hours' }
78
+ const { text } = await generateText({
79
+ model: provider.model('anthropic/claude-sonnet-4-20250514'),
80
+ prompt: 'Hello!',
81
+ });
193
82
  ```
194
83
 
195
- ## Development
84
+ With reasoning models:
196
85
 
197
- - **Linting**: `npm run lint`
198
- - **Testing**: `npm run test`
86
+ ```typescript
87
+ const model = provider.model('anthropic/claude-sonnet-4-20250514', {
88
+ maxTokens: 16000,
89
+ reasoning: { effort: 'high' },
90
+ });
91
+ ```
199
92
 
200
- ## Contributing
93
+ ## Middleware
201
94
 
202
- Contributions are welcome! Please feel free to open an issue or submit a pull request.
95
+ ### `createLoggingMiddleware` Log AI SDK requests
203
96
 
204
- ---
97
+ ```typescript
98
+ import { wrapLanguageModel } from 'ai';
99
+ import { createLoggingMiddleware } from '@jterrazz/intelligence';
100
+
101
+ const model = wrapLanguageModel({
102
+ model: provider.model('anthropic/claude-sonnet-4-20250514'),
103
+ middleware: createLoggingMiddleware({
104
+ logger, // Any logger with debug/error methods
105
+ verbose: false, // Include full request/response in logs
106
+ }),
107
+ });
108
+ ```
205
109
 
206
110
  ## License
207
111
 
208
- This project is licensed under the [MIT License](./LICENSE).
112
+ MIT