Declare the AI owner, and let every node borrow its model over the mesh
vv_is_ai_host() was `=== 'host1'`, which made a physical fact — that is where the GPU is — look like a rule. AI_OWNER_HOST declares it, so the card can move to a rebuilt host3 or a friend's spare. The gate was also doing two jobs. Assistant docks and findings strips now ask whether a model is reachable, so a node without a GPU gets them by borrowing; the AI tab asks whether this is the owner, because that page carries the bug reports, the index and the model configuration — the surface where the vocabulary assumes you built the mesh. Resolution is local, then owner, then anyone else declaring a model, pinned once it answers. Pinned rather than re-derived per call: a mesh that re-decides every request eventually decides differently mid-conversation, and a chat whose second turn lands on another machine has no history there. Cleared only on a transport failure, and only when there is somewhere else to go — a single-node mesh whose model is down should say so, not report AI as unconfigured.
This commit is contained in:
@@ -998,8 +998,13 @@ $ctx = stream_context_create(['http' => [
|
||||
|
||||
$fh = @fopen($cfg['url'] . '/api/chat', 'r', false, $ctx);
|
||||
if ($fh === false) {
|
||||
// Unpin, so the next question resolves to another node with a model rather than retrying a
|
||||
// machine that is off. The error still names the endpoint that failed — "it moved on" is only
|
||||
// useful alongside "here is what did not answer".
|
||||
vv_ai_model_failed($cfg['model_host'] ?? '');
|
||||
jw($jobFile, ['status' => 'error',
|
||||
'error' => 'Ollama did not respond within ' . max(30, $cfg['timeout']) . 's at ' . $cfg['url'],
|
||||
'error' => 'Ollama did not respond within ' . max(30, $cfg['timeout']) . 's at ' . $cfg['url']
|
||||
. (!empty($cfg['borrowed']) ? ' (borrowed from ' . $cfg['model_host'] . ')' : ''),
|
||||
'sources' => $sources]);
|
||||
exit(1);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user