GLM 4.5 Air

Firebase Genkit: Use External Prompt Files in Chat

Complete guide to using external prompt files with Firebase Genkit's chat functionality. Learn how to integrate .prompt files with chat.send() method for better code organization.

Question

How can I use an external prompt file with Firebase Genkit’s chat functionality instead of coding the system prompt directly in my code? I’m trying to integrate a .prompt file with the chat.send() method but the prompt is executing independently rather than being used in the chat context.

Current implementation:

javascript
const session = agenticAi.createSession<any>({
  initialState: { uid: uid },
});

const chat = session.chat({
  model: googleAI.model('gemini-2.5-flash'),
  tools: [getUserProfile, getFinanceData],
  maxTurns: 1,
  system: `To do the financial analysis use the tools you have to fetch users profile and current financial data using the passed uid ${uid}.`,
});

const response = await chat.send(msg)

When I try to use an external prompt file:

javascript
const firePrompt = agenticAi.prompt('fire');
const promptResp = await firePrompt({ uid: uid, msg: msg });
console.log("fire prompt is:", promptResp.text)

My .prompt file:

yaml
---
model: googleai/gemini-2.5-flash
input:
  schema:
    uid: string
    msg: string
---
{{role "system"}}
To do the financial analysis use the tools you have to fetch users profile and current financial data using the passed uid {{uid}}. 
{{role "user"}}
{{msg}}

How can I modify this to use the external prompt with chat.send() instead of executing it independently?

GLM 4.5 Air

How to Use External Prompt Files with Firebase Genkit’s Chat Functionality

Using external prompt files with Genkit’s chat functionality requires understanding how to properly integrate these prompts into the chat context rather than executing them independently. Here are several approaches to achieve this:

Brief Answer

To use an external prompt file with Firebase Genkit’s chat functionality, you need to load the prompt file, extract the system prompt from it, and then incorporate that system prompt into your chat configuration. Instead of executing the prompt independently with agenticAi.prompt('fire'), you should use the system parameter in your chat configuration with the content from your external prompt file.


Contents


Loading and Using External Prompts in Chat Configuration

The key challenge is that chat.send() is designed to continue an existing conversation, not to initialize it with an external system prompt. When you use agenticAi.prompt('fire'), you’re executing the prompt independently and getting a response, but this doesn’t integrate with the chat context.

To integrate your external prompt with the chat functionality, you need to:

  1. Load the content of your prompt file
  2. Extract or process the system prompt section
  3. Use that content in your chat configuration

Approach 1: Load System Prompt from External File

You can modify your implementation to load the system prompt from your external file and use it directly in the chat configuration:

javascript
// First, load your prompt file content
const firePrompt = agenticAi.prompt('fire');
const promptTemplate = await firePrompt({ uid: uid, msg: msg });

// Extract just the system prompt part from your template
// This assumes your prompt file has a clear system message section
const systemPrompt = `To do the financial analysis use the tools you have to fetch users profile and current financial data using the passed uid ${uid}.`;

// Now use this system prompt in your chat configuration
const session = agenticAi.createSession<any>({
  initialState: { uid: uid },
});

const chat = session.chat({
  model: googleAI.model('gemini-2.5-flash'),
  tools: [getUserProfile, getFinanceData],
  maxTurns: 1,
  system: systemPrompt, // Use the extracted system prompt
});

const response = await chat.send(msg);

Approach 2: Process Prompt File for Chat Context

For more complex prompt files, you may need to process the template to extract the system message properly:

javascript
// Function to extract system message from prompt file
async function getSystemPromptFromFirePrompt(uid) {
  const firePrompt = agenticAi.prompt('fire');
  
  // Generate just the system part by providing only required parameters
  const systemPrompt = await firePrompt({
    uid: uid,
    // Don't provide msg to get only system part
  });
  
  // Clean up the response to get just the system message
  return systemPrompt.text.split('{{role "user"}}')[0].trim();
}

// Usage in your chat setup
const session = agenticAi.createSession<any>({
  initialState: { uid: uid },
});

