feat(ai): iteration budget in prompt + preserve photo-knowledge links
- Inject the max-iterations budget into the agentic system prompt for both insight generation and chat turns. Chat does this per-turn by appending a note to the replayed system message and restoring it before persistence so the note doesn't accumulate across turns. - Stop deleting entity_photo_links at the start of agentic insight generation. The clear made recall_facts_for_photo always return empty, wasting a tool call and discarding knowledge from prior runs. Re-linking the same entity is already an INSERT OR IGNORE no-op. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -2892,8 +2892,11 @@ Return ONLY the summary, nothing else."#,
|
||||
.collect()
|
||||
};
|
||||
|
||||
// 6. Clear existing entity-photo links for this file so the run starts fresh,
|
||||
// and ensure the owner entity exists so the agent can reference it.
|
||||
// 6. Ensure the owner entity exists so the agent can reference it.
|
||||
// Prior entity_photo_links for this file are intentionally preserved
|
||||
// across regenerations — clearing them made `recall_facts_for_photo`
|
||||
// always return empty and discarded hard-won knowledge. Re-linking
|
||||
// the same entity is a no-op (INSERT OR IGNORE).
|
||||
let owner_name = user_display_name();
|
||||
let owner_entity_id: Option<i32> = {
|
||||
let mut kdao = self
|
||||
@@ -2901,14 +2904,6 @@ Return ONLY the summary, nothing else."#,
|
||||
.lock()
|
||||
.expect("Unable to lock KnowledgeDao");
|
||||
|
||||
if let Err(e) = kdao.delete_photo_links_for_file(&insight_cx, &file_path) {
|
||||
log::warn!(
|
||||
"Failed to clear entity_photo_links for {}: {:?}",
|
||||
file_path,
|
||||
e
|
||||
);
|
||||
}
|
||||
|
||||
// Upsert the owner entity so the agent always has a stable entity ID to reference.
|
||||
let owner = crate::database::models::InsertEntity {
|
||||
name: owner_name.clone(),
|
||||
@@ -3000,9 +2995,11 @@ Return ONLY the summary, nothing else."#,
|
||||
4. Use recall_entities to look up known people, places, or things that appear in this photo.\n\
|
||||
5. When you identify people, places, events, or notable things in this photo: use store_entity to record them and store_fact to record key facts (relationships, roles, attributes). This builds a persistent memory for future insights.\n\
|
||||
6. Only produce your final insight AFTER you have gathered context from at least 5 tool calls.\n\
|
||||
7. If a tool returns no results, that is useful information — continue calling the remaining tools anyway.",
|
||||
7. If a tool returns no results, that is useful information — continue calling the remaining tools anyway.\n\
|
||||
8. You have a hard budget of {max_iterations} tool-calling iterations before the loop ends. Plan your context gathering so you can write a complete final insight within that budget.",
|
||||
owner_id_note = owner_id_note,
|
||||
owner_name = owner_name
|
||||
owner_name = owner_name,
|
||||
max_iterations = max_iterations
|
||||
);
|
||||
let system_content = if let Some(ref custom) = custom_system_prompt {
|
||||
format!("{}\n\n{}", custom, base_system)
|
||||
|
||||
Reference in New Issue
Block a user