Skip to content

Commit 0f0f47f

Browse files
committed
Simulation Environment
1 parent a1492b8 commit 0f0f47f

File tree

28 files changed

+430
-374
lines changed

28 files changed

+430
-374
lines changed

apps/gateway/src/services/cloudwatchMetrics.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,11 @@ class CloudWatchMetricsService {
2424
}
2525

2626
private isConfigured(): boolean {
27-
return Boolean(env.AWS_ACCESS_KEY && env.AWS_ACCESS_SECRET)
27+
return Boolean(
28+
env.NODE_ENV === 'production' &&
29+
env.AWS_ACCESS_KEY &&
30+
env.AWS_ACCESS_SECRET,
31+
)
2832
}
2933

3034
incrementInflightRequests(): void {

apps/web/src/components/ChatWrapper/Message/Content/ToolCall/_components/ToolCard/Content.tsx

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,13 +11,16 @@ import { Text } from '@latitude-data/web-ui/atoms/Text'
1111
import { stringifyUnknown } from '@latitude-data/web-ui/textUtils'
1212
import { cn } from '@latitude-data/web-ui/utils'
1313
import { ReactNode } from 'react'
14+
import { SimulationTag } from './SimulationTag'
1415

1516
export function ToolCardContentWrapper({
1617
badge,
18+
simulated,
1719
className,
1820
children,
1921
}: {
2022
badge?: string
23+
simulated?: boolean
2124
className?: string
2225
children: ReactNode
2326
}) {
@@ -28,9 +31,10 @@ export function ToolCardContentWrapper({
2831
className,
2932
)}
3033
>
31-
{badge && (
32-
<div className='flex flex-row'>
33-
<Badge variant='outline'>{badge}</Badge>
34+
{(badge || simulated) && (
35+
<div className='flex flex-row gap-2'>
36+
{badge && <Badge variant='outline'>{badge}</Badge>}
37+
{simulated && <SimulationTag />}
3438
</div>
3539
)}
3640
<MaxHeightWindow>{children}</MaxHeightWindow>
@@ -54,11 +58,13 @@ export function ToolCardInput({
5458

5559
export function ToolCardOutput({
5660
toolResponse,
61+
simulated,
5762
}: {
5863
toolResponse: ToolContent | undefined
64+
simulated?: boolean
5965
}) {
6066
return (
61-
<ToolCardContentWrapper badge='Output'>
67+
<ToolCardContentWrapper badge='Output' simulated={simulated}>
6268
{toolResponse ? (
6369
toolResponse.isError ? (
6470
<div className='w-full pt-3 items-center'>

apps/web/src/components/ChatWrapper/Message/Content/ToolCall/_components/ToolCard/Header.tsx

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import { Icon, IconName } from '@latitude-data/web-ui/atoms/Icons'
22
import { TextColor } from '@latitude-data/web-ui/tokens'
33
import { cn } from '@latitude-data/web-ui/utils'
44
import { ReactNode } from 'react'
5+
import { SimulationTag } from './SimulationTag'
56

67
const statusIconColor = (
78
status: 'pending' | 'success' | 'error',
@@ -35,12 +36,14 @@ export function ToolCardHeader({
3536
status,
3637
isOpen,
3738
onToggle,
39+
simulated,
3840
}: {
3941
icon: ReactNode
4042
label: ReactNode
4143
status?: 'pending' | 'success' | 'error' | undefined
4244
isOpen: boolean
4345
onToggle?: () => void
46+
simulated?: boolean
4447
}) {
4548
return (
4649
<div
@@ -71,6 +74,7 @@ export function ToolCardHeader({
7174
)}
7275
</div>
7376
<div className='flex flex-col min-w-0 flex-1'>{label}</div>
77+
{simulated && <SimulationTag />}
7478
{onToggle && (
7579
<Icon
7680
name={isOpen ? 'chevronUp' : 'chevronDown'}
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
import { Badge } from '@latitude-data/web-ui/atoms/Badge'
2+
import { Icon } from '@latitude-data/web-ui/atoms/Icons'
3+
import { Text } from '@latitude-data/web-ui/atoms/Text'
4+
import { Tooltip } from '@latitude-data/web-ui/atoms/Tooltip'
5+
6+
export function SimulationTag() {
7+
return (
8+
<Tooltip
9+
asChild
10+
trigger={
11+
<Badge variant='warningMuted'>
12+
<div className='flex flex-row items-center gap-1'>
13+
<Icon name='cat' color='warningMutedForeground' />
14+
<Text.H6B color='warningMutedForeground'>Simulated</Text.H6B>
15+
</div>
16+
</Badge>
17+
}
18+
>
19+
This tool has been simulated. The real tool has not been executed.
20+
Instead, an LLM has generated the results.
21+
</Tooltip>
22+
)
23+
}

apps/web/src/components/ChatWrapper/Message/Content/ToolCall/_components/ToolCard/index.tsx

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -95,9 +95,15 @@ export function ToolCard({
9595
status={status}
9696
isOpen={isOpen}
9797
onToggle={() => setIsOpen(!isOpen)}
98+
simulated={toolRequest._sourceData?.simulated}
9899
/>
99100
{isOpen && <ToolCardInput toolRequest={toolRequest} />}
100-
{isOpen && <ToolCardOutput toolResponse={toolResponse} />}
101+
{isOpen && (
102+
<ToolCardOutput
103+
toolResponse={toolResponse}
104+
simulated={toolRequest._sourceData?.simulated}
105+
/>
106+
)}
101107
</ToolCardWrapper>
102108
)
103109
}

packages/constants/src/index.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,11 @@ export type ExperimentScores = {
6262
[evaluationUuid: string]: ExperimentEvaluationScore
6363
}
6464

65+
export type SimulationSettings = {
66+
simulationDescription?: string // A prompt used to guide and generate the simulation result
67+
simulateToolResponses?: boolean
68+
}
69+
6570
// TODO: Remove these
6671
export * from './ai'
6772
export * from './config'

packages/constants/src/toolSources.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ export enum ToolSource {
1010
}
1111

1212
type BaseToolSourceData<T extends ToolSource> = {
13+
simulated?: boolean
1314
source: T
1415
}
1516

packages/core/src/jobs/job-definitions/documents/runDocumentAtCommitWithAutoToolResponses/getDataForInitialRequest.ts

Lines changed: 0 additions & 49 deletions
This file was deleted.

packages/core/src/jobs/job-definitions/documents/runDocumentAtCommitWithAutoToolResponses/index.ts

Lines changed: 0 additions & 79 deletions
This file was deleted.

packages/core/src/jobs/job-definitions/documents/runDocumentJob.test.ts

Lines changed: 19 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import * as factories from '../../../tests/factories'
77
import { mockToolRequestsCopilot } from '../../../tests/helpers'
88
import { WebsocketClient } from '../../../websockets/workers'
99
import * as utils from '../../utils/progressTracker'
10-
import * as runDocumentAtCommitWithAutoToolResponses from './runDocumentAtCommitWithAutoToolResponses'
10+
import * as runDocumentAtCommitModule from '../../../services/commits'
1111

1212
const incrementErrorsMock = vi.hoisted(() => vi.fn())
1313

@@ -26,10 +26,7 @@ describe('runDocumentJob', () => {
2626
buildRedisConnection: vi.fn(),
2727
}
2828
})
29-
vi.spyOn(
30-
runDocumentAtCommitWithAutoToolResponses,
31-
'runDocumentAtCommitWithAutoToolResponses',
32-
)
29+
vi.spyOn(runDocumentAtCommitModule, 'runDocumentAtCommit')
3330
// @ts-ignore
3431
vi.spyOn(utils, 'ProgressTracker').mockImplementation(() => ({
3532
incrementCompleted: vi.fn(),
@@ -80,25 +77,25 @@ describe('runDocumentJob', () => {
8077
messages: Promise.resolve([]),
8178
trace: factories.createTelemetryTrace({}),
8279
}
83-
vi.mocked(
84-
runDocumentAtCommitWithAutoToolResponses.runDocumentAtCommitWithAutoToolResponses,
85-
).mockResolvedValue(
80+
vi.mocked(runDocumentAtCommitModule.runDocumentAtCommit).mockResolvedValue(
8681
// @ts-ignore
8782
Result.ok(mockResult),
8883
)
8984

9085
await runDocumentJob(mockJob)
9186

92-
expect(
93-
runDocumentAtCommitWithAutoToolResponses.runDocumentAtCommitWithAutoToolResponses,
94-
).toHaveBeenCalledWith({
87+
expect(runDocumentAtCommitModule.runDocumentAtCommit).toHaveBeenCalledWith({
9588
context: expect.anything(),
96-
workspaceId: workspace.id,
97-
projectId: project.id,
98-
documentUuid: document.documentUuid,
99-
commitUuid: commit.uuid,
89+
workspace: expect.objectContaining({ id: workspace.id }),
90+
commit: expect.objectContaining({ uuid: commit.uuid }),
91+
document: expect.objectContaining({
92+
documentUuid: document.documentUuid,
93+
}),
10094
parameters: { param1: 'value1' },
10195
source: LogSources.Playground,
96+
simulationSettings: {
97+
simulateToolResponses: true,
98+
},
10299
})
103100

104101
expect(WebsocketClient.sendEvent).toHaveBeenCalledWith(
@@ -121,9 +118,9 @@ describe('runDocumentJob', () => {
121118
const mod = await import('./runDocumentJob')
122119
const runDocumentJob = mod.runDocumentJob
123120

124-
vi.mocked(
125-
runDocumentAtCommitWithAutoToolResponses.runDocumentAtCommitWithAutoToolResponses,
126-
).mockRejectedValue(new Error('Test error'))
121+
vi.mocked(runDocumentAtCommitModule.runDocumentAtCommit).mockRejectedValue(
122+
new Error('Test error'),
123+
)
127124

128125
await runDocumentJob(mockJob)
129126

@@ -140,9 +137,7 @@ describe('runDocumentJob', () => {
140137
},
141138
)
142139

143-
expect(
144-
runDocumentAtCommitWithAutoToolResponses.runDocumentAtCommitWithAutoToolResponses,
145-
).toHaveBeenCalled()
140+
expect(runDocumentAtCommitModule.runDocumentAtCommit).toHaveBeenCalled()
146141
expect(incrementErrorsMock).toHaveBeenCalled()
147142
})
148143

@@ -154,9 +149,9 @@ describe('runDocumentJob', () => {
154149
message: 'Rate limit error',
155150
})
156151

157-
vi.mocked(
158-
runDocumentAtCommitWithAutoToolResponses.runDocumentAtCommitWithAutoToolResponses,
159-
).mockRejectedValue(rateLimitError)
152+
vi.mocked(runDocumentAtCommitModule.runDocumentAtCommit).mockRejectedValue(
153+
rateLimitError,
154+
)
160155

161156
await expect(runDocumentJob(mockJob)).rejects.toThrow('Rate limit error')
162157

0 commit comments

Comments
 (0)