const systemPrompt = await getSystemPromptFromFirePrompt(uid);

const chat = session.chat({
  model: googleAI.model('gemini-2.5-flash'),
  tools: [getUserProfile, getFinanceData],
  maxTurns: 1,
  system: systemPrompt,
});

const response = await chat.send(msg);

Approach 3: Create a Custom Chat Initialization Function

For a more reusable solution, create a helper function that initializes chat with your external prompt:

javascript
// Helper function to create chat with external prompt
async function createChatWithExternalPrompt(uid, model, tools) {
  // Load system prompt from external file
  const firePrompt = agenticAi.prompt('fire');
  const systemContent = await firePrompt({
    uid: uid,
    // Only get system part initially
  });
  
  // Extract system message
  const systemPrompt = systemContent.text.split('{{role "user"}}')[0].trim();
  
  // Create session and chat
  const session = agenticAi.createSession<any>({
    initialState: { uid: uid },
  });
  
  return session.chat({
    model: model,
    tools: tools,
    maxTurns: 1,
    system: systemPrompt,
  });
}

// Usage
const chat = await createChatWithExternalPrompt(
  uid,
  googleAI.model('gemini-2.5-flash'),
  [getUserProfile, getFinanceData]
);

const response = await chat.send(msg);

Best Practices for External Prompt Files in Chat

Structuring Your Prompt File for Chat

Make your prompt file more chat-friendly by separating system and user messages:

yaml
---
model: googleai/gemini-2.5-flash
input:
  schema:
    uid: string
    msg: string
    # Add separate parameters for system and user messages
    system_context: string
    user_message: string
---
{{system_context}}
{{user_message}}

Using Dynamic Parameters

Modify your prompt to better handle dynamic content:

javascript
// In your code
const firePrompt = agenticAi.prompt('fire');
const systemContext = `To do the financial analysis use the tools you have to fetch users profile and current financial data using the passed uid ${uid}.`;

const chat = session.chat({
  model: googleAI.model('gemini-2.5-flash'),
  tools: [getUserProfile, getFinanceData],
  maxTurns: 1,
  // Use the prompt as a template with dynamic parameters
  system: await firePrompt({
    system_context: systemContext,
    user_message: "", // Empty for system prompt only
  }),
});

Prompt Composition for Multi-turn Conversations

For more complex chat scenarios, consider having separate prompt files for different parts of the conversation:

javascript
// System prompt file (system.prompt)
---
model: googleai/gemini-2.5-flash
input:
  schema:
    uid: string
---
{{role "system"}}
You are a financial assistant. Use the provided tools to analyze user data.
User ID: {{uid}}
---

// User message template (user_template.prompt)
---
model: googleai/gemini-2.5-flash
input:
  schema:
    message: string
    context: string
---
{{role "user"}}
{{context}}

{{message}}
---

Troubleshooting Common Issues

Issue: Prompt Executes Independently

If your prompt is still executing independently rather than integrating with chat, ensure you’re not calling agenticAi.prompt('fire') directly in your chat flow. Instead, use its content to configure the chat.

Issue: Variable Substitution Not Working

Check that your variable names in the prompt file match those in your parameters. Genkit is strict about template variable matching.

Issue: Chat Context Not Maintained

Remember that chat sessions maintain context between messages. If you’re seeing unexpected behavior, verify that you’re properly initializing the chat with the system prompt only once.

Issue: Performance with Large Prompt Files

For large prompt files, consider caching the loaded prompt content to avoid repeated file I/O operations during each chat interaction.


Conclusion

To effectively use external prompt files with Firebase Genkit’s chat functionality:

  1. Load your prompt file using agenticAi.prompt()
  2. Extract or process the system prompt content
  3. Use that content in the system parameter of your chat configuration
  4. Avoid executing the prompt independently with chat.send()

By properly integrating your external prompts into the chat configuration rather than executing them separately, you’ll maintain the proper chat context while keeping your system prompts organized in external files. This approach provides the best of both worlds: maintainable prompt files and functional chat interactions.