@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.
- package/README.md +69 -165
- package/dist/index.cjs +649 -1625
- package/dist/index.d.ts +5 -12
- package/dist/index.js +5 -12
- package/dist/index.js.map +1 -1
- package/dist/middleware/__tests__/logging.middleware.test.js +390 -0
- package/dist/middleware/__tests__/logging.middleware.test.js.map +1 -0
- package/dist/middleware/logging.middleware.d.ts +21 -0
- package/dist/middleware/logging.middleware.js +296 -0
- package/dist/middleware/logging.middleware.js.map +1 -0
- package/dist/parsing/__tests__/create-schema-prompt.test.js +53 -0
- package/dist/parsing/__tests__/create-schema-prompt.test.js.map +1 -0
- package/dist/parsing/__tests__/parse-object.test.d.ts +1 -0
- package/dist/parsing/__tests__/parse-object.test.js +193 -0
- package/dist/parsing/__tests__/parse-object.test.js.map +1 -0
- package/dist/parsing/__tests__/parse-text.test.d.ts +1 -0
- package/dist/parsing/__tests__/parse-text.test.js +159 -0
- package/dist/parsing/__tests__/parse-text.test.js.map +1 -0
- package/dist/parsing/create-schema-prompt.d.ts +28 -0
- package/dist/parsing/create-schema-prompt.js +42 -0
- package/dist/parsing/create-schema-prompt.js.map +1 -0
- package/dist/parsing/parse-object.d.ts +33 -0
- package/dist/parsing/parse-object.js +360 -0
- package/dist/parsing/parse-object.js.map +1 -0
- package/dist/parsing/parse-text.d.ts +14 -0
- package/dist/parsing/parse-text.js +80 -0
- package/dist/parsing/parse-text.js.map +1 -0
- package/dist/providers/openrouter.provider.d.ts +36 -0
- package/dist/providers/openrouter.provider.js +58 -0
- package/dist/providers/openrouter.provider.js.map +1 -0
- package/package.json +15 -14
- package/dist/adapters/agents/autonomous-agent.adapter.d.ts +0 -30
- package/dist/adapters/agents/autonomous-agent.adapter.js +0 -400
- package/dist/adapters/agents/autonomous-agent.adapter.js.map +0 -1
- package/dist/adapters/agents/basic-agent.adapter.d.ts +0 -27
- package/dist/adapters/agents/basic-agent.adapter.js +0 -339
- package/dist/adapters/agents/basic-agent.adapter.js.map +0 -1
- package/dist/adapters/agents/retryable-agent.adapter.d.ts +0 -20
- package/dist/adapters/agents/retryable-agent.adapter.js +0 -263
- package/dist/adapters/agents/retryable-agent.adapter.js.map +0 -1
- package/dist/adapters/models/openrouter-model.adapter.d.ts +0 -38
- package/dist/adapters/models/openrouter-model.adapter.js +0 -89
- package/dist/adapters/models/openrouter-model.adapter.js.map +0 -1
- package/dist/adapters/prompts/__tests__/__snapshots__/presets.test.ts.snap +0 -120
- package/dist/adapters/prompts/__tests__/presets.test.js +0 -31
- package/dist/adapters/prompts/__tests__/presets.test.js.map +0 -1
- package/dist/adapters/prompts/library/categories/domain.d.ts +0 -11
- package/dist/adapters/prompts/library/categories/domain.js +0 -12
- package/dist/adapters/prompts/library/categories/domain.js.map +0 -1
- package/dist/adapters/prompts/library/categories/format.d.ts +0 -10
- package/dist/adapters/prompts/library/categories/format.js +0 -11
- package/dist/adapters/prompts/library/categories/format.js.map +0 -1
- package/dist/adapters/prompts/library/categories/foundations.d.ts +0 -12
- package/dist/adapters/prompts/library/categories/foundations.js +0 -13
- package/dist/adapters/prompts/library/categories/foundations.js.map +0 -1
- package/dist/adapters/prompts/library/categories/language.d.ts +0 -11
- package/dist/adapters/prompts/library/categories/language.js +0 -12
- package/dist/adapters/prompts/library/categories/language.js.map +0 -1
- package/dist/adapters/prompts/library/categories/persona.d.ts +0 -13
- package/dist/adapters/prompts/library/categories/persona.js +0 -14
- package/dist/adapters/prompts/library/categories/persona.js.map +0 -1
- package/dist/adapters/prompts/library/categories/response.d.ts +0 -9
- package/dist/adapters/prompts/library/categories/response.js +0 -10
- package/dist/adapters/prompts/library/categories/response.js.map +0 -1
- package/dist/adapters/prompts/library/categories/tone.d.ts +0 -9
- package/dist/adapters/prompts/library/categories/tone.js +0 -10
- package/dist/adapters/prompts/library/categories/tone.js.map +0 -1
- package/dist/adapters/prompts/library/categories/verbosity.d.ts +0 -8
- package/dist/adapters/prompts/library/categories/verbosity.js +0 -9
- package/dist/adapters/prompts/library/categories/verbosity.js.map +0 -1
- package/dist/adapters/prompts/library/index.d.ts +0 -68
- package/dist/adapters/prompts/library/index.js +0 -26
- package/dist/adapters/prompts/library/index.js.map +0 -1
- package/dist/adapters/prompts/library/presets.d.ts +0 -17
- package/dist/adapters/prompts/library/presets.js +0 -45
- package/dist/adapters/prompts/library/presets.js.map +0 -1
- package/dist/adapters/prompts/system-prompt.adapter.d.ts +0 -9
- package/dist/adapters/prompts/system-prompt.adapter.js +0 -57
- package/dist/adapters/prompts/system-prompt.adapter.js.map +0 -1
- package/dist/adapters/prompts/user-prompt.adapter.d.ts +0 -9
- package/dist/adapters/prompts/user-prompt.adapter.js +0 -57
- package/dist/adapters/prompts/user-prompt.adapter.js.map +0 -1
- package/dist/adapters/tools/safe-tool.adapter.d.ts +0 -27
- package/dist/adapters/tools/safe-tool.adapter.js +0 -283
- package/dist/adapters/tools/safe-tool.adapter.js.map +0 -1
- package/dist/adapters/utils/__tests__/ai-response-parser.test.js +0 -289
- package/dist/adapters/utils/__tests__/ai-response-parser.test.js.map +0 -1
- package/dist/adapters/utils/ai-response-parser-error.d.ts +0 -8
- package/dist/adapters/utils/ai-response-parser-error.js +0 -136
- package/dist/adapters/utils/ai-response-parser-error.js.map +0 -1
- package/dist/adapters/utils/ai-response-parser.d.ts +0 -60
- package/dist/adapters/utils/ai-response-parser.js +0 -347
- package/dist/adapters/utils/ai-response-parser.js.map +0 -1
- package/dist/ports/agent.port.d.ts +0 -17
- package/dist/ports/agent.port.js +0 -7
- package/dist/ports/agent.port.js.map +0 -1
- package/dist/ports/model.port.d.ts +0 -10
- package/dist/ports/model.port.js +0 -5
- package/dist/ports/model.port.js.map +0 -1
- package/dist/ports/prompt.port.d.ts +0 -9
- package/dist/ports/prompt.port.js +0 -5
- package/dist/ports/prompt.port.js.map +0 -1
- package/dist/ports/tool.port.d.ts +0 -11
- package/dist/ports/tool.port.js +0 -5
- package/dist/ports/tool.port.js.map +0 -1
- /package/dist/{adapters/prompts/__tests__/presets.test.d.ts → middleware/__tests__/logging.middleware.test.d.ts} +0 -0
- /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
|
-
|
|
4
|
-
|
|
5
|
-
[](https://www.npmjs.com/package/@jterrazz/intelligence)
|
|
6
|
-
[](./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
|
-
|
|
13
|
+
### `parseObject` — Extract structured data from AI responses
|
|
29
14
|
|
|
30
|
-
|
|
15
|
+
Extracts and validates JSON from messy AI outputs (markdown blocks, embedded JSON, malformed syntax).
|
|
31
16
|
|
|
32
17
|
```typescript
|
|
33
|
-
import {
|
|
34
|
-
|
|
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
|
-
|
|
47
|
-
|
|
48
|
-
|
|
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
|
-
//
|
|
53
|
-
const
|
|
54
|
-
|
|
55
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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 =
|
|
111
|
-
|
|
43
|
+
const { text } = await generateText({
|
|
44
|
+
model,
|
|
45
|
+
prompt: 'Analyze this article...',
|
|
46
|
+
system: createSchemaPrompt(schema), // Injects JSON schema instructions
|
|
47
|
+
});
|
|
112
48
|
|
|
113
|
-
|
|
114
|
-
// Output: { name: 'John Doe', email: 'john.doe@example.com' }
|
|
49
|
+
const result = parseObject(text, schema);
|
|
115
50
|
```
|
|
116
51
|
|
|
117
|
-
###
|
|
52
|
+
### `parseText` — Sanitize AI-generated text
|
|
118
53
|
|
|
119
|
-
|
|
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
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
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
|
-
|
|
162
|
-
|
|
163
|
-
|
|
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
|
-
|
|
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
|
-
|
|
192
|
-
|
|
78
|
+
const { text } = await generateText({
|
|
79
|
+
model: provider.model('anthropic/claude-sonnet-4-20250514'),
|
|
80
|
+
prompt: 'Hello!',
|
|
81
|
+
});
|
|
193
82
|
```
|
|
194
83
|
|
|
195
|
-
|
|
84
|
+
With reasoning models:
|
|
196
85
|
|
|
197
|
-
|
|
198
|
-
|
|
86
|
+
```typescript
|
|
87
|
+
const model = provider.model('anthropic/claude-sonnet-4-20250514', {
|
|
88
|
+
maxTokens: 16000,
|
|
89
|
+
reasoning: { effort: 'high' },
|
|
90
|
+
});
|
|
91
|
+
```
|
|
199
92
|
|
|
200
|
-
##
|
|
93
|
+
## Middleware
|
|
201
94
|
|
|
202
|
-
|
|
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
|
-
|
|
112
|
+
MIT
|