MCPcopy Create free account
hub / github.com/Effect-TS/effect / resolveToolCalls

Function resolveToolCalls

packages/effect/src/unstable/ai/LanguageModel.ts:2100–2194  ·  view source on GitHub ↗
(
  content: ReadonlyArray<Response.AllPartsEncoded>,
  toolkit: Toolkit.WithHandler<Tools>,
  messages: ReadonlyArray<Prompt.Message>,
  concurrency: Concurrency
)

Source from the content-addressed store, hash-verified

2098 | Response.ToolApprovalRequestPart
2099
2100const resolveToolCalls = <Tools extends Record<string, Tool.Any>>(
2101 content: ReadonlyArray<Response.AllPartsEncoded>,
2102 toolkit: Toolkit.WithHandler<Tools>,
2103 messages: ReadonlyArray<Prompt.Message>,
2104 concurrency: Concurrency
2105): Stream.Stream<
2106 ToolResolutionResult<Tools>,
2107 Tool.HandlerError<Tools[keyof Tools]> | AiError.AiError,
2108 Tool.HandlerServices<Tools[keyof Tools]> | IdGenerator
2109> => {
2110 const toolCalls: Array<Response.ToolCallPartEncoded> = []
2111
2112 for (const part of content) {
2113 if (part.type === "tool-call") {
2114 if (part.providerExecuted === true) {
2115 continue
2116 }
2117 toolCalls.push(part)
2118 }
2119 }
2120
2121 const { approved, denied } = collectToolApprovals(messages)
2122 const approvedToolCallIds = new Set(
2123 approved.map((approval) => approval.toolCallId)
2124 )
2125 const deniedByToolCallId = new Map(
2126 denied.map((denial) => [denial.toolCallId, denial])
2127 )
2128
2129 const streams = toolCalls.map((toolCall) =>
2130 Effect.gen(function*() {
2131 const tool = toolkit.tools[toolCall.name]
2132 if (!tool) {
2133 return Stream.empty
2134 }
2135
2136 if (deniedByToolCallId.has(toolCall.id)) {
2137 const denial = deniedByToolCallId.get(toolCall.id)!
2138 return Stream.succeed(
2139 Response.makePart("tool-result", {
2140 id: toolCall.id,
2141 name: toolCall.name,
2142 providerExecuted: false,
2143 isFailure: true,
2144 result: { type: "execution-denied", reason: denial.reason },
2145 encodedResult: { type: "execution-denied", reason: denial.reason },
2146 preliminary: false
2147 }) as ToolResolutionResult<Tools>
2148 )
2149 }
2150
2151 if (approvedToolCallIds.has(toolCall.id)) {
2152 return toolkit.handle(toolCall.name, toolCall.params as any, toolCall.id).pipe(
2153 Stream.unwrap,
2154 Stream.map(
2155 (result) =>
2156 Response.makePart("tool-result", {
2157 id: toolCall.id,

Callers 1

LanguageModel.tsFile · 0.85

Calls 8

collectToolApprovalsFunction · 0.85
pushMethod · 0.80
pipeMethod · 0.65
getMethod · 0.65
handleMethod · 0.65
mapMethod · 0.45
hasMethod · 0.45
succeedMethod · 0.45

Tested by

no test coverage detected