Skip to content

Commit 6eb19a7

Browse files
feat(integrations): add Kitt enrichment
1 parent 278d570 commit 6eb19a7

21 files changed

Lines changed: 1105 additions & 0 deletions

File tree

apps/docs/components/icons.tsx

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7445,6 +7445,29 @@ export function KetchIcon(props: SVGProps<SVGSVGElement>) {
74457445
)
74467446
}
74477447

7448+
/** Kitt robot mark recreated from the official public navbar wordmark. */
7449+
export function KittIcon(props: SVGProps<SVGSVGElement>) {
7450+
return (
7451+
<svg {...props} viewBox='0 0 24 24' fill='none' xmlns='http://www.w3.org/2000/svg'>
7452+
<path d='M12 2V5' stroke='currentColor' strokeWidth='1.8' strokeLinecap='round' />
7453+
<circle cx='12' cy='2' r='1' fill='currentColor' />
7454+
<rect x='3' y='5' width='18' height='7' rx='3.5' stroke='currentColor' strokeWidth='1.8' />
7455+
<circle cx='7.5' cy='8.5' r='1.25' fill='currentColor' />
7456+
<circle cx='16.5' cy='8.5' r='1.25' fill='currentColor' />
7457+
<path
7458+
d='M7.5 13.5C7.5 12.67 8.17 12 9 12H15C15.83 12 16.5 12.67 16.5 13.5V18C16.5 18.83 15.83 19.5 15 19.5H9C8.17 19.5 7.5 18.83 7.5 18V13.5Z'
7459+
fill='currentColor'
7460+
/>
7461+
<path
7462+
d='M7.5 14.5L4 13M16.5 14.5L20 13M10 19.5L9.25 22M14 19.5L14.75 22'
7463+
stroke='currentColor'
7464+
strokeWidth='1.8'
7465+
strokeLinecap='round'
7466+
/>
7467+
</svg>
7468+
)
7469+
}
7470+
74487471
export function PolymarketIcon(props: SVGProps<SVGSVGElement>) {
74497472
return (
74507473
<svg {...props} xmlns='http://www.w3.org/2000/svg' viewBox='51 209 123 155'>

apps/docs/components/ui/icon-mapping.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -132,6 +132,7 @@ import {
132132
JupyterIcon,
133133
KalshiIcon,
134134
KetchIcon,
135+
KittIcon,
135136
LangsmithIcon,
136137
LatexIcon,
137138
LaunchDarklyIcon,
@@ -422,6 +423,7 @@ export const blockTypeToIconMap: Record<string, IconComponent> = {
422423
kalshi: KalshiIcon,
423424
kalshi_v2: KalshiIcon,
424425
ketch: KetchIcon,
426+
kitt: KittIcon,
425427
knowledge: PackageSearchIcon,
426428
langsmith: LangsmithIcon,
427429
latex: LatexIcon,
Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
---
2+
title: Kitt
3+
description: Find and verify B2B email addresses
4+
---
5+
6+
import { BlockInfoCard } from "@/components/ui/block-info-card"
7+
8+
<BlockInfoCard
9+
type="kitt"
10+
color="#8064E8"
11+
/>
12+
13+
## Usage Instructions
14+
15+
Integrate Kitt to find a verified work email from a full name and company domain or to verify an existing B2B email with email-server and identity-server checks.
16+
17+
18+
19+
## Actions
20+
21+
### Kitt Find Email
22+
23+
Find a verified B2B email address from a full name and company domain or website using Kitt real-time enrichment.
24+
25+
#### Input
26+
27+
| Parameter | Type | Required | Description |
28+
| --------- | ---- | -------- | ----------- |
29+
| `apiKey` | string | Yes | Kitt API key |
30+
| `fullName` | string | Yes | Full name exactly as listed on LinkedIn or another public directory |
31+
| `domain` | string | Yes | Company email domain or website |
32+
| `linkedinStandardProfileURL` | string | No | LinkedIn standard profile URL to improve matching |
33+
| `strictNameMatches` | boolean | No | Require strict name matching |
34+
| `customData` | string | No | Caller-defined metadata associated with the request |
35+
36+
#### Output
37+
38+
| Parameter | Type | Description |
39+
| --------- | ---- | ----------- |
40+
| `outcome` | string | Kitt result outcome: success or no-results-found for finding; valid, valid-risky, invalid, or unknown for verification |
41+
| `email` | string | Email address found or verified |
42+
43+
### Kitt Verify Email
44+
45+
Verify a B2B email address using Kitt real-time email-server and identity-server checks.
46+
47+
#### Input
48+
49+
| Parameter | Type | Required | Description |
50+
| --------- | ---- | -------- | ----------- |
51+
| `apiKey` | string | Yes | Kitt API key |
52+
| `email` | string | Yes | Email address to verify |
53+
| `treatAliasesAsValid` | boolean | No | Treat forwarding aliases as valid addresses |
54+
| `customData` | string | No | Caller-defined metadata associated with the request |
55+
56+
#### Output
57+
58+
| Parameter | Type | Description |
59+
| --------- | ---- | ----------- |
60+
| `outcome` | string | Kitt result outcome: success or no-results-found for finding; valid, valid-risky, invalid, or unknown for verification |
61+
| `email` | string | Email address found or verified |
62+
63+

apps/docs/content/docs/en/integrations/meta.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -137,6 +137,7 @@
137137
"jupyter",
138138
"kalshi",
139139
"ketch",
140+
"kitt",
140141
"knowledge",
141142
"langsmith",
142143
"latex",

apps/sim/app/workspace/[workspaceId]/settings/components/byok/byok.tsx

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ import {
2424
IcypeasIcon,
2525
JinaAIIcon,
2626
KimiIcon,
27+
KittIcon,
2728
LeadMagicIcon,
2829
LinkupIcon,
2930
MillionVerifierIcon,
@@ -303,6 +304,13 @@ const PROVIDERS: (BYOKManagerProvider & { id: BYOKProviderId })[] = [
303304
description: 'Email finding and verification',
304305
placeholder: 'Enter your Icypeas API key',
305306
},
307+
{
308+
id: 'kitt',
309+
name: 'Kitt',
310+
icon: KittIcon,
311+
description: 'B2B email finding and verification',
312+
placeholder: 'Enter your Kitt API key',
313+
},
306314
{
307315
id: 'enrow',
308316
name: 'Enrow',
@@ -385,6 +393,7 @@ const PROVIDER_SECTIONS: BYOKProviderSection[] = [
385393
'dropcontact',
386394
'leadmagic',
387395
'icypeas',
396+
'kitt',
388397
'enrow',
389398
'zerobounce',
390399
'neverbounce',
Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
/**
2+
* @vitest-environment node
3+
*/
4+
import { describe, expect, it } from 'vitest'
5+
import { KittBlock } from '@/blocks/blocks/kitt'
6+
7+
function mapParams(params: Record<string, unknown>): Record<string, unknown> {
8+
const mapper = KittBlock.tools.config.params
9+
if (!mapper) throw new Error('Kitt block is missing tools.config.params')
10+
return mapper(params)
11+
}
12+
13+
describe('Kitt block tool wiring', () => {
14+
it('selects both registered operation IDs and rejects unknown operations', () => {
15+
expect(KittBlock.tools.config.tool({ operation: 'kitt_find_email' })).toBe('kitt_find_email')
16+
expect(KittBlock.tools.config.tool({ operation: 'kitt_verify_email' })).toBe(
17+
'kitt_verify_email'
18+
)
19+
expect(() => KittBlock.tools.config.tool({ operation: 'unsupported' })).toThrow(
20+
/Unsupported Kitt operation/
21+
)
22+
})
23+
24+
it('maps finder fields and coerces the strict-name dropdown during execution', () => {
25+
expect(
26+
mapParams({
27+
operation: 'kitt_find_email',
28+
apiKey: 'test-key',
29+
fe_fullName: 'Erol Toker',
30+
fe_domain: 'trykitt.ai',
31+
fe_linkedinStandardProfileURL: 'https://linkedin.com/in/eroltoker',
32+
fe_strictNameMatches: 'false',
33+
fe_customData: 'crm-123',
34+
})
35+
).toEqual({
36+
apiKey: 'test-key',
37+
fullName: 'Erol Toker',
38+
domain: 'trykitt.ai',
39+
linkedinStandardProfileURL: 'https://linkedin.com/in/eroltoker',
40+
strictNameMatches: false,
41+
customData: 'crm-123',
42+
})
43+
})
44+
45+
it('maps verifier fields and coerces the alias dropdown during execution', () => {
46+
expect(
47+
mapParams({
48+
operation: 'kitt_verify_email',
49+
apiKey: 'test-key',
50+
ve_email: 'erol@trykitt.ai',
51+
ve_treatAliasesAsValid: 'true',
52+
ve_customData: 'crm-456',
53+
})
54+
).toEqual({
55+
apiKey: 'test-key',
56+
email: 'erol@trykitt.ai',
57+
treatAliasesAsValid: true,
58+
customData: 'crm-456',
59+
})
60+
})
61+
62+
it('hides the required API key field on hosted Sim', () => {
63+
const apiKey = KittBlock.subBlocks.find((subBlock) => subBlock.id === 'apiKey')
64+
expect(apiKey).toMatchObject({ required: true, password: true, hideWhenHosted: true })
65+
})
66+
})

0 commit comments

Comments
 (0)