@copilotkit/runtime 0.0.0-feat-dynamic-copilotcloud-qa-20250117190454
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/.eslintrc.js +7 -0
- package/CHANGELOG.md +913 -0
- package/README.md +46 -0
- package/__snapshots__/schema/schema.graphql +273 -0
- package/dist/chunk-44O2JGUY.mjs +12 -0
- package/dist/chunk-44O2JGUY.mjs.map +1 -0
- package/dist/chunk-BETLEV37.mjs +25 -0
- package/dist/chunk-BETLEV37.mjs.map +1 -0
- package/dist/chunk-CLGKEUOA.mjs +1408 -0
- package/dist/chunk-CLGKEUOA.mjs.map +1 -0
- package/dist/chunk-D2WLFQS6.mjs +43 -0
- package/dist/chunk-D2WLFQS6.mjs.map +1 -0
- package/dist/chunk-DFOKBSIS.mjs +1 -0
- package/dist/chunk-DFOKBSIS.mjs.map +1 -0
- package/dist/chunk-FA5DJ2TZ.mjs +3437 -0
- package/dist/chunk-FA5DJ2TZ.mjs.map +1 -0
- package/dist/chunk-HNUNXFTW.mjs +129 -0
- package/dist/chunk-HNUNXFTW.mjs.map +1 -0
- package/dist/chunk-SFLMY3ES.mjs +80 -0
- package/dist/chunk-SFLMY3ES.mjs.map +1 -0
- package/dist/chunk-U3V2BCGI.mjs +152 -0
- package/dist/chunk-U3V2BCGI.mjs.map +1 -0
- package/dist/chunk-ZCU6UPCY.mjs +25 -0
- package/dist/chunk-ZCU6UPCY.mjs.map +1 -0
- package/dist/copilot-runtime-1a224a0f.d.ts +196 -0
- package/dist/graphql/types/base/index.d.ts +6 -0
- package/dist/graphql/types/base/index.js +63 -0
- package/dist/graphql/types/base/index.js.map +1 -0
- package/dist/graphql/types/base/index.mjs +8 -0
- package/dist/graphql/types/base/index.mjs.map +1 -0
- package/dist/graphql/types/converted/index.d.ts +2 -0
- package/dist/graphql/types/converted/index.js +187 -0
- package/dist/graphql/types/converted/index.js.map +1 -0
- package/dist/graphql/types/converted/index.mjs +17 -0
- package/dist/graphql/types/converted/index.mjs.map +1 -0
- package/dist/groq-adapter-c35c5374.d.ts +281 -0
- package/dist/index-24315d90.d.ts +103 -0
- package/dist/index.d.ts +23 -0
- package/dist/index.js +5258 -0
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +76 -0
- package/dist/index.mjs.map +1 -0
- package/dist/langserve-a16ef8f4.d.ts +180 -0
- package/dist/lib/cloud/index.d.ts +6 -0
- package/dist/lib/cloud/index.js +18 -0
- package/dist/lib/cloud/index.js.map +1 -0
- package/dist/lib/cloud/index.mjs +1 -0
- package/dist/lib/cloud/index.mjs.map +1 -0
- package/dist/lib/index.d.ts +20 -0
- package/dist/lib/index.js +4906 -0
- package/dist/lib/index.js.map +1 -0
- package/dist/lib/index.mjs +58 -0
- package/dist/lib/index.mjs.map +1 -0
- package/dist/lib/integrations/index.d.ts +33 -0
- package/dist/lib/integrations/index.js +2229 -0
- package/dist/lib/integrations/index.js.map +1 -0
- package/dist/lib/integrations/index.mjs +34 -0
- package/dist/lib/integrations/index.mjs.map +1 -0
- package/dist/lib/integrations/nest/index.d.ts +14 -0
- package/dist/lib/integrations/nest/index.js +2138 -0
- package/dist/lib/integrations/nest/index.js.map +1 -0
- package/dist/lib/integrations/nest/index.mjs +13 -0
- package/dist/lib/integrations/nest/index.mjs.map +1 -0
- package/dist/lib/integrations/node-express/index.d.ts +14 -0
- package/dist/lib/integrations/node-express/index.js +2138 -0
- package/dist/lib/integrations/node-express/index.js.map +1 -0
- package/dist/lib/integrations/node-express/index.mjs +13 -0
- package/dist/lib/integrations/node-express/index.mjs.map +1 -0
- package/dist/lib/integrations/node-http/index.d.ts +14 -0
- package/dist/lib/integrations/node-http/index.js +2124 -0
- package/dist/lib/integrations/node-http/index.js.map +1 -0
- package/dist/lib/integrations/node-http/index.mjs +12 -0
- package/dist/lib/integrations/node-http/index.mjs.map +1 -0
- package/dist/service-adapters/index.d.ts +84 -0
- package/dist/service-adapters/index.js +1448 -0
- package/dist/service-adapters/index.js.map +1 -0
- package/dist/service-adapters/index.mjs +26 -0
- package/dist/service-adapters/index.mjs.map +1 -0
- package/dist/utils/index.d.ts +49 -0
- package/dist/utils/index.js +174 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/index.mjs +12 -0
- package/dist/utils/index.mjs.map +1 -0
- package/jest.config.js +5 -0
- package/package.json +85 -0
- package/scripts/generate-gql-schema.ts +13 -0
- package/src/agents/langgraph/event-source.ts +287 -0
- package/src/agents/langgraph/events.ts +338 -0
- package/src/graphql/inputs/action.input.ts +16 -0
- package/src/graphql/inputs/agent-session.input.ts +13 -0
- package/src/graphql/inputs/agent-state.input.ts +10 -0
- package/src/graphql/inputs/cloud-guardrails.input.ts +16 -0
- package/src/graphql/inputs/cloud.input.ts +8 -0
- package/src/graphql/inputs/context-property.input.ts +10 -0
- package/src/graphql/inputs/custom-property.input.ts +15 -0
- package/src/graphql/inputs/forwarded-parameters.input.ts +22 -0
- package/src/graphql/inputs/frontend.input.ts +14 -0
- package/src/graphql/inputs/generate-copilot-response.input.ts +47 -0
- package/src/graphql/inputs/message.input.ts +92 -0
- package/src/graphql/resolvers/copilot.resolver.ts +556 -0
- package/src/graphql/types/agents-response.type.ts +22 -0
- package/src/graphql/types/base/index.ts +10 -0
- package/src/graphql/types/converted/index.ts +136 -0
- package/src/graphql/types/copilot-response.type.ts +113 -0
- package/src/graphql/types/enums.ts +37 -0
- package/src/graphql/types/guardrails-result.type.ts +20 -0
- package/src/graphql/types/message-status.type.ts +40 -0
- package/src/graphql/types/response-status.type.ts +66 -0
- package/src/index.ts +4 -0
- package/src/lib/cloud/index.ts +4 -0
- package/src/lib/index.ts +8 -0
- package/src/lib/integrations/index.ts +6 -0
- package/src/lib/integrations/nest/index.ts +17 -0
- package/src/lib/integrations/nextjs/app-router.ts +40 -0
- package/src/lib/integrations/nextjs/pages-router.ts +49 -0
- package/src/lib/integrations/node-express/index.ts +17 -0
- package/src/lib/integrations/node-http/index.ts +34 -0
- package/src/lib/integrations/shared.ts +109 -0
- package/src/lib/logger.ts +28 -0
- package/src/lib/runtime/copilot-runtime.ts +466 -0
- package/src/lib/runtime/remote-action-constructors.ts +304 -0
- package/src/lib/runtime/remote-actions.ts +174 -0
- package/src/lib/runtime/remote-lg-action.ts +657 -0
- package/src/lib/telemetry-client.ts +52 -0
- package/src/service-adapters/anthropic/anthropic-adapter.ts +205 -0
- package/src/service-adapters/anthropic/utils.ts +144 -0
- package/src/service-adapters/conversion.ts +64 -0
- package/src/service-adapters/events.ts +419 -0
- package/src/service-adapters/experimental/empty/empty-adapter.ts +33 -0
- package/src/service-adapters/experimental/ollama/ollama-adapter.ts +79 -0
- package/src/service-adapters/google/google-genai-adapter.ts +39 -0
- package/src/service-adapters/groq/groq-adapter.ts +173 -0
- package/src/service-adapters/index.ts +16 -0
- package/src/service-adapters/langchain/langchain-adapter.ts +99 -0
- package/src/service-adapters/langchain/langserve.ts +87 -0
- package/src/service-adapters/langchain/types.ts +14 -0
- package/src/service-adapters/langchain/utils.ts +306 -0
- package/src/service-adapters/openai/openai-adapter.ts +210 -0
- package/src/service-adapters/openai/openai-assistant-adapter.ts +304 -0
- package/src/service-adapters/openai/utils.ts +161 -0
- package/src/service-adapters/service-adapter.ts +30 -0
- package/src/service-adapters/unify/unify-adapter.ts +145 -0
- package/src/utils/failed-response-status-reasons.ts +48 -0
- package/src/utils/index.ts +1 -0
- package/tsconfig.json +11 -0
- package/tsup.config.ts +16 -0
- package/typedoc.json +4 -0
|
@@ -0,0 +1,205 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copilot Runtime adapter for Anthropic.
|
|
3
|
+
*
|
|
4
|
+
* ## Example
|
|
5
|
+
*
|
|
6
|
+
* ```ts
|
|
7
|
+
* import { CopilotRuntime, AnthropicAdapter } from "@copilotkit/runtime";
|
|
8
|
+
* import Anthropic from "@anthropic-ai/sdk";
|
|
9
|
+
*
|
|
10
|
+
* const copilotKit = new CopilotRuntime();
|
|
11
|
+
*
|
|
12
|
+
* const anthropic = new Anthropic({
|
|
13
|
+
* apiKey: "<your-api-key>",
|
|
14
|
+
* });
|
|
15
|
+
*
|
|
16
|
+
* return new AnthropicAdapter({ anthropic });
|
|
17
|
+
* ```
|
|
18
|
+
*/
|
|
19
|
+
import Anthropic from "@anthropic-ai/sdk";
|
|
20
|
+
import {
|
|
21
|
+
CopilotServiceAdapter,
|
|
22
|
+
CopilotRuntimeChatCompletionRequest,
|
|
23
|
+
CopilotRuntimeChatCompletionResponse,
|
|
24
|
+
} from "../service-adapter";
|
|
25
|
+
import {
|
|
26
|
+
convertActionInputToAnthropicTool,
|
|
27
|
+
convertMessageToAnthropicMessage,
|
|
28
|
+
groupAnthropicMessagesByRole,
|
|
29
|
+
limitMessagesToTokenCount,
|
|
30
|
+
} from "./utils";
|
|
31
|
+
|
|
32
|
+
import { randomId } from "@copilotkit/shared";
|
|
33
|
+
import { TextMessage } from "../../graphql/types/converted";
|
|
34
|
+
|
|
35
|
+
const DEFAULT_MODEL = "claude-3-sonnet-20240229";
|
|
36
|
+
|
|
37
|
+
export interface AnthropicAdapterParams {
|
|
38
|
+
/**
|
|
39
|
+
* An optional Anthropic instance to use. If not provided, a new instance will be
|
|
40
|
+
* created.
|
|
41
|
+
*/
|
|
42
|
+
anthropic?: Anthropic;
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* The model to use.
|
|
46
|
+
*/
|
|
47
|
+
model?: string;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
export class AnthropicAdapter implements CopilotServiceAdapter {
|
|
51
|
+
private model: string = DEFAULT_MODEL;
|
|
52
|
+
|
|
53
|
+
private _anthropic: Anthropic;
|
|
54
|
+
public get anthropic(): Anthropic {
|
|
55
|
+
return this._anthropic;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
constructor(params?: AnthropicAdapterParams) {
|
|
59
|
+
this._anthropic = params?.anthropic || new Anthropic({});
|
|
60
|
+
if (params?.model) {
|
|
61
|
+
this.model = params.model;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
async process(
|
|
66
|
+
request: CopilotRuntimeChatCompletionRequest,
|
|
67
|
+
): Promise<CopilotRuntimeChatCompletionResponse> {
|
|
68
|
+
const {
|
|
69
|
+
threadId,
|
|
70
|
+
model = this.model,
|
|
71
|
+
messages: rawMessages,
|
|
72
|
+
actions,
|
|
73
|
+
eventSource,
|
|
74
|
+
forwardedParameters,
|
|
75
|
+
} = request;
|
|
76
|
+
const tools = actions.map(convertActionInputToAnthropicTool);
|
|
77
|
+
|
|
78
|
+
const messages = [...rawMessages];
|
|
79
|
+
|
|
80
|
+
// get the instruction message
|
|
81
|
+
const instructionsMessage = messages.shift();
|
|
82
|
+
const instructions = instructionsMessage.isTextMessage() ? instructionsMessage.content : "";
|
|
83
|
+
|
|
84
|
+
let anthropicMessages = messages.map(convertMessageToAnthropicMessage);
|
|
85
|
+
anthropicMessages = limitMessagesToTokenCount(anthropicMessages, tools, model);
|
|
86
|
+
anthropicMessages = groupAnthropicMessagesByRole(anthropicMessages);
|
|
87
|
+
|
|
88
|
+
let toolChoice: any = forwardedParameters?.toolChoice;
|
|
89
|
+
if (forwardedParameters?.toolChoice === "function") {
|
|
90
|
+
toolChoice = {
|
|
91
|
+
type: "tool",
|
|
92
|
+
name: forwardedParameters.toolChoiceFunctionName,
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
const stream = this.anthropic.messages.create({
|
|
97
|
+
system: instructions,
|
|
98
|
+
model: this.model,
|
|
99
|
+
messages: anthropicMessages,
|
|
100
|
+
max_tokens: forwardedParameters?.maxTokens || 1024,
|
|
101
|
+
...(forwardedParameters?.temperature ? { temperature: forwardedParameters.temperature } : {}),
|
|
102
|
+
...(tools.length > 0 && { tools }),
|
|
103
|
+
...(toolChoice && { tool_choice: toolChoice }),
|
|
104
|
+
stream: true,
|
|
105
|
+
});
|
|
106
|
+
|
|
107
|
+
eventSource.stream(async (eventStream$) => {
|
|
108
|
+
let mode: "function" | "message" | null = null;
|
|
109
|
+
let didOutputText = false;
|
|
110
|
+
let currentMessageId = randomId();
|
|
111
|
+
let currentToolCallId = randomId();
|
|
112
|
+
let filterThinkingTextBuffer = new FilterThinkingTextBuffer();
|
|
113
|
+
|
|
114
|
+
for await (const chunk of await stream) {
|
|
115
|
+
if (chunk.type === "message_start") {
|
|
116
|
+
currentMessageId = chunk.message.id;
|
|
117
|
+
} else if (chunk.type === "content_block_start") {
|
|
118
|
+
if (chunk.content_block.type === "text") {
|
|
119
|
+
didOutputText = false;
|
|
120
|
+
filterThinkingTextBuffer.reset();
|
|
121
|
+
mode = "message";
|
|
122
|
+
} else if (chunk.content_block.type === "tool_use") {
|
|
123
|
+
currentToolCallId = chunk.content_block.id;
|
|
124
|
+
eventStream$.sendActionExecutionStart({
|
|
125
|
+
actionExecutionId: currentToolCallId,
|
|
126
|
+
actionName: chunk.content_block.name,
|
|
127
|
+
parentMessageId: currentMessageId,
|
|
128
|
+
});
|
|
129
|
+
mode = "function";
|
|
130
|
+
}
|
|
131
|
+
} else if (chunk.type === "content_block_delta") {
|
|
132
|
+
if (chunk.delta.type === "text_delta") {
|
|
133
|
+
const text = filterThinkingTextBuffer.onTextChunk(chunk.delta.text);
|
|
134
|
+
if (text.length > 0) {
|
|
135
|
+
if (!didOutputText) {
|
|
136
|
+
eventStream$.sendTextMessageStart({ messageId: currentMessageId });
|
|
137
|
+
didOutputText = true;
|
|
138
|
+
}
|
|
139
|
+
eventStream$.sendTextMessageContent({
|
|
140
|
+
messageId: currentMessageId,
|
|
141
|
+
content: text,
|
|
142
|
+
});
|
|
143
|
+
}
|
|
144
|
+
} else if (chunk.delta.type === "input_json_delta") {
|
|
145
|
+
eventStream$.sendActionExecutionArgs({
|
|
146
|
+
actionExecutionId: currentToolCallId,
|
|
147
|
+
args: chunk.delta.partial_json,
|
|
148
|
+
});
|
|
149
|
+
}
|
|
150
|
+
} else if (chunk.type === "content_block_stop") {
|
|
151
|
+
if (mode === "message") {
|
|
152
|
+
if (didOutputText) {
|
|
153
|
+
eventStream$.sendTextMessageEnd({ messageId: currentMessageId });
|
|
154
|
+
}
|
|
155
|
+
} else if (mode === "function") {
|
|
156
|
+
eventStream$.sendActionExecutionEnd({ actionExecutionId: currentToolCallId });
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
eventStream$.complete();
|
|
162
|
+
});
|
|
163
|
+
|
|
164
|
+
return {
|
|
165
|
+
threadId: threadId || randomId(),
|
|
166
|
+
};
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
const THINKING_TAG = "<thinking>";
|
|
171
|
+
const THINKING_TAG_END = "</thinking>";
|
|
172
|
+
|
|
173
|
+
class FilterThinkingTextBuffer {
|
|
174
|
+
private buffer: string;
|
|
175
|
+
private didFilterThinkingTag: boolean = false;
|
|
176
|
+
|
|
177
|
+
constructor() {
|
|
178
|
+
this.buffer = "";
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
onTextChunk(text: string): string {
|
|
182
|
+
this.buffer += text;
|
|
183
|
+
if (this.didFilterThinkingTag) {
|
|
184
|
+
return text;
|
|
185
|
+
}
|
|
186
|
+
const potentialTag = this.buffer.slice(0, THINKING_TAG.length);
|
|
187
|
+
if (THINKING_TAG.startsWith(potentialTag)) {
|
|
188
|
+
if (this.buffer.includes(THINKING_TAG_END)) {
|
|
189
|
+
const end = this.buffer.indexOf(THINKING_TAG_END);
|
|
190
|
+
const filteredText = this.buffer.slice(end + THINKING_TAG_END.length);
|
|
191
|
+
this.buffer = filteredText;
|
|
192
|
+
this.didFilterThinkingTag = true;
|
|
193
|
+
return filteredText;
|
|
194
|
+
} else {
|
|
195
|
+
return "";
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
return text;
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
reset() {
|
|
202
|
+
this.buffer = "";
|
|
203
|
+
this.didFilterThinkingTag = false;
|
|
204
|
+
}
|
|
205
|
+
}
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
import {
|
|
2
|
+
ActionExecutionMessage,
|
|
3
|
+
Message,
|
|
4
|
+
ResultMessage,
|
|
5
|
+
TextMessage,
|
|
6
|
+
} from "../../graphql/types/converted";
|
|
7
|
+
import { ActionInput } from "../../graphql/inputs/action.input";
|
|
8
|
+
import { Anthropic } from "@anthropic-ai/sdk";
|
|
9
|
+
|
|
10
|
+
export function limitMessagesToTokenCount(
|
|
11
|
+
messages: any[],
|
|
12
|
+
tools: any[],
|
|
13
|
+
model: string,
|
|
14
|
+
maxTokens?: number,
|
|
15
|
+
): any[] {
|
|
16
|
+
maxTokens ||= MAX_TOKENS;
|
|
17
|
+
|
|
18
|
+
const result: any[] = [];
|
|
19
|
+
const toolsNumTokens = countToolsTokens(model, tools);
|
|
20
|
+
if (toolsNumTokens > maxTokens) {
|
|
21
|
+
throw new Error(`Too many tokens in function definitions: ${toolsNumTokens} > ${maxTokens}`);
|
|
22
|
+
}
|
|
23
|
+
maxTokens -= toolsNumTokens;
|
|
24
|
+
|
|
25
|
+
for (const message of messages) {
|
|
26
|
+
if (message.role === "system") {
|
|
27
|
+
const numTokens = countMessageTokens(model, message);
|
|
28
|
+
maxTokens -= numTokens;
|
|
29
|
+
|
|
30
|
+
if (maxTokens < 0) {
|
|
31
|
+
throw new Error("Not enough tokens for system message.");
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
let cutoff: boolean = false;
|
|
37
|
+
|
|
38
|
+
const reversedMessages = [...messages].reverse();
|
|
39
|
+
for (const message of reversedMessages) {
|
|
40
|
+
if (message.role === "system") {
|
|
41
|
+
result.unshift(message);
|
|
42
|
+
continue;
|
|
43
|
+
} else if (cutoff) {
|
|
44
|
+
continue;
|
|
45
|
+
}
|
|
46
|
+
let numTokens = countMessageTokens(model, message);
|
|
47
|
+
if (maxTokens < numTokens) {
|
|
48
|
+
cutoff = true;
|
|
49
|
+
continue;
|
|
50
|
+
}
|
|
51
|
+
result.unshift(message);
|
|
52
|
+
maxTokens -= numTokens;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
return result;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
const MAX_TOKENS = 128000;
|
|
59
|
+
|
|
60
|
+
function countToolsTokens(model: string, tools: any[]): number {
|
|
61
|
+
if (tools.length === 0) {
|
|
62
|
+
return 0;
|
|
63
|
+
}
|
|
64
|
+
const json = JSON.stringify(tools);
|
|
65
|
+
return countTokens(model, json);
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
function countMessageTokens(model: string, message: any): number {
|
|
69
|
+
return countTokens(model, JSON.stringify(message.content) || "");
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
function countTokens(model: string, text: string): number {
|
|
73
|
+
return text.length / 3;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
export function convertActionInputToAnthropicTool(action: ActionInput): Anthropic.Messages.Tool {
|
|
77
|
+
return {
|
|
78
|
+
name: action.name,
|
|
79
|
+
description: action.description,
|
|
80
|
+
input_schema: JSON.parse(action.jsonSchema),
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
export function convertMessageToAnthropicMessage(
|
|
85
|
+
message: Message,
|
|
86
|
+
): Anthropic.Messages.MessageParam {
|
|
87
|
+
if (message.isTextMessage()) {
|
|
88
|
+
if (message.role === "system") {
|
|
89
|
+
return {
|
|
90
|
+
role: "assistant",
|
|
91
|
+
content: [
|
|
92
|
+
{ type: "text", text: "THE FOLLOWING MESSAGE IS A SYSTEM MESSAGE: " + message.content },
|
|
93
|
+
],
|
|
94
|
+
};
|
|
95
|
+
} else {
|
|
96
|
+
return {
|
|
97
|
+
role: message.role === "user" ? "user" : "assistant",
|
|
98
|
+
content: [{ type: "text", text: message.content }],
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
} else if (message.isActionExecutionMessage()) {
|
|
102
|
+
return {
|
|
103
|
+
role: "assistant",
|
|
104
|
+
content: [
|
|
105
|
+
{
|
|
106
|
+
id: message.id,
|
|
107
|
+
type: "tool_use",
|
|
108
|
+
input: message.arguments,
|
|
109
|
+
name: message.name,
|
|
110
|
+
},
|
|
111
|
+
],
|
|
112
|
+
};
|
|
113
|
+
} else if (message.isResultMessage()) {
|
|
114
|
+
return {
|
|
115
|
+
role: "user",
|
|
116
|
+
content: [
|
|
117
|
+
{
|
|
118
|
+
type: "tool_result",
|
|
119
|
+
content: message.result,
|
|
120
|
+
tool_use_id: message.actionExecutionId,
|
|
121
|
+
},
|
|
122
|
+
],
|
|
123
|
+
};
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
export function groupAnthropicMessagesByRole(
|
|
128
|
+
messageParams: Anthropic.Messages.MessageParam[],
|
|
129
|
+
): Anthropic.Messages.MessageParam[] {
|
|
130
|
+
return messageParams.reduce((acc, message) => {
|
|
131
|
+
const lastGroup = acc[acc.length - 1];
|
|
132
|
+
|
|
133
|
+
if (lastGroup && lastGroup.role === message.role) {
|
|
134
|
+
lastGroup.content = lastGroup.content.concat(message.content as any);
|
|
135
|
+
} else {
|
|
136
|
+
acc.push({
|
|
137
|
+
role: message.role,
|
|
138
|
+
content: [...(message.content as any)],
|
|
139
|
+
});
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
return acc;
|
|
143
|
+
}, [] as Anthropic.Messages.MessageParam[]);
|
|
144
|
+
}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import {
|
|
2
|
+
ActionExecutionMessage,
|
|
3
|
+
Message,
|
|
4
|
+
ResultMessage,
|
|
5
|
+
TextMessage,
|
|
6
|
+
AgentStateMessage,
|
|
7
|
+
} from "../graphql/types/converted";
|
|
8
|
+
import { MessageInput } from "../graphql/inputs/message.input";
|
|
9
|
+
import { plainToInstance } from "class-transformer";
|
|
10
|
+
|
|
11
|
+
export function convertGqlInputToMessages(inputMessages: MessageInput[]): Message[] {
|
|
12
|
+
const messages: Message[] = [];
|
|
13
|
+
|
|
14
|
+
for (const message of inputMessages) {
|
|
15
|
+
if (message.textMessage) {
|
|
16
|
+
messages.push(
|
|
17
|
+
plainToInstance(TextMessage, {
|
|
18
|
+
id: message.id,
|
|
19
|
+
createdAt: message.createdAt,
|
|
20
|
+
role: message.textMessage.role,
|
|
21
|
+
content: message.textMessage.content,
|
|
22
|
+
parentMessageId: message.textMessage.parentMessageId,
|
|
23
|
+
}),
|
|
24
|
+
);
|
|
25
|
+
} else if (message.actionExecutionMessage) {
|
|
26
|
+
messages.push(
|
|
27
|
+
plainToInstance(ActionExecutionMessage, {
|
|
28
|
+
id: message.id,
|
|
29
|
+
createdAt: message.createdAt,
|
|
30
|
+
name: message.actionExecutionMessage.name,
|
|
31
|
+
arguments: JSON.parse(message.actionExecutionMessage.arguments),
|
|
32
|
+
parentMessageId: message.actionExecutionMessage.parentMessageId,
|
|
33
|
+
}),
|
|
34
|
+
);
|
|
35
|
+
} else if (message.resultMessage) {
|
|
36
|
+
messages.push(
|
|
37
|
+
plainToInstance(ResultMessage, {
|
|
38
|
+
id: message.id,
|
|
39
|
+
createdAt: message.createdAt,
|
|
40
|
+
actionExecutionId: message.resultMessage.actionExecutionId,
|
|
41
|
+
actionName: message.resultMessage.actionName,
|
|
42
|
+
result: message.resultMessage.result,
|
|
43
|
+
}),
|
|
44
|
+
);
|
|
45
|
+
} else if (message.agentStateMessage) {
|
|
46
|
+
messages.push(
|
|
47
|
+
plainToInstance(AgentStateMessage, {
|
|
48
|
+
id: message.id,
|
|
49
|
+
threadId: message.agentStateMessage.threadId,
|
|
50
|
+
createdAt: message.createdAt,
|
|
51
|
+
agentName: message.agentStateMessage.agentName,
|
|
52
|
+
nodeName: message.agentStateMessage.nodeName,
|
|
53
|
+
runId: message.agentStateMessage.runId,
|
|
54
|
+
active: message.agentStateMessage.active,
|
|
55
|
+
role: message.agentStateMessage.role,
|
|
56
|
+
state: JSON.parse(message.agentStateMessage.state),
|
|
57
|
+
running: message.agentStateMessage.running,
|
|
58
|
+
}),
|
|
59
|
+
);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
return messages;
|
|
64
|
+
}
|