mirror of
https://github.com/hanzoai/insights.git
synced 2026-11-02 14:32:45 +00:00
Mechanically re-derived: bin/debrand runs over a fresh import of posthog/posthog@fa1a9a60d4 (2026-08-06). The pipeline (.hanzo/workflows), the Dockerfiles and bin/docker* entrypoints, compose files, LLM.md and the squashed initial migration are restored from the shipped tree, same as the previous import. The prune's import-closure guard kept 21 products the new core now imports; dropping them is a refactor now, recorded rather than forced.
252 lines
11 KiB
TypeScript
252 lines
11 KiB
TypeScript
import { OnboardingComponentsContext, createInstallation } from 'scenes/onboarding/shared/OnboardingDocsContentWrapper'
|
|
|
|
import { StepDefinition } from '../steps'
|
|
|
|
export const getAnthropicSteps = (ctx: OnboardingComponentsContext): StepDefinition[] => {
|
|
const { CodeBlock, CalloutBox, Markdown, Blockquote, dedent, snippets } = ctx
|
|
|
|
const NotableGenerationProperties = snippets?.NotableGenerationProperties
|
|
|
|
return [
|
|
{
|
|
title: 'Install dependencies',
|
|
badge: 'required',
|
|
content: (
|
|
<>
|
|
<CalloutBox type="info" icon="IconInfo" title="Full working examples">
|
|
<Markdown>
|
|
See the complete
|
|
[Node.js](https://github.com/Insights/insights-js/tree/main/examples/example-ai-anthropic) and
|
|
[Python](https://github.com/Insights/insights-python/tree/master/examples/example-ai-anthropic)
|
|
examples on GitHub.
|
|
</Markdown>
|
|
</CalloutBox>
|
|
|
|
<Markdown>Install the Insights SDK and the Anthropic SDK.</Markdown>
|
|
|
|
<CodeBlock
|
|
blocks={[
|
|
{
|
|
language: 'bash',
|
|
file: 'Python',
|
|
code: dedent`
|
|
pip install insights anthropic
|
|
`,
|
|
},
|
|
{
|
|
language: 'bash',
|
|
file: 'Node',
|
|
code: dedent`
|
|
npm install @hanzo/ai insights-node @anthropic-ai/sdk
|
|
`,
|
|
},
|
|
]}
|
|
/>
|
|
</>
|
|
),
|
|
},
|
|
{
|
|
title: 'Configure Insights',
|
|
badge: 'required',
|
|
content: (
|
|
<>
|
|
<Markdown>
|
|
{dedent`
|
|
Create a Insights client, then swap in Insights's Anthropic wrapper.
|
|
`}
|
|
</Markdown>
|
|
|
|
<CodeBlock
|
|
blocks={[
|
|
{
|
|
language: 'python',
|
|
file: 'Python',
|
|
code: dedent`
|
|
from insights import Insights
|
|
from insights.ai.anthropic import Anthropic
|
|
import time, uuid
|
|
|
|
insights = Insights("<ph_project_token>", host="<ph_client_api_host>")
|
|
|
|
client = Anthropic(
|
|
api_key="sk-ant-api...",
|
|
insights_client=insights,
|
|
)
|
|
`,
|
|
},
|
|
{
|
|
language: 'typescript',
|
|
file: 'Node',
|
|
code: dedent`
|
|
import { Anthropic } from '@hanzo/ai/anthropic'
|
|
import { Insights } from 'insights-node'
|
|
|
|
const insights = new Insights('<ph_project_token>', { host: '<ph_client_api_host>' })
|
|
|
|
const client = new Anthropic({
|
|
apiKey: 'sk-ant-api...',
|
|
insights,
|
|
})
|
|
`,
|
|
},
|
|
]}
|
|
/>
|
|
</>
|
|
),
|
|
},
|
|
{
|
|
title: 'Call Anthropic',
|
|
badge: 'required',
|
|
content: (
|
|
<>
|
|
<Markdown>
|
|
{dedent`
|
|
When you use the wrapped client to call Anthropic, Insights automatically captures an
|
|
\`$ai_generation\` event.
|
|
`}
|
|
</Markdown>
|
|
|
|
<CodeBlock
|
|
blocks={[
|
|
{
|
|
language: 'python',
|
|
file: 'Python',
|
|
code: dedent`
|
|
trace_id = str(uuid.uuid4())
|
|
|
|
response = client.messages.create(
|
|
model="claude-sonnet-4-5",
|
|
max_tokens=1024,
|
|
messages=[{"role": "user", "content": "What's the weather in Paris?"}],
|
|
tools=tools,
|
|
insights_distinct_id="user_123",
|
|
insights_trace_id=trace_id,
|
|
insights_properties={
|
|
"$ai_session_id": "conversation-abc",
|
|
},
|
|
)
|
|
`,
|
|
},
|
|
{
|
|
language: 'typescript',
|
|
file: 'Node',
|
|
code: dedent`
|
|
const traceId = crypto.randomUUID()
|
|
|
|
const response = await client.messages.create({
|
|
model: 'claude-sonnet-4-5',
|
|
max_tokens: 1024,
|
|
messages: [{ role: 'user', content: "What's the weather in Paris?" }],
|
|
tools,
|
|
insightsDistinctId: 'user_123',
|
|
insightsTraceId: traceId,
|
|
insightsProperties: {
|
|
$ai_session_id: 'conversation-abc',
|
|
},
|
|
})
|
|
`,
|
|
},
|
|
]}
|
|
/>
|
|
|
|
<Blockquote>
|
|
<Markdown>
|
|
**Note:** If you want to capture LLM events anonymously, omit `insights_distinct_id` from the
|
|
call. See our docs on [anonymous vs identified
|
|
events](https://hanzo.ai/docs/data/anonymous-vs-identified-events) to learn more.
|
|
</Markdown>
|
|
</Blockquote>
|
|
|
|
<Markdown>
|
|
{dedent`
|
|
You can expect captured \`$ai_generation\` events to have the following properties:
|
|
`}
|
|
</Markdown>
|
|
|
|
{NotableGenerationProperties && <NotableGenerationProperties />}
|
|
</>
|
|
),
|
|
},
|
|
{
|
|
title: 'Capture tool calls as spans',
|
|
badge: 'optional',
|
|
content: (
|
|
<>
|
|
<Markdown>
|
|
{dedent`
|
|
For standard responses, the insights client captures it as a generation. For all tool
|
|
calls, you must manually capture them as \`$ai_span\` events.
|
|
`}
|
|
</Markdown>
|
|
|
|
<CodeBlock
|
|
blocks={[
|
|
{
|
|
language: 'python',
|
|
file: 'Python',
|
|
code: dedent`
|
|
for block in response.content:
|
|
if block.type != "tool_use":
|
|
continue
|
|
|
|
start = time.time()
|
|
result = run_tool(block.name, block.input)
|
|
|
|
insights.capture(
|
|
distinct_id="user_123",
|
|
event="$ai_span",
|
|
properties={
|
|
"$ai_trace_id": trace_id,
|
|
"$ai_session_id": "conversation-abc",
|
|
"$ai_span_id": str(uuid.uuid4()),
|
|
"$ai_span_name": block.name,
|
|
"$ai_input_state": block.input,
|
|
"$ai_output_state": result,
|
|
"$ai_latency": time.time() - start,
|
|
},
|
|
)
|
|
`,
|
|
},
|
|
{
|
|
language: 'typescript',
|
|
file: 'Node',
|
|
code: dedent`
|
|
for (const block of response.content) {
|
|
if (block.type !== 'tool_use') continue
|
|
|
|
const start = Date.now()
|
|
const result = await runTool(block.name, block.input)
|
|
|
|
insights.capture({
|
|
distinctId: 'user_123',
|
|
event: '$ai_span',
|
|
properties: {
|
|
$ai_trace_id: traceId,
|
|
$ai_session_id: 'conversation-abc',
|
|
$ai_span_id: crypto.randomUUID(),
|
|
$ai_span_name: block.name,
|
|
$ai_input_state: block.input,
|
|
$ai_output_state: result,
|
|
$ai_latency: (Date.now() - start) / 1000,
|
|
},
|
|
})
|
|
}
|
|
`,
|
|
},
|
|
]}
|
|
/>
|
|
|
|
<Markdown>
|
|
{dedent`
|
|
See [spans](https://hanzo.ai/docs/ai-observability/spans) for the full list of span
|
|
properties.
|
|
`}
|
|
</Markdown>
|
|
</>
|
|
),
|
|
},
|
|
]
|
|
}
|
|
|
|
export const AnthropicInstallation = createInstallation(getAnthropicSteps)
|