mirror of
https://github.com/DayuanJiang/next-ai-draw-io.git
synced 2026-01-02 22:32:27 +08:00
fix: enhance permissions in settings and update .gitignore for local config
This commit is contained in:
@@ -1,7 +1,11 @@
|
|||||||
{
|
{
|
||||||
"permissions": {
|
"permissions": {
|
||||||
"allow": [
|
"allow": [
|
||||||
"Bash(npm update:*)"
|
"Bash(npm update:*)",
|
||||||
|
"WebFetch(domain:ai-sdk.dev)",
|
||||||
|
"mcp__ide__getDiagnostics",
|
||||||
|
"Bash(npx tsc:*)",
|
||||||
|
"WebFetch(domain:sdk.vercel.ai)"
|
||||||
],
|
],
|
||||||
"deny": [],
|
"deny": [],
|
||||||
"ask": []
|
"ask": []
|
||||||
|
|||||||
1
.gitignore
vendored
1
.gitignore
vendored
@@ -40,3 +40,4 @@ yarn-error.log*
|
|||||||
*.tsbuildinfo
|
*.tsbuildinfo
|
||||||
next-env.d.ts
|
next-env.d.ts
|
||||||
push-via-ec2.sh
|
push-via-ec2.sh
|
||||||
|
.claude/settings.local.json
|
||||||
|
|||||||
@@ -3,8 +3,6 @@ import { openai } from '@ai-sdk/openai';
|
|||||||
import { google } from '@ai-sdk/google';
|
import { google } from '@ai-sdk/google';
|
||||||
import { smoothStream, streamText, convertToModelMessages } from 'ai';
|
import { smoothStream, streamText, convertToModelMessages } from 'ai';
|
||||||
import { createOpenRouter } from '@openrouter/ai-sdk-provider';
|
import { createOpenRouter } from '@openrouter/ai-sdk-provider';
|
||||||
import { readFileSync } from 'fs';
|
|
||||||
import { resolve } from 'path';
|
|
||||||
import { createGoogleGenerativeAI } from '@ai-sdk/google';
|
import { createGoogleGenerativeAI } from '@ai-sdk/google';
|
||||||
import { createOpenAI } from '@ai-sdk/openai';
|
import { createOpenAI } from '@ai-sdk/openai';
|
||||||
|
|
||||||
@@ -13,18 +11,16 @@ import { replaceXMLParts } from "@/lib/utils";
|
|||||||
|
|
||||||
export const maxDuration = 60
|
export const maxDuration = 60
|
||||||
const openrouter = createOpenRouter({ apiKey: process.env.OPENROUTER_API_KEY });
|
const openrouter = createOpenRouter({ apiKey: process.env.OPENROUTER_API_KEY });
|
||||||
// Read the XML guide from file
|
|
||||||
export async function POST(req: Request) {
|
export async function POST(req: Request) {
|
||||||
const body = await req.json();
|
try {
|
||||||
|
const { messages, xml } = await req.json();
|
||||||
|
|
||||||
// Extract messages and xml directly from the body
|
|
||||||
const { messages, xml } = body;
|
|
||||||
const guide = readFileSync(resolve('./app/api/chat/xml_guide.md'), 'utf8');
|
|
||||||
|
|
||||||
// Read and escape the guide content
|
|
||||||
const systemMessage = `
|
const systemMessage = `
|
||||||
You are an expert diagram creation assistant specializing in draw.io XML generation. Your primary function is crafting clear, well-organized visual diagrams through precise XML specifications.
|
You are an expert diagram creation assistant specializing in draw.io XML generation.
|
||||||
|
Your primary function is crafting clear, well-organized visual diagrams through precise XML specifications.
|
||||||
You can see the image that user uploaded.
|
You can see the image that user uploaded.
|
||||||
|
When you need to generate diagram about aws architecture, use AWS 2025 icons.
|
||||||
You utilize the following tools:
|
You utilize the following tools:
|
||||||
---Tool1---
|
---Tool1---
|
||||||
tool name: display_diagram
|
tool name: display_diagram
|
||||||
@@ -60,8 +56,6 @@ When using edit_diagram tool:
|
|||||||
- Example GOOD edit: {"search": " <mxCell id=\"2\" value=\"Old Text\">", "replace": " <mxCell id=\"2\" value=\"New Text\">"}
|
- Example GOOD edit: {"search": " <mxCell id=\"2\" value=\"Old Text\">", "replace": " <mxCell id=\"2\" value=\"New Text\">"}
|
||||||
- Example BAD edit: Including 10+ unchanged lines just to change one attribute
|
- Example BAD edit: Including 10+ unchanged lines just to change one attribute
|
||||||
- For multiple changes, use separate edits: [{"search": "line1", "replace": "new1"}, {"search": "line2", "replace": "new2"}]
|
- For multiple changes, use separate edits: [{"search": "line1", "replace": "new1"}, {"search": "line2", "replace": "new2"}]
|
||||||
|
|
||||||
here is a guide for the XML format: ${guide}
|
|
||||||
`;
|
`;
|
||||||
|
|
||||||
const lastMessage = messages[messages.length - 1];
|
const lastMessage = messages[messages.length - 1];
|
||||||
@@ -69,7 +63,10 @@ here is a guide for the XML format: ${guide}
|
|||||||
// Extract text from the last message parts
|
// Extract text from the last message parts
|
||||||
const lastMessageText = lastMessage.parts?.find((part: any) => part.type === 'text')?.text || '';
|
const lastMessageText = lastMessage.parts?.find((part: any) => part.type === 'text')?.text || '';
|
||||||
|
|
||||||
const formattedContent = `
|
// Extract file parts (images) from the last message
|
||||||
|
const fileParts = lastMessage.parts?.filter((part: any) => part.type === 'file') || [];
|
||||||
|
|
||||||
|
const formattedTextContent = `
|
||||||
Current diagram XML:
|
Current diagram XML:
|
||||||
"""xml
|
"""xml
|
||||||
${xml || ''}
|
${xml || ''}
|
||||||
@@ -87,9 +84,23 @@ ${lastMessageText}
|
|||||||
if (enhancedMessages.length >= 1) {
|
if (enhancedMessages.length >= 1) {
|
||||||
const lastModelMessage = enhancedMessages[enhancedMessages.length - 1];
|
const lastModelMessage = enhancedMessages[enhancedMessages.length - 1];
|
||||||
if (lastModelMessage.role === 'user') {
|
if (lastModelMessage.role === 'user') {
|
||||||
|
// Build content array with text and file parts
|
||||||
|
const contentParts: any[] = [
|
||||||
|
{ type: 'text', text: formattedTextContent }
|
||||||
|
];
|
||||||
|
|
||||||
|
// Add image parts back
|
||||||
|
for (const filePart of fileParts) {
|
||||||
|
contentParts.push({
|
||||||
|
type: 'image',
|
||||||
|
image: filePart.url,
|
||||||
|
mimeType: filePart.mediaType
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
enhancedMessages = [
|
enhancedMessages = [
|
||||||
...enhancedMessages.slice(0, -1),
|
...enhancedMessages.slice(0, -1),
|
||||||
{ ...lastModelMessage, content: formattedContent }
|
{ ...lastModelMessage, content: contentParts }
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -136,7 +147,6 @@ ${lastMessageText}
|
|||||||
},
|
},
|
||||||
edit_diagram: {
|
edit_diagram: {
|
||||||
description: `Edit specific parts of the current diagram by replacing exact line matches. Use this tool to make targeted fixes without regenerating the entire XML.
|
description: `Edit specific parts of the current diagram by replacing exact line matches. Use this tool to make targeted fixes without regenerating the entire XML.
|
||||||
|
|
||||||
IMPORTANT: Keep edits concise:
|
IMPORTANT: Keep edits concise:
|
||||||
- Only include the lines that are changing, plus 1-2 surrounding lines for context if needed
|
- Only include the lines that are changing, plus 1-2 surrounding lines for context if needed
|
||||||
- Break large changes into multiple smaller edits
|
- Break large changes into multiple smaller edits
|
||||||
@@ -154,7 +164,6 @@ IMPORTANT: Keep edits concise:
|
|||||||
});
|
});
|
||||||
|
|
||||||
// Error handler function to provide detailed error messages
|
// Error handler function to provide detailed error messages
|
||||||
|
|
||||||
function errorHandler(error: unknown) {
|
function errorHandler(error: unknown) {
|
||||||
if (error == null) {
|
if (error == null) {
|
||||||
return 'unknown error';
|
return 'unknown error';
|
||||||
@@ -174,4 +183,11 @@ IMPORTANT: Keep edits concise:
|
|||||||
return result.toUIMessageStreamResponse({
|
return result.toUIMessageStreamResponse({
|
||||||
onError: errorHandler,
|
onError: errorHandler,
|
||||||
});
|
});
|
||||||
|
} catch (error) {
|
||||||
|
console.error('Error in chat route:', error);
|
||||||
|
return Response.json(
|
||||||
|
{ error: 'Internal server error' },
|
||||||
|
{ status: 500 }
|
||||||
|
);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user