From 096e0ac29fb757ef1ff2eab42ed977b8186046f3 Mon Sep 17 00:00:00 2001 From: Austen Stone Date: Wed, 6 Nov 2024 20:33:56 -0500 Subject: [PATCH 1/3] working copilot_ide_code_completions --- .../src/controllers/metrics.controller.new.ts | 126 + backend/src/database.ts | 25 +- .../models/metrics.model.new.interfaces.ts | 86 + backend/src/models/metrics.model.new.ts | 310 + backend/src/routes/index.ts | 3 + backend/src/services/metrics.service.ts | 34 +- metrics.json | 6743 +++++++++++++++++ 7 files changed, 7318 insertions(+), 9 deletions(-) create mode 100644 backend/src/controllers/metrics.controller.new.ts create mode 100644 backend/src/models/metrics.model.new.interfaces.ts create mode 100644 backend/src/models/metrics.model.new.ts create mode 100644 metrics.json diff --git a/backend/src/controllers/metrics.controller.new.ts b/backend/src/controllers/metrics.controller.new.ts new file mode 100644 index 0000000..95656fa --- /dev/null +++ b/backend/src/controllers/metrics.controller.new.ts @@ -0,0 +1,126 @@ +import { Request, Response } from 'express'; +import { DailyMetric, Editor, IdeCompletions, LanguageStats, ModelStats } from '../models/metrics.model.new'; +import { Op } from 'sequelize'; + +class MetricsControllerNew { + // Get all metrics 📊 + async getAllMetrics(req: Request, res: Response): Promise { + const { since, until, editor, language, model } = req.query; + try { + // consider the fact that these are UTC dates... + const dateFilter: any = { }; + if (since) { + dateFilter[Op.gte] = new Date(since as string); + } + if (until) { + dateFilter[Op.lte] = new Date(until as string); + } + + console.log(Object.getOwnPropertySymbols(dateFilter).length, { date: dateFilter }); + const metrics = await DailyMetric.findAll({ + where: Object.getOwnPropertySymbols(dateFilter).length ? { date: dateFilter } : {}, + include: [{ + attributes: { exclude: ['id'] }, + model: IdeCompletions, + as: 'copilot_ide_code_completions', + include: [{ + attributes: { exclude: ['id', 'ideCompletionId'] }, + model: Editor, + as: 'editors', + where: editor ? { name: editor } : {}, + required: false, + include: [{ + attributes: { exclude: ['id', 'editorId'] }, + model: ModelStats, + as: 'models', + where: model ? { name: model } : {}, + required: false, + include: [{ + where: language ? { name: language } : {}, + required: false, + attributes: { exclude: ['id', 'modelStatId'] }, + model: LanguageStats, + as: 'languages', + }] + }] + }] + }] + }); + res.status(200).json(metrics); // 🎉 All metrics retrieved! + } catch (error) { + console.log(error) + res.status(500).json(error); // 🚨 Error handling + } + } + + async getMetricsByDay(req: Request, res: Response): Promise { + const { date } = req.params; + try { + const metrics = await DailyMetric.findOne({ + where: { date: date }, + include: [{ + attributes: { exclude: ['id'] }, + model: IdeCompletions, + as: 'copilot_ide_code_completions', + required: false, + include: [{ + attributes: { exclude: ['id', 'ideCompletionId'] }, + model: Editor, + as: 'editors', + include: [{ + attributes: { exclude: ['id', 'editorId'] }, + model: ModelStats, + as: 'models', + include: [{ + attributes: { exclude: ['id', 'modelStatId'] }, + model: LanguageStats, + as: 'languages', + }] + }] + }] + }] + }); + res.status(200).json(metrics); // 🎉 All metrics retrieved! + } catch (error) { + console.log(error) + res.status(500).json(error); // 🚨 Error handling + } + } + + async getMetricsByEditor(req: Request, res: Response): Promise { + const { editor } = req.params; + try { + const metrics = await DailyMetric.findAll({ + include: [{ + attributes: { exclude: ['id'] }, + model: IdeCompletions, + as: 'copilot_ide_code_completions', + required: false, + include: [{ + attributes: { exclude: ['id', 'ideCompletionId'] }, + model: Editor, + as: 'editors', + where: { name: editor }, + include: [{ + attributes: { exclude: ['id', 'editorId'] }, + model: ModelStats, + as: 'models', + include: [{ + attributes: { exclude: ['id', 'modelStatId'] }, + model: LanguageStats, + as: 'languages', + }] + }] + }] + }] + }); + res.status(200).json(metrics); // 🎉 All metrics retrieved! + } catch (error) { + console.log(error) + res.status(500).json(error); // 🚨 Error handling + } + } + +} + +export default new MetricsControllerNew(); \ No newline at end of file diff --git a/backend/src/database.ts b/backend/src/database.ts index 111a35f..25217d6 100644 --- a/backend/src/database.ts +++ b/backend/src/database.ts @@ -4,29 +4,48 @@ import { Metrics, Breakdown } from './models/metrics.model'; import { Survey } from './models/survey.model'; import { Assignee, AssigningTeam, Seat } from './models/copilot.seats'; import logger from './services/logger'; +import mysql2 from 'mysql2/promise'; const sequelize = new Sequelize({ dialect: 'mysql', - database: process.env.MYSQL_DATABASE || 'value', - username: process.env.MYSQL_USER || 'root', - password: process.env.MYSQL_PASSWORD || 'octocat', host: process.env.MYSQL_HOST || 'localhost', port: parseInt(process.env.MYSQL_PORT || '3306'), + username: process.env.MYSQL_USER || 'root', + password: process.env.MYSQL_PASSWORD || 'octocat', + database: process.env.MYSQL_DATABASE || 'value', logging: (sql: string, timing?: number) => { logger.info(sql); } }); const dbConnect = async () => { + try { + const connection = await mysql2.createConnection({ + host: process.env.MYSQL_HOST || 'localhost', + port: parseInt(process.env.MYSQL_PORT || '3306'), + user: process.env.MYSQL_USER || 'root', + password: process.env.MYSQL_PASSWORD || 'octocat', + }); + + const query = await connection.query(`CREATE DATABASE IF NOT EXISTS \`value\`;`,); + + console.log(query); + await connection.end(); + } catch (error) { + logger.error('Unable to connect to the database', error); + throw error; + } try { await sequelize.authenticate() await sequelize.sync({ force: false }).then(() => { logger.info('All models were synchronized successfully. 🚀'); }).catch((error) => { + console.log(error); logger.error('Error synchronizing models', error); }); } catch (error) { logger.info('Unable to initialize the database', error); + throw error; } }; diff --git a/backend/src/models/metrics.model.new.interfaces.ts b/backend/src/models/metrics.model.new.interfaces.ts new file mode 100644 index 0000000..c4f6014 --- /dev/null +++ b/backend/src/models/metrics.model.new.interfaces.ts @@ -0,0 +1,86 @@ +// Core metrics interfaces 📊 +interface LanguageMetrics { + name: string; + total_engaged_users: number; + total_code_suggestions?: number; + total_code_acceptances?: number; + total_code_lines_suggested?: number; + total_code_lines_accepted?: number; +} + +interface ModelBase { + name: string; + is_custom_model: boolean; + custom_model_training_date: string | null; + total_engaged_users: number; +} + +interface CodeModel extends ModelBase { + languages: LanguageMetrics[]; +} + +interface ChatModel extends ModelBase { + total_chats: number; + total_chat_insertion_events?: number; + total_chat_copy_events?: number; +} + +interface DotComChatModel extends ModelBase { + total_chats: number; +} + +interface PullRequestModel extends ModelBase { + total_pr_summaries_created: number; +} + +// Editor and repository interfaces 🖥️ +interface Editor { + name: string; + total_engaged_users: number; + models: (CodeModel | ChatModel)[]; +} + +interface Repository { + name: string; + total_engaged_users: number; + models: PullRequestModel[]; +} + +// Feature-specific interfaces 🚀 +interface IdeCodeCompletions { + total_engaged_users: number; + languages: LanguageMetrics[]; + editors: Editor[]; +} + +interface IdeChat { + total_engaged_users: number; + editors: Editor[]; +} + +interface DotComChat { + total_engaged_users: number; + models: DotComChatModel[]; +} + +interface DotComPullRequests { + total_engaged_users: number; + repositories: Repository[]; +} + +// Main metrics interface 📈 +interface CopilotMetrics { + date: string; + total_active_users: number; + total_engaged_users: number; + copilot_ide_code_completions: IdeCodeCompletions | null; + copilot_ide_chat: IdeChat | null; + copilot_dotcom_chat: DotComChat | null; + copilot_dotcom_pull_requests: DotComPullRequests | null; +} + +type CopilotMetricsArray = CopilotMetrics[]; + +export { + CopilotMetrics +} \ No newline at end of file diff --git a/backend/src/models/metrics.model.new.ts b/backend/src/models/metrics.model.new.ts new file mode 100644 index 0000000..055ed7f --- /dev/null +++ b/backend/src/models/metrics.model.new.ts @@ -0,0 +1,310 @@ +// models/daily-metric.ts +import { Model, DataTypes, Sequelize } from 'sequelize'; +import { sequelize } from '../database'; +import { CopilotMetrics } from './metrics.model.new.interfaces'; + +// Main metric model 📈 +export class DailyMetric extends Model { + public date!: Date; + public total_active_users!: number; + public total_engaged_users!: number; + public total_code_acceptances!: number; + public total_code_suggestions!: number; + public total_code_lines_accepted!: number; + public total_code_lines_suggested!: number; +} + +// IDE Completions model 🖥️ +export class IdeCompletions extends Model { + public id!: number; + public total_engaged_users!: number; + public total_code_acceptances!: number; + public total_code_suggestions!: number; + public total_code_lines_accepted!: number; + public total_code_lines_suggested!: number; + public dailyMetricDate!: Date; +} + +export class Editor extends Model { + public id!: number; + public name!: string; + public total_engaged_users!: number; + public total_code_acceptances!: number; + public total_code_suggestions!: number; + public total_code_lines_accepted!: number; + public total_code_lines_suggested!: number; + public ideCompletionId!: number; +} + +export class ModelStats extends Model { + public id!: number; + public name!: string; + public is_custom_model!: boolean; + public total_engaged_users!: number; + public total_code_acceptances!: number; + public total_code_suggestions!: number; + public total_code_lines_accepted!: number; + public total_code_lines_suggested!: number; + public editorId!: number; +} + +export class LanguageStats extends Model { + public id!: number; + public name!: string; + public total_engaged_users!: number; + public total_code_acceptances!: number; + public total_code_suggestions!: number; + public total_code_lines_accepted!: number; + public total_code_lines_suggested!: number; + public modelStatId!: number; +} + + +// Initialize models +DailyMetric.init({ + date: { + type: DataTypes.DATEONLY, + primaryKey: true + }, + total_active_users: DataTypes.INTEGER, + total_engaged_users: DataTypes.INTEGER, + total_code_acceptances: DataTypes.INTEGER, + total_code_suggestions: DataTypes.INTEGER, + total_code_lines_accepted: DataTypes.INTEGER, + total_code_lines_suggested: DataTypes.INTEGER +}, { + sequelize, + timestamps: false +}); + +IdeCompletions.init({ + id: { + type: DataTypes.INTEGER, + primaryKey: true, + autoIncrement: true + }, + total_engaged_users: DataTypes.INTEGER, + total_code_acceptances: DataTypes.INTEGER, + total_code_suggestions: DataTypes.INTEGER, + total_code_lines_accepted: DataTypes.INTEGER, + total_code_lines_suggested: DataTypes.INTEGER +}, { + sequelize, + timestamps: false +}); + +Editor.init({ + id: { + type: DataTypes.INTEGER, + primaryKey: true, + autoIncrement: true + }, + name: DataTypes.STRING, + total_engaged_users: DataTypes.INTEGER, + total_code_acceptances: DataTypes.INTEGER, + total_code_suggestions: DataTypes.INTEGER, + total_code_lines_accepted: DataTypes.INTEGER, + total_code_lines_suggested: DataTypes.INTEGER +}, { + sequelize, + timestamps: false +}); + +ModelStats.init({ + id: { + type: DataTypes.INTEGER, + primaryKey: true, + autoIncrement: true + }, + name: DataTypes.STRING, + is_custom_model: DataTypes.BOOLEAN, + total_engaged_users: DataTypes.INTEGER, + total_code_acceptances: DataTypes.INTEGER, + total_code_suggestions: DataTypes.INTEGER, + total_code_lines_accepted: DataTypes.INTEGER, + total_code_lines_suggested: DataTypes.INTEGER +}, { + sequelize, + timestamps: false +}); + +LanguageStats.init({ + id: { + type: DataTypes.INTEGER, + primaryKey: true, + autoIncrement: true + }, + name: DataTypes.STRING, + total_engaged_users: DataTypes.INTEGER, + total_code_acceptances: DataTypes.INTEGER, + total_code_suggestions: DataTypes.INTEGER, + total_code_lines_accepted: DataTypes.INTEGER, + total_code_lines_suggested: DataTypes.INTEGER +}, { + sequelize, + timestamps: false +}); + +// Set up associations 🔗 +DailyMetric.hasOne(IdeCompletions, { + as: 'copilot_ide_code_completions', // This matches your response structure + foreignKey: 'dailyMetricDate', + sourceKey: 'date' +}); +IdeCompletions.belongsTo(DailyMetric, { + as: 'DailyMetric', + foreignKey: 'dailyMetricDate', + targetKey: 'date' +}); + +IdeCompletions.hasMany(Editor, { + as: 'editors', // Match the response structure + foreignKey: 'ideCompletionId' +}); +Editor.belongsTo(IdeCompletions, { + as: 'copilot_ide_code_completions', + foreignKey: 'ideCompletionId' +}); + +Editor.hasMany(ModelStats, { + as: 'models', // Match API response structure + foreignKey: 'editorId' // Use consistent casing +}); +ModelStats.belongsTo(Editor, { + as: 'editor', + foreignKey: 'editorId' // Match the foreign key name +}); + +ModelStats.hasMany(LanguageStats, { + as: 'languages', + foreignKey: 'modelStatId' +}); +LanguageStats.belongsTo(ModelStats, { + as: 'model', + foreignKey: 'modelStatId' +}); + +export async function insertDailyMetrics(data: CopilotMetrics[]) { + for (const day of data) { + const date = new Date(day.date); + // Create DailyMetric first 📅 + const metric = await DailyMetric.create({ + date: date, + total_active_users: day.total_active_users, + total_engaged_users: day.total_engaged_users, + total_code_acceptances: 0, + total_code_suggestions: 0, + total_code_lines_accepted: 0, + total_code_lines_suggested: 0 + }); + + if (day.copilot_ide_code_completions) { + // Create IdeCompletions second 🖥️ + const completions = await IdeCompletions.create({ + total_engaged_users: day.copilot_ide_code_completions.total_engaged_users, + dailyMetricDate: date, + total_code_acceptances: 0, + total_code_suggestions: 0, + total_code_lines_accepted: 0, + total_code_lines_suggested: 0 + }); + + let dailyTotals = { acceptances: 0, suggestions: 0, linesAccepted: 0, linesSuggested: 0 }; + + // Process editors third 👨‍💻 + for (const editor of day.copilot_ide_code_completions.editors) { + const editorRecord = await Editor.create({ + name: editor.name, + total_engaged_users: editor.total_engaged_users, + ideCompletionId: completions.id, + total_code_acceptances: 0, + total_code_suggestions: 0, + total_code_lines_accepted: 0, + total_code_lines_suggested: 0 + }); + + let editorTotals = { acceptances: 0, suggestions: 0, linesAccepted: 0, linesSuggested: 0 }; + + // Process models fourth 🤖 + for (const model of editor.models) { + const modelRecord = await ModelStats.create({ + name: model.name, + is_custom_model: model.is_custom_model, + total_engaged_users: model.total_engaged_users, + editorId: editorRecord.id, + total_code_acceptances: 0, + total_code_suggestions: 0, + total_code_lines_accepted: 0, + total_code_lines_suggested: 0 + }); + + let modelTotals = { acceptances: 0, suggestions: 0, linesAccepted: 0, linesSuggested: 0 }; + + // Process languages last 🗣️ + if ('languages' in model) { + for (const lang of model.languages) { + await LanguageStats.create({ + name: lang.name, + total_engaged_users: lang.total_engaged_users, + total_code_acceptances: lang.total_code_acceptances, + total_code_suggestions: lang.total_code_suggestions, + total_code_lines_accepted: lang.total_code_lines_accepted, + total_code_lines_suggested: lang.total_code_lines_suggested, + modelStatId: modelRecord.id + }); + + // Roll up language totals to model 📈 + modelTotals.acceptances += lang.total_code_acceptances || 0; + modelTotals.suggestions += lang.total_code_suggestions || 0; + modelTotals.linesAccepted += lang.total_code_lines_accepted || 0; + modelTotals.linesSuggested += lang.total_code_lines_suggested || 0; + } + } + + // Update model with totals ⬆️ + await modelRecord.update({ + total_code_acceptances: modelTotals.acceptances, + total_code_suggestions: modelTotals.suggestions, + total_code_lines_accepted: modelTotals.linesAccepted, + total_code_lines_suggested: modelTotals.linesSuggested + }); + + // Roll up model totals to editor 📊 + editorTotals.acceptances += modelTotals.acceptances; + editorTotals.suggestions += modelTotals.suggestions; + editorTotals.linesAccepted += modelTotals.linesAccepted; + editorTotals.linesSuggested += modelTotals.linesSuggested; + } + + // Update editor with totals ⬆️ + await editorRecord.update({ + total_code_acceptances: editorTotals.acceptances, + total_code_suggestions: editorTotals.suggestions, + total_code_lines_accepted: editorTotals.linesAccepted, + total_code_lines_suggested: editorTotals.linesSuggested + }); + + // Roll up editor totals to daily 📅 + dailyTotals.acceptances += editorTotals.acceptances; + dailyTotals.suggestions += editorTotals.suggestions; + dailyTotals.linesAccepted += editorTotals.linesAccepted; + dailyTotals.linesSuggested += editorTotals.linesSuggested; + } + + // Update final totals ⬆️ + await completions.update({ + total_code_acceptances: dailyTotals.acceptances, + total_code_suggestions: dailyTotals.suggestions, + total_code_lines_accepted: dailyTotals.linesAccepted, + total_code_lines_suggested: dailyTotals.linesSuggested + }); + + await metric.update({ + total_code_acceptances: dailyTotals.acceptances, + total_code_suggestions: dailyTotals.suggestions, + total_code_lines_accepted: dailyTotals.linesAccepted, + total_code_lines_suggested: dailyTotals.linesSuggested + }); + } + } +} \ No newline at end of file diff --git a/backend/src/routes/index.ts b/backend/src/routes/index.ts index 16881ce..7423002 100644 --- a/backend/src/routes/index.ts +++ b/backend/src/routes/index.ts @@ -4,6 +4,7 @@ import metricsController from '../controllers/metrics.controller'; import settingsController from '../controllers/settings.controller'; import setupController from '../controllers/setup.controller'; import SeatsController from '../controllers/seats.controller'; +import metricsControllerNew from '../controllers/metrics.controller.new'; const router = Router(); @@ -20,6 +21,8 @@ router.delete('/survey/:id', SurveyController.deleteSurvey); router.get('/metrics', metricsController.getAllMetrics); router.get('/metrics/:day', metricsController.getMetricsByDay); +router.get('/metrics-new', metricsControllerNew.getAllMetrics); + router.get('/seats', SeatsController.getAllSeats); router.get('/seats/:login', SeatsController.getSeatByLogin); router.get('/seats/:login/activity', SeatsController.getSeatActivityByLogin); diff --git a/backend/src/services/metrics.service.ts b/backend/src/services/metrics.service.ts index 76e0252..fd49641 100644 --- a/backend/src/services/metrics.service.ts +++ b/backend/src/services/metrics.service.ts @@ -3,6 +3,9 @@ import { Metrics, Breakdown } from '../models/metrics.model'; import setup from './setup'; import logger from "./logger"; import { Assignee, AssigningTeam, Seat } from '../models/copilot.seats'; +import { writeFileSync } from 'fs'; +import { insertDailyMetrics } from '../models/metrics.model.new'; +import { CopilotMetrics } from '../models/metrics.model.new.interfaces'; class MetricsService { private static instance: MetricsService; @@ -15,7 +18,8 @@ class MetricsService { private async cronTask() { // this.queryCopilotUsageMetrics(); - this.queryCopilotSeatAssignments(); + // this.queryCopilotUsageMetricsNew(); + // this.queryCopilotSeatAssignments(); } public static createInstance(cronExpression: string, timeZone: string) { @@ -28,6 +32,25 @@ class MetricsService { return MetricsService.instance; } + public async queryCopilotUsageMetricsNew() { + try { + const octokit = await setup.getOctokit(); + const response = await octokit.paginate('GET /orgs/{org}/copilot/metrics', { + org: setup.installation.owner?.login, + headers: { + 'X-GitHub-Api-Version': '2022-11-28' + } + }); + const metricsArray = response; + writeFileSync('../metrics.json', JSON.stringify(metricsArray, null, 2)); + + await insertDailyMetrics(metricsArray); + } catch (error) { + console.log(error); + logger.error('Error querying copilot metrics', error); + } + } + public async queryCopilotUsageMetrics() { try { const octokit = await setup.getOctokit(); @@ -53,7 +76,7 @@ class MetricsService { if (!created) { logger.info(`Metrics for ${metrics.day} already exist. Updating... ✏️`); - + await createdMetrics.update({ totalSuggestionsCount: metrics.total_suggestions_count, totalAcceptancesCount: metrics.total_acceptances_count, @@ -64,7 +87,7 @@ class MetricsService { totalChatTurns: metrics.total_chat_turns, totalActiveChatUsers: metrics.total_active_chat_users, }); - + await Breakdown.destroy({ where: { metricsDay: metrics.day } }); } @@ -104,7 +127,6 @@ class MetricsService { // eslint-disable-next-line @typescript-eslint/no-explicit-any seats: (_seatAssignments).reduce((acc, rsp) => acc.concat(rsp.seats), [] as any[]) }; - console.log(seatAssignments) if (!seatAssignments.seats) { logger.info(`No seat assignment data found. Skipping...`); @@ -134,7 +156,7 @@ class MetricsService { site_admin: seat.assignee.site_admin, } }); - + const assigningTeam = seat.assigning_team ? await AssigningTeam.findOrCreate({ where: { id: seat.assigning_team.id }, defaults: { @@ -164,7 +186,7 @@ class MetricsService { assigningTeamId: assigningTeam ? seat.assigning_team?.id : null, }); } - + logger.info("Seat assignments successfully updated! ✅"); } catch (error) { logger.error('Error querying copilot seat assignments', error); diff --git a/metrics.json b/metrics.json new file mode 100644 index 0000000..431a313 --- /dev/null +++ b/metrics.json @@ -0,0 +1,6743 @@ +[ + { + "date": "2024-10-25", + "copilot_ide_chat": { + "editors": [ + { + "name": "vscode", + "models": [ + { + "name": "default", + "total_chats": 2656, + "is_custom_model": false, + "total_engaged_users": 100, + "total_chat_copy_events": 163, + "total_chat_insertion_events": 152 + } + ], + "total_engaged_users": 100 + }, + { + "name": "JetBrains", + "models": [ + { + "name": "default", + "total_chats": 12, + "is_custom_model": false, + "total_engaged_users": 1, + "total_chat_copy_events": 2, + "total_chat_insertion_events": 3 + } + ], + "total_engaged_users": 1 + } + ], + "total_engaged_users": 100 + }, + "total_active_users": 150, + "copilot_dotcom_chat": { + "models": [ + { + "name": "default", + "total_chats": 151, + "is_custom_model": false, + "total_engaged_users": 33 + } + ], + "total_engaged_users": 33 + }, + "total_engaged_users": 150, + "copilot_dotcom_pull_requests": { + "repositories": [ + { + "name": "beat-bot", + "models": [ + { + "name": "default", + "is_custom_model": false, + "total_engaged_users": 1, + "total_pr_summaries_created": 1 + } + ], + "total_engaged_users": 1 + }, + { + "name": "monorepo-code-scanning-action", + "models": [ + { + "name": "default", + "is_custom_model": false, + "total_engaged_users": 1, + "total_pr_summaries_created": 1 + } + ], + "total_engaged_users": 1 + }, + { + "name": "Travel", + "models": [ + { + "name": "default", + "is_custom_model": false, + "total_engaged_users": 1, + "total_pr_summaries_created": 1 + } + ], + "total_engaged_users": 1 + }, + { + "name": "customer-feedback", + "models": [ + { + "name": "default", + "is_custom_model": false, + "total_engaged_users": 1, + "total_pr_summaries_created": 1 + } + ], + "total_engaged_users": 1 + }, + { + "name": "releases", + "models": [ + { + "name": "default", + "is_custom_model": false, + "total_engaged_users": 1, + "total_pr_summaries_created": 4 + } + ], + "total_engaged_users": 1 + }, + { + "name": "Copilot-Sandbox", + "models": [ + { + "name": "default", + "is_custom_model": false, + "total_engaged_users": 1, + "total_pr_summaries_created": 1 + } + ], + "total_engaged_users": 1 + }, + { + "name": "OctoFitApp-Universe2024", + "models": [ + { + "name": "default", + "is_custom_model": false, + "total_engaged_users": 2, + "total_pr_summaries_created": 5 + } + ], + "total_engaged_users": 2 + }, + { + "name": "constellation-india2024-site", + "models": [ + { + "name": "default", + "is_custom_model": false, + "total_engaged_users": 1, + "total_pr_summaries_created": 1 + } + ], + "total_engaged_users": 1 + }, + { + "name": "mish-friendly-food", + "models": [ + { + "name": "default", + "is_custom_model": false, + "total_engaged_users": 1, + "total_pr_summaries_created": 1 + } + ], + "total_engaged_users": 1 + }, + { + "name": "windr-core", + "models": [ + { + "name": "default", + "is_custom_model": false, + "total_engaged_users": 1, + "total_pr_summaries_created": 3 + } + ], + "total_engaged_users": 1 + }, + { + "name": "solutions-engineering", + "models": [ + { + "name": "default", + "is_custom_model": false, + "total_engaged_users": 1, + "total_pr_summaries_created": 1 + } + ], + "total_engaged_users": 1 + }, + { + "name": "", + "models": [ + { + "name": "default", + "is_custom_model": false, + "total_engaged_users": 1, + "total_pr_summaries_created": 1 + } + ], + "total_engaged_users": 1 + }, + { + "name": "westpac-bank", + "models": [ + { + "name": "default", + "is_custom_model": false, + "total_engaged_users": 1, + "total_pr_summaries_created": 3 + } + ], + "total_engaged_users": 1 + }, + { + "name": "services", + "models": [ + { + "name": "default", + "is_custom_model": false, + "total_engaged_users": 1, + "total_pr_summaries_created": 1 + } + ], + "total_engaged_users": 1 + }, + { + "name": "cs-js-demo01", + "models": [ + { + "name": "default", + "is_custom_model": false, + "total_engaged_users": 1, + "total_pr_summaries_created": 1 + } + ], + "total_engaged_users": 1 + }, + { + "name": "galaxy-india-app", + "models": [ + { + "name": "default", + "is_custom_model": false, + "total_engaged_users": 1, + "total_pr_summaries_created": 2 + } + ], + "total_engaged_users": 1 + } + ], + "total_engaged_users": 14 + }, + "copilot_ide_code_completions": { + "editors": [ + { + "name": "VisualStudio", + "models": [ + { + "name": "default", + "languages": [ + { + "name": "fsharp", + "total_engaged_users": 2, + "total_code_acceptances": 13, + "total_code_suggestions": 44, + "total_code_lines_accepted": 13, + "total_code_lines_suggested": 44 + }, + { + "name": "cpp", + "total_engaged_users": 2, + "total_code_acceptances": 5, + "total_code_suggestions": 19, + "total_code_lines_accepted": 5, + "total_code_lines_suggested": 27 + }, + { + "name": "csharp", + "total_engaged_users": 1, + "total_code_acceptances": 0, + "total_code_suggestions": 2, + "total_code_lines_accepted": 0, + "total_code_lines_suggested": 9 + } + ], + "is_custom_model": false, + "total_engaged_users": 3 + } + ], + "total_engaged_users": 3 + }, + { + "name": "vscode", + "models": [ + { + "name": "default", + "languages": [ + { + "name": "typescript", + "total_engaged_users": 11, + "total_code_acceptances": 440, + "total_code_suggestions": 1077, + "total_code_lines_accepted": 402, + "total_code_lines_suggested": 1513 + }, + { + "name": "dotenv", + "total_engaged_users": 3, + "total_code_acceptances": 7, + "total_code_suggestions": 31, + "total_code_lines_accepted": 7, + "total_code_lines_suggested": 35 + }, + { + "name": "python", + "total_engaged_users": 12, + "total_code_acceptances": 320, + "total_code_suggestions": 705, + "total_code_lines_accepted": 484, + "total_code_lines_suggested": 1133 + }, + { + "name": "sql", + "total_engaged_users": 5, + "total_code_acceptances": 12, + "total_code_suggestions": 28, + "total_code_lines_accepted": 25, + "total_code_lines_suggested": 67 + }, + { + "name": "typescriptreact", + "total_engaged_users": 13, + "total_code_acceptances": 221, + "total_code_suggestions": 604, + "total_code_lines_accepted": 201, + "total_code_lines_suggested": 984 + }, + { + "name": "terraform", + "total_engaged_users": 2, + "total_code_acceptances": 7, + "total_code_suggestions": 10, + "total_code_lines_accepted": 5, + "total_code_lines_suggested": 14 + }, + { + "name": "ruby", + "total_engaged_users": 16, + "total_code_acceptances": 342, + "total_code_suggestions": 1074, + "total_code_lines_accepted": 266, + "total_code_lines_suggested": 1428 + }, + { + "name": "yaml", + "total_engaged_users": 14, + "total_code_acceptances": 75, + "total_code_suggestions": 290, + "total_code_lines_accepted": 121, + "total_code_lines_suggested": 525 + }, + { + "name": "csharp", + "total_engaged_users": 3, + "total_code_acceptances": 57, + "total_code_suggestions": 140, + "total_code_lines_accepted": 45, + "total_code_lines_suggested": 373 + }, + { + "name": "markdown", + "total_engaged_users": 18, + "total_code_acceptances": 297, + "total_code_suggestions": 1642, + "total_code_lines_accepted": 353, + "total_code_lines_suggested": 2281 + }, + { + "name": "css", + "total_engaged_users": 2, + "total_code_acceptances": 1, + "total_code_suggestions": 3, + "total_code_lines_accepted": 1, + "total_code_lines_suggested": 5 + }, + { + "name": "javascript", + "total_engaged_users": 17, + "total_code_acceptances": 293, + "total_code_suggestions": 968, + "total_code_lines_accepted": 397, + "total_code_lines_suggested": 2106 + }, + { + "name": "jsonc", + "total_engaged_users": 2, + "total_code_acceptances": 1, + "total_code_suggestions": 22, + "total_code_lines_accepted": 1, + "total_code_lines_suggested": 62 + }, + { + "name": "unknown", + "total_engaged_users": 9, + "total_code_acceptances": 53, + "total_code_suggestions": 219, + "total_code_lines_accepted": 86, + "total_code_lines_suggested": 470 + }, + { + "name": "html", + "total_engaged_users": 6, + "total_code_acceptances": 33, + "total_code_suggestions": 95, + "total_code_lines_accepted": 31, + "total_code_lines_suggested": 307 + }, + { + "name": "dockerfile", + "total_engaged_users": 4, + "total_code_acceptances": 22, + "total_code_suggestions": 36, + "total_code_lines_accepted": 19, + "total_code_lines_suggested": 42 + }, + { + "name": "ini", + "total_engaged_users": 2, + "total_code_acceptances": 2, + "total_code_suggestions": 18, + "total_code_lines_accepted": 1, + "total_code_lines_suggested": 20 + }, + { + "name": "scss", + "total_engaged_users": 3, + "total_code_acceptances": 47, + "total_code_suggestions": 202, + "total_code_lines_accepted": 92, + "total_code_lines_suggested": 572 + }, + { + "name": "shellscript", + "total_engaged_users": 3, + "total_code_acceptances": 7, + "total_code_suggestions": 29, + "total_code_lines_accepted": 14, + "total_code_lines_suggested": 45 + }, + { + "name": "java", + "total_engaged_users": 4, + "total_code_acceptances": 17, + "total_code_suggestions": 44, + "total_code_lines_accepted": 37, + "total_code_lines_suggested": 104 + }, + { + "name": "plaintext", + "total_engaged_users": 1, + "total_code_acceptances": 0, + "total_code_suggestions": 5, + "total_code_lines_accepted": 0, + "total_code_lines_suggested": 7 + }, + { + "name": "dart", + "total_engaged_users": 2, + "total_code_acceptances": 34, + "total_code_suggestions": 142, + "total_code_lines_accepted": 35, + "total_code_lines_suggested": 391 + }, + { + "name": "ql", + "total_engaged_users": 3, + "total_code_acceptances": 33, + "total_code_suggestions": 120, + "total_code_lines_accepted": 34, + "total_code_lines_suggested": 250 + }, + { + "name": "razor", + "total_engaged_users": 2, + "total_code_acceptances": 8, + "total_code_suggestions": 25, + "total_code_lines_accepted": 18, + "total_code_lines_suggested": 80 + }, + { + "name": "github-actions-workflow", + "total_engaged_users": 2, + "total_code_acceptances": 4, + "total_code_suggestions": 13, + "total_code_lines_accepted": 8, + "total_code_lines_suggested": 19 + }, + { + "name": "json", + "total_engaged_users": 1, + "total_code_acceptances": 0, + "total_code_suggestions": 3, + "total_code_lines_accepted": 0, + "total_code_lines_suggested": 3 + }, + { + "name": "powershell", + "total_engaged_users": 2, + "total_code_acceptances": 2, + "total_code_suggestions": 4, + "total_code_lines_accepted": 1, + "total_code_lines_suggested": 5 + }, + { + "name": "go", + "total_engaged_users": 4, + "total_code_acceptances": 65, + "total_code_suggestions": 224, + "total_code_lines_accepted": 56, + "total_code_lines_suggested": 315 + }, + { + "name": "cpp", + "total_engaged_users": 1, + "total_code_acceptances": 0, + "total_code_suggestions": 3, + "total_code_lines_accepted": 0, + "total_code_lines_suggested": 12 + }, + { + "name": "elixir", + "total_engaged_users": 1, + "total_code_acceptances": 0, + "total_code_suggestions": 5, + "total_code_lines_accepted": 0, + "total_code_lines_suggested": 5 + }, + { + "name": "postgres", + "total_engaged_users": 2, + "total_code_acceptances": 5, + "total_code_suggestions": 30, + "total_code_lines_accepted": 11, + "total_code_lines_suggested": 41 + }, + { + "name": "graphql", + "total_engaged_users": 1, + "total_code_acceptances": 0, + "total_code_suggestions": 2, + "total_code_lines_accepted": 0, + "total_code_lines_suggested": 2 + } + ], + "is_custom_model": false, + "total_engaged_users": 87 + } + ], + "total_engaged_users": 87 + }, + { + "name": "JetBrains", + "models": [ + { + "name": "default", + "languages": [ + { + "name": "java", + "total_engaged_users": 2, + "total_code_acceptances": 146, + "total_code_suggestions": 270, + "total_code_lines_accepted": 252, + "total_code_lines_suggested": 736 + }, + { + "name": "sql", + "total_engaged_users": 2, + "total_code_acceptances": 3, + "total_code_suggestions": 9, + "total_code_lines_accepted": 3, + "total_code_lines_suggested": 32 + }, + { + "name": "typescriptreact", + "total_engaged_users": 2, + "total_code_acceptances": 4, + "total_code_suggestions": 30, + "total_code_lines_accepted": 4, + "total_code_lines_suggested": 47 + }, + { + "name": "csharp", + "total_engaged_users": 2, + "total_code_acceptances": 2, + "total_code_suggestions": 6, + "total_code_lines_accepted": 2, + "total_code_lines_suggested": 10 + }, + { + "name": "typescript", + "total_engaged_users": 1, + "total_code_acceptances": 0, + "total_code_suggestions": 6, + "total_code_lines_accepted": 0, + "total_code_lines_suggested": 6 + } + ], + "is_custom_model": false, + "total_engaged_users": 3 + } + ], + "total_engaged_users": 3 + }, + { + "name": "Xcode", + "models": [ + { + "name": "default", + "languages": [ + { + "name": "swift", + "total_engaged_users": 2, + "total_code_acceptances": 5, + "total_code_suggestions": 5, + "total_code_lines_accepted": 5, + "total_code_lines_suggested": 5 + } + ], + "is_custom_model": false, + "total_engaged_users": 2 + } + ], + "total_engaged_users": 2 + }, + { + "name": "Neovim", + "models": [ + { + "name": "default", + "languages": [ + { + "name": "sql", + "total_engaged_users": 1, + "total_code_acceptances": 0, + "total_code_suggestions": 2, + "total_code_lines_accepted": 0, + "total_code_lines_suggested": 8 + }, + { + "name": "ruby", + "total_engaged_users": 2, + "total_code_acceptances": 16, + "total_code_suggestions": 35, + "total_code_lines_accepted": 16, + "total_code_lines_suggested": 59 + }, + { + "name": "typescriptreact", + "total_engaged_users": 1, + "total_code_acceptances": 0, + "total_code_suggestions": 2, + "total_code_lines_accepted": 0, + "total_code_lines_suggested": 2 + } + ], + "is_custom_model": false, + "total_engaged_users": 2 + } + ], + "total_engaged_users": 2 + } + ], + "total_engaged_users": 92 + } + }, + { + "date": "2024-10-26", + "copilot_ide_chat": { + "editors": [ + { + "name": "JetBrains", + "models": [ + { + "name": "default", + "total_chats": 2, + "is_custom_model": false, + "total_engaged_users": 1, + "total_chat_copy_events": 1, + "total_chat_insertion_events": 1 + } + ], + "total_engaged_users": 1 + }, + { + "name": "vscode", + "models": [ + { + "name": "default", + "total_chats": 1044, + "is_custom_model": false, + "total_engaged_users": 26, + "total_chat_copy_events": 73, + "total_chat_insertion_events": 29 + } + ], + "total_engaged_users": 26 + } + ], + "total_engaged_users": 26 + }, + "total_active_users": 40, + "copilot_dotcom_chat": { + "models": [ + { + "name": "default", + "total_chats": 28, + "is_custom_model": false, + "total_engaged_users": 5 + } + ], + "total_engaged_users": 5 + }, + "total_engaged_users": 40, + "copilot_dotcom_pull_requests": { + "repositories": [ + { + "name": "noseknows-universe", + "models": [ + { + "name": "default", + "is_custom_model": false, + "total_engaged_users": 1, + "total_pr_summaries_created": 1 + } + ], + "total_engaged_users": 1 + }, + { + "name": "aitour-advanced-coding-visual-studio-code-and-github-copilot", + "models": [ + { + "name": "default", + "is_custom_model": false, + "total_engaged_users": 1, + "total_pr_summaries_created": 2 + } + ], + "total_engaged_users": 1 + }, + { + "name": "aitour-advanced-coding-visual-studio-and-github-copilot", + "models": [ + { + "name": "default", + "is_custom_model": false, + "total_engaged_users": 1, + "total_pr_summaries_created": 1 + } + ], + "total_engaged_users": 1 + } + ], + "total_engaged_users": 2 + }, + "copilot_ide_code_completions": { + "editors": [ + { + "name": "vscode", + "models": [ + { + "name": "default", + "languages": [ + { + "name": "markdown", + "total_engaged_users": 4, + "total_code_acceptances": 7, + "total_code_suggestions": 21, + "total_code_lines_accepted": 7, + "total_code_lines_suggested": 25 + }, + { + "name": "ruby", + "total_engaged_users": 4, + "total_code_acceptances": 94, + "total_code_suggestions": 227, + "total_code_lines_accepted": 80, + "total_code_lines_suggested": 335 + }, + { + "name": "scss", + "total_engaged_users": 5, + "total_code_acceptances": 14, + "total_code_suggestions": 67, + "total_code_lines_accepted": 32, + "total_code_lines_suggested": 115 + }, + { + "name": "typescriptreact", + "total_engaged_users": 5, + "total_code_acceptances": 104, + "total_code_suggestions": 276, + "total_code_lines_accepted": 106, + "total_code_lines_suggested": 519 + }, + { + "name": "powershell", + "total_engaged_users": 2, + "total_code_acceptances": 12, + "total_code_suggestions": 13, + "total_code_lines_accepted": 12, + "total_code_lines_suggested": 13 + }, + { + "name": "terraform", + "total_engaged_users": 2, + "total_code_acceptances": 7, + "total_code_suggestions": 9, + "total_code_lines_accepted": 20, + "total_code_lines_suggested": 25 + }, + { + "name": "typescript", + "total_engaged_users": 4, + "total_code_acceptances": 384, + "total_code_suggestions": 818, + "total_code_lines_accepted": 381, + "total_code_lines_suggested": 1325 + }, + { + "name": "dotenv", + "total_engaged_users": 2, + "total_code_acceptances": 3, + "total_code_suggestions": 11, + "total_code_lines_accepted": 3, + "total_code_lines_suggested": 12 + }, + { + "name": "yaml", + "total_engaged_users": 2, + "total_code_acceptances": 4, + "total_code_suggestions": 18, + "total_code_lines_accepted": 6, + "total_code_lines_suggested": 25 + }, + { + "name": "lua", + "total_engaged_users": 1, + "total_code_acceptances": 0, + "total_code_suggestions": 5, + "total_code_lines_accepted": 0, + "total_code_lines_suggested": 5 + }, + { + "name": "python", + "total_engaged_users": 6, + "total_code_acceptances": 112, + "total_code_suggestions": 339, + "total_code_lines_accepted": 106, + "total_code_lines_suggested": 462 + }, + { + "name": "unknown", + "total_engaged_users": 6, + "total_code_acceptances": 29, + "total_code_suggestions": 112, + "total_code_lines_accepted": 37, + "total_code_lines_suggested": 142 + }, + { + "name": "html", + "total_engaged_users": 3, + "total_code_acceptances": 32, + "total_code_suggestions": 71, + "total_code_lines_accepted": 48, + "total_code_lines_suggested": 140 + }, + { + "name": "csharp", + "total_engaged_users": 3, + "total_code_acceptances": 10, + "total_code_suggestions": 29, + "total_code_lines_accepted": 4, + "total_code_lines_suggested": 62 + }, + { + "name": "javascript", + "total_engaged_users": 5, + "total_code_acceptances": 16, + "total_code_suggestions": 39, + "total_code_lines_accepted": 9, + "total_code_lines_suggested": 55 + }, + { + "name": "json", + "total_engaged_users": 4, + "total_code_acceptances": 3, + "total_code_suggestions": 20, + "total_code_lines_accepted": 5, + "total_code_lines_suggested": 29 + }, + { + "name": "go", + "total_engaged_users": 2, + "total_code_acceptances": 25, + "total_code_suggestions": 66, + "total_code_lines_accepted": 25, + "total_code_lines_suggested": 81 + }, + { + "name": "shellscript", + "total_engaged_users": 2, + "total_code_acceptances": 59, + "total_code_suggestions": 112, + "total_code_lines_accepted": 59, + "total_code_lines_suggested": 122 + }, + { + "name": "jsonc", + "total_engaged_users": 1, + "total_code_acceptances": 0, + "total_code_suggestions": 21, + "total_code_lines_accepted": 0, + "total_code_lines_suggested": 23 + }, + { + "name": "css", + "total_engaged_users": 3, + "total_code_acceptances": 2, + "total_code_suggestions": 14, + "total_code_lines_accepted": 1, + "total_code_lines_suggested": 35 + }, + { + "name": "dockerfile", + "total_engaged_users": 2, + "total_code_acceptances": 2, + "total_code_suggestions": 5, + "total_code_lines_accepted": 1, + "total_code_lines_suggested": 7 + }, + { + "name": "svelte", + "total_engaged_users": 2, + "total_code_acceptances": 15, + "total_code_suggestions": 29, + "total_code_lines_accepted": 9, + "total_code_lines_suggested": 36 + }, + { + "name": "ini", + "total_engaged_users": 2, + "total_code_acceptances": 12, + "total_code_suggestions": 37, + "total_code_lines_accepted": 12, + "total_code_lines_suggested": 50 + }, + { + "name": "plaintext", + "total_engaged_users": 1, + "total_code_acceptances": 0, + "total_code_suggestions": 5, + "total_code_lines_accepted": 0, + "total_code_lines_suggested": 6 + } + ], + "is_custom_model": false, + "total_engaged_users": 29 + } + ], + "total_engaged_users": 29 + }, + { + "name": "JetBrains", + "models": [ + { + "name": "default", + "languages": [ + { + "name": "java", + "total_engaged_users": 2, + "total_code_acceptances": 4, + "total_code_suggestions": 17, + "total_code_lines_accepted": 4, + "total_code_lines_suggested": 29 + }, + { + "name": "ini", + "total_engaged_users": 1, + "total_code_acceptances": 0, + "total_code_suggestions": 3, + "total_code_lines_accepted": 0, + "total_code_lines_suggested": 3 + } + ], + "is_custom_model": false, + "total_engaged_users": 2 + } + ], + "total_engaged_users": 2 + }, + { + "name": "Neovim", + "models": [ + { + "name": "default", + "languages": [ + { + "name": "ruby", + "total_engaged_users": 2, + "total_code_acceptances": 6, + "total_code_suggestions": 14, + "total_code_lines_accepted": 6, + "total_code_lines_suggested": 19 + } + ], + "is_custom_model": false, + "total_engaged_users": 2 + } + ], + "total_engaged_users": 2 + }, + { + "name": "VisualStudio", + "models": [ + { + "name": "default", + "languages": [ + { + "name": "cpp", + "total_engaged_users": 2, + "total_code_acceptances": 83, + "total_code_suggestions": 196, + "total_code_lines_accepted": 172, + "total_code_lines_suggested": 489 + } + ], + "is_custom_model": false, + "total_engaged_users": 2 + } + ], + "total_engaged_users": 2 + } + ], + "total_engaged_users": 31 + } + }, + { + "date": "2024-10-27", + "copilot_ide_chat": { + "editors": [ + { + "name": "vscode", + "models": [ + { + "name": "default", + "total_chats": 1242, + "is_custom_model": false, + "total_engaged_users": 32, + "total_chat_copy_events": 63, + "total_chat_insertion_events": 96 + } + ], + "total_engaged_users": 32 + }, + { + "name": "JetBrains", + "models": [ + { + "name": "default", + "total_chats": 14, + "is_custom_model": false, + "total_engaged_users": 1, + "total_chat_copy_events": 0, + "total_chat_insertion_events": 6 + } + ], + "total_engaged_users": 1 + } + ], + "total_engaged_users": 32 + }, + "total_active_users": 44, + "copilot_dotcom_chat": { + "models": [ + { + "name": "default", + "total_chats": 13, + "is_custom_model": false, + "total_engaged_users": 4 + } + ], + "total_engaged_users": 4 + }, + "total_engaged_users": 44, + "copilot_dotcom_pull_requests": { + "repositories": [ + { + "name": "svelte-dev-runner-tracks", + "models": [ + { + "name": "default", + "is_custom_model": false, + "total_engaged_users": 1, + "total_pr_summaries_created": 1 + } + ], + "total_engaged_users": 1 + }, + { + "name": "my-learnings", + "models": [ + { + "name": "default", + "is_custom_model": false, + "total_engaged_users": 1, + "total_pr_summaries_created": 2 + } + ], + "total_engaged_users": 1 + }, + { + "name": "serependity-images", + "models": [ + { + "name": "default", + "is_custom_model": false, + "total_engaged_users": 1, + "total_pr_summaries_created": 1 + } + ], + "total_engaged_users": 1 + } + ], + "total_engaged_users": 3 + }, + "copilot_ide_code_completions": { + "editors": [ + { + "name": "vscode", + "models": [ + { + "name": "default", + "languages": [ + { + "name": "json", + "total_engaged_users": 2, + "total_code_acceptances": 4, + "total_code_suggestions": 18, + "total_code_lines_accepted": 3, + "total_code_lines_suggested": 29 + }, + { + "name": "unknown", + "total_engaged_users": 5, + "total_code_acceptances": 26, + "total_code_suggestions": 194, + "total_code_lines_accepted": 25, + "total_code_lines_suggested": 409 + }, + { + "name": "csharp", + "total_engaged_users": 2, + "total_code_acceptances": 24, + "total_code_suggestions": 64, + "total_code_lines_accepted": 20, + "total_code_lines_suggested": 118 + }, + { + "name": "yaml", + "total_engaged_users": 6, + "total_code_acceptances": 32, + "total_code_suggestions": 116, + "total_code_lines_accepted": 55, + "total_code_lines_suggested": 169 + }, + { + "name": "typescript", + "total_engaged_users": 8, + "total_code_acceptances": 250, + "total_code_suggestions": 523, + "total_code_lines_accepted": 277, + "total_code_lines_suggested": 979 + }, + { + "name": "markdown", + "total_engaged_users": 8, + "total_code_acceptances": 144, + "total_code_suggestions": 837, + "total_code_lines_accepted": 177, + "total_code_lines_suggested": 1219 + }, + { + "name": "dotenv", + "total_engaged_users": 2, + "total_code_acceptances": 4, + "total_code_suggestions": 15, + "total_code_lines_accepted": 4, + "total_code_lines_suggested": 20 + }, + { + "name": "python", + "total_engaged_users": 8, + "total_code_acceptances": 142, + "total_code_suggestions": 303, + "total_code_lines_accepted": 191, + "total_code_lines_suggested": 432 + }, + { + "name": "shellscript", + "total_engaged_users": 3, + "total_code_acceptances": 10, + "total_code_suggestions": 97, + "total_code_lines_accepted": 13, + "total_code_lines_suggested": 130 + }, + { + "name": "javascript", + "total_engaged_users": 6, + "total_code_acceptances": 95, + "total_code_suggestions": 270, + "total_code_lines_accepted": 182, + "total_code_lines_suggested": 586 + }, + { + "name": "pug", + "total_engaged_users": 2, + "total_code_acceptances": 2, + "total_code_suggestions": 7, + "total_code_lines_accepted": 1, + "total_code_lines_suggested": 7 + }, + { + "name": "svelte", + "total_engaged_users": 1, + "total_code_acceptances": 0, + "total_code_suggestions": 5, + "total_code_lines_accepted": 0, + "total_code_lines_suggested": 6 + }, + { + "name": "jsonc", + "total_engaged_users": 2, + "total_code_acceptances": 3, + "total_code_suggestions": 16, + "total_code_lines_accepted": 3, + "total_code_lines_suggested": 124 + }, + { + "name": "typescriptreact", + "total_engaged_users": 4, + "total_code_acceptances": 37, + "total_code_suggestions": 109, + "total_code_lines_accepted": 30, + "total_code_lines_suggested": 131 + }, + { + "name": "scss", + "total_engaged_users": 3, + "total_code_acceptances": 44, + "total_code_suggestions": 142, + "total_code_lines_accepted": 65, + "total_code_lines_suggested": 250 + }, + { + "name": "go", + "total_engaged_users": 3, + "total_code_acceptances": 83, + "total_code_suggestions": 200, + "total_code_lines_accepted": 252, + "total_code_lines_suggested": 665 + }, + { + "name": "html", + "total_engaged_users": 2, + "total_code_acceptances": 60, + "total_code_suggestions": 79, + "total_code_lines_accepted": 71, + "total_code_lines_suggested": 163 + }, + { + "name": "ruby", + "total_engaged_users": 3, + "total_code_acceptances": 36, + "total_code_suggestions": 110, + "total_code_lines_accepted": 30, + "total_code_lines_suggested": 166 + } + ], + "is_custom_model": false, + "total_engaged_users": 32 + } + ], + "total_engaged_users": 32 + }, + { + "name": "JetBrains", + "models": [ + { + "name": "default", + "languages": [ + { + "name": "java", + "total_engaged_users": 2, + "total_code_acceptances": 35, + "total_code_suggestions": 73, + "total_code_lines_accepted": 43, + "total_code_lines_suggested": 133 + }, + { + "name": "sql", + "total_engaged_users": 1, + "total_code_acceptances": 0, + "total_code_suggestions": 1, + "total_code_lines_accepted": 0, + "total_code_lines_suggested": 6 + } + ], + "is_custom_model": false, + "total_engaged_users": 2 + } + ], + "total_engaged_users": 2 + }, + { + "name": "VisualStudio", + "models": [ + { + "name": "default", + "languages": [ + { + "name": "c/c++", + "total_engaged_users": 2, + "total_code_acceptances": 34, + "total_code_suggestions": 266, + "total_code_lines_accepted": 52, + "total_code_lines_suggested": 390 + }, + { + "name": "cpp", + "total_engaged_users": 2, + "total_code_acceptances": 43, + "total_code_suggestions": 112, + "total_code_lines_accepted": 104, + "total_code_lines_suggested": 260 + } + ], + "is_custom_model": false, + "total_engaged_users": 2 + } + ], + "total_engaged_users": 2 + }, + { + "name": "Neovim", + "models": [ + { + "name": "default", + "languages": [ + { + "name": "typescriptreact", + "total_engaged_users": 1, + "total_code_acceptances": 0, + "total_code_suggestions": 3, + "total_code_lines_accepted": 0, + "total_code_lines_suggested": 9 + } + ], + "is_custom_model": false, + "total_engaged_users": 1 + } + ], + "total_engaged_users": 1 + } + ], + "total_engaged_users": 33 + } + }, + { + "date": "2024-10-28", + "copilot_ide_chat": { + "editors": [ + { + "name": "vscode", + "models": [ + { + "name": "default", + "total_chats": 2022, + "is_custom_model": false, + "total_engaged_users": 72, + "total_chat_copy_events": 140, + "total_chat_insertion_events": 71 + } + ], + "total_engaged_users": 72 + }, + { + "name": "JetBrains", + "models": [ + { + "name": "default", + "total_chats": 4, + "is_custom_model": false, + "total_engaged_users": 2, + "total_chat_copy_events": 0, + "total_chat_insertion_events": 0 + } + ], + "total_engaged_users": 2 + } + ], + "total_engaged_users": 73 + }, + "total_active_users": 127, + "copilot_dotcom_chat": { + "models": [ + { + "name": "default", + "total_chats": 109, + "is_custom_model": false, + "total_engaged_users": 29 + } + ], + "total_engaged_users": 29 + }, + "total_engaged_users": 127, + "copilot_dotcom_pull_requests": { + "repositories": [ + { + "name": "brand", + "models": [ + { + "name": "default", + "is_custom_model": false, + "total_engaged_users": 1, + "total_pr_summaries_created": 1 + } + ], + "total_engaged_users": 1 + }, + { + "name": "copilot", + "models": [ + { + "name": "default", + "is_custom_model": false, + "total_engaged_users": 1, + "total_pr_summaries_created": 1 + } + ], + "total_engaged_users": 1 + }, + { + "name": "yugen-saga-server", + "models": [ + { + "name": "default", + "is_custom_model": false, + "total_engaged_users": 1, + "total_pr_summaries_created": 2 + } + ], + "total_engaged_users": 1 + }, + { + "name": "certification-services", + "models": [ + { + "name": "default", + "is_custom_model": false, + "total_engaged_users": 1, + "total_pr_summaries_created": 1 + } + ], + "total_engaged_users": 1 + }, + { + "name": "math-service", + "models": [ + { + "name": "default", + "is_custom_model": false, + "total_engaged_users": 1, + "total_pr_summaries_created": 4 + } + ], + "total_engaged_users": 1 + }, + { + "name": "gh-migrate-teams", + "models": [ + { + "name": "default", + "is_custom_model": false, + "total_engaged_users": 1, + "total_pr_summaries_created": 3 + } + ], + "total_engaged_users": 1 + }, + { + "name": "Copilot-Sandbox", + "models": [ + { + "name": "default", + "is_custom_model": false, + "total_engaged_users": 1, + "total_pr_summaries_created": 1 + } + ], + "total_engaged_users": 1 + }, + { + "name": "paypal-migrations-via-actions", + "models": [ + { + "name": "default", + "is_custom_model": false, + "total_engaged_users": 1, + "total_pr_summaries_created": 1 + } + ], + "total_engaged_users": 1 + }, + { + "name": "java-springboot-demo", + "models": [ + { + "name": "default", + "is_custom_model": false, + "total_engaged_users": 1, + "total_pr_summaries_created": 2 + } + ], + "total_engaged_users": 1 + }, + { + "name": "myshuttle", + "models": [ + { + "name": "default", + "is_custom_model": false, + "total_engaged_users": 1, + "total_pr_summaries_created": 2 + } + ], + "total_engaged_users": 1 + }, + { + "name": "", + "models": [ + { + "name": "default", + "is_custom_model": false, + "total_engaged_users": 1, + "total_pr_summaries_created": 1 + } + ], + "total_engaged_users": 1 + } + ], + "total_engaged_users": 10 + }, + "copilot_ide_code_completions": { + "editors": [ + { + "name": "vscode", + "models": [ + { + "name": "default", + "languages": [ + { + "name": "yaml", + "total_engaged_users": 6, + "total_code_acceptances": 48, + "total_code_suggestions": 259, + "total_code_lines_accepted": 54, + "total_code_lines_suggested": 398 + }, + { + "name": "unknown", + "total_engaged_users": 10, + "total_code_acceptances": 52, + "total_code_suggestions": 247, + "total_code_lines_accepted": 61, + "total_code_lines_suggested": 396 + }, + { + "name": "java", + "total_engaged_users": 6, + "total_code_acceptances": 55, + "total_code_suggestions": 166, + "total_code_lines_accepted": 203, + "total_code_lines_suggested": 831 + }, + { + "name": "jsonc", + "total_engaged_users": 2, + "total_code_acceptances": 1, + "total_code_suggestions": 18, + "total_code_lines_accepted": 3, + "total_code_lines_suggested": 45 + }, + { + "name": "html", + "total_engaged_users": 7, + "total_code_acceptances": 57, + "total_code_suggestions": 131, + "total_code_lines_accepted": 65, + "total_code_lines_suggested": 231 + }, + { + "name": "python", + "total_engaged_users": 8, + "total_code_acceptances": 105, + "total_code_suggestions": 331, + "total_code_lines_accepted": 132, + "total_code_lines_suggested": 531 + }, + { + "name": "typescript", + "total_engaged_users": 6, + "total_code_acceptances": 61, + "total_code_suggestions": 199, + "total_code_lines_accepted": 62, + "total_code_lines_suggested": 310 + }, + { + "name": "javascript", + "total_engaged_users": 16, + "total_code_acceptances": 514, + "total_code_suggestions": 1092, + "total_code_lines_accepted": 844, + "total_code_lines_suggested": 1796 + }, + { + "name": "json", + "total_engaged_users": 6, + "total_code_acceptances": 13, + "total_code_suggestions": 42, + "total_code_lines_accepted": 14, + "total_code_lines_suggested": 59 + }, + { + "name": "groovy", + "total_engaged_users": 2, + "total_code_acceptances": 2, + "total_code_suggestions": 12, + "total_code_lines_accepted": 2, + "total_code_lines_suggested": 17 + }, + { + "name": "plaintext", + "total_engaged_users": 1, + "total_code_acceptances": 0, + "total_code_suggestions": 13, + "total_code_lines_accepted": 0, + "total_code_lines_suggested": 15 + }, + { + "name": "go", + "total_engaged_users": 4, + "total_code_acceptances": 182, + "total_code_suggestions": 504, + "total_code_lines_accepted": 239, + "total_code_lines_suggested": 828 + }, + { + "name": "shellscript", + "total_engaged_users": 11, + "total_code_acceptances": 63, + "total_code_suggestions": 176, + "total_code_lines_accepted": 68, + "total_code_lines_suggested": 235 + }, + { + "name": "markdown", + "total_engaged_users": 17, + "total_code_acceptances": 164, + "total_code_suggestions": 1308, + "total_code_lines_accepted": 219, + "total_code_lines_suggested": 1834 + }, + { + "name": "typescriptreact", + "total_engaged_users": 7, + "total_code_acceptances": 145, + "total_code_suggestions": 464, + "total_code_lines_accepted": 119, + "total_code_lines_suggested": 714 + }, + { + "name": "ruby", + "total_engaged_users": 12, + "total_code_acceptances": 176, + "total_code_suggestions": 450, + "total_code_lines_accepted": 176, + "total_code_lines_suggested": 585 + }, + { + "name": "dockerfile", + "total_engaged_users": 1, + "total_code_acceptances": 0, + "total_code_suggestions": 8, + "total_code_lines_accepted": 0, + "total_code_lines_suggested": 8 + }, + { + "name": "scss", + "total_engaged_users": 1, + "total_code_acceptances": 0, + "total_code_suggestions": 9, + "total_code_lines_accepted": 0, + "total_code_lines_suggested": 46 + }, + { + "name": "clojure", + "total_engaged_users": 1, + "total_code_acceptances": 0, + "total_code_suggestions": 5, + "total_code_lines_accepted": 0, + "total_code_lines_suggested": 6 + }, + { + "name": "csharp", + "total_engaged_users": 4, + "total_code_acceptances": 50, + "total_code_suggestions": 182, + "total_code_lines_accepted": 35, + "total_code_lines_suggested": 280 + }, + { + "name": "css", + "total_engaged_users": 1, + "total_code_acceptances": 0, + "total_code_suggestions": 6, + "total_code_lines_accepted": 0, + "total_code_lines_suggested": 6 + }, + { + "name": "powershell", + "total_engaged_users": 2, + "total_code_acceptances": 8, + "total_code_suggestions": 36, + "total_code_lines_accepted": 10, + "total_code_lines_suggested": 73 + }, + { + "name": "dotenv", + "total_engaged_users": 1, + "total_code_acceptances": 0, + "total_code_suggestions": 5, + "total_code_lines_accepted": 0, + "total_code_lines_suggested": 7 + }, + { + "name": "graphql", + "total_engaged_users": 1, + "total_code_acceptances": 0, + "total_code_suggestions": 1, + "total_code_lines_accepted": 0, + "total_code_lines_suggested": 16 + }, + { + "name": "razor", + "total_engaged_users": 1, + "total_code_acceptances": 0, + "total_code_suggestions": 1, + "total_code_lines_accepted": 0, + "total_code_lines_suggested": 1 + } + ], + "is_custom_model": false, + "total_engaged_users": 75 + } + ], + "total_engaged_users": 75 + }, + { + "name": "VisualStudio", + "models": [ + { + "name": "default", + "languages": [ + { + "name": "c/c++", + "total_engaged_users": 2, + "total_code_acceptances": 56, + "total_code_suggestions": 131, + "total_code_lines_accepted": 76, + "total_code_lines_suggested": 228 + } + ], + "is_custom_model": false, + "total_engaged_users": 2 + } + ], + "total_engaged_users": 2 + }, + { + "name": "Emacs", + "models": [ + { + "name": "default", + "languages": [ + { + "name": "rustic", + "total_engaged_users": 2, + "total_code_acceptances": 12, + "total_code_suggestions": 21, + "total_code_lines_accepted": 12, + "total_code_lines_suggested": 23 + } + ], + "is_custom_model": false, + "total_engaged_users": 2 + } + ], + "total_engaged_users": 2 + }, + { + "name": "JetBrains", + "models": [ + { + "name": "default", + "languages": [ + { + "name": "java", + "total_engaged_users": 1, + "total_code_acceptances": 0, + "total_code_suggestions": 4, + "total_code_lines_accepted": 0, + "total_code_lines_suggested": 7 + }, + { + "name": "csharp", + "total_engaged_users": 2, + "total_code_acceptances": 5, + "total_code_suggestions": 23, + "total_code_lines_accepted": 6, + "total_code_lines_suggested": 56 + } + ], + "is_custom_model": false, + "total_engaged_users": 2 + } + ], + "total_engaged_users": 2 + }, + { + "name": "Neovim", + "models": [ + { + "name": "default", + "languages": [ + { + "name": "typescriptreact", + "total_engaged_users": 2, + "total_code_acceptances": 8, + "total_code_suggestions": 29, + "total_code_lines_accepted": 8, + "total_code_lines_suggested": 104 + } + ], + "is_custom_model": false, + "total_engaged_users": 2 + } + ], + "total_engaged_users": 2 + }, + { + "name": "Vim", + "models": [ + { + "name": "default", + "languages": [ + { + "name": "markdown", + "total_engaged_users": 1, + "total_code_acceptances": 0, + "total_code_suggestions": 1, + "total_code_lines_accepted": 0, + "total_code_lines_suggested": 6 + } + ], + "is_custom_model": false, + "total_engaged_users": 1 + } + ], + "total_engaged_users": 1 + } + ], + "total_engaged_users": 79 + } + }, + { + "date": "2024-10-29", + "copilot_ide_chat": { + "editors": [ + { + "name": "vscode", + "models": [ + { + "name": "default", + "total_chats": 2004, + "is_custom_model": false, + "total_engaged_users": 89, + "total_chat_copy_events": 72, + "total_chat_insertion_events": 59 + } + ], + "total_engaged_users": 89 + }, + { + "name": "JetBrains", + "models": [ + { + "name": "default", + "total_chats": 30, + "is_custom_model": false, + "total_engaged_users": 3, + "total_chat_copy_events": 2, + "total_chat_insertion_events": 8 + } + ], + "total_engaged_users": 3 + } + ], + "total_engaged_users": 89 + }, + "total_active_users": 140, + "copilot_dotcom_chat": { + "models": [ + { + "name": "default", + "total_chats": 91, + "is_custom_model": false, + "total_engaged_users": 26 + } + ], + "total_engaged_users": 26 + }, + "total_engaged_users": 140, + "copilot_dotcom_pull_requests": { + "repositories": [ + { + "name": "releases", + "models": [ + { + "name": "default", + "is_custom_model": false, + "total_engaged_users": 1, + "total_pr_summaries_created": 4 + } + ], + "total_engaged_users": 1 + }, + { + "name": "Copilot-Sandbox", + "models": [ + { + "name": "default", + "is_custom_model": false, + "total_engaged_users": 1, + "total_pr_summaries_created": 1 + } + ], + "total_engaged_users": 1 + }, + { + "name": "github-games", + "models": [ + { + "name": "default", + "is_custom_model": false, + "total_engaged_users": 1, + "total_pr_summaries_created": 1 + } + ], + "total_engaged_users": 1 + }, + { + "name": "Abeck_GHAS2", + "models": [ + { + "name": "default", + "is_custom_model": false, + "total_engaged_users": 1, + "total_pr_summaries_created": 1 + } + ], + "total_engaged_users": 1 + }, + { + "name": "JackGKafaty_GitHubAdvancedSecurity", + "models": [ + { + "name": "default", + "is_custom_model": false, + "total_engaged_users": 1, + "total_pr_summaries_created": 2 + } + ], + "total_engaged_users": 1 + }, + { + "name": "", + "models": [ + { + "name": "default", + "is_custom_model": false, + "total_engaged_users": 1, + "total_pr_summaries_created": 2 + } + ], + "total_engaged_users": 1 + }, + { + "name": "octo-consumption-data", + "models": [ + { + "name": "default", + "is_custom_model": false, + "total_engaged_users": 1, + "total_pr_summaries_created": 1 + } + ], + "total_engaged_users": 1 + }, + { + "name": "math-service", + "models": [ + { + "name": "default", + "is_custom_model": false, + "total_engaged_users": 1, + "total_pr_summaries_created": 6 + } + ], + "total_engaged_users": 1 + }, + { + "name": "nullchimp-demo", + "models": [ + { + "name": "default", + "is_custom_model": false, + "total_engaged_users": 1, + "total_pr_summaries_created": 2 + } + ], + "total_engaged_users": 1 + } + ], + "total_engaged_users": 9 + }, + "copilot_ide_code_completions": { + "editors": [ + { + "name": "vscode", + "models": [ + { + "name": "default", + "languages": [ + { + "name": "markdown", + "total_engaged_users": 20, + "total_code_acceptances": 237, + "total_code_suggestions": 2069, + "total_code_lines_accepted": 277, + "total_code_lines_suggested": 2676 + }, + { + "name": "typescriptreact", + "total_engaged_users": 10, + "total_code_acceptances": 178, + "total_code_suggestions": 538, + "total_code_lines_accepted": 157, + "total_code_lines_suggested": 743 + }, + { + "name": "csharp", + "total_engaged_users": 3, + "total_code_acceptances": 17, + "total_code_suggestions": 69, + "total_code_lines_accepted": 14, + "total_code_lines_suggested": 145 + }, + { + "name": "typescript", + "total_engaged_users": 10, + "total_code_acceptances": 307, + "total_code_suggestions": 972, + "total_code_lines_accepted": 347, + "total_code_lines_suggested": 1587 + }, + { + "name": "javascript", + "total_engaged_users": 17, + "total_code_acceptances": 306, + "total_code_suggestions": 882, + "total_code_lines_accepted": 449, + "total_code_lines_suggested": 1584 + }, + { + "name": "go", + "total_engaged_users": 6, + "total_code_acceptances": 80, + "total_code_suggestions": 235, + "total_code_lines_accepted": 111, + "total_code_lines_suggested": 370 + }, + { + "name": "yaml", + "total_engaged_users": 13, + "total_code_acceptances": 80, + "total_code_suggestions": 318, + "total_code_lines_accepted": 152, + "total_code_lines_suggested": 1002 + }, + { + "name": "jsonc", + "total_engaged_users": 2, + "total_code_acceptances": 1, + "total_code_suggestions": 15, + "total_code_lines_accepted": 0, + "total_code_lines_suggested": 20 + }, + { + "name": "unknown", + "total_engaged_users": 9, + "total_code_acceptances": 25, + "total_code_suggestions": 216, + "total_code_lines_accepted": 32, + "total_code_lines_suggested": 274 + }, + { + "name": "json", + "total_engaged_users": 5, + "total_code_acceptances": 5, + "total_code_suggestions": 49, + "total_code_lines_accepted": 4, + "total_code_lines_suggested": 90 + }, + { + "name": "html", + "total_engaged_users": 5, + "total_code_acceptances": 20, + "total_code_suggestions": 52, + "total_code_lines_accepted": 21, + "total_code_lines_suggested": 152 + }, + { + "name": "shellscript", + "total_engaged_users": 6, + "total_code_acceptances": 33, + "total_code_suggestions": 168, + "total_code_lines_accepted": 39, + "total_code_lines_suggested": 213 + }, + { + "name": "python", + "total_engaged_users": 11, + "total_code_acceptances": 261, + "total_code_suggestions": 511, + "total_code_lines_accepted": 544, + "total_code_lines_suggested": 1088 + }, + { + "name": "dotenv", + "total_engaged_users": 3, + "total_code_acceptances": 2, + "total_code_suggestions": 23, + "total_code_lines_accepted": 2, + "total_code_lines_suggested": 25 + }, + { + "name": "plaintext", + "total_engaged_users": 1, + "total_code_acceptances": 0, + "total_code_suggestions": 5, + "total_code_lines_accepted": 0, + "total_code_lines_suggested": 5 + }, + { + "name": "oraclesql", + "total_engaged_users": 2, + "total_code_acceptances": 1, + "total_code_suggestions": 1, + "total_code_lines_accepted": 1, + "total_code_lines_suggested": 2 + }, + { + "name": "terraform", + "total_engaged_users": 1, + "total_code_acceptances": 0, + "total_code_suggestions": 4, + "total_code_lines_accepted": 0, + "total_code_lines_suggested": 13 + }, + { + "name": "xml", + "total_engaged_users": 2, + "total_code_acceptances": 5, + "total_code_suggestions": 16, + "total_code_lines_accepted": 4, + "total_code_lines_suggested": 18 + }, + { + "name": "razor", + "total_engaged_users": 2, + "total_code_acceptances": 2, + "total_code_suggestions": 32, + "total_code_lines_accepted": 2, + "total_code_lines_suggested": 85 + }, + { + "name": "ruby", + "total_engaged_users": 14, + "total_code_acceptances": 259, + "total_code_suggestions": 795, + "total_code_lines_accepted": 206, + "total_code_lines_suggested": 1025 + }, + { + "name": "css", + "total_engaged_users": 2, + "total_code_acceptances": 13, + "total_code_suggestions": 40, + "total_code_lines_accepted": 14, + "total_code_lines_suggested": 71 + }, + { + "name": "java", + "total_engaged_users": 2, + "total_code_acceptances": 8, + "total_code_suggestions": 26, + "total_code_lines_accepted": 19, + "total_code_lines_suggested": 42 + }, + { + "name": "erb", + "total_engaged_users": 1, + "total_code_acceptances": 0, + "total_code_suggestions": 4, + "total_code_lines_accepted": 0, + "total_code_lines_suggested": 5 + }, + { + "name": "coffeescript", + "total_engaged_users": 1, + "total_code_acceptances": 0, + "total_code_suggestions": 2, + "total_code_lines_accepted": 0, + "total_code_lines_suggested": 6 + }, + { + "name": "powershell", + "total_engaged_users": 2, + "total_code_acceptances": 60, + "total_code_suggestions": 240, + "total_code_lines_accepted": 80, + "total_code_lines_suggested": 911 + }, + { + "name": "dockerfile", + "total_engaged_users": 2, + "total_code_acceptances": 1, + "total_code_suggestions": 2, + "total_code_lines_accepted": 1, + "total_code_lines_suggested": 3 + }, + { + "name": "sql", + "total_engaged_users": 2, + "total_code_acceptances": 4, + "total_code_suggestions": 22, + "total_code_lines_accepted": 17, + "total_code_lines_suggested": 38 + }, + { + "name": "ql", + "total_engaged_users": 2, + "total_code_acceptances": 11, + "total_code_suggestions": 142, + "total_code_lines_accepted": 9, + "total_code_lines_suggested": 257 + }, + { + "name": "graphql", + "total_engaged_users": 2, + "total_code_acceptances": 2, + "total_code_suggestions": 3, + "total_code_lines_accepted": 1, + "total_code_lines_suggested": 4 + }, + { + "name": "http", + "total_engaged_users": 2, + "total_code_acceptances": 10, + "total_code_suggestions": 45, + "total_code_lines_accepted": 26, + "total_code_lines_suggested": 233 + }, + { + "name": "scss", + "total_engaged_users": 2, + "total_code_acceptances": 4, + "total_code_suggestions": 16, + "total_code_lines_accepted": 4, + "total_code_lines_suggested": 38 + } + ], + "is_custom_model": false, + "total_engaged_users": 85 + } + ], + "total_engaged_users": 85 + }, + { + "name": "Vim", + "models": [ + { + "name": "default", + "languages": [ + { + "name": "markdown", + "total_engaged_users": 1, + "total_code_acceptances": 0, + "total_code_suggestions": 7, + "total_code_lines_accepted": 0, + "total_code_lines_suggested": 15 + } + ], + "is_custom_model": false, + "total_engaged_users": 1 + } + ], + "total_engaged_users": 1 + }, + { + "name": "JetBrains", + "models": [ + { + "name": "default", + "languages": [ + { + "name": "java", + "total_engaged_users": 2, + "total_code_acceptances": 8, + "total_code_suggestions": 8, + "total_code_lines_accepted": 20, + "total_code_lines_suggested": 22 + }, + { + "name": "csharp", + "total_engaged_users": 2, + "total_code_acceptances": 3, + "total_code_suggestions": 12, + "total_code_lines_accepted": 8, + "total_code_lines_suggested": 79 + }, + { + "name": "json", + "total_engaged_users": 2, + "total_code_acceptances": 3, + "total_code_suggestions": 5, + "total_code_lines_accepted": 4, + "total_code_lines_suggested": 8 + } + ], + "is_custom_model": false, + "total_engaged_users": 3 + } + ], + "total_engaged_users": 3 + }, + { + "name": "VisualStudio", + "models": [ + { + "name": "default", + "languages": [ + { + "name": "csharp", + "total_engaged_users": 2, + "total_code_acceptances": 1, + "total_code_suggestions": 3, + "total_code_lines_accepted": 1, + "total_code_lines_suggested": 3 + }, + { + "name": "cpp", + "total_engaged_users": 2, + "total_code_acceptances": 98, + "total_code_suggestions": 242, + "total_code_lines_accepted": 204, + "total_code_lines_suggested": 508 + } + ], + "is_custom_model": false, + "total_engaged_users": 3 + } + ], + "total_engaged_users": 3 + }, + { + "name": "Neovim", + "models": [ + { + "name": "default", + "languages": [ + { + "name": "vue", + "total_engaged_users": 2, + "total_code_acceptances": 14, + "total_code_suggestions": 46, + "total_code_lines_accepted": 24, + "total_code_lines_suggested": 138 + }, + { + "name": "java", + "total_engaged_users": 2, + "total_code_acceptances": 3, + "total_code_suggestions": 4, + "total_code_lines_accepted": 13, + "total_code_lines_suggested": 22 + } + ], + "is_custom_model": false, + "total_engaged_users": 3 + } + ], + "total_engaged_users": 3 + } + ], + "total_engaged_users": 89 + } + }, + { + "date": "2024-10-30", + "copilot_ide_chat": { + "editors": [ + { + "name": "vscode", + "models": [ + { + "name": "default", + "total_chats": 2777, + "is_custom_model": false, + "total_engaged_users": 98, + "total_chat_copy_events": 75, + "total_chat_insertion_events": 146 + } + ], + "total_engaged_users": 98 + }, + { + "name": "JetBrains", + "models": [ + { + "name": "default", + "total_chats": 49, + "is_custom_model": false, + "total_engaged_users": 4, + "total_chat_copy_events": 13, + "total_chat_insertion_events": 9 + } + ], + "total_engaged_users": 4 + } + ], + "total_engaged_users": 99 + }, + "total_active_users": 152, + "copilot_dotcom_chat": { + "models": [ + { + "name": "default", + "total_chats": 165, + "is_custom_model": false, + "total_engaged_users": 38 + } + ], + "total_engaged_users": 38 + }, + "total_engaged_users": 152, + "copilot_dotcom_pull_requests": { + "repositories": [ + { + "name": "releases_dev", + "models": [ + { + "name": "default", + "is_custom_model": false, + "total_engaged_users": 1, + "total_pr_summaries_created": 1 + } + ], + "total_engaged_users": 1 + }, + { + "name": "OctoFitApp-Universe2024", + "models": [ + { + "name": "default", + "is_custom_model": false, + "total_engaged_users": 1, + "total_pr_summaries_created": 1 + } + ], + "total_engaged_users": 1 + }, + { + "name": "paypal-migrations-via-actions", + "models": [ + { + "name": "default", + "is_custom_model": false, + "total_engaged_users": 1, + "total_pr_summaries_created": 2 + } + ], + "total_engaged_users": 1 + }, + { + "name": "jdemos-demo-conference", + "models": [ + { + "name": "default", + "is_custom_model": false, + "total_engaged_users": 1, + "total_pr_summaries_created": 1 + } + ], + "total_engaged_users": 1 + }, + { + "name": "copilot-metrics-viewer", + "models": [ + { + "name": "default", + "is_custom_model": false, + "total_engaged_users": 1, + "total_pr_summaries_created": 1 + } + ], + "total_engaged_users": 1 + }, + { + "name": "", + "models": [ + { + "name": "default", + "is_custom_model": false, + "total_engaged_users": 2, + "total_pr_summaries_created": 4 + } + ], + "total_engaged_users": 2 + }, + { + "name": "github-planning", + "models": [ + { + "name": "default", + "is_custom_model": false, + "total_engaged_users": 1, + "total_pr_summaries_created": 2 + } + ], + "total_engaged_users": 1 + }, + { + "name": "dotNET-mail-demo", + "models": [ + { + "name": "default", + "is_custom_model": false, + "total_engaged_users": 1, + "total_pr_summaries_created": 1 + } + ], + "total_engaged_users": 1 + }, + { + "name": "nvm", + "models": [ + { + "name": "default", + "is_custom_model": false, + "total_engaged_users": 1, + "total_pr_summaries_created": 0 + } + ], + "total_engaged_users": 1 + }, + { + "name": "gifted-potato", + "models": [ + { + "name": "default", + "is_custom_model": false, + "total_engaged_users": 1, + "total_pr_summaries_created": 2 + } + ], + "total_engaged_users": 1 + }, + { + "name": "haikus-for-june", + "models": [ + { + "name": "default", + "is_custom_model": false, + "total_engaged_users": 1, + "total_pr_summaries_created": 3 + } + ], + "total_engaged_users": 1 + }, + { + "name": "actions-hero", + "models": [ + { + "name": "default", + "is_custom_model": false, + "total_engaged_users": 1, + "total_pr_summaries_created": 1 + } + ], + "total_engaged_users": 1 + }, + { + "name": "demo-vulnerabilities-ghas", + "models": [ + { + "name": "default", + "is_custom_model": false, + "total_engaged_users": 1, + "total_pr_summaries_created": 2 + } + ], + "total_engaged_users": 1 + } + ], + "total_engaged_users": 12 + }, + "copilot_ide_code_completions": { + "editors": [ + { + "name": "vscode", + "models": [ + { + "name": "default", + "languages": [ + { + "name": "ruby", + "total_engaged_users": 12, + "total_code_acceptances": 223, + "total_code_suggestions": 516, + "total_code_lines_accepted": 323, + "total_code_lines_suggested": 781 + }, + { + "name": "markdown", + "total_engaged_users": 18, + "total_code_acceptances": 128, + "total_code_suggestions": 956, + "total_code_lines_accepted": 147, + "total_code_lines_suggested": 1216 + }, + { + "name": "dotenv", + "total_engaged_users": 1, + "total_code_acceptances": 0, + "total_code_suggestions": 25, + "total_code_lines_accepted": 0, + "total_code_lines_suggested": 27 + }, + { + "name": "typescriptreact", + "total_engaged_users": 10, + "total_code_acceptances": 263, + "total_code_suggestions": 696, + "total_code_lines_accepted": 211, + "total_code_lines_suggested": 1016 + }, + { + "name": "html", + "total_engaged_users": 6, + "total_code_acceptances": 14, + "total_code_suggestions": 47, + "total_code_lines_accepted": 13, + "total_code_lines_suggested": 67 + }, + { + "name": "typescript", + "total_engaged_users": 16, + "total_code_acceptances": 288, + "total_code_suggestions": 986, + "total_code_lines_accepted": 261, + "total_code_lines_suggested": 1483 + }, + { + "name": "yaml", + "total_engaged_users": 13, + "total_code_acceptances": 88, + "total_code_suggestions": 334, + "total_code_lines_accepted": 223, + "total_code_lines_suggested": 947 + }, + { + "name": "javascript", + "total_engaged_users": 18, + "total_code_acceptances": 372, + "total_code_suggestions": 814, + "total_code_lines_accepted": 852, + "total_code_lines_suggested": 1751 + }, + { + "name": "css", + "total_engaged_users": 5, + "total_code_acceptances": 43, + "total_code_suggestions": 223, + "total_code_lines_accepted": 49, + "total_code_lines_suggested": 403 + }, + { + "name": "json", + "total_engaged_users": 5, + "total_code_acceptances": 8, + "total_code_suggestions": 32, + "total_code_lines_accepted": 6, + "total_code_lines_suggested": 126 + }, + { + "name": "jsonc", + "total_engaged_users": 2, + "total_code_acceptances": 2, + "total_code_suggestions": 37, + "total_code_lines_accepted": 1, + "total_code_lines_suggested": 63 + }, + { + "name": "python", + "total_engaged_users": 14, + "total_code_acceptances": 118, + "total_code_suggestions": 270, + "total_code_lines_accepted": 185, + "total_code_lines_suggested": 433 + }, + { + "name": "scss", + "total_engaged_users": 3, + "total_code_acceptances": 7, + "total_code_suggestions": 18, + "total_code_lines_accepted": 12, + "total_code_lines_suggested": 140 + }, + { + "name": "unknown", + "total_engaged_users": 8, + "total_code_acceptances": 27, + "total_code_suggestions": 288, + "total_code_lines_accepted": 23, + "total_code_lines_suggested": 403 + }, + { + "name": "java", + "total_engaged_users": 2, + "total_code_acceptances": 3, + "total_code_suggestions": 20, + "total_code_lines_accepted": 7, + "total_code_lines_suggested": 65 + }, + { + "name": "cpp", + "total_engaged_users": 3, + "total_code_acceptances": 9, + "total_code_suggestions": 43, + "total_code_lines_accepted": 9, + "total_code_lines_suggested": 59 + }, + { + "name": "dockerfile", + "total_engaged_users": 3, + "total_code_acceptances": 8, + "total_code_suggestions": 28, + "total_code_lines_accepted": 8, + "total_code_lines_suggested": 28 + }, + { + "name": "ql", + "total_engaged_users": 2, + "total_code_acceptances": 2, + "total_code_suggestions": 38, + "total_code_lines_accepted": 2, + "total_code_lines_suggested": 132 + }, + { + "name": "makefile", + "total_engaged_users": 1, + "total_code_acceptances": 0, + "total_code_suggestions": 4, + "total_code_lines_accepted": 0, + "total_code_lines_suggested": 5 + }, + { + "name": "shellscript", + "total_engaged_users": 6, + "total_code_acceptances": 30, + "total_code_suggestions": 57, + "total_code_lines_accepted": 47, + "total_code_lines_suggested": 78 + }, + { + "name": "csharp", + "total_engaged_users": 3, + "total_code_acceptances": 13, + "total_code_suggestions": 216, + "total_code_lines_accepted": 7, + "total_code_lines_suggested": 715 + }, + { + "name": "razor", + "total_engaged_users": 1, + "total_code_acceptances": 0, + "total_code_suggestions": 14, + "total_code_lines_accepted": 0, + "total_code_lines_suggested": 24 + }, + { + "name": "powershell", + "total_engaged_users": 2, + "total_code_acceptances": 90, + "total_code_suggestions": 227, + "total_code_lines_accepted": 201, + "total_code_lines_suggested": 840 + }, + { + "name": "go", + "total_engaged_users": 4, + "total_code_acceptances": 34, + "total_code_suggestions": 76, + "total_code_lines_accepted": 32, + "total_code_lines_suggested": 111 + }, + { + "name": "graphql", + "total_engaged_users": 1, + "total_code_acceptances": 0, + "total_code_suggestions": 2, + "total_code_lines_accepted": 0, + "total_code_lines_suggested": 2 + }, + { + "name": "sql", + "total_engaged_users": 1, + "total_code_acceptances": 0, + "total_code_suggestions": 1, + "total_code_lines_accepted": 0, + "total_code_lines_suggested": 2 + }, + { + "name": "svelte", + "total_engaged_users": 1, + "total_code_acceptances": 0, + "total_code_suggestions": 1, + "total_code_lines_accepted": 0, + "total_code_lines_suggested": 1 + }, + { + "name": "coffeescript", + "total_engaged_users": 1, + "total_code_acceptances": 0, + "total_code_suggestions": 2, + "total_code_lines_accepted": 0, + "total_code_lines_suggested": 12 + }, + { + "name": "bat", + "total_engaged_users": 1, + "total_code_acceptances": 0, + "total_code_suggestions": 2, + "total_code_lines_accepted": 0, + "total_code_lines_suggested": 2 + } + ], + "is_custom_model": false, + "total_engaged_users": 88 + } + ], + "total_engaged_users": 88 + }, + { + "name": "Neovim", + "models": [ + { + "name": "default", + "languages": [ + { + "name": "vue", + "total_engaged_users": 2, + "total_code_acceptances": 3, + "total_code_suggestions": 5, + "total_code_lines_accepted": 3, + "total_code_lines_suggested": 477 + }, + { + "name": "ruby", + "total_engaged_users": 3, + "total_code_acceptances": 10, + "total_code_suggestions": 49, + "total_code_lines_accepted": 11, + "total_code_lines_suggested": 156 + }, + { + "name": "html", + "total_engaged_users": 2, + "total_code_acceptances": 2, + "total_code_suggestions": 2, + "total_code_lines_accepted": 3, + "total_code_lines_suggested": 5 + }, + { + "name": "markdown", + "total_engaged_users": 2, + "total_code_acceptances": 1, + "total_code_suggestions": 51, + "total_code_lines_accepted": 1, + "total_code_lines_suggested": 180 + }, + { + "name": "unknown", + "total_engaged_users": 2, + "total_code_acceptances": 1, + "total_code_suggestions": 53, + "total_code_lines_accepted": 1, + "total_code_lines_suggested": 209 + } + ], + "is_custom_model": false, + "total_engaged_users": 4 + } + ], + "total_engaged_users": 4 + }, + { + "name": "JetBrains", + "models": [ + { + "name": "default", + "languages": [ + { + "name": "markdown", + "total_engaged_users": 1, + "total_code_acceptances": 0, + "total_code_suggestions": 3, + "total_code_lines_accepted": 0, + "total_code_lines_suggested": 24 + }, + { + "name": "yaml", + "total_engaged_users": 1, + "total_code_acceptances": 0, + "total_code_suggestions": 6, + "total_code_lines_accepted": 0, + "total_code_lines_suggested": 8 + }, + { + "name": "java", + "total_engaged_users": 2, + "total_code_acceptances": 26, + "total_code_suggestions": 34, + "total_code_lines_accepted": 53, + "total_code_lines_suggested": 70 + }, + { + "name": "csharp", + "total_engaged_users": 2, + "total_code_acceptances": 12, + "total_code_suggestions": 30, + "total_code_lines_accepted": 20, + "total_code_lines_suggested": 279 + }, + { + "name": "json", + "total_engaged_users": 2, + "total_code_acceptances": 1, + "total_code_suggestions": 2, + "total_code_lines_accepted": 1, + "total_code_lines_suggested": 2 + }, + { + "name": "javascript", + "total_engaged_users": 2, + "total_code_acceptances": 2, + "total_code_suggestions": 5, + "total_code_lines_accepted": 8, + "total_code_lines_suggested": 24 + }, + { + "name": "go", + "total_engaged_users": 2, + "total_code_acceptances": 7, + "total_code_suggestions": 15, + "total_code_lines_accepted": 7, + "total_code_lines_suggested": 21 + } + ], + "is_custom_model": false, + "total_engaged_users": 5 + } + ], + "total_engaged_users": 5 + }, + { + "name": "Xcode", + "models": [ + { + "name": "default", + "languages": [ + { + "name": "swift", + "total_engaged_users": 2, + "total_code_acceptances": 1, + "total_code_suggestions": 4, + "total_code_lines_accepted": 0, + "total_code_lines_suggested": 41 + } + ], + "is_custom_model": false, + "total_engaged_users": 2 + } + ], + "total_engaged_users": 2 + }, + { + "name": "VisualStudio", + "models": [ + { + "name": "default", + "languages": [ + { + "name": "cpp", + "total_engaged_users": 2, + "total_code_acceptances": 72, + "total_code_suggestions": 236, + "total_code_lines_accepted": 175, + "total_code_lines_suggested": 678 + } + ], + "is_custom_model": false, + "total_engaged_users": 2 + } + ], + "total_engaged_users": 2 + } + ], + "total_engaged_users": 95 + } + }, + { + "date": "2024-10-31", + "copilot_ide_chat": { + "editors": [ + { + "name": "vscode", + "models": [ + { + "name": "default", + "total_chats": 2111, + "is_custom_model": false, + "total_engaged_users": 66, + "total_chat_copy_events": 78, + "total_chat_insertion_events": 79 + } + ], + "total_engaged_users": 66 + }, + { + "name": "JetBrains", + "models": [ + { + "name": "default", + "total_chats": 12, + "is_custom_model": false, + "total_engaged_users": 2, + "total_chat_copy_events": 0, + "total_chat_insertion_events": 2 + } + ], + "total_engaged_users": 2 + } + ], + "total_engaged_users": 66 + }, + "total_active_users": 113, + "copilot_dotcom_chat": { + "models": [ + { + "name": "default", + "total_chats": 110, + "is_custom_model": false, + "total_engaged_users": 25 + } + ], + "total_engaged_users": 25 + }, + "total_engaged_users": 113, + "copilot_dotcom_pull_requests": { + "repositories": [ + { + "name": "math-service", + "models": [ + { + "name": "default", + "is_custom_model": false, + "total_engaged_users": 1, + "total_pr_summaries_created": 2 + } + ], + "total_engaged_users": 1 + }, + { + "name": "yugen-saga-server", + "models": [ + { + "name": "default", + "is_custom_model": false, + "total_engaged_users": 1, + "total_pr_summaries_created": 2 + } + ], + "total_engaged_users": 1 + }, + { + "name": "customer-feedback", + "models": [ + { + "name": "default", + "is_custom_model": false, + "total_engaged_users": 1, + "total_pr_summaries_created": 3 + } + ], + "total_engaged_users": 1 + }, + { + "name": "yaktriage", + "models": [ + { + "name": "default", + "is_custom_model": false, + "total_engaged_users": 1, + "total_pr_summaries_created": 2 + } + ], + "total_engaged_users": 1 + }, + { + "name": "sparkling-goggles", + "models": [ + { + "name": "default", + "is_custom_model": false, + "total_engaged_users": 1, + "total_pr_summaries_created": 1 + } + ], + "total_engaged_users": 1 + }, + { + "name": "github", + "models": [ + { + "name": "default", + "is_custom_model": false, + "total_engaged_users": 1, + "total_pr_summaries_created": 1 + } + ], + "total_engaged_users": 1 + }, + { + "name": "copilot-enterprise-demo", + "models": [ + { + "name": "default", + "is_custom_model": false, + "total_engaged_users": 1, + "total_pr_summaries_created": 2 + } + ], + "total_engaged_users": 1 + } + ], + "total_engaged_users": 7 + }, + "copilot_ide_code_completions": { + "editors": [ + { + "name": "vscode", + "models": [ + { + "name": "default", + "languages": [ + { + "name": "typescript", + "total_engaged_users": 11, + "total_code_acceptances": 270, + "total_code_suggestions": 821, + "total_code_lines_accepted": 295, + "total_code_lines_suggested": 1309 + }, + { + "name": "typescriptreact", + "total_engaged_users": 8, + "total_code_acceptances": 169, + "total_code_suggestions": 420, + "total_code_lines_accepted": 223, + "total_code_lines_suggested": 782 + }, + { + "name": "markdown", + "total_engaged_users": 10, + "total_code_acceptances": 90, + "total_code_suggestions": 857, + "total_code_lines_accepted": 97, + "total_code_lines_suggested": 1183 + }, + { + "name": "python", + "total_engaged_users": 3, + "total_code_acceptances": 94, + "total_code_suggestions": 232, + "total_code_lines_accepted": 126, + "total_code_lines_suggested": 333 + }, + { + "name": "unknown", + "total_engaged_users": 6, + "total_code_acceptances": 7, + "total_code_suggestions": 72, + "total_code_lines_accepted": 6, + "total_code_lines_suggested": 92 + }, + { + "name": "yaml", + "total_engaged_users": 12, + "total_code_acceptances": 99, + "total_code_suggestions": 404, + "total_code_lines_accepted": 160, + "total_code_lines_suggested": 622 + }, + { + "name": "scss", + "total_engaged_users": 4, + "total_code_acceptances": 28, + "total_code_suggestions": 107, + "total_code_lines_accepted": 49, + "total_code_lines_suggested": 223 + }, + { + "name": "javascript", + "total_engaged_users": 13, + "total_code_acceptances": 262, + "total_code_suggestions": 566, + "total_code_lines_accepted": 318, + "total_code_lines_suggested": 820 + }, + { + "name": "java", + "total_engaged_users": 3, + "total_code_acceptances": 12, + "total_code_suggestions": 49, + "total_code_lines_accepted": 24, + "total_code_lines_suggested": 120 + }, + { + "name": "json", + "total_engaged_users": 5, + "total_code_acceptances": 8, + "total_code_suggestions": 32, + "total_code_lines_accepted": 5, + "total_code_lines_suggested": 48 + }, + { + "name": "xml", + "total_engaged_users": 1, + "total_code_acceptances": 0, + "total_code_suggestions": 4, + "total_code_lines_accepted": 0, + "total_code_lines_suggested": 10 + }, + { + "name": "ini", + "total_engaged_users": 2, + "total_code_acceptances": 1, + "total_code_suggestions": 1, + "total_code_lines_accepted": 1, + "total_code_lines_suggested": 1 + }, + { + "name": "sql", + "total_engaged_users": 2, + "total_code_acceptances": 5, + "total_code_suggestions": 14, + "total_code_lines_accepted": 5, + "total_code_lines_suggested": 16 + }, + { + "name": "ruby", + "total_engaged_users": 10, + "total_code_acceptances": 139, + "total_code_suggestions": 343, + "total_code_lines_accepted": 167, + "total_code_lines_suggested": 657 + }, + { + "name": "shellscript", + "total_engaged_users": 4, + "total_code_acceptances": 14, + "total_code_suggestions": 65, + "total_code_lines_accepted": 16, + "total_code_lines_suggested": 75 + }, + { + "name": "html", + "total_engaged_users": 2, + "total_code_acceptances": 9, + "total_code_suggestions": 23, + "total_code_lines_accepted": 8, + "total_code_lines_suggested": 55 + }, + { + "name": "dotenv", + "total_engaged_users": 3, + "total_code_acceptances": 2, + "total_code_suggestions": 13, + "total_code_lines_accepted": 1, + "total_code_lines_suggested": 15 + }, + { + "name": "css", + "total_engaged_users": 2, + "total_code_acceptances": 23, + "total_code_suggestions": 76, + "total_code_lines_accepted": 31, + "total_code_lines_suggested": 139 + }, + { + "name": "jsonc", + "total_engaged_users": 1, + "total_code_acceptances": 0, + "total_code_suggestions": 4, + "total_code_lines_accepted": 0, + "total_code_lines_suggested": 7 + }, + { + "name": "cpp", + "total_engaged_users": 1, + "total_code_acceptances": 0, + "total_code_suggestions": 3, + "total_code_lines_accepted": 0, + "total_code_lines_suggested": 23 + }, + { + "name": "coffeescript", + "total_engaged_users": 1, + "total_code_acceptances": 0, + "total_code_suggestions": 5, + "total_code_lines_accepted": 0, + "total_code_lines_suggested": 9 + }, + { + "name": "go", + "total_engaged_users": 4, + "total_code_acceptances": 39, + "total_code_suggestions": 165, + "total_code_lines_accepted": 40, + "total_code_lines_suggested": 305 + }, + { + "name": "csharp", + "total_engaged_users": 4, + "total_code_acceptances": 42, + "total_code_suggestions": 124, + "total_code_lines_accepted": 55, + "total_code_lines_suggested": 366 + }, + { + "name": "razor", + "total_engaged_users": 1, + "total_code_acceptances": 0, + "total_code_suggestions": 7, + "total_code_lines_accepted": 0, + "total_code_lines_suggested": 20 + }, + { + "name": "svelte", + "total_engaged_users": 1, + "total_code_acceptances": 0, + "total_code_suggestions": 2, + "total_code_lines_accepted": 0, + "total_code_lines_suggested": 2 + }, + { + "name": "powershell", + "total_engaged_users": 3, + "total_code_acceptances": 15, + "total_code_suggestions": 70, + "total_code_lines_accepted": 26, + "total_code_lines_suggested": 93 + }, + { + "name": "terraform", + "total_engaged_users": 1, + "total_code_acceptances": 0, + "total_code_suggestions": 1, + "total_code_lines_accepted": 0, + "total_code_lines_suggested": 1 + }, + { + "name": "tex", + "total_engaged_users": 1, + "total_code_acceptances": 0, + "total_code_suggestions": 3, + "total_code_lines_accepted": 0, + "total_code_lines_suggested": 5 + }, + { + "name": "ql", + "total_engaged_users": 2, + "total_code_acceptances": 10, + "total_code_suggestions": 100, + "total_code_lines_accepted": 9, + "total_code_lines_suggested": 143 + }, + { + "name": "plaintext", + "total_engaged_users": 1, + "total_code_acceptances": 0, + "total_code_suggestions": 14, + "total_code_lines_accepted": 0, + "total_code_lines_suggested": 14 + }, + { + "name": "graphql", + "total_engaged_users": 2, + "total_code_acceptances": 2, + "total_code_suggestions": 2, + "total_code_lines_accepted": 2, + "total_code_lines_suggested": 2 + }, + { + "name": "groovy", + "total_engaged_users": 2, + "total_code_acceptances": 24, + "total_code_suggestions": 102, + "total_code_lines_accepted": 30, + "total_code_lines_suggested": 472 + } + ], + "is_custom_model": false, + "total_engaged_users": 65 + } + ], + "total_engaged_users": 65 + }, + { + "name": "JetBrains", + "models": [ + { + "name": "default", + "languages": [ + { + "name": "java", + "total_engaged_users": 3, + "total_code_acceptances": 31, + "total_code_suggestions": 54, + "total_code_lines_accepted": 53, + "total_code_lines_suggested": 130 + } + ], + "is_custom_model": false, + "total_engaged_users": 3 + } + ], + "total_engaged_users": 3 + }, + { + "name": "Neovim", + "models": [ + { + "name": "default", + "languages": [ + { + "name": "shellscript", + "total_engaged_users": 2, + "total_code_acceptances": 48, + "total_code_suggestions": 135, + "total_code_lines_accepted": 102, + "total_code_lines_suggested": 480 + }, + { + "name": "markdown", + "total_engaged_users": 2, + "total_code_acceptances": 68, + "total_code_suggestions": 231, + "total_code_lines_accepted": 80, + "total_code_lines_suggested": 806 + }, + { + "name": "yaml", + "total_engaged_users": 1, + "total_code_acceptances": 0, + "total_code_suggestions": 3, + "total_code_lines_accepted": 0, + "total_code_lines_suggested": 13 + }, + { + "name": "unknown", + "total_engaged_users": 1, + "total_code_acceptances": 0, + "total_code_suggestions": 2, + "total_code_lines_accepted": 0, + "total_code_lines_suggested": 2 + }, + { + "name": "dockerfile", + "total_engaged_users": 1, + "total_code_acceptances": 0, + "total_code_suggestions": 1, + "total_code_lines_accepted": 0, + "total_code_lines_suggested": 1 + }, + { + "name": "ruby", + "total_engaged_users": 2, + "total_code_acceptances": 33, + "total_code_suggestions": 99, + "total_code_lines_accepted": 33, + "total_code_lines_suggested": 238 + } + ], + "is_custom_model": false, + "total_engaged_users": 3 + } + ], + "total_engaged_users": 3 + }, + { + "name": "Vim", + "models": [ + { + "name": "default", + "languages": [ + { + "name": "unknown", + "total_engaged_users": 1, + "total_code_acceptances": 0, + "total_code_suggestions": 1, + "total_code_lines_accepted": 0, + "total_code_lines_suggested": 1 + } + ], + "is_custom_model": false, + "total_engaged_users": 1 + } + ], + "total_engaged_users": 1 + }, + { + "name": "VisualStudio", + "models": [ + { + "name": "default", + "languages": [ + { + "name": "cpp", + "total_engaged_users": 2, + "total_code_acceptances": 40, + "total_code_suggestions": 81, + "total_code_lines_accepted": 41, + "total_code_lines_suggested": 103 + }, + { + "name": "csharp", + "total_engaged_users": 2, + "total_code_acceptances": 3, + "total_code_suggestions": 12, + "total_code_lines_accepted": 6, + "total_code_lines_suggested": 32 + } + ], + "is_custom_model": false, + "total_engaged_users": 3 + } + ], + "total_engaged_users": 3 + } + ], + "total_engaged_users": 68 + } + }, + { + "date": "2024-11-01", + "copilot_ide_chat": { + "editors": [ + { + "name": "vscode", + "models": [ + { + "name": "default", + "total_chats": 1907, + "is_custom_model": false, + "total_engaged_users": 67, + "total_chat_copy_events": 85, + "total_chat_insertion_events": 63 + } + ], + "total_engaged_users": 67 + }, + { + "name": "JetBrains", + "models": [ + { + "name": "default", + "total_chats": 16, + "is_custom_model": false, + "total_engaged_users": 2, + "total_chat_copy_events": 1, + "total_chat_insertion_events": 1 + } + ], + "total_engaged_users": 2 + } + ], + "total_engaged_users": 69 + }, + "total_active_users": 104, + "copilot_dotcom_chat": { + "models": [ + { + "name": "default", + "total_chats": 67, + "is_custom_model": false, + "total_engaged_users": 19 + } + ], + "total_engaged_users": 19 + }, + "total_engaged_users": 104, + "copilot_dotcom_pull_requests": { + "repositories": [ + { + "name": "copilot-enterprise-demo", + "models": [ + { + "name": "default", + "is_custom_model": false, + "total_engaged_users": 1, + "total_pr_summaries_created": 2 + } + ], + "total_engaged_users": 1 + }, + { + "name": "himadri518-copilot-demo", + "models": [ + { + "name": "default", + "is_custom_model": false, + "total_engaged_users": 1, + "total_pr_summaries_created": 1 + } + ], + "total_engaged_users": 1 + }, + { + "name": "Elastic", + "models": [ + { + "name": "default", + "is_custom_model": false, + "total_engaged_users": 1, + "total_pr_summaries_created": 2 + } + ], + "total_engaged_users": 1 + }, + { + "name": "java-springboot-demo", + "models": [ + { + "name": "default", + "is_custom_model": false, + "total_engaged_users": 1, + "total_pr_summaries_created": 1 + } + ], + "total_engaged_users": 1 + }, + { + "name": "math-service", + "models": [ + { + "name": "default", + "is_custom_model": false, + "total_engaged_users": 1, + "total_pr_summaries_created": 4 + } + ], + "total_engaged_users": 1 + }, + { + "name": "yugen-saga-client", + "models": [ + { + "name": "default", + "is_custom_model": false, + "total_engaged_users": 1, + "total_pr_summaries_created": 1 + } + ], + "total_engaged_users": 1 + } + ], + "total_engaged_users": 6 + }, + "copilot_ide_code_completions": { + "editors": [ + { + "name": "vscode", + "models": [ + { + "name": "default", + "languages": [ + { + "name": "python", + "total_engaged_users": 7, + "total_code_acceptances": 127, + "total_code_suggestions": 378, + "total_code_lines_accepted": 182, + "total_code_lines_suggested": 626 + }, + { + "name": "csharp", + "total_engaged_users": 2, + "total_code_acceptances": 23, + "total_code_suggestions": 80, + "total_code_lines_accepted": 24, + "total_code_lines_suggested": 194 + }, + { + "name": "javascript", + "total_engaged_users": 15, + "total_code_acceptances": 105, + "total_code_suggestions": 288, + "total_code_lines_accepted": 149, + "total_code_lines_suggested": 674 + }, + { + "name": "razor", + "total_engaged_users": 2, + "total_code_acceptances": 5, + "total_code_suggestions": 12, + "total_code_lines_accepted": 7, + "total_code_lines_suggested": 36 + }, + { + "name": "shellscript", + "total_engaged_users": 4, + "total_code_acceptances": 18, + "total_code_suggestions": 70, + "total_code_lines_accepted": 21, + "total_code_lines_suggested": 83 + }, + { + "name": "unknown", + "total_engaged_users": 9, + "total_code_acceptances": 31, + "total_code_suggestions": 289, + "total_code_lines_accepted": 35, + "total_code_lines_suggested": 374 + }, + { + "name": "markdown", + "total_engaged_users": 12, + "total_code_acceptances": 91, + "total_code_suggestions": 1174, + "total_code_lines_accepted": 102, + "total_code_lines_suggested": 1636 + }, + { + "name": "ruby", + "total_engaged_users": 11, + "total_code_acceptances": 288, + "total_code_suggestions": 776, + "total_code_lines_accepted": 292, + "total_code_lines_suggested": 1166 + }, + { + "name": "html", + "total_engaged_users": 7, + "total_code_acceptances": 25, + "total_code_suggestions": 91, + "total_code_lines_accepted": 72, + "total_code_lines_suggested": 233 + }, + { + "name": "css", + "total_engaged_users": 4, + "total_code_acceptances": 18, + "total_code_suggestions": 53, + "total_code_lines_accepted": 20, + "total_code_lines_suggested": 115 + }, + { + "name": "yaml", + "total_engaged_users": 7, + "total_code_acceptances": 21, + "total_code_suggestions": 132, + "total_code_lines_accepted": 19, + "total_code_lines_suggested": 222 + }, + { + "name": "javascriptreact", + "total_engaged_users": 2, + "total_code_acceptances": 1, + "total_code_suggestions": 2, + "total_code_lines_accepted": 0, + "total_code_lines_suggested": 2 + }, + { + "name": "typescript", + "total_engaged_users": 9, + "total_code_acceptances": 434, + "total_code_suggestions": 1219, + "total_code_lines_accepted": 502, + "total_code_lines_suggested": 1999 + }, + { + "name": "java", + "total_engaged_users": 6, + "total_code_acceptances": 51, + "total_code_suggestions": 138, + "total_code_lines_accepted": 71, + "total_code_lines_suggested": 279 + }, + { + "name": "cpp", + "total_engaged_users": 2, + "total_code_acceptances": 19, + "total_code_suggestions": 22, + "total_code_lines_accepted": 75, + "total_code_lines_suggested": 83 + }, + { + "name": "dotenv", + "total_engaged_users": 1, + "total_code_acceptances": 0, + "total_code_suggestions": 1, + "total_code_lines_accepted": 0, + "total_code_lines_suggested": 1 + }, + { + "name": "xml", + "total_engaged_users": 3, + "total_code_acceptances": 5, + "total_code_suggestions": 17, + "total_code_lines_accepted": 27, + "total_code_lines_suggested": 54 + }, + { + "name": "vue", + "total_engaged_users": 2, + "total_code_acceptances": 2, + "total_code_suggestions": 11, + "total_code_lines_accepted": 1, + "total_code_lines_suggested": 13 + }, + { + "name": "dockerfile", + "total_engaged_users": 3, + "total_code_acceptances": 2, + "total_code_suggestions": 13, + "total_code_lines_accepted": 2, + "total_code_lines_suggested": 15 + }, + { + "name": "ql", + "total_engaged_users": 4, + "total_code_acceptances": 40, + "total_code_suggestions": 287, + "total_code_lines_accepted": 69, + "total_code_lines_suggested": 649 + }, + { + "name": "typescriptreact", + "total_engaged_users": 7, + "total_code_acceptances": 93, + "total_code_suggestions": 286, + "total_code_lines_accepted": 78, + "total_code_lines_suggested": 432 + }, + { + "name": "jsonc", + "total_engaged_users": 1, + "total_code_acceptances": 0, + "total_code_suggestions": 5, + "total_code_lines_accepted": 0, + "total_code_lines_suggested": 6 + }, + { + "name": "json", + "total_engaged_users": 3, + "total_code_acceptances": 4, + "total_code_suggestions": 24, + "total_code_lines_accepted": 4, + "total_code_lines_suggested": 72 + }, + { + "name": "sql", + "total_engaged_users": 2, + "total_code_acceptances": 1, + "total_code_suggestions": 6, + "total_code_lines_accepted": 0, + "total_code_lines_suggested": 26 + }, + { + "name": "scss", + "total_engaged_users": 4, + "total_code_acceptances": 22, + "total_code_suggestions": 108, + "total_code_lines_accepted": 17, + "total_code_lines_suggested": 186 + }, + { + "name": "groovy", + "total_engaged_users": 1, + "total_code_acceptances": 0, + "total_code_suggestions": 4, + "total_code_lines_accepted": 0, + "total_code_lines_suggested": 66 + }, + { + "name": "svelte", + "total_engaged_users": 2, + "total_code_acceptances": 8, + "total_code_suggestions": 18, + "total_code_lines_accepted": 6, + "total_code_lines_suggested": 44 + }, + { + "name": "kusto", + "total_engaged_users": 2, + "total_code_acceptances": 1, + "total_code_suggestions": 6, + "total_code_lines_accepted": 1, + "total_code_lines_suggested": 17 + }, + { + "name": "go", + "total_engaged_users": 2, + "total_code_acceptances": 4, + "total_code_suggestions": 12, + "total_code_lines_accepted": 3, + "total_code_lines_suggested": 13 + }, + { + "name": "powershell", + "total_engaged_users": 2, + "total_code_acceptances": 17, + "total_code_suggestions": 28, + "total_code_lines_accepted": 17, + "total_code_lines_suggested": 31 + }, + { + "name": "scala", + "total_engaged_users": 2, + "total_code_acceptances": 5, + "total_code_suggestions": 15, + "total_code_lines_accepted": 6, + "total_code_lines_suggested": 32 + }, + { + "name": "graphql", + "total_engaged_users": 1, + "total_code_acceptances": 0, + "total_code_suggestions": 5, + "total_code_lines_accepted": 0, + "total_code_lines_suggested": 5 + }, + { + "name": "perl", + "total_engaged_users": 1, + "total_code_acceptances": 0, + "total_code_suggestions": 11, + "total_code_lines_accepted": 0, + "total_code_lines_suggested": 18 + } + ], + "is_custom_model": false, + "total_engaged_users": 61 + } + ], + "total_engaged_users": 61 + }, + { + "name": "JetBrains", + "models": [ + { + "name": "default", + "languages": [ + { + "name": "dockerfile", + "total_engaged_users": 1, + "total_code_acceptances": 0, + "total_code_suggestions": 1, + "total_code_lines_accepted": 0, + "total_code_lines_suggested": 1 + } + ], + "is_custom_model": false, + "total_engaged_users": 1 + } + ], + "total_engaged_users": 1 + }, + { + "name": "VisualStudio", + "models": [ + { + "name": "default", + "languages": [ + { + "name": "cpp", + "total_engaged_users": 2, + "total_code_acceptances": 11, + "total_code_suggestions": 31, + "total_code_lines_accepted": 11, + "total_code_lines_suggested": 31 + } + ], + "is_custom_model": false, + "total_engaged_users": 2 + } + ], + "total_engaged_users": 2 + }, + { + "name": "Neovim", + "models": [ + { + "name": "default", + "languages": [ + { + "name": "rust", + "total_engaged_users": 1, + "total_code_acceptances": 0, + "total_code_suggestions": 1, + "total_code_lines_accepted": 0, + "total_code_lines_suggested": 1 + }, + { + "name": "ruby", + "total_engaged_users": 1, + "total_code_acceptances": 0, + "total_code_suggestions": 7, + "total_code_lines_accepted": 0, + "total_code_lines_suggested": 8 + } + ], + "is_custom_model": false, + "total_engaged_users": 1 + } + ], + "total_engaged_users": 1 + } + ], + "total_engaged_users": 62 + } + }, + { + "date": "2024-11-02", + "copilot_ide_chat": { + "editors": [ + { + "name": "vscode", + "models": [ + { + "name": "default", + "total_chats": 760, + "is_custom_model": false, + "total_engaged_users": 30, + "total_chat_copy_events": 32, + "total_chat_insertion_events": 19 + } + ], + "total_engaged_users": 30 + } + ], + "total_engaged_users": 30 + }, + "total_active_users": 46, + "copilot_dotcom_chat": { + "models": [ + { + "name": "default", + "total_chats": 9, + "is_custom_model": false, + "total_engaged_users": 3 + } + ], + "total_engaged_users": 3 + }, + "total_engaged_users": 46, + "copilot_dotcom_pull_requests": { + "repositories": [ + { + "name": "platform-field", + "models": [ + { + "name": "default", + "is_custom_model": false, + "total_engaged_users": 1, + "total_pr_summaries_created": 1 + } + ], + "total_engaged_users": 1 + }, + { + "name": "aitour-advanced-coding-visual-studio-code-and-github-copilot", + "models": [ + { + "name": "default", + "is_custom_model": false, + "total_engaged_users": 1, + "total_pr_summaries_created": 4 + } + ], + "total_engaged_users": 1 + }, + { + "name": "vitest-coverage-report-action", + "models": [ + { + "name": "default", + "is_custom_model": false, + "total_engaged_users": 1, + "total_pr_summaries_created": 1 + } + ], + "total_engaged_users": 1 + } + ], + "total_engaged_users": 3 + }, + "copilot_ide_code_completions": { + "editors": [ + { + "name": "vscode", + "models": [ + { + "name": "default", + "languages": [ + { + "name": "python", + "total_engaged_users": 6, + "total_code_acceptances": 311, + "total_code_suggestions": 742, + "total_code_lines_accepted": 430, + "total_code_lines_suggested": 1515 + }, + { + "name": "scss", + "total_engaged_users": 4, + "total_code_acceptances": 19, + "total_code_suggestions": 72, + "total_code_lines_accepted": 32, + "total_code_lines_suggested": 137 + }, + { + "name": "typescript", + "total_engaged_users": 6, + "total_code_acceptances": 127, + "total_code_suggestions": 248, + "total_code_lines_accepted": 234, + "total_code_lines_suggested": 454 + }, + { + "name": "javascript", + "total_engaged_users": 5, + "total_code_acceptances": 45, + "total_code_suggestions": 189, + "total_code_lines_accepted": 35, + "total_code_lines_suggested": 282 + }, + { + "name": "yaml", + "total_engaged_users": 6, + "total_code_acceptances": 41, + "total_code_suggestions": 152, + "total_code_lines_accepted": 67, + "total_code_lines_suggested": 256 + }, + { + "name": "jsonc", + "total_engaged_users": 1, + "total_code_acceptances": 0, + "total_code_suggestions": 3, + "total_code_lines_accepted": 0, + "total_code_lines_suggested": 3 + }, + { + "name": "csharp", + "total_engaged_users": 3, + "total_code_acceptances": 16, + "total_code_suggestions": 32, + "total_code_lines_accepted": 10, + "total_code_lines_suggested": 34 + }, + { + "name": "json", + "total_engaged_users": 4, + "total_code_acceptances": 4, + "total_code_suggestions": 21, + "total_code_lines_accepted": 4, + "total_code_lines_suggested": 29 + }, + { + "name": "unknown", + "total_engaged_users": 6, + "total_code_acceptances": 18, + "total_code_suggestions": 41, + "total_code_lines_accepted": 22, + "total_code_lines_suggested": 59 + }, + { + "name": "markdown", + "total_engaged_users": 2, + "total_code_acceptances": 71, + "total_code_suggestions": 718, + "total_code_lines_accepted": 101, + "total_code_lines_suggested": 1453 + }, + { + "name": "html", + "total_engaged_users": 3, + "total_code_acceptances": 35, + "total_code_suggestions": 120, + "total_code_lines_accepted": 43, + "total_code_lines_suggested": 281 + }, + { + "name": "ruby", + "total_engaged_users": 5, + "total_code_acceptances": 77, + "total_code_suggestions": 229, + "total_code_lines_accepted": 107, + "total_code_lines_suggested": 383 + }, + { + "name": "xml", + "total_engaged_users": 2, + "total_code_acceptances": 8, + "total_code_suggestions": 13, + "total_code_lines_accepted": 8, + "total_code_lines_suggested": 19 + }, + { + "name": "typescriptreact", + "total_engaged_users": 6, + "total_code_acceptances": 123, + "total_code_suggestions": 343, + "total_code_lines_accepted": 70, + "total_code_lines_suggested": 498 + }, + { + "name": "css", + "total_engaged_users": 4, + "total_code_acceptances": 23, + "total_code_suggestions": 76, + "total_code_lines_accepted": 40, + "total_code_lines_suggested": 264 + }, + { + "name": "dockerfile", + "total_engaged_users": 1, + "total_code_acceptances": 0, + "total_code_suggestions": 3, + "total_code_lines_accepted": 0, + "total_code_lines_suggested": 4 + }, + { + "name": "shellscript", + "total_engaged_users": 1, + "total_code_acceptances": 0, + "total_code_suggestions": 4, + "total_code_lines_accepted": 0, + "total_code_lines_suggested": 5 + }, + { + "name": "ql", + "total_engaged_users": 2, + "total_code_acceptances": 24, + "total_code_suggestions": 109, + "total_code_lines_accepted": 72, + "total_code_lines_suggested": 260 + }, + { + "name": "java", + "total_engaged_users": 3, + "total_code_acceptances": 9, + "total_code_suggestions": 40, + "total_code_lines_accepted": 8, + "total_code_lines_suggested": 50 + } + ], + "is_custom_model": false, + "total_engaged_users": 34 + } + ], + "total_engaged_users": 34 + }, + { + "name": "JetBrains", + "models": [ + { + "name": "default", + "languages": [ + { + "name": "ini", + "total_engaged_users": 2, + "total_code_acceptances": 1, + "total_code_suggestions": 3, + "total_code_lines_accepted": 1, + "total_code_lines_suggested": 6 + }, + { + "name": "xml", + "total_engaged_users": 2, + "total_code_acceptances": 3, + "total_code_suggestions": 13, + "total_code_lines_accepted": 4, + "total_code_lines_suggested": 47 + }, + { + "name": "java", + "total_engaged_users": 2, + "total_code_acceptances": 2, + "total_code_suggestions": 6, + "total_code_lines_accepted": 2, + "total_code_lines_suggested": 6 + } + ], + "is_custom_model": false, + "total_engaged_users": 2 + } + ], + "total_engaged_users": 2 + }, + { + "name": "VisualStudio", + "models": [ + { + "name": "default", + "languages": [ + { + "name": "cpp", + "total_engaged_users": 2, + "total_code_acceptances": 16, + "total_code_suggestions": 66, + "total_code_lines_accepted": 19, + "total_code_lines_suggested": 115 + } + ], + "is_custom_model": false, + "total_engaged_users": 2 + } + ], + "total_engaged_users": 2 + } + ], + "total_engaged_users": 35 + } + }, + { + "date": "2024-11-03", + "copilot_ide_chat": { + "editors": [ + { + "name": "vscode", + "models": [ + { + "name": "default", + "total_chats": 1417, + "is_custom_model": false, + "total_engaged_users": 33, + "total_chat_copy_events": 15, + "total_chat_insertion_events": 44 + } + ], + "total_engaged_users": 33 + }, + { + "name": "JetBrains", + "models": [ + { + "name": "default", + "total_chats": 4, + "is_custom_model": false, + "total_engaged_users": 1, + "total_chat_copy_events": 1, + "total_chat_insertion_events": 2 + } + ], + "total_engaged_users": 1 + } + ], + "total_engaged_users": 33 + }, + "total_active_users": 47, + "copilot_dotcom_chat": { + "models": [ + { + "name": "default", + "total_chats": 7, + "is_custom_model": false, + "total_engaged_users": 4 + } + ], + "total_engaged_users": 4 + }, + "total_engaged_users": 47, + "copilot_dotcom_pull_requests": { + "repositories": [ + { + "name": "windr-front", + "models": [ + { + "name": "default", + "is_custom_model": false, + "total_engaged_users": 1, + "total_pr_summaries_created": 2 + } + ], + "total_engaged_users": 1 + }, + { + "name": "", + "models": [ + { + "name": "default", + "is_custom_model": false, + "total_engaged_users": 1, + "total_pr_summaries_created": 4 + } + ], + "total_engaged_users": 1 + } + ], + "total_engaged_users": 2 + }, + "copilot_ide_code_completions": { + "editors": [ + { + "name": "vscode", + "models": [ + { + "name": "default", + "languages": [ + { + "name": "unknown", + "total_engaged_users": 5, + "total_code_acceptances": 12, + "total_code_suggestions": 77, + "total_code_lines_accepted": 10, + "total_code_lines_suggested": 92 + }, + { + "name": "javascript", + "total_engaged_users": 7, + "total_code_acceptances": 42, + "total_code_suggestions": 139, + "total_code_lines_accepted": 96, + "total_code_lines_suggested": 351 + }, + { + "name": "shellscript", + "total_engaged_users": 4, + "total_code_acceptances": 9, + "total_code_suggestions": 57, + "total_code_lines_accepted": 7, + "total_code_lines_suggested": 62 + }, + { + "name": "json", + "total_engaged_users": 5, + "total_code_acceptances": 14, + "total_code_suggestions": 89, + "total_code_lines_accepted": 18, + "total_code_lines_suggested": 206 + }, + { + "name": "markdown", + "total_engaged_users": 5, + "total_code_acceptances": 78, + "total_code_suggestions": 605, + "total_code_lines_accepted": 92, + "total_code_lines_suggested": 837 + }, + { + "name": "go", + "total_engaged_users": 2, + "total_code_acceptances": 61, + "total_code_suggestions": 91, + "total_code_lines_accepted": 86, + "total_code_lines_suggested": 149 + }, + { + "name": "xml", + "total_engaged_users": 2, + "total_code_acceptances": 7, + "total_code_suggestions": 18, + "total_code_lines_accepted": 9, + "total_code_lines_suggested": 35 + }, + { + "name": "yaml", + "total_engaged_users": 6, + "total_code_acceptances": 27, + "total_code_suggestions": 87, + "total_code_lines_accepted": 35, + "total_code_lines_suggested": 308 + }, + { + "name": "python", + "total_engaged_users": 4, + "total_code_acceptances": 340, + "total_code_suggestions": 809, + "total_code_lines_accepted": 381, + "total_code_lines_suggested": 1454 + }, + { + "name": "typescriptreact", + "total_engaged_users": 6, + "total_code_acceptances": 134, + "total_code_suggestions": 298, + "total_code_lines_accepted": 164, + "total_code_lines_suggested": 528 + }, + { + "name": "css", + "total_engaged_users": 3, + "total_code_acceptances": 4, + "total_code_suggestions": 19, + "total_code_lines_accepted": 4, + "total_code_lines_suggested": 64 + }, + { + "name": "ruby", + "total_engaged_users": 3, + "total_code_acceptances": 46, + "total_code_suggestions": 191, + "total_code_lines_accepted": 31, + "total_code_lines_suggested": 253 + }, + { + "name": "powershell", + "total_engaged_users": 2, + "total_code_acceptances": 14, + "total_code_suggestions": 59, + "total_code_lines_accepted": 9, + "total_code_lines_suggested": 91 + }, + { + "name": "jsonc", + "total_engaged_users": 5, + "total_code_acceptances": 7, + "total_code_suggestions": 23, + "total_code_lines_accepted": 10, + "total_code_lines_suggested": 34 + }, + { + "name": "typescript", + "total_engaged_users": 9, + "total_code_acceptances": 232, + "total_code_suggestions": 539, + "total_code_lines_accepted": 316, + "total_code_lines_suggested": 810 + }, + { + "name": "scss", + "total_engaged_users": 3, + "total_code_acceptances": 27, + "total_code_suggestions": 136, + "total_code_lines_accepted": 32, + "total_code_lines_suggested": 236 + }, + { + "name": "java", + "total_engaged_users": 2, + "total_code_acceptances": 13, + "total_code_suggestions": 24, + "total_code_lines_accepted": 17, + "total_code_lines_suggested": 60 + }, + { + "name": "svelte", + "total_engaged_users": 2, + "total_code_acceptances": 3, + "total_code_suggestions": 3, + "total_code_lines_accepted": 1, + "total_code_lines_suggested": 3 + }, + { + "name": "dotenv", + "total_engaged_users": 1, + "total_code_acceptances": 0, + "total_code_suggestions": 2, + "total_code_lines_accepted": 0, + "total_code_lines_suggested": 2 + }, + { + "name": "csharp", + "total_engaged_users": 3, + "total_code_acceptances": 27, + "total_code_suggestions": 93, + "total_code_lines_accepted": 45, + "total_code_lines_suggested": 301 + }, + { + "name": "ql", + "total_engaged_users": 2, + "total_code_acceptances": 175, + "total_code_suggestions": 641, + "total_code_lines_accepted": 343, + "total_code_lines_suggested": 1514 + }, + { + "name": "rust", + "total_engaged_users": 2, + "total_code_acceptances": 19, + "total_code_suggestions": 55, + "total_code_lines_accepted": 24, + "total_code_lines_suggested": 94 + } + ], + "is_custom_model": false, + "total_engaged_users": 33 + } + ], + "total_engaged_users": 33 + }, + { + "name": "Xcode", + "models": [ + { + "name": "default", + "languages": [ + { + "name": "swift", + "total_engaged_users": 2, + "total_code_acceptances": 9, + "total_code_suggestions": 15, + "total_code_lines_accepted": 6, + "total_code_lines_suggested": 88 + } + ], + "is_custom_model": false, + "total_engaged_users": 2 + } + ], + "total_engaged_users": 2 + }, + { + "name": "JetBrains", + "models": [ + { + "name": "default", + "languages": [ + { + "name": "sql", + "total_engaged_users": 2, + "total_code_acceptances": 3, + "total_code_suggestions": 14, + "total_code_lines_accepted": 8, + "total_code_lines_suggested": 64 + } + ], + "is_custom_model": false, + "total_engaged_users": 2 + } + ], + "total_engaged_users": 2 + }, + { + "name": "VisualStudio", + "models": [ + { + "name": "default", + "languages": [ + { + "name": "yaml", + "total_engaged_users": 2, + "total_code_acceptances": 6, + "total_code_suggestions": 10, + "total_code_lines_accepted": 6, + "total_code_lines_suggested": 10 + }, + { + "name": "cpp", + "total_engaged_users": 2, + "total_code_acceptances": 71, + "total_code_suggestions": 236, + "total_code_lines_accepted": 156, + "total_code_lines_suggested": 736 + }, + { + "name": "csharp", + "total_engaged_users": 1, + "total_code_acceptances": 0, + "total_code_suggestions": 1, + "total_code_lines_accepted": 0, + "total_code_lines_suggested": 1 + }, + { + "name": "c/c++", + "total_engaged_users": 2, + "total_code_acceptances": 2, + "total_code_suggestions": 13, + "total_code_lines_accepted": 2, + "total_code_lines_suggested": 22 + } + ], + "is_custom_model": false, + "total_engaged_users": 3 + } + ], + "total_engaged_users": 3 + } + ], + "total_engaged_users": 36 + } + }, + { + "date": "2024-11-04", + "copilot_ide_chat": { + "editors": [ + { + "name": "vscode", + "models": [ + { + "name": "default", + "total_chats": 2191, + "is_custom_model": false, + "total_engaged_users": 103, + "total_chat_copy_events": 131, + "total_chat_insertion_events": 37 + } + ], + "total_engaged_users": 103 + }, + { + "name": "JetBrains", + "models": [ + { + "name": "default", + "total_chats": 52, + "is_custom_model": false, + "total_engaged_users": 6, + "total_chat_copy_events": 7, + "total_chat_insertion_events": 8 + } + ], + "total_engaged_users": 6 + } + ], + "total_engaged_users": 107 + }, + "total_active_users": 151, + "copilot_dotcom_chat": { + "models": [ + { + "name": "default", + "total_chats": 174, + "is_custom_model": false, + "total_engaged_users": 44 + } + ], + "total_engaged_users": 44 + }, + "total_engaged_users": 151, + "copilot_dotcom_pull_requests": { + "repositories": [ + { + "name": "github-webhook-dispatcher", + "models": [ + { + "name": "default", + "is_custom_model": false, + "total_engaged_users": 1, + "total_pr_summaries_created": 1 + } + ], + "total_engaged_users": 1 + }, + { + "name": "sandbox", + "models": [ + { + "name": "default", + "is_custom_model": false, + "total_engaged_users": 1, + "total_pr_summaries_created": 1 + } + ], + "total_engaged_users": 1 + }, + { + "name": "JackGKafaty_GitHubAdvancedSecurity", + "models": [ + { + "name": "default", + "is_custom_model": false, + "total_engaged_users": 1, + "total_pr_summaries_created": 2 + } + ], + "total_engaged_users": 1 + }, + { + "name": "memcache", + "models": [ + { + "name": "default", + "is_custom_model": false, + "total_engaged_users": 1, + "total_pr_summaries_created": 1 + } + ], + "total_engaged_users": 1 + }, + { + "name": "haikus-for-june", + "models": [ + { + "name": "default", + "is_custom_model": false, + "total_engaged_users": 1, + "total_pr_summaries_created": 2 + } + ], + "total_engaged_users": 1 + }, + { + "name": "ldennington-ghas-template", + "models": [ + { + "name": "default", + "is_custom_model": false, + "total_engaged_users": 1, + "total_pr_summaries_created": 1 + } + ], + "total_engaged_users": 1 + }, + { + "name": "howie-config", + "models": [ + { + "name": "default", + "is_custom_model": false, + "total_engaged_users": 1, + "total_pr_summaries_created": 1 + } + ], + "total_engaged_users": 1 + }, + { + "name": "Infosys", + "models": [ + { + "name": "default", + "is_custom_model": false, + "total_engaged_users": 1, + "total_pr_summaries_created": 2 + } + ], + "total_engaged_users": 1 + }, + { + "name": "purple-world", + "models": [ + { + "name": "default", + "is_custom_model": false, + "total_engaged_users": 1, + "total_pr_summaries_created": 0 + } + ], + "total_engaged_users": 1 + }, + { + "name": "math-more-math", + "models": [ + { + "name": "default", + "is_custom_model": false, + "total_engaged_users": 1, + "total_pr_summaries_created": 2 + } + ], + "total_engaged_users": 1 + }, + { + "name": "gh-skyline", + "models": [ + { + "name": "default", + "is_custom_model": false, + "total_engaged_users": 1, + "total_pr_summaries_created": 1 + } + ], + "total_engaged_users": 1 + }, + { + "name": "platform-field", + "models": [ + { + "name": "default", + "is_custom_model": false, + "total_engaged_users": 1, + "total_pr_summaries_created": 1 + } + ], + "total_engaged_users": 1 + }, + { + "name": "actions-rate-limit-reporter", + "models": [ + { + "name": "default", + "is_custom_model": false, + "total_engaged_users": 1, + "total_pr_summaries_created": 1 + } + ], + "total_engaged_users": 1 + }, + { + "name": "giant-rats-edeka", + "models": [ + { + "name": "default", + "is_custom_model": false, + "total_engaged_users": 1, + "total_pr_summaries_created": 2 + } + ], + "total_engaged_users": 1 + }, + { + "name": "special-octo-meat", + "models": [ + { + "name": "default", + "is_custom_model": false, + "total_engaged_users": 1, + "total_pr_summaries_created": 1 + } + ], + "total_engaged_users": 1 + }, + { + "name": "", + "models": [ + { + "name": "default", + "is_custom_model": false, + "total_engaged_users": 1, + "total_pr_summaries_created": 2 + } + ], + "total_engaged_users": 1 + } + ], + "total_engaged_users": 13 + }, + "copilot_ide_code_completions": { + "editors": [ + { + "name": "vscode", + "models": [ + { + "name": "default", + "languages": [ + { + "name": "ruby", + "total_engaged_users": 10, + "total_code_acceptances": 154, + "total_code_suggestions": 516, + "total_code_lines_accepted": 122, + "total_code_lines_suggested": 710 + }, + { + "name": "markdown", + "total_engaged_users": 22, + "total_code_acceptances": 135, + "total_code_suggestions": 1332, + "total_code_lines_accepted": 142, + "total_code_lines_suggested": 1725 + }, + { + "name": "dotenv", + "total_engaged_users": 2, + "total_code_acceptances": 1, + "total_code_suggestions": 8, + "total_code_lines_accepted": 1, + "total_code_lines_suggested": 8 + }, + { + "name": "unknown", + "total_engaged_users": 6, + "total_code_acceptances": 25, + "total_code_suggestions": 235, + "total_code_lines_accepted": 28, + "total_code_lines_suggested": 315 + }, + { + "name": "typescriptreact", + "total_engaged_users": 10, + "total_code_acceptances": 180, + "total_code_suggestions": 537, + "total_code_lines_accepted": 178, + "total_code_lines_suggested": 1252 + }, + { + "name": "yaml", + "total_engaged_users": 5, + "total_code_acceptances": 19, + "total_code_suggestions": 111, + "total_code_lines_accepted": 25, + "total_code_lines_suggested": 164 + }, + { + "name": "github-issues", + "total_engaged_users": 2, + "total_code_acceptances": 3, + "total_code_suggestions": 13, + "total_code_lines_accepted": 1, + "total_code_lines_suggested": 16 + }, + { + "name": "json", + "total_engaged_users": 5, + "total_code_acceptances": 13, + "total_code_suggestions": 42, + "total_code_lines_accepted": 19, + "total_code_lines_suggested": 67 + }, + { + "name": "python", + "total_engaged_users": 11, + "total_code_acceptances": 203, + "total_code_suggestions": 556, + "total_code_lines_accepted": 240, + "total_code_lines_suggested": 940 + }, + { + "name": "javascript", + "total_engaged_users": 11, + "total_code_acceptances": 56, + "total_code_suggestions": 156, + "total_code_lines_accepted": 107, + "total_code_lines_suggested": 302 + }, + { + "name": "xml", + "total_engaged_users": 4, + "total_code_acceptances": 12, + "total_code_suggestions": 20, + "total_code_lines_accepted": 24, + "total_code_lines_suggested": 37 + }, + { + "name": "typescript", + "total_engaged_users": 16, + "total_code_acceptances": 663, + "total_code_suggestions": 1752, + "total_code_lines_accepted": 741, + "total_code_lines_suggested": 2744 + }, + { + "name": "java", + "total_engaged_users": 5, + "total_code_acceptances": 20, + "total_code_suggestions": 55, + "total_code_lines_accepted": 34, + "total_code_lines_suggested": 111 + }, + { + "name": "ini", + "total_engaged_users": 1, + "total_code_acceptances": 0, + "total_code_suggestions": 3, + "total_code_lines_accepted": 0, + "total_code_lines_suggested": 3 + }, + { + "name": "html", + "total_engaged_users": 3, + "total_code_acceptances": 11, + "total_code_suggestions": 31, + "total_code_lines_accepted": 9, + "total_code_lines_suggested": 81 + }, + { + "name": "css", + "total_engaged_users": 6, + "total_code_acceptances": 11, + "total_code_suggestions": 63, + "total_code_lines_accepted": 5, + "total_code_lines_suggested": 198 + }, + { + "name": "csharp", + "total_engaged_users": 5, + "total_code_acceptances": 38, + "total_code_suggestions": 113, + "total_code_lines_accepted": 85, + "total_code_lines_suggested": 399 + }, + { + "name": "jsonc", + "total_engaged_users": 3, + "total_code_acceptances": 4, + "total_code_suggestions": 20, + "total_code_lines_accepted": 6, + "total_code_lines_suggested": 60 + }, + { + "name": "sql", + "total_engaged_users": 3, + "total_code_acceptances": 3, + "total_code_suggestions": 26, + "total_code_lines_accepted": 1, + "total_code_lines_suggested": 31 + }, + { + "name": "dockerfile", + "total_engaged_users": 1, + "total_code_acceptances": 0, + "total_code_suggestions": 2, + "total_code_lines_accepted": 0, + "total_code_lines_suggested": 2 + }, + { + "name": "plaintext", + "total_engaged_users": 1, + "total_code_acceptances": 0, + "total_code_suggestions": 35, + "total_code_lines_accepted": 0, + "total_code_lines_suggested": 39 + }, + { + "name": "scss", + "total_engaged_users": 3, + "total_code_acceptances": 17, + "total_code_suggestions": 46, + "total_code_lines_accepted": 41, + "total_code_lines_suggested": 115 + }, + { + "name": "ql", + "total_engaged_users": 2, + "total_code_acceptances": 15, + "total_code_suggestions": 81, + "total_code_lines_accepted": 9, + "total_code_lines_suggested": 141 + }, + { + "name": "perl", + "total_engaged_users": 1, + "total_code_acceptances": 0, + "total_code_suggestions": 9, + "total_code_lines_accepted": 0, + "total_code_lines_suggested": 12 + }, + { + "name": "go", + "total_engaged_users": 4, + "total_code_acceptances": 62, + "total_code_suggestions": 179, + "total_code_lines_accepted": 46, + "total_code_lines_suggested": 250 + }, + { + "name": "powershell", + "total_engaged_users": 1, + "total_code_acceptances": 0, + "total_code_suggestions": 5, + "total_code_lines_accepted": 0, + "total_code_lines_suggested": 5 + }, + { + "name": "cpp", + "total_engaged_users": 1, + "total_code_acceptances": 0, + "total_code_suggestions": 1, + "total_code_lines_accepted": 0, + "total_code_lines_suggested": 1 + } + ], + "is_custom_model": false, + "total_engaged_users": 78 + } + ], + "total_engaged_users": 78 + }, + { + "name": "JetBrains", + "models": [ + { + "name": "default", + "languages": [ + { + "name": "unknown", + "total_engaged_users": 2, + "total_code_acceptances": 2, + "total_code_suggestions": 3, + "total_code_lines_accepted": 4, + "total_code_lines_suggested": 5 + }, + { + "name": "csharp", + "total_engaged_users": 2, + "total_code_acceptances": 25, + "total_code_suggestions": 84, + "total_code_lines_accepted": 53, + "total_code_lines_suggested": 474 + }, + { + "name": "typescriptreact", + "total_engaged_users": 1, + "total_code_acceptances": 0, + "total_code_suggestions": 1, + "total_code_lines_accepted": 0, + "total_code_lines_suggested": 4 + }, + { + "name": "typescript", + "total_engaged_users": 2, + "total_code_acceptances": 1, + "total_code_suggestions": 8, + "total_code_lines_accepted": 0, + "total_code_lines_suggested": 14 + }, + { + "name": "java", + "total_engaged_users": 2, + "total_code_acceptances": 74, + "total_code_suggestions": 145, + "total_code_lines_accepted": 151, + "total_code_lines_suggested": 573 + }, + { + "name": "xml", + "total_engaged_users": 2, + "total_code_acceptances": 1, + "total_code_suggestions": 3, + "total_code_lines_accepted": 12, + "total_code_lines_suggested": 14 + } + ], + "is_custom_model": false, + "total_engaged_users": 5 + } + ], + "total_engaged_users": 5 + }, + { + "name": "Neovim", + "models": [ + { + "name": "default", + "languages": [ + { + "name": "ruby", + "total_engaged_users": 2, + "total_code_acceptances": 9, + "total_code_suggestions": 27, + "total_code_lines_accepted": 9, + "total_code_lines_suggested": 70 + } + ], + "is_custom_model": false, + "total_engaged_users": 2 + } + ], + "total_engaged_users": 2 + }, + { + "name": "VisualStudio", + "models": [ + { + "name": "default", + "languages": [ + { + "name": "fsharp", + "total_engaged_users": 2, + "total_code_acceptances": 17, + "total_code_suggestions": 45, + "total_code_lines_accepted": 26, + "total_code_lines_suggested": 60 + } + ], + "is_custom_model": false, + "total_engaged_users": 2 + } + ], + "total_engaged_users": 2 + }, + { + "name": "Xcode", + "models": [ + { + "name": "default", + "languages": [ + { + "name": "swift", + "total_engaged_users": 2, + "total_code_acceptances": 3, + "total_code_suggestions": 4, + "total_code_lines_accepted": 5, + "total_code_lines_suggested": 6 + } + ], + "is_custom_model": false, + "total_engaged_users": 2 + } + ], + "total_engaged_users": 2 + } + ], + "total_engaged_users": 83 + } + }, + { + "date": "2024-11-05", + "copilot_ide_chat": { + "editors": [ + { + "name": "vscode", + "models": [ + { + "name": "default", + "total_chats": 2936, + "is_custom_model": false, + "total_engaged_users": 112, + "total_chat_copy_events": 142, + "total_chat_insertion_events": 59 + } + ], + "total_engaged_users": 112 + }, + { + "name": "JetBrains", + "models": [ + { + "name": "default", + "total_chats": 16, + "is_custom_model": false, + "total_engaged_users": 3, + "total_chat_copy_events": 5, + "total_chat_insertion_events": 2 + } + ], + "total_engaged_users": 3 + } + ], + "total_engaged_users": 114 + }, + "total_active_users": 158, + "copilot_dotcom_chat": { + "models": [ + { + "name": "default", + "total_chats": 269, + "is_custom_model": false, + "total_engaged_users": 45 + } + ], + "total_engaged_users": 45 + }, + "total_engaged_users": 158, + "copilot_dotcom_pull_requests": { + "repositories": [ + { + "name": "certification-services", + "models": [ + { + "name": "default", + "is_custom_model": false, + "total_engaged_users": 1, + "total_pr_summaries_created": 2 + } + ], + "total_engaged_users": 1 + }, + { + "name": "jubilant-love", + "models": [ + { + "name": "default", + "is_custom_model": false, + "total_engaged_users": 1, + "total_pr_summaries_created": 5 + } + ], + "total_engaged_users": 1 + }, + { + "name": "Abeck_GHAS2", + "models": [ + { + "name": "default", + "is_custom_model": false, + "total_engaged_users": 1, + "total_pr_summaries_created": 2 + } + ], + "total_engaged_users": 1 + }, + { + "name": "FastTrack", + "models": [ + { + "name": "default", + "is_custom_model": false, + "total_engaged_users": 2, + "total_pr_summaries_created": 3 + } + ], + "total_engaged_users": 2 + }, + { + "name": "changelog.gallery", + "models": [ + { + "name": "default", + "is_custom_model": false, + "total_engaged_users": 1, + "total_pr_summaries_created": 4 + } + ], + "total_engaged_users": 1 + }, + { + "name": "Copilot-Sandbox", + "models": [ + { + "name": "default", + "is_custom_model": false, + "total_engaged_users": 1, + "total_pr_summaries_created": 6 + } + ], + "total_engaged_users": 1 + }, + { + "name": "rover", + "models": [ + { + "name": "default", + "is_custom_model": false, + "total_engaged_users": 1, + "total_pr_summaries_created": 1 + } + ], + "total_engaged_users": 1 + }, + { + "name": "inexpensive-world", + "models": [ + { + "name": "default", + "is_custom_model": false, + "total_engaged_users": 1, + "total_pr_summaries_created": 2 + } + ], + "total_engaged_users": 1 + }, + { + "name": "Copilot_Breakout_session", + "models": [ + { + "name": "default", + "is_custom_model": false, + "total_engaged_users": 1, + "total_pr_summaries_created": 3 + } + ], + "total_engaged_users": 1 + }, + { + "name": "cc-docs", + "models": [ + { + "name": "default", + "is_custom_model": false, + "total_engaged_users": 1, + "total_pr_summaries_created": 1 + } + ], + "total_engaged_users": 1 + }, + { + "name": "white-guide", + "models": [ + { + "name": "default", + "is_custom_model": false, + "total_engaged_users": 1, + "total_pr_summaries_created": 1 + } + ], + "total_engaged_users": 1 + }, + { + "name": "congenial-invention", + "models": [ + { + "name": "default", + "is_custom_model": false, + "total_engaged_users": 1, + "total_pr_summaries_created": 2 + } + ], + "total_engaged_users": 1 + }, + { + "name": "magnificent-phone", + "models": [ + { + "name": "default", + "is_custom_model": false, + "total_engaged_users": 1, + "total_pr_summaries_created": 1 + } + ], + "total_engaged_users": 1 + }, + { + "name": "ghas-bootcamp", + "models": [ + { + "name": "default", + "is_custom_model": false, + "total_engaged_users": 1, + "total_pr_summaries_created": 1 + } + ], + "total_engaged_users": 1 + }, + { + "name": "lvmh", + "models": [ + { + "name": "default", + "is_custom_model": false, + "total_engaged_users": 1, + "total_pr_summaries_created": 3 + } + ], + "total_engaged_users": 1 + }, + { + "name": "dotNET-mail-demo", + "models": [ + { + "name": "default", + "is_custom_model": false, + "total_engaged_users": 1, + "total_pr_summaries_created": 1 + } + ], + "total_engaged_users": 1 + }, + { + "name": "gh-skyline", + "models": [ + { + "name": "default", + "is_custom_model": false, + "total_engaged_users": 1, + "total_pr_summaries_created": 1 + } + ], + "total_engaged_users": 1 + }, + { + "name": "giant-rats", + "models": [ + { + "name": "default", + "is_custom_model": false, + "total_engaged_users": 1, + "total_pr_summaries_created": 1 + } + ], + "total_engaged_users": 1 + }, + { + "name": "paypal-migrations-via-actions", + "models": [ + { + "name": "default", + "is_custom_model": false, + "total_engaged_users": 1, + "total_pr_summaries_created": 3 + } + ], + "total_engaged_users": 1 + }, + { + "name": "government-community", + "models": [ + { + "name": "default", + "is_custom_model": false, + "total_engaged_users": 1, + "total_pr_summaries_created": 1 + } + ], + "total_engaged_users": 1 + }, + { + "name": "", + "models": [ + { + "name": "default", + "is_custom_model": false, + "total_engaged_users": 4, + "total_pr_summaries_created": 8 + } + ], + "total_engaged_users": 4 + } + ], + "total_engaged_users": 23 + }, + "copilot_ide_code_completions": { + "editors": [ + { + "name": "vscode", + "models": [ + { + "name": "default", + "languages": [ + { + "name": "dotenv", + "total_engaged_users": 2, + "total_code_acceptances": 2, + "total_code_suggestions": 16, + "total_code_lines_accepted": 2, + "total_code_lines_suggested": 20 + }, + { + "name": "yaml", + "total_engaged_users": 10, + "total_code_acceptances": 100, + "total_code_suggestions": 249, + "total_code_lines_accepted": 162, + "total_code_lines_suggested": 683 + }, + { + "name": "ruby", + "total_engaged_users": 10, + "total_code_acceptances": 160, + "total_code_suggestions": 549, + "total_code_lines_accepted": 141, + "total_code_lines_suggested": 761 + }, + { + "name": "html", + "total_engaged_users": 8, + "total_code_acceptances": 13, + "total_code_suggestions": 75, + "total_code_lines_accepted": 12, + "total_code_lines_suggested": 209 + }, + { + "name": "scss", + "total_engaged_users": 3, + "total_code_acceptances": 6, + "total_code_suggestions": 44, + "total_code_lines_accepted": 5, + "total_code_lines_suggested": 64 + }, + { + "name": "unknown", + "total_engaged_users": 7, + "total_code_acceptances": 156, + "total_code_suggestions": 450, + "total_code_lines_accepted": 154, + "total_code_lines_suggested": 575 + }, + { + "name": "javascriptreact", + "total_engaged_users": 2, + "total_code_acceptances": 2, + "total_code_suggestions": 8, + "total_code_lines_accepted": 2, + "total_code_lines_suggested": 15 + }, + { + "name": "go", + "total_engaged_users": 5, + "total_code_acceptances": 24, + "total_code_suggestions": 64, + "total_code_lines_accepted": 29, + "total_code_lines_suggested": 227 + }, + { + "name": "jsonc", + "total_engaged_users": 7, + "total_code_acceptances": 18, + "total_code_suggestions": 88, + "total_code_lines_accepted": 18, + "total_code_lines_suggested": 275 + }, + { + "name": "powershell", + "total_engaged_users": 3, + "total_code_acceptances": 11, + "total_code_suggestions": 23, + "total_code_lines_accepted": 11, + "total_code_lines_suggested": 39 + }, + { + "name": "javascript", + "total_engaged_users": 19, + "total_code_acceptances": 353, + "total_code_suggestions": 919, + "total_code_lines_accepted": 591, + "total_code_lines_suggested": 1591 + }, + { + "name": "markdown", + "total_engaged_users": 21, + "total_code_acceptances": 156, + "total_code_suggestions": 973, + "total_code_lines_accepted": 159, + "total_code_lines_suggested": 1253 + }, + { + "name": "ql", + "total_engaged_users": 3, + "total_code_acceptances": 36, + "total_code_suggestions": 410, + "total_code_lines_accepted": 21, + "total_code_lines_suggested": 858 + }, + { + "name": "java", + "total_engaged_users": 10, + "total_code_acceptances": 43, + "total_code_suggestions": 124, + "total_code_lines_accepted": 126, + "total_code_lines_suggested": 368 + }, + { + "name": "python", + "total_engaged_users": 12, + "total_code_acceptances": 196, + "total_code_suggestions": 490, + "total_code_lines_accepted": 287, + "total_code_lines_suggested": 870 + }, + { + "name": "dockerfile", + "total_engaged_users": 2, + "total_code_acceptances": 1, + "total_code_suggestions": 8, + "total_code_lines_accepted": 1, + "total_code_lines_suggested": 9 + }, + { + "name": "oraclesql", + "total_engaged_users": 1, + "total_code_acceptances": 0, + "total_code_suggestions": 1, + "total_code_lines_accepted": 0, + "total_code_lines_suggested": 1 + }, + { + "name": "typescript", + "total_engaged_users": 10, + "total_code_acceptances": 532, + "total_code_suggestions": 1437, + "total_code_lines_accepted": 477, + "total_code_lines_suggested": 2242 + }, + { + "name": "json", + "total_engaged_users": 5, + "total_code_acceptances": 9, + "total_code_suggestions": 47, + "total_code_lines_accepted": 6, + "total_code_lines_suggested": 63 + }, + { + "name": "erb", + "total_engaged_users": 1, + "total_code_acceptances": 0, + "total_code_suggestions": 1, + "total_code_lines_accepted": 0, + "total_code_lines_suggested": 1 + }, + { + "name": "typescriptreact", + "total_engaged_users": 10, + "total_code_acceptances": 127, + "total_code_suggestions": 326, + "total_code_lines_accepted": 169, + "total_code_lines_suggested": 526 + }, + { + "name": "css", + "total_engaged_users": 4, + "total_code_acceptances": 7, + "total_code_suggestions": 46, + "total_code_lines_accepted": 6, + "total_code_lines_suggested": 209 + }, + { + "name": "csharp", + "total_engaged_users": 4, + "total_code_acceptances": 12, + "total_code_suggestions": 33, + "total_code_lines_accepted": 48, + "total_code_lines_suggested": 72 + }, + { + "name": "plaintext", + "total_engaged_users": 2, + "total_code_acceptances": 5, + "total_code_suggestions": 23, + "total_code_lines_accepted": 5, + "total_code_lines_suggested": 25 + }, + { + "name": "sql", + "total_engaged_users": 3, + "total_code_acceptances": 3, + "total_code_suggestions": 39, + "total_code_lines_accepted": 3, + "total_code_lines_suggested": 57 + }, + { + "name": "xml", + "total_engaged_users": 2, + "total_code_acceptances": 1, + "total_code_suggestions": 5, + "total_code_lines_accepted": 0, + "total_code_lines_suggested": 5 + }, + { + "name": "cpp", + "total_engaged_users": 3, + "total_code_acceptances": 7, + "total_code_suggestions": 33, + "total_code_lines_accepted": 7, + "total_code_lines_suggested": 39 + }, + { + "name": "github-issues", + "total_engaged_users": 1, + "total_code_acceptances": 0, + "total_code_suggestions": 1, + "total_code_lines_accepted": 0, + "total_code_lines_suggested": 1 + }, + { + "name": "shellscript", + "total_engaged_users": 3, + "total_code_acceptances": 4, + "total_code_suggestions": 9, + "total_code_lines_accepted": 6, + "total_code_lines_suggested": 11 + }, + { + "name": "postgres", + "total_engaged_users": 1, + "total_code_acceptances": 0, + "total_code_suggestions": 4, + "total_code_lines_accepted": 0, + "total_code_lines_suggested": 4 + }, + { + "name": "lua", + "total_engaged_users": 2, + "total_code_acceptances": 1, + "total_code_suggestions": 10, + "total_code_lines_accepted": 1, + "total_code_lines_suggested": 11 + }, + { + "name": "blade", + "total_engaged_users": 1, + "total_code_acceptances": 0, + "total_code_suggestions": 4, + "total_code_lines_accepted": 0, + "total_code_lines_suggested": 4 + }, + { + "name": "makefile", + "total_engaged_users": 2, + "total_code_acceptances": 5, + "total_code_suggestions": 25, + "total_code_lines_accepted": 5, + "total_code_lines_suggested": 39 + } + ], + "is_custom_model": false, + "total_engaged_users": 94 + } + ], + "total_engaged_users": 94 + }, + { + "name": "JetBrains", + "models": [ + { + "name": "default", + "languages": [ + { + "name": "typescriptreact", + "total_engaged_users": 2, + "total_code_acceptances": 1, + "total_code_suggestions": 16, + "total_code_lines_accepted": 1, + "total_code_lines_suggested": 39 + }, + { + "name": "java", + "total_engaged_users": 2, + "total_code_acceptances": 1, + "total_code_suggestions": 4, + "total_code_lines_accepted": 1, + "total_code_lines_suggested": 11 + }, + { + "name": "markdown", + "total_engaged_users": 2, + "total_code_acceptances": 5, + "total_code_suggestions": 5, + "total_code_lines_accepted": 5, + "total_code_lines_suggested": 5 + }, + { + "name": "csharp", + "total_engaged_users": 2, + "total_code_acceptances": 15, + "total_code_suggestions": 42, + "total_code_lines_accepted": 33, + "total_code_lines_suggested": 123 + } + ], + "is_custom_model": false, + "total_engaged_users": 3 + } + ], + "total_engaged_users": 3 + }, + { + "name": "Neovim", + "models": [ + { + "name": "default", + "languages": [ + { + "name": "unknown", + "total_engaged_users": 1, + "total_code_acceptances": 0, + "total_code_suggestions": 24, + "total_code_lines_accepted": 0, + "total_code_lines_suggested": 60 + }, + { + "name": "lua", + "total_engaged_users": 2, + "total_code_acceptances": 1, + "total_code_suggestions": 2, + "total_code_lines_accepted": 1, + "total_code_lines_suggested": 3 + } + ], + "is_custom_model": false, + "total_engaged_users": 2 + } + ], + "total_engaged_users": 2 + }, + { + "name": "VisualStudio", + "models": [ + { + "name": "default", + "languages": [ + { + "name": "csharp", + "total_engaged_users": 2, + "total_code_acceptances": 6, + "total_code_suggestions": 7, + "total_code_lines_accepted": 50, + "total_code_lines_suggested": 51 + }, + { + "name": "fsharp", + "total_engaged_users": 2, + "total_code_acceptances": 21, + "total_code_suggestions": 65, + "total_code_lines_accepted": 23, + "total_code_lines_suggested": 73 + }, + { + "name": "cpp", + "total_engaged_users": 2, + "total_code_acceptances": 41, + "total_code_suggestions": 112, + "total_code_lines_accepted": 87, + "total_code_lines_suggested": 267 + } + ], + "is_custom_model": false, + "total_engaged_users": 4 + } + ], + "total_engaged_users": 4 + }, + { + "name": "Vim", + "models": [ + { + "name": "default", + "languages": [ + { + "name": "gitattributes", + "total_engaged_users": 1, + "total_code_acceptances": 0, + "total_code_suggestions": 1, + "total_code_lines_accepted": 0, + "total_code_lines_suggested": 1 + } + ], + "is_custom_model": false, + "total_engaged_users": 1 + } + ], + "total_engaged_users": 1 + } + ], + "total_engaged_users": 98 + } + }, + { + "date": "2024-11-06", + "copilot_ide_chat": { + "editors": [ + { + "name": "vscode", + "models": [ + { + "name": "default", + "total_chats": 3052, + "is_custom_model": false, + "total_engaged_users": 87, + "total_chat_copy_events": 158, + "total_chat_insertion_events": 91 + } + ], + "total_engaged_users": 87 + }, + { + "name": "JetBrains", + "models": [ + { + "name": "default", + "total_chats": 45, + "is_custom_model": false, + "total_engaged_users": 6, + "total_chat_copy_events": 4, + "total_chat_insertion_events": 3 + } + ], + "total_engaged_users": 6 + } + ], + "total_engaged_users": 87 + }, + "total_active_users": 131, + "copilot_dotcom_chat": { + "models": [ + { + "name": "default", + "total_chats": 216, + "is_custom_model": false, + "total_engaged_users": 41 + } + ], + "total_engaged_users": 41 + }, + "total_engaged_users": 131, + "copilot_dotcom_pull_requests": { + "repositories": [ + { + "name": "advanced-security-field-dev", + "models": [ + { + "name": "default", + "is_custom_model": false, + "total_engaged_users": 1, + "total_pr_summaries_created": 2 + } + ], + "total_engaged_users": 1 + }, + { + "name": "white-guide", + "models": [ + { + "name": "default", + "is_custom_model": false, + "total_engaged_users": 1, + "total_pr_summaries_created": 3 + } + ], + "total_engaged_users": 1 + }, + { + "name": "giant-rats", + "models": [ + { + "name": "default", + "is_custom_model": false, + "total_engaged_users": 1, + "total_pr_summaries_created": 2 + } + ], + "total_engaged_users": 1 + }, + { + "name": "the-fellowship", + "models": [ + { + "name": "default", + "is_custom_model": false, + "total_engaged_users": 1, + "total_pr_summaries_created": 1 + } + ], + "total_engaged_users": 1 + }, + { + "name": "advanced-security-field", + "models": [ + { + "name": "default", + "is_custom_model": false, + "total_engaged_users": 1, + "total_pr_summaries_created": 2 + } + ], + "total_engaged_users": 1 + }, + { + "name": "octocat-petclinic", + "models": [ + { + "name": "default", + "is_custom_model": false, + "total_engaged_users": 1, + "total_pr_summaries_created": 1 + } + ], + "total_engaged_users": 1 + }, + { + "name": "ghas-workshop", + "models": [ + { + "name": "default", + "is_custom_model": false, + "total_engaged_users": 1, + "total_pr_summaries_created": 1 + } + ], + "total_engaged_users": 1 + }, + { + "name": "solutions-engineering", + "models": [ + { + "name": "default", + "is_custom_model": false, + "total_engaged_users": 1, + "total_pr_summaries_created": 1 + } + ], + "total_engaged_users": 1 + }, + { + "name": "special-knowledge", + "models": [ + { + "name": "default", + "is_custom_model": false, + "total_engaged_users": 1, + "total_pr_summaries_created": 2 + } + ], + "total_engaged_users": 1 + }, + { + "name": "gh-migrate-teams", + "models": [ + { + "name": "default", + "is_custom_model": false, + "total_engaged_users": 1, + "total_pr_summaries_created": 2 + } + ], + "total_engaged_users": 1 + }, + { + "name": "myshuttle-security", + "models": [ + { + "name": "default", + "is_custom_model": false, + "total_engaged_users": 1, + "total_pr_summaries_created": 2 + } + ], + "total_engaged_users": 1 + }, + { + "name": "verbose-computer", + "models": [ + { + "name": "default", + "is_custom_model": false, + "total_engaged_users": 1, + "total_pr_summaries_created": 2 + } + ], + "total_engaged_users": 1 + }, + { + "name": "giant-rats-universe", + "models": [ + { + "name": "default", + "is_custom_model": false, + "total_engaged_users": 1, + "total_pr_summaries_created": 2 + } + ], + "total_engaged_users": 1 + }, + { + "name": "the-weather-app", + "models": [ + { + "name": "default", + "is_custom_model": false, + "total_engaged_users": 1, + "total_pr_summaries_created": 1 + } + ], + "total_engaged_users": 1 + }, + { + "name": "gifted-potato", + "models": [ + { + "name": "default", + "is_custom_model": false, + "total_engaged_users": 1, + "total_pr_summaries_created": 3 + } + ], + "total_engaged_users": 1 + }, + { + "name": "copilot", + "models": [ + { + "name": "default", + "is_custom_model": false, + "total_engaged_users": 1, + "total_pr_summaries_created": 1 + } + ], + "total_engaged_users": 1 + }, + { + "name": "support-knowledge-base", + "models": [ + { + "name": "default", + "is_custom_model": false, + "total_engaged_users": 1, + "total_pr_summaries_created": 2 + } + ], + "total_engaged_users": 1 + }, + { + "name": "math-api", + "models": [ + { + "name": "default", + "is_custom_model": false, + "total_engaged_users": 1, + "total_pr_summaries_created": 5 + } + ], + "total_engaged_users": 1 + }, + { + "name": "legendary-winner", + "models": [ + { + "name": "default", + "is_custom_model": false, + "total_engaged_users": 1, + "total_pr_summaries_created": 2 + } + ], + "total_engaged_users": 1 + }, + { + "name": "orange-people", + "models": [ + { + "name": "default", + "is_custom_model": false, + "total_engaged_users": 1, + "total_pr_summaries_created": 2 + } + ], + "total_engaged_users": 1 + }, + { + "name": "musical-octo-theory", + "models": [ + { + "name": "default", + "is_custom_model": false, + "total_engaged_users": 1, + "total_pr_summaries_created": 1 + } + ], + "total_engaged_users": 1 + }, + { + "name": "", + "models": [ + { + "name": "default", + "is_custom_model": false, + "total_engaged_users": 1, + "total_pr_summaries_created": 2 + } + ], + "total_engaged_users": 1 + } + ], + "total_engaged_users": 17 + }, + "copilot_ide_code_completions": { + "editors": [ + { + "name": "vscode", + "models": [ + { + "name": "default", + "languages": [ + { + "name": "markdown", + "total_engaged_users": 19, + "total_code_acceptances": 147, + "total_code_suggestions": 760, + "total_code_lines_accepted": 114, + "total_code_lines_suggested": 952 + }, + { + "name": "ruby", + "total_engaged_users": 12, + "total_code_acceptances": 87, + "total_code_suggestions": 306, + "total_code_lines_accepted": 91, + "total_code_lines_suggested": 409 + }, + { + "name": "python", + "total_engaged_users": 12, + "total_code_acceptances": 77, + "total_code_suggestions": 251, + "total_code_lines_accepted": 96, + "total_code_lines_suggested": 326 + }, + { + "name": "unknown", + "total_engaged_users": 4, + "total_code_acceptances": 11, + "total_code_suggestions": 113, + "total_code_lines_accepted": 9, + "total_code_lines_suggested": 143 + }, + { + "name": "javascript", + "total_engaged_users": 19, + "total_code_acceptances": 508, + "total_code_suggestions": 1139, + "total_code_lines_accepted": 872, + "total_code_lines_suggested": 2213 + }, + { + "name": "css", + "total_engaged_users": 5, + "total_code_acceptances": 17, + "total_code_suggestions": 61, + "total_code_lines_accepted": 29, + "total_code_lines_suggested": 196 + }, + { + "name": "scss", + "total_engaged_users": 4, + "total_code_acceptances": 25, + "total_code_suggestions": 85, + "total_code_lines_accepted": 35, + "total_code_lines_suggested": 165 + }, + { + "name": "typescriptreact", + "total_engaged_users": 12, + "total_code_acceptances": 88, + "total_code_suggestions": 281, + "total_code_lines_accepted": 77, + "total_code_lines_suggested": 360 + }, + { + "name": "yaml", + "total_engaged_users": 12, + "total_code_acceptances": 62, + "total_code_suggestions": 238, + "total_code_lines_accepted": 85, + "total_code_lines_suggested": 467 + }, + { + "name": "terraform", + "total_engaged_users": 2, + "total_code_acceptances": 2, + "total_code_suggestions": 5, + "total_code_lines_accepted": 0, + "total_code_lines_suggested": 10 + }, + { + "name": "shellscript", + "total_engaged_users": 1, + "total_code_acceptances": 0, + "total_code_suggestions": 10, + "total_code_lines_accepted": 0, + "total_code_lines_suggested": 10 + }, + { + "name": "json", + "total_engaged_users": 4, + "total_code_acceptances": 4, + "total_code_suggestions": 40, + "total_code_lines_accepted": 3, + "total_code_lines_suggested": 63 + }, + { + "name": "typescript", + "total_engaged_users": 10, + "total_code_acceptances": 476, + "total_code_suggestions": 1307, + "total_code_lines_accepted": 816, + "total_code_lines_suggested": 2845 + }, + { + "name": "svelte", + "total_engaged_users": 2, + "total_code_acceptances": 6, + "total_code_suggestions": 13, + "total_code_lines_accepted": 2, + "total_code_lines_suggested": 14 + }, + { + "name": "cpp", + "total_engaged_users": 3, + "total_code_acceptances": 6, + "total_code_suggestions": 25, + "total_code_lines_accepted": 11, + "total_code_lines_suggested": 37 + }, + { + "name": "jsonc", + "total_engaged_users": 1, + "total_code_acceptances": 0, + "total_code_suggestions": 11, + "total_code_lines_accepted": 0, + "total_code_lines_suggested": 87 + }, + { + "name": "csharp", + "total_engaged_users": 4, + "total_code_acceptances": 15, + "total_code_suggestions": 39, + "total_code_lines_accepted": 34, + "total_code_lines_suggested": 60 + }, + { + "name": "html", + "total_engaged_users": 3, + "total_code_acceptances": 14, + "total_code_suggestions": 36, + "total_code_lines_accepted": 13, + "total_code_lines_suggested": 51 + }, + { + "name": "java", + "total_engaged_users": 9, + "total_code_acceptances": 66, + "total_code_suggestions": 127, + "total_code_lines_accepted": 130, + "total_code_lines_suggested": 310 + }, + { + "name": "ini", + "total_engaged_users": 1, + "total_code_acceptances": 0, + "total_code_suggestions": 1, + "total_code_lines_accepted": 0, + "total_code_lines_suggested": 1 + }, + { + "name": "ql", + "total_engaged_users": 3, + "total_code_acceptances": 54, + "total_code_suggestions": 367, + "total_code_lines_accepted": 28, + "total_code_lines_suggested": 948 + }, + { + "name": "dotenv", + "total_engaged_users": 2, + "total_code_acceptances": 1, + "total_code_suggestions": 27, + "total_code_lines_accepted": 1, + "total_code_lines_suggested": 37 + }, + { + "name": "go", + "total_engaged_users": 3, + "total_code_acceptances": 10, + "total_code_suggestions": 27, + "total_code_lines_accepted": 9, + "total_code_lines_suggested": 31 + }, + { + "name": "erb", + "total_engaged_users": 2, + "total_code_acceptances": 1, + "total_code_suggestions": 4, + "total_code_lines_accepted": 0, + "total_code_lines_suggested": 13 + }, + { + "name": "dockerfile", + "total_engaged_users": 2, + "total_code_acceptances": 12, + "total_code_suggestions": 12, + "total_code_lines_accepted": 12, + "total_code_lines_suggested": 12 + }, + { + "name": "powershell", + "total_engaged_users": 2, + "total_code_acceptances": 5, + "total_code_suggestions": 25, + "total_code_lines_accepted": 35, + "total_code_lines_suggested": 98 + }, + { + "name": "sql", + "total_engaged_users": 2, + "total_code_acceptances": 2, + "total_code_suggestions": 10, + "total_code_lines_accepted": 2, + "total_code_lines_suggested": 11 + }, + { + "name": "plaintext", + "total_engaged_users": 1, + "total_code_acceptances": 0, + "total_code_suggestions": 2, + "total_code_lines_accepted": 0, + "total_code_lines_suggested": 2 + } + ], + "is_custom_model": false, + "total_engaged_users": 81 + } + ], + "total_engaged_users": 81 + }, + { + "name": "JetBrains", + "models": [ + { + "name": "default", + "languages": [ + { + "name": "csharp", + "total_engaged_users": 2, + "total_code_acceptances": 8, + "total_code_suggestions": 24, + "total_code_lines_accepted": 8, + "total_code_lines_suggested": 64 + }, + { + "name": "razor", + "total_engaged_users": 2, + "total_code_acceptances": 1, + "total_code_suggestions": 1, + "total_code_lines_accepted": 1, + "total_code_lines_suggested": 1 + }, + { + "name": "groovy", + "total_engaged_users": 1, + "total_code_acceptances": 0, + "total_code_suggestions": 2, + "total_code_lines_accepted": 0, + "total_code_lines_suggested": 4 + }, + { + "name": "java", + "total_engaged_users": 4, + "total_code_acceptances": 18, + "total_code_suggestions": 24, + "total_code_lines_accepted": 36, + "total_code_lines_suggested": 75 + } + ], + "is_custom_model": false, + "total_engaged_users": 5 + } + ], + "total_engaged_users": 5 + }, + { + "name": "Neovim", + "models": [ + { + "name": "default", + "languages": [ + { + "name": "ruby", + "total_engaged_users": 2, + "total_code_acceptances": 7, + "total_code_suggestions": 26, + "total_code_lines_accepted": 7, + "total_code_lines_suggested": 67 + } + ], + "is_custom_model": false, + "total_engaged_users": 2 + } + ], + "total_engaged_users": 2 + }, + { + "name": "VisualStudio", + "models": [ + { + "name": "default", + "languages": [ + { + "name": "c/c++", + "total_engaged_users": 2, + "total_code_acceptances": 8, + "total_code_suggestions": 25, + "total_code_lines_accepted": 8, + "total_code_lines_suggested": 126 + }, + { + "name": "cpp", + "total_engaged_users": 2, + "total_code_acceptances": 27, + "total_code_suggestions": 78, + "total_code_lines_accepted": 53, + "total_code_lines_suggested": 235 + } + ], + "is_custom_model": false, + "total_engaged_users": 2 + } + ], + "total_engaged_users": 2 + }, + { + "name": "Xcode", + "models": [ + { + "name": "default", + "languages": [ + { + "name": "markdown", + "total_engaged_users": 2, + "total_code_acceptances": 16, + "total_code_suggestions": 21, + "total_code_lines_accepted": 11, + "total_code_lines_suggested": 42 + } + ], + "is_custom_model": false, + "total_engaged_users": 2 + } + ], + "total_engaged_users": 2 + } + ], + "total_engaged_users": 86 + } + } +] \ No newline at end of file From 9d62659746412fb44295cc3746d003ea5c30a31d Mon Sep 17 00:00:00 2001 From: Austen Stone Date: Wed, 6 Nov 2024 22:09:42 -0500 Subject: [PATCH 2/3] Enhance metrics handling by adding new metric types and updating query logic; refactor MetricsControllerNew to support additional metrics and improve data retrieval --- .../src/controllers/metrics.controller.new.ts | 78 +++- .../models/metrics.model.new.interfaces.ts | 4 +- backend/src/models/metrics.model.new.ts | 405 ++++++++++++++++-- backend/src/services/metrics.service.ts | 2 +- 4 files changed, 440 insertions(+), 49 deletions(-) diff --git a/backend/src/controllers/metrics.controller.new.ts b/backend/src/controllers/metrics.controller.new.ts index 95656fa..e11eaa4 100644 --- a/backend/src/controllers/metrics.controller.new.ts +++ b/backend/src/controllers/metrics.controller.new.ts @@ -1,11 +1,11 @@ import { Request, Response } from 'express'; -import { DailyMetric, Editor, IdeCompletions, LanguageStats, ModelStats } from '../models/metrics.model.new'; +import { DailyMetric, DotcomChatMetrics, DotcomChatModelStats, Editor, IdeChatEditor, IdeChatMetrics, IdeChatModelStats, IdeCompletions, LanguageStats, ModelStats, PrMetrics, PrModelStats, PrRepository } from '../models/metrics.model.new'; import { Op } from 'sequelize'; class MetricsControllerNew { // Get all metrics 📊 async getAllMetrics(req: Request, res: Response): Promise { - const { since, until, editor, language, model } = req.query; + const { type, since, until, editor, language, model } = req.query; try { // consider the fact that these are UTC dates... const dateFilter: any = { }; @@ -16,11 +16,11 @@ class MetricsControllerNew { dateFilter[Op.lte] = new Date(until as string); } - console.log(Object.getOwnPropertySymbols(dateFilter).length, { date: dateFilter }); - const metrics = await DailyMetric.findAll({ - where: Object.getOwnPropertySymbols(dateFilter).length ? { date: dateFilter } : {}, - include: [{ - attributes: { exclude: ['id'] }, + const include = []; + const types = type ? (type as string).split(/[ ,]+/) : []; + if (types.length === 0 || types.includes('copilot_ide_code_completions')) { + include.push({ + attributes: { exclude: ['id', 'daily_metric_id'] }, model: IdeCompletions, as: 'copilot_ide_code_completions', include: [{ @@ -36,15 +36,73 @@ class MetricsControllerNew { where: model ? { name: model } : {}, required: false, include: [{ - where: language ? { name: language } : {}, - required: false, attributes: { exclude: ['id', 'modelStatId'] }, model: LanguageStats, as: 'languages', + where: language ? { name: language } : {}, + required: false, }] }] }] - }] + }); + } + if (types.length === 0 || types.includes('copilot_ide_chat')) { + include.push({ + attributes: { exclude: ['id', 'daily_metric_id'] }, + model: IdeChatMetrics, + as: 'copilot_ide_chat', + include: [{ + attributes: { exclude: ['id', 'chat_metrics_id'] }, + model: IdeChatEditor, + as: 'editors', + where: editor ? { name: editor } : {}, + required: false, + include: [{ + attributes: { exclude: ['id', 'editor_id'] }, + model: IdeChatModelStats, + as: 'models', + where: model ? { name: model } : {}, + required: false, + }] + }] + }); + } + if (types.length === 0 || types.includes('copilot_dotcom_chat')) { + include.push({ + attributes: { exclude: ['id', 'daily_metric_id'] }, + model: DotcomChatMetrics, + as: 'copilot_dotcom_chat', + include: [{ + attributes: { exclude: ['id', 'chat_metrics_id'] }, + model: DotcomChatModelStats, + as: 'models', + where: model ? { name: model } : {}, + required: false, + }] + }); + } + if (types.length === 0 || types.includes('copilot_dotcom_pull_requests')) { + include.push({ + attributes: { exclude: ['id', 'daily_metric_id'] }, + model: PrMetrics, + as: 'copilot_dotcom_pull_requests', + include: [{ + attributes: { exclude: ['id', 'pr_metrics_id'] }, + model: PrRepository, + as: 'repositories', + include: [{ + attributes: { exclude: ['id', 'repository_id'] }, + model: PrModelStats, + as: 'models', + where: model ? { name: model } : {}, + required: false, + }] + }] + }); + } + const metrics = await DailyMetric.findAll({ + where: Object.getOwnPropertySymbols(dateFilter).length ? { date: dateFilter } : {}, + include }); res.status(200).json(metrics); // 🎉 All metrics retrieved! } catch (error) { diff --git a/backend/src/models/metrics.model.new.interfaces.ts b/backend/src/models/metrics.model.new.interfaces.ts index c4f6014..853bbe2 100644 --- a/backend/src/models/metrics.model.new.interfaces.ts +++ b/backend/src/models/metrics.model.new.interfaces.ts @@ -82,5 +82,7 @@ interface CopilotMetrics { type CopilotMetricsArray = CopilotMetrics[]; export { - CopilotMetrics + CopilotMetrics, + ChatModel, + CodeModel, } \ No newline at end of file diff --git a/backend/src/models/metrics.model.new.ts b/backend/src/models/metrics.model.new.ts index 055ed7f..3791120 100644 --- a/backend/src/models/metrics.model.new.ts +++ b/backend/src/models/metrics.model.new.ts @@ -1,17 +1,14 @@ // models/daily-metric.ts import { Model, DataTypes, Sequelize } from 'sequelize'; import { sequelize } from '../database'; -import { CopilotMetrics } from './metrics.model.new.interfaces'; +import { ChatModel, CopilotMetrics } from './metrics.model.new.interfaces'; +import logger from '../services/logger'; // Main metric model 📈 export class DailyMetric extends Model { public date!: Date; public total_active_users!: number; public total_engaged_users!: number; - public total_code_acceptances!: number; - public total_code_suggestions!: number; - public total_code_lines_accepted!: number; - public total_code_lines_suggested!: number; } // IDE Completions model 🖥️ @@ -22,9 +19,8 @@ export class IdeCompletions extends Model { public total_code_suggestions!: number; public total_code_lines_accepted!: number; public total_code_lines_suggested!: number; - public dailyMetricDate!: Date; + public daily_metric_id!: Date; } - export class Editor extends Model { public id!: number; public name!: string; @@ -35,7 +31,6 @@ export class Editor extends Model { public total_code_lines_suggested!: number; public ideCompletionId!: number; } - export class ModelStats extends Model { public id!: number; public name!: string; @@ -47,7 +42,6 @@ export class ModelStats extends Model { public total_code_lines_suggested!: number; public editorId!: number; } - export class LanguageStats extends Model { public id!: number; public name!: string; @@ -59,6 +53,63 @@ export class LanguageStats extends Model { public modelStatId!: number; } +// PR Repository Model 🏢 +export class PrRepository extends Model { + public id!: number; + public name!: string; + public total_engaged_users!: number; + public total_pr_summaries_created!: number; +} +export class PrModelStats extends Model { + public id!: number; + public name!: string; + public is_custom_model!: boolean; + public total_engaged_users!: number; + public total_pr_summaries_created!: number; +} +export class PrMetrics extends Model { + public id!: number; + public total_engaged_users!: number; + public total_pr_summaries_created!: number; +} + +// Chat Model 💬 +export class DotcomChatMetrics extends Model { + public id!: number; + public total_engaged_users!: number; + public total_chats!: number; +} +export class DotcomChatModelStats extends Model { + public id!: number; + public name!: string; + public is_custom_model!: boolean; + public total_engaged_users!: number; + public total_chats!: number; +} +export class IdeChatMetrics extends Model { + public id!: number; + public total_engaged_users!: number; + public total_chats!: number; + public total_chat_copy_events!: number; + public total_chat_insertion_events!: number; +} +export class IdeChatEditor extends Model { + public id!: number; + public name!: string; + public total_engaged_users!: number; + public total_chats!: number; + public total_chat_copy_events!: number; + public total_chat_insertion_events!: number; +} +export class IdeChatModelStats extends Model { + public id!: number; + public name!: string; + public is_custom_model!: boolean; + public total_engaged_users!: number; + public total_chats!: number; + public total_chat_copy_events!: number; + public total_chat_insertion_events!: number; +} // Initialize models DailyMetric.init({ @@ -67,11 +118,53 @@ DailyMetric.init({ primaryKey: true }, total_active_users: DataTypes.INTEGER, + total_engaged_users: DataTypes.INTEGER +}, { + sequelize, + timestamps: false +}); + +IdeChatMetrics.init({ + id: { + type: DataTypes.INTEGER, + primaryKey: true, + autoIncrement: true + }, total_engaged_users: DataTypes.INTEGER, - total_code_acceptances: DataTypes.INTEGER, - total_code_suggestions: DataTypes.INTEGER, - total_code_lines_accepted: DataTypes.INTEGER, - total_code_lines_suggested: DataTypes.INTEGER + total_chats: DataTypes.INTEGER, + total_chat_copy_events: DataTypes.INTEGER, + total_chat_insertion_events: DataTypes.INTEGER +}, { + sequelize, + timestamps: false +}); +IdeChatEditor.init({ + id: { + type: DataTypes.INTEGER, + primaryKey: true, + autoIncrement: true + }, + name: DataTypes.STRING, + total_engaged_users: DataTypes.INTEGER, + total_chats: DataTypes.INTEGER, + total_chat_copy_events: DataTypes.INTEGER, + total_chat_insertion_events: DataTypes.INTEGER +}, { + sequelize, + timestamps: false +}); +IdeChatModelStats.init({ + id: { + type: DataTypes.INTEGER, + primaryKey: true, + autoIncrement: true + }, + name: DataTypes.STRING, + is_custom_model: DataTypes.BOOLEAN, + total_engaged_users: DataTypes.INTEGER, + total_chats: DataTypes.INTEGER, + total_chat_copy_events: DataTypes.INTEGER, + total_chat_insertion_events: DataTypes.INTEGER }, { sequelize, timestamps: false @@ -92,7 +185,6 @@ IdeCompletions.init({ sequelize, timestamps: false }); - Editor.init({ id: { type: DataTypes.INTEGER, @@ -109,7 +201,6 @@ Editor.init({ sequelize, timestamps: false }); - ModelStats.init({ id: { type: DataTypes.INTEGER, @@ -127,7 +218,6 @@ ModelStats.init({ sequelize, timestamps: false }); - LanguageStats.init({ id: { type: DataTypes.INTEGER, @@ -145,18 +235,115 @@ LanguageStats.init({ timestamps: false }); +PrMetrics.init({ + id: { + type: DataTypes.INTEGER, + primaryKey: true, + autoIncrement: true + }, + total_engaged_users: DataTypes.INTEGER, + total_pr_summaries_created: DataTypes.INTEGER +}, { + sequelize, + timestamps: false +}); +PrRepository.init({ + id: { + type: DataTypes.INTEGER, + primaryKey: true, + autoIncrement: true + }, + name: DataTypes.STRING, + total_engaged_users: DataTypes.INTEGER, + total_pr_summaries_created: DataTypes.INTEGER +}, { + sequelize, + timestamps: false +}); +PrModelStats.init({ + id: { + type: DataTypes.INTEGER, + primaryKey: true, + autoIncrement: true + }, + name: DataTypes.STRING, + is_custom_model: DataTypes.BOOLEAN, + total_engaged_users: DataTypes.INTEGER, + total_pr_summaries_created: DataTypes.INTEGER +}, { + sequelize, + timestamps: false +}); + +DotcomChatMetrics.init({ + id: { + type: DataTypes.INTEGER, + primaryKey: true, + autoIncrement: true + }, + total_engaged_users: DataTypes.INTEGER, + total_chats: DataTypes.INTEGER +}, { + sequelize, + timestamps: false +}); +DotcomChatModelStats.init({ + id: { + type: DataTypes.INTEGER, + primaryKey: true, + autoIncrement: true + }, + name: DataTypes.STRING, + is_custom_model: DataTypes.BOOLEAN, + total_engaged_users: DataTypes.INTEGER, + total_chats: DataTypes.INTEGER +}, { + sequelize, + timestamps: false +}); + // Set up associations 🔗 DailyMetric.hasOne(IdeCompletions, { as: 'copilot_ide_code_completions', // This matches your response structure - foreignKey: 'dailyMetricDate', + foreignKey: 'daily_metric_id', sourceKey: 'date' }); +DailyMetric.hasOne(PrMetrics, { + as: 'copilot_dotcom_pull_requests', + foreignKey: 'daily_metric_id' +}); +DailyMetric.hasOne(DotcomChatMetrics, { + as: 'copilot_dotcom_chat', + foreignKey: 'daily_metric_id' +}); +DailyMetric.hasOne(IdeChatMetrics, { + as: 'copilot_ide_chat', + foreignKey: 'daily_metric_id' +}); + +IdeChatMetrics.belongsTo(DailyMetric, { + foreignKey: 'daily_metric_id' +}); +IdeChatMetrics.hasMany(IdeChatEditor, { + as: 'editors', + foreignKey: 'chat_metrics_id' +}); +IdeChatEditor.belongsTo(IdeChatMetrics, { + foreignKey: 'chat_metrics_id' +}); +IdeChatEditor.hasMany(IdeChatModelStats, { + as: 'models', + foreignKey: 'editor_id' +}); +IdeChatModelStats.belongsTo(IdeChatEditor, { + foreignKey: 'editor_id' +}); + IdeCompletions.belongsTo(DailyMetric, { as: 'DailyMetric', - foreignKey: 'dailyMetricDate', + foreignKey: 'daily_metric_id', targetKey: 'date' }); - IdeCompletions.hasMany(Editor, { as: 'editors', // Match the response structure foreignKey: 'ideCompletionId' @@ -165,7 +352,6 @@ Editor.belongsTo(IdeCompletions, { as: 'copilot_ide_code_completions', foreignKey: 'ideCompletionId' }); - Editor.hasMany(ModelStats, { as: 'models', // Match API response structure foreignKey: 'editorId' // Use consistent casing @@ -174,7 +360,6 @@ ModelStats.belongsTo(Editor, { as: 'editor', foreignKey: 'editorId' // Match the foreign key name }); - ModelStats.hasMany(LanguageStats, { as: 'languages', foreignKey: 'modelStatId' @@ -184,25 +369,113 @@ LanguageStats.belongsTo(ModelStats, { foreignKey: 'modelStatId' }); +PrMetrics.belongsTo(DailyMetric, { + foreignKey: 'daily_metric_id', + targetKey: 'date' +}); +PrMetrics.hasMany(PrRepository, { + as: 'repositories', + foreignKey: 'pr_metrics_id' +}); +PrRepository.belongsTo(PrMetrics, { + foreignKey: 'pr_metrics_id' +}); +PrRepository.hasMany(PrModelStats, { + as: 'models', + foreignKey: 'repository_id' +}); +PrModelStats.belongsTo(PrRepository, { + foreignKey: 'repository_id' +}); + +DotcomChatMetrics.belongsTo(DailyMetric, { + foreignKey: 'daily_metric_id', + targetKey: 'date' +}); +DotcomChatMetrics.hasMany(DotcomChatModelStats, { + as: 'models', + foreignKey: 'chat_metrics_id' +}); +DotcomChatModelStats.belongsTo(DotcomChatMetrics, { + foreignKey: 'chat_metrics_id' +}); + export async function insertDailyMetrics(data: CopilotMetrics[]) { for (const day of data) { const date = new Date(day.date); - // Create DailyMetric first 📅 - const metric = await DailyMetric.create({ - date: date, - total_active_users: day.total_active_users, - total_engaged_users: day.total_engaged_users, - total_code_acceptances: 0, - total_code_suggestions: 0, - total_code_lines_accepted: 0, - total_code_lines_suggested: 0 - }); + let metric: DailyMetric; + try { + metric = await DailyMetric.create({ + date: date, + total_active_users: day.total_active_users, + total_engaged_users: day.total_engaged_users, + }); + } catch { + logger.info(`Metrics for ${date.toLocaleDateString()} already exist. Skipping...`); + continue; + } + + if (day.copilot_ide_chat) { + let chatTotals = { + chats: 0, + copyEvents: 0, + insertionEvents: 0 + }; + + const chatMetrics = await IdeChatMetrics.create({ + daily_metric_id: metric.date, + total_engaged_users: day.copilot_ide_chat.total_engaged_users + }); + + for (const editor of day.copilot_ide_chat.editors) { + let chatTotalsEditor = { + chats: 0, + copyEvents: 0, + insertionEvents: 0 + }; + const editorRecord = await IdeChatEditor.create({ + chat_metrics_id: chatMetrics.id, + name: editor.name, + total_engaged_users: editor.total_engaged_users + }); + + await Promise.all(editor.models.map(model => { + if ('total_chats' in model) { + chatTotals.chats += model.total_chats || 0; + chatTotals.copyEvents += model.total_chat_copy_events || 0; + chatTotals.insertionEvents += model.total_chat_insertion_events || 0; + + return IdeChatModelStats.create({ + editor_id: editorRecord.id, + name: model.name, + is_custom_model: model.is_custom_model, + total_engaged_users: model.total_engaged_users, + total_chats: model.total_chats, + total_chat_copy_events: model.total_chat_copy_events, + total_chat_insertion_events: model.total_chat_insertion_events + }) + } + })); + + await editorRecord.update({ + total_chats: chatTotalsEditor.chats, + total_chat_copy_events: chatTotalsEditor.copyEvents, + total_chat_insertion_events: chatTotalsEditor.insertionEvents + }); + } + + await chatMetrics.update({ + total_chats: chatTotals.chats, + total_chat_copy_events: chatTotals.copyEvents, + total_chat_insertion_events: chatTotals.insertionEvents + }); + } if (day.copilot_ide_code_completions) { // Create IdeCompletions second 🖥️ const completions = await IdeCompletions.create({ total_engaged_users: day.copilot_ide_code_completions.total_engaged_users, - dailyMetricDate: date, + daily_metric_id: metric.date, total_code_acceptances: 0, total_code_suggestions: 0, total_code_lines_accepted: 0, @@ -298,12 +571,70 @@ export async function insertDailyMetrics(data: CopilotMetrics[]) { total_code_lines_accepted: dailyTotals.linesAccepted, total_code_lines_suggested: dailyTotals.linesSuggested }); + } - await metric.update({ - total_code_acceptances: dailyTotals.acceptances, - total_code_suggestions: dailyTotals.suggestions, - total_code_lines_accepted: dailyTotals.linesAccepted, - total_code_lines_suggested: dailyTotals.linesSuggested + if (day.copilot_dotcom_pull_requests) { + let totalPrSummaries = 0; // Initialize counter 🔢 + + const prMetrics = await PrMetrics.create({ + daily_metric_id: metric.date, + total_engaged_users: day.copilot_dotcom_pull_requests.total_engaged_users + }); + + // Create repositories and their models + for (const repo of day.copilot_dotcom_pull_requests.repositories) { + let totalPrSummariesRepo = 0; + const repository = await PrRepository.create({ + pr_metrics_id: prMetrics.id, + name: repo.name, + total_engaged_users: repo.total_engaged_users + }); + + // Create model stats for each repository + await Promise.all(repo.models.map(model => { + totalPrSummaries += model.total_pr_summaries_created || 0; // Add to running total ➕ + totalPrSummariesRepo += model.total_pr_summaries_created || 0; + + PrModelStats.create({ + repository_id: repository.id, + name: model.name, + is_custom_model: model.is_custom_model, + total_engaged_users: model.total_engaged_users, + total_pr_summaries_created: model.total_pr_summaries_created + }) + })); + repository.update({ + total_pr_summaries_created: totalPrSummariesRepo + }); + } + + await prMetrics.update({ + total_pr_summaries_created: totalPrSummaries + }); + } + + if (day.copilot_dotcom_chat) { + let totalChats = 0; // Initialize counter 🔢 + + const chatMetrics = await DotcomChatMetrics.create({ + daily_metric_id: metric.date, + total_engaged_users: day.copilot_dotcom_chat.total_engaged_users + }); + + // Create chat model stats + await Promise.all(day.copilot_dotcom_chat.models.map(model => { + totalChats += model.total_chats || 0; // Add to running total ➕ + DotcomChatModelStats.create({ + chat_metrics_id: chatMetrics.id, + name: model.name, + is_custom_model: model.is_custom_model, + total_engaged_users: model.total_engaged_users, + total_chats: model.total_chats + }) + })); + + await chatMetrics.update({ + total_chats: totalChats }); } } diff --git a/backend/src/services/metrics.service.ts b/backend/src/services/metrics.service.ts index fd49641..75042d7 100644 --- a/backend/src/services/metrics.service.ts +++ b/backend/src/services/metrics.service.ts @@ -18,7 +18,7 @@ class MetricsService { private async cronTask() { // this.queryCopilotUsageMetrics(); - // this.queryCopilotUsageMetricsNew(); + this.queryCopilotUsageMetricsNew(); // this.queryCopilotSeatAssignments(); } From 6cc0eab43d93bf5da9ad918e60fa3c2ac9d1bbb0 Mon Sep 17 00:00:00 2001 From: Austen Stone Date: Wed, 6 Nov 2024 22:58:23 -0500 Subject: [PATCH 3/3] Refactor settings model and update service imports; add usage controller and metrics service tests --- .../src/controllers/metrics.controller.new.ts | 184 - backend/src/controllers/metrics.controller.ts | 123 +- backend/src/controllers/seats.controller.ts | 22 +- backend/src/controllers/usage.controller.ts | 18 + backend/src/database.ts | 4 - backend/src/models/copilot.seats.ts | 75 +- ...erfaces.ts => metrics.model.interfaces.ts} | 0 backend/src/models/metrics.model.new.ts | 641 -- backend/src/models/metrics.model.ts | 663 +- backend/src/models/settings.model.ts | 1 - backend/src/models/usage.model.ts | 147 + backend/src/routes/index.ts | 9 +- backend/src/services/metrics.service.ts | 201 - backend/src/services/query.service.ts | 114 + backend/src/services/settings.service.ts | 4 +- backend/src/services/setup.ts | 2 +- frontend/src/app/main/main.component.ts | 8 +- .../services/metrics.service.interfaces.ts | 86 + .../src/app/services/metrics.service.spec.ts | 16 + frontend/src/app/services/metrics.service.ts | 27 + metrics.json | 6743 ----------------- 21 files changed, 1202 insertions(+), 7886 deletions(-) delete mode 100644 backend/src/controllers/metrics.controller.new.ts create mode 100644 backend/src/controllers/usage.controller.ts rename backend/src/models/{metrics.model.new.interfaces.ts => metrics.model.interfaces.ts} (100%) delete mode 100644 backend/src/models/metrics.model.new.ts create mode 100644 backend/src/models/usage.model.ts delete mode 100644 backend/src/services/metrics.service.ts create mode 100644 backend/src/services/query.service.ts create mode 100644 frontend/src/app/services/metrics.service.interfaces.ts create mode 100644 frontend/src/app/services/metrics.service.spec.ts create mode 100644 frontend/src/app/services/metrics.service.ts delete mode 100644 metrics.json diff --git a/backend/src/controllers/metrics.controller.new.ts b/backend/src/controllers/metrics.controller.new.ts deleted file mode 100644 index e11eaa4..0000000 --- a/backend/src/controllers/metrics.controller.new.ts +++ /dev/null @@ -1,184 +0,0 @@ -import { Request, Response } from 'express'; -import { DailyMetric, DotcomChatMetrics, DotcomChatModelStats, Editor, IdeChatEditor, IdeChatMetrics, IdeChatModelStats, IdeCompletions, LanguageStats, ModelStats, PrMetrics, PrModelStats, PrRepository } from '../models/metrics.model.new'; -import { Op } from 'sequelize'; - -class MetricsControllerNew { - // Get all metrics 📊 - async getAllMetrics(req: Request, res: Response): Promise { - const { type, since, until, editor, language, model } = req.query; - try { - // consider the fact that these are UTC dates... - const dateFilter: any = { }; - if (since) { - dateFilter[Op.gte] = new Date(since as string); - } - if (until) { - dateFilter[Op.lte] = new Date(until as string); - } - - const include = []; - const types = type ? (type as string).split(/[ ,]+/) : []; - if (types.length === 0 || types.includes('copilot_ide_code_completions')) { - include.push({ - attributes: { exclude: ['id', 'daily_metric_id'] }, - model: IdeCompletions, - as: 'copilot_ide_code_completions', - include: [{ - attributes: { exclude: ['id', 'ideCompletionId'] }, - model: Editor, - as: 'editors', - where: editor ? { name: editor } : {}, - required: false, - include: [{ - attributes: { exclude: ['id', 'editorId'] }, - model: ModelStats, - as: 'models', - where: model ? { name: model } : {}, - required: false, - include: [{ - attributes: { exclude: ['id', 'modelStatId'] }, - model: LanguageStats, - as: 'languages', - where: language ? { name: language } : {}, - required: false, - }] - }] - }] - }); - } - if (types.length === 0 || types.includes('copilot_ide_chat')) { - include.push({ - attributes: { exclude: ['id', 'daily_metric_id'] }, - model: IdeChatMetrics, - as: 'copilot_ide_chat', - include: [{ - attributes: { exclude: ['id', 'chat_metrics_id'] }, - model: IdeChatEditor, - as: 'editors', - where: editor ? { name: editor } : {}, - required: false, - include: [{ - attributes: { exclude: ['id', 'editor_id'] }, - model: IdeChatModelStats, - as: 'models', - where: model ? { name: model } : {}, - required: false, - }] - }] - }); - } - if (types.length === 0 || types.includes('copilot_dotcom_chat')) { - include.push({ - attributes: { exclude: ['id', 'daily_metric_id'] }, - model: DotcomChatMetrics, - as: 'copilot_dotcom_chat', - include: [{ - attributes: { exclude: ['id', 'chat_metrics_id'] }, - model: DotcomChatModelStats, - as: 'models', - where: model ? { name: model } : {}, - required: false, - }] - }); - } - if (types.length === 0 || types.includes('copilot_dotcom_pull_requests')) { - include.push({ - attributes: { exclude: ['id', 'daily_metric_id'] }, - model: PrMetrics, - as: 'copilot_dotcom_pull_requests', - include: [{ - attributes: { exclude: ['id', 'pr_metrics_id'] }, - model: PrRepository, - as: 'repositories', - include: [{ - attributes: { exclude: ['id', 'repository_id'] }, - model: PrModelStats, - as: 'models', - where: model ? { name: model } : {}, - required: false, - }] - }] - }); - } - const metrics = await DailyMetric.findAll({ - where: Object.getOwnPropertySymbols(dateFilter).length ? { date: dateFilter } : {}, - include - }); - res.status(200).json(metrics); // 🎉 All metrics retrieved! - } catch (error) { - console.log(error) - res.status(500).json(error); // 🚨 Error handling - } - } - - async getMetricsByDay(req: Request, res: Response): Promise { - const { date } = req.params; - try { - const metrics = await DailyMetric.findOne({ - where: { date: date }, - include: [{ - attributes: { exclude: ['id'] }, - model: IdeCompletions, - as: 'copilot_ide_code_completions', - required: false, - include: [{ - attributes: { exclude: ['id', 'ideCompletionId'] }, - model: Editor, - as: 'editors', - include: [{ - attributes: { exclude: ['id', 'editorId'] }, - model: ModelStats, - as: 'models', - include: [{ - attributes: { exclude: ['id', 'modelStatId'] }, - model: LanguageStats, - as: 'languages', - }] - }] - }] - }] - }); - res.status(200).json(metrics); // 🎉 All metrics retrieved! - } catch (error) { - console.log(error) - res.status(500).json(error); // 🚨 Error handling - } - } - - async getMetricsByEditor(req: Request, res: Response): Promise { - const { editor } = req.params; - try { - const metrics = await DailyMetric.findAll({ - include: [{ - attributes: { exclude: ['id'] }, - model: IdeCompletions, - as: 'copilot_ide_code_completions', - required: false, - include: [{ - attributes: { exclude: ['id', 'ideCompletionId'] }, - model: Editor, - as: 'editors', - where: { name: editor }, - include: [{ - attributes: { exclude: ['id', 'editorId'] }, - model: ModelStats, - as: 'models', - include: [{ - attributes: { exclude: ['id', 'modelStatId'] }, - model: LanguageStats, - as: 'languages', - }] - }] - }] - }] - }); - res.status(200).json(metrics); // 🎉 All metrics retrieved! - } catch (error) { - console.log(error) - res.status(500).json(error); // 🚨 Error handling - } - } - -} - -export default new MetricsControllerNew(); \ No newline at end of file diff --git a/backend/src/controllers/metrics.controller.ts b/backend/src/controllers/metrics.controller.ts index 690bdb1..99b4124 100644 --- a/backend/src/controllers/metrics.controller.ts +++ b/backend/src/controllers/metrics.controller.ts @@ -1,33 +1,112 @@ import { Request, Response } from 'express'; -import { Metrics, Breakdown } from '../models/metrics.model'; +import { MetricDaily, MetricDotcomChatMetrics, MetricDotcomChatModelStats, MetricEditor, MetricIdeChatEditor, MetricIdeChatMetrics, MetricIdeChatModelStats, MetricIdeCompletions, MetricLanguageStats, MetricModelStats, MetricPrMetrics, MetricPrModelStats, MetricPrRepository } from '../models/metrics.model'; +import { Op } from 'sequelize'; class MetricsController { // Get all metrics 📊 - async getAllMetrics(req: Request, res: Response): Promise { + async getMetrics(req: Request, res: Response): Promise { + const { type, since, until, editor, language, model } = req.query; try { - const metrics = await Metrics.findAll({ - include: [Breakdown] - }); - res.status(200).json(metrics); // 🎉 All metrics retrieved! - } catch (error) { - res.status(500).json(error); // 🚨 Error handling - } - } + // consider the fact that these are UTC dates... + const dateFilter: any = { }; + if (since) { + dateFilter[Op.gte] = new Date(since as string); + } + if (until) { + dateFilter[Op.lte] = new Date(until as string); + } - // Get metrics by day 📅 - async getMetricsByDay(req: Request, res: Response): Promise { - try { - const { day } = req.params; - const metrics = await Metrics.findOne({ - where: { day }, - include: [Breakdown] - }); - if (metrics) { - res.status(200).json(metrics); // 🎉 Metrics found! - } else { - res.status(404).json({ error: 'Metrics not found' }); // 🚨 Metrics not found + const include = []; + const types = type ? (type as string).split(/[ ,]+/) : []; + if (types.length === 0 || types.includes('copilot_ide_code_completions')) { + include.push({ + attributes: { exclude: ['id', 'daily_metric_id'] }, + model: MetricIdeCompletions, + as: 'copilot_ide_code_completions', + include: [{ + attributes: { exclude: ['id', 'ide_completion_id'] }, + model: MetricEditor, + as: 'editors', + where: editor ? { name: editor } : {}, + required: false, + include: [{ + attributes: { exclude: ['id', 'editor_id'] }, + model: MetricModelStats, + as: 'models', + where: model ? { name: model } : {}, + required: false, + include: [{ + attributes: { exclude: ['id', 'model_stat_id'] }, + model: MetricLanguageStats, + as: 'languages', + where: language ? { name: language } : {}, + required: false, + }] + }] + }] + }); + } + if (types.length === 0 || types.includes('copilot_ide_chat')) { + include.push({ + attributes: { exclude: ['id', 'daily_metric_id'] }, + model: MetricIdeChatMetrics, + as: 'copilot_ide_chat', + include: [{ + attributes: { exclude: ['id', 'chat_metrics_id'] }, + model: MetricIdeChatEditor, + as: 'editors', + where: editor ? { name: editor } : {}, + required: false, + include: [{ + attributes: { exclude: ['id', 'editor_id'] }, + model: MetricIdeChatModelStats, + as: 'models', + where: model ? { name: model } : {}, + required: false, + }] + }] + }); + } + if (types.length === 0 || types.includes('copilot_dotcom_chat')) { + include.push({ + attributes: { exclude: ['id', 'daily_metric_id'] }, + model: MetricDotcomChatMetrics, + as: 'copilot_dotcom_chat', + include: [{ + attributes: { exclude: ['id', 'chat_metrics_id'] }, + model: MetricDotcomChatModelStats, + as: 'models', + where: model ? { name: model } : {}, + required: false, + }] + }); } + if (types.length === 0 || types.includes('copilot_dotcom_pull_requests')) { + include.push({ + attributes: { exclude: ['id', 'daily_metric_id'] }, + model: MetricPrMetrics, + as: 'copilot_dotcom_pull_requests', + include: [{ + attributes: { exclude: ['id', 'pr_metrics_id'] }, + model: MetricPrRepository, + as: 'repositories', + include: [{ + attributes: { exclude: ['id', 'repository_id'] }, + model: MetricPrModelStats, + as: 'models', + where: model ? { name: model } : {}, + required: false, + }] + }] + }); + } + const metrics = await MetricDaily.findAll({ + where: Object.getOwnPropertySymbols(dateFilter).length ? { date: dateFilter } : {}, + include + }); + res.status(200).json(metrics); // 🎉 All metrics retrieved! } catch (error) { + console.log(error) res.status(500).json(error); // 🚨 Error handling } } diff --git a/backend/src/controllers/seats.controller.ts b/backend/src/controllers/seats.controller.ts index 7c22eaf..1503fe3 100644 --- a/backend/src/controllers/seats.controller.ts +++ b/backend/src/controllers/seats.controller.ts @@ -1,14 +1,14 @@ import { Request, Response } from 'express'; -import { Seat, Assignee, AssigningTeam } from '../models/copilot.seats'; +import { CopilotSeat, CopilotAssignee, CopilotAssigningTeam } from '../models/copilot.seats'; class SeatsController { // Get all metrics 📊 async getAllSeats(req: Request, res: Response): Promise { try { - const metrics = await Seat.findAll({ + const metrics = await CopilotSeat.findAll({ include: [ - { model: Assignee, as: 'assignee' }, - { model: AssigningTeam, as: 'assigning_team' } + { model: CopilotAssignee, as: 'assignee' }, + { model: CopilotAssigningTeam, as: 'assigning_team' } ] }); res.status(200).json(metrics); // 🎉 All metrics retrieved! @@ -21,18 +21,18 @@ class SeatsController { async getSeatByLogin(req: Request, res: Response): Promise { try { const { login } = req.params; - const assignee = await Assignee.findOne({ + const assignee = await CopilotAssignee.findOne({ where: { login } }); if (!assignee) { res.status(404).json({ error: 'Assignee not found' }); // 🚨 Assignee not foun return; } - const metrics = await Seat.findOne({ + const metrics = await CopilotSeat.findOne({ where: { assigneeId: assignee?.dataValues.id }, include: [ - { model: Assignee, as: 'assignee' }, - { model: AssigningTeam, as: 'assigning_team' } + { model: CopilotAssignee, as: 'assignee' }, + { model: CopilotAssigningTeam, as: 'assigning_team' } ] }); if (metrics) { @@ -49,11 +49,11 @@ class SeatsController { async getSeatActivityByLogin(req: Request, res: Response): Promise { try { const { login } = req.params; - const metrics = await Seat.findAndCountAll({ + const metrics = await CopilotSeat.findAndCountAll({ where: { login }, include: [ - { model: Assignee, as: 'assignee' }, - { model: AssigningTeam, as: 'assigning_team' } + { model: CopilotAssignee, as: 'assignee' }, + { model: CopilotAssigningTeam, as: 'assigning_team' } ] }); if (metrics) { diff --git a/backend/src/controllers/usage.controller.ts b/backend/src/controllers/usage.controller.ts new file mode 100644 index 0000000..440bbb0 --- /dev/null +++ b/backend/src/controllers/usage.controller.ts @@ -0,0 +1,18 @@ +import { Request, Response } from 'express'; +import { Usage, UsageBreakdown } from '../models/usage.model'; + +class UsageController { + // Get all metrics 📊 + async getUsage(req: Request, res: Response): Promise { + try { + const metrics = await Usage.findAll({ + include: [UsageBreakdown] + }); + res.status(200).json(metrics); // 🎉 All metrics retrieved! + } catch (error) { + res.status(500).json(error); // 🚨 Error handling + } + } +} + +export default new UsageController(); \ No newline at end of file diff --git a/backend/src/database.ts b/backend/src/database.ts index 25217d6..502f4dc 100644 --- a/backend/src/database.ts +++ b/backend/src/database.ts @@ -1,8 +1,4 @@ import { Sequelize } from 'sequelize'; -import { Settings } from './models/settings.model'; -import { Metrics, Breakdown } from './models/metrics.model'; -import { Survey } from './models/survey.model'; -import { Assignee, AssigningTeam, Seat } from './models/copilot.seats'; import logger from './services/logger'; import mysql2 from 'mysql2/promise'; diff --git a/backend/src/models/copilot.seats.ts b/backend/src/models/copilot.seats.ts index d9fb642..53cfc5e 100644 --- a/backend/src/models/copilot.seats.ts +++ b/backend/src/models/copilot.seats.ts @@ -1,7 +1,7 @@ import { DataTypes } from 'sequelize'; import { sequelize } from '../database'; -const Assignee = sequelize.define('Assignee', { +const CopilotAssignee = sequelize.define('CopilotAssignee', { login: { type: DataTypes.STRING, allowNull: false, @@ -75,11 +75,10 @@ const Assignee = sequelize.define('Assignee', { allowNull: false, }, }, { - tableName: 'assignees', timestamps: false, }); -const AssigningTeam = sequelize.define('AssigningTeam', { +const CopilotAssigningTeam = sequelize.define('CopilotAssigningTeam', { id: { type: DataTypes.INTEGER, primaryKey: true, @@ -133,11 +132,10 @@ const AssigningTeam = sequelize.define('AssigningTeam', { allowNull: true, }, }, { - tableName: 'assigning_teams', timestamps: false, }); -const Seat = sequelize.define('Seat', { +const CopilotSeat = sequelize.define('CopilotSeat', { created_at: { type: DataTypes.DATE, allowNull: false, @@ -165,23 +163,78 @@ const Seat = sequelize.define('Seat', { assigneeId: { type: DataTypes.INTEGER, references: { - model: Assignee, + model: CopilotAssignee, key: 'id', } }, assigningTeamId: { type: DataTypes.INTEGER, references: { - model: AssigningTeam, + model: CopilotAssigningTeam, key: 'id', }, }, }, { - tableName: 'seats', timestamps: false, }); -Seat.belongsTo(Assignee, { foreignKey: 'assigneeId', as: 'assignee' }); -Seat.belongsTo(AssigningTeam, { foreignKey: 'assigningTeamId', as: 'assigning_team' }); +CopilotSeat.belongsTo(CopilotAssignee, { foreignKey: 'assigneeId', as: 'assignee' }); +CopilotSeat.belongsTo(CopilotAssigningTeam, { foreignKey: 'assigningTeamId', as: 'assigning_team' }); -export { Assignee, AssigningTeam, Seat }; \ No newline at end of file +async function insertSeats(data: any[]) { + for (const seat of data) { + const assignee = await CopilotAssignee.findOrCreate({ + where: { id: seat.assignee.id }, + defaults: { + login: seat.assignee.login, + node_id: seat.assignee.node_id, + avatar_url: seat.assignee.avatar_url, + gravatar_id: seat.assignee.gravatar_id, + url: seat.assignee.url, + html_url: seat.assignee.html_url, + followers_url: seat.assignee.followers_url, + following_url: seat.assignee.following_url, + gists_url: seat.assignee.gists_url, + starred_url: seat.assignee.starred_url, + subscriptions_url: seat.assignee.subscriptions_url, + organizations_url: seat.assignee.organizations_url, + repos_url: seat.assignee.repos_url, + events_url: seat.assignee.events_url, + received_events_url: seat.assignee.received_events_url, + type: seat.assignee.type, + site_admin: seat.assignee.site_admin, + } + }); + + const assigningTeam = seat.assigning_team ? await CopilotAssigningTeam.findOrCreate({ + where: { id: seat.assigning_team.id }, + defaults: { + node_id: seat.assigning_team.node_id, + url: seat.assigning_team.url, + html_url: seat.assigning_team.html_url, + name: seat.assigning_team.name, + slug: seat.assigning_team.slug, + description: seat.assigning_team.description, + privacy: seat.assigning_team.privacy, + notification_setting: seat.assigning_team.notification_setting, + permission: seat.assigning_team.permission, + members_url: seat.assigning_team.members_url, + repositories_url: seat.assigning_team.repositories_url, + parent: seat.assigning_team.parent, + } + }) : null; + + await CopilotSeat.create({ + created_at: seat.created_at, + updated_at: seat.updated_at, + pending_cancellation_date: seat.pending_cancellation_date, + last_activity_at: seat.last_activity_at, + last_activity_editor: seat.last_activity_editor, + plan_type: (seat as any).plan_type, + assigneeId: seat.assignee.id, + assigningTeamId: assigningTeam ? seat.assigning_team?.id : null, + }); + } +} + +export { CopilotAssignee, CopilotAssigningTeam, CopilotSeat, insertSeats }; \ No newline at end of file diff --git a/backend/src/models/metrics.model.new.interfaces.ts b/backend/src/models/metrics.model.interfaces.ts similarity index 100% rename from backend/src/models/metrics.model.new.interfaces.ts rename to backend/src/models/metrics.model.interfaces.ts diff --git a/backend/src/models/metrics.model.new.ts b/backend/src/models/metrics.model.new.ts deleted file mode 100644 index 3791120..0000000 --- a/backend/src/models/metrics.model.new.ts +++ /dev/null @@ -1,641 +0,0 @@ -// models/daily-metric.ts -import { Model, DataTypes, Sequelize } from 'sequelize'; -import { sequelize } from '../database'; -import { ChatModel, CopilotMetrics } from './metrics.model.new.interfaces'; -import logger from '../services/logger'; - -// Main metric model 📈 -export class DailyMetric extends Model { - public date!: Date; - public total_active_users!: number; - public total_engaged_users!: number; -} - -// IDE Completions model 🖥️ -export class IdeCompletions extends Model { - public id!: number; - public total_engaged_users!: number; - public total_code_acceptances!: number; - public total_code_suggestions!: number; - public total_code_lines_accepted!: number; - public total_code_lines_suggested!: number; - public daily_metric_id!: Date; -} -export class Editor extends Model { - public id!: number; - public name!: string; - public total_engaged_users!: number; - public total_code_acceptances!: number; - public total_code_suggestions!: number; - public total_code_lines_accepted!: number; - public total_code_lines_suggested!: number; - public ideCompletionId!: number; -} -export class ModelStats extends Model { - public id!: number; - public name!: string; - public is_custom_model!: boolean; - public total_engaged_users!: number; - public total_code_acceptances!: number; - public total_code_suggestions!: number; - public total_code_lines_accepted!: number; - public total_code_lines_suggested!: number; - public editorId!: number; -} -export class LanguageStats extends Model { - public id!: number; - public name!: string; - public total_engaged_users!: number; - public total_code_acceptances!: number; - public total_code_suggestions!: number; - public total_code_lines_accepted!: number; - public total_code_lines_suggested!: number; - public modelStatId!: number; -} - -// PR Repository Model 🏢 -export class PrRepository extends Model { - public id!: number; - public name!: string; - public total_engaged_users!: number; - public total_pr_summaries_created!: number; -} -export class PrModelStats extends Model { - public id!: number; - public name!: string; - public is_custom_model!: boolean; - public total_engaged_users!: number; - public total_pr_summaries_created!: number; -} -export class PrMetrics extends Model { - public id!: number; - public total_engaged_users!: number; - public total_pr_summaries_created!: number; -} - -// Chat Model 💬 -export class DotcomChatMetrics extends Model { - public id!: number; - public total_engaged_users!: number; - public total_chats!: number; -} -export class DotcomChatModelStats extends Model { - public id!: number; - public name!: string; - public is_custom_model!: boolean; - public total_engaged_users!: number; - public total_chats!: number; -} -export class IdeChatMetrics extends Model { - public id!: number; - public total_engaged_users!: number; - public total_chats!: number; - public total_chat_copy_events!: number; - public total_chat_insertion_events!: number; -} -export class IdeChatEditor extends Model { - public id!: number; - public name!: string; - public total_engaged_users!: number; - public total_chats!: number; - public total_chat_copy_events!: number; - public total_chat_insertion_events!: number; -} -export class IdeChatModelStats extends Model { - public id!: number; - public name!: string; - public is_custom_model!: boolean; - public total_engaged_users!: number; - public total_chats!: number; - public total_chat_copy_events!: number; - public total_chat_insertion_events!: number; -} - -// Initialize models -DailyMetric.init({ - date: { - type: DataTypes.DATEONLY, - primaryKey: true - }, - total_active_users: DataTypes.INTEGER, - total_engaged_users: DataTypes.INTEGER -}, { - sequelize, - timestamps: false -}); - -IdeChatMetrics.init({ - id: { - type: DataTypes.INTEGER, - primaryKey: true, - autoIncrement: true - }, - total_engaged_users: DataTypes.INTEGER, - total_chats: DataTypes.INTEGER, - total_chat_copy_events: DataTypes.INTEGER, - total_chat_insertion_events: DataTypes.INTEGER -}, { - sequelize, - timestamps: false -}); -IdeChatEditor.init({ - id: { - type: DataTypes.INTEGER, - primaryKey: true, - autoIncrement: true - }, - name: DataTypes.STRING, - total_engaged_users: DataTypes.INTEGER, - total_chats: DataTypes.INTEGER, - total_chat_copy_events: DataTypes.INTEGER, - total_chat_insertion_events: DataTypes.INTEGER -}, { - sequelize, - timestamps: false -}); -IdeChatModelStats.init({ - id: { - type: DataTypes.INTEGER, - primaryKey: true, - autoIncrement: true - }, - name: DataTypes.STRING, - is_custom_model: DataTypes.BOOLEAN, - total_engaged_users: DataTypes.INTEGER, - total_chats: DataTypes.INTEGER, - total_chat_copy_events: DataTypes.INTEGER, - total_chat_insertion_events: DataTypes.INTEGER -}, { - sequelize, - timestamps: false -}); - -IdeCompletions.init({ - id: { - type: DataTypes.INTEGER, - primaryKey: true, - autoIncrement: true - }, - total_engaged_users: DataTypes.INTEGER, - total_code_acceptances: DataTypes.INTEGER, - total_code_suggestions: DataTypes.INTEGER, - total_code_lines_accepted: DataTypes.INTEGER, - total_code_lines_suggested: DataTypes.INTEGER -}, { - sequelize, - timestamps: false -}); -Editor.init({ - id: { - type: DataTypes.INTEGER, - primaryKey: true, - autoIncrement: true - }, - name: DataTypes.STRING, - total_engaged_users: DataTypes.INTEGER, - total_code_acceptances: DataTypes.INTEGER, - total_code_suggestions: DataTypes.INTEGER, - total_code_lines_accepted: DataTypes.INTEGER, - total_code_lines_suggested: DataTypes.INTEGER -}, { - sequelize, - timestamps: false -}); -ModelStats.init({ - id: { - type: DataTypes.INTEGER, - primaryKey: true, - autoIncrement: true - }, - name: DataTypes.STRING, - is_custom_model: DataTypes.BOOLEAN, - total_engaged_users: DataTypes.INTEGER, - total_code_acceptances: DataTypes.INTEGER, - total_code_suggestions: DataTypes.INTEGER, - total_code_lines_accepted: DataTypes.INTEGER, - total_code_lines_suggested: DataTypes.INTEGER -}, { - sequelize, - timestamps: false -}); -LanguageStats.init({ - id: { - type: DataTypes.INTEGER, - primaryKey: true, - autoIncrement: true - }, - name: DataTypes.STRING, - total_engaged_users: DataTypes.INTEGER, - total_code_acceptances: DataTypes.INTEGER, - total_code_suggestions: DataTypes.INTEGER, - total_code_lines_accepted: DataTypes.INTEGER, - total_code_lines_suggested: DataTypes.INTEGER -}, { - sequelize, - timestamps: false -}); - -PrMetrics.init({ - id: { - type: DataTypes.INTEGER, - primaryKey: true, - autoIncrement: true - }, - total_engaged_users: DataTypes.INTEGER, - total_pr_summaries_created: DataTypes.INTEGER -}, { - sequelize, - timestamps: false -}); -PrRepository.init({ - id: { - type: DataTypes.INTEGER, - primaryKey: true, - autoIncrement: true - }, - name: DataTypes.STRING, - total_engaged_users: DataTypes.INTEGER, - total_pr_summaries_created: DataTypes.INTEGER -}, { - sequelize, - timestamps: false -}); -PrModelStats.init({ - id: { - type: DataTypes.INTEGER, - primaryKey: true, - autoIncrement: true - }, - name: DataTypes.STRING, - is_custom_model: DataTypes.BOOLEAN, - total_engaged_users: DataTypes.INTEGER, - total_pr_summaries_created: DataTypes.INTEGER -}, { - sequelize, - timestamps: false -}); - -DotcomChatMetrics.init({ - id: { - type: DataTypes.INTEGER, - primaryKey: true, - autoIncrement: true - }, - total_engaged_users: DataTypes.INTEGER, - total_chats: DataTypes.INTEGER -}, { - sequelize, - timestamps: false -}); -DotcomChatModelStats.init({ - id: { - type: DataTypes.INTEGER, - primaryKey: true, - autoIncrement: true - }, - name: DataTypes.STRING, - is_custom_model: DataTypes.BOOLEAN, - total_engaged_users: DataTypes.INTEGER, - total_chats: DataTypes.INTEGER -}, { - sequelize, - timestamps: false -}); - -// Set up associations 🔗 -DailyMetric.hasOne(IdeCompletions, { - as: 'copilot_ide_code_completions', // This matches your response structure - foreignKey: 'daily_metric_id', - sourceKey: 'date' -}); -DailyMetric.hasOne(PrMetrics, { - as: 'copilot_dotcom_pull_requests', - foreignKey: 'daily_metric_id' -}); -DailyMetric.hasOne(DotcomChatMetrics, { - as: 'copilot_dotcom_chat', - foreignKey: 'daily_metric_id' -}); -DailyMetric.hasOne(IdeChatMetrics, { - as: 'copilot_ide_chat', - foreignKey: 'daily_metric_id' -}); - -IdeChatMetrics.belongsTo(DailyMetric, { - foreignKey: 'daily_metric_id' -}); -IdeChatMetrics.hasMany(IdeChatEditor, { - as: 'editors', - foreignKey: 'chat_metrics_id' -}); -IdeChatEditor.belongsTo(IdeChatMetrics, { - foreignKey: 'chat_metrics_id' -}); -IdeChatEditor.hasMany(IdeChatModelStats, { - as: 'models', - foreignKey: 'editor_id' -}); -IdeChatModelStats.belongsTo(IdeChatEditor, { - foreignKey: 'editor_id' -}); - -IdeCompletions.belongsTo(DailyMetric, { - as: 'DailyMetric', - foreignKey: 'daily_metric_id', - targetKey: 'date' -}); -IdeCompletions.hasMany(Editor, { - as: 'editors', // Match the response structure - foreignKey: 'ideCompletionId' -}); -Editor.belongsTo(IdeCompletions, { - as: 'copilot_ide_code_completions', - foreignKey: 'ideCompletionId' -}); -Editor.hasMany(ModelStats, { - as: 'models', // Match API response structure - foreignKey: 'editorId' // Use consistent casing -}); -ModelStats.belongsTo(Editor, { - as: 'editor', - foreignKey: 'editorId' // Match the foreign key name -}); -ModelStats.hasMany(LanguageStats, { - as: 'languages', - foreignKey: 'modelStatId' -}); -LanguageStats.belongsTo(ModelStats, { - as: 'model', - foreignKey: 'modelStatId' -}); - -PrMetrics.belongsTo(DailyMetric, { - foreignKey: 'daily_metric_id', - targetKey: 'date' -}); -PrMetrics.hasMany(PrRepository, { - as: 'repositories', - foreignKey: 'pr_metrics_id' -}); -PrRepository.belongsTo(PrMetrics, { - foreignKey: 'pr_metrics_id' -}); -PrRepository.hasMany(PrModelStats, { - as: 'models', - foreignKey: 'repository_id' -}); -PrModelStats.belongsTo(PrRepository, { - foreignKey: 'repository_id' -}); - -DotcomChatMetrics.belongsTo(DailyMetric, { - foreignKey: 'daily_metric_id', - targetKey: 'date' -}); -DotcomChatMetrics.hasMany(DotcomChatModelStats, { - as: 'models', - foreignKey: 'chat_metrics_id' -}); -DotcomChatModelStats.belongsTo(DotcomChatMetrics, { - foreignKey: 'chat_metrics_id' -}); - -export async function insertDailyMetrics(data: CopilotMetrics[]) { - for (const day of data) { - const date = new Date(day.date); - let metric: DailyMetric; - try { - metric = await DailyMetric.create({ - date: date, - total_active_users: day.total_active_users, - total_engaged_users: day.total_engaged_users, - }); - } catch { - logger.info(`Metrics for ${date.toLocaleDateString()} already exist. Skipping...`); - continue; - } - - if (day.copilot_ide_chat) { - let chatTotals = { - chats: 0, - copyEvents: 0, - insertionEvents: 0 - }; - - const chatMetrics = await IdeChatMetrics.create({ - daily_metric_id: metric.date, - total_engaged_users: day.copilot_ide_chat.total_engaged_users - }); - - for (const editor of day.copilot_ide_chat.editors) { - let chatTotalsEditor = { - chats: 0, - copyEvents: 0, - insertionEvents: 0 - }; - const editorRecord = await IdeChatEditor.create({ - chat_metrics_id: chatMetrics.id, - name: editor.name, - total_engaged_users: editor.total_engaged_users - }); - - await Promise.all(editor.models.map(model => { - if ('total_chats' in model) { - chatTotals.chats += model.total_chats || 0; - chatTotals.copyEvents += model.total_chat_copy_events || 0; - chatTotals.insertionEvents += model.total_chat_insertion_events || 0; - - return IdeChatModelStats.create({ - editor_id: editorRecord.id, - name: model.name, - is_custom_model: model.is_custom_model, - total_engaged_users: model.total_engaged_users, - total_chats: model.total_chats, - total_chat_copy_events: model.total_chat_copy_events, - total_chat_insertion_events: model.total_chat_insertion_events - }) - } - })); - - await editorRecord.update({ - total_chats: chatTotalsEditor.chats, - total_chat_copy_events: chatTotalsEditor.copyEvents, - total_chat_insertion_events: chatTotalsEditor.insertionEvents - }); - } - - await chatMetrics.update({ - total_chats: chatTotals.chats, - total_chat_copy_events: chatTotals.copyEvents, - total_chat_insertion_events: chatTotals.insertionEvents - }); - } - - if (day.copilot_ide_code_completions) { - // Create IdeCompletions second 🖥️ - const completions = await IdeCompletions.create({ - total_engaged_users: day.copilot_ide_code_completions.total_engaged_users, - daily_metric_id: metric.date, - total_code_acceptances: 0, - total_code_suggestions: 0, - total_code_lines_accepted: 0, - total_code_lines_suggested: 0 - }); - - let dailyTotals = { acceptances: 0, suggestions: 0, linesAccepted: 0, linesSuggested: 0 }; - - // Process editors third 👨‍💻 - for (const editor of day.copilot_ide_code_completions.editors) { - const editorRecord = await Editor.create({ - name: editor.name, - total_engaged_users: editor.total_engaged_users, - ideCompletionId: completions.id, - total_code_acceptances: 0, - total_code_suggestions: 0, - total_code_lines_accepted: 0, - total_code_lines_suggested: 0 - }); - - let editorTotals = { acceptances: 0, suggestions: 0, linesAccepted: 0, linesSuggested: 0 }; - - // Process models fourth 🤖 - for (const model of editor.models) { - const modelRecord = await ModelStats.create({ - name: model.name, - is_custom_model: model.is_custom_model, - total_engaged_users: model.total_engaged_users, - editorId: editorRecord.id, - total_code_acceptances: 0, - total_code_suggestions: 0, - total_code_lines_accepted: 0, - total_code_lines_suggested: 0 - }); - - let modelTotals = { acceptances: 0, suggestions: 0, linesAccepted: 0, linesSuggested: 0 }; - - // Process languages last 🗣️ - if ('languages' in model) { - for (const lang of model.languages) { - await LanguageStats.create({ - name: lang.name, - total_engaged_users: lang.total_engaged_users, - total_code_acceptances: lang.total_code_acceptances, - total_code_suggestions: lang.total_code_suggestions, - total_code_lines_accepted: lang.total_code_lines_accepted, - total_code_lines_suggested: lang.total_code_lines_suggested, - modelStatId: modelRecord.id - }); - - // Roll up language totals to model 📈 - modelTotals.acceptances += lang.total_code_acceptances || 0; - modelTotals.suggestions += lang.total_code_suggestions || 0; - modelTotals.linesAccepted += lang.total_code_lines_accepted || 0; - modelTotals.linesSuggested += lang.total_code_lines_suggested || 0; - } - } - - // Update model with totals ⬆️ - await modelRecord.update({ - total_code_acceptances: modelTotals.acceptances, - total_code_suggestions: modelTotals.suggestions, - total_code_lines_accepted: modelTotals.linesAccepted, - total_code_lines_suggested: modelTotals.linesSuggested - }); - - // Roll up model totals to editor 📊 - editorTotals.acceptances += modelTotals.acceptances; - editorTotals.suggestions += modelTotals.suggestions; - editorTotals.linesAccepted += modelTotals.linesAccepted; - editorTotals.linesSuggested += modelTotals.linesSuggested; - } - - // Update editor with totals ⬆️ - await editorRecord.update({ - total_code_acceptances: editorTotals.acceptances, - total_code_suggestions: editorTotals.suggestions, - total_code_lines_accepted: editorTotals.linesAccepted, - total_code_lines_suggested: editorTotals.linesSuggested - }); - - // Roll up editor totals to daily 📅 - dailyTotals.acceptances += editorTotals.acceptances; - dailyTotals.suggestions += editorTotals.suggestions; - dailyTotals.linesAccepted += editorTotals.linesAccepted; - dailyTotals.linesSuggested += editorTotals.linesSuggested; - } - - // Update final totals ⬆️ - await completions.update({ - total_code_acceptances: dailyTotals.acceptances, - total_code_suggestions: dailyTotals.suggestions, - total_code_lines_accepted: dailyTotals.linesAccepted, - total_code_lines_suggested: dailyTotals.linesSuggested - }); - } - - if (day.copilot_dotcom_pull_requests) { - let totalPrSummaries = 0; // Initialize counter 🔢 - - const prMetrics = await PrMetrics.create({ - daily_metric_id: metric.date, - total_engaged_users: day.copilot_dotcom_pull_requests.total_engaged_users - }); - - // Create repositories and their models - for (const repo of day.copilot_dotcom_pull_requests.repositories) { - let totalPrSummariesRepo = 0; - const repository = await PrRepository.create({ - pr_metrics_id: prMetrics.id, - name: repo.name, - total_engaged_users: repo.total_engaged_users - }); - - // Create model stats for each repository - await Promise.all(repo.models.map(model => { - totalPrSummaries += model.total_pr_summaries_created || 0; // Add to running total ➕ - totalPrSummariesRepo += model.total_pr_summaries_created || 0; - - PrModelStats.create({ - repository_id: repository.id, - name: model.name, - is_custom_model: model.is_custom_model, - total_engaged_users: model.total_engaged_users, - total_pr_summaries_created: model.total_pr_summaries_created - }) - })); - repository.update({ - total_pr_summaries_created: totalPrSummariesRepo - }); - } - - await prMetrics.update({ - total_pr_summaries_created: totalPrSummaries - }); - } - - if (day.copilot_dotcom_chat) { - let totalChats = 0; // Initialize counter 🔢 - - const chatMetrics = await DotcomChatMetrics.create({ - daily_metric_id: metric.date, - total_engaged_users: day.copilot_dotcom_chat.total_engaged_users - }); - - // Create chat model stats - await Promise.all(day.copilot_dotcom_chat.models.map(model => { - totalChats += model.total_chats || 0; // Add to running total ➕ - DotcomChatModelStats.create({ - chat_metrics_id: chatMetrics.id, - name: model.name, - is_custom_model: model.is_custom_model, - total_engaged_users: model.total_engaged_users, - total_chats: model.total_chats - }) - })); - - await chatMetrics.update({ - total_chats: totalChats - }); - } - } -} \ No newline at end of file diff --git a/backend/src/models/metrics.model.ts b/backend/src/models/metrics.model.ts index 251a249..39fc4a7 100644 --- a/backend/src/models/metrics.model.ts +++ b/backend/src/models/metrics.model.ts @@ -1,96 +1,641 @@ -import { DataTypes } from 'sequelize'; +// models/daily-metric.ts +import { Model, DataTypes, Sequelize } from 'sequelize'; import { sequelize } from '../database'; +import { ChatModel, CopilotMetrics } from './metrics.model.interfaces'; +import logger from '../services/logger'; -const Metrics = sequelize.define('Metrics', { - day: { +// Main metric model 📈 +export class MetricDaily extends Model { + public date!: Date; + public total_active_users!: number; + public total_engaged_users!: number; +} + +// IDE Completions model 🖥️ +export class MetricIdeCompletions extends Model { + public id!: number; + public total_engaged_users!: number; + public total_code_acceptances!: number; + public total_code_suggestions!: number; + public total_code_lines_accepted!: number; + public total_code_lines_suggested!: number; + public daily_metric_id!: Date; +} +export class MetricEditor extends Model { + public id!: number; + public name!: string; + public total_engaged_users!: number; + public total_code_acceptances!: number; + public total_code_suggestions!: number; + public total_code_lines_accepted!: number; + public total_code_lines_suggested!: number; + public ide_completion_id!: number; +} +export class MetricModelStats extends Model { + public id!: number; + public name!: string; + public is_custom_model!: boolean; + public total_engaged_users!: number; + public total_code_acceptances!: number; + public total_code_suggestions!: number; + public total_code_lines_accepted!: number; + public total_code_lines_suggested!: number; + public editor_id!: number; +} +export class MetricLanguageStats extends Model { + public id!: number; + public name!: string; + public total_engaged_users!: number; + public total_code_acceptances!: number; + public total_code_suggestions!: number; + public total_code_lines_accepted!: number; + public total_code_lines_suggested!: number; + public model_stat_id!: number; +} + +// PR Repository Model 🏢 +export class MetricPrRepository extends Model { + public id!: number; + public name!: string; + public total_engaged_users!: number; + public total_pr_summaries_created!: number; +} +export class MetricPrModelStats extends Model { + public id!: number; + public name!: string; + public is_custom_model!: boolean; + public total_engaged_users!: number; + public total_pr_summaries_created!: number; +} +export class MetricPrMetrics extends Model { + public id!: number; + public total_engaged_users!: number; + public total_pr_summaries_created!: number; +} + +// Chat Model 💬 +export class MetricDotcomChatMetrics extends Model { + public id!: number; + public total_engaged_users!: number; + public total_chats!: number; +} +export class MetricDotcomChatModelStats extends Model { + public id!: number; + public name!: string; + public is_custom_model!: boolean; + public total_engaged_users!: number; + public total_chats!: number; +} +export class MetricIdeChatMetrics extends Model { + public id!: number; + public total_engaged_users!: number; + public total_chats!: number; + public total_chat_copy_events!: number; + public total_chat_insertion_events!: number; +} +export class MetricIdeChatEditor extends Model { + public id!: number; + public name!: string; + public total_engaged_users!: number; + public total_chats!: number; + public total_chat_copy_events!: number; + public total_chat_insertion_events!: number; +} +export class MetricIdeChatModelStats extends Model { + public id!: number; + public name!: string; + public is_custom_model!: boolean; + public total_engaged_users!: number; + public total_chats!: number; + public total_chat_copy_events!: number; + public total_chat_insertion_events!: number; +} + +// Initialize models +MetricDaily.init({ + date: { type: DataTypes.DATEONLY, - primaryKey: true, - allowNull: false, - }, - totalSuggestionsCount: { - type: DataTypes.INTEGER, - allowNull: false, + primaryKey: true }, - totalAcceptancesCount: { + total_active_users: DataTypes.INTEGER, + total_engaged_users: DataTypes.INTEGER +}, { + sequelize, + timestamps: false +}); + +MetricIdeChatMetrics.init({ + id: { type: DataTypes.INTEGER, - allowNull: false, + primaryKey: true, + autoIncrement: true }, - totalLinesSuggested: { + total_engaged_users: DataTypes.INTEGER, + total_chats: DataTypes.INTEGER, + total_chat_copy_events: DataTypes.INTEGER, + total_chat_insertion_events: DataTypes.INTEGER +}, { + sequelize, + timestamps: false +}); +MetricIdeChatEditor.init({ + id: { type: DataTypes.INTEGER, - allowNull: false, + primaryKey: true, + autoIncrement: true }, - totalLinesAccepted: { + name: DataTypes.STRING, + total_engaged_users: DataTypes.INTEGER, + total_chats: DataTypes.INTEGER, + total_chat_copy_events: DataTypes.INTEGER, + total_chat_insertion_events: DataTypes.INTEGER +}, { + sequelize, + timestamps: false +}); +MetricIdeChatModelStats.init({ + id: { type: DataTypes.INTEGER, - allowNull: false, + primaryKey: true, + autoIncrement: true }, - totalActiveUsers: { + name: DataTypes.STRING, + is_custom_model: DataTypes.BOOLEAN, + total_engaged_users: DataTypes.INTEGER, + total_chats: DataTypes.INTEGER, + total_chat_copy_events: DataTypes.INTEGER, + total_chat_insertion_events: DataTypes.INTEGER +}, { + sequelize, + timestamps: false +}); + +MetricIdeCompletions.init({ + id: { type: DataTypes.INTEGER, - allowNull: false, + primaryKey: true, + autoIncrement: true }, - totalChatAcceptances: { + total_engaged_users: DataTypes.INTEGER, + total_code_acceptances: DataTypes.INTEGER, + total_code_suggestions: DataTypes.INTEGER, + total_code_lines_accepted: DataTypes.INTEGER, + total_code_lines_suggested: DataTypes.INTEGER +}, { + sequelize, + timestamps: false +}); +MetricEditor.init({ + id: { type: DataTypes.INTEGER, - allowNull: false, + primaryKey: true, + autoIncrement: true }, - totalChatTurns: { + name: DataTypes.STRING, + total_engaged_users: DataTypes.INTEGER, + total_code_acceptances: DataTypes.INTEGER, + total_code_suggestions: DataTypes.INTEGER, + total_code_lines_accepted: DataTypes.INTEGER, + total_code_lines_suggested: DataTypes.INTEGER +}, { + sequelize, + timestamps: false +}); +MetricModelStats.init({ + id: { type: DataTypes.INTEGER, - allowNull: false, + primaryKey: true, + autoIncrement: true }, - totalActiveChatUsers: { + name: DataTypes.STRING, + is_custom_model: DataTypes.BOOLEAN, + total_engaged_users: DataTypes.INTEGER, + total_code_acceptances: DataTypes.INTEGER, + total_code_suggestions: DataTypes.INTEGER, + total_code_lines_accepted: DataTypes.INTEGER, + total_code_lines_suggested: DataTypes.INTEGER +}, { + sequelize, + timestamps: false +}); +MetricLanguageStats.init({ + id: { type: DataTypes.INTEGER, - allowNull: false, + primaryKey: true, + autoIncrement: true }, + name: DataTypes.STRING, + total_engaged_users: DataTypes.INTEGER, + total_code_acceptances: DataTypes.INTEGER, + total_code_suggestions: DataTypes.INTEGER, + total_code_lines_accepted: DataTypes.INTEGER, + total_code_lines_suggested: DataTypes.INTEGER }, { - tableName: 'metrics', - timestamps: false, + sequelize, + timestamps: false }); -const Breakdown = sequelize.define('Breakdown', { +MetricPrMetrics.init({ id: { type: DataTypes.INTEGER, - autoIncrement: true, primaryKey: true, + autoIncrement: true }, - metricsDay: { - type: DataTypes.DATEONLY, - references: { - model: Metrics, - key: 'day', - }, - }, - language: { - type: DataTypes.STRING, - allowNull: false, - }, - editor: { - type: DataTypes.STRING, - allowNull: false, - }, - suggestionsCount: { - type: DataTypes.INTEGER, - allowNull: false, - }, - acceptancesCount: { + total_engaged_users: DataTypes.INTEGER, + total_pr_summaries_created: DataTypes.INTEGER +}, { + sequelize, + timestamps: false +}); +MetricPrRepository.init({ + id: { type: DataTypes.INTEGER, - allowNull: false, + primaryKey: true, + autoIncrement: true }, - linesSuggested: { + name: DataTypes.STRING, + total_engaged_users: DataTypes.INTEGER, + total_pr_summaries_created: DataTypes.INTEGER +}, { + sequelize, + timestamps: false +}); +MetricPrModelStats.init({ + id: { type: DataTypes.INTEGER, - allowNull: false, + primaryKey: true, + autoIncrement: true }, - linesAccepted: { + name: DataTypes.STRING, + is_custom_model: DataTypes.BOOLEAN, + total_engaged_users: DataTypes.INTEGER, + total_pr_summaries_created: DataTypes.INTEGER +}, { + sequelize, + timestamps: false +}); + +MetricDotcomChatMetrics.init({ + id: { type: DataTypes.INTEGER, - allowNull: false, + primaryKey: true, + autoIncrement: true }, - activeUsers: { + total_engaged_users: DataTypes.INTEGER, + total_chats: DataTypes.INTEGER +}, { + sequelize, + timestamps: false +}); +MetricDotcomChatModelStats.init({ + id: { type: DataTypes.INTEGER, - allowNull: false, + primaryKey: true, + autoIncrement: true }, + name: DataTypes.STRING, + is_custom_model: DataTypes.BOOLEAN, + total_engaged_users: DataTypes.INTEGER, + total_chats: DataTypes.INTEGER }, { - tableName: 'breakdown', - timestamps: false, + sequelize, + timestamps: false +}); + +// Set up associations 🔗 +MetricDaily.hasOne(MetricIdeCompletions, { + as: 'copilot_ide_code_completions', // This matches your response structure + foreignKey: 'daily_metric_id', + sourceKey: 'date' +}); +MetricDaily.hasOne(MetricPrMetrics, { + as: 'copilot_dotcom_pull_requests', + foreignKey: 'daily_metric_id' +}); +MetricDaily.hasOne(MetricDotcomChatMetrics, { + as: 'copilot_dotcom_chat', + foreignKey: 'daily_metric_id' +}); +MetricDaily.hasOne(MetricIdeChatMetrics, { + as: 'copilot_ide_chat', + foreignKey: 'daily_metric_id' +}); + +MetricIdeChatMetrics.belongsTo(MetricDaily, { + foreignKey: 'daily_metric_id' +}); +MetricIdeChatMetrics.hasMany(MetricIdeChatEditor, { + as: 'editors', + foreignKey: 'chat_metrics_id' +}); +MetricIdeChatEditor.belongsTo(MetricIdeChatMetrics, { + foreignKey: 'chat_metrics_id' +}); +MetricIdeChatEditor.hasMany(MetricIdeChatModelStats, { + as: 'models', + foreignKey: 'editor_id' +}); +MetricIdeChatModelStats.belongsTo(MetricIdeChatEditor, { + foreignKey: 'editor_id' +}); + +MetricIdeCompletions.belongsTo(MetricDaily, { + as: 'DailyMetric', + foreignKey: 'daily_metric_id', + targetKey: 'date' +}); +MetricIdeCompletions.hasMany(MetricEditor, { + as: 'editors', // Match the response structure + foreignKey: 'ide_completion_id' +}); +MetricEditor.belongsTo(MetricIdeCompletions, { + as: 'copilot_ide_code_completions', + foreignKey: 'ide_completion_id' +}); +MetricEditor.hasMany(MetricModelStats, { + as: 'models', // Match API response structure + foreignKey: 'editor_id' // Use consistent casing +}); +MetricModelStats.belongsTo(MetricEditor, { + as: 'editor', + foreignKey: 'editor_id' // Match the foreign key name +}); +MetricModelStats.hasMany(MetricLanguageStats, { + as: 'languages', + foreignKey: 'model_stat_id' +}); +MetricLanguageStats.belongsTo(MetricModelStats, { + as: 'model', + foreignKey: 'model_stat_id' +}); + +MetricPrMetrics.belongsTo(MetricDaily, { + foreignKey: 'daily_metric_id', + targetKey: 'date' +}); +MetricPrMetrics.hasMany(MetricPrRepository, { + as: 'repositories', + foreignKey: 'pr_metrics_id' +}); +MetricPrRepository.belongsTo(MetricPrMetrics, { + foreignKey: 'pr_metrics_id' +}); +MetricPrRepository.hasMany(MetricPrModelStats, { + as: 'models', + foreignKey: 'repository_id' +}); +MetricPrModelStats.belongsTo(MetricPrRepository, { + foreignKey: 'repository_id' +}); + +MetricDotcomChatMetrics.belongsTo(MetricDaily, { + foreignKey: 'daily_metric_id', + targetKey: 'date' +}); +MetricDotcomChatMetrics.hasMany(MetricDotcomChatModelStats, { + as: 'models', + foreignKey: 'chat_metrics_id' +}); +MetricDotcomChatModelStats.belongsTo(MetricDotcomChatMetrics, { + foreignKey: 'chat_metrics_id' }); -Metrics.hasMany(Breakdown, { foreignKey: 'metricsDay' }); -Breakdown.belongsTo(Metrics, { foreignKey: 'metricsDay' }); +export async function insertMetrics(data: CopilotMetrics[]) { + for (const day of data) { + const date = new Date(day.date); + let metric: MetricDaily; + try { + metric = await MetricDaily.create({ + date: date, + total_active_users: day.total_active_users, + total_engaged_users: day.total_engaged_users, + }); + } catch { + logger.info(`Metrics for ${date.toLocaleDateString()} already exist. Skipping...`); + continue; + } + + if (day.copilot_ide_chat) { + let chatTotals = { + chats: 0, + copyEvents: 0, + insertionEvents: 0 + }; + + const chatMetrics = await MetricIdeChatMetrics.create({ + daily_metric_id: metric.date, + total_engaged_users: day.copilot_ide_chat.total_engaged_users + }); + + for (const editor of day.copilot_ide_chat.editors) { + let chatTotalsEditor = { + chats: 0, + copyEvents: 0, + insertionEvents: 0 + }; + const editorRecord = await MetricIdeChatEditor.create({ + chat_metrics_id: chatMetrics.id, + name: editor.name, + total_engaged_users: editor.total_engaged_users + }); + + await Promise.all(editor.models.map(model => { + if ('total_chats' in model) { + chatTotals.chats += model.total_chats || 0; + chatTotals.copyEvents += model.total_chat_copy_events || 0; + chatTotals.insertionEvents += model.total_chat_insertion_events || 0; + + return MetricIdeChatModelStats.create({ + editor_id: editorRecord.id, + name: model.name, + is_custom_model: model.is_custom_model, + total_engaged_users: model.total_engaged_users, + total_chats: model.total_chats, + total_chat_copy_events: model.total_chat_copy_events, + total_chat_insertion_events: model.total_chat_insertion_events + }) + } + })); + + await editorRecord.update({ + total_chats: chatTotalsEditor.chats, + total_chat_copy_events: chatTotalsEditor.copyEvents, + total_chat_insertion_events: chatTotalsEditor.insertionEvents + }); + } + + await chatMetrics.update({ + total_chats: chatTotals.chats, + total_chat_copy_events: chatTotals.copyEvents, + total_chat_insertion_events: chatTotals.insertionEvents + }); + } + + if (day.copilot_ide_code_completions) { + // Create IdeCompletions second 🖥️ + const completions = await MetricIdeCompletions.create({ + total_engaged_users: day.copilot_ide_code_completions.total_engaged_users, + daily_metric_id: metric.date, + total_code_acceptances: 0, + total_code_suggestions: 0, + total_code_lines_accepted: 0, + total_code_lines_suggested: 0 + }); + + let dailyTotals = { acceptances: 0, suggestions: 0, linesAccepted: 0, linesSuggested: 0 }; + + // Process editors third 👨‍💻 + for (const editor of day.copilot_ide_code_completions.editors) { + const editorRecord = await MetricEditor.create({ + name: editor.name, + total_engaged_users: editor.total_engaged_users, + ide_completion_id: completions.id, + total_code_acceptances: 0, + total_code_suggestions: 0, + total_code_lines_accepted: 0, + total_code_lines_suggested: 0 + }); + + let editorTotals = { acceptances: 0, suggestions: 0, linesAccepted: 0, linesSuggested: 0 }; + + // Process models fourth 🤖 + for (const model of editor.models) { + const modelRecord = await MetricModelStats.create({ + name: model.name, + is_custom_model: model.is_custom_model, + total_engaged_users: model.total_engaged_users, + editor_id: editorRecord.id, + total_code_acceptances: 0, + total_code_suggestions: 0, + total_code_lines_accepted: 0, + total_code_lines_suggested: 0 + }); + + let modelTotals = { acceptances: 0, suggestions: 0, linesAccepted: 0, linesSuggested: 0 }; + + // Process languages last 🗣️ + if ('languages' in model) { + for (const lang of model.languages) { + await MetricLanguageStats.create({ + name: lang.name, + total_engaged_users: lang.total_engaged_users, + total_code_acceptances: lang.total_code_acceptances, + total_code_suggestions: lang.total_code_suggestions, + total_code_lines_accepted: lang.total_code_lines_accepted, + total_code_lines_suggested: lang.total_code_lines_suggested, + model_stat_id: modelRecord.id + }); + + // Roll up language totals to model 📈 + modelTotals.acceptances += lang.total_code_acceptances || 0; + modelTotals.suggestions += lang.total_code_suggestions || 0; + modelTotals.linesAccepted += lang.total_code_lines_accepted || 0; + modelTotals.linesSuggested += lang.total_code_lines_suggested || 0; + } + } + + // Update model with totals ⬆️ + await modelRecord.update({ + total_code_acceptances: modelTotals.acceptances, + total_code_suggestions: modelTotals.suggestions, + total_code_lines_accepted: modelTotals.linesAccepted, + total_code_lines_suggested: modelTotals.linesSuggested + }); + + // Roll up model totals to editor 📊 + editorTotals.acceptances += modelTotals.acceptances; + editorTotals.suggestions += modelTotals.suggestions; + editorTotals.linesAccepted += modelTotals.linesAccepted; + editorTotals.linesSuggested += modelTotals.linesSuggested; + } + + // Update editor with totals ⬆️ + await editorRecord.update({ + total_code_acceptances: editorTotals.acceptances, + total_code_suggestions: editorTotals.suggestions, + total_code_lines_accepted: editorTotals.linesAccepted, + total_code_lines_suggested: editorTotals.linesSuggested + }); + + // Roll up editor totals to daily 📅 + dailyTotals.acceptances += editorTotals.acceptances; + dailyTotals.suggestions += editorTotals.suggestions; + dailyTotals.linesAccepted += editorTotals.linesAccepted; + dailyTotals.linesSuggested += editorTotals.linesSuggested; + } + + // Update final totals ⬆️ + await completions.update({ + total_code_acceptances: dailyTotals.acceptances, + total_code_suggestions: dailyTotals.suggestions, + total_code_lines_accepted: dailyTotals.linesAccepted, + total_code_lines_suggested: dailyTotals.linesSuggested + }); + } + + if (day.copilot_dotcom_pull_requests) { + let totalPrSummaries = 0; // Initialize counter 🔢 + + const prMetrics = await MetricPrMetrics.create({ + daily_metric_id: metric.date, + total_engaged_users: day.copilot_dotcom_pull_requests.total_engaged_users + }); + + // Create repositories and their models + for (const repo of day.copilot_dotcom_pull_requests.repositories) { + let totalPrSummariesRepo = 0; + const repository = await MetricPrRepository.create({ + pr_metrics_id: prMetrics.id, + name: repo.name, + total_engaged_users: repo.total_engaged_users + }); + + // Create model stats for each repository + await Promise.all(repo.models.map(model => { + totalPrSummaries += model.total_pr_summaries_created || 0; // Add to running total ➕ + totalPrSummariesRepo += model.total_pr_summaries_created || 0; + + MetricPrModelStats.create({ + repository_id: repository.id, + name: model.name, + is_custom_model: model.is_custom_model, + total_engaged_users: model.total_engaged_users, + total_pr_summaries_created: model.total_pr_summaries_created + }) + })); + repository.update({ + total_pr_summaries_created: totalPrSummariesRepo + }); + } + + await prMetrics.update({ + total_pr_summaries_created: totalPrSummaries + }); + } + + if (day.copilot_dotcom_chat) { + let totalChats = 0; // Initialize counter 🔢 + + const chatMetrics = await MetricDotcomChatMetrics.create({ + daily_metric_id: metric.date, + total_engaged_users: day.copilot_dotcom_chat.total_engaged_users + }); + + // Create chat model stats + await Promise.all(day.copilot_dotcom_chat.models.map(model => { + totalChats += model.total_chats || 0; // Add to running total ➕ + MetricDotcomChatModelStats.create({ + chat_metrics_id: chatMetrics.id, + name: model.name, + is_custom_model: model.is_custom_model, + total_engaged_users: model.total_engaged_users, + total_chats: model.total_chats + }) + })); -export { Metrics, Breakdown }; \ No newline at end of file + await chatMetrics.update({ + total_chats: totalChats + }); + } + } +} \ No newline at end of file diff --git a/backend/src/models/settings.model.ts b/backend/src/models/settings.model.ts index ab62558..5bf1244 100644 --- a/backend/src/models/settings.model.ts +++ b/backend/src/models/settings.model.ts @@ -11,7 +11,6 @@ const Settings = sequelize.define('Settings', { allowNull: false, } }, { - tableName: 'settings', timestamps: false, }); diff --git a/backend/src/models/usage.model.ts b/backend/src/models/usage.model.ts new file mode 100644 index 0000000..e0afdd3 --- /dev/null +++ b/backend/src/models/usage.model.ts @@ -0,0 +1,147 @@ +import { DataTypes } from 'sequelize'; +import { sequelize } from '../database'; +import logger from '../services/logger'; + +const Usage = sequelize.define('Usage', { + day: { + type: DataTypes.DATEONLY, + primaryKey: true, + allowNull: false, + }, + totalSuggestionsCount: { + type: DataTypes.INTEGER, + allowNull: false, + }, + totalAcceptancesCount: { + type: DataTypes.INTEGER, + allowNull: false, + }, + totalLinesSuggested: { + type: DataTypes.INTEGER, + allowNull: false, + }, + totalLinesAccepted: { + type: DataTypes.INTEGER, + allowNull: false, + }, + totalActiveUsers: { + type: DataTypes.INTEGER, + allowNull: false, + }, + totalChatAcceptances: { + type: DataTypes.INTEGER, + allowNull: false, + }, + totalChatTurns: { + type: DataTypes.INTEGER, + allowNull: false, + }, + totalActiveChatUsers: { + type: DataTypes.INTEGER, + allowNull: false, + }, +}, { + timestamps: false, +}); + +const UsageBreakdown = sequelize.define('UsageBreakdown', { + id: { + type: DataTypes.INTEGER, + autoIncrement: true, + primaryKey: true, + }, + usage_day: { + type: DataTypes.DATEONLY, + references: { + model: Usage, + key: 'day', + }, + }, + language: { + type: DataTypes.STRING, + allowNull: false, + }, + editor: { + type: DataTypes.STRING, + allowNull: false, + }, + suggestionsCount: { + type: DataTypes.INTEGER, + allowNull: false, + }, + acceptancesCount: { + type: DataTypes.INTEGER, + allowNull: false, + }, + linesSuggested: { + type: DataTypes.INTEGER, + allowNull: false, + }, + linesAccepted: { + type: DataTypes.INTEGER, + allowNull: false, + }, + activeUsers: { + type: DataTypes.INTEGER, + allowNull: false, + }, +}, { + timestamps: false, +}); + +Usage.hasMany(UsageBreakdown, { foreignKey: 'usage_day' }); +UsageBreakdown.belongsTo(Usage, { foreignKey: 'usage_day' }); + +async function insertUsage(data: any[]) { + for (const metrics of data) { + const [createdMetrics, created] = await Usage.findOrCreate({ + where: { day: metrics.day }, + defaults: { + totalSuggestionsCount: metrics.total_suggestions_count, + totalAcceptancesCount: metrics.total_acceptances_count, + totalLinesSuggested: metrics.total_lines_suggested, + totalLinesAccepted: metrics.total_lines_accepted, + totalActiveUsers: metrics.total_active_users, + totalChatAcceptances: metrics.total_chat_acceptances, + totalChatTurns: metrics.total_chat_turns, + totalActiveChatUsers: metrics.total_active_chat_users, + } + }); + + if (!created) { + logger.info(`Usage for ${metrics.day} already exist. Updating... ✏️`); + + await createdMetrics.update({ + totalSuggestionsCount: metrics.total_suggestions_count, + totalAcceptancesCount: metrics.total_acceptances_count, + totalLinesSuggested: metrics.total_lines_suggested, + totalLinesAccepted: metrics.total_lines_accepted, + totalActiveUsers: metrics.total_active_users, + totalChatAcceptances: metrics.total_chat_acceptances, + totalChatTurns: metrics.total_chat_turns, + totalActiveChatUsers: metrics.total_active_chat_users, + }); + + await UsageBreakdown.destroy({ where: { usage_day: metrics.day } }); + } + + if (!metrics.breakdown) { + logger.info(`No breakdown data for ${metrics.day}. Skipping...`); + continue; + } + for (const breakdown of metrics.breakdown) { + await UsageBreakdown.create({ + usage_day: createdMetrics.dataValues.day, + language: breakdown.language, + editor: breakdown.editor, + suggestionsCount: breakdown.suggestions_count, + acceptancesCount: breakdown.acceptances_count, + linesSuggested: breakdown.lines_suggested, + linesAccepted: breakdown.lines_accepted, + activeUsers: breakdown.active_users, + }); + } + } +} + +export { Usage, UsageBreakdown, insertUsage }; \ No newline at end of file diff --git a/backend/src/routes/index.ts b/backend/src/routes/index.ts index 7423002..b9cbb3b 100644 --- a/backend/src/routes/index.ts +++ b/backend/src/routes/index.ts @@ -1,10 +1,10 @@ import { Router, Request, Response } from 'express'; import SurveyController from '../controllers/survey.controller'; -import metricsController from '../controllers/metrics.controller'; +import usageController from '../controllers/usage.controller'; import settingsController from '../controllers/settings.controller'; import setupController from '../controllers/setup.controller'; import SeatsController from '../controllers/seats.controller'; -import metricsControllerNew from '../controllers/metrics.controller.new'; +import metricsController from '../controllers/metrics.controller'; const router = Router(); @@ -18,10 +18,9 @@ router.get('/survey/:id', SurveyController.getSurveyById); router.put('/survey/:id', SurveyController.updateSurvey); router.delete('/survey/:id', SurveyController.deleteSurvey); -router.get('/metrics', metricsController.getAllMetrics); -router.get('/metrics/:day', metricsController.getMetricsByDay); +router.get('/usage', usageController.getUsage); -router.get('/metrics-new', metricsControllerNew.getAllMetrics); +router.get('/metrics', metricsController.getMetrics); router.get('/seats', SeatsController.getAllSeats); router.get('/seats/:login', SeatsController.getSeatByLogin); diff --git a/backend/src/services/metrics.service.ts b/backend/src/services/metrics.service.ts deleted file mode 100644 index 75042d7..0000000 --- a/backend/src/services/metrics.service.ts +++ /dev/null @@ -1,201 +0,0 @@ -import { CronJob, CronTime } from 'cron'; -import { Metrics, Breakdown } from '../models/metrics.model'; -import setup from './setup'; -import logger from "./logger"; -import { Assignee, AssigningTeam, Seat } from '../models/copilot.seats'; -import { writeFileSync } from 'fs'; -import { insertDailyMetrics } from '../models/metrics.model.new'; -import { CopilotMetrics } from '../models/metrics.model.new.interfaces'; - -class MetricsService { - private static instance: MetricsService; - private cronJob: CronJob; - - private constructor(cronExpression: string, timeZone: string) { - this.cronJob = new CronJob('0 0 * * *', this.cronTask, null, true); - this.cronTask(); - } - - private async cronTask() { - // this.queryCopilotUsageMetrics(); - this.queryCopilotUsageMetricsNew(); - // this.queryCopilotSeatAssignments(); - } - - public static createInstance(cronExpression: string, timeZone: string) { - if (!MetricsService.instance) { - MetricsService.instance = new MetricsService(cronExpression, timeZone); - } - } - - public static getInstance(): MetricsService { - return MetricsService.instance; - } - - public async queryCopilotUsageMetricsNew() { - try { - const octokit = await setup.getOctokit(); - const response = await octokit.paginate('GET /orgs/{org}/copilot/metrics', { - org: setup.installation.owner?.login, - headers: { - 'X-GitHub-Api-Version': '2022-11-28' - } - }); - const metricsArray = response; - writeFileSync('../metrics.json', JSON.stringify(metricsArray, null, 2)); - - await insertDailyMetrics(metricsArray); - } catch (error) { - console.log(error); - logger.error('Error querying copilot metrics', error); - } - } - - public async queryCopilotUsageMetrics() { - try { - const octokit = await setup.getOctokit(); - const response = await octokit.rest.copilot.usageMetricsForOrg({ - org: setup.installation.owner?.login - }); - const metricsArray = response.data; - - for (const metrics of metricsArray) { - const [createdMetrics, created] = await Metrics.findOrCreate({ - where: { day: metrics.day }, - defaults: { - totalSuggestionsCount: metrics.total_suggestions_count, - totalAcceptancesCount: metrics.total_acceptances_count, - totalLinesSuggested: metrics.total_lines_suggested, - totalLinesAccepted: metrics.total_lines_accepted, - totalActiveUsers: metrics.total_active_users, - totalChatAcceptances: metrics.total_chat_acceptances, - totalChatTurns: metrics.total_chat_turns, - totalActiveChatUsers: metrics.total_active_chat_users, - } - }); - - if (!created) { - logger.info(`Metrics for ${metrics.day} already exist. Updating... ✏️`); - - await createdMetrics.update({ - totalSuggestionsCount: metrics.total_suggestions_count, - totalAcceptancesCount: metrics.total_acceptances_count, - totalLinesSuggested: metrics.total_lines_suggested, - totalLinesAccepted: metrics.total_lines_accepted, - totalActiveUsers: metrics.total_active_users, - totalChatAcceptances: metrics.total_chat_acceptances, - totalChatTurns: metrics.total_chat_turns, - totalActiveChatUsers: metrics.total_active_chat_users, - }); - - await Breakdown.destroy({ where: { metricsDay: metrics.day } }); - } - - if (!metrics.breakdown) { - logger.info(`No breakdown data for ${metrics.day}. Skipping...`); - continue; - } - for (const breakdown of metrics.breakdown) { - await Breakdown.create({ - metricsDay: createdMetrics.dataValues.day, - language: breakdown.language, - editor: breakdown.editor, - suggestionsCount: breakdown.suggestions_count, - acceptancesCount: breakdown.acceptances_count, - linesSuggested: breakdown.lines_suggested, - linesAccepted: breakdown.lines_accepted, - activeUsers: breakdown.active_users, - }); - } - } - - logger.info("Metrics successfully updated! 📈"); - } catch (error) { - logger.error('Error querying copilot metrics', error); - } - } - - public async queryCopilotSeatAssignments() { - try { - const octokit = await setup.getOctokit(); - const _seatAssignments = await octokit.paginate(octokit.rest.copilot.listCopilotSeats, { - org: setup.installation.owner?.login - }) as { total_seats: number, seats: object[] }[]; - const seatAssignments = { - total_seats: _seatAssignments[0]?.total_seats || 0, - // octokit paginate returns an array of objects (bug) - // eslint-disable-next-line @typescript-eslint/no-explicit-any - seats: (_seatAssignments).reduce((acc, rsp) => acc.concat(rsp.seats), [] as any[]) - }; - - if (!seatAssignments.seats) { - logger.info(`No seat assignment data found. Skipping...`); - return; - } - - for (const seat of seatAssignments.seats) { - const assignee = await Assignee.findOrCreate({ - where: { id: seat.assignee.id }, - defaults: { - login: seat.assignee.login, - node_id: seat.assignee.node_id, - avatar_url: seat.assignee.avatar_url, - gravatar_id: seat.assignee.gravatar_id, - url: seat.assignee.url, - html_url: seat.assignee.html_url, - followers_url: seat.assignee.followers_url, - following_url: seat.assignee.following_url, - gists_url: seat.assignee.gists_url, - starred_url: seat.assignee.starred_url, - subscriptions_url: seat.assignee.subscriptions_url, - organizations_url: seat.assignee.organizations_url, - repos_url: seat.assignee.repos_url, - events_url: seat.assignee.events_url, - received_events_url: seat.assignee.received_events_url, - type: seat.assignee.type, - site_admin: seat.assignee.site_admin, - } - }); - - const assigningTeam = seat.assigning_team ? await AssigningTeam.findOrCreate({ - where: { id: seat.assigning_team.id }, - defaults: { - node_id: seat.assigning_team.node_id, - url: seat.assigning_team.url, - html_url: seat.assigning_team.html_url, - name: seat.assigning_team.name, - slug: seat.assigning_team.slug, - description: seat.assigning_team.description, - privacy: seat.assigning_team.privacy, - notification_setting: seat.assigning_team.notification_setting, - permission: seat.assigning_team.permission, - members_url: seat.assigning_team.members_url, - repositories_url: seat.assigning_team.repositories_url, - parent: seat.assigning_team.parent, - } - }) : null; - - await Seat.create({ - created_at: seat.created_at, - updated_at: seat.updated_at, - pending_cancellation_date: seat.pending_cancellation_date, - last_activity_at: seat.last_activity_at, - last_activity_editor: seat.last_activity_editor, - plan_type: (seat as any).plan_type, - assigneeId: seat.assignee.id, - assigningTeamId: assigningTeam ? seat.assigning_team?.id : null, - }); - } - - logger.info("Seat assignments successfully updated! ✅"); - } catch (error) { - logger.error('Error querying copilot seat assignments', error); - } - } - - public updateCronJob(cronExpression: string) { - this.cronJob.setTime(new CronTime(cronExpression)); - } -} - -export default MetricsService \ No newline at end of file diff --git a/backend/src/services/query.service.ts b/backend/src/services/query.service.ts new file mode 100644 index 0000000..80fad44 --- /dev/null +++ b/backend/src/services/query.service.ts @@ -0,0 +1,114 @@ +import { CronJob, CronTime } from 'cron'; +import logger from './logger'; +import setup from './setup'; +import { insertUsage } from '../models/usage.model'; +import { insertSeats } from '../models/copilot.seats'; +import { insertMetrics } from '../models/metrics.model'; +import { CopilotMetrics } from '../models/metrics.model.interfaces'; + +class QueryService { + private static instance: QueryService; + private cronJob: CronJob; + + private constructor(cronExpression: string, timeZone: string) { + this.cronJob = new CronJob('0 0 * * *', this.cronTask, null, true); + this.cronTask(); + } + + private async cronTask() { + this.queryCopilotUsageMetrics(); + this.queryCopilotUsageMetricsNew(); + this.queryCopilotSeatAssignments(); + this.queryTeams(); + } + + public static createInstance(cronExpression: string, timeZone: string) { + if (!QueryService.instance) { + QueryService.instance = new QueryService(cronExpression, timeZone); + } + } + + public static getInstance(): QueryService { + return QueryService.instance; + } + + public async queryCopilotUsageMetricsNew() { + try { + const octokit = await setup.getOctokit(); + const response = await octokit.paginate('GET /orgs/{org}/copilot/metrics', { + org: setup.installation.owner?.login + }); + const metricsArray = response; + + await insertMetrics(metricsArray); + + logger.info("Metrics successfully updated! 📈"); + } catch (error) { + console.log(error); + logger.error('Error querying copilot metrics', error); + } + } + + public async queryCopilotUsageMetrics() { + try { + const octokit = await setup.getOctokit(); + const response = await octokit.rest.copilot.usageMetricsForOrg({ + org: setup.installation.owner?.login + }); + + insertUsage(response.data); + + logger.info("Usage successfully updated! 👤"); + } catch (error) { + logger.error('Error querying copilot metrics', error); + } + } + + public async queryCopilotSeatAssignments() { + try { + const octokit = await setup.getOctokit(); + const _seatAssignments = await octokit.paginate(octokit.rest.copilot.listCopilotSeats, { + org: setup.installation.owner?.login + }) as { total_seats: number, seats: object[] }[]; + const seatAssignments = { + total_seats: _seatAssignments[0]?.total_seats || 0, + // octokit paginate returns an array of objects (bug) + // eslint-disable-next-line @typescript-eslint/no-explicit-any + seats: (_seatAssignments).reduce((acc, rsp) => acc.concat(rsp.seats), [] as any[]) + }; + + if (!seatAssignments.seats) { + logger.info(`No seat assignment data found. Skipping...`); + return; + } + + insertSeats(seatAssignments.seats); + + logger.info("Seat assignments successfully updated! 🪑"); + } catch (error) { + logger.error('Error querying copilot seat assignments', error); + } + } + + public async queryTeams() { + try { + const octokit = await setup.getOctokit(); + const response = await octokit.rest.teams.list({ + org: setup.installation.owner?.login + }); + + // TODO process the teams + console.log(response.data); + + logger.info("Teams successfully updated! 🧑‍🤝‍🧑"); + } catch (error) { + logger.error('Error querying teams', error); + } + } + + public updateCronJob(cronExpression: string) { + this.cronJob.setTime(new CronTime(cronExpression)); + } +} + +export default QueryService \ No newline at end of file diff --git a/backend/src/services/settings.service.ts b/backend/src/services/settings.service.ts index 141dd60..59f9fb2 100644 --- a/backend/src/services/settings.service.ts +++ b/backend/src/services/settings.service.ts @@ -1,5 +1,5 @@ import { Settings } from '../models/settings.model'; -import MetricsService from './metrics.service'; +import QueryService from './query.service'; import setup from './setup'; class SettingsService { @@ -31,7 +31,7 @@ class SettingsService { async updateSetting(name: string, value: string) { if (name === 'webhookProxyUrl') setup.addToEnv({ WEBHOOK_PROXY_URL: value }); if (name === 'webhookSecret') setup.addToEnv({ GITHUB_WEBHOOK_SECRET: value }); - if (name === 'metricsCronExpression') MetricsService.getInstance().updateCronJob(value); + if (name === 'metricsCronExpression') QueryService.getInstance().updateCronJob(value); try { await Settings.upsert({ name, value }); return await Settings.findOne({ where: { name } }); diff --git a/backend/src/services/setup.ts b/backend/src/services/setup.ts index d4c24d4..351d746 100644 --- a/backend/src/services/setup.ts +++ b/backend/src/services/setup.ts @@ -3,7 +3,7 @@ import { appendFileSync, readFileSync } from "fs"; import { App, createNodeMiddleware, Octokit } from "octokit"; import { setupWebhookListeners } from '../controllers/webhook.controller'; import { app as expressApp } from '../app'; -import metricsService from "./metrics.service"; +import metricsService from "./query.service"; import SmeeService from './smee'; import logger from "./logger"; import updateDotenv from 'update-dotenv'; diff --git a/frontend/src/app/main/main.component.ts b/frontend/src/app/main/main.component.ts index 4614e0a..f74a70a 100644 --- a/frontend/src/app/main/main.component.ts +++ b/frontend/src/app/main/main.component.ts @@ -9,6 +9,7 @@ import { MatIconModule } from '@angular/material/icon'; import { Observable } from 'rxjs'; import { map, shareReplay } from 'rxjs/operators'; import { AppModule } from '../app.module'; +import { MetricsService } from '../services/metrics.service'; @Component({ selector: 'app-main', @@ -29,8 +30,13 @@ export class MainComponent { private breakpointObserver = inject(BreakpointObserver); hideNavText = false; - constructor() { + constructor( + private metricsService: MetricsService + ) { this.hideNavText = localStorage.getItem('hideNavText') === 'true'; + this.metricsService.getMetrics().subscribe(data => { + console.log(data); + }); } isHandset$: Observable = this.breakpointObserver.observe(Breakpoints.Handset) diff --git a/frontend/src/app/services/metrics.service.interfaces.ts b/frontend/src/app/services/metrics.service.interfaces.ts new file mode 100644 index 0000000..676e865 --- /dev/null +++ b/frontend/src/app/services/metrics.service.interfaces.ts @@ -0,0 +1,86 @@ +// Core metrics interfaces 📊 +interface LanguageMetrics { + name: string; + total_engaged_users: number; + total_code_suggestions?: number; + total_code_acceptances?: number; + total_code_lines_suggested?: number; + total_code_lines_accepted?: number; +} + +interface ModelBase { + name: string; + is_custom_model: boolean; + custom_model_training_date: string | null; + total_engaged_users: number; +} + +interface CodeModel extends ModelBase { + languages: LanguageMetrics[]; +} + +interface ChatModel extends ModelBase { + total_chats: number; + total_chat_insertion_events?: number; + total_chat_copy_events?: number; +} + +interface DotComChatModel extends ModelBase { + total_chats: number; +} + +interface PullRequestModel extends ModelBase { + total_pr_summaries_created: number; +} + +// Editor and repository interfaces 🖥️ +interface Editor { + name: string; + total_engaged_users: number; + models: (CodeModel | ChatModel)[]; +} + +interface Repository { + name: string; + total_engaged_users: number; + models: PullRequestModel[]; +} + +// Feature-specific interfaces 🚀 +interface IdeCodeCompletions { + total_engaged_users: number; + languages: LanguageMetrics[]; + editors: Editor[]; +} + +interface IdeChat { + total_engaged_users: number; + editors: Editor[]; +} + +interface DotComChat { + total_engaged_users: number; + models: DotComChatModel[]; +} + +interface DotComPullRequests { + total_engaged_users: number; + repositories: Repository[]; +} + +// Main metrics interface 📈 +interface CopilotMetrics { + date: string; + total_active_users: number; + total_engaged_users: number; + copilot_ide_code_completions: IdeCodeCompletions | null; + copilot_ide_chat: IdeChat | null; + copilot_dotcom_chat: DotComChat | null; + copilot_dotcom_pull_requests: DotComPullRequests | null; +} + +type CopilotMetricsArray = CopilotMetrics[]; + +export { + type CopilotMetrics +} \ No newline at end of file diff --git a/frontend/src/app/services/metrics.service.spec.ts b/frontend/src/app/services/metrics.service.spec.ts new file mode 100644 index 0000000..b9ff4ee --- /dev/null +++ b/frontend/src/app/services/metrics.service.spec.ts @@ -0,0 +1,16 @@ +import { TestBed } from '@angular/core/testing'; + +import { MetricsService } from './metrics.service'; + +describe('MetricsService', () => { + let service: MetricsService; + + beforeEach(() => { + TestBed.configureTestingModule({}); + service = TestBed.inject(MetricsService); + }); + + it('should be created', () => { + expect(service).toBeTruthy(); + }); +}); diff --git a/frontend/src/app/services/metrics.service.ts b/frontend/src/app/services/metrics.service.ts new file mode 100644 index 0000000..b55d524 --- /dev/null +++ b/frontend/src/app/services/metrics.service.ts @@ -0,0 +1,27 @@ +import { HttpClient } from '@angular/common/http'; +import { Injectable } from '@angular/core'; +import { Observable } from 'rxjs'; +import { serverUrl } from './server.service'; +import { CopilotMetrics } from './metrics.service.interfaces'; + +@Injectable({ + providedIn: 'root' +}) +export class MetricsService { + private apiUrl = `${serverUrl}/api/metrics`; + + constructor(private http: HttpClient) { } + + getMetrics(queryParams: { + type?: 'copilot_ide_code_completions' | 'copilot_ide_chat' | 'copilot_dotcom_chat' | 'copilot_dotcom_pull_requests'; + since?: string; + until?: string; + editor?: 'vscode' | 'JetBrains' | 'Xcode' | 'Neovim' | string; + language?: string; + model?: 'default' | string; + } = {}) { + return this.http.get(this.apiUrl, { + params: queryParams + }); + } +} diff --git a/metrics.json b/metrics.json deleted file mode 100644 index 431a313..0000000 --- a/metrics.json +++ /dev/null @@ -1,6743 +0,0 @@ -[ - { - "date": "2024-10-25", - "copilot_ide_chat": { - "editors": [ - { - "name": "vscode", - "models": [ - { - "name": "default", - "total_chats": 2656, - "is_custom_model": false, - "total_engaged_users": 100, - "total_chat_copy_events": 163, - "total_chat_insertion_events": 152 - } - ], - "total_engaged_users": 100 - }, - { - "name": "JetBrains", - "models": [ - { - "name": "default", - "total_chats": 12, - "is_custom_model": false, - "total_engaged_users": 1, - "total_chat_copy_events": 2, - "total_chat_insertion_events": 3 - } - ], - "total_engaged_users": 1 - } - ], - "total_engaged_users": 100 - }, - "total_active_users": 150, - "copilot_dotcom_chat": { - "models": [ - { - "name": "default", - "total_chats": 151, - "is_custom_model": false, - "total_engaged_users": 33 - } - ], - "total_engaged_users": 33 - }, - "total_engaged_users": 150, - "copilot_dotcom_pull_requests": { - "repositories": [ - { - "name": "beat-bot", - "models": [ - { - "name": "default", - "is_custom_model": false, - "total_engaged_users": 1, - "total_pr_summaries_created": 1 - } - ], - "total_engaged_users": 1 - }, - { - "name": "monorepo-code-scanning-action", - "models": [ - { - "name": "default", - "is_custom_model": false, - "total_engaged_users": 1, - "total_pr_summaries_created": 1 - } - ], - "total_engaged_users": 1 - }, - { - "name": "Travel", - "models": [ - { - "name": "default", - "is_custom_model": false, - "total_engaged_users": 1, - "total_pr_summaries_created": 1 - } - ], - "total_engaged_users": 1 - }, - { - "name": "customer-feedback", - "models": [ - { - "name": "default", - "is_custom_model": false, - "total_engaged_users": 1, - "total_pr_summaries_created": 1 - } - ], - "total_engaged_users": 1 - }, - { - "name": "releases", - "models": [ - { - "name": "default", - "is_custom_model": false, - "total_engaged_users": 1, - "total_pr_summaries_created": 4 - } - ], - "total_engaged_users": 1 - }, - { - "name": "Copilot-Sandbox", - "models": [ - { - "name": "default", - "is_custom_model": false, - "total_engaged_users": 1, - "total_pr_summaries_created": 1 - } - ], - "total_engaged_users": 1 - }, - { - "name": "OctoFitApp-Universe2024", - "models": [ - { - "name": "default", - "is_custom_model": false, - "total_engaged_users": 2, - "total_pr_summaries_created": 5 - } - ], - "total_engaged_users": 2 - }, - { - "name": "constellation-india2024-site", - "models": [ - { - "name": "default", - "is_custom_model": false, - "total_engaged_users": 1, - "total_pr_summaries_created": 1 - } - ], - "total_engaged_users": 1 - }, - { - "name": "mish-friendly-food", - "models": [ - { - "name": "default", - "is_custom_model": false, - "total_engaged_users": 1, - "total_pr_summaries_created": 1 - } - ], - "total_engaged_users": 1 - }, - { - "name": "windr-core", - "models": [ - { - "name": "default", - "is_custom_model": false, - "total_engaged_users": 1, - "total_pr_summaries_created": 3 - } - ], - "total_engaged_users": 1 - }, - { - "name": "solutions-engineering", - "models": [ - { - "name": "default", - "is_custom_model": false, - "total_engaged_users": 1, - "total_pr_summaries_created": 1 - } - ], - "total_engaged_users": 1 - }, - { - "name": "", - "models": [ - { - "name": "default", - "is_custom_model": false, - "total_engaged_users": 1, - "total_pr_summaries_created": 1 - } - ], - "total_engaged_users": 1 - }, - { - "name": "westpac-bank", - "models": [ - { - "name": "default", - "is_custom_model": false, - "total_engaged_users": 1, - "total_pr_summaries_created": 3 - } - ], - "total_engaged_users": 1 - }, - { - "name": "services", - "models": [ - { - "name": "default", - "is_custom_model": false, - "total_engaged_users": 1, - "total_pr_summaries_created": 1 - } - ], - "total_engaged_users": 1 - }, - { - "name": "cs-js-demo01", - "models": [ - { - "name": "default", - "is_custom_model": false, - "total_engaged_users": 1, - "total_pr_summaries_created": 1 - } - ], - "total_engaged_users": 1 - }, - { - "name": "galaxy-india-app", - "models": [ - { - "name": "default", - "is_custom_model": false, - "total_engaged_users": 1, - "total_pr_summaries_created": 2 - } - ], - "total_engaged_users": 1 - } - ], - "total_engaged_users": 14 - }, - "copilot_ide_code_completions": { - "editors": [ - { - "name": "VisualStudio", - "models": [ - { - "name": "default", - "languages": [ - { - "name": "fsharp", - "total_engaged_users": 2, - "total_code_acceptances": 13, - "total_code_suggestions": 44, - "total_code_lines_accepted": 13, - "total_code_lines_suggested": 44 - }, - { - "name": "cpp", - "total_engaged_users": 2, - "total_code_acceptances": 5, - "total_code_suggestions": 19, - "total_code_lines_accepted": 5, - "total_code_lines_suggested": 27 - }, - { - "name": "csharp", - "total_engaged_users": 1, - "total_code_acceptances": 0, - "total_code_suggestions": 2, - "total_code_lines_accepted": 0, - "total_code_lines_suggested": 9 - } - ], - "is_custom_model": false, - "total_engaged_users": 3 - } - ], - "total_engaged_users": 3 - }, - { - "name": "vscode", - "models": [ - { - "name": "default", - "languages": [ - { - "name": "typescript", - "total_engaged_users": 11, - "total_code_acceptances": 440, - "total_code_suggestions": 1077, - "total_code_lines_accepted": 402, - "total_code_lines_suggested": 1513 - }, - { - "name": "dotenv", - "total_engaged_users": 3, - "total_code_acceptances": 7, - "total_code_suggestions": 31, - "total_code_lines_accepted": 7, - "total_code_lines_suggested": 35 - }, - { - "name": "python", - "total_engaged_users": 12, - "total_code_acceptances": 320, - "total_code_suggestions": 705, - "total_code_lines_accepted": 484, - "total_code_lines_suggested": 1133 - }, - { - "name": "sql", - "total_engaged_users": 5, - "total_code_acceptances": 12, - "total_code_suggestions": 28, - "total_code_lines_accepted": 25, - "total_code_lines_suggested": 67 - }, - { - "name": "typescriptreact", - "total_engaged_users": 13, - "total_code_acceptances": 221, - "total_code_suggestions": 604, - "total_code_lines_accepted": 201, - "total_code_lines_suggested": 984 - }, - { - "name": "terraform", - "total_engaged_users": 2, - "total_code_acceptances": 7, - "total_code_suggestions": 10, - "total_code_lines_accepted": 5, - "total_code_lines_suggested": 14 - }, - { - "name": "ruby", - "total_engaged_users": 16, - "total_code_acceptances": 342, - "total_code_suggestions": 1074, - "total_code_lines_accepted": 266, - "total_code_lines_suggested": 1428 - }, - { - "name": "yaml", - "total_engaged_users": 14, - "total_code_acceptances": 75, - "total_code_suggestions": 290, - "total_code_lines_accepted": 121, - "total_code_lines_suggested": 525 - }, - { - "name": "csharp", - "total_engaged_users": 3, - "total_code_acceptances": 57, - "total_code_suggestions": 140, - "total_code_lines_accepted": 45, - "total_code_lines_suggested": 373 - }, - { - "name": "markdown", - "total_engaged_users": 18, - "total_code_acceptances": 297, - "total_code_suggestions": 1642, - "total_code_lines_accepted": 353, - "total_code_lines_suggested": 2281 - }, - { - "name": "css", - "total_engaged_users": 2, - "total_code_acceptances": 1, - "total_code_suggestions": 3, - "total_code_lines_accepted": 1, - "total_code_lines_suggested": 5 - }, - { - "name": "javascript", - "total_engaged_users": 17, - "total_code_acceptances": 293, - "total_code_suggestions": 968, - "total_code_lines_accepted": 397, - "total_code_lines_suggested": 2106 - }, - { - "name": "jsonc", - "total_engaged_users": 2, - "total_code_acceptances": 1, - "total_code_suggestions": 22, - "total_code_lines_accepted": 1, - "total_code_lines_suggested": 62 - }, - { - "name": "unknown", - "total_engaged_users": 9, - "total_code_acceptances": 53, - "total_code_suggestions": 219, - "total_code_lines_accepted": 86, - "total_code_lines_suggested": 470 - }, - { - "name": "html", - "total_engaged_users": 6, - "total_code_acceptances": 33, - "total_code_suggestions": 95, - "total_code_lines_accepted": 31, - "total_code_lines_suggested": 307 - }, - { - "name": "dockerfile", - "total_engaged_users": 4, - "total_code_acceptances": 22, - "total_code_suggestions": 36, - "total_code_lines_accepted": 19, - "total_code_lines_suggested": 42 - }, - { - "name": "ini", - "total_engaged_users": 2, - "total_code_acceptances": 2, - "total_code_suggestions": 18, - "total_code_lines_accepted": 1, - "total_code_lines_suggested": 20 - }, - { - "name": "scss", - "total_engaged_users": 3, - "total_code_acceptances": 47, - "total_code_suggestions": 202, - "total_code_lines_accepted": 92, - "total_code_lines_suggested": 572 - }, - { - "name": "shellscript", - "total_engaged_users": 3, - "total_code_acceptances": 7, - "total_code_suggestions": 29, - "total_code_lines_accepted": 14, - "total_code_lines_suggested": 45 - }, - { - "name": "java", - "total_engaged_users": 4, - "total_code_acceptances": 17, - "total_code_suggestions": 44, - "total_code_lines_accepted": 37, - "total_code_lines_suggested": 104 - }, - { - "name": "plaintext", - "total_engaged_users": 1, - "total_code_acceptances": 0, - "total_code_suggestions": 5, - "total_code_lines_accepted": 0, - "total_code_lines_suggested": 7 - }, - { - "name": "dart", - "total_engaged_users": 2, - "total_code_acceptances": 34, - "total_code_suggestions": 142, - "total_code_lines_accepted": 35, - "total_code_lines_suggested": 391 - }, - { - "name": "ql", - "total_engaged_users": 3, - "total_code_acceptances": 33, - "total_code_suggestions": 120, - "total_code_lines_accepted": 34, - "total_code_lines_suggested": 250 - }, - { - "name": "razor", - "total_engaged_users": 2, - "total_code_acceptances": 8, - "total_code_suggestions": 25, - "total_code_lines_accepted": 18, - "total_code_lines_suggested": 80 - }, - { - "name": "github-actions-workflow", - "total_engaged_users": 2, - "total_code_acceptances": 4, - "total_code_suggestions": 13, - "total_code_lines_accepted": 8, - "total_code_lines_suggested": 19 - }, - { - "name": "json", - "total_engaged_users": 1, - "total_code_acceptances": 0, - "total_code_suggestions": 3, - "total_code_lines_accepted": 0, - "total_code_lines_suggested": 3 - }, - { - "name": "powershell", - "total_engaged_users": 2, - "total_code_acceptances": 2, - "total_code_suggestions": 4, - "total_code_lines_accepted": 1, - "total_code_lines_suggested": 5 - }, - { - "name": "go", - "total_engaged_users": 4, - "total_code_acceptances": 65, - "total_code_suggestions": 224, - "total_code_lines_accepted": 56, - "total_code_lines_suggested": 315 - }, - { - "name": "cpp", - "total_engaged_users": 1, - "total_code_acceptances": 0, - "total_code_suggestions": 3, - "total_code_lines_accepted": 0, - "total_code_lines_suggested": 12 - }, - { - "name": "elixir", - "total_engaged_users": 1, - "total_code_acceptances": 0, - "total_code_suggestions": 5, - "total_code_lines_accepted": 0, - "total_code_lines_suggested": 5 - }, - { - "name": "postgres", - "total_engaged_users": 2, - "total_code_acceptances": 5, - "total_code_suggestions": 30, - "total_code_lines_accepted": 11, - "total_code_lines_suggested": 41 - }, - { - "name": "graphql", - "total_engaged_users": 1, - "total_code_acceptances": 0, - "total_code_suggestions": 2, - "total_code_lines_accepted": 0, - "total_code_lines_suggested": 2 - } - ], - "is_custom_model": false, - "total_engaged_users": 87 - } - ], - "total_engaged_users": 87 - }, - { - "name": "JetBrains", - "models": [ - { - "name": "default", - "languages": [ - { - "name": "java", - "total_engaged_users": 2, - "total_code_acceptances": 146, - "total_code_suggestions": 270, - "total_code_lines_accepted": 252, - "total_code_lines_suggested": 736 - }, - { - "name": "sql", - "total_engaged_users": 2, - "total_code_acceptances": 3, - "total_code_suggestions": 9, - "total_code_lines_accepted": 3, - "total_code_lines_suggested": 32 - }, - { - "name": "typescriptreact", - "total_engaged_users": 2, - "total_code_acceptances": 4, - "total_code_suggestions": 30, - "total_code_lines_accepted": 4, - "total_code_lines_suggested": 47 - }, - { - "name": "csharp", - "total_engaged_users": 2, - "total_code_acceptances": 2, - "total_code_suggestions": 6, - "total_code_lines_accepted": 2, - "total_code_lines_suggested": 10 - }, - { - "name": "typescript", - "total_engaged_users": 1, - "total_code_acceptances": 0, - "total_code_suggestions": 6, - "total_code_lines_accepted": 0, - "total_code_lines_suggested": 6 - } - ], - "is_custom_model": false, - "total_engaged_users": 3 - } - ], - "total_engaged_users": 3 - }, - { - "name": "Xcode", - "models": [ - { - "name": "default", - "languages": [ - { - "name": "swift", - "total_engaged_users": 2, - "total_code_acceptances": 5, - "total_code_suggestions": 5, - "total_code_lines_accepted": 5, - "total_code_lines_suggested": 5 - } - ], - "is_custom_model": false, - "total_engaged_users": 2 - } - ], - "total_engaged_users": 2 - }, - { - "name": "Neovim", - "models": [ - { - "name": "default", - "languages": [ - { - "name": "sql", - "total_engaged_users": 1, - "total_code_acceptances": 0, - "total_code_suggestions": 2, - "total_code_lines_accepted": 0, - "total_code_lines_suggested": 8 - }, - { - "name": "ruby", - "total_engaged_users": 2, - "total_code_acceptances": 16, - "total_code_suggestions": 35, - "total_code_lines_accepted": 16, - "total_code_lines_suggested": 59 - }, - { - "name": "typescriptreact", - "total_engaged_users": 1, - "total_code_acceptances": 0, - "total_code_suggestions": 2, - "total_code_lines_accepted": 0, - "total_code_lines_suggested": 2 - } - ], - "is_custom_model": false, - "total_engaged_users": 2 - } - ], - "total_engaged_users": 2 - } - ], - "total_engaged_users": 92 - } - }, - { - "date": "2024-10-26", - "copilot_ide_chat": { - "editors": [ - { - "name": "JetBrains", - "models": [ - { - "name": "default", - "total_chats": 2, - "is_custom_model": false, - "total_engaged_users": 1, - "total_chat_copy_events": 1, - "total_chat_insertion_events": 1 - } - ], - "total_engaged_users": 1 - }, - { - "name": "vscode", - "models": [ - { - "name": "default", - "total_chats": 1044, - "is_custom_model": false, - "total_engaged_users": 26, - "total_chat_copy_events": 73, - "total_chat_insertion_events": 29 - } - ], - "total_engaged_users": 26 - } - ], - "total_engaged_users": 26 - }, - "total_active_users": 40, - "copilot_dotcom_chat": { - "models": [ - { - "name": "default", - "total_chats": 28, - "is_custom_model": false, - "total_engaged_users": 5 - } - ], - "total_engaged_users": 5 - }, - "total_engaged_users": 40, - "copilot_dotcom_pull_requests": { - "repositories": [ - { - "name": "noseknows-universe", - "models": [ - { - "name": "default", - "is_custom_model": false, - "total_engaged_users": 1, - "total_pr_summaries_created": 1 - } - ], - "total_engaged_users": 1 - }, - { - "name": "aitour-advanced-coding-visual-studio-code-and-github-copilot", - "models": [ - { - "name": "default", - "is_custom_model": false, - "total_engaged_users": 1, - "total_pr_summaries_created": 2 - } - ], - "total_engaged_users": 1 - }, - { - "name": "aitour-advanced-coding-visual-studio-and-github-copilot", - "models": [ - { - "name": "default", - "is_custom_model": false, - "total_engaged_users": 1, - "total_pr_summaries_created": 1 - } - ], - "total_engaged_users": 1 - } - ], - "total_engaged_users": 2 - }, - "copilot_ide_code_completions": { - "editors": [ - { - "name": "vscode", - "models": [ - { - "name": "default", - "languages": [ - { - "name": "markdown", - "total_engaged_users": 4, - "total_code_acceptances": 7, - "total_code_suggestions": 21, - "total_code_lines_accepted": 7, - "total_code_lines_suggested": 25 - }, - { - "name": "ruby", - "total_engaged_users": 4, - "total_code_acceptances": 94, - "total_code_suggestions": 227, - "total_code_lines_accepted": 80, - "total_code_lines_suggested": 335 - }, - { - "name": "scss", - "total_engaged_users": 5, - "total_code_acceptances": 14, - "total_code_suggestions": 67, - "total_code_lines_accepted": 32, - "total_code_lines_suggested": 115 - }, - { - "name": "typescriptreact", - "total_engaged_users": 5, - "total_code_acceptances": 104, - "total_code_suggestions": 276, - "total_code_lines_accepted": 106, - "total_code_lines_suggested": 519 - }, - { - "name": "powershell", - "total_engaged_users": 2, - "total_code_acceptances": 12, - "total_code_suggestions": 13, - "total_code_lines_accepted": 12, - "total_code_lines_suggested": 13 - }, - { - "name": "terraform", - "total_engaged_users": 2, - "total_code_acceptances": 7, - "total_code_suggestions": 9, - "total_code_lines_accepted": 20, - "total_code_lines_suggested": 25 - }, - { - "name": "typescript", - "total_engaged_users": 4, - "total_code_acceptances": 384, - "total_code_suggestions": 818, - "total_code_lines_accepted": 381, - "total_code_lines_suggested": 1325 - }, - { - "name": "dotenv", - "total_engaged_users": 2, - "total_code_acceptances": 3, - "total_code_suggestions": 11, - "total_code_lines_accepted": 3, - "total_code_lines_suggested": 12 - }, - { - "name": "yaml", - "total_engaged_users": 2, - "total_code_acceptances": 4, - "total_code_suggestions": 18, - "total_code_lines_accepted": 6, - "total_code_lines_suggested": 25 - }, - { - "name": "lua", - "total_engaged_users": 1, - "total_code_acceptances": 0, - "total_code_suggestions": 5, - "total_code_lines_accepted": 0, - "total_code_lines_suggested": 5 - }, - { - "name": "python", - "total_engaged_users": 6, - "total_code_acceptances": 112, - "total_code_suggestions": 339, - "total_code_lines_accepted": 106, - "total_code_lines_suggested": 462 - }, - { - "name": "unknown", - "total_engaged_users": 6, - "total_code_acceptances": 29, - "total_code_suggestions": 112, - "total_code_lines_accepted": 37, - "total_code_lines_suggested": 142 - }, - { - "name": "html", - "total_engaged_users": 3, - "total_code_acceptances": 32, - "total_code_suggestions": 71, - "total_code_lines_accepted": 48, - "total_code_lines_suggested": 140 - }, - { - "name": "csharp", - "total_engaged_users": 3, - "total_code_acceptances": 10, - "total_code_suggestions": 29, - "total_code_lines_accepted": 4, - "total_code_lines_suggested": 62 - }, - { - "name": "javascript", - "total_engaged_users": 5, - "total_code_acceptances": 16, - "total_code_suggestions": 39, - "total_code_lines_accepted": 9, - "total_code_lines_suggested": 55 - }, - { - "name": "json", - "total_engaged_users": 4, - "total_code_acceptances": 3, - "total_code_suggestions": 20, - "total_code_lines_accepted": 5, - "total_code_lines_suggested": 29 - }, - { - "name": "go", - "total_engaged_users": 2, - "total_code_acceptances": 25, - "total_code_suggestions": 66, - "total_code_lines_accepted": 25, - "total_code_lines_suggested": 81 - }, - { - "name": "shellscript", - "total_engaged_users": 2, - "total_code_acceptances": 59, - "total_code_suggestions": 112, - "total_code_lines_accepted": 59, - "total_code_lines_suggested": 122 - }, - { - "name": "jsonc", - "total_engaged_users": 1, - "total_code_acceptances": 0, - "total_code_suggestions": 21, - "total_code_lines_accepted": 0, - "total_code_lines_suggested": 23 - }, - { - "name": "css", - "total_engaged_users": 3, - "total_code_acceptances": 2, - "total_code_suggestions": 14, - "total_code_lines_accepted": 1, - "total_code_lines_suggested": 35 - }, - { - "name": "dockerfile", - "total_engaged_users": 2, - "total_code_acceptances": 2, - "total_code_suggestions": 5, - "total_code_lines_accepted": 1, - "total_code_lines_suggested": 7 - }, - { - "name": "svelte", - "total_engaged_users": 2, - "total_code_acceptances": 15, - "total_code_suggestions": 29, - "total_code_lines_accepted": 9, - "total_code_lines_suggested": 36 - }, - { - "name": "ini", - "total_engaged_users": 2, - "total_code_acceptances": 12, - "total_code_suggestions": 37, - "total_code_lines_accepted": 12, - "total_code_lines_suggested": 50 - }, - { - "name": "plaintext", - "total_engaged_users": 1, - "total_code_acceptances": 0, - "total_code_suggestions": 5, - "total_code_lines_accepted": 0, - "total_code_lines_suggested": 6 - } - ], - "is_custom_model": false, - "total_engaged_users": 29 - } - ], - "total_engaged_users": 29 - }, - { - "name": "JetBrains", - "models": [ - { - "name": "default", - "languages": [ - { - "name": "java", - "total_engaged_users": 2, - "total_code_acceptances": 4, - "total_code_suggestions": 17, - "total_code_lines_accepted": 4, - "total_code_lines_suggested": 29 - }, - { - "name": "ini", - "total_engaged_users": 1, - "total_code_acceptances": 0, - "total_code_suggestions": 3, - "total_code_lines_accepted": 0, - "total_code_lines_suggested": 3 - } - ], - "is_custom_model": false, - "total_engaged_users": 2 - } - ], - "total_engaged_users": 2 - }, - { - "name": "Neovim", - "models": [ - { - "name": "default", - "languages": [ - { - "name": "ruby", - "total_engaged_users": 2, - "total_code_acceptances": 6, - "total_code_suggestions": 14, - "total_code_lines_accepted": 6, - "total_code_lines_suggested": 19 - } - ], - "is_custom_model": false, - "total_engaged_users": 2 - } - ], - "total_engaged_users": 2 - }, - { - "name": "VisualStudio", - "models": [ - { - "name": "default", - "languages": [ - { - "name": "cpp", - "total_engaged_users": 2, - "total_code_acceptances": 83, - "total_code_suggestions": 196, - "total_code_lines_accepted": 172, - "total_code_lines_suggested": 489 - } - ], - "is_custom_model": false, - "total_engaged_users": 2 - } - ], - "total_engaged_users": 2 - } - ], - "total_engaged_users": 31 - } - }, - { - "date": "2024-10-27", - "copilot_ide_chat": { - "editors": [ - { - "name": "vscode", - "models": [ - { - "name": "default", - "total_chats": 1242, - "is_custom_model": false, - "total_engaged_users": 32, - "total_chat_copy_events": 63, - "total_chat_insertion_events": 96 - } - ], - "total_engaged_users": 32 - }, - { - "name": "JetBrains", - "models": [ - { - "name": "default", - "total_chats": 14, - "is_custom_model": false, - "total_engaged_users": 1, - "total_chat_copy_events": 0, - "total_chat_insertion_events": 6 - } - ], - "total_engaged_users": 1 - } - ], - "total_engaged_users": 32 - }, - "total_active_users": 44, - "copilot_dotcom_chat": { - "models": [ - { - "name": "default", - "total_chats": 13, - "is_custom_model": false, - "total_engaged_users": 4 - } - ], - "total_engaged_users": 4 - }, - "total_engaged_users": 44, - "copilot_dotcom_pull_requests": { - "repositories": [ - { - "name": "svelte-dev-runner-tracks", - "models": [ - { - "name": "default", - "is_custom_model": false, - "total_engaged_users": 1, - "total_pr_summaries_created": 1 - } - ], - "total_engaged_users": 1 - }, - { - "name": "my-learnings", - "models": [ - { - "name": "default", - "is_custom_model": false, - "total_engaged_users": 1, - "total_pr_summaries_created": 2 - } - ], - "total_engaged_users": 1 - }, - { - "name": "serependity-images", - "models": [ - { - "name": "default", - "is_custom_model": false, - "total_engaged_users": 1, - "total_pr_summaries_created": 1 - } - ], - "total_engaged_users": 1 - } - ], - "total_engaged_users": 3 - }, - "copilot_ide_code_completions": { - "editors": [ - { - "name": "vscode", - "models": [ - { - "name": "default", - "languages": [ - { - "name": "json", - "total_engaged_users": 2, - "total_code_acceptances": 4, - "total_code_suggestions": 18, - "total_code_lines_accepted": 3, - "total_code_lines_suggested": 29 - }, - { - "name": "unknown", - "total_engaged_users": 5, - "total_code_acceptances": 26, - "total_code_suggestions": 194, - "total_code_lines_accepted": 25, - "total_code_lines_suggested": 409 - }, - { - "name": "csharp", - "total_engaged_users": 2, - "total_code_acceptances": 24, - "total_code_suggestions": 64, - "total_code_lines_accepted": 20, - "total_code_lines_suggested": 118 - }, - { - "name": "yaml", - "total_engaged_users": 6, - "total_code_acceptances": 32, - "total_code_suggestions": 116, - "total_code_lines_accepted": 55, - "total_code_lines_suggested": 169 - }, - { - "name": "typescript", - "total_engaged_users": 8, - "total_code_acceptances": 250, - "total_code_suggestions": 523, - "total_code_lines_accepted": 277, - "total_code_lines_suggested": 979 - }, - { - "name": "markdown", - "total_engaged_users": 8, - "total_code_acceptances": 144, - "total_code_suggestions": 837, - "total_code_lines_accepted": 177, - "total_code_lines_suggested": 1219 - }, - { - "name": "dotenv", - "total_engaged_users": 2, - "total_code_acceptances": 4, - "total_code_suggestions": 15, - "total_code_lines_accepted": 4, - "total_code_lines_suggested": 20 - }, - { - "name": "python", - "total_engaged_users": 8, - "total_code_acceptances": 142, - "total_code_suggestions": 303, - "total_code_lines_accepted": 191, - "total_code_lines_suggested": 432 - }, - { - "name": "shellscript", - "total_engaged_users": 3, - "total_code_acceptances": 10, - "total_code_suggestions": 97, - "total_code_lines_accepted": 13, - "total_code_lines_suggested": 130 - }, - { - "name": "javascript", - "total_engaged_users": 6, - "total_code_acceptances": 95, - "total_code_suggestions": 270, - "total_code_lines_accepted": 182, - "total_code_lines_suggested": 586 - }, - { - "name": "pug", - "total_engaged_users": 2, - "total_code_acceptances": 2, - "total_code_suggestions": 7, - "total_code_lines_accepted": 1, - "total_code_lines_suggested": 7 - }, - { - "name": "svelte", - "total_engaged_users": 1, - "total_code_acceptances": 0, - "total_code_suggestions": 5, - "total_code_lines_accepted": 0, - "total_code_lines_suggested": 6 - }, - { - "name": "jsonc", - "total_engaged_users": 2, - "total_code_acceptances": 3, - "total_code_suggestions": 16, - "total_code_lines_accepted": 3, - "total_code_lines_suggested": 124 - }, - { - "name": "typescriptreact", - "total_engaged_users": 4, - "total_code_acceptances": 37, - "total_code_suggestions": 109, - "total_code_lines_accepted": 30, - "total_code_lines_suggested": 131 - }, - { - "name": "scss", - "total_engaged_users": 3, - "total_code_acceptances": 44, - "total_code_suggestions": 142, - "total_code_lines_accepted": 65, - "total_code_lines_suggested": 250 - }, - { - "name": "go", - "total_engaged_users": 3, - "total_code_acceptances": 83, - "total_code_suggestions": 200, - "total_code_lines_accepted": 252, - "total_code_lines_suggested": 665 - }, - { - "name": "html", - "total_engaged_users": 2, - "total_code_acceptances": 60, - "total_code_suggestions": 79, - "total_code_lines_accepted": 71, - "total_code_lines_suggested": 163 - }, - { - "name": "ruby", - "total_engaged_users": 3, - "total_code_acceptances": 36, - "total_code_suggestions": 110, - "total_code_lines_accepted": 30, - "total_code_lines_suggested": 166 - } - ], - "is_custom_model": false, - "total_engaged_users": 32 - } - ], - "total_engaged_users": 32 - }, - { - "name": "JetBrains", - "models": [ - { - "name": "default", - "languages": [ - { - "name": "java", - "total_engaged_users": 2, - "total_code_acceptances": 35, - "total_code_suggestions": 73, - "total_code_lines_accepted": 43, - "total_code_lines_suggested": 133 - }, - { - "name": "sql", - "total_engaged_users": 1, - "total_code_acceptances": 0, - "total_code_suggestions": 1, - "total_code_lines_accepted": 0, - "total_code_lines_suggested": 6 - } - ], - "is_custom_model": false, - "total_engaged_users": 2 - } - ], - "total_engaged_users": 2 - }, - { - "name": "VisualStudio", - "models": [ - { - "name": "default", - "languages": [ - { - "name": "c/c++", - "total_engaged_users": 2, - "total_code_acceptances": 34, - "total_code_suggestions": 266, - "total_code_lines_accepted": 52, - "total_code_lines_suggested": 390 - }, - { - "name": "cpp", - "total_engaged_users": 2, - "total_code_acceptances": 43, - "total_code_suggestions": 112, - "total_code_lines_accepted": 104, - "total_code_lines_suggested": 260 - } - ], - "is_custom_model": false, - "total_engaged_users": 2 - } - ], - "total_engaged_users": 2 - }, - { - "name": "Neovim", - "models": [ - { - "name": "default", - "languages": [ - { - "name": "typescriptreact", - "total_engaged_users": 1, - "total_code_acceptances": 0, - "total_code_suggestions": 3, - "total_code_lines_accepted": 0, - "total_code_lines_suggested": 9 - } - ], - "is_custom_model": false, - "total_engaged_users": 1 - } - ], - "total_engaged_users": 1 - } - ], - "total_engaged_users": 33 - } - }, - { - "date": "2024-10-28", - "copilot_ide_chat": { - "editors": [ - { - "name": "vscode", - "models": [ - { - "name": "default", - "total_chats": 2022, - "is_custom_model": false, - "total_engaged_users": 72, - "total_chat_copy_events": 140, - "total_chat_insertion_events": 71 - } - ], - "total_engaged_users": 72 - }, - { - "name": "JetBrains", - "models": [ - { - "name": "default", - "total_chats": 4, - "is_custom_model": false, - "total_engaged_users": 2, - "total_chat_copy_events": 0, - "total_chat_insertion_events": 0 - } - ], - "total_engaged_users": 2 - } - ], - "total_engaged_users": 73 - }, - "total_active_users": 127, - "copilot_dotcom_chat": { - "models": [ - { - "name": "default", - "total_chats": 109, - "is_custom_model": false, - "total_engaged_users": 29 - } - ], - "total_engaged_users": 29 - }, - "total_engaged_users": 127, - "copilot_dotcom_pull_requests": { - "repositories": [ - { - "name": "brand", - "models": [ - { - "name": "default", - "is_custom_model": false, - "total_engaged_users": 1, - "total_pr_summaries_created": 1 - } - ], - "total_engaged_users": 1 - }, - { - "name": "copilot", - "models": [ - { - "name": "default", - "is_custom_model": false, - "total_engaged_users": 1, - "total_pr_summaries_created": 1 - } - ], - "total_engaged_users": 1 - }, - { - "name": "yugen-saga-server", - "models": [ - { - "name": "default", - "is_custom_model": false, - "total_engaged_users": 1, - "total_pr_summaries_created": 2 - } - ], - "total_engaged_users": 1 - }, - { - "name": "certification-services", - "models": [ - { - "name": "default", - "is_custom_model": false, - "total_engaged_users": 1, - "total_pr_summaries_created": 1 - } - ], - "total_engaged_users": 1 - }, - { - "name": "math-service", - "models": [ - { - "name": "default", - "is_custom_model": false, - "total_engaged_users": 1, - "total_pr_summaries_created": 4 - } - ], - "total_engaged_users": 1 - }, - { - "name": "gh-migrate-teams", - "models": [ - { - "name": "default", - "is_custom_model": false, - "total_engaged_users": 1, - "total_pr_summaries_created": 3 - } - ], - "total_engaged_users": 1 - }, - { - "name": "Copilot-Sandbox", - "models": [ - { - "name": "default", - "is_custom_model": false, - "total_engaged_users": 1, - "total_pr_summaries_created": 1 - } - ], - "total_engaged_users": 1 - }, - { - "name": "paypal-migrations-via-actions", - "models": [ - { - "name": "default", - "is_custom_model": false, - "total_engaged_users": 1, - "total_pr_summaries_created": 1 - } - ], - "total_engaged_users": 1 - }, - { - "name": "java-springboot-demo", - "models": [ - { - "name": "default", - "is_custom_model": false, - "total_engaged_users": 1, - "total_pr_summaries_created": 2 - } - ], - "total_engaged_users": 1 - }, - { - "name": "myshuttle", - "models": [ - { - "name": "default", - "is_custom_model": false, - "total_engaged_users": 1, - "total_pr_summaries_created": 2 - } - ], - "total_engaged_users": 1 - }, - { - "name": "", - "models": [ - { - "name": "default", - "is_custom_model": false, - "total_engaged_users": 1, - "total_pr_summaries_created": 1 - } - ], - "total_engaged_users": 1 - } - ], - "total_engaged_users": 10 - }, - "copilot_ide_code_completions": { - "editors": [ - { - "name": "vscode", - "models": [ - { - "name": "default", - "languages": [ - { - "name": "yaml", - "total_engaged_users": 6, - "total_code_acceptances": 48, - "total_code_suggestions": 259, - "total_code_lines_accepted": 54, - "total_code_lines_suggested": 398 - }, - { - "name": "unknown", - "total_engaged_users": 10, - "total_code_acceptances": 52, - "total_code_suggestions": 247, - "total_code_lines_accepted": 61, - "total_code_lines_suggested": 396 - }, - { - "name": "java", - "total_engaged_users": 6, - "total_code_acceptances": 55, - "total_code_suggestions": 166, - "total_code_lines_accepted": 203, - "total_code_lines_suggested": 831 - }, - { - "name": "jsonc", - "total_engaged_users": 2, - "total_code_acceptances": 1, - "total_code_suggestions": 18, - "total_code_lines_accepted": 3, - "total_code_lines_suggested": 45 - }, - { - "name": "html", - "total_engaged_users": 7, - "total_code_acceptances": 57, - "total_code_suggestions": 131, - "total_code_lines_accepted": 65, - "total_code_lines_suggested": 231 - }, - { - "name": "python", - "total_engaged_users": 8, - "total_code_acceptances": 105, - "total_code_suggestions": 331, - "total_code_lines_accepted": 132, - "total_code_lines_suggested": 531 - }, - { - "name": "typescript", - "total_engaged_users": 6, - "total_code_acceptances": 61, - "total_code_suggestions": 199, - "total_code_lines_accepted": 62, - "total_code_lines_suggested": 310 - }, - { - "name": "javascript", - "total_engaged_users": 16, - "total_code_acceptances": 514, - "total_code_suggestions": 1092, - "total_code_lines_accepted": 844, - "total_code_lines_suggested": 1796 - }, - { - "name": "json", - "total_engaged_users": 6, - "total_code_acceptances": 13, - "total_code_suggestions": 42, - "total_code_lines_accepted": 14, - "total_code_lines_suggested": 59 - }, - { - "name": "groovy", - "total_engaged_users": 2, - "total_code_acceptances": 2, - "total_code_suggestions": 12, - "total_code_lines_accepted": 2, - "total_code_lines_suggested": 17 - }, - { - "name": "plaintext", - "total_engaged_users": 1, - "total_code_acceptances": 0, - "total_code_suggestions": 13, - "total_code_lines_accepted": 0, - "total_code_lines_suggested": 15 - }, - { - "name": "go", - "total_engaged_users": 4, - "total_code_acceptances": 182, - "total_code_suggestions": 504, - "total_code_lines_accepted": 239, - "total_code_lines_suggested": 828 - }, - { - "name": "shellscript", - "total_engaged_users": 11, - "total_code_acceptances": 63, - "total_code_suggestions": 176, - "total_code_lines_accepted": 68, - "total_code_lines_suggested": 235 - }, - { - "name": "markdown", - "total_engaged_users": 17, - "total_code_acceptances": 164, - "total_code_suggestions": 1308, - "total_code_lines_accepted": 219, - "total_code_lines_suggested": 1834 - }, - { - "name": "typescriptreact", - "total_engaged_users": 7, - "total_code_acceptances": 145, - "total_code_suggestions": 464, - "total_code_lines_accepted": 119, - "total_code_lines_suggested": 714 - }, - { - "name": "ruby", - "total_engaged_users": 12, - "total_code_acceptances": 176, - "total_code_suggestions": 450, - "total_code_lines_accepted": 176, - "total_code_lines_suggested": 585 - }, - { - "name": "dockerfile", - "total_engaged_users": 1, - "total_code_acceptances": 0, - "total_code_suggestions": 8, - "total_code_lines_accepted": 0, - "total_code_lines_suggested": 8 - }, - { - "name": "scss", - "total_engaged_users": 1, - "total_code_acceptances": 0, - "total_code_suggestions": 9, - "total_code_lines_accepted": 0, - "total_code_lines_suggested": 46 - }, - { - "name": "clojure", - "total_engaged_users": 1, - "total_code_acceptances": 0, - "total_code_suggestions": 5, - "total_code_lines_accepted": 0, - "total_code_lines_suggested": 6 - }, - { - "name": "csharp", - "total_engaged_users": 4, - "total_code_acceptances": 50, - "total_code_suggestions": 182, - "total_code_lines_accepted": 35, - "total_code_lines_suggested": 280 - }, - { - "name": "css", - "total_engaged_users": 1, - "total_code_acceptances": 0, - "total_code_suggestions": 6, - "total_code_lines_accepted": 0, - "total_code_lines_suggested": 6 - }, - { - "name": "powershell", - "total_engaged_users": 2, - "total_code_acceptances": 8, - "total_code_suggestions": 36, - "total_code_lines_accepted": 10, - "total_code_lines_suggested": 73 - }, - { - "name": "dotenv", - "total_engaged_users": 1, - "total_code_acceptances": 0, - "total_code_suggestions": 5, - "total_code_lines_accepted": 0, - "total_code_lines_suggested": 7 - }, - { - "name": "graphql", - "total_engaged_users": 1, - "total_code_acceptances": 0, - "total_code_suggestions": 1, - "total_code_lines_accepted": 0, - "total_code_lines_suggested": 16 - }, - { - "name": "razor", - "total_engaged_users": 1, - "total_code_acceptances": 0, - "total_code_suggestions": 1, - "total_code_lines_accepted": 0, - "total_code_lines_suggested": 1 - } - ], - "is_custom_model": false, - "total_engaged_users": 75 - } - ], - "total_engaged_users": 75 - }, - { - "name": "VisualStudio", - "models": [ - { - "name": "default", - "languages": [ - { - "name": "c/c++", - "total_engaged_users": 2, - "total_code_acceptances": 56, - "total_code_suggestions": 131, - "total_code_lines_accepted": 76, - "total_code_lines_suggested": 228 - } - ], - "is_custom_model": false, - "total_engaged_users": 2 - } - ], - "total_engaged_users": 2 - }, - { - "name": "Emacs", - "models": [ - { - "name": "default", - "languages": [ - { - "name": "rustic", - "total_engaged_users": 2, - "total_code_acceptances": 12, - "total_code_suggestions": 21, - "total_code_lines_accepted": 12, - "total_code_lines_suggested": 23 - } - ], - "is_custom_model": false, - "total_engaged_users": 2 - } - ], - "total_engaged_users": 2 - }, - { - "name": "JetBrains", - "models": [ - { - "name": "default", - "languages": [ - { - "name": "java", - "total_engaged_users": 1, - "total_code_acceptances": 0, - "total_code_suggestions": 4, - "total_code_lines_accepted": 0, - "total_code_lines_suggested": 7 - }, - { - "name": "csharp", - "total_engaged_users": 2, - "total_code_acceptances": 5, - "total_code_suggestions": 23, - "total_code_lines_accepted": 6, - "total_code_lines_suggested": 56 - } - ], - "is_custom_model": false, - "total_engaged_users": 2 - } - ], - "total_engaged_users": 2 - }, - { - "name": "Neovim", - "models": [ - { - "name": "default", - "languages": [ - { - "name": "typescriptreact", - "total_engaged_users": 2, - "total_code_acceptances": 8, - "total_code_suggestions": 29, - "total_code_lines_accepted": 8, - "total_code_lines_suggested": 104 - } - ], - "is_custom_model": false, - "total_engaged_users": 2 - } - ], - "total_engaged_users": 2 - }, - { - "name": "Vim", - "models": [ - { - "name": "default", - "languages": [ - { - "name": "markdown", - "total_engaged_users": 1, - "total_code_acceptances": 0, - "total_code_suggestions": 1, - "total_code_lines_accepted": 0, - "total_code_lines_suggested": 6 - } - ], - "is_custom_model": false, - "total_engaged_users": 1 - } - ], - "total_engaged_users": 1 - } - ], - "total_engaged_users": 79 - } - }, - { - "date": "2024-10-29", - "copilot_ide_chat": { - "editors": [ - { - "name": "vscode", - "models": [ - { - "name": "default", - "total_chats": 2004, - "is_custom_model": false, - "total_engaged_users": 89, - "total_chat_copy_events": 72, - "total_chat_insertion_events": 59 - } - ], - "total_engaged_users": 89 - }, - { - "name": "JetBrains", - "models": [ - { - "name": "default", - "total_chats": 30, - "is_custom_model": false, - "total_engaged_users": 3, - "total_chat_copy_events": 2, - "total_chat_insertion_events": 8 - } - ], - "total_engaged_users": 3 - } - ], - "total_engaged_users": 89 - }, - "total_active_users": 140, - "copilot_dotcom_chat": { - "models": [ - { - "name": "default", - "total_chats": 91, - "is_custom_model": false, - "total_engaged_users": 26 - } - ], - "total_engaged_users": 26 - }, - "total_engaged_users": 140, - "copilot_dotcom_pull_requests": { - "repositories": [ - { - "name": "releases", - "models": [ - { - "name": "default", - "is_custom_model": false, - "total_engaged_users": 1, - "total_pr_summaries_created": 4 - } - ], - "total_engaged_users": 1 - }, - { - "name": "Copilot-Sandbox", - "models": [ - { - "name": "default", - "is_custom_model": false, - "total_engaged_users": 1, - "total_pr_summaries_created": 1 - } - ], - "total_engaged_users": 1 - }, - { - "name": "github-games", - "models": [ - { - "name": "default", - "is_custom_model": false, - "total_engaged_users": 1, - "total_pr_summaries_created": 1 - } - ], - "total_engaged_users": 1 - }, - { - "name": "Abeck_GHAS2", - "models": [ - { - "name": "default", - "is_custom_model": false, - "total_engaged_users": 1, - "total_pr_summaries_created": 1 - } - ], - "total_engaged_users": 1 - }, - { - "name": "JackGKafaty_GitHubAdvancedSecurity", - "models": [ - { - "name": "default", - "is_custom_model": false, - "total_engaged_users": 1, - "total_pr_summaries_created": 2 - } - ], - "total_engaged_users": 1 - }, - { - "name": "", - "models": [ - { - "name": "default", - "is_custom_model": false, - "total_engaged_users": 1, - "total_pr_summaries_created": 2 - } - ], - "total_engaged_users": 1 - }, - { - "name": "octo-consumption-data", - "models": [ - { - "name": "default", - "is_custom_model": false, - "total_engaged_users": 1, - "total_pr_summaries_created": 1 - } - ], - "total_engaged_users": 1 - }, - { - "name": "math-service", - "models": [ - { - "name": "default", - "is_custom_model": false, - "total_engaged_users": 1, - "total_pr_summaries_created": 6 - } - ], - "total_engaged_users": 1 - }, - { - "name": "nullchimp-demo", - "models": [ - { - "name": "default", - "is_custom_model": false, - "total_engaged_users": 1, - "total_pr_summaries_created": 2 - } - ], - "total_engaged_users": 1 - } - ], - "total_engaged_users": 9 - }, - "copilot_ide_code_completions": { - "editors": [ - { - "name": "vscode", - "models": [ - { - "name": "default", - "languages": [ - { - "name": "markdown", - "total_engaged_users": 20, - "total_code_acceptances": 237, - "total_code_suggestions": 2069, - "total_code_lines_accepted": 277, - "total_code_lines_suggested": 2676 - }, - { - "name": "typescriptreact", - "total_engaged_users": 10, - "total_code_acceptances": 178, - "total_code_suggestions": 538, - "total_code_lines_accepted": 157, - "total_code_lines_suggested": 743 - }, - { - "name": "csharp", - "total_engaged_users": 3, - "total_code_acceptances": 17, - "total_code_suggestions": 69, - "total_code_lines_accepted": 14, - "total_code_lines_suggested": 145 - }, - { - "name": "typescript", - "total_engaged_users": 10, - "total_code_acceptances": 307, - "total_code_suggestions": 972, - "total_code_lines_accepted": 347, - "total_code_lines_suggested": 1587 - }, - { - "name": "javascript", - "total_engaged_users": 17, - "total_code_acceptances": 306, - "total_code_suggestions": 882, - "total_code_lines_accepted": 449, - "total_code_lines_suggested": 1584 - }, - { - "name": "go", - "total_engaged_users": 6, - "total_code_acceptances": 80, - "total_code_suggestions": 235, - "total_code_lines_accepted": 111, - "total_code_lines_suggested": 370 - }, - { - "name": "yaml", - "total_engaged_users": 13, - "total_code_acceptances": 80, - "total_code_suggestions": 318, - "total_code_lines_accepted": 152, - "total_code_lines_suggested": 1002 - }, - { - "name": "jsonc", - "total_engaged_users": 2, - "total_code_acceptances": 1, - "total_code_suggestions": 15, - "total_code_lines_accepted": 0, - "total_code_lines_suggested": 20 - }, - { - "name": "unknown", - "total_engaged_users": 9, - "total_code_acceptances": 25, - "total_code_suggestions": 216, - "total_code_lines_accepted": 32, - "total_code_lines_suggested": 274 - }, - { - "name": "json", - "total_engaged_users": 5, - "total_code_acceptances": 5, - "total_code_suggestions": 49, - "total_code_lines_accepted": 4, - "total_code_lines_suggested": 90 - }, - { - "name": "html", - "total_engaged_users": 5, - "total_code_acceptances": 20, - "total_code_suggestions": 52, - "total_code_lines_accepted": 21, - "total_code_lines_suggested": 152 - }, - { - "name": "shellscript", - "total_engaged_users": 6, - "total_code_acceptances": 33, - "total_code_suggestions": 168, - "total_code_lines_accepted": 39, - "total_code_lines_suggested": 213 - }, - { - "name": "python", - "total_engaged_users": 11, - "total_code_acceptances": 261, - "total_code_suggestions": 511, - "total_code_lines_accepted": 544, - "total_code_lines_suggested": 1088 - }, - { - "name": "dotenv", - "total_engaged_users": 3, - "total_code_acceptances": 2, - "total_code_suggestions": 23, - "total_code_lines_accepted": 2, - "total_code_lines_suggested": 25 - }, - { - "name": "plaintext", - "total_engaged_users": 1, - "total_code_acceptances": 0, - "total_code_suggestions": 5, - "total_code_lines_accepted": 0, - "total_code_lines_suggested": 5 - }, - { - "name": "oraclesql", - "total_engaged_users": 2, - "total_code_acceptances": 1, - "total_code_suggestions": 1, - "total_code_lines_accepted": 1, - "total_code_lines_suggested": 2 - }, - { - "name": "terraform", - "total_engaged_users": 1, - "total_code_acceptances": 0, - "total_code_suggestions": 4, - "total_code_lines_accepted": 0, - "total_code_lines_suggested": 13 - }, - { - "name": "xml", - "total_engaged_users": 2, - "total_code_acceptances": 5, - "total_code_suggestions": 16, - "total_code_lines_accepted": 4, - "total_code_lines_suggested": 18 - }, - { - "name": "razor", - "total_engaged_users": 2, - "total_code_acceptances": 2, - "total_code_suggestions": 32, - "total_code_lines_accepted": 2, - "total_code_lines_suggested": 85 - }, - { - "name": "ruby", - "total_engaged_users": 14, - "total_code_acceptances": 259, - "total_code_suggestions": 795, - "total_code_lines_accepted": 206, - "total_code_lines_suggested": 1025 - }, - { - "name": "css", - "total_engaged_users": 2, - "total_code_acceptances": 13, - "total_code_suggestions": 40, - "total_code_lines_accepted": 14, - "total_code_lines_suggested": 71 - }, - { - "name": "java", - "total_engaged_users": 2, - "total_code_acceptances": 8, - "total_code_suggestions": 26, - "total_code_lines_accepted": 19, - "total_code_lines_suggested": 42 - }, - { - "name": "erb", - "total_engaged_users": 1, - "total_code_acceptances": 0, - "total_code_suggestions": 4, - "total_code_lines_accepted": 0, - "total_code_lines_suggested": 5 - }, - { - "name": "coffeescript", - "total_engaged_users": 1, - "total_code_acceptances": 0, - "total_code_suggestions": 2, - "total_code_lines_accepted": 0, - "total_code_lines_suggested": 6 - }, - { - "name": "powershell", - "total_engaged_users": 2, - "total_code_acceptances": 60, - "total_code_suggestions": 240, - "total_code_lines_accepted": 80, - "total_code_lines_suggested": 911 - }, - { - "name": "dockerfile", - "total_engaged_users": 2, - "total_code_acceptances": 1, - "total_code_suggestions": 2, - "total_code_lines_accepted": 1, - "total_code_lines_suggested": 3 - }, - { - "name": "sql", - "total_engaged_users": 2, - "total_code_acceptances": 4, - "total_code_suggestions": 22, - "total_code_lines_accepted": 17, - "total_code_lines_suggested": 38 - }, - { - "name": "ql", - "total_engaged_users": 2, - "total_code_acceptances": 11, - "total_code_suggestions": 142, - "total_code_lines_accepted": 9, - "total_code_lines_suggested": 257 - }, - { - "name": "graphql", - "total_engaged_users": 2, - "total_code_acceptances": 2, - "total_code_suggestions": 3, - "total_code_lines_accepted": 1, - "total_code_lines_suggested": 4 - }, - { - "name": "http", - "total_engaged_users": 2, - "total_code_acceptances": 10, - "total_code_suggestions": 45, - "total_code_lines_accepted": 26, - "total_code_lines_suggested": 233 - }, - { - "name": "scss", - "total_engaged_users": 2, - "total_code_acceptances": 4, - "total_code_suggestions": 16, - "total_code_lines_accepted": 4, - "total_code_lines_suggested": 38 - } - ], - "is_custom_model": false, - "total_engaged_users": 85 - } - ], - "total_engaged_users": 85 - }, - { - "name": "Vim", - "models": [ - { - "name": "default", - "languages": [ - { - "name": "markdown", - "total_engaged_users": 1, - "total_code_acceptances": 0, - "total_code_suggestions": 7, - "total_code_lines_accepted": 0, - "total_code_lines_suggested": 15 - } - ], - "is_custom_model": false, - "total_engaged_users": 1 - } - ], - "total_engaged_users": 1 - }, - { - "name": "JetBrains", - "models": [ - { - "name": "default", - "languages": [ - { - "name": "java", - "total_engaged_users": 2, - "total_code_acceptances": 8, - "total_code_suggestions": 8, - "total_code_lines_accepted": 20, - "total_code_lines_suggested": 22 - }, - { - "name": "csharp", - "total_engaged_users": 2, - "total_code_acceptances": 3, - "total_code_suggestions": 12, - "total_code_lines_accepted": 8, - "total_code_lines_suggested": 79 - }, - { - "name": "json", - "total_engaged_users": 2, - "total_code_acceptances": 3, - "total_code_suggestions": 5, - "total_code_lines_accepted": 4, - "total_code_lines_suggested": 8 - } - ], - "is_custom_model": false, - "total_engaged_users": 3 - } - ], - "total_engaged_users": 3 - }, - { - "name": "VisualStudio", - "models": [ - { - "name": "default", - "languages": [ - { - "name": "csharp", - "total_engaged_users": 2, - "total_code_acceptances": 1, - "total_code_suggestions": 3, - "total_code_lines_accepted": 1, - "total_code_lines_suggested": 3 - }, - { - "name": "cpp", - "total_engaged_users": 2, - "total_code_acceptances": 98, - "total_code_suggestions": 242, - "total_code_lines_accepted": 204, - "total_code_lines_suggested": 508 - } - ], - "is_custom_model": false, - "total_engaged_users": 3 - } - ], - "total_engaged_users": 3 - }, - { - "name": "Neovim", - "models": [ - { - "name": "default", - "languages": [ - { - "name": "vue", - "total_engaged_users": 2, - "total_code_acceptances": 14, - "total_code_suggestions": 46, - "total_code_lines_accepted": 24, - "total_code_lines_suggested": 138 - }, - { - "name": "java", - "total_engaged_users": 2, - "total_code_acceptances": 3, - "total_code_suggestions": 4, - "total_code_lines_accepted": 13, - "total_code_lines_suggested": 22 - } - ], - "is_custom_model": false, - "total_engaged_users": 3 - } - ], - "total_engaged_users": 3 - } - ], - "total_engaged_users": 89 - } - }, - { - "date": "2024-10-30", - "copilot_ide_chat": { - "editors": [ - { - "name": "vscode", - "models": [ - { - "name": "default", - "total_chats": 2777, - "is_custom_model": false, - "total_engaged_users": 98, - "total_chat_copy_events": 75, - "total_chat_insertion_events": 146 - } - ], - "total_engaged_users": 98 - }, - { - "name": "JetBrains", - "models": [ - { - "name": "default", - "total_chats": 49, - "is_custom_model": false, - "total_engaged_users": 4, - "total_chat_copy_events": 13, - "total_chat_insertion_events": 9 - } - ], - "total_engaged_users": 4 - } - ], - "total_engaged_users": 99 - }, - "total_active_users": 152, - "copilot_dotcom_chat": { - "models": [ - { - "name": "default", - "total_chats": 165, - "is_custom_model": false, - "total_engaged_users": 38 - } - ], - "total_engaged_users": 38 - }, - "total_engaged_users": 152, - "copilot_dotcom_pull_requests": { - "repositories": [ - { - "name": "releases_dev", - "models": [ - { - "name": "default", - "is_custom_model": false, - "total_engaged_users": 1, - "total_pr_summaries_created": 1 - } - ], - "total_engaged_users": 1 - }, - { - "name": "OctoFitApp-Universe2024", - "models": [ - { - "name": "default", - "is_custom_model": false, - "total_engaged_users": 1, - "total_pr_summaries_created": 1 - } - ], - "total_engaged_users": 1 - }, - { - "name": "paypal-migrations-via-actions", - "models": [ - { - "name": "default", - "is_custom_model": false, - "total_engaged_users": 1, - "total_pr_summaries_created": 2 - } - ], - "total_engaged_users": 1 - }, - { - "name": "jdemos-demo-conference", - "models": [ - { - "name": "default", - "is_custom_model": false, - "total_engaged_users": 1, - "total_pr_summaries_created": 1 - } - ], - "total_engaged_users": 1 - }, - { - "name": "copilot-metrics-viewer", - "models": [ - { - "name": "default", - "is_custom_model": false, - "total_engaged_users": 1, - "total_pr_summaries_created": 1 - } - ], - "total_engaged_users": 1 - }, - { - "name": "", - "models": [ - { - "name": "default", - "is_custom_model": false, - "total_engaged_users": 2, - "total_pr_summaries_created": 4 - } - ], - "total_engaged_users": 2 - }, - { - "name": "github-planning", - "models": [ - { - "name": "default", - "is_custom_model": false, - "total_engaged_users": 1, - "total_pr_summaries_created": 2 - } - ], - "total_engaged_users": 1 - }, - { - "name": "dotNET-mail-demo", - "models": [ - { - "name": "default", - "is_custom_model": false, - "total_engaged_users": 1, - "total_pr_summaries_created": 1 - } - ], - "total_engaged_users": 1 - }, - { - "name": "nvm", - "models": [ - { - "name": "default", - "is_custom_model": false, - "total_engaged_users": 1, - "total_pr_summaries_created": 0 - } - ], - "total_engaged_users": 1 - }, - { - "name": "gifted-potato", - "models": [ - { - "name": "default", - "is_custom_model": false, - "total_engaged_users": 1, - "total_pr_summaries_created": 2 - } - ], - "total_engaged_users": 1 - }, - { - "name": "haikus-for-june", - "models": [ - { - "name": "default", - "is_custom_model": false, - "total_engaged_users": 1, - "total_pr_summaries_created": 3 - } - ], - "total_engaged_users": 1 - }, - { - "name": "actions-hero", - "models": [ - { - "name": "default", - "is_custom_model": false, - "total_engaged_users": 1, - "total_pr_summaries_created": 1 - } - ], - "total_engaged_users": 1 - }, - { - "name": "demo-vulnerabilities-ghas", - "models": [ - { - "name": "default", - "is_custom_model": false, - "total_engaged_users": 1, - "total_pr_summaries_created": 2 - } - ], - "total_engaged_users": 1 - } - ], - "total_engaged_users": 12 - }, - "copilot_ide_code_completions": { - "editors": [ - { - "name": "vscode", - "models": [ - { - "name": "default", - "languages": [ - { - "name": "ruby", - "total_engaged_users": 12, - "total_code_acceptances": 223, - "total_code_suggestions": 516, - "total_code_lines_accepted": 323, - "total_code_lines_suggested": 781 - }, - { - "name": "markdown", - "total_engaged_users": 18, - "total_code_acceptances": 128, - "total_code_suggestions": 956, - "total_code_lines_accepted": 147, - "total_code_lines_suggested": 1216 - }, - { - "name": "dotenv", - "total_engaged_users": 1, - "total_code_acceptances": 0, - "total_code_suggestions": 25, - "total_code_lines_accepted": 0, - "total_code_lines_suggested": 27 - }, - { - "name": "typescriptreact", - "total_engaged_users": 10, - "total_code_acceptances": 263, - "total_code_suggestions": 696, - "total_code_lines_accepted": 211, - "total_code_lines_suggested": 1016 - }, - { - "name": "html", - "total_engaged_users": 6, - "total_code_acceptances": 14, - "total_code_suggestions": 47, - "total_code_lines_accepted": 13, - "total_code_lines_suggested": 67 - }, - { - "name": "typescript", - "total_engaged_users": 16, - "total_code_acceptances": 288, - "total_code_suggestions": 986, - "total_code_lines_accepted": 261, - "total_code_lines_suggested": 1483 - }, - { - "name": "yaml", - "total_engaged_users": 13, - "total_code_acceptances": 88, - "total_code_suggestions": 334, - "total_code_lines_accepted": 223, - "total_code_lines_suggested": 947 - }, - { - "name": "javascript", - "total_engaged_users": 18, - "total_code_acceptances": 372, - "total_code_suggestions": 814, - "total_code_lines_accepted": 852, - "total_code_lines_suggested": 1751 - }, - { - "name": "css", - "total_engaged_users": 5, - "total_code_acceptances": 43, - "total_code_suggestions": 223, - "total_code_lines_accepted": 49, - "total_code_lines_suggested": 403 - }, - { - "name": "json", - "total_engaged_users": 5, - "total_code_acceptances": 8, - "total_code_suggestions": 32, - "total_code_lines_accepted": 6, - "total_code_lines_suggested": 126 - }, - { - "name": "jsonc", - "total_engaged_users": 2, - "total_code_acceptances": 2, - "total_code_suggestions": 37, - "total_code_lines_accepted": 1, - "total_code_lines_suggested": 63 - }, - { - "name": "python", - "total_engaged_users": 14, - "total_code_acceptances": 118, - "total_code_suggestions": 270, - "total_code_lines_accepted": 185, - "total_code_lines_suggested": 433 - }, - { - "name": "scss", - "total_engaged_users": 3, - "total_code_acceptances": 7, - "total_code_suggestions": 18, - "total_code_lines_accepted": 12, - "total_code_lines_suggested": 140 - }, - { - "name": "unknown", - "total_engaged_users": 8, - "total_code_acceptances": 27, - "total_code_suggestions": 288, - "total_code_lines_accepted": 23, - "total_code_lines_suggested": 403 - }, - { - "name": "java", - "total_engaged_users": 2, - "total_code_acceptances": 3, - "total_code_suggestions": 20, - "total_code_lines_accepted": 7, - "total_code_lines_suggested": 65 - }, - { - "name": "cpp", - "total_engaged_users": 3, - "total_code_acceptances": 9, - "total_code_suggestions": 43, - "total_code_lines_accepted": 9, - "total_code_lines_suggested": 59 - }, - { - "name": "dockerfile", - "total_engaged_users": 3, - "total_code_acceptances": 8, - "total_code_suggestions": 28, - "total_code_lines_accepted": 8, - "total_code_lines_suggested": 28 - }, - { - "name": "ql", - "total_engaged_users": 2, - "total_code_acceptances": 2, - "total_code_suggestions": 38, - "total_code_lines_accepted": 2, - "total_code_lines_suggested": 132 - }, - { - "name": "makefile", - "total_engaged_users": 1, - "total_code_acceptances": 0, - "total_code_suggestions": 4, - "total_code_lines_accepted": 0, - "total_code_lines_suggested": 5 - }, - { - "name": "shellscript", - "total_engaged_users": 6, - "total_code_acceptances": 30, - "total_code_suggestions": 57, - "total_code_lines_accepted": 47, - "total_code_lines_suggested": 78 - }, - { - "name": "csharp", - "total_engaged_users": 3, - "total_code_acceptances": 13, - "total_code_suggestions": 216, - "total_code_lines_accepted": 7, - "total_code_lines_suggested": 715 - }, - { - "name": "razor", - "total_engaged_users": 1, - "total_code_acceptances": 0, - "total_code_suggestions": 14, - "total_code_lines_accepted": 0, - "total_code_lines_suggested": 24 - }, - { - "name": "powershell", - "total_engaged_users": 2, - "total_code_acceptances": 90, - "total_code_suggestions": 227, - "total_code_lines_accepted": 201, - "total_code_lines_suggested": 840 - }, - { - "name": "go", - "total_engaged_users": 4, - "total_code_acceptances": 34, - "total_code_suggestions": 76, - "total_code_lines_accepted": 32, - "total_code_lines_suggested": 111 - }, - { - "name": "graphql", - "total_engaged_users": 1, - "total_code_acceptances": 0, - "total_code_suggestions": 2, - "total_code_lines_accepted": 0, - "total_code_lines_suggested": 2 - }, - { - "name": "sql", - "total_engaged_users": 1, - "total_code_acceptances": 0, - "total_code_suggestions": 1, - "total_code_lines_accepted": 0, - "total_code_lines_suggested": 2 - }, - { - "name": "svelte", - "total_engaged_users": 1, - "total_code_acceptances": 0, - "total_code_suggestions": 1, - "total_code_lines_accepted": 0, - "total_code_lines_suggested": 1 - }, - { - "name": "coffeescript", - "total_engaged_users": 1, - "total_code_acceptances": 0, - "total_code_suggestions": 2, - "total_code_lines_accepted": 0, - "total_code_lines_suggested": 12 - }, - { - "name": "bat", - "total_engaged_users": 1, - "total_code_acceptances": 0, - "total_code_suggestions": 2, - "total_code_lines_accepted": 0, - "total_code_lines_suggested": 2 - } - ], - "is_custom_model": false, - "total_engaged_users": 88 - } - ], - "total_engaged_users": 88 - }, - { - "name": "Neovim", - "models": [ - { - "name": "default", - "languages": [ - { - "name": "vue", - "total_engaged_users": 2, - "total_code_acceptances": 3, - "total_code_suggestions": 5, - "total_code_lines_accepted": 3, - "total_code_lines_suggested": 477 - }, - { - "name": "ruby", - "total_engaged_users": 3, - "total_code_acceptances": 10, - "total_code_suggestions": 49, - "total_code_lines_accepted": 11, - "total_code_lines_suggested": 156 - }, - { - "name": "html", - "total_engaged_users": 2, - "total_code_acceptances": 2, - "total_code_suggestions": 2, - "total_code_lines_accepted": 3, - "total_code_lines_suggested": 5 - }, - { - "name": "markdown", - "total_engaged_users": 2, - "total_code_acceptances": 1, - "total_code_suggestions": 51, - "total_code_lines_accepted": 1, - "total_code_lines_suggested": 180 - }, - { - "name": "unknown", - "total_engaged_users": 2, - "total_code_acceptances": 1, - "total_code_suggestions": 53, - "total_code_lines_accepted": 1, - "total_code_lines_suggested": 209 - } - ], - "is_custom_model": false, - "total_engaged_users": 4 - } - ], - "total_engaged_users": 4 - }, - { - "name": "JetBrains", - "models": [ - { - "name": "default", - "languages": [ - { - "name": "markdown", - "total_engaged_users": 1, - "total_code_acceptances": 0, - "total_code_suggestions": 3, - "total_code_lines_accepted": 0, - "total_code_lines_suggested": 24 - }, - { - "name": "yaml", - "total_engaged_users": 1, - "total_code_acceptances": 0, - "total_code_suggestions": 6, - "total_code_lines_accepted": 0, - "total_code_lines_suggested": 8 - }, - { - "name": "java", - "total_engaged_users": 2, - "total_code_acceptances": 26, - "total_code_suggestions": 34, - "total_code_lines_accepted": 53, - "total_code_lines_suggested": 70 - }, - { - "name": "csharp", - "total_engaged_users": 2, - "total_code_acceptances": 12, - "total_code_suggestions": 30, - "total_code_lines_accepted": 20, - "total_code_lines_suggested": 279 - }, - { - "name": "json", - "total_engaged_users": 2, - "total_code_acceptances": 1, - "total_code_suggestions": 2, - "total_code_lines_accepted": 1, - "total_code_lines_suggested": 2 - }, - { - "name": "javascript", - "total_engaged_users": 2, - "total_code_acceptances": 2, - "total_code_suggestions": 5, - "total_code_lines_accepted": 8, - "total_code_lines_suggested": 24 - }, - { - "name": "go", - "total_engaged_users": 2, - "total_code_acceptances": 7, - "total_code_suggestions": 15, - "total_code_lines_accepted": 7, - "total_code_lines_suggested": 21 - } - ], - "is_custom_model": false, - "total_engaged_users": 5 - } - ], - "total_engaged_users": 5 - }, - { - "name": "Xcode", - "models": [ - { - "name": "default", - "languages": [ - { - "name": "swift", - "total_engaged_users": 2, - "total_code_acceptances": 1, - "total_code_suggestions": 4, - "total_code_lines_accepted": 0, - "total_code_lines_suggested": 41 - } - ], - "is_custom_model": false, - "total_engaged_users": 2 - } - ], - "total_engaged_users": 2 - }, - { - "name": "VisualStudio", - "models": [ - { - "name": "default", - "languages": [ - { - "name": "cpp", - "total_engaged_users": 2, - "total_code_acceptances": 72, - "total_code_suggestions": 236, - "total_code_lines_accepted": 175, - "total_code_lines_suggested": 678 - } - ], - "is_custom_model": false, - "total_engaged_users": 2 - } - ], - "total_engaged_users": 2 - } - ], - "total_engaged_users": 95 - } - }, - { - "date": "2024-10-31", - "copilot_ide_chat": { - "editors": [ - { - "name": "vscode", - "models": [ - { - "name": "default", - "total_chats": 2111, - "is_custom_model": false, - "total_engaged_users": 66, - "total_chat_copy_events": 78, - "total_chat_insertion_events": 79 - } - ], - "total_engaged_users": 66 - }, - { - "name": "JetBrains", - "models": [ - { - "name": "default", - "total_chats": 12, - "is_custom_model": false, - "total_engaged_users": 2, - "total_chat_copy_events": 0, - "total_chat_insertion_events": 2 - } - ], - "total_engaged_users": 2 - } - ], - "total_engaged_users": 66 - }, - "total_active_users": 113, - "copilot_dotcom_chat": { - "models": [ - { - "name": "default", - "total_chats": 110, - "is_custom_model": false, - "total_engaged_users": 25 - } - ], - "total_engaged_users": 25 - }, - "total_engaged_users": 113, - "copilot_dotcom_pull_requests": { - "repositories": [ - { - "name": "math-service", - "models": [ - { - "name": "default", - "is_custom_model": false, - "total_engaged_users": 1, - "total_pr_summaries_created": 2 - } - ], - "total_engaged_users": 1 - }, - { - "name": "yugen-saga-server", - "models": [ - { - "name": "default", - "is_custom_model": false, - "total_engaged_users": 1, - "total_pr_summaries_created": 2 - } - ], - "total_engaged_users": 1 - }, - { - "name": "customer-feedback", - "models": [ - { - "name": "default", - "is_custom_model": false, - "total_engaged_users": 1, - "total_pr_summaries_created": 3 - } - ], - "total_engaged_users": 1 - }, - { - "name": "yaktriage", - "models": [ - { - "name": "default", - "is_custom_model": false, - "total_engaged_users": 1, - "total_pr_summaries_created": 2 - } - ], - "total_engaged_users": 1 - }, - { - "name": "sparkling-goggles", - "models": [ - { - "name": "default", - "is_custom_model": false, - "total_engaged_users": 1, - "total_pr_summaries_created": 1 - } - ], - "total_engaged_users": 1 - }, - { - "name": "github", - "models": [ - { - "name": "default", - "is_custom_model": false, - "total_engaged_users": 1, - "total_pr_summaries_created": 1 - } - ], - "total_engaged_users": 1 - }, - { - "name": "copilot-enterprise-demo", - "models": [ - { - "name": "default", - "is_custom_model": false, - "total_engaged_users": 1, - "total_pr_summaries_created": 2 - } - ], - "total_engaged_users": 1 - } - ], - "total_engaged_users": 7 - }, - "copilot_ide_code_completions": { - "editors": [ - { - "name": "vscode", - "models": [ - { - "name": "default", - "languages": [ - { - "name": "typescript", - "total_engaged_users": 11, - "total_code_acceptances": 270, - "total_code_suggestions": 821, - "total_code_lines_accepted": 295, - "total_code_lines_suggested": 1309 - }, - { - "name": "typescriptreact", - "total_engaged_users": 8, - "total_code_acceptances": 169, - "total_code_suggestions": 420, - "total_code_lines_accepted": 223, - "total_code_lines_suggested": 782 - }, - { - "name": "markdown", - "total_engaged_users": 10, - "total_code_acceptances": 90, - "total_code_suggestions": 857, - "total_code_lines_accepted": 97, - "total_code_lines_suggested": 1183 - }, - { - "name": "python", - "total_engaged_users": 3, - "total_code_acceptances": 94, - "total_code_suggestions": 232, - "total_code_lines_accepted": 126, - "total_code_lines_suggested": 333 - }, - { - "name": "unknown", - "total_engaged_users": 6, - "total_code_acceptances": 7, - "total_code_suggestions": 72, - "total_code_lines_accepted": 6, - "total_code_lines_suggested": 92 - }, - { - "name": "yaml", - "total_engaged_users": 12, - "total_code_acceptances": 99, - "total_code_suggestions": 404, - "total_code_lines_accepted": 160, - "total_code_lines_suggested": 622 - }, - { - "name": "scss", - "total_engaged_users": 4, - "total_code_acceptances": 28, - "total_code_suggestions": 107, - "total_code_lines_accepted": 49, - "total_code_lines_suggested": 223 - }, - { - "name": "javascript", - "total_engaged_users": 13, - "total_code_acceptances": 262, - "total_code_suggestions": 566, - "total_code_lines_accepted": 318, - "total_code_lines_suggested": 820 - }, - { - "name": "java", - "total_engaged_users": 3, - "total_code_acceptances": 12, - "total_code_suggestions": 49, - "total_code_lines_accepted": 24, - "total_code_lines_suggested": 120 - }, - { - "name": "json", - "total_engaged_users": 5, - "total_code_acceptances": 8, - "total_code_suggestions": 32, - "total_code_lines_accepted": 5, - "total_code_lines_suggested": 48 - }, - { - "name": "xml", - "total_engaged_users": 1, - "total_code_acceptances": 0, - "total_code_suggestions": 4, - "total_code_lines_accepted": 0, - "total_code_lines_suggested": 10 - }, - { - "name": "ini", - "total_engaged_users": 2, - "total_code_acceptances": 1, - "total_code_suggestions": 1, - "total_code_lines_accepted": 1, - "total_code_lines_suggested": 1 - }, - { - "name": "sql", - "total_engaged_users": 2, - "total_code_acceptances": 5, - "total_code_suggestions": 14, - "total_code_lines_accepted": 5, - "total_code_lines_suggested": 16 - }, - { - "name": "ruby", - "total_engaged_users": 10, - "total_code_acceptances": 139, - "total_code_suggestions": 343, - "total_code_lines_accepted": 167, - "total_code_lines_suggested": 657 - }, - { - "name": "shellscript", - "total_engaged_users": 4, - "total_code_acceptances": 14, - "total_code_suggestions": 65, - "total_code_lines_accepted": 16, - "total_code_lines_suggested": 75 - }, - { - "name": "html", - "total_engaged_users": 2, - "total_code_acceptances": 9, - "total_code_suggestions": 23, - "total_code_lines_accepted": 8, - "total_code_lines_suggested": 55 - }, - { - "name": "dotenv", - "total_engaged_users": 3, - "total_code_acceptances": 2, - "total_code_suggestions": 13, - "total_code_lines_accepted": 1, - "total_code_lines_suggested": 15 - }, - { - "name": "css", - "total_engaged_users": 2, - "total_code_acceptances": 23, - "total_code_suggestions": 76, - "total_code_lines_accepted": 31, - "total_code_lines_suggested": 139 - }, - { - "name": "jsonc", - "total_engaged_users": 1, - "total_code_acceptances": 0, - "total_code_suggestions": 4, - "total_code_lines_accepted": 0, - "total_code_lines_suggested": 7 - }, - { - "name": "cpp", - "total_engaged_users": 1, - "total_code_acceptances": 0, - "total_code_suggestions": 3, - "total_code_lines_accepted": 0, - "total_code_lines_suggested": 23 - }, - { - "name": "coffeescript", - "total_engaged_users": 1, - "total_code_acceptances": 0, - "total_code_suggestions": 5, - "total_code_lines_accepted": 0, - "total_code_lines_suggested": 9 - }, - { - "name": "go", - "total_engaged_users": 4, - "total_code_acceptances": 39, - "total_code_suggestions": 165, - "total_code_lines_accepted": 40, - "total_code_lines_suggested": 305 - }, - { - "name": "csharp", - "total_engaged_users": 4, - "total_code_acceptances": 42, - "total_code_suggestions": 124, - "total_code_lines_accepted": 55, - "total_code_lines_suggested": 366 - }, - { - "name": "razor", - "total_engaged_users": 1, - "total_code_acceptances": 0, - "total_code_suggestions": 7, - "total_code_lines_accepted": 0, - "total_code_lines_suggested": 20 - }, - { - "name": "svelte", - "total_engaged_users": 1, - "total_code_acceptances": 0, - "total_code_suggestions": 2, - "total_code_lines_accepted": 0, - "total_code_lines_suggested": 2 - }, - { - "name": "powershell", - "total_engaged_users": 3, - "total_code_acceptances": 15, - "total_code_suggestions": 70, - "total_code_lines_accepted": 26, - "total_code_lines_suggested": 93 - }, - { - "name": "terraform", - "total_engaged_users": 1, - "total_code_acceptances": 0, - "total_code_suggestions": 1, - "total_code_lines_accepted": 0, - "total_code_lines_suggested": 1 - }, - { - "name": "tex", - "total_engaged_users": 1, - "total_code_acceptances": 0, - "total_code_suggestions": 3, - "total_code_lines_accepted": 0, - "total_code_lines_suggested": 5 - }, - { - "name": "ql", - "total_engaged_users": 2, - "total_code_acceptances": 10, - "total_code_suggestions": 100, - "total_code_lines_accepted": 9, - "total_code_lines_suggested": 143 - }, - { - "name": "plaintext", - "total_engaged_users": 1, - "total_code_acceptances": 0, - "total_code_suggestions": 14, - "total_code_lines_accepted": 0, - "total_code_lines_suggested": 14 - }, - { - "name": "graphql", - "total_engaged_users": 2, - "total_code_acceptances": 2, - "total_code_suggestions": 2, - "total_code_lines_accepted": 2, - "total_code_lines_suggested": 2 - }, - { - "name": "groovy", - "total_engaged_users": 2, - "total_code_acceptances": 24, - "total_code_suggestions": 102, - "total_code_lines_accepted": 30, - "total_code_lines_suggested": 472 - } - ], - "is_custom_model": false, - "total_engaged_users": 65 - } - ], - "total_engaged_users": 65 - }, - { - "name": "JetBrains", - "models": [ - { - "name": "default", - "languages": [ - { - "name": "java", - "total_engaged_users": 3, - "total_code_acceptances": 31, - "total_code_suggestions": 54, - "total_code_lines_accepted": 53, - "total_code_lines_suggested": 130 - } - ], - "is_custom_model": false, - "total_engaged_users": 3 - } - ], - "total_engaged_users": 3 - }, - { - "name": "Neovim", - "models": [ - { - "name": "default", - "languages": [ - { - "name": "shellscript", - "total_engaged_users": 2, - "total_code_acceptances": 48, - "total_code_suggestions": 135, - "total_code_lines_accepted": 102, - "total_code_lines_suggested": 480 - }, - { - "name": "markdown", - "total_engaged_users": 2, - "total_code_acceptances": 68, - "total_code_suggestions": 231, - "total_code_lines_accepted": 80, - "total_code_lines_suggested": 806 - }, - { - "name": "yaml", - "total_engaged_users": 1, - "total_code_acceptances": 0, - "total_code_suggestions": 3, - "total_code_lines_accepted": 0, - "total_code_lines_suggested": 13 - }, - { - "name": "unknown", - "total_engaged_users": 1, - "total_code_acceptances": 0, - "total_code_suggestions": 2, - "total_code_lines_accepted": 0, - "total_code_lines_suggested": 2 - }, - { - "name": "dockerfile", - "total_engaged_users": 1, - "total_code_acceptances": 0, - "total_code_suggestions": 1, - "total_code_lines_accepted": 0, - "total_code_lines_suggested": 1 - }, - { - "name": "ruby", - "total_engaged_users": 2, - "total_code_acceptances": 33, - "total_code_suggestions": 99, - "total_code_lines_accepted": 33, - "total_code_lines_suggested": 238 - } - ], - "is_custom_model": false, - "total_engaged_users": 3 - } - ], - "total_engaged_users": 3 - }, - { - "name": "Vim", - "models": [ - { - "name": "default", - "languages": [ - { - "name": "unknown", - "total_engaged_users": 1, - "total_code_acceptances": 0, - "total_code_suggestions": 1, - "total_code_lines_accepted": 0, - "total_code_lines_suggested": 1 - } - ], - "is_custom_model": false, - "total_engaged_users": 1 - } - ], - "total_engaged_users": 1 - }, - { - "name": "VisualStudio", - "models": [ - { - "name": "default", - "languages": [ - { - "name": "cpp", - "total_engaged_users": 2, - "total_code_acceptances": 40, - "total_code_suggestions": 81, - "total_code_lines_accepted": 41, - "total_code_lines_suggested": 103 - }, - { - "name": "csharp", - "total_engaged_users": 2, - "total_code_acceptances": 3, - "total_code_suggestions": 12, - "total_code_lines_accepted": 6, - "total_code_lines_suggested": 32 - } - ], - "is_custom_model": false, - "total_engaged_users": 3 - } - ], - "total_engaged_users": 3 - } - ], - "total_engaged_users": 68 - } - }, - { - "date": "2024-11-01", - "copilot_ide_chat": { - "editors": [ - { - "name": "vscode", - "models": [ - { - "name": "default", - "total_chats": 1907, - "is_custom_model": false, - "total_engaged_users": 67, - "total_chat_copy_events": 85, - "total_chat_insertion_events": 63 - } - ], - "total_engaged_users": 67 - }, - { - "name": "JetBrains", - "models": [ - { - "name": "default", - "total_chats": 16, - "is_custom_model": false, - "total_engaged_users": 2, - "total_chat_copy_events": 1, - "total_chat_insertion_events": 1 - } - ], - "total_engaged_users": 2 - } - ], - "total_engaged_users": 69 - }, - "total_active_users": 104, - "copilot_dotcom_chat": { - "models": [ - { - "name": "default", - "total_chats": 67, - "is_custom_model": false, - "total_engaged_users": 19 - } - ], - "total_engaged_users": 19 - }, - "total_engaged_users": 104, - "copilot_dotcom_pull_requests": { - "repositories": [ - { - "name": "copilot-enterprise-demo", - "models": [ - { - "name": "default", - "is_custom_model": false, - "total_engaged_users": 1, - "total_pr_summaries_created": 2 - } - ], - "total_engaged_users": 1 - }, - { - "name": "himadri518-copilot-demo", - "models": [ - { - "name": "default", - "is_custom_model": false, - "total_engaged_users": 1, - "total_pr_summaries_created": 1 - } - ], - "total_engaged_users": 1 - }, - { - "name": "Elastic", - "models": [ - { - "name": "default", - "is_custom_model": false, - "total_engaged_users": 1, - "total_pr_summaries_created": 2 - } - ], - "total_engaged_users": 1 - }, - { - "name": "java-springboot-demo", - "models": [ - { - "name": "default", - "is_custom_model": false, - "total_engaged_users": 1, - "total_pr_summaries_created": 1 - } - ], - "total_engaged_users": 1 - }, - { - "name": "math-service", - "models": [ - { - "name": "default", - "is_custom_model": false, - "total_engaged_users": 1, - "total_pr_summaries_created": 4 - } - ], - "total_engaged_users": 1 - }, - { - "name": "yugen-saga-client", - "models": [ - { - "name": "default", - "is_custom_model": false, - "total_engaged_users": 1, - "total_pr_summaries_created": 1 - } - ], - "total_engaged_users": 1 - } - ], - "total_engaged_users": 6 - }, - "copilot_ide_code_completions": { - "editors": [ - { - "name": "vscode", - "models": [ - { - "name": "default", - "languages": [ - { - "name": "python", - "total_engaged_users": 7, - "total_code_acceptances": 127, - "total_code_suggestions": 378, - "total_code_lines_accepted": 182, - "total_code_lines_suggested": 626 - }, - { - "name": "csharp", - "total_engaged_users": 2, - "total_code_acceptances": 23, - "total_code_suggestions": 80, - "total_code_lines_accepted": 24, - "total_code_lines_suggested": 194 - }, - { - "name": "javascript", - "total_engaged_users": 15, - "total_code_acceptances": 105, - "total_code_suggestions": 288, - "total_code_lines_accepted": 149, - "total_code_lines_suggested": 674 - }, - { - "name": "razor", - "total_engaged_users": 2, - "total_code_acceptances": 5, - "total_code_suggestions": 12, - "total_code_lines_accepted": 7, - "total_code_lines_suggested": 36 - }, - { - "name": "shellscript", - "total_engaged_users": 4, - "total_code_acceptances": 18, - "total_code_suggestions": 70, - "total_code_lines_accepted": 21, - "total_code_lines_suggested": 83 - }, - { - "name": "unknown", - "total_engaged_users": 9, - "total_code_acceptances": 31, - "total_code_suggestions": 289, - "total_code_lines_accepted": 35, - "total_code_lines_suggested": 374 - }, - { - "name": "markdown", - "total_engaged_users": 12, - "total_code_acceptances": 91, - "total_code_suggestions": 1174, - "total_code_lines_accepted": 102, - "total_code_lines_suggested": 1636 - }, - { - "name": "ruby", - "total_engaged_users": 11, - "total_code_acceptances": 288, - "total_code_suggestions": 776, - "total_code_lines_accepted": 292, - "total_code_lines_suggested": 1166 - }, - { - "name": "html", - "total_engaged_users": 7, - "total_code_acceptances": 25, - "total_code_suggestions": 91, - "total_code_lines_accepted": 72, - "total_code_lines_suggested": 233 - }, - { - "name": "css", - "total_engaged_users": 4, - "total_code_acceptances": 18, - "total_code_suggestions": 53, - "total_code_lines_accepted": 20, - "total_code_lines_suggested": 115 - }, - { - "name": "yaml", - "total_engaged_users": 7, - "total_code_acceptances": 21, - "total_code_suggestions": 132, - "total_code_lines_accepted": 19, - "total_code_lines_suggested": 222 - }, - { - "name": "javascriptreact", - "total_engaged_users": 2, - "total_code_acceptances": 1, - "total_code_suggestions": 2, - "total_code_lines_accepted": 0, - "total_code_lines_suggested": 2 - }, - { - "name": "typescript", - "total_engaged_users": 9, - "total_code_acceptances": 434, - "total_code_suggestions": 1219, - "total_code_lines_accepted": 502, - "total_code_lines_suggested": 1999 - }, - { - "name": "java", - "total_engaged_users": 6, - "total_code_acceptances": 51, - "total_code_suggestions": 138, - "total_code_lines_accepted": 71, - "total_code_lines_suggested": 279 - }, - { - "name": "cpp", - "total_engaged_users": 2, - "total_code_acceptances": 19, - "total_code_suggestions": 22, - "total_code_lines_accepted": 75, - "total_code_lines_suggested": 83 - }, - { - "name": "dotenv", - "total_engaged_users": 1, - "total_code_acceptances": 0, - "total_code_suggestions": 1, - "total_code_lines_accepted": 0, - "total_code_lines_suggested": 1 - }, - { - "name": "xml", - "total_engaged_users": 3, - "total_code_acceptances": 5, - "total_code_suggestions": 17, - "total_code_lines_accepted": 27, - "total_code_lines_suggested": 54 - }, - { - "name": "vue", - "total_engaged_users": 2, - "total_code_acceptances": 2, - "total_code_suggestions": 11, - "total_code_lines_accepted": 1, - "total_code_lines_suggested": 13 - }, - { - "name": "dockerfile", - "total_engaged_users": 3, - "total_code_acceptances": 2, - "total_code_suggestions": 13, - "total_code_lines_accepted": 2, - "total_code_lines_suggested": 15 - }, - { - "name": "ql", - "total_engaged_users": 4, - "total_code_acceptances": 40, - "total_code_suggestions": 287, - "total_code_lines_accepted": 69, - "total_code_lines_suggested": 649 - }, - { - "name": "typescriptreact", - "total_engaged_users": 7, - "total_code_acceptances": 93, - "total_code_suggestions": 286, - "total_code_lines_accepted": 78, - "total_code_lines_suggested": 432 - }, - { - "name": "jsonc", - "total_engaged_users": 1, - "total_code_acceptances": 0, - "total_code_suggestions": 5, - "total_code_lines_accepted": 0, - "total_code_lines_suggested": 6 - }, - { - "name": "json", - "total_engaged_users": 3, - "total_code_acceptances": 4, - "total_code_suggestions": 24, - "total_code_lines_accepted": 4, - "total_code_lines_suggested": 72 - }, - { - "name": "sql", - "total_engaged_users": 2, - "total_code_acceptances": 1, - "total_code_suggestions": 6, - "total_code_lines_accepted": 0, - "total_code_lines_suggested": 26 - }, - { - "name": "scss", - "total_engaged_users": 4, - "total_code_acceptances": 22, - "total_code_suggestions": 108, - "total_code_lines_accepted": 17, - "total_code_lines_suggested": 186 - }, - { - "name": "groovy", - "total_engaged_users": 1, - "total_code_acceptances": 0, - "total_code_suggestions": 4, - "total_code_lines_accepted": 0, - "total_code_lines_suggested": 66 - }, - { - "name": "svelte", - "total_engaged_users": 2, - "total_code_acceptances": 8, - "total_code_suggestions": 18, - "total_code_lines_accepted": 6, - "total_code_lines_suggested": 44 - }, - { - "name": "kusto", - "total_engaged_users": 2, - "total_code_acceptances": 1, - "total_code_suggestions": 6, - "total_code_lines_accepted": 1, - "total_code_lines_suggested": 17 - }, - { - "name": "go", - "total_engaged_users": 2, - "total_code_acceptances": 4, - "total_code_suggestions": 12, - "total_code_lines_accepted": 3, - "total_code_lines_suggested": 13 - }, - { - "name": "powershell", - "total_engaged_users": 2, - "total_code_acceptances": 17, - "total_code_suggestions": 28, - "total_code_lines_accepted": 17, - "total_code_lines_suggested": 31 - }, - { - "name": "scala", - "total_engaged_users": 2, - "total_code_acceptances": 5, - "total_code_suggestions": 15, - "total_code_lines_accepted": 6, - "total_code_lines_suggested": 32 - }, - { - "name": "graphql", - "total_engaged_users": 1, - "total_code_acceptances": 0, - "total_code_suggestions": 5, - "total_code_lines_accepted": 0, - "total_code_lines_suggested": 5 - }, - { - "name": "perl", - "total_engaged_users": 1, - "total_code_acceptances": 0, - "total_code_suggestions": 11, - "total_code_lines_accepted": 0, - "total_code_lines_suggested": 18 - } - ], - "is_custom_model": false, - "total_engaged_users": 61 - } - ], - "total_engaged_users": 61 - }, - { - "name": "JetBrains", - "models": [ - { - "name": "default", - "languages": [ - { - "name": "dockerfile", - "total_engaged_users": 1, - "total_code_acceptances": 0, - "total_code_suggestions": 1, - "total_code_lines_accepted": 0, - "total_code_lines_suggested": 1 - } - ], - "is_custom_model": false, - "total_engaged_users": 1 - } - ], - "total_engaged_users": 1 - }, - { - "name": "VisualStudio", - "models": [ - { - "name": "default", - "languages": [ - { - "name": "cpp", - "total_engaged_users": 2, - "total_code_acceptances": 11, - "total_code_suggestions": 31, - "total_code_lines_accepted": 11, - "total_code_lines_suggested": 31 - } - ], - "is_custom_model": false, - "total_engaged_users": 2 - } - ], - "total_engaged_users": 2 - }, - { - "name": "Neovim", - "models": [ - { - "name": "default", - "languages": [ - { - "name": "rust", - "total_engaged_users": 1, - "total_code_acceptances": 0, - "total_code_suggestions": 1, - "total_code_lines_accepted": 0, - "total_code_lines_suggested": 1 - }, - { - "name": "ruby", - "total_engaged_users": 1, - "total_code_acceptances": 0, - "total_code_suggestions": 7, - "total_code_lines_accepted": 0, - "total_code_lines_suggested": 8 - } - ], - "is_custom_model": false, - "total_engaged_users": 1 - } - ], - "total_engaged_users": 1 - } - ], - "total_engaged_users": 62 - } - }, - { - "date": "2024-11-02", - "copilot_ide_chat": { - "editors": [ - { - "name": "vscode", - "models": [ - { - "name": "default", - "total_chats": 760, - "is_custom_model": false, - "total_engaged_users": 30, - "total_chat_copy_events": 32, - "total_chat_insertion_events": 19 - } - ], - "total_engaged_users": 30 - } - ], - "total_engaged_users": 30 - }, - "total_active_users": 46, - "copilot_dotcom_chat": { - "models": [ - { - "name": "default", - "total_chats": 9, - "is_custom_model": false, - "total_engaged_users": 3 - } - ], - "total_engaged_users": 3 - }, - "total_engaged_users": 46, - "copilot_dotcom_pull_requests": { - "repositories": [ - { - "name": "platform-field", - "models": [ - { - "name": "default", - "is_custom_model": false, - "total_engaged_users": 1, - "total_pr_summaries_created": 1 - } - ], - "total_engaged_users": 1 - }, - { - "name": "aitour-advanced-coding-visual-studio-code-and-github-copilot", - "models": [ - { - "name": "default", - "is_custom_model": false, - "total_engaged_users": 1, - "total_pr_summaries_created": 4 - } - ], - "total_engaged_users": 1 - }, - { - "name": "vitest-coverage-report-action", - "models": [ - { - "name": "default", - "is_custom_model": false, - "total_engaged_users": 1, - "total_pr_summaries_created": 1 - } - ], - "total_engaged_users": 1 - } - ], - "total_engaged_users": 3 - }, - "copilot_ide_code_completions": { - "editors": [ - { - "name": "vscode", - "models": [ - { - "name": "default", - "languages": [ - { - "name": "python", - "total_engaged_users": 6, - "total_code_acceptances": 311, - "total_code_suggestions": 742, - "total_code_lines_accepted": 430, - "total_code_lines_suggested": 1515 - }, - { - "name": "scss", - "total_engaged_users": 4, - "total_code_acceptances": 19, - "total_code_suggestions": 72, - "total_code_lines_accepted": 32, - "total_code_lines_suggested": 137 - }, - { - "name": "typescript", - "total_engaged_users": 6, - "total_code_acceptances": 127, - "total_code_suggestions": 248, - "total_code_lines_accepted": 234, - "total_code_lines_suggested": 454 - }, - { - "name": "javascript", - "total_engaged_users": 5, - "total_code_acceptances": 45, - "total_code_suggestions": 189, - "total_code_lines_accepted": 35, - "total_code_lines_suggested": 282 - }, - { - "name": "yaml", - "total_engaged_users": 6, - "total_code_acceptances": 41, - "total_code_suggestions": 152, - "total_code_lines_accepted": 67, - "total_code_lines_suggested": 256 - }, - { - "name": "jsonc", - "total_engaged_users": 1, - "total_code_acceptances": 0, - "total_code_suggestions": 3, - "total_code_lines_accepted": 0, - "total_code_lines_suggested": 3 - }, - { - "name": "csharp", - "total_engaged_users": 3, - "total_code_acceptances": 16, - "total_code_suggestions": 32, - "total_code_lines_accepted": 10, - "total_code_lines_suggested": 34 - }, - { - "name": "json", - "total_engaged_users": 4, - "total_code_acceptances": 4, - "total_code_suggestions": 21, - "total_code_lines_accepted": 4, - "total_code_lines_suggested": 29 - }, - { - "name": "unknown", - "total_engaged_users": 6, - "total_code_acceptances": 18, - "total_code_suggestions": 41, - "total_code_lines_accepted": 22, - "total_code_lines_suggested": 59 - }, - { - "name": "markdown", - "total_engaged_users": 2, - "total_code_acceptances": 71, - "total_code_suggestions": 718, - "total_code_lines_accepted": 101, - "total_code_lines_suggested": 1453 - }, - { - "name": "html", - "total_engaged_users": 3, - "total_code_acceptances": 35, - "total_code_suggestions": 120, - "total_code_lines_accepted": 43, - "total_code_lines_suggested": 281 - }, - { - "name": "ruby", - "total_engaged_users": 5, - "total_code_acceptances": 77, - "total_code_suggestions": 229, - "total_code_lines_accepted": 107, - "total_code_lines_suggested": 383 - }, - { - "name": "xml", - "total_engaged_users": 2, - "total_code_acceptances": 8, - "total_code_suggestions": 13, - "total_code_lines_accepted": 8, - "total_code_lines_suggested": 19 - }, - { - "name": "typescriptreact", - "total_engaged_users": 6, - "total_code_acceptances": 123, - "total_code_suggestions": 343, - "total_code_lines_accepted": 70, - "total_code_lines_suggested": 498 - }, - { - "name": "css", - "total_engaged_users": 4, - "total_code_acceptances": 23, - "total_code_suggestions": 76, - "total_code_lines_accepted": 40, - "total_code_lines_suggested": 264 - }, - { - "name": "dockerfile", - "total_engaged_users": 1, - "total_code_acceptances": 0, - "total_code_suggestions": 3, - "total_code_lines_accepted": 0, - "total_code_lines_suggested": 4 - }, - { - "name": "shellscript", - "total_engaged_users": 1, - "total_code_acceptances": 0, - "total_code_suggestions": 4, - "total_code_lines_accepted": 0, - "total_code_lines_suggested": 5 - }, - { - "name": "ql", - "total_engaged_users": 2, - "total_code_acceptances": 24, - "total_code_suggestions": 109, - "total_code_lines_accepted": 72, - "total_code_lines_suggested": 260 - }, - { - "name": "java", - "total_engaged_users": 3, - "total_code_acceptances": 9, - "total_code_suggestions": 40, - "total_code_lines_accepted": 8, - "total_code_lines_suggested": 50 - } - ], - "is_custom_model": false, - "total_engaged_users": 34 - } - ], - "total_engaged_users": 34 - }, - { - "name": "JetBrains", - "models": [ - { - "name": "default", - "languages": [ - { - "name": "ini", - "total_engaged_users": 2, - "total_code_acceptances": 1, - "total_code_suggestions": 3, - "total_code_lines_accepted": 1, - "total_code_lines_suggested": 6 - }, - { - "name": "xml", - "total_engaged_users": 2, - "total_code_acceptances": 3, - "total_code_suggestions": 13, - "total_code_lines_accepted": 4, - "total_code_lines_suggested": 47 - }, - { - "name": "java", - "total_engaged_users": 2, - "total_code_acceptances": 2, - "total_code_suggestions": 6, - "total_code_lines_accepted": 2, - "total_code_lines_suggested": 6 - } - ], - "is_custom_model": false, - "total_engaged_users": 2 - } - ], - "total_engaged_users": 2 - }, - { - "name": "VisualStudio", - "models": [ - { - "name": "default", - "languages": [ - { - "name": "cpp", - "total_engaged_users": 2, - "total_code_acceptances": 16, - "total_code_suggestions": 66, - "total_code_lines_accepted": 19, - "total_code_lines_suggested": 115 - } - ], - "is_custom_model": false, - "total_engaged_users": 2 - } - ], - "total_engaged_users": 2 - } - ], - "total_engaged_users": 35 - } - }, - { - "date": "2024-11-03", - "copilot_ide_chat": { - "editors": [ - { - "name": "vscode", - "models": [ - { - "name": "default", - "total_chats": 1417, - "is_custom_model": false, - "total_engaged_users": 33, - "total_chat_copy_events": 15, - "total_chat_insertion_events": 44 - } - ], - "total_engaged_users": 33 - }, - { - "name": "JetBrains", - "models": [ - { - "name": "default", - "total_chats": 4, - "is_custom_model": false, - "total_engaged_users": 1, - "total_chat_copy_events": 1, - "total_chat_insertion_events": 2 - } - ], - "total_engaged_users": 1 - } - ], - "total_engaged_users": 33 - }, - "total_active_users": 47, - "copilot_dotcom_chat": { - "models": [ - { - "name": "default", - "total_chats": 7, - "is_custom_model": false, - "total_engaged_users": 4 - } - ], - "total_engaged_users": 4 - }, - "total_engaged_users": 47, - "copilot_dotcom_pull_requests": { - "repositories": [ - { - "name": "windr-front", - "models": [ - { - "name": "default", - "is_custom_model": false, - "total_engaged_users": 1, - "total_pr_summaries_created": 2 - } - ], - "total_engaged_users": 1 - }, - { - "name": "", - "models": [ - { - "name": "default", - "is_custom_model": false, - "total_engaged_users": 1, - "total_pr_summaries_created": 4 - } - ], - "total_engaged_users": 1 - } - ], - "total_engaged_users": 2 - }, - "copilot_ide_code_completions": { - "editors": [ - { - "name": "vscode", - "models": [ - { - "name": "default", - "languages": [ - { - "name": "unknown", - "total_engaged_users": 5, - "total_code_acceptances": 12, - "total_code_suggestions": 77, - "total_code_lines_accepted": 10, - "total_code_lines_suggested": 92 - }, - { - "name": "javascript", - "total_engaged_users": 7, - "total_code_acceptances": 42, - "total_code_suggestions": 139, - "total_code_lines_accepted": 96, - "total_code_lines_suggested": 351 - }, - { - "name": "shellscript", - "total_engaged_users": 4, - "total_code_acceptances": 9, - "total_code_suggestions": 57, - "total_code_lines_accepted": 7, - "total_code_lines_suggested": 62 - }, - { - "name": "json", - "total_engaged_users": 5, - "total_code_acceptances": 14, - "total_code_suggestions": 89, - "total_code_lines_accepted": 18, - "total_code_lines_suggested": 206 - }, - { - "name": "markdown", - "total_engaged_users": 5, - "total_code_acceptances": 78, - "total_code_suggestions": 605, - "total_code_lines_accepted": 92, - "total_code_lines_suggested": 837 - }, - { - "name": "go", - "total_engaged_users": 2, - "total_code_acceptances": 61, - "total_code_suggestions": 91, - "total_code_lines_accepted": 86, - "total_code_lines_suggested": 149 - }, - { - "name": "xml", - "total_engaged_users": 2, - "total_code_acceptances": 7, - "total_code_suggestions": 18, - "total_code_lines_accepted": 9, - "total_code_lines_suggested": 35 - }, - { - "name": "yaml", - "total_engaged_users": 6, - "total_code_acceptances": 27, - "total_code_suggestions": 87, - "total_code_lines_accepted": 35, - "total_code_lines_suggested": 308 - }, - { - "name": "python", - "total_engaged_users": 4, - "total_code_acceptances": 340, - "total_code_suggestions": 809, - "total_code_lines_accepted": 381, - "total_code_lines_suggested": 1454 - }, - { - "name": "typescriptreact", - "total_engaged_users": 6, - "total_code_acceptances": 134, - "total_code_suggestions": 298, - "total_code_lines_accepted": 164, - "total_code_lines_suggested": 528 - }, - { - "name": "css", - "total_engaged_users": 3, - "total_code_acceptances": 4, - "total_code_suggestions": 19, - "total_code_lines_accepted": 4, - "total_code_lines_suggested": 64 - }, - { - "name": "ruby", - "total_engaged_users": 3, - "total_code_acceptances": 46, - "total_code_suggestions": 191, - "total_code_lines_accepted": 31, - "total_code_lines_suggested": 253 - }, - { - "name": "powershell", - "total_engaged_users": 2, - "total_code_acceptances": 14, - "total_code_suggestions": 59, - "total_code_lines_accepted": 9, - "total_code_lines_suggested": 91 - }, - { - "name": "jsonc", - "total_engaged_users": 5, - "total_code_acceptances": 7, - "total_code_suggestions": 23, - "total_code_lines_accepted": 10, - "total_code_lines_suggested": 34 - }, - { - "name": "typescript", - "total_engaged_users": 9, - "total_code_acceptances": 232, - "total_code_suggestions": 539, - "total_code_lines_accepted": 316, - "total_code_lines_suggested": 810 - }, - { - "name": "scss", - "total_engaged_users": 3, - "total_code_acceptances": 27, - "total_code_suggestions": 136, - "total_code_lines_accepted": 32, - "total_code_lines_suggested": 236 - }, - { - "name": "java", - "total_engaged_users": 2, - "total_code_acceptances": 13, - "total_code_suggestions": 24, - "total_code_lines_accepted": 17, - "total_code_lines_suggested": 60 - }, - { - "name": "svelte", - "total_engaged_users": 2, - "total_code_acceptances": 3, - "total_code_suggestions": 3, - "total_code_lines_accepted": 1, - "total_code_lines_suggested": 3 - }, - { - "name": "dotenv", - "total_engaged_users": 1, - "total_code_acceptances": 0, - "total_code_suggestions": 2, - "total_code_lines_accepted": 0, - "total_code_lines_suggested": 2 - }, - { - "name": "csharp", - "total_engaged_users": 3, - "total_code_acceptances": 27, - "total_code_suggestions": 93, - "total_code_lines_accepted": 45, - "total_code_lines_suggested": 301 - }, - { - "name": "ql", - "total_engaged_users": 2, - "total_code_acceptances": 175, - "total_code_suggestions": 641, - "total_code_lines_accepted": 343, - "total_code_lines_suggested": 1514 - }, - { - "name": "rust", - "total_engaged_users": 2, - "total_code_acceptances": 19, - "total_code_suggestions": 55, - "total_code_lines_accepted": 24, - "total_code_lines_suggested": 94 - } - ], - "is_custom_model": false, - "total_engaged_users": 33 - } - ], - "total_engaged_users": 33 - }, - { - "name": "Xcode", - "models": [ - { - "name": "default", - "languages": [ - { - "name": "swift", - "total_engaged_users": 2, - "total_code_acceptances": 9, - "total_code_suggestions": 15, - "total_code_lines_accepted": 6, - "total_code_lines_suggested": 88 - } - ], - "is_custom_model": false, - "total_engaged_users": 2 - } - ], - "total_engaged_users": 2 - }, - { - "name": "JetBrains", - "models": [ - { - "name": "default", - "languages": [ - { - "name": "sql", - "total_engaged_users": 2, - "total_code_acceptances": 3, - "total_code_suggestions": 14, - "total_code_lines_accepted": 8, - "total_code_lines_suggested": 64 - } - ], - "is_custom_model": false, - "total_engaged_users": 2 - } - ], - "total_engaged_users": 2 - }, - { - "name": "VisualStudio", - "models": [ - { - "name": "default", - "languages": [ - { - "name": "yaml", - "total_engaged_users": 2, - "total_code_acceptances": 6, - "total_code_suggestions": 10, - "total_code_lines_accepted": 6, - "total_code_lines_suggested": 10 - }, - { - "name": "cpp", - "total_engaged_users": 2, - "total_code_acceptances": 71, - "total_code_suggestions": 236, - "total_code_lines_accepted": 156, - "total_code_lines_suggested": 736 - }, - { - "name": "csharp", - "total_engaged_users": 1, - "total_code_acceptances": 0, - "total_code_suggestions": 1, - "total_code_lines_accepted": 0, - "total_code_lines_suggested": 1 - }, - { - "name": "c/c++", - "total_engaged_users": 2, - "total_code_acceptances": 2, - "total_code_suggestions": 13, - "total_code_lines_accepted": 2, - "total_code_lines_suggested": 22 - } - ], - "is_custom_model": false, - "total_engaged_users": 3 - } - ], - "total_engaged_users": 3 - } - ], - "total_engaged_users": 36 - } - }, - { - "date": "2024-11-04", - "copilot_ide_chat": { - "editors": [ - { - "name": "vscode", - "models": [ - { - "name": "default", - "total_chats": 2191, - "is_custom_model": false, - "total_engaged_users": 103, - "total_chat_copy_events": 131, - "total_chat_insertion_events": 37 - } - ], - "total_engaged_users": 103 - }, - { - "name": "JetBrains", - "models": [ - { - "name": "default", - "total_chats": 52, - "is_custom_model": false, - "total_engaged_users": 6, - "total_chat_copy_events": 7, - "total_chat_insertion_events": 8 - } - ], - "total_engaged_users": 6 - } - ], - "total_engaged_users": 107 - }, - "total_active_users": 151, - "copilot_dotcom_chat": { - "models": [ - { - "name": "default", - "total_chats": 174, - "is_custom_model": false, - "total_engaged_users": 44 - } - ], - "total_engaged_users": 44 - }, - "total_engaged_users": 151, - "copilot_dotcom_pull_requests": { - "repositories": [ - { - "name": "github-webhook-dispatcher", - "models": [ - { - "name": "default", - "is_custom_model": false, - "total_engaged_users": 1, - "total_pr_summaries_created": 1 - } - ], - "total_engaged_users": 1 - }, - { - "name": "sandbox", - "models": [ - { - "name": "default", - "is_custom_model": false, - "total_engaged_users": 1, - "total_pr_summaries_created": 1 - } - ], - "total_engaged_users": 1 - }, - { - "name": "JackGKafaty_GitHubAdvancedSecurity", - "models": [ - { - "name": "default", - "is_custom_model": false, - "total_engaged_users": 1, - "total_pr_summaries_created": 2 - } - ], - "total_engaged_users": 1 - }, - { - "name": "memcache", - "models": [ - { - "name": "default", - "is_custom_model": false, - "total_engaged_users": 1, - "total_pr_summaries_created": 1 - } - ], - "total_engaged_users": 1 - }, - { - "name": "haikus-for-june", - "models": [ - { - "name": "default", - "is_custom_model": false, - "total_engaged_users": 1, - "total_pr_summaries_created": 2 - } - ], - "total_engaged_users": 1 - }, - { - "name": "ldennington-ghas-template", - "models": [ - { - "name": "default", - "is_custom_model": false, - "total_engaged_users": 1, - "total_pr_summaries_created": 1 - } - ], - "total_engaged_users": 1 - }, - { - "name": "howie-config", - "models": [ - { - "name": "default", - "is_custom_model": false, - "total_engaged_users": 1, - "total_pr_summaries_created": 1 - } - ], - "total_engaged_users": 1 - }, - { - "name": "Infosys", - "models": [ - { - "name": "default", - "is_custom_model": false, - "total_engaged_users": 1, - "total_pr_summaries_created": 2 - } - ], - "total_engaged_users": 1 - }, - { - "name": "purple-world", - "models": [ - { - "name": "default", - "is_custom_model": false, - "total_engaged_users": 1, - "total_pr_summaries_created": 0 - } - ], - "total_engaged_users": 1 - }, - { - "name": "math-more-math", - "models": [ - { - "name": "default", - "is_custom_model": false, - "total_engaged_users": 1, - "total_pr_summaries_created": 2 - } - ], - "total_engaged_users": 1 - }, - { - "name": "gh-skyline", - "models": [ - { - "name": "default", - "is_custom_model": false, - "total_engaged_users": 1, - "total_pr_summaries_created": 1 - } - ], - "total_engaged_users": 1 - }, - { - "name": "platform-field", - "models": [ - { - "name": "default", - "is_custom_model": false, - "total_engaged_users": 1, - "total_pr_summaries_created": 1 - } - ], - "total_engaged_users": 1 - }, - { - "name": "actions-rate-limit-reporter", - "models": [ - { - "name": "default", - "is_custom_model": false, - "total_engaged_users": 1, - "total_pr_summaries_created": 1 - } - ], - "total_engaged_users": 1 - }, - { - "name": "giant-rats-edeka", - "models": [ - { - "name": "default", - "is_custom_model": false, - "total_engaged_users": 1, - "total_pr_summaries_created": 2 - } - ], - "total_engaged_users": 1 - }, - { - "name": "special-octo-meat", - "models": [ - { - "name": "default", - "is_custom_model": false, - "total_engaged_users": 1, - "total_pr_summaries_created": 1 - } - ], - "total_engaged_users": 1 - }, - { - "name": "", - "models": [ - { - "name": "default", - "is_custom_model": false, - "total_engaged_users": 1, - "total_pr_summaries_created": 2 - } - ], - "total_engaged_users": 1 - } - ], - "total_engaged_users": 13 - }, - "copilot_ide_code_completions": { - "editors": [ - { - "name": "vscode", - "models": [ - { - "name": "default", - "languages": [ - { - "name": "ruby", - "total_engaged_users": 10, - "total_code_acceptances": 154, - "total_code_suggestions": 516, - "total_code_lines_accepted": 122, - "total_code_lines_suggested": 710 - }, - { - "name": "markdown", - "total_engaged_users": 22, - "total_code_acceptances": 135, - "total_code_suggestions": 1332, - "total_code_lines_accepted": 142, - "total_code_lines_suggested": 1725 - }, - { - "name": "dotenv", - "total_engaged_users": 2, - "total_code_acceptances": 1, - "total_code_suggestions": 8, - "total_code_lines_accepted": 1, - "total_code_lines_suggested": 8 - }, - { - "name": "unknown", - "total_engaged_users": 6, - "total_code_acceptances": 25, - "total_code_suggestions": 235, - "total_code_lines_accepted": 28, - "total_code_lines_suggested": 315 - }, - { - "name": "typescriptreact", - "total_engaged_users": 10, - "total_code_acceptances": 180, - "total_code_suggestions": 537, - "total_code_lines_accepted": 178, - "total_code_lines_suggested": 1252 - }, - { - "name": "yaml", - "total_engaged_users": 5, - "total_code_acceptances": 19, - "total_code_suggestions": 111, - "total_code_lines_accepted": 25, - "total_code_lines_suggested": 164 - }, - { - "name": "github-issues", - "total_engaged_users": 2, - "total_code_acceptances": 3, - "total_code_suggestions": 13, - "total_code_lines_accepted": 1, - "total_code_lines_suggested": 16 - }, - { - "name": "json", - "total_engaged_users": 5, - "total_code_acceptances": 13, - "total_code_suggestions": 42, - "total_code_lines_accepted": 19, - "total_code_lines_suggested": 67 - }, - { - "name": "python", - "total_engaged_users": 11, - "total_code_acceptances": 203, - "total_code_suggestions": 556, - "total_code_lines_accepted": 240, - "total_code_lines_suggested": 940 - }, - { - "name": "javascript", - "total_engaged_users": 11, - "total_code_acceptances": 56, - "total_code_suggestions": 156, - "total_code_lines_accepted": 107, - "total_code_lines_suggested": 302 - }, - { - "name": "xml", - "total_engaged_users": 4, - "total_code_acceptances": 12, - "total_code_suggestions": 20, - "total_code_lines_accepted": 24, - "total_code_lines_suggested": 37 - }, - { - "name": "typescript", - "total_engaged_users": 16, - "total_code_acceptances": 663, - "total_code_suggestions": 1752, - "total_code_lines_accepted": 741, - "total_code_lines_suggested": 2744 - }, - { - "name": "java", - "total_engaged_users": 5, - "total_code_acceptances": 20, - "total_code_suggestions": 55, - "total_code_lines_accepted": 34, - "total_code_lines_suggested": 111 - }, - { - "name": "ini", - "total_engaged_users": 1, - "total_code_acceptances": 0, - "total_code_suggestions": 3, - "total_code_lines_accepted": 0, - "total_code_lines_suggested": 3 - }, - { - "name": "html", - "total_engaged_users": 3, - "total_code_acceptances": 11, - "total_code_suggestions": 31, - "total_code_lines_accepted": 9, - "total_code_lines_suggested": 81 - }, - { - "name": "css", - "total_engaged_users": 6, - "total_code_acceptances": 11, - "total_code_suggestions": 63, - "total_code_lines_accepted": 5, - "total_code_lines_suggested": 198 - }, - { - "name": "csharp", - "total_engaged_users": 5, - "total_code_acceptances": 38, - "total_code_suggestions": 113, - "total_code_lines_accepted": 85, - "total_code_lines_suggested": 399 - }, - { - "name": "jsonc", - "total_engaged_users": 3, - "total_code_acceptances": 4, - "total_code_suggestions": 20, - "total_code_lines_accepted": 6, - "total_code_lines_suggested": 60 - }, - { - "name": "sql", - "total_engaged_users": 3, - "total_code_acceptances": 3, - "total_code_suggestions": 26, - "total_code_lines_accepted": 1, - "total_code_lines_suggested": 31 - }, - { - "name": "dockerfile", - "total_engaged_users": 1, - "total_code_acceptances": 0, - "total_code_suggestions": 2, - "total_code_lines_accepted": 0, - "total_code_lines_suggested": 2 - }, - { - "name": "plaintext", - "total_engaged_users": 1, - "total_code_acceptances": 0, - "total_code_suggestions": 35, - "total_code_lines_accepted": 0, - "total_code_lines_suggested": 39 - }, - { - "name": "scss", - "total_engaged_users": 3, - "total_code_acceptances": 17, - "total_code_suggestions": 46, - "total_code_lines_accepted": 41, - "total_code_lines_suggested": 115 - }, - { - "name": "ql", - "total_engaged_users": 2, - "total_code_acceptances": 15, - "total_code_suggestions": 81, - "total_code_lines_accepted": 9, - "total_code_lines_suggested": 141 - }, - { - "name": "perl", - "total_engaged_users": 1, - "total_code_acceptances": 0, - "total_code_suggestions": 9, - "total_code_lines_accepted": 0, - "total_code_lines_suggested": 12 - }, - { - "name": "go", - "total_engaged_users": 4, - "total_code_acceptances": 62, - "total_code_suggestions": 179, - "total_code_lines_accepted": 46, - "total_code_lines_suggested": 250 - }, - { - "name": "powershell", - "total_engaged_users": 1, - "total_code_acceptances": 0, - "total_code_suggestions": 5, - "total_code_lines_accepted": 0, - "total_code_lines_suggested": 5 - }, - { - "name": "cpp", - "total_engaged_users": 1, - "total_code_acceptances": 0, - "total_code_suggestions": 1, - "total_code_lines_accepted": 0, - "total_code_lines_suggested": 1 - } - ], - "is_custom_model": false, - "total_engaged_users": 78 - } - ], - "total_engaged_users": 78 - }, - { - "name": "JetBrains", - "models": [ - { - "name": "default", - "languages": [ - { - "name": "unknown", - "total_engaged_users": 2, - "total_code_acceptances": 2, - "total_code_suggestions": 3, - "total_code_lines_accepted": 4, - "total_code_lines_suggested": 5 - }, - { - "name": "csharp", - "total_engaged_users": 2, - "total_code_acceptances": 25, - "total_code_suggestions": 84, - "total_code_lines_accepted": 53, - "total_code_lines_suggested": 474 - }, - { - "name": "typescriptreact", - "total_engaged_users": 1, - "total_code_acceptances": 0, - "total_code_suggestions": 1, - "total_code_lines_accepted": 0, - "total_code_lines_suggested": 4 - }, - { - "name": "typescript", - "total_engaged_users": 2, - "total_code_acceptances": 1, - "total_code_suggestions": 8, - "total_code_lines_accepted": 0, - "total_code_lines_suggested": 14 - }, - { - "name": "java", - "total_engaged_users": 2, - "total_code_acceptances": 74, - "total_code_suggestions": 145, - "total_code_lines_accepted": 151, - "total_code_lines_suggested": 573 - }, - { - "name": "xml", - "total_engaged_users": 2, - "total_code_acceptances": 1, - "total_code_suggestions": 3, - "total_code_lines_accepted": 12, - "total_code_lines_suggested": 14 - } - ], - "is_custom_model": false, - "total_engaged_users": 5 - } - ], - "total_engaged_users": 5 - }, - { - "name": "Neovim", - "models": [ - { - "name": "default", - "languages": [ - { - "name": "ruby", - "total_engaged_users": 2, - "total_code_acceptances": 9, - "total_code_suggestions": 27, - "total_code_lines_accepted": 9, - "total_code_lines_suggested": 70 - } - ], - "is_custom_model": false, - "total_engaged_users": 2 - } - ], - "total_engaged_users": 2 - }, - { - "name": "VisualStudio", - "models": [ - { - "name": "default", - "languages": [ - { - "name": "fsharp", - "total_engaged_users": 2, - "total_code_acceptances": 17, - "total_code_suggestions": 45, - "total_code_lines_accepted": 26, - "total_code_lines_suggested": 60 - } - ], - "is_custom_model": false, - "total_engaged_users": 2 - } - ], - "total_engaged_users": 2 - }, - { - "name": "Xcode", - "models": [ - { - "name": "default", - "languages": [ - { - "name": "swift", - "total_engaged_users": 2, - "total_code_acceptances": 3, - "total_code_suggestions": 4, - "total_code_lines_accepted": 5, - "total_code_lines_suggested": 6 - } - ], - "is_custom_model": false, - "total_engaged_users": 2 - } - ], - "total_engaged_users": 2 - } - ], - "total_engaged_users": 83 - } - }, - { - "date": "2024-11-05", - "copilot_ide_chat": { - "editors": [ - { - "name": "vscode", - "models": [ - { - "name": "default", - "total_chats": 2936, - "is_custom_model": false, - "total_engaged_users": 112, - "total_chat_copy_events": 142, - "total_chat_insertion_events": 59 - } - ], - "total_engaged_users": 112 - }, - { - "name": "JetBrains", - "models": [ - { - "name": "default", - "total_chats": 16, - "is_custom_model": false, - "total_engaged_users": 3, - "total_chat_copy_events": 5, - "total_chat_insertion_events": 2 - } - ], - "total_engaged_users": 3 - } - ], - "total_engaged_users": 114 - }, - "total_active_users": 158, - "copilot_dotcom_chat": { - "models": [ - { - "name": "default", - "total_chats": 269, - "is_custom_model": false, - "total_engaged_users": 45 - } - ], - "total_engaged_users": 45 - }, - "total_engaged_users": 158, - "copilot_dotcom_pull_requests": { - "repositories": [ - { - "name": "certification-services", - "models": [ - { - "name": "default", - "is_custom_model": false, - "total_engaged_users": 1, - "total_pr_summaries_created": 2 - } - ], - "total_engaged_users": 1 - }, - { - "name": "jubilant-love", - "models": [ - { - "name": "default", - "is_custom_model": false, - "total_engaged_users": 1, - "total_pr_summaries_created": 5 - } - ], - "total_engaged_users": 1 - }, - { - "name": "Abeck_GHAS2", - "models": [ - { - "name": "default", - "is_custom_model": false, - "total_engaged_users": 1, - "total_pr_summaries_created": 2 - } - ], - "total_engaged_users": 1 - }, - { - "name": "FastTrack", - "models": [ - { - "name": "default", - "is_custom_model": false, - "total_engaged_users": 2, - "total_pr_summaries_created": 3 - } - ], - "total_engaged_users": 2 - }, - { - "name": "changelog.gallery", - "models": [ - { - "name": "default", - "is_custom_model": false, - "total_engaged_users": 1, - "total_pr_summaries_created": 4 - } - ], - "total_engaged_users": 1 - }, - { - "name": "Copilot-Sandbox", - "models": [ - { - "name": "default", - "is_custom_model": false, - "total_engaged_users": 1, - "total_pr_summaries_created": 6 - } - ], - "total_engaged_users": 1 - }, - { - "name": "rover", - "models": [ - { - "name": "default", - "is_custom_model": false, - "total_engaged_users": 1, - "total_pr_summaries_created": 1 - } - ], - "total_engaged_users": 1 - }, - { - "name": "inexpensive-world", - "models": [ - { - "name": "default", - "is_custom_model": false, - "total_engaged_users": 1, - "total_pr_summaries_created": 2 - } - ], - "total_engaged_users": 1 - }, - { - "name": "Copilot_Breakout_session", - "models": [ - { - "name": "default", - "is_custom_model": false, - "total_engaged_users": 1, - "total_pr_summaries_created": 3 - } - ], - "total_engaged_users": 1 - }, - { - "name": "cc-docs", - "models": [ - { - "name": "default", - "is_custom_model": false, - "total_engaged_users": 1, - "total_pr_summaries_created": 1 - } - ], - "total_engaged_users": 1 - }, - { - "name": "white-guide", - "models": [ - { - "name": "default", - "is_custom_model": false, - "total_engaged_users": 1, - "total_pr_summaries_created": 1 - } - ], - "total_engaged_users": 1 - }, - { - "name": "congenial-invention", - "models": [ - { - "name": "default", - "is_custom_model": false, - "total_engaged_users": 1, - "total_pr_summaries_created": 2 - } - ], - "total_engaged_users": 1 - }, - { - "name": "magnificent-phone", - "models": [ - { - "name": "default", - "is_custom_model": false, - "total_engaged_users": 1, - "total_pr_summaries_created": 1 - } - ], - "total_engaged_users": 1 - }, - { - "name": "ghas-bootcamp", - "models": [ - { - "name": "default", - "is_custom_model": false, - "total_engaged_users": 1, - "total_pr_summaries_created": 1 - } - ], - "total_engaged_users": 1 - }, - { - "name": "lvmh", - "models": [ - { - "name": "default", - "is_custom_model": false, - "total_engaged_users": 1, - "total_pr_summaries_created": 3 - } - ], - "total_engaged_users": 1 - }, - { - "name": "dotNET-mail-demo", - "models": [ - { - "name": "default", - "is_custom_model": false, - "total_engaged_users": 1, - "total_pr_summaries_created": 1 - } - ], - "total_engaged_users": 1 - }, - { - "name": "gh-skyline", - "models": [ - { - "name": "default", - "is_custom_model": false, - "total_engaged_users": 1, - "total_pr_summaries_created": 1 - } - ], - "total_engaged_users": 1 - }, - { - "name": "giant-rats", - "models": [ - { - "name": "default", - "is_custom_model": false, - "total_engaged_users": 1, - "total_pr_summaries_created": 1 - } - ], - "total_engaged_users": 1 - }, - { - "name": "paypal-migrations-via-actions", - "models": [ - { - "name": "default", - "is_custom_model": false, - "total_engaged_users": 1, - "total_pr_summaries_created": 3 - } - ], - "total_engaged_users": 1 - }, - { - "name": "government-community", - "models": [ - { - "name": "default", - "is_custom_model": false, - "total_engaged_users": 1, - "total_pr_summaries_created": 1 - } - ], - "total_engaged_users": 1 - }, - { - "name": "", - "models": [ - { - "name": "default", - "is_custom_model": false, - "total_engaged_users": 4, - "total_pr_summaries_created": 8 - } - ], - "total_engaged_users": 4 - } - ], - "total_engaged_users": 23 - }, - "copilot_ide_code_completions": { - "editors": [ - { - "name": "vscode", - "models": [ - { - "name": "default", - "languages": [ - { - "name": "dotenv", - "total_engaged_users": 2, - "total_code_acceptances": 2, - "total_code_suggestions": 16, - "total_code_lines_accepted": 2, - "total_code_lines_suggested": 20 - }, - { - "name": "yaml", - "total_engaged_users": 10, - "total_code_acceptances": 100, - "total_code_suggestions": 249, - "total_code_lines_accepted": 162, - "total_code_lines_suggested": 683 - }, - { - "name": "ruby", - "total_engaged_users": 10, - "total_code_acceptances": 160, - "total_code_suggestions": 549, - "total_code_lines_accepted": 141, - "total_code_lines_suggested": 761 - }, - { - "name": "html", - "total_engaged_users": 8, - "total_code_acceptances": 13, - "total_code_suggestions": 75, - "total_code_lines_accepted": 12, - "total_code_lines_suggested": 209 - }, - { - "name": "scss", - "total_engaged_users": 3, - "total_code_acceptances": 6, - "total_code_suggestions": 44, - "total_code_lines_accepted": 5, - "total_code_lines_suggested": 64 - }, - { - "name": "unknown", - "total_engaged_users": 7, - "total_code_acceptances": 156, - "total_code_suggestions": 450, - "total_code_lines_accepted": 154, - "total_code_lines_suggested": 575 - }, - { - "name": "javascriptreact", - "total_engaged_users": 2, - "total_code_acceptances": 2, - "total_code_suggestions": 8, - "total_code_lines_accepted": 2, - "total_code_lines_suggested": 15 - }, - { - "name": "go", - "total_engaged_users": 5, - "total_code_acceptances": 24, - "total_code_suggestions": 64, - "total_code_lines_accepted": 29, - "total_code_lines_suggested": 227 - }, - { - "name": "jsonc", - "total_engaged_users": 7, - "total_code_acceptances": 18, - "total_code_suggestions": 88, - "total_code_lines_accepted": 18, - "total_code_lines_suggested": 275 - }, - { - "name": "powershell", - "total_engaged_users": 3, - "total_code_acceptances": 11, - "total_code_suggestions": 23, - "total_code_lines_accepted": 11, - "total_code_lines_suggested": 39 - }, - { - "name": "javascript", - "total_engaged_users": 19, - "total_code_acceptances": 353, - "total_code_suggestions": 919, - "total_code_lines_accepted": 591, - "total_code_lines_suggested": 1591 - }, - { - "name": "markdown", - "total_engaged_users": 21, - "total_code_acceptances": 156, - "total_code_suggestions": 973, - "total_code_lines_accepted": 159, - "total_code_lines_suggested": 1253 - }, - { - "name": "ql", - "total_engaged_users": 3, - "total_code_acceptances": 36, - "total_code_suggestions": 410, - "total_code_lines_accepted": 21, - "total_code_lines_suggested": 858 - }, - { - "name": "java", - "total_engaged_users": 10, - "total_code_acceptances": 43, - "total_code_suggestions": 124, - "total_code_lines_accepted": 126, - "total_code_lines_suggested": 368 - }, - { - "name": "python", - "total_engaged_users": 12, - "total_code_acceptances": 196, - "total_code_suggestions": 490, - "total_code_lines_accepted": 287, - "total_code_lines_suggested": 870 - }, - { - "name": "dockerfile", - "total_engaged_users": 2, - "total_code_acceptances": 1, - "total_code_suggestions": 8, - "total_code_lines_accepted": 1, - "total_code_lines_suggested": 9 - }, - { - "name": "oraclesql", - "total_engaged_users": 1, - "total_code_acceptances": 0, - "total_code_suggestions": 1, - "total_code_lines_accepted": 0, - "total_code_lines_suggested": 1 - }, - { - "name": "typescript", - "total_engaged_users": 10, - "total_code_acceptances": 532, - "total_code_suggestions": 1437, - "total_code_lines_accepted": 477, - "total_code_lines_suggested": 2242 - }, - { - "name": "json", - "total_engaged_users": 5, - "total_code_acceptances": 9, - "total_code_suggestions": 47, - "total_code_lines_accepted": 6, - "total_code_lines_suggested": 63 - }, - { - "name": "erb", - "total_engaged_users": 1, - "total_code_acceptances": 0, - "total_code_suggestions": 1, - "total_code_lines_accepted": 0, - "total_code_lines_suggested": 1 - }, - { - "name": "typescriptreact", - "total_engaged_users": 10, - "total_code_acceptances": 127, - "total_code_suggestions": 326, - "total_code_lines_accepted": 169, - "total_code_lines_suggested": 526 - }, - { - "name": "css", - "total_engaged_users": 4, - "total_code_acceptances": 7, - "total_code_suggestions": 46, - "total_code_lines_accepted": 6, - "total_code_lines_suggested": 209 - }, - { - "name": "csharp", - "total_engaged_users": 4, - "total_code_acceptances": 12, - "total_code_suggestions": 33, - "total_code_lines_accepted": 48, - "total_code_lines_suggested": 72 - }, - { - "name": "plaintext", - "total_engaged_users": 2, - "total_code_acceptances": 5, - "total_code_suggestions": 23, - "total_code_lines_accepted": 5, - "total_code_lines_suggested": 25 - }, - { - "name": "sql", - "total_engaged_users": 3, - "total_code_acceptances": 3, - "total_code_suggestions": 39, - "total_code_lines_accepted": 3, - "total_code_lines_suggested": 57 - }, - { - "name": "xml", - "total_engaged_users": 2, - "total_code_acceptances": 1, - "total_code_suggestions": 5, - "total_code_lines_accepted": 0, - "total_code_lines_suggested": 5 - }, - { - "name": "cpp", - "total_engaged_users": 3, - "total_code_acceptances": 7, - "total_code_suggestions": 33, - "total_code_lines_accepted": 7, - "total_code_lines_suggested": 39 - }, - { - "name": "github-issues", - "total_engaged_users": 1, - "total_code_acceptances": 0, - "total_code_suggestions": 1, - "total_code_lines_accepted": 0, - "total_code_lines_suggested": 1 - }, - { - "name": "shellscript", - "total_engaged_users": 3, - "total_code_acceptances": 4, - "total_code_suggestions": 9, - "total_code_lines_accepted": 6, - "total_code_lines_suggested": 11 - }, - { - "name": "postgres", - "total_engaged_users": 1, - "total_code_acceptances": 0, - "total_code_suggestions": 4, - "total_code_lines_accepted": 0, - "total_code_lines_suggested": 4 - }, - { - "name": "lua", - "total_engaged_users": 2, - "total_code_acceptances": 1, - "total_code_suggestions": 10, - "total_code_lines_accepted": 1, - "total_code_lines_suggested": 11 - }, - { - "name": "blade", - "total_engaged_users": 1, - "total_code_acceptances": 0, - "total_code_suggestions": 4, - "total_code_lines_accepted": 0, - "total_code_lines_suggested": 4 - }, - { - "name": "makefile", - "total_engaged_users": 2, - "total_code_acceptances": 5, - "total_code_suggestions": 25, - "total_code_lines_accepted": 5, - "total_code_lines_suggested": 39 - } - ], - "is_custom_model": false, - "total_engaged_users": 94 - } - ], - "total_engaged_users": 94 - }, - { - "name": "JetBrains", - "models": [ - { - "name": "default", - "languages": [ - { - "name": "typescriptreact", - "total_engaged_users": 2, - "total_code_acceptances": 1, - "total_code_suggestions": 16, - "total_code_lines_accepted": 1, - "total_code_lines_suggested": 39 - }, - { - "name": "java", - "total_engaged_users": 2, - "total_code_acceptances": 1, - "total_code_suggestions": 4, - "total_code_lines_accepted": 1, - "total_code_lines_suggested": 11 - }, - { - "name": "markdown", - "total_engaged_users": 2, - "total_code_acceptances": 5, - "total_code_suggestions": 5, - "total_code_lines_accepted": 5, - "total_code_lines_suggested": 5 - }, - { - "name": "csharp", - "total_engaged_users": 2, - "total_code_acceptances": 15, - "total_code_suggestions": 42, - "total_code_lines_accepted": 33, - "total_code_lines_suggested": 123 - } - ], - "is_custom_model": false, - "total_engaged_users": 3 - } - ], - "total_engaged_users": 3 - }, - { - "name": "Neovim", - "models": [ - { - "name": "default", - "languages": [ - { - "name": "unknown", - "total_engaged_users": 1, - "total_code_acceptances": 0, - "total_code_suggestions": 24, - "total_code_lines_accepted": 0, - "total_code_lines_suggested": 60 - }, - { - "name": "lua", - "total_engaged_users": 2, - "total_code_acceptances": 1, - "total_code_suggestions": 2, - "total_code_lines_accepted": 1, - "total_code_lines_suggested": 3 - } - ], - "is_custom_model": false, - "total_engaged_users": 2 - } - ], - "total_engaged_users": 2 - }, - { - "name": "VisualStudio", - "models": [ - { - "name": "default", - "languages": [ - { - "name": "csharp", - "total_engaged_users": 2, - "total_code_acceptances": 6, - "total_code_suggestions": 7, - "total_code_lines_accepted": 50, - "total_code_lines_suggested": 51 - }, - { - "name": "fsharp", - "total_engaged_users": 2, - "total_code_acceptances": 21, - "total_code_suggestions": 65, - "total_code_lines_accepted": 23, - "total_code_lines_suggested": 73 - }, - { - "name": "cpp", - "total_engaged_users": 2, - "total_code_acceptances": 41, - "total_code_suggestions": 112, - "total_code_lines_accepted": 87, - "total_code_lines_suggested": 267 - } - ], - "is_custom_model": false, - "total_engaged_users": 4 - } - ], - "total_engaged_users": 4 - }, - { - "name": "Vim", - "models": [ - { - "name": "default", - "languages": [ - { - "name": "gitattributes", - "total_engaged_users": 1, - "total_code_acceptances": 0, - "total_code_suggestions": 1, - "total_code_lines_accepted": 0, - "total_code_lines_suggested": 1 - } - ], - "is_custom_model": false, - "total_engaged_users": 1 - } - ], - "total_engaged_users": 1 - } - ], - "total_engaged_users": 98 - } - }, - { - "date": "2024-11-06", - "copilot_ide_chat": { - "editors": [ - { - "name": "vscode", - "models": [ - { - "name": "default", - "total_chats": 3052, - "is_custom_model": false, - "total_engaged_users": 87, - "total_chat_copy_events": 158, - "total_chat_insertion_events": 91 - } - ], - "total_engaged_users": 87 - }, - { - "name": "JetBrains", - "models": [ - { - "name": "default", - "total_chats": 45, - "is_custom_model": false, - "total_engaged_users": 6, - "total_chat_copy_events": 4, - "total_chat_insertion_events": 3 - } - ], - "total_engaged_users": 6 - } - ], - "total_engaged_users": 87 - }, - "total_active_users": 131, - "copilot_dotcom_chat": { - "models": [ - { - "name": "default", - "total_chats": 216, - "is_custom_model": false, - "total_engaged_users": 41 - } - ], - "total_engaged_users": 41 - }, - "total_engaged_users": 131, - "copilot_dotcom_pull_requests": { - "repositories": [ - { - "name": "advanced-security-field-dev", - "models": [ - { - "name": "default", - "is_custom_model": false, - "total_engaged_users": 1, - "total_pr_summaries_created": 2 - } - ], - "total_engaged_users": 1 - }, - { - "name": "white-guide", - "models": [ - { - "name": "default", - "is_custom_model": false, - "total_engaged_users": 1, - "total_pr_summaries_created": 3 - } - ], - "total_engaged_users": 1 - }, - { - "name": "giant-rats", - "models": [ - { - "name": "default", - "is_custom_model": false, - "total_engaged_users": 1, - "total_pr_summaries_created": 2 - } - ], - "total_engaged_users": 1 - }, - { - "name": "the-fellowship", - "models": [ - { - "name": "default", - "is_custom_model": false, - "total_engaged_users": 1, - "total_pr_summaries_created": 1 - } - ], - "total_engaged_users": 1 - }, - { - "name": "advanced-security-field", - "models": [ - { - "name": "default", - "is_custom_model": false, - "total_engaged_users": 1, - "total_pr_summaries_created": 2 - } - ], - "total_engaged_users": 1 - }, - { - "name": "octocat-petclinic", - "models": [ - { - "name": "default", - "is_custom_model": false, - "total_engaged_users": 1, - "total_pr_summaries_created": 1 - } - ], - "total_engaged_users": 1 - }, - { - "name": "ghas-workshop", - "models": [ - { - "name": "default", - "is_custom_model": false, - "total_engaged_users": 1, - "total_pr_summaries_created": 1 - } - ], - "total_engaged_users": 1 - }, - { - "name": "solutions-engineering", - "models": [ - { - "name": "default", - "is_custom_model": false, - "total_engaged_users": 1, - "total_pr_summaries_created": 1 - } - ], - "total_engaged_users": 1 - }, - { - "name": "special-knowledge", - "models": [ - { - "name": "default", - "is_custom_model": false, - "total_engaged_users": 1, - "total_pr_summaries_created": 2 - } - ], - "total_engaged_users": 1 - }, - { - "name": "gh-migrate-teams", - "models": [ - { - "name": "default", - "is_custom_model": false, - "total_engaged_users": 1, - "total_pr_summaries_created": 2 - } - ], - "total_engaged_users": 1 - }, - { - "name": "myshuttle-security", - "models": [ - { - "name": "default", - "is_custom_model": false, - "total_engaged_users": 1, - "total_pr_summaries_created": 2 - } - ], - "total_engaged_users": 1 - }, - { - "name": "verbose-computer", - "models": [ - { - "name": "default", - "is_custom_model": false, - "total_engaged_users": 1, - "total_pr_summaries_created": 2 - } - ], - "total_engaged_users": 1 - }, - { - "name": "giant-rats-universe", - "models": [ - { - "name": "default", - "is_custom_model": false, - "total_engaged_users": 1, - "total_pr_summaries_created": 2 - } - ], - "total_engaged_users": 1 - }, - { - "name": "the-weather-app", - "models": [ - { - "name": "default", - "is_custom_model": false, - "total_engaged_users": 1, - "total_pr_summaries_created": 1 - } - ], - "total_engaged_users": 1 - }, - { - "name": "gifted-potato", - "models": [ - { - "name": "default", - "is_custom_model": false, - "total_engaged_users": 1, - "total_pr_summaries_created": 3 - } - ], - "total_engaged_users": 1 - }, - { - "name": "copilot", - "models": [ - { - "name": "default", - "is_custom_model": false, - "total_engaged_users": 1, - "total_pr_summaries_created": 1 - } - ], - "total_engaged_users": 1 - }, - { - "name": "support-knowledge-base", - "models": [ - { - "name": "default", - "is_custom_model": false, - "total_engaged_users": 1, - "total_pr_summaries_created": 2 - } - ], - "total_engaged_users": 1 - }, - { - "name": "math-api", - "models": [ - { - "name": "default", - "is_custom_model": false, - "total_engaged_users": 1, - "total_pr_summaries_created": 5 - } - ], - "total_engaged_users": 1 - }, - { - "name": "legendary-winner", - "models": [ - { - "name": "default", - "is_custom_model": false, - "total_engaged_users": 1, - "total_pr_summaries_created": 2 - } - ], - "total_engaged_users": 1 - }, - { - "name": "orange-people", - "models": [ - { - "name": "default", - "is_custom_model": false, - "total_engaged_users": 1, - "total_pr_summaries_created": 2 - } - ], - "total_engaged_users": 1 - }, - { - "name": "musical-octo-theory", - "models": [ - { - "name": "default", - "is_custom_model": false, - "total_engaged_users": 1, - "total_pr_summaries_created": 1 - } - ], - "total_engaged_users": 1 - }, - { - "name": "", - "models": [ - { - "name": "default", - "is_custom_model": false, - "total_engaged_users": 1, - "total_pr_summaries_created": 2 - } - ], - "total_engaged_users": 1 - } - ], - "total_engaged_users": 17 - }, - "copilot_ide_code_completions": { - "editors": [ - { - "name": "vscode", - "models": [ - { - "name": "default", - "languages": [ - { - "name": "markdown", - "total_engaged_users": 19, - "total_code_acceptances": 147, - "total_code_suggestions": 760, - "total_code_lines_accepted": 114, - "total_code_lines_suggested": 952 - }, - { - "name": "ruby", - "total_engaged_users": 12, - "total_code_acceptances": 87, - "total_code_suggestions": 306, - "total_code_lines_accepted": 91, - "total_code_lines_suggested": 409 - }, - { - "name": "python", - "total_engaged_users": 12, - "total_code_acceptances": 77, - "total_code_suggestions": 251, - "total_code_lines_accepted": 96, - "total_code_lines_suggested": 326 - }, - { - "name": "unknown", - "total_engaged_users": 4, - "total_code_acceptances": 11, - "total_code_suggestions": 113, - "total_code_lines_accepted": 9, - "total_code_lines_suggested": 143 - }, - { - "name": "javascript", - "total_engaged_users": 19, - "total_code_acceptances": 508, - "total_code_suggestions": 1139, - "total_code_lines_accepted": 872, - "total_code_lines_suggested": 2213 - }, - { - "name": "css", - "total_engaged_users": 5, - "total_code_acceptances": 17, - "total_code_suggestions": 61, - "total_code_lines_accepted": 29, - "total_code_lines_suggested": 196 - }, - { - "name": "scss", - "total_engaged_users": 4, - "total_code_acceptances": 25, - "total_code_suggestions": 85, - "total_code_lines_accepted": 35, - "total_code_lines_suggested": 165 - }, - { - "name": "typescriptreact", - "total_engaged_users": 12, - "total_code_acceptances": 88, - "total_code_suggestions": 281, - "total_code_lines_accepted": 77, - "total_code_lines_suggested": 360 - }, - { - "name": "yaml", - "total_engaged_users": 12, - "total_code_acceptances": 62, - "total_code_suggestions": 238, - "total_code_lines_accepted": 85, - "total_code_lines_suggested": 467 - }, - { - "name": "terraform", - "total_engaged_users": 2, - "total_code_acceptances": 2, - "total_code_suggestions": 5, - "total_code_lines_accepted": 0, - "total_code_lines_suggested": 10 - }, - { - "name": "shellscript", - "total_engaged_users": 1, - "total_code_acceptances": 0, - "total_code_suggestions": 10, - "total_code_lines_accepted": 0, - "total_code_lines_suggested": 10 - }, - { - "name": "json", - "total_engaged_users": 4, - "total_code_acceptances": 4, - "total_code_suggestions": 40, - "total_code_lines_accepted": 3, - "total_code_lines_suggested": 63 - }, - { - "name": "typescript", - "total_engaged_users": 10, - "total_code_acceptances": 476, - "total_code_suggestions": 1307, - "total_code_lines_accepted": 816, - "total_code_lines_suggested": 2845 - }, - { - "name": "svelte", - "total_engaged_users": 2, - "total_code_acceptances": 6, - "total_code_suggestions": 13, - "total_code_lines_accepted": 2, - "total_code_lines_suggested": 14 - }, - { - "name": "cpp", - "total_engaged_users": 3, - "total_code_acceptances": 6, - "total_code_suggestions": 25, - "total_code_lines_accepted": 11, - "total_code_lines_suggested": 37 - }, - { - "name": "jsonc", - "total_engaged_users": 1, - "total_code_acceptances": 0, - "total_code_suggestions": 11, - "total_code_lines_accepted": 0, - "total_code_lines_suggested": 87 - }, - { - "name": "csharp", - "total_engaged_users": 4, - "total_code_acceptances": 15, - "total_code_suggestions": 39, - "total_code_lines_accepted": 34, - "total_code_lines_suggested": 60 - }, - { - "name": "html", - "total_engaged_users": 3, - "total_code_acceptances": 14, - "total_code_suggestions": 36, - "total_code_lines_accepted": 13, - "total_code_lines_suggested": 51 - }, - { - "name": "java", - "total_engaged_users": 9, - "total_code_acceptances": 66, - "total_code_suggestions": 127, - "total_code_lines_accepted": 130, - "total_code_lines_suggested": 310 - }, - { - "name": "ini", - "total_engaged_users": 1, - "total_code_acceptances": 0, - "total_code_suggestions": 1, - "total_code_lines_accepted": 0, - "total_code_lines_suggested": 1 - }, - { - "name": "ql", - "total_engaged_users": 3, - "total_code_acceptances": 54, - "total_code_suggestions": 367, - "total_code_lines_accepted": 28, - "total_code_lines_suggested": 948 - }, - { - "name": "dotenv", - "total_engaged_users": 2, - "total_code_acceptances": 1, - "total_code_suggestions": 27, - "total_code_lines_accepted": 1, - "total_code_lines_suggested": 37 - }, - { - "name": "go", - "total_engaged_users": 3, - "total_code_acceptances": 10, - "total_code_suggestions": 27, - "total_code_lines_accepted": 9, - "total_code_lines_suggested": 31 - }, - { - "name": "erb", - "total_engaged_users": 2, - "total_code_acceptances": 1, - "total_code_suggestions": 4, - "total_code_lines_accepted": 0, - "total_code_lines_suggested": 13 - }, - { - "name": "dockerfile", - "total_engaged_users": 2, - "total_code_acceptances": 12, - "total_code_suggestions": 12, - "total_code_lines_accepted": 12, - "total_code_lines_suggested": 12 - }, - { - "name": "powershell", - "total_engaged_users": 2, - "total_code_acceptances": 5, - "total_code_suggestions": 25, - "total_code_lines_accepted": 35, - "total_code_lines_suggested": 98 - }, - { - "name": "sql", - "total_engaged_users": 2, - "total_code_acceptances": 2, - "total_code_suggestions": 10, - "total_code_lines_accepted": 2, - "total_code_lines_suggested": 11 - }, - { - "name": "plaintext", - "total_engaged_users": 1, - "total_code_acceptances": 0, - "total_code_suggestions": 2, - "total_code_lines_accepted": 0, - "total_code_lines_suggested": 2 - } - ], - "is_custom_model": false, - "total_engaged_users": 81 - } - ], - "total_engaged_users": 81 - }, - { - "name": "JetBrains", - "models": [ - { - "name": "default", - "languages": [ - { - "name": "csharp", - "total_engaged_users": 2, - "total_code_acceptances": 8, - "total_code_suggestions": 24, - "total_code_lines_accepted": 8, - "total_code_lines_suggested": 64 - }, - { - "name": "razor", - "total_engaged_users": 2, - "total_code_acceptances": 1, - "total_code_suggestions": 1, - "total_code_lines_accepted": 1, - "total_code_lines_suggested": 1 - }, - { - "name": "groovy", - "total_engaged_users": 1, - "total_code_acceptances": 0, - "total_code_suggestions": 2, - "total_code_lines_accepted": 0, - "total_code_lines_suggested": 4 - }, - { - "name": "java", - "total_engaged_users": 4, - "total_code_acceptances": 18, - "total_code_suggestions": 24, - "total_code_lines_accepted": 36, - "total_code_lines_suggested": 75 - } - ], - "is_custom_model": false, - "total_engaged_users": 5 - } - ], - "total_engaged_users": 5 - }, - { - "name": "Neovim", - "models": [ - { - "name": "default", - "languages": [ - { - "name": "ruby", - "total_engaged_users": 2, - "total_code_acceptances": 7, - "total_code_suggestions": 26, - "total_code_lines_accepted": 7, - "total_code_lines_suggested": 67 - } - ], - "is_custom_model": false, - "total_engaged_users": 2 - } - ], - "total_engaged_users": 2 - }, - { - "name": "VisualStudio", - "models": [ - { - "name": "default", - "languages": [ - { - "name": "c/c++", - "total_engaged_users": 2, - "total_code_acceptances": 8, - "total_code_suggestions": 25, - "total_code_lines_accepted": 8, - "total_code_lines_suggested": 126 - }, - { - "name": "cpp", - "total_engaged_users": 2, - "total_code_acceptances": 27, - "total_code_suggestions": 78, - "total_code_lines_accepted": 53, - "total_code_lines_suggested": 235 - } - ], - "is_custom_model": false, - "total_engaged_users": 2 - } - ], - "total_engaged_users": 2 - }, - { - "name": "Xcode", - "models": [ - { - "name": "default", - "languages": [ - { - "name": "markdown", - "total_engaged_users": 2, - "total_code_acceptances": 16, - "total_code_suggestions": 21, - "total_code_lines_accepted": 11, - "total_code_lines_suggested": 42 - } - ], - "is_custom_model": false, - "total_engaged_users": 2 - } - ], - "total_engaged_users": 2 - } - ], - "total_engaged_users": 86 - } - } -] \ No newline at end of file