{"version":3,"sources":["../src/command.ts"],"sourcesContent":["/**\n * Copyright 2024 Bloom Labs Inc\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport type { Genkit } from 'genkit';\nimport { Message, GenerationCommonConfigSchema, z } from 'genkit';\nimport type {\n  GenerateRequest,\n  MessageData,\n  Role,\n  StreamingCallback,\n  ToolRequestPart,\n} from 'genkit';\nimport type {\n  ModelAction,\n  ToolDefinition,\n  CandidateData,\n  GenerateResponseChunkData,\n} from 'genkit/model';\nimport { modelRef } from 'genkit/model';\nimport type { CohereClient } from 'cohere-ai';\nimport { Cohere } from 'cohere-ai';\nimport type { ChatStreamEndEventFinishReason } from 'cohere-ai/api';\n\nexport const CohereConfigSchema = GenerationCommonConfigSchema.extend({\n  frequencyPenalty: z.number().min(-2).max(2).optional(),\n  logitBias: z.record(z.string(), z.number().min(-100).max(100)).optional(),\n  logProbs: z.boolean().optional(),\n  presencePenalty: z.number().min(-2).max(2).optional(),\n  seed: z.number().int().optional(),\n  topLogProbs: z.number().int().min(0).max(20).optional(),\n  user: z.string().optional(),\n  preamble: z.string().optional(),\n  promptTruncation: z\n    .nativeEnum(Cohere.ChatStreamRequestPromptTruncation)\n    .optional(),\n  conversationId: z.string().optional(),\n  // from Cohere.ChatConnector\n  connectors: z\n    .array(\n      z.object({\n        id: z.string(),\n        userAccessToken: z.string().optional(),\n        continueOnFailure: z.boolean().optional(),\n        options: z.record(z.unknown()).optional(),\n      })\n    )\n    .optional(),\n  searchQueriesOnly: z.boolean().default(false).optional(),\n  maxInputTokens: z.number().int().optional(),\n  rawPrompting: z.boolean().default(false),\n});\n\nexport const commandRPlus = modelRef({\n  name: 'cohere/command-r-plus',\n  info: {\n    versions: ['command-r-plus', 'command-r-plus-04-2024'],\n    label: 'Cohere - Command R Plus',\n    supports: {\n      multiturn: true,\n      tools: true,\n      media: false,\n      systemRole: true,\n      output: ['text'],\n    },\n  },\n  configSchema: CohereConfigSchema,\n});\n\nexport const commandR = modelRef({\n  name: 'cohere/command-r',\n  info: {\n    versions: [\n      'command-r',\n      'command-r7b-12-2024',\n      'command-r-08-2024',\n      'command-r-03-2024',\n    ],\n    label: 'Cohere - Command R',\n    supports: {\n      multiturn: true,\n      tools: true,\n      media: false,\n      systemRole: true,\n      output: ['text'],\n    },\n  },\n  configSchema: CohereConfigSchema,\n});\n\nexport const commandA = modelRef({\n  name: 'cohere/command-a',\n  info: {\n    versions: ['command-a-03-2025'],\n    label: 'Cohere - Command A',\n    supports: {\n      multiturn: true,\n      tools: true,\n      media: false,\n      systemRole: true,\n      output: ['text'],\n    },\n  },\n  configSchema: CohereConfigSchema,\n});\n\nexport const command = modelRef({\n  name: 'cohere/command',\n  info: {\n    versions: ['command', 'command-nightly'],\n    label: 'Cohere - Command',\n    supports: {\n      multiturn: true,\n      tools: true,\n      media: false,\n      systemRole: true,\n      output: ['text'],\n    },\n  },\n  configSchema: CohereConfigSchema,\n});\n\nexport const commandLight = modelRef({\n  name: 'cohere/command-light',\n  info: {\n    versions: ['command-light', 'command-light-nightly'],\n    label: 'Cohere - Command Light',\n    supports: {\n      multiturn: true,\n      tools: true,\n      media: false,\n      systemRole: true,\n      output: ['text'],\n    },\n  },\n  configSchema: CohereConfigSchema,\n});\n\nexport const SUPPORTED_COMMAND_MODELS = {\n  'command-a': commandA,\n  'command-r-plus': commandRPlus,\n  'command-r': commandR,\n  command: command,\n  'command-light': commandLight,\n};\n\nfunction toCohereRole(role: Role): Exclude<Cohere.Message['role'], 'TOOL'> {\n  switch (role) {\n    case 'user':\n      return 'USER';\n    case 'model':\n      return 'CHATBOT';\n    case 'system':\n      return 'SYSTEM';\n    case 'tool':\n      return 'CHATBOT';\n    default:\n      throw new Error(`role ${role} doesn't map to a Cohere role.`);\n  }\n}\n\nexport function jsonSchemaToPythonType(schema: Record<string, any>): string {\n  switch (schema.type) {\n    case 'string':\n      return 'str';\n    case 'number':\n      return 'float';\n    case 'integer':\n      return 'int';\n    case 'boolean':\n      return 'bool';\n    case 'array':\n      return 'List';\n    case 'object':\n      return 'Dict';\n    case 'null':\n      return 'None';\n    default:\n      throw new Error(\n        `Unsupported JSON schema type: ${JSON.stringify(schema)}`\n      );\n  }\n}\n\nexport function toCohereTool(tool: ToolDefinition): Cohere.Tool {\n  const properties = tool.inputSchema?.properties || {};\n  const parameterDefinitions =\n    Object.fromEntries<Cohere.ToolParameterDefinitionsValue>(\n      Object.entries(properties).map(([key, value]) => [\n        key,\n        {\n          type: jsonSchemaToPythonType(value as Record<string, any>),\n          required: tool.inputSchema?.required?.includes(key) || false,\n        },\n      ])\n    );\n\n  return {\n    name: tool.name,\n    description: tool.description,\n    parameterDefinitions,\n  };\n}\n\nexport function toCohereMessageHistory(\n  messages: MessageData[]\n): Exclude<Cohere.Message, Cohere.Message.Tool>[] {\n  const cohereMsgs: Exclude<Cohere.Message, Cohere.Message.Tool>[] = [];\n  for (const message of messages) {\n    const msg = new Message(message);\n    cohereMsgs.push({\n      role: toCohereRole(message.role),\n      message: msg.text,\n    });\n  }\n  return cohereMsgs;\n}\n\nconst FINISH_REASON_MAP: Record<\n  ChatStreamEndEventFinishReason,\n  CandidateData['finishReason']\n> = {\n  MAX_TOKENS: 'length',\n  ERROR_LIMIT: 'length',\n  COMPLETE: 'stop',\n  ERROR_TOXIC: 'blocked',\n  ERROR: 'other',\n};\n\nfunction fromCohereToolCall(toolCall: Cohere.ToolCall): ToolRequestPart {\n  return {\n    toolRequest: {\n      name: toolCall.name,\n      input: toolCall.parameters,\n    },\n  };\n}\n\nfunction fromCohereChatResponse(\n  response: Cohere.NonStreamedChatResponse,\n  custom?: Record<string, any>,\n  index = 0\n): CandidateData {\n  const toolRequestParts = response.toolCalls?.map(fromCohereToolCall);\n  return {\n    index: index,\n    finishReason:\n      (response.finishReason && FINISH_REASON_MAP[response.finishReason]) ||\n      'other',\n    message: {\n      role: 'model',\n      content: toolRequestParts\n        ? toolRequestParts\n        : [\n            {\n              text: response.text,\n              data: response,\n            },\n          ],\n    },\n    usage: {\n      inputTokens: response.meta?.tokens?.inputTokens,\n      outputTokens: response.meta?.tokens?.outputTokens,\n      totalTokens:\n        (response.meta?.tokens?.inputTokens || 0) +\n        (response.meta?.tokens?.outputTokens || 0),\n    },\n    custom: {\n      ...custom,\n      generation_id: response.generationId,\n    },\n  };\n}\n\nfunction fromCohereStreamEvent(\n  event: Cohere.StreamedChatResponse,\n  index: number\n): CandidateData {\n  switch (event.eventType) {\n    case 'stream-start':\n      return {\n        index: index,\n        finishReason: 'other', // Not sure if this is the appropriate finish reason\n        message: {\n          role: 'model',\n          content: [\n            {\n              text: '',\n            },\n          ],\n        },\n        custom: {\n          event_type: event.eventType,\n          generation_id: event.generationId,\n        },\n      };\n    case 'search-queries-generation':\n      return {\n        index: index,\n        finishReason: 'other', // Not sure if this is the appropriate finish reason\n        message: {\n          role: 'model',\n          content: event.searchQueries.map((query) => ({\n            // text: query.text,\n            data: query,\n          })),\n        },\n        custom: {\n          event_type: event.eventType,\n        },\n      };\n    case 'search-results':\n      return {\n        index: index,\n        finishReason: 'other', // Not sure if this is the appropriate finish reason\n        message: {\n          role: 'model',\n          content: [\n            {\n              data: {\n                search_results: event.searchResults,\n                documents: event.documents,\n              },\n            },\n          ],\n        },\n        custom: {\n          event_type: event.eventType,\n        },\n      };\n    case 'citation-generation':\n      return {\n        index: index,\n        finishReason: 'other', // Not sure if this is the appropriate finish reason\n        message: {\n          role: 'model',\n          content: event.citations.map((citation) => ({\n            // text: citation.text,\n            data: citation,\n          })),\n        },\n        custom: {\n          event_type: event.eventType,\n        },\n      };\n    case 'tool-calls-generation':\n      return {\n        index: index,\n        finishReason: 'other', // Not sure if this is the appropriate finish reason\n        message: {\n          role: 'model',\n          content: event.toolCalls.map((toolCall) =>\n            fromCohereToolCall(toolCall)\n          ),\n        },\n        custom: {\n          event_type: event.eventType,\n        },\n      };\n    case 'text-generation':\n      return {\n        index: index,\n        finishReason: 'other', // Not sure if this is the appropriate finish reason\n        message: {\n          role: 'model',\n          content: [\n            {\n              text: event.text,\n            },\n          ],\n        },\n        custom: {\n          event_type: event.eventType,\n        },\n      };\n    case 'stream-end':\n      return fromCohereChatResponse(\n        event.response,\n        {\n          event_type: event.eventType,\n        },\n        index\n      );\n    default:\n      throw new Error(`Unsupported event type for event: ${event}`);\n  }\n}\n\n// TODO: Implement this function\n// function toCohereToolResult(\n//   message: MessageData\n// ): Cohere.ChatRequestToolResultsItem {\n//   return {\n//     call: {\n//         name: message.content?.[0]?.toolRequest?.name || \"\",\n//         parameters: message.content?.[0]?.toolRequest?.input || {},\n//     },\n//     outputs: (Array.isArray(message.content[0].toolResponse) ? message.content[0].toolResponse : [message.content[0].toolResponse].filter(Boolean)) as Record<string, unknown>[],\n//   };\n// }\n\nexport function toCohereRequestBody(\n  modelName: string,\n  request: GenerateRequest<typeof CohereConfigSchema>\n): Cohere.ChatRequest | Cohere.ChatStreamRequest {\n  // Note: these types are the same in the Cohere API (not on the surface, e.g. one uses ChatRequestToolResultsItem and the other uses ChatStreamRequestToolResultsItem, but when the types are unwrapped they are exactly the same)\n  const model = SUPPORTED_COMMAND_MODELS[modelName];\n  if (!model) throw new Error(`Unsupported model: ${modelName}`);\n  const mappedModelName = request.config?.version || model.version || modelName;\n  const messageHistory = toCohereMessageHistory(request.messages);\n  const body: Cohere.ChatRequest = {\n    message: messageHistory[0].message,\n    model: mappedModelName,\n    preamble: request.config?.preamble,\n    chatHistory: messageHistory,\n    conversationId: request.config?.conversationId,\n    promptTruncation: request.config?.promptTruncation,\n    connectors: request.config?.connectors,\n    searchQueriesOnly: request.config?.searchQueriesOnly,\n    // Use Genkit retriever and pass documents as context in the generate call\n    // documents: request.config?.documents,\n    temperature: request.config?.temperature,\n    maxTokens: request.config?.maxOutputTokens,\n    maxInputTokens: request.config?.maxInputTokens,\n    k: request.config?.topK,\n    p: request.config?.topP,\n    seed: request.config?.seed,\n    stopSequences: request.config?.stopSequences,\n    frequencyPenalty: request.config?.frequencyPenalty,\n    presencePenalty: request.config?.presencePenalty,\n    rawPrompting: request.config?.rawPrompting,\n    tools: request.tools?.map(toCohereTool),\n    // toolResults: request.messages?.map(toCohereToolResult),\n  };\n\n  for (const key in body) {\n    if (!body[key] || (Array.isArray(body[key]) && !body[key].length))\n      delete body[key];\n  }\n  return body;\n}\n\n/**\n *\n */\nexport function commandModel(\n  ai: Genkit,\n  name: string,\n  client: CohereClient\n): ModelAction<typeof CohereConfigSchema> {\n  const modelId = `cohere/${name}`;\n  const model = SUPPORTED_COMMAND_MODELS[name];\n  if (!model) throw new Error(`Unsupported model: ${name}`);\n\n  return ai.defineModel(\n    {\n      name: modelId,\n      ...model.info,\n      configSchema: SUPPORTED_COMMAND_MODELS[name].configSchema,\n    },\n    async (\n      request,\n      streamingCallback?: StreamingCallback<GenerateResponseChunkData>\n    ): Promise<{\n      candidates: CandidateData[];\n      usage: {\n        inputTokens: number | undefined;\n        outputTokens: number | undefined;\n        totalTokens: number;\n      };\n      custom: Cohere.NonStreamedChatResponse;\n    }> => {\n      let response: Cohere.NonStreamedChatResponse | undefined;\n      const body = toCohereRequestBody(name, request);\n      if (streamingCallback) {\n        // Based on these docs: https://docs.cohere.com/docs/streaming\n        const stream = await client.chatStream(body);\n        let eventIndex = 0;\n        for await (const event of stream) {\n          const c = fromCohereStreamEvent(event, eventIndex);\n          streamingCallback({\n            index: c.index,\n            content: c.message.content,\n            custom: c.custom,\n          });\n          eventIndex++;\n          if (event.eventType === 'stream-end') {\n            response = event.response;\n            break;\n          }\n        }\n      } else {\n        response = await client.chat(body);\n      }\n      if (response === undefined) {\n        throw new Error(\n          'No response from Cohere API, or stream ended unexpectedly.'\n        );\n      }\n      return {\n        candidates: [fromCohereChatResponse(response)],\n        usage: {\n          inputTokens: response.meta?.tokens?.inputTokens,\n          outputTokens: response.meta?.tokens?.outputTokens,\n          totalTokens:\n            (response.meta?.tokens?.inputTokens || 0) +\n            (response.meta?.tokens?.outputTokens || 0),\n        },\n        custom: response,\n      };\n    }\n  );\n}\n"],"mappings":"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","names":["_a"]}