Jump to content
Main menu
Main menu
move to sidebar
hide
Navigation
Main page
Recent changes
Random page
freem
Search
Search
Appearance
Create account
Log in
Personal tools
Create account
Log in
Pages for logged out editors
learn more
Contributions
Talk
Editing
Openai/691151cc-3da4-800f-9b7c-81b0e0d10369
(section)
Add languages
Page
Discussion
English
Read
Edit
Edit source
View history
Tools
Tools
move to sidebar
hide
Actions
Read
Edit
Edit source
View history
General
What links here
Related changes
Special pages
Page information
Appearance
move to sidebar
hide
Warning:
You are not logged in. Your IP address will be publicly visible if you make any edits. If you
log in
or
create an account
, your edits will be attributed to your username, along with other benefits.
Anti-spam check. Do
not
fill this in!
== gpt-5-mini == === User: ããŸããããŸããïŒããããšãïŒ === ããŸããããŸããïŒããããšãïŒã次ã¯çŸåšã®ãšãã£ã¿ã®ãœãŒã¹ã³ãŒããšã«ãŒãœã«äœçœ®ãååŸããé¡ãããŸãã === Assistant: çŽ æŽãããã§ãïŒ === çŽ æŽãããã§ãïŒ ð ã§ã¯æ¬¡ã«ãã·ã§ãŒãã«ãããæŒãããšãã«çŸåšéããŠãããšãã£ã¿ã®ãœãŒã¹ã³ãŒããšã«ãŒãœã«äœçœ®ãååŸããæ¹æ³ã解説ããŸãã ãã㯠Eclipse ã® <code>ITextEditor</code> ãš <code>IDocument</code> ã䜿ããšå®è£ ã§ããŸãã ==== 1. ã¢ã¯ãã£ããªãšãã£ã¿ãååŸ ==== # <code>ITextEditor</code> ãç¢ºèª # <code>IDocument</code> ãååŸ # ã«ãŒãœã«äœçœ®ïŒãªãã»ããïŒãååŸ # ã«ãŒãœã«äœçœ®ã«åºã¥ããŠè¡çªå·ãåçªå·ãååŸå¯èœ ==== <syntaxhighlight lang="java">package to.silk.i.ai; ==== import org.eclipse.core.commands.AbstractHandler; import org.eclipse.core.commands.ExecutionEvent; import org.eclipse.core.commands.ExecutionException; import org.eclipse.jface.text.IDocument; import org.eclipse.jface.text.ITextSelection; import org.eclipse.jface.text.TextSelection; import org.eclipse.ui.IEditorPart; import org.eclipse.ui.IWorkbenchWindow; import org.eclipse.ui.handlers.HandlerUtil; import org.eclipse.ui.texteditor.ITextEditor; public class AISuggestHandler extends AbstractHandler { @Override public Object execute(ExecutionEvent event) throws ExecutionException { IWorkbenchWindow window = HandlerUtil.getActiveWorkbenchWindow(event); IEditorPart editorPart = HandlerUtil.getActiveEditor(event); if (editorPart instanceof ITextEditor) { ITextEditor textEditor = (ITextEditor) editorPart; IDocument document = textEditor.getDocumentProvider().getDocument(textEditor.getEditorInput()); // ã«ãŒãœã«äœçœ®ãååŸ ITextSelection selection = (ITextSelection) textEditor.getSelectionProvider().getSelection(); int offset = selection.getOffset(); int length = selection.getLength(); int line = selection.getStartLine(); // ãœãŒã¹ã³ãŒãå šäœãååŸ String sourceCode = document.get(); // ãããã°çšã«åºå System.out.println("ã«ãŒãœã«ãªãã»ãã: " + offset); System.out.println("éžæç¯å²ã®é·ã: " + length); System.out.println("ã«ãŒãœã«è¡çªå·: " + (line + 1)); System.out.println("ãœãŒã¹ã³ãŒãå é 100æå: " + sourceCode.substring(0, Math.min(100, sourceCode.length()))); // TODO: ããã§ sourceCode ãš offset ã AI ãµãŒããŒã«éä¿¡ } else { System.out.println("çŸåšã®ãšãã£ã¿ã¯ããã¹ããšãã£ã¿ã§ã¯ãããŸãã"); } return null; } } </syntaxhighlight> ==== | | | ==== | --- | --- | | | | | | | | | | | | | | | | | | | ==== - è€æ°éžæãããŠããå Žå㯠selection.getLength() ã§éžææåæ°ãååŸã§ããŸãã ==== * offset ã AI ã«éãã°ããã©ãã«è£å®ãæ¿å ¥ãããããæ£ç¢ºã«æ±ºããããŸãã * sourceCode ã¯ãã©ã°ã€ã³å ã§èªç±ã«å å·¥å¯èœã§ãã ð¡ ãã®æç¹ã§ãCtrl+Shift+Z ãæŒããšã³ã³ãœãŒã«ã«ã«ãŒãœã«äœçœ®ãšãœãŒã¹ã³ãŒãã®äžéšã衚瀺ãããã¯ãã§ãã ãããŸã§åäœç¢ºèªã§ããããæ¬¡ã¯ ããŒã«ã«AIãµãŒããŒã« POST ãªã¯ãšã¹ããéããè£å®å 容ãååŸããŠè¡šç€ºããéšå ã«é²ããŸãã æ¬¡ã«é²ããŸããïŒ ãããšããŸããååŸãã sourceCode ãš offset ã確èªãããããã°ãããŠã¿ãŸããïŒ === User: The import org.eclipse.jface.text cannot be resolved === The import org.eclipse.jface.text cannot be resolved === Assistant: ãªãã»ã©ããã®ãšã©ãŒã¯ Eclipse ãã©ã°ã€ã³éçºã§å¿ èŠãª JFace Text ã©ã€ãã©ãªãäŸåã«è¿œå ãããŠããªã ããšãåå ã§ãã === ãªãã»ã©ããã®ãšã©ãŒã¯ Eclipse ãã©ã°ã€ã³éçºã§å¿ èŠãª JFace Text ã©ã€ãã©ãªãäŸåã«è¿œå ãããŠããªã ããšãåå ã§ãã org.eclipse.jface.text ããã±ãŒãžã¯ JFace Text ãã³ãã«ã«å«ãŸããŠããŸãã ==== ### ==== META-INF/MANIFEST.MF ãéããã¿ããDependenciesïŒäŸåïŒããéžæããŸãã ===== | | | ===== | --- | --- | | | | ãããŸã 远å ããŠããªãå Žåã¯ïŒ <syntaxhighlight>Require-Bundle: org.eclipse.ui, org.eclipse.core.runtime, org.eclipse.jface.text </syntaxhighlight> ã®ããã«ã«ã³ãåºåãã§è¿œèšããŠãã ããã ===== - Ctrl+S ã§ä¿å ===== * ãããžã§ã¯ããå³ã¯ãªã㯠â Refresh * Eclipse ãäŸåãèªåã§è§£æ±ºããorg.eclipse.jface.text ã䜿ããããã«ãªããŸã ===== - MANIFEST.MF â Dependencies ã¿ãã§ã org.eclipse.jface.text ããªã¹ãã«å ¥ã£ãŠãããç¢ºèª ===== * ãPlug-in Dependenciesãã«ãåæ ãããã¯ãã§ã ===== - Java Editor ããããã¹ããååŸããå Žåãorg.eclipse.jface.text ã¯å¿ é ã§ã ===== * 远å åŸããã³ãã©ã¯ã©ã¹ã§ã®ã€ã³ããŒãã¯ãã®ãŸãŸã§OKã§ãïŒ <syntaxhighlight lang="java">import org.eclipse.jface.text.IDocument; import org.eclipse.jface.text.ITextSelection; </syntaxhighlight> ããã§ã³ã³ãã€ã«ãšã©ãŒã¯è§£æ¶ãããŸãã åžæã§ããã°ããã®ãŸãŸ ã«ãŒãœã«äœçœ®ãšãœãŒã¹ã³ãŒããååŸããŠAIãµãŒããŒã«éãã³ãŒã ãŸã§çµã¿èŸŒãã äŸãæç€ºã§ããŸãã ç¶ããŸããïŒ === User: The import org.eclipse.ui.texteditor cannot be resolved === The import org.eclipse.ui.texteditor cannot be resolved === Assistant: ãªãã»ã©ãä»åã®ãšã©ãŒã¯ org.eclipse.ui.texteditor ããã±ãŒãžãäŸåãã³ãã«ã«è¿œå ãããŠããªã ããšãåå ã§ãã === ãªãã»ã©ãä»åã®ãšã©ãŒã¯ <code>org.eclipse.ui.texteditor</code> ããã±ãŒãžãäŸåãã³ãã«ã«è¿œå ãããŠããªã ããšãåå ã§ãã Eclipse PDE ã§ã¯ããšãã£ã¿æäœã«å¿ èŠãªã¯ã©ã¹ïŒITextEditor ãªã©ïŒã¯ org.eclipse.ui.editors ãã³ãã«ã«å«ãŸããŠããŸãã ==== ### ==== META-INF/MANIFEST.MF ãéããã¿ããDependenciesïŒäŸåïŒããéžæããŸãã ===== | | | ===== | --- | --- | | | | 远å åŸã®äŸïŒ <syntaxhighlight>Require-Bundle: org.eclipse.ui, org.eclipse.core.runtime, org.eclipse.jface.text, org.eclipse.ui.editors </syntaxhighlight> * ã«ã³ãã§åºåã£ãŠè¿œèšããŸãã ===== 1. Ctrl+S ã§ä¿å ===== # ãããžã§ã¯ãå³ã¯ãªã㯠â Refresh # Eclipse ãäŸåã解決ããorg.eclipse.ui.texteditor ã䜿ããããã«ãªããŸã ===== <syntaxhighlight lang="java">import org.eclipse.ui.texteditor.ITextEditor; ===== import org.eclipse.jface.text.IDocument; import org.eclipse.jface.text.ITextSelection; </syntaxhighlight> ===== - org.eclipse.ui.editors ã远å ããããšã§ãITextEditor ã ãã§ãªãã getDocumentProvider() ãªã©ã®ã¡ãœããã䜿ããããã«ãªããŸãã ===== * ããã§ãååæç€ºãããçŸåšã®ãšãã£ã¿ã®ãœãŒã¹ã³ãŒããšã«ãŒãœã«äœçœ®ãååŸããµã³ãã«ã³ãŒãã¯ã³ã³ãã€ã«å¯èœã«ãªããŸãã å¿ èŠã§ããã°ãäŸåã远å ããç¶æ ã§ AISuggestHandler ããœãŒã¹ã³ãŒããšã«ãŒãœã«äœçœ®ãååŸ â AIãµãŒããŒã«éä¿¡ ãŸã§ã®çµ±åãµã³ãã«ãæç€ºã§ããŸãã äœããŸããïŒ === User: åããŸãããã§ã¯AIãµãŒãã«éä¿¡ãŸã§ãé¡ãããŸã === åããŸãããã§ã¯AIãµãŒãã«éä¿¡ãŸã§ãé¡ãããŸã === Assistant: çŽ æŽãããã§ãïŒ === çŽ æŽãããã§ãïŒ ð ã§ã¯ã'''ååŸãããœãŒã¹ã³ãŒããšã«ãŒãœã«äœçœ®ãããŒã«ã«AIãµãŒãïŒhttp://127.0.0.1:1357ïŒã«éä¿¡ããŠãè£å®ãåãåã'''éšåãäœããŸãããã ä»å㯠Java ã®æšæº HTTP ã¯ã©ã€ã¢ã³ãïŒ<code>HttpURLConnection</code>ïŒ ã䜿ã£ãã·ã³ãã«ãªäŸã§èª¬æããŸãã ==== <syntaxhighlight lang="java">package to.silk.i.ai; ==== import org.eclipse.core.commands.AbstractHandler; import org.eclipse.core.commands.ExecutionEvent; import org.eclipse.core.commands.ExecutionException; import org.eclipse.jface.text.IDocument; import org.eclipse.jface.text.ITextSelection; import org.eclipse.ui.IEditorPart; import org.eclipse.ui.IWorkbenchWindow; import org.eclipse.ui.handlers.HandlerUtil; import org.eclipse.ui.texteditor.ITextEditor; import javax.net.ssl.HttpsURLConnection; // HTTPS ãªã import java.io.BufferedReader; import java.io.InputStreamReader; import java.io.OutputStream; import java.net.HttpURLConnection; import java.net.URL; public class AISuggestHandler extends AbstractHandler { private static final String AI_SERVER_URL = "http://127.0.0.1:1357/v1/completions"; @Override public Object execute(ExecutionEvent event) throws ExecutionException { IEditorPart editorPart = HandlerUtil.getActiveEditor(event); if (!(editorPart instanceof ITextEditor)) { System.out.println("çŸåšã®ãšãã£ã¿ã¯ããã¹ããšãã£ã¿ã§ã¯ãããŸãã"); return null; } ITextEditor textEditor = (ITextEditor) editorPart; IDocument document = textEditor.getDocumentProvider().getDocument(textEditor.getEditorInput()); ITextSelection selection = (ITextSelection) textEditor.getSelectionProvider().getSelection(); String sourceCode = document.get(); int cursorOffset = selection.getOffset(); // AI ãµãŒããŒã«éä¿¡ãã JSON ãäœæ String jsonRequest = String.format( "{ \"model\": \"gpt-local\", \"prompt\": \"%s\", \"cursor_offset\": %d, \"max_tokens\": 200 }", escapeJson(sourceCode), cursorOffset ); try { String response = sendPostRequest(AI_SERVER_URL, jsonRequest); // AIã®è¿çãã³ã³ãœãŒã«ã«è¡šç€ºïŒããã§åŸã§UIã«åæ å¯èœïŒ System.out.println("AI Response:\n" + response); } catch (Exception e) { e.printStackTrace(); } return null; } // JSONãšã¹ã±ãŒã private String escapeJson(String text) { return text.replace("\\", "\\\\") .replace("\"", "\\\"") .replace("\n", "\\n") .replace("\r", ""); } // HTTP POST éä¿¡ private String sendPostRequest(String urlStr, String json) throws Exception { URL url = new URL(urlStr); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); conn.setDoOutput(true); conn.setRequestMethod("POST"); conn.setRequestProperty("Content-Type", "application/json"); try (OutputStream os = conn.getOutputStream()) { os.write(json.getBytes("UTF-8")); } BufferedReader in = new BufferedReader(new InputStreamReader(conn.getInputStream(), "UTF-8")); String inputLine; StringBuilder response = new StringBuilder(); while ((inputLine = in.readLine()) != null) { response.append(inputLine).append("\n"); } in.close(); return response.toString(); } } </syntaxhighlight> ==== | | | ==== | --- | --- | | | | | | | | | | | | | | | | ==== - ã³ã³ãœãŒã«ã«è¡šç€ºããŠããã ããªã®ã§ãæçµçã«ã¯ ã«ãŒãœã«äœçœ®ã«è£å®ãæ¿å ¥ ããåŠçãå®è£ å¯èœïŒ ``<code>java document.replace(cursorOffset, 0, aiSuggestion); </code>`` ==== * JSONã®ããŒã¹ã«ã¯ãorg.json ã Gson ãªã©ã远å ãããšäŸ¿å©ã§ãã * éžæç¯å²ã«å¯ŸããŠãè£å®ãæ¿å ¥ããããæ¡åŒµå¯èœã§ãã ããã§ã # Ctrl+Shift+Z ãæŒã # çŸåšã®ãœãŒã¹ã³ãŒããšã«ãŒãœã«äœçœ®ãååŸ # ããŒã«ã« AI ã«éä¿¡ # è¿çãååŸïŒã³ã³ãœãŒã«åºåïŒ ãŸã§ã宿ããŸãã ð åžæã§ããã°æ¬¡ã«ãAIã®è¿çããšãã£ã¿ã«çŽæ¥æ¿å ¥ããŠãTabãã§æ¡çšãããä»çµã¿ãŸã§å®è£ äŸãäœãããšãã§ããŸãã äœããŸããïŒ === User: Please initialize the log4j system properly. === Please initialize the log4j system properly. java.io.IOException: Server returned HTTP response code: 400 for URL: http://127.0.0.1:1357/v1/completions at java.base/sun.net.www.protocol.http.HttpURLConnection.getInputStream0(HttpURLConnection.java:1998) === Assistant: ãªãã»ã©ããã®ãšã©ãŒã«ã¯ 2ã€ã®å¥ã®åå ãå«ãŸããŠããŸããé ã«è§£èª¬ããŸãã === ãªãã»ã©ããã®ãšã©ãŒã«ã¯ 2ã€ã®å¥ã®åå ãå«ãŸããŠããŸããé ã«è§£èª¬ããŸãã ==== - ãã㯠log4j ãåæåãããŠããªãèŠå ã§ãã ==== * Eclipse ãã©ã°ã€ã³ããµãŒãããŒãã£ã©ã€ãã©ãªã§ log4j ã䜿ã£ãŠããå Žåã«åºãŸãã * èŽåœçã§ã¯ãªããåäœã«çŽæ¥åœ±é¿ããªãããšãå€ãã§ãã * 察çïŒ 1. ã¯ã©ã¹ãã¹ã« log4j.properties ã远å ãã ``<code>properties log4j.rootLogger=INFO, stdout log4j.appender.stdout=org.apache.log4j.ConsoleAppender log4j.appender.stdout.layout=org.apache.log4j.PatternLayout log4j.appender.stdout.layout.ConversionPattern=%d [%t] %-5p %c - %m%n </code>`` 2. å¿ èŠãªããã°ç¡èŠããŠã OK ==== - HTTP 400 ã¯ãBad Requestããã€ãŸããµãŒãåŽã« éã£ã JSON ãäžæ£ ãšããæå³ã§ãã ==== * åå ïŒ 1. JSONæååãæ£ãããšã¹ã±ãŒããããŠããªã - æ¹è¡ã "ã\ ã®ãšã¹ã±ãŒãäžè¶³ 2. ãµãŒãåŽãåãä»ããªã圢åŒã®ãã£ãŒã«ãããã - äŸïŒcursor_offset ãªã©ã¯ãµãŒãå®è£ ã«äŸå 3. HTTP ã¡ãœããã Content-Type ãééã£ãŠãã ===== #### ===== * ä»ã®äŸã§ã¯åçŽã«æåå眮æã§ JSON ãäœã£ãŠããŸãããæ¹è¡ã " ãå«ãŸãããšå£ããŸãã * Gson ã䜿ã£ãŠå®å šã« JSON ãçæããæ¹æ³ ãæšå¥šã§ãã <syntaxhighlight lang="java">import com.google.gson.Gson; import java.util.HashMap; import java.util.Map; Gson gson = new Gson(); Map<String, Object> payload = new HashMap<>(); payload.put("model", "gpt-local"); payload.put("prompt", sourceCode); payload.put("cursor_offset", cursorOffset); payload.put("max_tokens", 200); String jsonRequest = gson.toJson(payload); </syntaxhighlight> * ããã§ JSON ã®ãšã¹ã±ãŒãåé¡ã¯è§£æ±ºããŸãã ====== <syntaxhighlight lang="java">conn.setRequestProperty("Content-Type", "application/json; charset=UTF-8"); ====== </syntaxhighlight> ====== - /v1/completions ã«éã JSON ãããµãŒãåŽã®ä»æ§ã«åã£ãŠãããç¢ºèª - äŸïŒmodel ãã£ãŒã«ããå¿ é ã - cursor_offset ããµããŒãããŠããã ====== * ãããµãŒãã OpenAIäºæãªããprompt ã®ã¿ã§ãOKã§ãã ===== <syntaxhighlight lang="java">import com.google.gson.Gson; ===== // ... Gson gson = new Gson(); Map<String, Object> payload = new HashMap<>(); payload.put("model", "gpt-local"); payload.put("prompt", sourceCode); payload.put("cursor_offset", cursorOffset); payload.put("max_tokens", 200); String jsonRequest = gson.toJson(payload); HttpURLConnection conn = (HttpURLConnection) new URL(AI_SERVER_URL).openConnection(); conn.setDoOutput(true); conn.setRequestMethod("POST"); conn.setRequestProperty("Content-Type", "application/json; charset=UTF-8"); try (OutputStream os = conn.getOutputStream()) { os.write(jsonRequest.getBytes("UTF-8")); } </syntaxhighlight> * ããã§ 400 ãšã©ãŒã¯ã»ãŒç¢ºå®ã«è§£æ¶ãããŸãã ==== | | | ==== | --- | --- | | | | | | | åžæã§ããã°ãç§ã AISuggestHandler ã Gson ã§å®å šã« JSON ãäœããAI ãµãŒãã«éä¿¡ â è¿çããšãã£ã¿ã«æ¿å ¥ ãŸã§çµ±åããå®å šãµã³ãã«ã«æžãæããããšãã§ããŸãã äœããŸããïŒ === User: import com.google.gson.Gson === import com.google.gson.Gson === Assistant: import com.google.gson.Gson ã®ãšã©ãŒã¯ãGson ã©ã€ãã©ãªããããžã§ã¯ãã®äŸåã«å«ãŸããŠããªãããšãåå ã§ãã === import com.google.gson.Gson ã®ãšã©ãŒã¯ãGson ã©ã€ãã©ãªããããžã§ã¯ãã®äŸåã«å«ãŸããŠããªãããšãåå ã§ãã Eclipse ãã©ã°ã€ã³éçºã§ã¯å€éšã©ã€ãã©ãªã远å ããå¿ èŠããããŸãã ==== 1. Gson GitHub ãã JAR ãããŠã³ããŒã - äŸïŒgson-2.10.1.jar ==== ==== ### ==== # META-INF/MANIFEST.MF ãéã â ãDependenciesãã¿ã # ãAdd External JARsã ã§ããŠã³ããŒããã gson-2.10.1.jar ã远å # ä¿åãããšãimport com.google.gson.Gson; ã解決ãããŸã ===== 1. ãããžã§ã¯ãçŽäžã« lib/ ãã©ã«ããäœã ===== # gson-2.10.1.jar ã lib/ ã«çœ®ã # build.properties ã® bin.includes ã«è¿œå ``<code>properties bin.includes = META-INF/,\ plugin.xml,\ lib/gson-2.10.1.jar,\ . <syntaxhighlight>4. MANIFEST.MF ã®ãRuntimeãã¿ãã§ gson-2.10.1.jar ã Classpath ã«è¿œå ==== </syntaxhighlight>java ==== import com.google.gson.Gson; Gson gson = new Gson(); String json = gson.toJson(Map.of("key", "value")); System.out.println(json); </code>`` ããã§ã³ã³ãã€ã«ãšã©ãŒãæ¶ããã°OKã§ãã ããåžæã§ããã°ãç§ã¯ãã® Gson ã䜿ã£ã AISuggestHandler ã® AI éä¿¡åŠçã®å®å šçµ±åç ãäœãã ãååŸãããœãŒã¹ã³ãŒãã»ã«ãŒãœã«äœçœ® â JSON â ããŒã«ã« AI â è¿çãã«ãŒãœã«äœçœ®ã«æ¿å ¥ããŸã§ã®ãµã³ãã«ãæç€ºã§ããŸãã äœããŸããïŒ === User: java.lang.NoClassDefFoundError: com/google/gson/Gson === java.lang.NoClassDefFoundError: com/google/gson/Gson at to.silk.i.ai.AISuggestHandler.execute(AISuggestHandler.java:43) at org.eclipse.ui.internal.handlers.HandlerProxy.execute(HandlerProxy.java:283) at org.eclipse.ui.internal.handlers.E4HandlerProxy.execute(E4HandlerProxy.java:97) === Assistant: ãªãã»ã©ããã®ãšã©ãŒïŒ === ãªãã»ã©ããã®ãšã©ãŒïŒ <syntaxhighlight>java.lang.NoClassDefFoundError: com/google/gson/Gson </syntaxhighlight> 㯠ã³ã³ãã€ã«ã¯éã£ãŠããããå®è¡æã« Gson ã¯ã©ã¹ãèŠã€ãããªã ããšãæå³ããŸãã Eclipse PDE ãã©ã°ã€ã³ã§ã¯ JAR ããã«ããã¹ã ãã§ãªãããã©ã°ã€ã³ãšããŠå®è¡æã¯ã©ã¹ãã¹ã«å«ããå¿ èŠããããŸãã ==== ### ==== * ãããžã§ã¯ãçŽäžã« lib/ ãã©ã«ããäœæ * gson-2.10.1.jar ã lib/ ã«çœ®ã ===== <syntaxhighlight lang="properties">source.. = src/ ===== output.. = bin/ bin.includes = META-INF/,\ plugin.xml,\ lib/gson-2.10.1.jar,\ . </syntaxhighlight> * bin.includes ã«å«ããããšã§ãEclipse ããã©ã°ã€ã³å®è¡æã« JAR ãèªã¿èŸŒããããã«ãªããŸãã ===== META-INF/MANIFEST.MF ã® Runtime ã¿ãããŸãã¯çŽæ¥ç·šéïŒ ===== <syntaxhighlight lang="text">Bundle-ClassPath: .,lib/gson-2.10.1.jar </syntaxhighlight> * ããã§ãã©ã°ã€ã³å®è¡æã« Gson ãã¯ã©ã¹ãã¹ã«å ¥ããŸã ===== 1. ãããžã§ã¯ãå³ã¯ãªã㯠â Refresh ===== # Run â Run Configurations â Eclipse Application â Run # Ctrl+Shift+Z ãæŒããŠãã¹ã ===== - PDE ã§ã¯éåžžã® Java ãããžã§ã¯ããšéããããã«ããã¹ã«ããã ããã§ã¯å¥ Eclipse å®è¡ç°å¢ã§èªã¿èŸŒãŸããŸããã ===== * å¿ ã <code>bin.includes</code> + <code>Bundle-ClassPath</code> ã« JAR ãå«ãã å¿ èŠããããŸãã ããã§ NoClassDefFoundError ã¯è§£æ¶ãããŸãã åžæã§ããã°ãç§ã¯ãã®èšå®æžã¿ã§ AIéä¿¡âè¿çååŸâã«ãŒãœã«äœçœ®ã«æ¿å ¥ ãŸã§ã®å®å šãªãµã³ãã«ãã³ãã©ãäœããŸãã äœããŸããïŒ === User: ç§ãããŠã³ããŒãããã®ã¯ãgson-2.13.1.jarãã§ãã === ç§ãããŠã³ããŒãããã®ã¯ãgson-2.13.1.jarãã§ãã === Assistant: äºè§£ã§ããgson-2.13.1.jar ã§ãæé ã¯ãŸã£ããåãã§ãã === äºè§£ã§ããgson-2.13.1.jar ã§ãæé ã¯ãŸã£ããåãã§ãã Eclipse PDE ã§æ£ããåäœãããã«ã¯ã以äžã®3ç¹ã確èªããŠãã ããã ==== - ãããžã§ã¯ãçŽäžã« lib/ ãã©ã«ããäœæ ==== * gson-2.13.1.jar ããã®äžã«çœ®ã <syntaxhighlight>YourPlugin/ ââ src/ ââ META-INF/ ââ plugin.xml ââ lib/ â ââ gson-2.13.1.jar ââ build.properties </syntaxhighlight> ==== <syntaxhighlight lang="properties">source.. = src/ ==== output.. = bin/ bin.includes = META-INF/,\ plugin.xml,\ lib/gson-2.13.1.jar,\ . </syntaxhighlight> * ããã§ãã©ã°ã€ã³ã®å®è¡æ JAR ã« Gson ãå«ãŸããŸã ==== META-INF/MANIFEST.MF ã® Runtime ã¿ããŸãã¯çŽæ¥ç·šéã§ä»¥äžã远èšïŒ ==== <syntaxhighlight lang="text">Bundle-ClassPath: .,lib/gson-2.13.1.jar </syntaxhighlight> * . ã¯éåžžã®ã¯ã©ã¹åºåïŒbinïŒ * lib/gson-2.13.1.jar ãæç€ºçã«è¿œå ããããšã§å®è¡æã«èŠã€ããããã«ãªããŸã ==== 1. ãããžã§ã¯ãå³ã¯ãªã㯠â Refresh ==== # Run â Run Configurations â Eclipse Application â Run # Ctrl+Shift+Z ã§ãã¹ã ð¡ æ³šæïŒ * JARåã 2.10.1 ãã 2.13.1 ã«å€ãã£ãã ããªã®ã§ãplugin.xml ããã³ãã©ã¯ã©ã¹ã® import æã¯ãã®ãŸãŸã§OK * å®è¡æã« NoClassDefFoundError ãæ¶ããGson ã䜿ããããã«ãªããŸã åžæã§ããã°ããã®ç°å¢ã§ AIè£å®ãã³ãã©ã宿ãããŠãååŸãããœãŒã¹ã³ãŒããããŒã«ã« AI ã«éããè¿çãã«ãŒãœã«äœçœ®ã«æ¿å ¥ããå®å šçãµã³ãã« ãäœãããšãã§ããŸãã äœããŸããïŒ === User: package to.silk.i.ai; === package to.silk.i.ai; import com.google.gson.Gson; import org.eclipse.core.commands.AbstractHandler; import org.eclipse.core.commands.ExecutionEvent; import org.eclipse.core.commands.ExecutionException; import org.eclipse.jface.text.IDocument; import org.eclipse.jface.text.ITextSelection; import org.eclipse.ui.IEditorPart; import org.eclipse.ui.IWorkbenchWindow; import org.eclipse.ui.handlers.HandlerUtil; import org.eclipse.ui.texteditor.ITextEditor; import javax.net.ssl.HttpsURLConnection; // HTTPS ãªã import java.io.BufferedReader; import java.io.InputStreamReader; import java.io.OutputStream; import java.net.HttpURLConnection; import java.net.URL; import java.util.HashMap; import java.util.Map; public class AISuggestHandler extends AbstractHandler { private static final String AI_SERVER_URL = "http://127.0.0.1:1357/v1/completions"; @Override public Object execute(ExecutionEvent event) throws ExecutionException { IEditorPart editorPart = HandlerUtil.getActiveEditor(event); if (!(editorPart instanceof ITextEditor)) { System.out.println("çŸåšã®ãšãã£ã¿ã¯ããã¹ããšãã£ã¿ã§ã¯ãããŸãã"); return null; } ITextEditor textEditor = (ITextEditor) editorPart; IDocument document = textEditor.getDocumentProvider().getDocument(textEditor.getEditorInput()); ITextSelection selection = (ITextSelection) textEditor.getSelectionProvider().getSelection(); String sourceCode = document.get(); int cursorOffset = selection.getOffset(); // AI ãµãŒããŒã«éä¿¡ãã JSON ãäœæ Gson gson = new Gson(); Map<String, Object> payload = new HashMap<>(); payload.put("model", "gpt-local"); payload.put("prompt", sourceCode); payload.put("cursor_offset", cursorOffset); payload.put("max_tokens", 200); String jsonRequest = gson.toJson(payload); System.out.println("jsonRequest" + jsonRequest); try { String response = sendPostRequest(AI_SERVER_URL, jsonRequest); // AIã®è¿çãã³ã³ãœãŒã«ã«è¡šç€ºïŒããã§åŸã§UIã«åæ å¯èœïŒ System.out.println("AI Response:\n" + response); } catch (Exception e) { e.printStackTrace(); } return null; } // JSONãšã¹ã±ãŒã private String escapeJson(String text) { return text.replace("\\", "\\\\") .replace("\"", "\\\"") .replace("\n", "\\n") .replace("\r", ""); } // HTTP POST éä¿¡ private String sendPostRequest(String urlStr, String json) throws Exception { URL url = new URL(urlStr); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); conn.setDoOutput(true); conn.setRequestMethod("POST"); conn.setRequestProperty("Content-Type", "application/json"); try (OutputStream os = conn.getOutputStream()) { os.write(json.getBytes("UTF-8")); } BufferedReader in = new BufferedReader(new InputStreamReader(conn.getInputStream(), "UTF-8")); String inputLine; StringBuilder response = new StringBuilder(); while ((inputLine = in.readLine()) != null) { response.append(inputLine).append("\n"); } in.close(); return response.toString(); } } === Assistant: 確èªããŸããããã®ã³ãŒãèªäœã¯æŠãæ£ããã§ãããçŸåšã®ç¶æ ã ãš HTTP 400ïŒBad RequestïŒ ãåºãå¯èœæ§ãé«ãã§ããçç±ãšæ¹åçãé çªã«æŽçããŸãã === 確èªããŸããããã®ã³ãŒãèªäœã¯æŠãæ£ããã§ãããçŸåšã®ç¶æ ã ãš HTTP 400ïŒBad RequestïŒ ãåºãå¯èœæ§ãé«ãã§ããçç±ãšæ¹åçãé çªã«æŽçããŸãã ==== 1. Content-Type ã« charset ããªã - äžéšã®ãµãŒãã§ã¯ "application/json; charset=UTF-8" ãå¿ é ``<code>java conn.setRequestProperty("Content-Type", "application/json; charset=UTF-8"); <syntaxhighlight>2. HTTP 400 ã®åå ïŒãµãŒã仿§ãš JSON ã®äžäžèŽ - cursor_offset ããµããŒãããŠããªãå Žåããã£ãŒã«ãåãç°ãªãå ŽåããããŸãã - ããŒã«ã« AI ãµãŒãã®ä»æ§ã確èªããŠãã ããã ==== # HTTPS çš HttpsURLConnection ã® import - ä»å㯠http://127.0.0.1:1357 ãªã®ã§ HttpsURLConnection ã¯äžèŠã§ãã - import javax.net.ssl.HttpsURLConnection; ã¯åé€ã㊠OK # escapeJson ã¡ãœããã¯ããäžèŠ - Gson ã䜿ãã°èªåã§ JSON ãšã¹ã±ãŒããããŸã - çŸåšã®ã³ãŒãã§ãåŒãã§ããªãã®ã§åé¡ãªã ==== </syntaxhighlight>java ==== private String sendPostRequest(String urlStr, String json) throws Exception { URL url = new URL(urlStr); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); conn.setDoOutput(true); conn.setRequestMethod("POST"); conn.setRequestProperty("Content-Type", "application/json; charset=UTF-8"); // ä¿®æ£ try (OutputStream os = conn.getOutputStream()) { os.write(json.getBytes("UTF-8")); } int responseCode = conn.getResponseCode(); if (responseCode != 200) { // ãšã©ãŒæã¯ InputStream ã§ã¯ãªã ErrorStream ããèªã try (BufferedReader err = new BufferedReader(new InputStreamReader(conn.getErrorStream(), "UTF-8"))) { String line; StringBuilder errorResponse = new StringBuilder(); while ((line = err.readLine()) != null) { errorResponse.append(line).append("\n"); } throw new RuntimeException("HTTP Error " + responseCode + ":\n" + errorResponse.toString()); } } try (BufferedReader in = new BufferedReader(new InputStreamReader(conn.getInputStream(), "UTF-8"))) { String inputLine; StringBuilder response = new StringBuilder(); while ((inputLine = in.readLine()) != null) { response.append(inputLine).append("\n"); } return response.toString(); } } <syntaxhighlight> ==== 1. ãµãŒã仿§ - /v1/completions ã modelã»prompt 以å€ã«å¿ é ãã£ãŒã«ããæ±ããŠããªãã - cursor_offset ãå¿ é ã§ãªããã°å€ããŠãã¹ã ==== </syntaxhighlight>java payload.put("model", "gpt-local"); payload.put("prompt", sourceCode); // payload.put("cursor_offset", cursorOffset); // ãµãŒã仿§ã«ãã payload.put("max_tokens", 200); <syntaxhighlight> # JSON åºåã®ç¢ºèª - System.out.println("jsonRequest = " + jsonRequest); ã§å 容ãç¢ºèª - æ¹è¡ãç¹æ®æåãæ£ãããšã¹ã±ãŒããããŠããã # ãµãŒãã« curl ã§éã£ãŠç¢ºèª </syntaxhighlight>bash curl -X POST http://127.0.0.1:1357/v1/completions \ -H "Content-Type: application/json" \ -d '{"model":"gpt-local","prompt":"print(\"Hello\")","max_tokens":10}' </code>`` * ããã§ãµãŒããè¿çããã確èªã§ããŸã ð¡ ãŸãšã * Gson ã§ JSON ãçæ â ã»ãŒå®å š * Content-Type ã application/json; charset=UTF-8 ã«å€æŽ * ãµãŒã仿§ã«åãã㊠JSON ãã£ãŒã«ããèª¿æŽ * HTTP 400 ã®å Žåã¯ãErrorStream ãã詳现ãèªã¿åããšåå ãããã å¿ èŠã§ããã°ãç§ã¯ãã®ã³ãŒãã ååŸãããœãŒã¹ã³ãŒããšã«ãŒãœã«äœçœ®ã JSON ã«ã㊠AI ã«éä¿¡ â è¿çãã«ãŒãœã«äœçœ®ã«æ¿å ¥ ãŸã§å®å šã«çµ±åãã Eclipse ãã©ã°ã€ã³çã«æžãçŽããŸãã äœããŸããïŒ === User: AIãå¿çã§ããããã«ãªããŸããïŒããããšã === AIãå¿çã§ããããã«ãªããŸããïŒããããšã AI Response: { "id": "cmpl-hgn05upzrdfo1jonsmkhb7", "object": "text_completion", "created": 1762740338, "model": "openai/gpt-oss-20b", "choices": [ { "index": 0, "text": "<|channel|>analysis<|message|>User just pasted code. Likely wants explanation? They didn't ask question. I'll respond asking what they need.<|end|><|start|>assistant<|channel|>final<|message|>It looks like youᅵfve posted a simple Java program that prints ᅵgOKᅵh to the console. \nIf youᅵfre looking for help with something specific?such as:\n\n'' Running the program (compilation & execution steps) \n'' Adding more functionality or logic \n'' Debugging an error youᅵfre encountering \n'' Understanding how System.out.println works \n\njust let me know what youᅵfd like to do next!", "logprobs": null, "finish_reason": "stop" } ], "usage": { "prompt_tokens": 102, "completion_tokens": 109, "total_tokens": 211 }, "stats": {} } === Assistant: çŽ æŽãããã§ãïŒ === çŽ æŽãããã§ãïŒ ð ããã§ Eclipse ããååŸãããœãŒã¹ã³ãŒããããŒã«ã« AI ã«éä¿¡ â å¿çãååŸ ã§ããç¶æ ã«ãªããŸãããã ==== çŸåšã®ç¶æ ã§ã¯å¿ç㯠JSON 圢åŒã§ã³ã³ãœãŒã«ã«åºåãããã ããªã®ã§ãããã ãšãã£ã¿ã«åæ ããå¿ èŠããããŸãã ==== ===== Gson ã䜿ã£ãŠ choices[0].text ãååŸããŸãã ===== <syntaxhighlight lang="java">import com.google.gson.JsonObject; import com.google.gson.JsonParser; String aiText = ""; JsonObject jsonObj = JsonParser.parseString(response).getAsJsonObject(); if (jsonObj.has("choices")) { aiText = jsonObj .getAsJsonArray("choices") .get(0) .getAsJsonObject() .get("text") .getAsString(); } </syntaxhighlight> ===== <syntaxhighlight lang="java">int offset = selection.getOffset(); // æ¢ã«ååŸæžã¿ ===== document.replace(offset, 0, aiText); </syntaxhighlight> * document.replace(offset, 0, aiText) ã§ ã«ãŒãœã«äœçœ®ã«è¿œèš ãããŸã * Tab ããŒæŒäžã§æ¡çšããä»çµã¿ã«ãããå Žåã¯ãProposal 颚 UIïŒorg.eclipse.jface.text.contentassist.ICompletionProposalïŒ ã䜿ããšäŸ¿å©ã§ã ===== 1. Ctrl+Shift+Z ãæŒã ===== # çŸåšã®ãœãŒã¹ã³ãŒããšã«ãŒãœã«äœçœ®ãååŸ # ããŒã«ã« AI ã« JSON ã§éä¿¡ # å¿ç JSON ããããã¹ããæœåº # ã«ãŒãœã«äœçœ®ã«æ¿å ¥ïŒãŸãã¯ææ¡ UI ã§è¡šç€ºïŒ # ãŠãŒã¶ãŒã Tab ãæŒããšç¢ºå® ð¡ ãã®æµããçµã¿èŸŒãã°ãGitHub Copilot 颚ã®è£å®ãã©ã°ã€ã³ ãäœããŸãã åžæã§ããã°ãç§ã¯ çŸåšã® AISuggestHandler ããã®ãæ¿å ¥æ©èœä»ããã«çµ±åããå®å šçãµã³ãã« ã«æžãæããããšãã§ããŸãã äœããŸããïŒ === User: AIãããçããŠããŸããNeed to explain? === AIãããçããŠããŸããNeed to explain? Probably respond with corrected code or explanation.<|end|><|start|>assistant<|channel|>final<|message|>Below is the same Java program you posted, but with a few small niceties added: === Assistant: å®ç§ã§ããã§ã¯ããã®å¿çã ã«ãŒãœã«äœçœ®ã«æ¿å ¥ããåŠç ãŸã§çµ±åããŠãEclipse ãã©ã°ã€ã³ãšããŠè£å®ã§ãã圢ã«ããŸãããã === å®ç§ã§ããã§ã¯ããã®å¿çã ã«ãŒãœã«äœçœ®ã«æ¿å ¥ããåŠç ãŸã§çµ±åããŠãEclipse ãã©ã°ã€ã³ãšããŠè£å®ã§ãã圢ã«ããŸãããã 以äžã« Gson ã§ AI ã® JSON ãã <code>choices[0].text</code> ãåãåºããŠãã«ãŒãœã«äœçœ®ã«æ¿å ¥ããå®å šçãã³ãã© ã瀺ããŸãã <syntaxhighlight lang="java">package to.silk.i.ai; import com.google.gson.JsonObject; import com.google.gson.JsonParser; import com.google.gson.Gson; import org.eclipse.core.commands.AbstractHandler; import org.eclipse.core.commands.ExecutionEvent; import org.eclipse.core.commands.ExecutionException; import org.eclipse.jface.text.IDocument; import org.eclipse.jface.text.ITextSelection; import org.eclipse.ui.IEditorPart; import org.eclipse.ui.handlers.HandlerUtil; import org.eclipse.ui.texteditor.ITextEditor; import java.io.BufferedReader; import java.io.InputStreamReader; import java.io.OutputStream; import java.net.HttpURLConnection; import java.net.URL; import java.util.HashMap; import java.util.Map; public class AISuggestHandler extends AbstractHandler { private static final String AI_SERVER_URL = "http://127.0.0.1:1357/v1/completions"; @Override public Object execute(ExecutionEvent event) throws ExecutionException { IEditorPart editorPart = HandlerUtil.getActiveEditor(event); if (!(editorPart instanceof ITextEditor)) { System.out.println("çŸåšã®ãšãã£ã¿ã¯ããã¹ããšãã£ã¿ã§ã¯ãããŸãã"); return null; } ITextEditor textEditor = (ITextEditor) editorPart; IDocument document = textEditor.getDocumentProvider().getDocument(textEditor.getEditorInput()); ITextSelection selection = (ITextSelection) textEditor.getSelectionProvider().getSelection(); String sourceCode = document.get(); int cursorOffset = selection.getOffset(); // AI ãµãŒããŒã«éä¿¡ãã JSON ãäœæ Gson gson = new Gson(); Map<String, Object> payload = new HashMap<>(); payload.put("model", "gpt-local"); payload.put("prompt", sourceCode); payload.put("max_tokens", 200); String jsonRequest = gson.toJson(payload); try { String response = sendPostRequest(AI_SERVER_URL, jsonRequest); String aiText = parseAIResponse(response); if (aiText != null && !aiText.isEmpty()) { document.replace(cursorOffset, 0, aiText); } } catch (Exception e) { e.printStackTrace(); } return null; } // AIã®JSONã¬ã¹ãã³ã¹ããchoices[0].textãååŸ private String parseAIResponse(String response) { JsonObject jsonObj = JsonParser.parseString(response).getAsJsonObject(); if (jsonObj.has("choices")) { return jsonObj.getAsJsonArray("choices") .get(0) .getAsJsonObject() .get("text") .getAsString(); } return ""; } // HTTP POST éä¿¡ private String sendPostRequest(String urlStr, String json) throws Exception { URL url = new URL(urlStr); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); conn.setDoOutput(true); conn.setRequestMethod("POST"); conn.setRequestProperty("Content-Type", "application/json; charset=UTF-8"); try (OutputStream os = conn.getOutputStream()) { os.write(json.getBytes("UTF-8")); } int responseCode = conn.getResponseCode(); BufferedReader in; if (responseCode == 200) { in = new BufferedReader(new InputStreamReader(conn.getInputStream(), "UTF-8")); } else { in = new BufferedReader(new InputStreamReader(conn.getErrorStream(), "UTF-8")); } String inputLine; StringBuilder response = new StringBuilder(); while ((inputLine = in.readLine()) != null) { response.append(inputLine).append("\n"); } in.close(); if (responseCode != 200) { throw new RuntimeException("HTTP Error " + responseCode + ":\n" + response.toString()); } return response.toString(); } } </syntaxhighlight> ===== 1. Ctrl+Shift+Z ã§åŒã³åºããšãçŸåšã®ãœãŒã¹ã³ãŒããããŒã«ã« AI ã«éä¿¡ ===== # AI ãè¿ãã choices[0].text ã ã«ãŒãœã«äœçœ®ã«çŽæ¥æ¿å ¥ # Gson ã§å®å šã« JSON ãçæïŒããŒã¹ # HTTP 400 ããµãŒããšã©ãŒæãã³ã³ãœãŒã«ã«è¡šç€º ãã®ç¶æ ã§ GitHub Copilot 颚ã®è£å®ãã©ã°ã€ã³ ãåäœããŸãã * Tab ããŒã§ç¢ºå®ãã UI ã远å ããã°ããããææ¡ â 確å®ã圢åŒã«ã§ããŸãã å¿ èŠã§ããã°ãç§ã¯ Tab ããŒã§ææ¡ã確å®ã§ãã ContentAssist 颚 UI ä»ãã®ããŒãžã§ã³ ãäœããŸãã äœããŸããïŒ === User: çŸåšã®ãœãŒã¹ã³ãŒããããŒã«ã« AI ã«éä¿¡ãããã ãã§ã¯ãããŒã«ã«AIãäœãããŠè¯ããããããªãããã§ãã === çŸåšã®ãœãŒã¹ã³ãŒããããŒã«ã« AI ã«éä¿¡ãããã ãã§ã¯ãããŒã«ã«AIãäœãããŠè¯ããããããªãããã§ãã ãœãŒã¹ã³ãŒãã«å ããŠãã«ãŒãœã«äœçœ®ã«é©åãšæããããœãŒã¹ãã³ã¡ã³ãã远å ããããã«ããšããæç€ºã远å ã§ããŸãã === Assistant: ãã¡ããã§ããä»ã®ç¶æ ã§ã¯ AI ã«éã£ãŠããã®ã¯ãåçŽã«ãœãŒã¹ã³ãŒããã ããªã®ã§ãAI ã¯äœãããã°è¯ãã倿ã§ããŸããã === ãã¡ããã§ããä»ã®ç¶æ ã§ã¯ AI ã«éã£ãŠããã®ã¯ãåçŽã«ãœãŒã¹ã³ãŒããã ããªã®ã§ãAI ã¯äœãããã°è¯ãã倿ã§ããŸããã ããã§ prompt ã«æç¢ºãªæç€ºïŒInstructionïŒã远å ããŠãã«ãŒãœã«äœçœ®ã«è£å®ãã³ã¡ã³ãã远å ãããããã«èªå°ããŸãã ==== äŸãã°ãçŸåšã® payload.put("prompt", sourceCode); ãæ¬¡ã®ããã«æžãæããŸãïŒ ==== <syntaxhighlight lang="java">String instruction = "以äžã®Javaã³ãŒãã®ã«ãŒãœã«äœçœ®ã«ãé©åãªãœãŒã¹ã³ãŒããã³ã¡ã³ãã远å ããŠãã ããã" + " æ¢åã®ã³ãŒããå£ãããæé©ãªè£å®ãææ¡ããŠãã ããã"; payload.put("prompt", instruction + "\n\nã³ãŒã:\n" + sourceCode); </syntaxhighlight> ===== - ãã«ãŒãœã«äœçœ®ã«è¿œå ããšæç€ºããããšã§ AI ã«æå³ãäŒãã ===== * ãæ¢åã®ã³ãŒããå£ããªãããã«ããšå ããããšã§å®å šæ§ãç¢ºä¿ * ã³ã¡ã³ããè£å®ãªã©æè»ã«ææ¡ããããå Žåã¯ããã³ã¡ã³ããå«ããŠããšæèšãã ==== <syntaxhighlight lang="java">// AI ãµãŒããŒã«éä¿¡ãã JSON ãäœæ ==== Gson gson = new Gson(); Map<String, Object> payload = new HashMap<>(); payload.put("model", "gpt-local"); String instruction = "以äžã®Javaã³ãŒãã®ã«ãŒãœã«äœçœ®ã«ãé©åãªãœãŒã¹ã³ãŒããã³ã¡ã³ãã远å ããŠãã ããã" + "æ¢åã®ã³ãŒããå£ãããæé©ãªè£å®ãææ¡ããŠãã ããã"; payload.put("prompt", instruction + "\n\nã³ãŒã:\n" + sourceCode); payload.put("max_tokens", 200); </syntaxhighlight> * ããã§ AI ã¯ãã©ã®ããã«è£å®ããã°ãããããçè§£ãããããªããŸãã ð¡ è£è¶³ * å¿ èŠã§ããã°ãããã« ãJava ã®ã¹ã¿ã€ã«ã«åŸã£ãŠããäŸå€åŠçãèæ ®ããŠã ãšæç€ºã远å ããããšã§ãããèªç¶ã§å®å šãªè£å®ãè¿ã£ãŠããŸãã * Prompt ã¯æè»ã«èª¿æŽå¯èœã§ããAI ã®å¿çãèŠãªããæç€ºã埮調æŽãããšã粟床ãäžãããŸãã åžæã§ããã°ãç§ã¯ AISuggestHandler ã®å®å šç ããã®æç€ºä»ãããã³ããã«çµã¿èŸŒãã§ãã«ãŒãœã«äœçœ®ã«è£å®ãæ¿å ¥ããåœ¢ã§æžãæããããšãã§ããŸãã äœããŸããïŒ === User: 以äžã®ããã«ãäžèŠãª TODO ã³ã¡ã³ããåé€ããäœãè¡ã£ãŠãããåãããããã³ã¡ã³ãã远å ããŠã¿ãŠãã ããã === 以äžã®ããã«ãäžèŠãª TODO ã³ã¡ã³ããåé€ããäœãè¡ã£ãŠãããåãããããã³ã¡ã³ãã远å ããŠã¿ãŠãã ããã \nããã§ã³ãŒããããèªã¿ããããã¡ã³ããã³ã¹ãããããªããŸãã\n\njava\npublic class Test {\n\n public static void main(String[] args) {\n // ããã§ã¯åã«ãOKããšããæååãæšæºåºåãžè¡šç€ºããŸãã\n System.out.println(\"OK\");\n }\n\n}\n\n\n- // TODO Auto-generated method stub 㯠IDE ãèªåçæãããã¬ãŒã¹ãã«ããŒãªã®ã§ãå®è£ ãå®äºãããåé€ããŸãããã \n- ã³ã¡ã³ããå ¥ããããšã§ãã³ãŒããèªã", ãšããå¿çãè¿ã£ãŠããŸãããææ¡ãã³ã¡ã³ããå«ãŸããŠããã®ã§ããã®ãŸãŸãœãŒã¹ã«è²Œãä»ããããšãã§ããŸãããããŒã«ã«AIã«éãæç€ºã«ãææ¡ãã³ã¡ã³ããäžèŠã§ããããšãç°¡æœã«ãœãŒã¹ã«è¿œå ãããšè¯ããšæãããæåã ãéãããã«ããŠãã ãã === Assistant: ãªãã»ã©ã§ããä»ã® AI ã®å¿çã¯ã説æãã³ã¡ã³ãä»ããã«ãªã£ãŠããŸããEclipse ã«çŽæ¥æ¿å ¥ãããšåé·ã«ãªã£ãŠããŸããŸããã === ãªãã»ã©ã§ããä»ã® AI ã®å¿çã¯ã説æãã³ã¡ã³ãä»ããã«ãªã£ãŠããŸããEclipse ã«çŽæ¥æ¿å ¥ãããšåé·ã«ãªã£ãŠããŸããŸããã 解決ããã«ã¯ prompt ã«ãææ¡ãã³ã¡ã³ãã¯äžèŠãçŽç²ã«ã³ãŒãã ãè¿ãã æç€ºãæç€ºçã«è¿œå ããŸãã ==== ### ==== <syntaxhighlight lang="java">String instruction = "以äžã®Javaã³ãŒãã®ã«ãŒãœã«äœçœ®ã«è¿œå ããã³ãŒãã ããçæããŠãã ããã" + " 説ææãã³ã¡ã³ããææ¡ã¯äžåäžèŠã§ãã" + " æ¢åã®ã³ãŒããå£ããã远å ãã¹ãã³ãŒãã®ã¿ãè¿ããŠãã ããã"; payload.put("prompt", instruction + "\n\nã³ãŒã:\n" + sourceCode); </syntaxhighlight> * ã説ææãã³ã¡ã³ãã¯äžèŠããšæžãããšã§ãAI ãçŽç²ã«æ¿å ¥çšã³ãŒãã ããè¿ãããèªå°ã§ããŸãã * æ¢åã®ã³ãŒããå£ããªãããã«ããšæç€ºããããšã§è£å®ã®ç²ŸåºŠãäžãããŸãã ===== <syntaxhighlight lang="java">String instruction = "Cursoräœçœ®ã«è¿œå ããæå°éã®Javaã³ãŒãã ããè¿ããŠãã ããã" ===== + " ã³ã¡ã³ããææ¡ã¯äžåäžèŠã"; </syntaxhighlight> * ãã¡ãã¯ããã«çããæ¿å ¥å°çšåãã® prompt ã§ãã * ããŒã«ã« AI ã«å¯ŸããŠãã³ãŒãã ãè¿ããããšã匷å¶ããã€ã¡ãŒãžã§ãã ===== - payload.put("prompt", ...) ã«ãã® instruction ã远å ===== * è¿ã£ãŠãã choices[0].text ããã®ãŸãŸ document.replace(cursorOffset, 0, aiText) ã§æ¿å ¥ * ããã§ ç¡é§ãªã³ã¡ã³ãã説æãªãã§ã«ãŒãœã«äœçœ®ã«ã³ãŒããçŽæ¥è¿œå ã§ããŸã ð¡ ãã³ã * AI ã«ãã£ãŠã¯å°ãã ãã³ã¡ã³ããæ®ãå Žåãããã®ã§ãå¿ èŠã§ããã° æ£èŠè¡šçŸã§ã³ã¡ã³ãè¡ãé€å»ããŠããæ¿å ¥ ããåŠçãå ¥ããããšãã§ããŸãã * ãçŽç²ã«ã³ãŒãã ãããšæèšããã°ã»ãšãã©ã®å Žåããã®ãŸãŸè²Œãä»ãå¯èœãªã³ãŒããè¿ããŸãã åžæã§ããã°ãç§ã¯ ãã®æç€ºãçµã¿èŸŒãã AISuggestHandler ã®å®å šç ãäœãã ãã«ãŒãœã«äœçœ®ã«çŽç²ãªã³ãŒãã ããæ¿å ¥ãããããã«æžãæããããšãã§ããŸãã äœããŸããïŒ === User: <|channel|analysis<|message|Need to add code at cursor // . === <|channel|>analysis<|message|>Need to add code at cursor // . Probably nothing? They want addition. Maybe a comment like "TODO". But instructions: generate code or comment only. Let's add a print statement before OK. Add System.out.println("Hello");<|end|><|start|>assistant<|channel|>final<|message|>java System.out.println("Hello"); ãšåž°ã£ãŠããŸããããŸã åé·ã§ãã === Assistant: ãªãã»ã©ã§ããä»ã®å¿çã§ããŸã ãjavaããªã©ã® Markdown ãäœèšãªæèš ãå«ãŸããŠããããããã®ãŸãŸ Eclipse ã«è²Œãä»ãããšåé·ã«ãªããŸãã === ãªãã»ã©ã§ããä»ã®å¿çã§ããŸã ã``<code>javaããªã©ã® Markdown ãäœèšãªæèš ãå«ãŸããŠããããããã®ãŸãŸ Eclipse ã«è²Œãä»ãããšåé·ã«ãªããŸãã 解決ããã«ã¯ãããŒã«ã« AI ã«éãæç€ºã§ãã³ãŒãã ãè¿ããäœèšãªæåïŒMarkdown ã説ææïŒãåºããªãã ãšåŒ·èª¿ããŸãã ==== <syntaxhighlight lang="java">String instruction = ==== "Cursoräœçœ®ã«è¿œå ããJavaã³ãŒãã ããè¿ããŠãã ããã" + " 説ææãã³ã¡ã³ããMarkdownèšæ³ïŒ</syntaxhighlight>ãªã©ïŒãææ¡æã¯äžåäžèŠã" + " æ¢åã®ã³ãŒããå£ããã远å ãã¹ãã³ãŒãã ããè¿ããŠãã ããã"; payload.put("prompt", instruction + "\n\nã³ãŒã:\n" + sourceCode); <syntaxhighlight> ===== 1. ãã³ãŒãã ãè¿ãã ãæç¢ºã«ãã ===== # ã説ææã»ã³ã¡ã³ãã»Markdown ã¯äžèŠã ãšæžã # æ¢åã³ãŒããå£ããªãããšãæç€º # è¿ã£ãŠããæååã¯ãã®ãŸãŸ document.replace(cursorOffset, 0, aiText) ã§æ¿å ¥å¯èœ ===== - ãã AI ããŸã åé·ã«è¿ãå Žåã¯ãè¿åŽæååãã以äžãé€å»ããåŠçã远å ã§ããŸãïŒ </syntaxhighlight>java aiText = aiText.replaceAll("(?s)</code>`<code>.*?</code>`<code>", ""); // Markdownã³ãŒããããã¯é€å» aiText = aiText.trim(); // ååŸç©ºçœé€å» </code>`` ===== * ããã§ãçŽç²ã«ã³ãŒãã ãããã«ãŒãœã«äœçœ®ã«æ¿å ¥å¯èœã«ãªããŸãã ãã®æç€ºä»ã prompt ãçµã¿èŸŒãã AISuggestHandler ã®å®å šç ãäœãã°ã Ctrl+Shift+Z ã§åŒã³åºããš ã«ãŒãœã«äœçœ®ã«ç¡é§ãªãã³ãŒãã ã远å ã§ããããã«ãªããŸãã äœããŸããïŒ === User: <|channel|analysis<|message|We need to add code at cursor position, which is after comment // . === <|channel|>analysis<|message|>We need to add code at cursor position, which is after comment // . Probably want something like System.out.println("Hello"); But any code? Just add a line.<|end|><|start|>assistant<|channel|>final<|message|>System.out.println("Hello World!"); ãšåž°ã£ãŠããŸãããmessage ãšã <|start|>assistant<|channel|> ãªã©ãäžèŠã§ãæåŸã® final ã®åŸã ãååŸãããã§ãã === Assistant: ãªãã»ã©ã§ããã§ã¯ãAI ããè¿ã£ãŠããå¿çã«ã¯ "<|channel|analysis<|message|" ã <|end|<|start|assistant<|channel|final<|message| ãªã©ã®å¶åŸ¡ããŒã¯ã³ãå«ãŸâŠ === ãªãã»ã©ã§ããã§ã¯ãAI ããè¿ã£ãŠããå¿çã«ã¯ "<|channel|>analysis<|message|>" ã <|end|><|start|>assistant<|channel|>final<|message|> ãªã©ã®å¶åŸ¡ããŒã¯ã³ãå«ãŸããŸãã Eclipse ã«æ¿å ¥ããã³ãŒãã ããæœåºããã«ã¯ãæåŸã® <code>final</code> ã®åŸã«ç¶ãéšåã ãåãåºãåŠçã远å ãããšè¯ãã§ãã ==== <syntaxhighlight lang="java">private String extractCodeFromAIResponse(String response) { ==== // "final" ãšããããŒã¯ãŒãã®æåŸã®åºçŸäœçœ®ãååŸ int index = response.lastIndexOf("final"); if (index == -1) { // final ãèŠã€ãããªããã°ãã®ãŸãŸè¿ã return response.trim(); } // final ã®åŸã«ç¶ãéšåã ãåãåºã String codePart = response.substring(index + "final".length()); // äžèŠãªå¶åŸ¡æåã空çœãé€å» return codePart.replaceAll("<\\|.*?\\|>", "").trim(); } </syntaxhighlight> ===== <syntaxhighlight lang="java">String aiTextRaw = response; // AIããã®è¿çå šäœ ===== String aiText = extractCodeFromAIResponse(aiTextRaw); // ã«ãŒãœã«äœçœ®ã«æ¿å ¥ document.replace(cursorOffset, 0, aiText); </syntaxhighlight> ===== - lastIndexOf("final") ã§æåŸã® final ã®åŸãååŸ ===== * æ£èŠè¡šçŸã§ <|âŠ|> ã®å¶åŸ¡ããŒã¯ã³ãåé€ * ååŸã®ç©ºçœã trim ããŠãçŽç²ã«ã³ãŒãã ããååŸ * ããã§ System.out.println("Hello World!"); ã®ããã«ãçŽæ¥ Eclipse ã«æ¿å ¥å¯èœãªæååã ãã«ãªããŸã åžæã§ããã°ããã® ããŒã¯ã³é€å»åŠçãçµã¿èŸŒãã å®å šç AISuggestHandler ãäœãã Ctrl+Shift+Z ã§åŒã³åºããšãAIãçæããçŽç²ãªã³ãŒãã ããã«ãŒãœã«äœçœ®ã«æ¿å ¥ãã§ãã圢ã«ã§ããŸãã äœããŸããïŒ === User: java === java // TODO: Add your code here ã«ãªããŸãããæããã§ãïŒjava ãäžèŠã§ãã === Assistant: ãªãã»ã©ã§ãããjavaãããããªã©ã® Markdown èšæ³ãå®å šã«é€å»ããçŽç²ãªã³ãŒãã ããã«ãŒãœã«äœçœ®ã«æ¿å ¥ããåŠçã«ããã°è¯ãã§ãã === ãªãã»ã©ã§ãããjavaãããããªã©ã® Markdown èšæ³ãå®å šã«é€å»ããçŽç²ãªã³ãŒãã ããã«ãŒãœã«äœçœ®ã«æ¿å ¥ããåŠçã«ããã°è¯ãã§ãã ==== <syntaxhighlight lang="java">private String extractCodeFromAIResponse(String response) { ==== // 1. äžèŠãªå¶åŸ¡ããŒã¯ã³ïŒ<|âŠ|>ïŒãåé€ String cleaned = response.replaceAll("<\\|.*?\\|>", ""); // 2. Markdownã³ãŒããããã¯ïŒ</syntaxhighlight>java ã ``<code>ïŒãåé€ cleaned = cleaned.replaceAll("(?m)^</code>`<code>.*$", ""); cleaned = cleaned.replaceAll("</code>`<code>", ""); // 3. ååŸç©ºçœãåé€ return cleaned.trim(); } <syntaxhighlight> ===== </syntaxhighlight>java ===== String aiTextRaw = response; // AI ããã®å šã¬ã¹ãã³ã¹ String aiText = extractCodeFromAIResponse(aiTextRaw); // ã«ãŒãœã«äœçœ®ã«æ¿å ¥ document.replace(cursorOffset, 0, aiText); </code>`` ===== 1. <|âŠ|> ã®ããŒã¯ã³ãåé€ â AI å¶åŸ¡æåãé€å» ===== # java ã ãåé€ â Markdown ã³ãŒããããã¯ãé€å» # trim â ååŸã®äžèŠãªç©ºçœãé€å» ãã®åŠçãå ¥ããã°ãSystem.out.println("Hello World!"); ãªã©ã® çŽç²ãªã³ãŒãã ã ã Eclipse ãšãã£ã¿ã«æ¿å ¥ã§ããŸãã ð¡ è£è¶³ * å°æ¥çã« AI ã®å¿ç圢åŒãå€ãã£ãå Žåããæ£èŠè¡šçŸã§ Markdown ãšå¶åŸ¡ããŒã¯ã³ãé€å»ããéãå®å šã§ãã * ãã®é¢æ°ã AISuggestHandler ã«çµã¿èŸŒãã ãã§ãäžèŠãªã³ã¡ã³ãã Markdown ãªãã§ã³ãŒãè£å® ãå¯èœã«ãªããŸãã === User: package to.silk.i.ai; === package to.silk.i.ai; import com.google.gson.Gson; import com.google.gson.JsonObject; import com.google.gson.JsonParser; import org.eclipse.core.commands.AbstractHandler; import org.eclipse.core.commands.ExecutionEvent; import org.eclipse.core.commands.ExecutionException; import org.eclipse.jface.text.IDocument; import org.eclipse.jface.text.ITextSelection; import org.eclipse.ui.IEditorPart; import org.eclipse.ui.IWorkbenchWindow; import org.eclipse.ui.handlers.HandlerUtil; import org.eclipse.ui.texteditor.ITextEditor; import java.io.BufferedReader; import java.io.InputStreamReader; import java.io.OutputStream; import java.net.HttpURLConnection; import java.net.URL; import java.util.HashMap; import java.util.Map; public class AISuggestHandler extends AbstractHandler { private static final String AI_SERVER_URL = "http://127.0.0.1:1357/v1/completions"; @Override public Object execute(ExecutionEvent event) throws ExecutionException { IEditorPart editorPart = HandlerUtil.getActiveEditor(event); if (!(editorPart instanceof ITextEditor)) { System.out.println("çŸåšã®ãšãã£ã¿ã¯ããã¹ããšãã£ã¿ã§ã¯ãããŸãã"); return null; } ITextEditor textEditor = (ITextEditor) editorPart; IDocument document = textEditor.getDocumentProvider().getDocument(textEditor.getEditorInput()); ITextSelection selection = (ITextSelection) textEditor.getSelectionProvider().getSelection(); String sourceCode = document.get(); int cursorOffset = selection.getOffset(); // AI ãµãŒããŒã«éä¿¡ãã JSON ãäœæ Gson gson = new Gson(); Map<String, Object> payload = new HashMap<>(); String instruction = "以äžã®ã³ãŒãã®ã«ãŒãœã«äœçœ®ã«è¿œå ããã³ãŒããã³ã¡ã³ãã ããçæããŠãã ããã" + " 説ææãã³ã¡ã³ããææ¡ãMarkdownèšæ³ïŒãªã©ïŒãææ¡æã¯äžåäžèŠã" + " æ¢åã®ã³ãŒããå£ããã远å ãã¹ãã³ãŒããã³ã¡ã³ãã®ã¿ãè¿ããŠãã ããã"; payload.put("model", "gpt-local"); payload.put("prompt", instruction + "\n\nã³ãŒã:\n" + sourceCode); payload.put("cursor_offset", cursorOffset); payload.put("max_tokens", 200); String jsonRequest = gson.toJson(payload); System.out.println("jsonRequest" + jsonRequest); try { String response = sendPostRequest(AI_SERVER_URL, jsonRequest); String aiText = ""; JsonObject jsonObj = JsonParser.parseString(response).getAsJsonObject(); if (jsonObj.has("choices")) { aiText = jsonObj .getAsJsonArray("choices") .get(0) .getAsJsonObject() .get("text") .getAsString(); aiText = extractCodeFromAIResponse(aiText); System.out.println("aiText:" + aiText); } document.replace(cursorOffset, 0, aiText); } catch (Exception e) { e.printStackTrace(); } return null; } private String extractCodeFromAIResponse(String response) { // "final" ãšããããŒã¯ãŒãã®æåŸã®åºçŸäœçœ®ãååŸ int index = response.lastIndexOf("final"); if (index == -1) { // final ãèŠã€ãããªããã°ãã®ãŸãŸè¿ã return response.trim(); } // final ã®åŸã«ç¶ãéšåã ãåãåºã String codePart = response.substring(index + "final".length()); // 1. äžèŠãªå¶åŸ¡ããŒã¯ã³ïŒ<|âŠ|>ïŒãåé€ String cleaned = codePart.replaceAll("<\\|.*?\\|>", ""); // 2. Markdownã³ãŒããããã¯ïŒjava ã ïŒãåé€ cleaned = cleaned.replaceAll("(?m)^.*$", ""); cleaned = cleaned.replaceAll("", ""); // 3. ååŸç©ºçœãåé€ return cleaned.trim(); } // HTTP POST éä¿¡ private String sendPostRequest(String urlStr, String json) throws Exception { URL url = new URL(urlStr); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); conn.setDoOutput(true); conn.setRequestMethod("POST"); conn.setRequestProperty("Content-Type", "application/json; charset=UTF-8"); try (OutputStream os = conn.getOutputStream()) { os.write(json.getBytes("UTF-8")); } BufferedReader in = new BufferedReader(new InputStreamReader(conn.getInputStream(), "UTF-8")); String inputLine; StringBuilder response = new StringBuilder(); while ((inputLine = in.readLine()) != null) { response.append(inputLine).append("\n"); } in.close(); return response.toString(); } } === Assistant: ã³ãŒãã確èªããŸãããå šäœãšããŠã¯ã»ãŒå®æã§ãããAI ããè¿ã£ãŠããäœèšãªæååïŒfinal ä»¥éæœåºïŒã¯ãä»ã®åŠçã ãš AI ã final ãè¿ããªãå ŽåãäžèŠã«åå¿ããå Žå ããããå°ãäžå®å®ã§ãã === ã³ãŒãã確èªããŸãããå šäœãšããŠã¯ã»ãŒå®æã§ãããAI ããè¿ã£ãŠããäœèšãªæååïŒfinal ä»¥éæœåºïŒã¯ãä»ã®åŠçã ãš AI ã <code>final</code> ãè¿ããªãå ŽåãäžèŠã«åå¿ããå Žå ããããå°ãäžå®å®ã§ãã ãã確å®ã« çŽç²ãªã³ãŒãã ããæœåºããŠæ¿å ¥ ããæ¹æ³ãææ¡ããŸãã ==== ### ==== * ä»ã® lastIndexOf("final") 㯠AI ãè¿ããªãå Žåã«ç¡æå³ã§ãã * 代ããã« ãã¹ãŠã®å¶åŸ¡ããŒã¯ã³ãš Markdown ãé€å» â trim ããã°ååã§ãã <syntaxhighlight lang="java">private String extractCodeFromAIResponse(String response) { // 1. äžèŠãªå¶åŸ¡ããŒã¯ã³ïŒ<|âŠ|>ïŒãåé€ String cleaned = response.replaceAll("<\\|.*?\\|>", ""); // 2. Markdownã³ãŒããããã¯ïŒ</syntaxhighlight>java ã ``<code>ïŒãåé€ cleaned = cleaned.replaceAll("(?m)^</code>`<code>.*$", ""); cleaned = cleaned.replaceAll("</code>`<code>", ""); // 3. ååŸç©ºçœãåé€ return cleaned.trim(); } <syntaxhighlight> * ããã ãã§ System.out.println("Hello World!"); ã®ãããªçŽç²ãªã³ãŒãã ããè¿ã£ãŠããããã«ãªããŸãã ===== - AI ãµãŒãåŽã§ cursor_offset ã䜿ã£ãŠè£å®ããŠããªãå Žåã¯ãJSON ããåé€ããŠã OK ===== * çŸç¶ã®ãŸãŸéã£ãŠãåé¡ãªãã§ãããAI ã«ãã£ãŠã¯ç¡èŠãããŸãã ===== </syntaxhighlight>java ===== document.replace(cursorOffset, 0, aiText); </code>`` * extractCodeFromAIResponse ã§äœèšãªæåãåé€ããåŸã«æ¿å ¥ãããšãEclipse äžã«äœèšãªæåãªãã§çŽæ¥è¿œå ã§ããŸãã ===== - final ã«äŸåããªãæœåºã«å€æŽ ===== * å¶åŸ¡ããŒã¯ã³ãš Markdown ãæ£èŠè¡šçŸã§é€å» * ååŸç©ºçœ trim ã§ã¯ãªãŒã³ãªã³ãŒãã ããæ¿å ¥ ãã®æ¹åã§ AI ãè¿ãã³ãŒããçŽæ¥ Eclipse ã«è¿œå å¯èœ ã«ãªããŸãã åžæã§ããã°ãç§ã¯ãã®ä¿®æ£çãçµã¿èŸŒãã æçµç AISuggestHandler ãæç€ºã§ããŸãã æç€ºããŸããïŒ === User: ã§ã¯ãææ¡å 容ãèŠãŠãTabããæŒãããæ¡çšããããã«ããŠãã ããã === ã§ã¯ãææ¡å 容ãèŠãŠãTabããæŒãããæ¡çšããããã«ããŠãã ããã === Assistant: ãªãã»ã©ã§ããã§ã¯ãAI ã®ææ¡ãçŽæ¥æ¿å ¥ããã®ã§ã¯ãªãããææ¡è¡šç€º â Tab ã§æ¡çšã圢åŒã«å€ããŸãããã === ãªãã»ã©ã§ããã§ã¯ãAI ã®ææ¡ãçŽæ¥æ¿å ¥ããã®ã§ã¯ãªãããææ¡è¡šç€º â Tab ã§æ¡çšã圢åŒã«å€ããŸãããã Eclipse ã§ã¯ããã Content AssistïŒã³ãŒãè£å®ïŒ ã§å®çŸã§ããŸããå ·äœçã«ã¯ ICompletionProposal ã䜿ããŸãã ==== 1. AI ã«ã³ãŒãçæãäŸé Œ ==== # ææ¡æååã <code>ICompletionProposal</code> ãšããŠçæ # ã«ãŒãœã«äœçœ®ã«ãããã¢ãã衚瀺 # ãŠãŒã¶ãŒã Tab ãæŒããšæ¿å ¥ ===== <syntaxhighlight lang="java">import org.eclipse.jface.text.contentassist.ICompletionProposal; ===== import org.eclipse.jface.text.contentassist.CompletionProposal; import org.eclipse.jface.text.ITextViewer; import org.eclipse.jface.text.contentassist.IContentAssistant; import org.eclipse.jface.text.contentassist.IContentAssistProcessor; // AI ããååŸããæååãããããŒã¶ã«ãšããŠè¡šç€º String aiText = extractCodeFromAIResponse(response); // ã«ãŒãœã«äœçœ®ã« ContentAssist ããããŒã¶ã«ãäœæ ICompletionProposal proposal = new CompletionProposal( aiText, // æ¿å ¥ããæåå cursorOffset, // æ¿å ¥äœçœ® 0, // 眮æããæåæ° aiText.length(), // ã«ãŒãœã«ã®ç§»åäœçœ® null, // ç»åïŒã¢ã€ã³ã³ïŒ "AI Suggestion", // 衚瀺æå null, // context information null // additional information ); // ããããŒã¶ã«ã ContentAssist ã«æž¡ã // é垞㯠IContentAssistProcessor ãå®è£ ããcomputeCompletionProposals ã§è¿ã </syntaxhighlight> ===== - CompletionProposal ã䜿ããš Tab ããŒã§æ¡çš å¯èœ ===== * 衚瀺ãããéã« ä»ã®è£å®ãšåã UI ã§éžæå¯èœ * cursorOffset ã«å¯Ÿã㊠AI ãè¿ããæååãæ¿å ¥ã§ãã ===== 1. Ctrl+Shift+Z â AI ã«ãœãŒã¹ã³ãŒããšã«ãŒãœã«äœçœ®ãéä¿¡ ===== # AI ããã®å¿çã extractCodeFromAIResponse ã§ã¯ãªãŒã³å # CompletionProposal ãçæã㊠Content Assist ãããã¢ããã«è¡šç€º # Tab ã§éžæãããšã«ãŒãœã«äœçœ®ã«ã³ãŒããæ¿å ¥ããã ð¡ è£è¶³ * Eclipse ã§ã®ãææ¡ â Tab ã§æ¡çšãUI 㯠æ¢åã® Content Assist ãšçµ±åããã®ãå®å šã§ã * ããæãã°ãç§ã¯ AISuggestHandler ã ContentAssist 圢åŒã«æžãæããå®å šç ãäœæã§ããŸã äœããŸããïŒ === User: ã¯ããäœæããŠãã ããã === ã¯ããäœæããŠãã ããã === Assistant: ããããŸãããã§ã¯ãAI ææ¡ã Content Assist 圢åŒã§è¡šç€ºããTab ããŒã§æ¡çšã§ããããã«ããå®å šç AISuggestHandler ãäœããŸãã === ããããŸãããã§ã¯ãAI ææ¡ã Content Assist 圢åŒã§è¡šç€ºããTab ããŒã§æ¡çšã§ããããã«ããå®å šç AISuggestHandler ãäœããŸãã Eclipse ã® Content Assist ãå©çšããããã<code>ITextViewer</code> ãš <code>ICompletionProposal</code> ãçšããå®è£ ã«ããŠããŸãã <syntaxhighlight lang="java">package to.silk.i.ai; import com.google.gson.Gson; import com.google.gson.JsonObject; import com.google.gson.JsonParser; import org.eclipse.core.commands.AbstractHandler; import org.eclipse.core.commands.ExecutionEvent; import org.eclipse.core.commands.ExecutionException; import org.eclipse.jface.text.IDocument; import org.eclipse.jface.text.ITextSelection; import org.eclipse.jface.text.contentassist.CompletionProposal; import org.eclipse.jface.text.contentassist.ICompletionProposal; import org.eclipse.ui.IEditorPart; import org.eclipse.ui.handlers.HandlerUtil; import org.eclipse.ui.texteditor.ITextEditor; import java.io.BufferedReader; import java.io.InputStreamReader; import java.io.OutputStream; import java.net.HttpURLConnection; import java.net.URL; import java.util.HashMap; import java.util.Map; public class AISuggestHandler extends AbstractHandler { private static final String AI_SERVER_URL = "http://127.0.0.1:1357/v1/completions"; @Override public Object execute(ExecutionEvent event) throws ExecutionException { IEditorPart editorPart = HandlerUtil.getActiveEditor(event); if (!(editorPart instanceof ITextEditor)) { System.out.println("çŸåšã®ãšãã£ã¿ã¯ããã¹ããšãã£ã¿ã§ã¯ãããŸãã"); return null; } ITextEditor textEditor = (ITextEditor) editorPart; IDocument document = textEditor.getDocumentProvider().getDocument(textEditor.getEditorInput()); ITextSelection selection = (ITextSelection) textEditor.getSelectionProvider().getSelection(); String sourceCode = document.get(); int cursorOffset = selection.getOffset(); // AI ã«éä¿¡ãã JSON ãäœæ Gson gson = new Gson(); Map<String, Object> payload = new HashMap<>(); String instruction = "以äžã®Javaã³ãŒãã®ã«ãŒãœã«äœçœ®ã«è¿œå ããã³ãŒãã ããçæããŠãã ããã" + " 説ææãã³ã¡ã³ããææ¡ãMarkdownèšæ³ïŒ</syntaxhighlight>ãªã©ïŒã¯äžåäžèŠã" + " æ¢åã®ã³ãŒããå£ããã远å ãã¹ãã³ãŒãã®ã¿è¿ããŠãã ããã"; payload.put("model", "gpt-local"); payload.put("prompt", instruction + "\n\nã³ãŒã:\n" + sourceCode); payload.put("max_tokens", 200); String jsonRequest = gson.toJson(payload); try { String response = sendPostRequest(AI_SERVER_URL, jsonRequest); String aiText = parseAIResponse(response); aiText = cleanAIText(aiText); // CompletionProposal ãäœæã㊠Tab ã§æ¡çšã§ããããã«ãã ICompletionProposal proposal = new CompletionProposal( aiText, // æ¿å ¥æåå cursorOffset, // æ¿å ¥äœçœ® 0, // 眮ææåæ° aiText.length(), // ã«ãŒãœã«ç§»åäœçœ® null, // ç»åïŒã¢ã€ã³ã³ïŒ "AI Suggestion", // 衚瀺æåå null, // context info null // additional info ); // Eclipse ã® Content Assist ã«çŽæ¥è¡šç€ºããå Žå㯠IContentAssistProcessor ã® computeCompletionProposals ã«æž¡ã // ä»åã¯ç°¡æçã«çŽæ¥ document ã«è²Œãå ŽåïŒTab ã§æ¡çšïŒã¯ UI åŽã§ handle ããæ³å® // ããã§ã¯ãã¹ãçšãšããŠã³ã³ãœãŒã«åºå System.out.println("AI Suggestion:\n" + aiText); } catch (Exception e) { e.printStackTrace(); } return null; } // AI JSON ã¬ã¹ãã³ã¹ãã choices[0].text ãåãåºã private String parseAIResponse(String response) { JsonObject jsonObj = JsonParser.parseString(response).getAsJsonObject(); if (jsonObj.has("choices")) { return jsonObj.getAsJsonArray("choices") .get(0) .getAsJsonObject() .get("text") .getAsString(); } return ""; } // äžèŠãªããŒã¯ã³ã Markdown ãåé€ private String cleanAIText(String response) { String cleaned = response.replaceAll("<\\|.*?\\|>", ""); // å¶åŸ¡ããŒã¯ã³é€å» cleaned = cleaned.replaceAll("(?m)^``<code>.*$", ""); // Markdowné€å» cleaned = cleaned.replaceAll("</code>`<code>", ""); return cleaned.trim(); } // HTTP POST éä¿¡ private String sendPostRequest(String urlStr, String json) throws Exception { URL url = new URL(urlStr); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); conn.setDoOutput(true); conn.setRequestMethod("POST"); conn.setRequestProperty("Content-Type", "application/json; charset=UTF-8"); try (OutputStream os = conn.getOutputStream()) { os.write(json.getBytes("UTF-8")); } BufferedReader in = new BufferedReader(new InputStreamReader(conn.getInputStream(), "UTF-8")); String inputLine; StringBuilder response = new StringBuilder(); while ((inputLine = in.readLine()) != null) { response.append(inputLine).append("\n"); } in.close(); return response.toString(); } } </code>`<code> ===== 1. AI ææ¡ã </code>ICompletionProposal` ãšããŠäœæ - Tab ããŒã§æ¡çšå¯èœ - ãAI Suggestionããšã㊠Content Assist ã«è¡šç€ºå¯èœ ===== # Markdown ãå¶åŸ¡ããŒã¯ã³ãé€å» - Eclipse ã«è²Œãä»ããŠãäœèšãªæåãå ¥ããªã # çŽç²ã«ã³ãŒãã ãè¿ãæç€ºã prompt ã«è¿œå - ã³ã¡ã³ããææ¡æãé€å€ ð¡ æ³šæç¹ * äžèšãã³ãã©åäœã§ã¯ãContent Assist UI ã«è¡šç€ºããéšåã¯å¥é IContentAssistProcessor ã§é£æºããå¿ èŠããããŸã * ä»ã®ã³ãŒãã¯ãææ¡æååãçæããéšåãŸã§å®åã - å®éã®ãããã¢ãã衚瀺㯠Eclipse ã®æ¢å Content Assist ãšçµ±åãã圢ã§å®è£ ããã®ãæšå¥šã§ã å¿ èŠã§ããã°ãç§ã¯ ãã® AISuggestHandler ã IContentAssistProcessor ã«çµ±åããŠãCtrl+Shift+Z ã§ãããã¢ãã衚瀺âTab ã§æ¡çšããå®å šåäœç ã«æžãæããããšãå¯èœã§ãã äœããŸããïŒ === User: Content Assist UI ã«è¡šç€ºããéšåã¯å¥é IContentAssistProcessor ã§é£æºããå¿ èŠããããŸããã®éšåãæããŠãã ãã === Content Assist UI ã«è¡šç€ºããéšåã¯å¥é IContentAssistProcessor ã§é£æºããå¿ èŠããããŸããã®éšåãæããŠãã ãã === Assistant: ããããŸãããEclipse ã® Content Assist UI 㯠IContentAssistProcessor ãéããŠè£å®åè£ïŒICompletionProposalïŒã衚瀺ããŸãã === ããããŸãããEclipse ã® Content Assist UI 㯠IContentAssistProcessor ãéããŠè£å®åè£ïŒICompletionProposalïŒã衚瀺ããŸãã ã€ãŸããAISuggestHandler ã ãã§ã¯ãããã¢ãããåºãããContent Assist ã®ä»çµã¿ã«æ¥ç¶ããå¿ èŠããããŸãã ==== ### ==== <syntaxhighlight lang="java">import org.eclipse.jface.text.contentassist.ICompletionProposal; import org.eclipse.jface.text.contentassist.IContentAssistProcessor; import org.eclipse.jface.text.contentassist.IContextInformation; import org.eclipse.jface.text.ITextViewer; public class AIAssistProcessor implements IContentAssistProcessor { private String aiSuggestion; public AIAssistProcessor(String aiSuggestion) { this.aiSuggestion = aiSuggestion; } @Override public ICompletionProposal[] computeCompletionProposals(ITextViewer viewer, int offset) { // ã«ãŒãœã«äœçœ®ã« AI ã®ææ¡ãæ¿å ¥ãã CompletionProposal ãäœæ ICompletionProposal proposal = new CompletionProposal( aiSuggestion, // æ¿å ¥æåå offset, // æ¿å ¥äœçœ® 0, // 眮æããæåæ° aiSuggestion.length(), // ã«ãŒãœã«ã®ç§»åäœçœ® null, // ã¢ã€ã³ã³ "AI Suggestion",// 衚瀺æå null, null ); return new ICompletionProposal[]{ proposal }; } @Override public IContextInformation[] computeContextInformation(ITextViewer viewer, int offset) { return null; // ä»åã¯äžèŠ } @Override public char[] getCompletionProposalAutoActivationCharacters() { return null; } @Override public char[] getContextInformationAutoActivationCharacters() { return null; } @Override public String getErrorMessage() { return null; } @Override public org.eclipse.jface.text.contentassist.IContextInformationValidator getContextInformationValidator() { return null; } } </syntaxhighlight> ===== - ãšãã£ã¿ã«å¯Ÿã㊠Content Assist ãæå¹åããã«ã¯ãSourceViewerConfiguration ã® getContentAssistProcessor ããªãŒããŒã©ã€ãããŠãå ã»ã©ã® AIAssistProcessor ãè¿ããŸãã ===== <syntaxhighlight lang="java">@Override public IContentAssistProcessor getContentAssistProcessor(String contentType) { return new AIAssistProcessor(aiText); } </syntaxhighlight> ===== 1. AISuggestHandler ã§ AI ã«ãªã¯ãšã¹ã ===== # AI ãè¿ããã³ãŒãã extractCodeFromAIResponse ã§ã¯ãªãŒã³å # AIAssistProcessor ã«æž¡ã㊠ICompletionProposal ãçæ # Content Assist UI ããããã¢ãã衚瀺 # ãŠãŒã¶ãŒã Tab ãæŒããšã«ãŒãœã«äœçœ®ã«æ¿å ¥ ð¡ æ³šæç¹ * ITextViewer 㯠Eclipse ã®ãšãã£ã¿å éšã§ç®¡ç ãããŠããã®ã§ããã³ãã©ããçŽæ¥ãããã¢ããã衚瀺ããã«ã¯å°ã工倫ãå¿ èŠã§ãã * å®åã§ã¯ãAISuggestHandler 㯠AI ããã®ææ¡ååŸãŸã§æ åœããContent Assist ã¯å¥ã¯ã©ã¹ïŒProcessorïŒã§è¡šç€ºããšããåé¢èšèšãæšå¥šã§ãã åžæã§ããã°ãç§ã¯ AISuggestHandler ãš IContentAssistProcessor ãçµ±åã㊠Ctrl+Shift+Z ã§ãããã¢ãã â Tab ã§æ¡çšå¯èœãªå®å šç ã®ãµã³ãã«ãäœãããšãã§ããŸãã äœããŸããïŒ === User: ããã§åã£ãŠããŸããïŒ === ããã§åã£ãŠããŸããïŒ package to.silk.i.ai; import org.eclipse.jface.text.contentassist.CompletionProposal; import org.eclipse.jface.text.contentassist.ICompletionProposal; import org.eclipse.jface.text.contentassist.IContentAssistProcessor; import org.eclipse.jface.text.contentassist.IContextInformation; import org.eclipse.jface.text.ITextViewer; public class AIAssistProcessor implements IContentAssistProcessor { private String aiSuggestion; public AIAssistProcessor(String aiSuggestion) { this.aiSuggestion = aiSuggestion; } @Override public ICompletionProposal[] computeCompletionProposals(ITextViewer viewer, int offset) { // ã«ãŒãœã«äœçœ®ã« AI ã®ææ¡ãæ¿å ¥ãã CompletionProposal ãäœæ ICompletionProposal proposal = new CompletionProposal( aiSuggestion, // æ¿å ¥æåå offset, // æ¿å ¥äœçœ® 0, // 眮æããæåæ° aiSuggestion.length(), // ã«ãŒãœã«ã®ç§»åäœçœ® null, // ã¢ã€ã³ã³ "AI Suggestion",// 衚瀺æå null, null ); return new ICompletionProposal[]{ proposal }; } @Override public IContextInformation[] computeContextInformation(ITextViewer viewer, int offset) { return null; // ä»åã¯äžèŠ } @Override public char[] getCompletionProposalAutoActivationCharacters() { return null; } @Override public char[] getContextInformationAutoActivationCharacters() { return null; } @Override public String getErrorMessage() { return null; } @Override public org.eclipse.jface.text.contentassist.IContextInformationValidator getContextInformationValidator() { return null; } } === Assistant: ã¯ããåºæ¬çã«ã¯åã£ãŠããŸãã === ã¯ããåºæ¬çã«ã¯åã£ãŠããŸãã ===== 1. <code>IContentAssistProcessor</code> ãæ£ããå®è£ - computeCompletionProposals ã§ AI ã®ææ¡ã CompletionProposal ã«å€æããŠãã â æ£ãã - Tab ããŒã§æ¡çšå¯èœ ===== # äžèŠãªã¡ãœããããªãŒããŒã©ã€ã - computeContextInformation ãèªåèµ·åæåãªã©ã¯å¿ èŠã«å¿ã㊠null ã§OK # æ¿å ¥æååã»ã«ãŒãœã«ç§»åäœçœ® - aiSuggestion ããã®ãŸãŸæ¿å ¥æååã«äœ¿çš - aiSuggestion.length() ã§ã«ãŒãœã«äœçœ®ãæ«å°Ÿã«ç§»å â é©å ===== - ãã®ã¯ã©ã¹åäœã§ã¯ Content Assist ãããã¢ããã¯è¡šç€ºãããŸããã 衚瀺ããã«ã¯ããšãã£ã¿ã® SourceViewerConfiguration ã§ <code>getContentAssistProcessor</code> ããªãŒããŒã©ã€ãããŠããã® <code>AIAssistProcessor</code> ãè¿ã å¿ èŠããããŸãã ===== * AISuggestHandler ãšçµã¿åãããå Žåã®æµãïŒ 1. Ctrl+Shift+Z ã§ AISuggestHandler ã AI ã«ãªã¯ãšã¹ã 2. AI ãè¿ããæååãã¯ãªãŒã³å (extractCodeFromAIResponse) 3. AIAssistProcessor ã«æž¡ã 4. SourceViewer ã® Content Assist ãæåã§éãããŸãã¯èªåã§ãããã¢ãã ð¡ è£è¶³ * èªåã§ãããã¢ãã衚瀺ããããå Žåã¯ãITextViewer ãã ContentAssistant.showPossibleCompletions() ãåŒã¶æ¹æ³ããããŸãã * çŸç¶ã®å®è£ ã§ã Tab ã§æ¡çšå¯èœãª CompletionProposal ã¯æ£ããçæãããŠããŸãã çµè«ãšããŠããã® AIAssistProcessor 㯠æ£ããå®è£ ã§åé¡ãããŸããã åžæã§ããã°ãAISuggestHandler ãšçµ±åã㊠Ctrl+Shift+Z â ãããã¢ãã衚瀺 â Tab ã§æ¡çš ã®å®å šåäœãµã³ãã«ãæç€ºã§ããŸãã === User: 以äžã®ãœãŒã¹ã®ã©ã®éšåãã©ã®ããã«å€æŽããã°è¯ãã§ãã === 以äžã®ãœãŒã¹ã®ã©ã®éšåãã©ã®ããã«å€æŽããã°è¯ãã§ãã package to.silk.i.ai; import com.google.gson.Gson; import com.google.gson.JsonObject; import com.google.gson.JsonParser; import org.eclipse.core.commands.AbstractHandler; import org.eclipse.core.commands.ExecutionEvent; import org.eclipse.core.commands.ExecutionException; import org.eclipse.jface.text.IDocument; import org.eclipse.jface.text.ITextSelection; import org.eclipse.jface.text.contentassist.CompletionProposal; import org.eclipse.jface.text.contentassist.ICompletionProposal; import org.eclipse.ui.IEditorPart; import org.eclipse.ui.IWorkbenchWindow; import org.eclipse.ui.handlers.HandlerUtil; import org.eclipse.ui.texteditor.ITextEditor; import java.io.BufferedReader; import java.io.InputStreamReader; import java.io.OutputStream; import java.net.HttpURLConnection; import java.net.URL; import java.util.HashMap; import java.util.Map; public class AISuggestHandler extends AbstractHandler { private static final String AI_SERVER_URL = "http://127.0.0.1:1357/v1/completions"; @Override public Object execute(ExecutionEvent event) throws ExecutionException { IEditorPart editorPart = HandlerUtil.getActiveEditor(event); if (!(editorPart instanceof ITextEditor)) { System.out.println("çŸåšã®ãšãã£ã¿ã¯ããã¹ããšãã£ã¿ã§ã¯ãããŸãã"); return null; } ITextEditor textEditor = (ITextEditor) editorPart; IDocument document = textEditor.getDocumentProvider().getDocument(textEditor.getEditorInput()); ITextSelection selection = (ITextSelection) textEditor.getSelectionProvider().getSelection(); String sourceCode = document.get(); int cursorOffset = selection.getOffset(); // AI ãµãŒããŒã«éä¿¡ãã JSON ãäœæ Gson gson = new Gson(); Map<String, Object> payload = new HashMap<>(); String instruction = "以äžã®ã³ãŒãã®ã«ãŒãœã«äœçœ®ã«è¿œå ããã³ãŒããã³ã¡ã³ãã ããçæããŠãã ããã" + " 説ææãã³ã¡ã³ããææ¡ãMarkdownèšæ³ïŒãªã©ïŒãææ¡æã¯äžåäžèŠã" + " æ¢åã®ã³ãŒããå£ããã远å ãã¹ãã³ãŒããã³ã¡ã³ãã®ã¿ãè¿ããŠãã ããã"; payload.put("model", "gpt-local"); payload.put("prompt", instruction + "\n\nã³ãŒã:\n" + sourceCode); payload.put("cursor_offset", cursorOffset); payload.put("max_tokens", 200); String jsonRequest = gson.toJson(payload); System.out.println("jsonRequest" + jsonRequest); try { String response = sendPostRequest(AI_SERVER_URL, jsonRequest); String aiText = ""; JsonObject jsonObj = JsonParser.parseString(response).getAsJsonObject(); if (jsonObj.has("choices")) { aiText = jsonObj .getAsJsonArray("choices") .get(0) .getAsJsonObject() .get("text") .getAsString(); aiText = extractCodeFromAIResponse(aiText); System.out.println("aiText:" + aiText); } //document.replace(cursorOffset, 0, aiText); // CompletionProposal ãäœæã㊠Tab ã§æ¡çšã§ããããã«ãã ICompletionProposal proposal = new CompletionProposal( aiText, // æ¿å ¥æåå cursorOffset, // æ¿å ¥äœçœ® 0, // 眮ææåæ° aiText.length(), // ã«ãŒãœã«ç§»åäœçœ® null, // ç»åïŒã¢ã€ã³ã³ïŒ "AI Suggestion", // 衚瀺æåå null, // context info null // additional info ); // Eclipse ã® Content Assist ã«çŽæ¥è¡šç€ºããå Žå㯠IContentAssistProcessor ã® computeCompletionProposals ã«æž¡ã // ä»åã¯ç°¡æçã«çŽæ¥ document ã«è²Œãå ŽåïŒTab ã§æ¡çšïŒã¯ UI åŽã§ handle ããæ³å® // ããã§ã¯ãã¹ãçšãšããŠã³ã³ãœãŒã«åºå System.out.println("AI Suggestion:\n" + aiText); } catch (Exception e) { e.printStackTrace(); } return null; } private String extractCodeFromAIResponse(String response) { // "final" ãšããããŒã¯ãŒãã®æåŸã®åºçŸäœçœ®ãååŸ int index = response.lastIndexOf("final"); if (index == -1) { // final ãèŠã€ãããªããã°ãã®ãŸãŸè¿ã return response.trim(); } // final ã®åŸã«ç¶ãéšåã ãåãåºã String codePart = response.substring(index + "final".length()); // 1. äžèŠãªå¶åŸ¡ããŒã¯ã³ïŒ<|âŠ|>ïŒãåé€ String cleaned = codePart.replaceAll("<\\|.*?\\|>", ""); // 2. Markdownã³ãŒããããã¯ïŒjava ã ïŒãåé€ cleaned = cleaned.replaceAll("(?m)^.*$", ""); cleaned = cleaned.replaceAll("", ""); // 3. ååŸç©ºçœãåé€ return cleaned.trim(); } // HTTP POST éä¿¡ private String sendPostRequest(String urlStr, String json) throws Exception { URL url = new URL(urlStr); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); conn.setDoOutput(true); conn.setRequestMethod("POST"); conn.setRequestProperty("Content-Type", "application/json; charset=UTF-8"); try (OutputStream os = conn.getOutputStream()) { os.write(json.getBytes("UTF-8")); } BufferedReader in = new BufferedReader(new InputStreamReader(conn.getInputStream(), "UTF-8")); String inputLine; StringBuilder response = new StringBuilder(); while ((inputLine = in.readLine()) != null) { response.append(inputLine).append("\n"); } in.close(); return response.toString(); } } === Assistant: 確èªããŸããããã®ãœãŒã¹ã Tab ã§æ¡çšå¯èœãª Content Assist åœ¢åŒ ã«å®å šå¯Ÿå¿ãããããã®å€æŽç®æãšå å®¹ãæŽçããŸãã === 確èªããŸããããã®ãœãŒã¹ã Tab ã§æ¡çšå¯èœãª Content Assist åœ¢åŒ ã«å®å šå¯Ÿå¿ãããããã®å€æŽç®æãšå å®¹ãæŽçããŸãã ==== çŸç¶ã® lastIndexOf("final") ã¯äžèŠã§ããAI ã®è¿çã« final ãå«ãŸããªãå Žåãäœèšãªåãåããçºçããã®ã§åé€ããŸãã ==== <syntaxhighlight lang="java">private String extractCodeFromAIResponse(String response) { // äžèŠãªå¶åŸ¡ããŒã¯ã³ïŒ<|âŠ|>ïŒãåé€ String cleaned = response.replaceAll("<\\|.*?\\|>", ""); // Markdownã³ãŒããããã¯ïŒ</syntaxhighlight>java ã ``<code>ïŒãåé€ cleaned = cleaned.replaceAll("(?m)^</code>`<code>.*$", ""); cleaned = cleaned.replaceAll("</code>`<code>", ""); // ååŸç©ºçœãåé€ return cleaned.trim(); } <syntaxhighlight> â ä¿®æ£çç±ïŒfinal ã«äŸåãããçŽç²ã«ã³ãŒãã ãæœåºãã ==== - ãã§ã«ã³ã¡ã³ãã¢ãŠãæžã¿ã§ãããçŽæ¥æ¿å ¥ã¯ãããCompletionProposal ã§ææ¡ããããã«ããŸãã ==== </syntaxhighlight>java // document.replace(cursorOffset, 0, aiText); // çŽæ¥æ¿å ¥ã¯äžèŠ <syntaxhighlight> ==== ãã®éšåã¯æ¢ã«å®æããŠããŸãã ==== </syntaxhighlight>java ICompletionProposal proposal = new CompletionProposal( aiText, // æ¿å ¥æåå cursorOffset, // æ¿å ¥äœçœ® 0, // 眮ææåæ° aiText.length(), // ã«ãŒãœã«ç§»åäœçœ® null, // ç»åïŒã¢ã€ã³ã³ïŒ "AI Suggestion", // 衚瀺æåå null, null ); <syntaxhighlight> * Tab ã§æ¡çšå¯èœ * aiText.length() ã«ããã«ãŒãœã«ãæ¿å ¥åŸã®æ«å°Ÿã«ç§»å ==== ããã远å ã§å¿ èŠãªéšåã§ããAISuggestHandler ã ãã§ã¯ãããã¢ãããåºãŸããã ==== ===== 1. ãšãã£ã¿ã® SourceViewerConfiguration ãæ¡åŒµ ===== # getContentAssistProcessor(String contentType) ã§ AIAssistProcessor ãè¿ã </syntaxhighlight>java @Override public IContentAssistProcessor getContentAssistProcessor(String contentType) { return new AIAssistProcessor(aiText); // AI ããååŸããæååãæž¡ã } <syntaxhighlight> * AIAssistProcessor ã¯å ã»ã©äœææžã¿ã®ã¯ã©ã¹ * Tab ããŒã§ææ¡ãæ¡çšã§ãã ==== 1. Ctrl+Shift+Z â AISuggestHandler ã AI ã«ãªã¯ãšã¹ã ==== # AI ã®è¿çã extractCodeFromAIResponse ã§ã¯ãªãŒã³å # AIAssistProcessor ã«æž¡ã # SourceViewerConfiguration çµç±ã§ Content Assist ãåŒã³åºã # ãããã¢ãã衚瀺 â Tab ã§æ¡çš </syntaxhighlight>java // SourceViewerConfiguration å ã§ IContentAssistProcessor processor = new AIAssistProcessor(aiText); contentAssistant.setContentAssistProcessor(processor, IDocument.DEFAULT_CONTENT_TYPE); contentAssistant.showPossibleCompletions(); </code>`` ===== - extractCodeFromAIResponse ãã final åŠçãåé€ ===== * document.replace ã¯çŽæ¥æ¿å ¥ããã³ã¡ã³ãã¢ãŠã * CompletionProposal ã¯ãã®ãŸãŸã§ OK * Content Assist 衚瀺㯠SourceViewerConfiguration + AIAssistProcessor ã§è¡ã ããåžæã§ããã°ãç§ã¯ AISuggestHandler ãš AIAssistProcessor ãçµ±åã㊠Ctrl+Shift+Z â Content Assist ãããã¢ãã â Tab ã§æ¡çš ããã®ãŸãŸåäœãããµã³ãã«ã³ãŒããæç€ºã§ããŸãã äœããŸããïŒ === User: æ¹æ³ === æ¹æ³ ãšãã£ã¿ã® SourceViewerConfiguration ãæ¡åŒµ getContentAssistProcessor(String contentType) ã§ AIAssistProcessor ãè¿ã @Override public IContentAssistProcessor getContentAssistProcessor(String contentType) { return new AIAssistProcessor(aiText); // AI ããååŸããæååãæž¡ã } AIAssistProcessor ã¯å ã»ã©äœææžã¿ã®ã¯ã©ã¹ Tab ããŒã§ææ¡ãæ¡çšã§ãã ãããããããŸãããå ·äœçã«æããŠãã ããã === Assistant: ãªãã»ã©ã§ããé ã远ã£ãŠå ·äœçã«èª¬æããŸããEclipse ã® Content Assist ã¯ããšãã£ã¿ã®ãè£å®ãããã¢ãããã管çããä»çµã¿ã§ãã === ãªãã»ã©ã§ããé ã远ã£ãŠå ·äœçã«èª¬æããŸããEclipse ã® Content Assist ã¯ããšãã£ã¿ã®ãè£å®ãããã¢ãããã管çããä»çµã¿ã§ãã ããã§å¿ èŠãªã®ã¯ãAISuggestHandler ã AI ã®ææ¡ãååŸ â SourceViewerConfiguration ãä»ããŠãããã¢ãã衚瀺 â Tab ã§æ¡çšããšããæµãã§ãã ==== - Eclipse ã®ããã¹ããšãã£ã¿ïŒJDT JavaEditor ãªã©ïŒãæã€èšå®ã¯ã©ã¹ ==== * è£å®ãè²åããªã©ã®æ©èœãæäŸ * Content AssistïŒè£å®ïŒ ãããã§ç®¡çãããŸã äŸïŒ <syntaxhighlight lang="java">import org.eclipse.jface.text.source.SourceViewerConfiguration; import org.eclipse.jface.text.contentassist.IContentAssistProcessor; public class AISourceViewerConfig extends SourceViewerConfiguration { private String aiText; public AISourceViewerConfig(String aiText) { this.aiText = aiText; } @Override public IContentAssistProcessor getContentAssistProcessor(String contentType) { return new AIAssistProcessor(aiText); // Tab ã§æ¡çšå¯èœãªææ¡ãè¿ã } } </syntaxhighlight> ãã€ã³ãïŒ * contentType 㯠"java" ãªã©ã®æåçš®å¥ * getContentAssistProcessor ã§è¿ãã®ã è£å®ã®åŠçã¯ã©ã¹ * ããã§ã¯å ã»ã©äœã£ã AIAssistProcessor ãè¿ã ==== - AI ããååŸããæååã CompletionProposal ã«å€æãã ==== * Eclipse ã¯ãã®ææ¡ããããã¢ããã§è¡šç€º * Tab ããŒã§æ¡çšãããšã«ãŒãœã«äœçœ®ã«æ¿å ¥ããã <syntaxhighlight lang="java">public ICompletionProposal[] computeCompletionProposals(ITextViewer viewer, int offset) { ICompletionProposal proposal = new CompletionProposal( aiSuggestion, // AI ããã®æåå offset, // æ¿å ¥äœçœ® 0, // 眮ææåæ° aiSuggestion.length(), null, "AI Suggestion", null, null ); return new ICompletionProposal[]{ proposal }; } </syntaxhighlight> ==== - SourceViewerConfiguration ã«èšå®ãã Content Assist 㯠ContentAssistant çµç±ã§åŒã³åºãããŸã ==== * AISuggestHandler ããåŒã¶å Žåã¯ã次ã®ããã«ããŸãïŒç°¡æäŸïŒïŒ <syntaxhighlight lang="java">ITextEditor editor = (ITextEditor) HandlerUtil.getActiveEditor(event); ITextViewer viewer = (ITextViewer) editor.getAdapter(ITextViewer.class); ContentAssistant assistant = new ContentAssistant(); assistant.setContentAssistProcessor(new AIAssistProcessor(aiText), IDocument.DEFAULT_CONTENT_TYPE); assistant.install(viewer); assistant.showPossibleCompletions(); // ããã§ãããã¢ãã衚瀺 </syntaxhighlight> * Tab ãæŒããšãææ¡å 容ãã«ãŒãœã«äœçœ®ã«æ¿å ¥ããã ==== 1. Ctrl+Shift+Z â AISuggestHandler ã AI ã«ãªã¯ãšã¹ã ==== # AI ããã³ãŒãååŸ â extractCodeFromAIResponse ã§ã¯ãªãŒã³å # SourceViewerConfiguration ã§ AIAssistProcessor ãè¿ã # ContentAssistant.showPossibleCompletions() ã§ãããã¢ãã衚瀺 # ãŠãŒã¶ãŒã Tab ãæŒããšææ¡ãæ¿å ¥ããã ð¡ æ³šæç¹ * ãã®æ¹æ³ã§ã¯ AI ææ¡ããããã¢ãã衚瀺ãããŸã§ 㯠AISuggestHandler ã管ç * å®åã§ã¯ æ¢åã® JavaEditor/SourceViewer ã«çµã¿èŸŒã圢 ãæãŸãã * ãTab ããŒã§æ¡çšã㯠CompletionProposal ã®æšæºåäœ ã§ã ããåžæã§ããã°ãç§ã¯ AISuggestHandler ãš SourceViewerConfiguration + ContentAssistant ãçµ±åã㊠Ctrl+Shift+Z â ãããã¢ãã衚瀺 â Tab ã§æ¡çšå¯èœãªå®å šãµã³ãã«ã³ãŒã ãäœãããšãã§ããŸãã äœããŸããïŒ === User: ã§ã¯ã以äžãä¿®æ£ããŠãã ããã === ã§ã¯ã以äžãä¿®æ£ããŠãã ããã ãœãŒã¹ã®äžéšåã§ã¯ãªãããœãŒã¹å šäœãæããŠãã ãã package to.silk.i.ai; import com.google.gson.Gson; import com.google.gson.JsonObject; import com.google.gson.JsonParser; import org.eclipse.core.commands.AbstractHandler; import org.eclipse.core.commands.ExecutionEvent; import org.eclipse.core.commands.ExecutionException; import org.eclipse.jface.text.IDocument; import org.eclipse.jface.text.ITextSelection; import org.eclipse.jface.text.contentassist.CompletionProposal; import org.eclipse.jface.text.contentassist.ICompletionProposal; import org.eclipse.ui.IEditorPart; import org.eclipse.ui.IWorkbenchWindow; import org.eclipse.ui.handlers.HandlerUtil; import org.eclipse.ui.texteditor.ITextEditor; import java.io.BufferedReader; import java.io.InputStreamReader; import java.io.OutputStream; import java.net.HttpURLConnection; import java.net.URL; import java.util.HashMap; import java.util.Map; public class AISuggestHandler extends AbstractHandler { private static final String AI_SERVER_URL = "http://127.0.0.1:1357/v1/completions"; @Override public Object execute(ExecutionEvent event) throws ExecutionException { IEditorPart editorPart = HandlerUtil.getActiveEditor(event); if (!(editorPart instanceof ITextEditor)) { System.out.println("çŸåšã®ãšãã£ã¿ã¯ããã¹ããšãã£ã¿ã§ã¯ãããŸãã"); return null; } ITextEditor textEditor = (ITextEditor) editorPart; IDocument document = textEditor.getDocumentProvider().getDocument(textEditor.getEditorInput()); ITextSelection selection = (ITextSelection) textEditor.getSelectionProvider().getSelection(); String sourceCode = document.get(); int cursorOffset = selection.getOffset(); // AI ãµãŒããŒã«éä¿¡ãã JSON ãäœæ Gson gson = new Gson(); Map<String, Object> payload = new HashMap<>(); String instruction = "以äžã®ã³ãŒãã®ã«ãŒãœã«äœçœ®ã«è¿œå ããã³ãŒããã³ã¡ã³ãã ããçæããŠãã ããã" + " 説ææãã³ã¡ã³ããææ¡ãMarkdownèšæ³ïŒãªã©ïŒãææ¡æã¯äžåäžèŠã" + " æ¢åã®ã³ãŒããå£ããã远å ãã¹ãã³ãŒããã³ã¡ã³ãã®ã¿ãè¿ããŠãã ããã"; payload.put("model", "gpt-local"); payload.put("prompt", instruction + "\n\nã³ãŒã:\n" + sourceCode); payload.put("cursor_offset", cursorOffset); payload.put("max_tokens", 200); String jsonRequest = gson.toJson(payload); System.out.println("jsonRequest" + jsonRequest); try { String response = sendPostRequest(AI_SERVER_URL, jsonRequest); String aiText = ""; JsonObject jsonObj = JsonParser.parseString(response).getAsJsonObject(); if (jsonObj.has("choices")) { aiText = jsonObj .getAsJsonArray("choices") .get(0) .getAsJsonObject() .get("text") .getAsString(); aiText = extractCodeFromAIResponse(aiText); System.out.println("aiText:" + aiText); } //document.replace(cursorOffset, 0, aiText); // CompletionProposal ãäœæã㊠Tab ã§æ¡çšã§ããããã«ãã ICompletionProposal proposal = new CompletionProposal( aiText, // æ¿å ¥æåå cursorOffset, // æ¿å ¥äœçœ® 0, // 眮ææåæ° aiText.length(), // ã«ãŒãœã«ç§»åäœçœ® null, // ç»åïŒã¢ã€ã³ã³ïŒ "AI Suggestion", // 衚瀺æåå null, // context info null // additional info ); // Eclipse ã® Content Assist ã«çŽæ¥è¡šç€ºããå Žå㯠IContentAssistProcessor ã® computeCompletionProposals ã«æž¡ã // ä»åã¯ç°¡æçã«çŽæ¥ document ã«è²Œãå ŽåïŒTab ã§æ¡çšïŒã¯ UI åŽã§ handle ããæ³å® // ããã§ã¯ãã¹ãçšãšããŠã³ã³ãœãŒã«åºå System.out.println("AI Suggestion:\n" + aiText); } catch (Exception e) { e.printStackTrace(); } return null; } private String extractCodeFromAIResponse(String response) { // "final" ãšããããŒã¯ãŒãã®æåŸã®åºçŸäœçœ®ãååŸ int index = response.lastIndexOf("final"); if (index == -1) { // final ãèŠã€ãããªããã°ãã®ãŸãŸè¿ã return response.trim(); } // final ã®åŸã«ç¶ãéšåã ãåãåºã String codePart = response.substring(index + "final".length()); // 1. äžèŠãªå¶åŸ¡ããŒã¯ã³ïŒ<|âŠ|>ïŒãåé€ String cleaned = codePart.replaceAll("<\\|.*?\\|>", ""); // 2. Markdownã³ãŒããããã¯ïŒjava ã ïŒãåé€ cleaned = cleaned.replaceAll("(?m)^.*$", ""); cleaned = cleaned.replaceAll("", ""); // 3. ååŸç©ºçœãåé€ return cleaned.trim(); } // HTTP POST éä¿¡ private String sendPostRequest(String urlStr, String json) throws Exception { URL url = new URL(urlStr); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); conn.setDoOutput(true); conn.setRequestMethod("POST"); conn.setRequestProperty("Content-Type", "application/json; charset=UTF-8"); try (OutputStream os = conn.getOutputStream()) { os.write(json.getBytes("UTF-8")); } BufferedReader in = new BufferedReader(new InputStreamReader(conn.getInputStream(), "UTF-8")); String inputLine; StringBuilder response = new StringBuilder(); while ((inputLine = in.readLine()) != null) { response.append(inputLine).append("\n"); } in.close(); return response.toString(); } } === Assistant: ããããŸããã以äžã«ãAISuggestHandler ã AI ããã®ææ¡ã Content Assist ãããã¢ããã§è¡šç€º â Tab ã§æ¡çš ã§ãã圢ã«ä¿®æ£ããå šäœãœãŒã¹ã瀺ããŸãã === ããããŸããã以äžã«ãAISuggestHandler ã AI ããã®ææ¡ã Content Assist ãããã¢ããã§è¡šç€º â Tab ã§æ¡çš ã§ãã圢ã«ä¿®æ£ããå šäœãœãŒã¹ã瀺ããŸãã ãã€ã³ãïŒ * extractCodeFromAIResponse ãã final ã«äŸåããåŠçãåé€ * CompletionProposal ã®çæã¯ãã®ãŸãŸäœ¿çš * Content Assist ãããã¢ããã衚瀺ããããã« ContentAssistant ãå©çš * Tab ããŒã§æ¿å ¥å¯èœ <syntaxhighlight lang="java">package to.silk.i.ai; import com.google.gson.Gson; import com.google.gson.JsonObject; import com.google.gson.JsonParser; import org.eclipse.core.commands.AbstractHandler; import org.eclipse.core.commands.ExecutionEvent; import org.eclipse.core.commands.ExecutionException; import org.eclipse.jface.text.IDocument; import org.eclipse.jface.text.ITextSelection; import org.eclipse.jface.text.contentassist.CompletionProposal; import org.eclipse.jface.text.contentassist.ICompletionProposal; import org.eclipse.jface.text.contentassist.ContentAssistant; import org.eclipse.jface.text.ITextViewer; import org.eclipse.ui.IEditorPart; import org.eclipse.ui.handlers.HandlerUtil; import org.eclipse.ui.texteditor.ITextEditor; import java.io.BufferedReader; import java.io.InputStreamReader; import java.io.OutputStream; import java.net.HttpURLConnection; import java.net.URL; import java.util.HashMap; import java.util.Map; public class AISuggestHandler extends AbstractHandler { private static final String AI_SERVER_URL = "http://127.0.0.1:1357/v1/completions"; @Override public Object execute(ExecutionEvent event) throws ExecutionException { IEditorPart editorPart = HandlerUtil.getActiveEditor(event); if (!(editorPart instanceof ITextEditor)) { System.out.println("çŸåšã®ãšãã£ã¿ã¯ããã¹ããšãã£ã¿ã§ã¯ãããŸãã"); return null; } ITextEditor textEditor = (ITextEditor) editorPart; IDocument document = textEditor.getDocumentProvider().getDocument(textEditor.getEditorInput()); ITextSelection selection = (ITextSelection) textEditor.getSelectionProvider().getSelection(); String sourceCode = document.get(); int cursorOffset = selection.getOffset(); // AI ãµãŒããŒã«éä¿¡ãã JSON ãäœæ Gson gson = new Gson(); Map<String, Object> payload = new HashMap<>(); String instruction = "以äžã®ã³ãŒãã®ã«ãŒãœã«äœçœ®ã«è¿œå ããã³ãŒããã³ã¡ã³ãã ããçæããŠãã ããã" + " 説ææãã³ã¡ã³ããææ¡ãMarkdownèšæ³ïŒ</syntaxhighlight>ãªã©ïŒãææ¡æã¯äžåäžèŠã" + " æ¢åã®ã³ãŒããå£ããã远å ãã¹ãã³ãŒããã³ã¡ã³ãã®ã¿ãè¿ããŠãã ããã"; payload.put("model", "gpt-local"); payload.put("prompt", instruction + "\n\nã³ãŒã:\n" + sourceCode); payload.put("cursor_offset", cursorOffset); payload.put("max_tokens", 200); String jsonRequest = gson.toJson(payload); System.out.println("jsonRequest: " + jsonRequest); try { String response = sendPostRequest(AI_SERVER_URL, jsonRequest); String aiText = ""; JsonObject jsonObj = JsonParser.parseString(response).getAsJsonObject(); if (jsonObj.has("choices")) { aiText = jsonObj .getAsJsonArray("choices") .get(0) .getAsJsonObject() .get("text") .getAsString(); aiText = extractCodeFromAIResponse(aiText); System.out.println("aiText: " + aiText); } // Content Assist çšã« CompletionProposal ãäœæ ICompletionProposal proposal = new CompletionProposal( aiText, // æ¿å ¥æåå cursorOffset, // æ¿å ¥äœçœ® 0, // 眮ææåæ° aiText.length(), // ã«ãŒãœã«ç§»åäœçœ® null, // ç»åïŒã¢ã€ã³ã³ïŒ "AI Suggestion", // 衚瀺æåå null, // context info null // additional info ); // ContentAssistant ãäœæããŠãããã¢ãã衚瀺 ITextViewer viewer = (ITextViewer) textEditor.getAdapter(ITextViewer.class); if (viewer != null) { ContentAssistant assistant = new ContentAssistant(); assistant.setContentAssistProcessor(new AIAssistProcessor(aiText), IDocument.DEFAULT_CONTENT_TYPE); assistant.install(viewer); assistant.showPossibleCompletions(); // ãããã¢ãã衚瀺 } } catch (Exception e) { e.printStackTrace(); } return null; } private String extractCodeFromAIResponse(String response) { // äžèŠãªå¶åŸ¡ããŒã¯ã³ïŒ<|âŠ|>ïŒãåé€ String cleaned = response.replaceAll("<\\|.*?\\|>", ""); // Markdownã³ãŒããããã¯ïŒ``<code>java ã </code>`<code>ïŒãåé€ cleaned = cleaned.replaceAll("(?m)^</code>`<code>.*$", ""); cleaned = cleaned.replaceAll("</code>`<code>", ""); // ååŸç©ºçœãåé€ return cleaned.trim(); } // HTTP POST éä¿¡ private String sendPostRequest(String urlStr, String json) throws Exception { URL url = new URL(urlStr); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); conn.setDoOutput(true); conn.setRequestMethod("POST"); conn.setRequestProperty("Content-Type", "application/json; charset=UTF-8"); try (OutputStream os = conn.getOutputStream()) { os.write(json.getBytes("UTF-8")); } BufferedReader in = new BufferedReader(new InputStreamReader(conn.getInputStream(), "UTF-8")); String inputLine; StringBuilder response = new StringBuilder(); while ((inputLine = in.readLine()) != null) { response.append(inputLine).append("\n"); } in.close(); return response.toString(); } } </code>`` ===== 1. extractCodeFromAIResponse ã§äœèšãªåãåãåŠçãåé€ ===== # CompletionProposal ãçæ â Tab ã§æ¡çšå¯èœ # ContentAssistant ã䜿ã£ãŠ ãããã¢ããã衚瀺 # AIAssistProcessor 㯠CompletionProposal ãè¿ãã ãã®ç°¡åãªå®è£ ã§ OK ãã®ç¶æ ã§ Ctrl+Shift+Z ãæŒããš AI ã«ã³ãŒããéä¿¡ â ãããã¢ãã衚瀺 â Tab ã§ã«ãŒãœã«äœçœ®ã«æ¿å ¥ãå¯èœã«ãªããŸãã === User: ãããã¢ããã«ãAI Suggestionããšåºãã ãã§ãææ¡ããããœãŒã¹ã衚瀺ãããŸããã === ãããã¢ããã«ãAI Suggestionããšåºãã ãã§ãææ¡ããããœãŒã¹ã衚瀺ãããŸããã === Assistant: ãªãã»ã©ãåå 㯠ContentAssistant ã«æž¡ããŠãã IContentAssistProcessor ãåžžã«åã aiText ãè¿ãã ãã§ãViewer ããã®ã«ãŒãœã«äœçœ®æ å ±ãç¡èŠããŠããããš ãšãContentAssis⊠=== ãªãã»ã©ãåå 㯠ContentAssistant ã«æž¡ããŠãã <code>IContentAssistProcessor</code> ãåžžã«åã <code>aiText</code> ãè¿ãã ãã§ãViewer ããã®ã«ãŒãœã«äœçœ®æ å ±ãç¡èŠããŠããããš ãšãContentAssistant ãæ°èŠäœæããŠãæ¢åã® SourceViewer ã«æ£ããçµã³ä»ããªãå Žå ã§ããEclipse ã§ã¯ Content Assist ãæ£ããåäœãããã«ã¯ãSourceViewerConfiguration ã§ ContentAssistProcessor ãè¿ãä»çµã¿ ãå¿ èŠã§ãã ==== ä¿®æ£æ¹æ³ã®å ·äœäŸ ==== ===== 1ïžâ£ AIAssistProcessor ãã«ãŒãœã«äœçœ®ã«å¿ããŠåäœããã ===== <syntaxhighlight lang="java">public class AIAssistProcessor implements IContentAssistProcessor { private final String aiSuggestion; public AIAssistProcessor(String aiSuggestion) { this.aiSuggestion = aiSuggestion; } @Override public ICompletionProposal[] computeCompletionProposals(ITextViewer viewer, int offset) { if (aiSuggestion == null || aiSuggestion.isEmpty()) return new ICompletionProposal[0]; CompletionProposal proposal = new CompletionProposal( aiSuggestion, // æ¿å ¥æåå offset, // çŸåšã®ã«ãŒãœã«äœçœ®ã«æ¿å ¥ 0, // 眮æããæåæ° aiSuggestion.length(), null, aiSuggestion, // ãããã¢ããã«è¡šç€ºããæååã aiSuggestion ã«ãã null, null ); return new ICompletionProposal[]{ proposal }; } @Override public IContextInformation[] computeContextInformation(ITextViewer viewer, int offset) { return null; } @Override public char[] getCompletionProposalAutoActivationCharacters() { return null; } @Override public char[] getContextInformationAutoActivationCharacters() { return null; } @Override public String getErrorMessage() { return null; } @Override public org.eclipse.jface.text.contentassist.IContextInformationValidator getContextInformationValidator() { return null; } } </syntaxhighlight> ãã€ã³ãïŒ * aiSuggestion ã 衚瀺æåå ãšããŠã䜿ã * offset ããã®ãŸãŸäœ¿çšããŠã«ãŒãœã«äœçœ®ã«æ¿å ¥ ===== 2ïžâ£ ContentAssistant ã®äœ¿ãæ¹ ===== çŽæ¥ new ContentAssistant() ã§ã¯ãªããæ¢åã® SourceViewer ã«çµã¿èŸŒãŸããŠãã ContentAssistant ã䜿ãã»ãã確å®ã§ãã <syntaxhighlight lang="java">ITextViewer viewer = (ITextViewer) textEditor.getAdapter(ITextViewer.class); if (viewer != null) { // SourceViewerConfiguration ãæ¡åŒµã㊠ContentAssistProcessor ãè¿ã viewer.configure(new SourceViewerConfiguration() { @Override public IContentAssistProcessor getContentAssistProcessor(String contentType) { return new AIAssistProcessor(aiText); } }); // ãããã¢ãã衚瀺 viewer.getContentAssistant().showPossibleCompletions(); } </syntaxhighlight> * ãã®æ¹æ³ã§ ã«ãŒãœã«äœçœ®ã®ææ¡ããããã¢ããã«è¡šç€ºããã * Tab ã§æ¡çšããã°ã«ãŒãœã«äœçœ®ã«æ¿å ¥ããã ===== 3ïžâ£ ãŸãšã ===== * åé¡ïŒãããã¢ããã«æååã衚瀺ãããªã * åå ïŒ 1. CompletionProposal ã®è¡šç€ºæååã "AI Suggestion" åºå®ã«ããŠãã 2. ContentAssistant ãæ°èŠäœæããŠãæ¢åã® SourceViewer ã«çµã³ä»ããªã * 解決çïŒ - 衚瀺æååã aiText ã«ãã - SourceViewerConfiguration ã§ getContentAssistProcessor ããªãŒããŒã©ã€ãããAIAssistProcessor ãè¿ã ããåžæãªããç§ã¯ AISuggestHandler ãã Ctrl+Shift+Z â AI ååŸ â Content Assist ãããã¢ãã â Tab ã§æ¡çš ãæ£ããåäœãã å®å šçãœãŒã¹ã³ãŒã ãäœæã§ããŸãã äœããŸããïŒ === User: ããããã£ãããšãå®å šã«ã§ããŸããïŒããããšãïŒ === ããããã£ãããšãå®å šã«ã§ããŸããïŒããããšãïŒ === Assistant: ããã¯è¯ãã£ãã§ãïŒð === ããã¯è¯ãã£ãã§ãïŒð ãããŸã§ã§ã * Ctrl+Shift+Z ã§ AI ã«ã³ãŒãéä¿¡ * AI ææ¡ã Content Assist ãããã¢ããã«è¡šç€º * Tab ã§ã«ãŒãœã«äœçœ®ã«æ¿å ¥ ãå šéšåäœããããã«ãªã£ãããã§ããã ããã§ãEclipse äžã§ããŒã«ã« AI ã«ããã³ãŒãè£å®ãã宿ã§ãã ä»åŸã®æ¡åŒµãšããŠã¯ã * è€æ°åè£ã®è¡šç€º * Java 以å€ã®èšèªãžã®å¯Ÿå¿ * AI å¿çã®å±¥æŽç®¡çã undo æ©èœ ãªã©ã远å å¯èœã§ãã å¿ èŠã§ããã°ã次ã®ã¹ãããã®ã¢ã€ãã¢ãæŽçããŠãŸãšããããŸãã
Summary:
Please note that all contributions to freem are considered to be released under the Creative Commons Attribution-ShareAlike 4.0 (see
Freem:Copyrights
for details). If you do not want your writing to be edited mercilessly and redistributed at will, then do not submit it here.
You are also promising us that you wrote this yourself, or copied it from a public domain or similar free resource.
Do not submit copyrighted work without permission!
Cancel
Editing help
(opens in new window)