mirror of
https://github.com/moodle/moodle.git
synced 2025-04-13 04:22:07 +02:00
Merge branch 'MDL-83154-main' of https://github.com/davewoloszyn/moodle
This commit is contained in:
commit
bf18f379f7
@ -37,6 +37,7 @@ abstract class response_base {
|
||||
* @param string $actionname The name of the action that was processed.
|
||||
* @param int $errorcode Error code. Must exist if success is false.
|
||||
* @param string $errormessage Error message. Must exist if success is false
|
||||
* @param string $model The model used to generate the response.
|
||||
*/
|
||||
public function __construct(
|
||||
/** @var bool The success status of the action. */
|
||||
@ -47,6 +48,8 @@ abstract class response_base {
|
||||
private int $errorcode = 0,
|
||||
/** @var string Error message. Must exist if status is error */
|
||||
private string $errormessage = '',
|
||||
/** @var string The model used to generate the response (if available). */
|
||||
protected ?string $model = null,
|
||||
|
||||
) {
|
||||
$this->timecreated = \core\di::get(\core\clock::class)->time();
|
||||
@ -113,4 +116,13 @@ abstract class response_base {
|
||||
public function get_errormessage(): string {
|
||||
return $this->errormessage;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the model used to generate the response (if available).
|
||||
*
|
||||
* @return ?string
|
||||
*/
|
||||
public function get_model_used(): ?string {
|
||||
return $this->model;
|
||||
}
|
||||
}
|
||||
|
@ -60,6 +60,7 @@ class response_generate_image extends response_base {
|
||||
$this->draftfile = $response['draftfile'] ?? null;
|
||||
$this->revisedprompt = $response['revisedprompt'] ?? null;
|
||||
$this->sourceurl = $response['sourceurl'] ?? null;
|
||||
$this->model = $response['model'] ?? null;
|
||||
}
|
||||
|
||||
#[\Override]
|
||||
@ -68,6 +69,7 @@ class response_generate_image extends response_base {
|
||||
'draftfile' => $this->draftfile,
|
||||
'revisedprompt' => $this->revisedprompt,
|
||||
'sourceurl' => $this->sourceurl,
|
||||
'model' => $this->model,
|
||||
];
|
||||
}
|
||||
}
|
||||
|
@ -72,6 +72,7 @@ class response_generate_text extends response_base {
|
||||
$this->finishreason = $response['finishreason'] ?? null;
|
||||
$this->prompttokens = $response['prompttokens'] ?? null;
|
||||
$this->completiontokens = $response['completiontokens'] ?? null;
|
||||
$this->model = $response['model'] ?? null;
|
||||
}
|
||||
|
||||
#[\Override]
|
||||
@ -83,6 +84,7 @@ class response_generate_text extends response_base {
|
||||
'finishreason' => $this->finishreason,
|
||||
'prompttokens' => $this->prompttokens,
|
||||
'completiontokens' => $this->completiontokens,
|
||||
'model' => $this->model,
|
||||
];
|
||||
}
|
||||
}
|
||||
|
@ -72,6 +72,7 @@ class response_summarise_text extends response_base {
|
||||
$this->finishreason = $response['finishreason'] ?? null;
|
||||
$this->prompttokens = $response['prompttokens'] ?? null;
|
||||
$this->completiontokens = $response['completiontokens'] ?? null;
|
||||
$this->model = $response['model'] ?? null;
|
||||
}
|
||||
|
||||
#[\Override]
|
||||
@ -83,6 +84,7 @@ class response_summarise_text extends response_base {
|
||||
'finishreason' => $this->finishreason,
|
||||
'prompttokens' => $this->prompttokens,
|
||||
'completiontokens' => $this->completiontokens,
|
||||
'model' => $this->model,
|
||||
];
|
||||
}
|
||||
}
|
||||
|
@ -174,6 +174,7 @@ class manager {
|
||||
'errormessage' => $response->get_errormessage(),
|
||||
'timecreated' => $action->get_configuration('timecreated'),
|
||||
'timecompleted' => $response->get_timecreated(),
|
||||
'model' => $response->get_model_used(),
|
||||
];
|
||||
|
||||
try {
|
||||
|
@ -56,6 +56,7 @@ class provider implements
|
||||
'provider' => 'privacy:metadata:ai_action_register:provider',
|
||||
'timecreated' => 'privacy:metadata:ai_action_register:timecreated',
|
||||
'timecompleted' => 'privacy:metadata:ai_action_register:timecompleted',
|
||||
'model' => 'privacy:metadata:ai_action_register:model',
|
||||
], 'privacy:metadata:ai_action_register');
|
||||
$collection->add_database_table('ai_action_generate_image', [
|
||||
'prompt' => 'privacy:metadata:ai_action_generate_image:prompt',
|
||||
@ -178,7 +179,7 @@ class provider implements
|
||||
// AI action generate text.
|
||||
$sql = "SELECT aar.actionname, aar.success, aar.provider, aar.timecreated, aar.timecompleted, aar.contextid,
|
||||
aagt.prompt, aagt.responseid, aagt.fingerprint, aagt.generatedcontent,
|
||||
aagt.prompttokens, aagt.completiontoken
|
||||
aagt.prompttokens, aagt.completiontoken, aar.model
|
||||
FROM {ai_action_register} aar
|
||||
JOIN {ai_action_generate_text} aagt
|
||||
ON aar.actionid = aagt.id
|
||||
@ -207,6 +208,7 @@ class provider implements
|
||||
'generatedcontent' => $textgeneratedetail->generatedcontent,
|
||||
'prompttokens' => $textgeneratedetail->prompttokens,
|
||||
'completiontoken' => $textgeneratedetail->completiontoken,
|
||||
'model' => $textgeneratedetail->model,
|
||||
'success' => transform::yesno($textgeneratedetail->success),
|
||||
'provider' => $textgeneratedetail->provider,
|
||||
'timecreated' => transform::datetime($textgeneratedetail->timecreated),
|
||||
@ -221,7 +223,7 @@ class provider implements
|
||||
// AI action generate image.
|
||||
$sql = "SELECT aar.actionname, aar.success, aar.provider, aar.timecreated, aar.timecompleted, aar.contextid,
|
||||
aagi.prompt, aagi.numberimages, aagi.quality, aagi.aspectratio, aagi.style, aagi.sourceurl,
|
||||
aagi.revisedprompt
|
||||
aagi.revisedprompt, aar.model
|
||||
FROM {ai_action_register} aar
|
||||
JOIN {ai_action_generate_image} aagi
|
||||
ON aar.actionid = aagi.id
|
||||
@ -251,6 +253,7 @@ class provider implements
|
||||
'style' => $imagegeneratedetail->style,
|
||||
'sourceurl' => $imagegeneratedetail->sourceurl,
|
||||
'revisedprompt' => $imagegeneratedetail->revisedprompt,
|
||||
'model' => $imagegeneratedetail->model,
|
||||
'success' => transform::yesno($imagegeneratedetail->success),
|
||||
'provider' => $imagegeneratedetail->provider,
|
||||
'timecreated' => transform::datetime($imagegeneratedetail->timecreated),
|
||||
@ -265,7 +268,7 @@ class provider implements
|
||||
// AI action summarise text.
|
||||
$sql = "SELECT aar.actionname, aar.success, aar.provider, aar.timecreated, aar.timecompleted, aar.contextid,
|
||||
aast.prompt, aast.responseid, aast.fingerprint, aast.generatedcontent,
|
||||
aast.prompttokens, aast.completiontoken
|
||||
aast.prompttokens, aast.completiontoken, aar.model
|
||||
FROM {ai_action_register} aar
|
||||
JOIN {ai_action_summarise_text} aast
|
||||
ON aar.actionid = aast.id
|
||||
@ -294,6 +297,7 @@ class provider implements
|
||||
'generatedcontent' => $textsummarisedetail->generatedcontent,
|
||||
'prompttokens' => $textsummarisedetail->prompttokens,
|
||||
'completiontoken' => $textsummarisedetail->completiontoken,
|
||||
'model' => $textsummarisedetail->model,
|
||||
'success' => transform::yesno($textsummarisedetail->success),
|
||||
'provider' => $textsummarisedetail->provider,
|
||||
'timecreated' => transform::datetime($textsummarisedetail->timecreated),
|
||||
|
@ -106,6 +106,7 @@ class process_generate_text extends abstract_processor {
|
||||
'finishreason' => $bodyobj->choices[0]->finish_reason,
|
||||
'prompttokens' => $bodyobj->usage->prompt_tokens,
|
||||
'completiontokens' => $bodyobj->usage->completion_tokens,
|
||||
'model' => $bodyobj->model,
|
||||
];
|
||||
}
|
||||
}
|
||||
|
@ -152,7 +152,7 @@ final class process_generate_text_test extends \advanced_testcase {
|
||||
$this->assertEquals('stop', $result['finishreason']);
|
||||
$this->assertEquals('12', $result['prompttokens']);
|
||||
$this->assertEquals('14', $result['completiontokens']);
|
||||
|
||||
$this->assertEquals('gpt-4o-2024-05-13', $result['model']);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -180,6 +180,7 @@ final class process_generate_text_test extends \advanced_testcase {
|
||||
$this->assertEquals('stop', $result['finishreason']);
|
||||
$this->assertEquals('12', $result['prompttokens']);
|
||||
$this->assertEquals('14', $result['completiontokens']);
|
||||
$this->assertEquals('gpt-4o-2024-05-13', $result['model']);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -199,6 +200,7 @@ final class process_generate_text_test extends \advanced_testcase {
|
||||
'finishreason' => 'stop',
|
||||
'prompttokens' => '11',
|
||||
'completiontokens' => '14',
|
||||
'model' => 'gpt-4o',
|
||||
];
|
||||
|
||||
$result = $method->invoke($processor, $response);
|
||||
@ -208,6 +210,7 @@ final class process_generate_text_test extends \advanced_testcase {
|
||||
$this->assertEquals('generate_text', $result->get_actionname());
|
||||
$this->assertEquals($response['success'], $result->get_success());
|
||||
$this->assertEquals($response['generatedcontent'], $result->get_response_data()['generatedcontent']);
|
||||
$this->assertEquals($response['model'], $result->get_response_data()['model']);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -144,7 +144,7 @@ final class process_summarise_text_test extends \advanced_testcase {
|
||||
$this->assertEquals('stop', $result['finishreason']);
|
||||
$this->assertEquals('12', $result['prompttokens']);
|
||||
$this->assertEquals('14', $result['completiontokens']);
|
||||
|
||||
$this->assertEquals('gpt-4o-2024-05-13', $result['model']);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -172,6 +172,7 @@ final class process_summarise_text_test extends \advanced_testcase {
|
||||
$this->assertEquals('stop', $result['finishreason']);
|
||||
$this->assertEquals('12', $result['prompttokens']);
|
||||
$this->assertEquals('14', $result['completiontokens']);
|
||||
$this->assertEquals('gpt-4o-2024-05-13', $result['model']);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -191,6 +192,7 @@ final class process_summarise_text_test extends \advanced_testcase {
|
||||
'finishreason' => 'stop',
|
||||
'prompttokens' => '11',
|
||||
'completiontokens' => '568',
|
||||
'model' => 'gpt-4o',
|
||||
];
|
||||
|
||||
$result = $method->invoke($processor, $response);
|
||||
@ -200,6 +202,7 @@ final class process_summarise_text_test extends \advanced_testcase {
|
||||
$this->assertEquals('summarise_text', $result->get_actionname());
|
||||
$this->assertEquals($response['success'], $result->get_success());
|
||||
$this->assertEquals($response['generatedcontent'], $result->get_response_data()['generatedcontent']);
|
||||
$this->assertEquals($response['model'], $result->get_response_data()['model']);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -115,6 +115,7 @@ class process_generate_image extends abstract_processor {
|
||||
'success' => true,
|
||||
'sourceurl' => $bodyobj->data[0]->url,
|
||||
'revisedprompt' => $bodyobj->data[0]->revised_prompt,
|
||||
'model' => $this->get_model(), // There is no model in the response, use config.
|
||||
];
|
||||
}
|
||||
|
||||
|
@ -96,6 +96,7 @@ class process_generate_text extends abstract_processor {
|
||||
'finishreason' => $bodyobj->choices[0]->finish_reason,
|
||||
'prompttokens' => $bodyobj->usage->prompt_tokens,
|
||||
'completiontokens' => $bodyobj->usage->completion_tokens,
|
||||
'model' => $bodyobj->model ?? $this->get_model(), // Fallback to config model.
|
||||
];
|
||||
}
|
||||
}
|
||||
|
@ -165,6 +165,7 @@ final class process_generate_image_test extends \advanced_testcase {
|
||||
|
||||
$this->stringContains('An image that represents the concept of a \'test\'.', $result['revisedprompt']);
|
||||
$this->stringContains('oaidalleapiprodscus.blob.core.windows.net', $result['sourceurl']);
|
||||
$this->assertEquals('dall-e-3', $result['model']);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -210,6 +211,7 @@ final class process_generate_image_test extends \advanced_testcase {
|
||||
|
||||
$this->stringContains('An image that represents the concept of a \'test\'.', $result['revisedprompt']);
|
||||
$this->stringContains('oaidalleapiprodscus.blob.core.windows.net', $result['sourceurl']);
|
||||
$this->assertEquals('dall-e-3', $result['model']);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -225,6 +227,7 @@ final class process_generate_image_test extends \advanced_testcase {
|
||||
'success' => true,
|
||||
'revisedprompt' => 'An image that represents the concept of a \'test\'.',
|
||||
'imageurl' => 'oaidalleapiprodscus.blob.core.windows.net',
|
||||
'model' => 'dall-e-3',
|
||||
];
|
||||
|
||||
$result = $method->invoke($processor, $response);
|
||||
@ -234,6 +237,7 @@ final class process_generate_image_test extends \advanced_testcase {
|
||||
$this->assertEquals('generate_image', $result->get_actionname());
|
||||
$this->assertEquals($response['success'], $result->get_success());
|
||||
$this->assertEquals($response['revisedprompt'], $result->get_response_data()['revisedprompt']);
|
||||
$this->assertEquals($response['model'], $result->get_response_data()['model']);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -150,7 +150,7 @@ final class process_generate_text_test extends \advanced_testcase {
|
||||
$this->assertEquals('stop', $result['finishreason']);
|
||||
$this->assertEquals('11', $result['prompttokens']);
|
||||
$this->assertEquals('568', $result['completiontokens']);
|
||||
|
||||
$this->assertEquals('gpt-4o-2024-05-13', $result['model']);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -178,6 +178,7 @@ final class process_generate_text_test extends \advanced_testcase {
|
||||
$this->assertEquals('stop', $result['finishreason']);
|
||||
$this->assertEquals('11', $result['prompttokens']);
|
||||
$this->assertEquals('568', $result['completiontokens']);
|
||||
$this->assertEquals('gpt-4o-2024-05-13', $result['model']);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -197,6 +198,7 @@ final class process_generate_text_test extends \advanced_testcase {
|
||||
'finishreason' => 'stop',
|
||||
'prompttokens' => '11',
|
||||
'completiontokens' => '568',
|
||||
'model' => 'gpt-4o',
|
||||
];
|
||||
|
||||
$result = $method->invoke($processor, $response);
|
||||
@ -206,6 +208,7 @@ final class process_generate_text_test extends \advanced_testcase {
|
||||
$this->assertEquals('generate_text', $result->get_actionname());
|
||||
$this->assertEquals($response['success'], $result->get_success());
|
||||
$this->assertEquals($response['generatedcontent'], $result->get_response_data()['generatedcontent']);
|
||||
$this->assertEquals($response['model'], $result->get_response_data()['model']);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -144,7 +144,7 @@ final class process_summarise_text_test extends \advanced_testcase {
|
||||
$this->assertEquals('stop', $result['finishreason']);
|
||||
$this->assertEquals('11', $result['prompttokens']);
|
||||
$this->assertEquals('568', $result['completiontokens']);
|
||||
|
||||
$this->assertEquals('gpt-4o-2024-05-13', $result['model']);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -172,6 +172,7 @@ final class process_summarise_text_test extends \advanced_testcase {
|
||||
$this->assertEquals('stop', $result['finishreason']);
|
||||
$this->assertEquals('11', $result['prompttokens']);
|
||||
$this->assertEquals('568', $result['completiontokens']);
|
||||
$this->assertEquals('gpt-4o-2024-05-13', $result['model']);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -191,6 +192,7 @@ final class process_summarise_text_test extends \advanced_testcase {
|
||||
'finishreason' => 'stop',
|
||||
'prompttokens' => '11',
|
||||
'completiontokens' => '568',
|
||||
'model' => 'gpt-4o',
|
||||
];
|
||||
|
||||
$result = $method->invoke($processor, $response);
|
||||
@ -200,6 +202,7 @@ final class process_summarise_text_test extends \advanced_testcase {
|
||||
$this->assertEquals('summarise_text', $result->get_actionname());
|
||||
$this->assertEquals($response['success'], $result->get_success());
|
||||
$this->assertEquals($response['generatedcontent'], $result->get_response_data()['generatedcontent']);
|
||||
$this->assertEquals($response['model'], $result->get_response_data()['model']);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -85,6 +85,7 @@ final class generate_image_test extends \advanced_testcase {
|
||||
$body = [
|
||||
'revisedprompt' => 'This is a revised prompt',
|
||||
'sourceurl' => 'https://example.com/image.png',
|
||||
'model' => 'dall-e-3',
|
||||
];
|
||||
$actionresponse = new response_generate_image(
|
||||
success: true,
|
||||
|
@ -70,6 +70,7 @@ final class generate_text_test extends \advanced_testcase {
|
||||
'finishreason' => 'stop',
|
||||
'prompttokens' => 9,
|
||||
'completiontokens' => 12,
|
||||
'model' => 'gpt-4o',
|
||||
];
|
||||
$actionresponse = new response_generate_text(
|
||||
success: true,
|
||||
|
@ -70,6 +70,7 @@ final class summarise_text_test extends \advanced_testcase {
|
||||
'finishreason' => 'stop',
|
||||
'prompttokens' => 9,
|
||||
'completiontokens' => 12,
|
||||
'model' => 'gpt-4o',
|
||||
];
|
||||
$actionresponse = new response_summarise_text(
|
||||
success: true,
|
||||
|
@ -304,6 +304,7 @@ final class manager_test extends \advanced_testcase {
|
||||
$body = [
|
||||
'revisedprompt' => 'This is a revised prompt',
|
||||
'imageurl' => 'https://example.com/image.png',
|
||||
'model' => 'dall-e-3',
|
||||
];
|
||||
$actionresponse = new response_generate_image(
|
||||
success: true,
|
||||
@ -327,6 +328,7 @@ final class manager_test extends \advanced_testcase {
|
||||
$this->assertEquals($actionresponse->get_errormessage(), $record->errormessage);
|
||||
$this->assertEquals($action->get_configuration('timecreated'), $record->timecreated);
|
||||
$this->assertEquals($actionresponse->get_timecreated(), $record->timecompleted);
|
||||
$this->assertEquals($actionresponse->get_model_used(), $record->model);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -86,6 +86,7 @@ final class provider_test extends \advanced_testcase {
|
||||
'finishreason' => 'stop',
|
||||
'prompttokens' => 9,
|
||||
'completiontokens' => 12,
|
||||
'model' => 'gpt-4o',
|
||||
];
|
||||
$actionresponse = new response_generate_text(
|
||||
success: true,
|
||||
@ -118,6 +119,7 @@ final class provider_test extends \advanced_testcase {
|
||||
$body = [
|
||||
'revisedprompt' => 'This is a revised prompt',
|
||||
'sourceurl' => 'https://example.com/image.png',
|
||||
'model' => 'dall-e-3',
|
||||
];
|
||||
$actionresponse = new response_generate_image(
|
||||
success: true,
|
||||
@ -157,6 +159,7 @@ final class provider_test extends \advanced_testcase {
|
||||
'finishreason' => 'stop',
|
||||
'prompttokens' => 9,
|
||||
'completiontokens' => 12,
|
||||
'model' => 'gpt-4o',
|
||||
];
|
||||
$actionresponse = new response_generate_text(
|
||||
success: true,
|
||||
@ -230,6 +233,7 @@ final class provider_test extends \advanced_testcase {
|
||||
'finishreason' => 'stop',
|
||||
'prompttokens' => 9,
|
||||
'completiontokens' => 12,
|
||||
'model' => 'gpt-4o',
|
||||
];
|
||||
$actionresponse = new response_generate_text(
|
||||
success: true,
|
||||
@ -256,6 +260,7 @@ final class provider_test extends \advanced_testcase {
|
||||
'finishreason' => 'stop',
|
||||
'prompttokens' => 10,
|
||||
'completiontokens' => 15,
|
||||
'model' => 'gpt-4o',
|
||||
];
|
||||
$actionresponse = new response_generate_text(
|
||||
success: true,
|
||||
@ -288,6 +293,7 @@ final class provider_test extends \advanced_testcase {
|
||||
$this->assertEquals('9', $data->prompttokens);
|
||||
$this->assertEquals('12', $data->completiontoken);
|
||||
$this->assertEquals(get_string('yes'), $data->success);
|
||||
$this->assertEquals('gpt-4o', $data->model);
|
||||
}
|
||||
|
||||
if ($context->instanceid == $course2context->instanceid) {
|
||||
@ -305,6 +311,7 @@ final class provider_test extends \advanced_testcase {
|
||||
$this->assertEquals('10', $data->prompttokens);
|
||||
$this->assertEquals('15', $data->completiontoken);
|
||||
$this->assertEquals(get_string('yes'), $data->success);
|
||||
$this->assertEquals('gpt-4o', $data->model);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -334,6 +341,7 @@ final class provider_test extends \advanced_testcase {
|
||||
$body = [
|
||||
'revisedprompt' => 'This is a revised prompt',
|
||||
'sourceurl' => 'https://example.com/image1.png',
|
||||
'model' => 'dall-e-3',
|
||||
];
|
||||
$actionresponse = new response_generate_image(
|
||||
success: true,
|
||||
@ -360,6 +368,7 @@ final class provider_test extends \advanced_testcase {
|
||||
$body = [
|
||||
'revisedprompt' => 'This is a revised prompt',
|
||||
'sourceurl' => 'https://example.com/image2.png',
|
||||
'model' => 'dall-e-3',
|
||||
];
|
||||
$actionresponse = new response_generate_image(
|
||||
success: true,
|
||||
@ -394,6 +403,7 @@ final class provider_test extends \advanced_testcase {
|
||||
$this->assertEquals('vivid', $data->style);
|
||||
$this->assertEquals('https://example.com/image1.png', $data->sourceurl);
|
||||
$this->assertEquals(get_string('yes'), $data->success);
|
||||
$this->assertEquals('dall-e-3', $data->model);
|
||||
}
|
||||
|
||||
if ($context->instanceid == $course2context->instanceid) {
|
||||
@ -413,6 +423,7 @@ final class provider_test extends \advanced_testcase {
|
||||
$this->assertEquals('vivid', $data->style);
|
||||
$this->assertEquals('https://example.com/image2.png', $data->sourceurl);
|
||||
$this->assertEquals(get_string('yes'), $data->success);
|
||||
$this->assertEquals('dall-e-3', $data->model);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -442,6 +453,7 @@ final class provider_test extends \advanced_testcase {
|
||||
'finishreason' => 'stop',
|
||||
'prompttokens' => 9,
|
||||
'completiontokens' => 12,
|
||||
'model' => 'gpt-4o',
|
||||
];
|
||||
$actionresponse = new response_summarise_text(
|
||||
success: true,
|
||||
@ -468,6 +480,7 @@ final class provider_test extends \advanced_testcase {
|
||||
'finishreason' => 'stop',
|
||||
'prompttokens' => 10,
|
||||
'completiontokens' => 15,
|
||||
'model' => 'gpt-4o',
|
||||
];
|
||||
$actionresponse = new response_summarise_text(
|
||||
success: true,
|
||||
@ -500,6 +513,7 @@ final class provider_test extends \advanced_testcase {
|
||||
$this->assertEquals('9', $data->prompttokens);
|
||||
$this->assertEquals('12', $data->completiontoken);
|
||||
$this->assertEquals(get_string('yes'), $data->success);
|
||||
$this->assertEquals('gpt-4o', $data->model);
|
||||
}
|
||||
|
||||
if ($context->instanceid == $course2context->instanceid) {
|
||||
@ -517,6 +531,7 @@ final class provider_test extends \advanced_testcase {
|
||||
$this->assertEquals('10', $data->prompttokens);
|
||||
$this->assertEquals('15', $data->completiontoken);
|
||||
$this->assertEquals(get_string('yes'), $data->success);
|
||||
$this->assertEquals('gpt-4o', $data->model);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -575,6 +590,7 @@ final class provider_test extends \advanced_testcase {
|
||||
'finishreason' => 'stop',
|
||||
'prompttokens' => 9,
|
||||
'completiontokens' => 12,
|
||||
'model' => 'gpt-4o',
|
||||
];
|
||||
$actionresponse = new response_generate_text(
|
||||
success: true,
|
||||
@ -600,6 +616,7 @@ final class provider_test extends \advanced_testcase {
|
||||
'finishreason' => 'stop',
|
||||
'prompttokens' => 10,
|
||||
'completiontokens' => 15,
|
||||
'model' => 'gpt-4o',
|
||||
];
|
||||
$actionresponse = new response_generate_text(
|
||||
success: true,
|
||||
@ -651,6 +668,7 @@ final class provider_test extends \advanced_testcase {
|
||||
$body = [
|
||||
'revisedprompt' => 'This is a revised prompt',
|
||||
'sourceurl' => 'https://example.com/image1.png',
|
||||
'model' => 'dall-e-3',
|
||||
];
|
||||
$actionresponse = new response_generate_image(
|
||||
success: true,
|
||||
@ -676,6 +694,7 @@ final class provider_test extends \advanced_testcase {
|
||||
$body = [
|
||||
'revisedprompt' => 'This is a revised prompt',
|
||||
'sourceurl' => 'https://example.com/image2.png',
|
||||
'model' => 'dall-e-3',
|
||||
];
|
||||
$actionresponse = new response_generate_image(
|
||||
success: true,
|
||||
@ -725,6 +744,7 @@ final class provider_test extends \advanced_testcase {
|
||||
'finishreason' => 'stop',
|
||||
'prompttokens' => 9,
|
||||
'completiontokens' => 12,
|
||||
'model' => 'gpt-4o',
|
||||
];
|
||||
$actionresponse = new response_summarise_text(
|
||||
success: true,
|
||||
@ -750,6 +770,7 @@ final class provider_test extends \advanced_testcase {
|
||||
'finishreason' => 'stop',
|
||||
'prompttokens' => 10,
|
||||
'completiontokens' => 15,
|
||||
'model' => 'gpt-4o',
|
||||
];
|
||||
$actionresponse = new response_summarise_text(
|
||||
success: true,
|
||||
@ -800,6 +821,7 @@ final class provider_test extends \advanced_testcase {
|
||||
'finishreason' => 'stop',
|
||||
'prompttokens' => 9,
|
||||
'completiontokens' => 12,
|
||||
'model' => 'gpt-4o',
|
||||
];
|
||||
$actionresponse = new response_generate_text(
|
||||
success: true,
|
||||
@ -825,6 +847,7 @@ final class provider_test extends \advanced_testcase {
|
||||
'finishreason' => 'stop',
|
||||
'prompttokens' => 10,
|
||||
'completiontokens' => 15,
|
||||
'model' => 'gpt-4o',
|
||||
];
|
||||
$actionresponse = new response_generate_text(
|
||||
success: true,
|
||||
@ -877,6 +900,7 @@ final class provider_test extends \advanced_testcase {
|
||||
$body = [
|
||||
'revisedprompt' => 'This is a revised prompt',
|
||||
'sourceurl' => 'https://example.com/image1.png',
|
||||
'model' => 'dall-e-3',
|
||||
];
|
||||
$actionresponse = new response_generate_image(
|
||||
success: true,
|
||||
@ -902,6 +926,7 @@ final class provider_test extends \advanced_testcase {
|
||||
$body = [
|
||||
'revisedprompt' => 'This is a revised prompt',
|
||||
'sourceurl' => 'https://example.com/image2.png',
|
||||
'model' => 'dall-e-3',
|
||||
];
|
||||
$actionresponse = new response_generate_image(
|
||||
success: true,
|
||||
@ -952,6 +977,7 @@ final class provider_test extends \advanced_testcase {
|
||||
'finishreason' => 'stop',
|
||||
'prompttokens' => 9,
|
||||
'completiontokens' => 12,
|
||||
'model' => 'gpt-4o',
|
||||
];
|
||||
$actionresponse = new response_summarise_text(
|
||||
success: true,
|
||||
@ -977,6 +1003,7 @@ final class provider_test extends \advanced_testcase {
|
||||
'finishreason' => 'stop',
|
||||
'prompttokens' => 10,
|
||||
'completiontokens' => 15,
|
||||
'model' => 'gpt-4o',
|
||||
];
|
||||
$actionresponse = new response_summarise_text(
|
||||
success: true,
|
||||
@ -1059,6 +1086,7 @@ final class provider_test extends \advanced_testcase {
|
||||
'finishreason' => 'stop',
|
||||
'prompttokens' => 9,
|
||||
'completiontokens' => 12,
|
||||
'model' => 'gpt-4o',
|
||||
];
|
||||
$actionresponse = new response_generate_text(
|
||||
success: true,
|
||||
@ -1084,6 +1112,7 @@ final class provider_test extends \advanced_testcase {
|
||||
'finishreason' => 'stop',
|
||||
'prompttokens' => 10,
|
||||
'completiontokens' => 15,
|
||||
'model' => 'gpt-4o',
|
||||
];
|
||||
$actionresponse = new response_generate_text(
|
||||
success: true,
|
||||
@ -1132,6 +1161,7 @@ final class provider_test extends \advanced_testcase {
|
||||
$body = [
|
||||
'revisedprompt' => 'This is a revised prompt',
|
||||
'sourceurl' => 'https://example.com/image1.png',
|
||||
'model' => 'dall-e-3',
|
||||
];
|
||||
$actionresponse = new response_generate_image(
|
||||
success: true,
|
||||
@ -1157,6 +1187,7 @@ final class provider_test extends \advanced_testcase {
|
||||
$body = [
|
||||
'revisedprompt' => 'This is a revised prompt',
|
||||
'sourceurl' => 'https://example.com/image2.png',
|
||||
'model' => 'dall-e-3',
|
||||
];
|
||||
$actionresponse = new response_generate_image(
|
||||
success: true,
|
||||
@ -1206,6 +1237,7 @@ final class provider_test extends \advanced_testcase {
|
||||
'finishreason' => 'stop',
|
||||
'prompttokens' => 9,
|
||||
'completiontokens' => 12,
|
||||
'model' => 'gpt-4o',
|
||||
];
|
||||
$actionresponse = new response_summarise_text(
|
||||
success: true,
|
||||
@ -1231,6 +1263,7 @@ final class provider_test extends \advanced_testcase {
|
||||
'finishreason' => 'stop',
|
||||
'prompttokens' => 10,
|
||||
'completiontokens' => 15,
|
||||
'model' => 'gpt-4o',
|
||||
];
|
||||
$actionresponse = new response_summarise_text(
|
||||
success: true,
|
||||
@ -1311,6 +1344,7 @@ final class provider_test extends \advanced_testcase {
|
||||
'finishreason' => 'stop',
|
||||
'prompttokens' => 9,
|
||||
'completiontokens' => 12,
|
||||
'model' => 'gpt-4o',
|
||||
];
|
||||
$actionresponse = new response_generate_text(
|
||||
success: true,
|
||||
@ -1336,6 +1370,7 @@ final class provider_test extends \advanced_testcase {
|
||||
'finishreason' => 'stop',
|
||||
'prompttokens' => 10,
|
||||
'completiontokens' => 15,
|
||||
'model' => 'gpt-4o',
|
||||
];
|
||||
$actionresponse = new response_generate_text(
|
||||
success: true,
|
||||
@ -1391,6 +1426,7 @@ final class provider_test extends \advanced_testcase {
|
||||
$body = [
|
||||
'revisedprompt' => 'This is a revised prompt',
|
||||
'sourceurl' => 'https://example.com/image1.png',
|
||||
'model' => 'dall-e-3',
|
||||
];
|
||||
$actionresponse = new response_generate_image(
|
||||
success: true,
|
||||
@ -1416,6 +1452,7 @@ final class provider_test extends \advanced_testcase {
|
||||
$body = [
|
||||
'revisedprompt' => 'This is a revised prompt',
|
||||
'sourceurl' => 'https://example.com/image2.png',
|
||||
'model' => 'dall-e-3',
|
||||
];
|
||||
$actionresponse = new response_generate_image(
|
||||
success: true,
|
||||
@ -1468,6 +1505,7 @@ final class provider_test extends \advanced_testcase {
|
||||
'finishreason' => 'stop',
|
||||
'prompttokens' => 9,
|
||||
'completiontokens' => 12,
|
||||
'model' => 'gpt-4o',
|
||||
];
|
||||
$actionresponse = new response_summarise_text(
|
||||
success: true,
|
||||
@ -1493,6 +1531,7 @@ final class provider_test extends \advanced_testcase {
|
||||
'finishreason' => 'stop',
|
||||
'prompttokens' => 10,
|
||||
'completiontokens' => 15,
|
||||
'model' => 'gpt-4o',
|
||||
];
|
||||
$actionresponse = new response_summarise_text(
|
||||
success: true,
|
||||
|
@ -85,6 +85,7 @@ $string['privacy:metadata:ai_action_generate_text:responseid'] = 'The ID of the
|
||||
$string['privacy:metadata:ai_action_register'] = 'A table storing the action requests made by users.';
|
||||
$string['privacy:metadata:ai_action_register:actionid'] = 'The ID of the action request.';
|
||||
$string['privacy:metadata:ai_action_register:actionname'] = 'The action name of the request.';
|
||||
$string['privacy:metadata:ai_action_register:model'] = 'The model used to generate the response.';
|
||||
$string['privacy:metadata:ai_action_register:provider'] = 'The name of the provider that handled the request.';
|
||||
$string['privacy:metadata:ai_action_register:success'] = 'The state of the action request.';
|
||||
$string['privacy:metadata:ai_action_register:timecompleted'] = 'The completed time of the request.';
|
||||
|
@ -756,6 +756,7 @@ class registration {
|
||||
'fail_count' => 0,
|
||||
'times' => [],
|
||||
'errors' => [],
|
||||
'modelstemp' => [],
|
||||
];
|
||||
}
|
||||
|
||||
@ -769,9 +770,13 @@ class registration {
|
||||
// Collect errors for determing the predominant one.
|
||||
$data[$provider][$actionname]['errors'][] = $action->errorcode;
|
||||
}
|
||||
|
||||
// Collect models used and identify unknown ones.
|
||||
$model = $action->model ?? 'unknown';
|
||||
$data[$provider][$actionname]['modelstemp'][] = $model;
|
||||
}
|
||||
|
||||
// Parse the errors and everage the times, then add them to the data.
|
||||
// Parse the errors, average the times, count the models and then add them to the data.
|
||||
foreach ($data as $p => $provider) {
|
||||
foreach ($provider as $a => $actionname) {
|
||||
if (isset($data[$p][$a]['errors'])) {
|
||||
@ -796,6 +801,15 @@ class registration {
|
||||
}
|
||||
}
|
||||
unset($data[$p][$a]['times']);
|
||||
|
||||
if (isset($data[$p][$a]['modelstemp'])) {
|
||||
// Create an array with the models counted.
|
||||
$countedmodels = array_count_values($data[$p][$a]['modelstemp']);
|
||||
foreach ($countedmodels as $model => $count) {
|
||||
$data[$p][$a]['models'][$model]['count'] = $count;
|
||||
}
|
||||
}
|
||||
unset($data[$p][$a]['modelstemp']);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1,5 +1,5 @@
|
||||
<?xml version="1.0" encoding="UTF-8" ?>
|
||||
<XMLDB PATH="lib/db" VERSION="20240923" COMMENT="XMLDB file for core Moodle tables"
|
||||
<XMLDB PATH="lib/db" VERSION="20241025" COMMENT="XMLDB file for core Moodle tables"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:noNamespaceSchemaLocation="../../lib/xmldb/xmldb.xsd"
|
||||
>
|
||||
@ -4899,6 +4899,7 @@
|
||||
<FIELD NAME="errormessage" TYPE="text" NOTNULL="false" SEQUENCE="false" COMMENT="If there was an error this was the message"/>
|
||||
<FIELD NAME="timecreated" TYPE="int" LENGTH="10" NOTNULL="true" SEQUENCE="false" COMMENT="Timestamp of when the action was created"/>
|
||||
<FIELD NAME="timecompleted" TYPE="int" LENGTH="10" NOTNULL="false" SEQUENCE="false" COMMENT="Timestamp of when the action was completed, as recorded by the manager"/>
|
||||
<FIELD NAME="model" TYPE="char" LENGTH="50" NOTNULL="false" SEQUENCE="false" COMMENT="The model used to generate the response"/>
|
||||
</FIELDS>
|
||||
<KEYS>
|
||||
<KEY NAME="primary" TYPE="primary" FIELDS="id"/>
|
||||
|
@ -1447,5 +1447,20 @@ function xmldb_main_upgrade($oldversion) {
|
||||
// Automatically generated Moodle v4.5.0 release upgrade line.
|
||||
// Put any upgrade step following this.
|
||||
|
||||
if ($oldversion < 2024110400.00) {
|
||||
|
||||
// Define field model to be added to ai_action_register.
|
||||
$table = new xmldb_table('ai_action_register');
|
||||
$field = new xmldb_field('model', XMLDB_TYPE_CHAR, '50', null, null, null, null, null);
|
||||
|
||||
// Conditionally launch add field model.
|
||||
if (!$dbman->field_exists($table, $field)) {
|
||||
$dbman->add_field($table, $field);
|
||||
}
|
||||
|
||||
// Main savepoint reached.
|
||||
upgrade_main_savepoint(true, 2024110400.00);
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
@ -94,6 +94,9 @@ class registration_test extends \advanced_testcase {
|
||||
$this->resetAfterTest();
|
||||
$clock = $this->mock_clock_with_frozen();
|
||||
|
||||
$gpt4omodel = 'gpt-4o';
|
||||
$dalle3model = 'dall-e-3';
|
||||
|
||||
// Record some generated text.
|
||||
$record = new \stdClass();
|
||||
$record->provider = 'openai';
|
||||
@ -104,15 +107,17 @@ class registration_test extends \advanced_testcase {
|
||||
$record->success = true;
|
||||
$record->timecreated = $clock->time() - 5;
|
||||
$record->timecompleted = $clock->time();
|
||||
$record->model = $gpt4omodel;
|
||||
$DB->insert_record('ai_action_register', $record);
|
||||
|
||||
// Record a generated image.
|
||||
$record->actionname = 'generate_image';
|
||||
$record->actionid = 2;
|
||||
$record->actionid = 111;
|
||||
$record->timecreated = $clock->time() - 20;
|
||||
$record->model = $dalle3model;
|
||||
$DB->insert_record('ai_action_register', $record);
|
||||
// Record another image.
|
||||
$record->actionid = 3;
|
||||
$record->actionid = 222;
|
||||
$record->timecreated = $clock->time() - 10;
|
||||
$DB->insert_record('ai_action_register', $record);
|
||||
|
||||
@ -121,6 +126,7 @@ class registration_test extends \advanced_testcase {
|
||||
$record->actionid = 4;
|
||||
$record->success = false;
|
||||
$record->errorcode = 403;
|
||||
$record->model = null;
|
||||
$DB->insert_record('ai_action_register', $record);
|
||||
$record->actionid = 5;
|
||||
$record->errorcode = 403;
|
||||
@ -143,5 +149,9 @@ class registration_test extends \advanced_testcase {
|
||||
// Check time range is set correctly.
|
||||
$this->assertEquals($clock->time() - WEEKSECS, $aisuage->time_range->timefrom);
|
||||
$this->assertEquals($clock->time(), $aisuage->time_range->timeto);
|
||||
// Check model counts.
|
||||
$this->assertEquals(1, $aisuage->openai->generate_text->models->{$gpt4omodel}->count);
|
||||
$this->assertEquals(2, $aisuage->openai->generate_image->models->{$dalle3model}->count);
|
||||
$this->assertEquals(3, $aisuage->openai->generate_image->models->unknown->count);
|
||||
}
|
||||
}
|
||||
|
@ -29,7 +29,7 @@
|
||||
|
||||
defined('MOODLE_INTERNAL') || die();
|
||||
|
||||
$version = 2024110100.00; // YYYYMMDD = weekly release date of this DEV branch.
|
||||
$version = 2024110400.00; // YYYYMMDD = weekly release date of this DEV branch.
|
||||
// RR = release increments - 00 in DEV branches.
|
||||
// .XX = incremental changes.
|
||||
$release = '5.0dev (Build: 20241101)'; // Human-friendly version name
|
||||
|
Loading…
x
Reference in New Issue
Block a user