Foundry Local Spring Boot הדרכה
April 15, 2026 · View on GitHub
תוכן העניינים
- דרישות מוקדמות
- סקירת הפרויקט
- הבנת הקוד
- איך הכל עובד ביחד
- הגדרת Foundry Local
- הרצת האפליקציה
- פלט צפוי
- שלבים הבאים
- פתרון תקלות
דרישות מוקדמות
לפני התחלת ההדרכה, ודא שיש לך:
- Java 21 ומעלה מותקן במערכת שלך
- Maven 3.6+ לבניית הפרויקט
- Foundry Local מותקן ופועל
התקן את Foundry Local:
הערה: Foundry Local CLI זמין רק עבור Windows ו-macOS. לינוקס נתמכת דרך ה-Foundry Local SDKs (Python, JavaScript, C#, Rust).
# חלונות
winget install Microsoft.FoundryLocal
# מק או אס
brew tap microsoft/foundrylocal
brew install foundrylocal
אמת את ההתקנה:
foundry --version
סקירת הפרויקט
הפרויקט מורכב מארבעה מרכיבים עיקריים:
- Application.java - נקודת הכניסה הראשית לאפליקציית Spring Boot
- FoundryLocalService.java - שכבת שירות שמטפלת בתקשורת עם AI
- application.properties - הגדרות לחיבור ל-Foundry Local
- pom.xml - התלויות ובניית הפרויקט במייבן
הבנת הקוד
1. הגדרות אפליקציה (application.properties)
קובץ: src/main/resources/application.properties
foundry.local.base-url=http://localhost:5273/v1
# foundry.local.model is auto-detected from Foundry Local. Set it here to override:
# foundry.local.model=Phi-4-mini-instruct-cuda-gpu:5
מה זה עושה:
- base-url: מציין היכן Foundry Local רץ, כולל הנתיב
/v1לתאימות עם OpenAI API. הפורט המוגדר כברירת מחדל הוא5273. אם הפורט שונה, בדוק אותו עםfoundry service status. - model (אופציונלי): שם דגם ה-AI לשימוש בהפקת טקסט. ברירת המחדל היא זיהוי אוטומטי של הדגם על ידי שאילתת נקודת הקצה
/v1/modelsשל Foundry Local בעת ההפעלה, כך שלא צריך להגדיר אותו. בכל זאת, ניתן להגדיר אותו במפורש אם רוצים לעקוף את הזיהוי האוטומטי.
עיקרון מרכזי: Spring Boot טוען אוטומטית את ההגדרות האלו ומאפשר גישה אליהן דרך ההערה @Value.
2. מחלקת האפליקציה הראשית (Application.java)
קובץ: src/main/java/com/example/Application.java
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication app = new SpringApplication(Application.class);
app.setWebApplicationType(WebApplicationType.NONE); // אין צורך בשרת אינטרנט
app.run(args);
}
מה זה עושה:
@SpringBootApplicationמפעיל את האוטו-קונפיגורציה של Spring BootWebApplicationType.NONEמודיע לספרינג שמדובר באפליקציית שורת פקודה, לא בשרת ווב- המתודה הראשית מפעילה את אפליקציית Spring
הרצת הדמו:
@Bean
public CommandLineRunner foundryLocalRunner(FoundryLocalService foundryLocalService) {
return args -> {
System.out.println("=== Foundry Local Demo ===");
System.out.println("Calling Foundry Local service...");
String testMessage = "Hello! Can you tell me what you are and what model you're running?";
System.out.println("Sending message: " + testMessage);
String response = foundryLocalService.chat(testMessage);
System.out.println("Response from Foundry Local:");
System.out.println(response);
System.out.println("=========================");
};
}
מה זה עושה:
@Beanיוצר רכיב שנשלט על ידי SpringCommandLineRunnerמריץ קוד אחרי ש-Spring Boot עולהfoundryLocalServiceמוזרק אוטומטית על ידי Spring (הזרקת תלויות)- שולח הודעת בדיקה ל-AI ומציג את התגובה
3. שכבת שירות AI (FoundryLocalService.java)
קובץ: src/main/java/com/example/FoundryLocalService.java
הזרקת הגדרות:
@Service
public class FoundryLocalService {
@Value("${foundry.local.base-url:http://localhost:5273/v1}")
private String baseUrl;
@Value("${foundry.local.model:}")
private String model; // זוהה אוטומטית אם ריק
מה זה עושה:
@Serviceמודיע לספרינג שזו מחלקה שמספקת לוגיקה עסקית@Valueמזריק ערכי הגדרות מתוך application.properties- ברירת המחדל של הדגם היא ריקה, מה שמפעיל זיהוי אוטומטי דרך Foundry Local בתחילת הריצה. זאת אומרת שהאפליקציה פועלת עם כל דגם שנטען ב-Foundry Local בלי צורך בהגדרות ידניות.
אתחול הלקוח:
@PostConstruct
public void init() {
// זיהוי אוטומטי של הדגם מ-Foundry Local אם לא מוגדר במפורש
if (model == null || model.isBlank()) {
model = detectModel();
}
this.openAIClient = OpenAIOkHttpClient.builder()
.baseUrl(baseUrl) // כתובת בסיס כבר כוללת /v1 מהקונפיגורציה
.apiKey("not-needed") // לשרת מקומי לא צריך מפתח API אמיתי
.build();
}
מה זה עושה:
@PostConstructמריץ את השיטה הזו לאחר ש-Spring יוצר את השירות- אם לא הוגדר דגם, הוא שואל את נקודת הקצה
/v1/modelsב-Foundry Local ומקבל את הדגם הראשון שנטען - יוצר לקוח OpenAI שמצביע על השרת המקומי של Foundry Local שלך
- ה-URL מהגדרות כולל כבר את הנתיב
/v1לתאימות עם OpenAI API - מפתח ה-API מוגדר כ"not-needed" כי בפיתוח מקומי אין צורך באימות
שיטת שיחה:
public String chat(String message) {
try {
ChatCompletionCreateParams params = ChatCompletionCreateParams.builder()
.model(model) // איזה דגם בינה מלאכותית להשתמש
.addUserMessage(message) // השאלה/הפנייה שלך
.maxCompletionTokens(150) // הגבל את אורך התגובה
.temperature(0.7) // שלוט ביצירתיות (0.0-1.0)
.build();
ChatCompletion chatCompletion = openAIClient.chat().completions().create(params);
// הפק את תגובת הבינה המלאכותית מתוצאת ה-API
if (chatCompletion.choices() != null && !chatCompletion.choices().isEmpty()) {
return chatCompletion.choices().get(0).message().content().orElse("No response found");
}
return "No response content found";
} catch (Exception e) {
throw new RuntimeException("Error calling chat completion: " + e.getMessage(), e);
}
}
מה זה עושה:
- ChatCompletionCreateParams: מגדיר את בקשת ה-AI
model: מגדיר את דגם ה-AI לשימוש (חייב להתאים במדויק ל-ID מרשימת הדגמיםfoundry model list)addUserMessage: מוסיף את ההודעה שלך לשיחהmaxCompletionTokens: מגביל את אורך התגובה (חוסך במשאבים)temperature: שולט על רמת האקראיות (0.0 = דטרמיניסטי, 1.0 = יצירתי)
- קריאת API: שולח את הבקשה ל-Foundry Local
- טיפול בתגובה: מפיק בצורה בטוחה את הטקסט מהתגובה של ה-AI
- טיפול בשגיאות: עוטף חריגות עם הודעות שגיאה מועילות
4. התלויות בפרויקט (pom.xml)
תלויות עיקריות:
<!-- Spring Boot - Application framework -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
<version>${spring-boot.version}</version>
</dependency>
<!-- OpenAI Java SDK - For AI API calls -->
<dependency>
<groupId>com.openai</groupId>
<artifactId>openai-java</artifactId>
<version>2.12.0</version>
</dependency>
<!-- Jackson - JSON processing -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.17.0</version>
</dependency>
מה הן עושות:
- spring-boot-starter: מספק את ליבת הפונקציונליות של Spring Boot
- openai-java: SDK רשמי של OpenAI עבור Java לתקשורת עם ה-API
- jackson-databind: מטפלת בסריאליזציה/דסריאליזציה של JSON עבור קריאות API
איך הכל עובד ביחד
הנה הזרימה המלאה כשהאפליקציה רצה:
- הפעלה: Spring Boot מתחיל וקורא את
application.properties - יצירת שירות: Spring יוצר את
FoundryLocalServiceומזריק לו את ערכי ההגדרות - זיהוי דגם: אם לא הוגדר דגם, השירות שואל את נקודת הקצה
/v1/modelsומקבל אוטומטית את הדגם הזמין הראשון - הגדרת הלקוח:
@PostConstructמאתחל את הלקוח של OpenAI שמתחבר ל-Foundry Local - הרצת הדמו:
CommandLineRunnerרץ לאחר ההפעלה - קריאת AI: הדמו קורא ל-
foundryLocalService.chat()עם הודעת בדיקה - בקשת API: השירות בונה ושולח בקשה תואמת OpenAI ל-Foundry Local
- עיבוד תגובה: השירות מפיק ומחזיר את תשובת ה-AI
- הצגה: האפליקציה מדפיסה את התגובה ופונה
הגדרת Foundry Local
-
התקן את Foundry Local באמצעות ההוראות בקטע דרישות מוקדמות.
-
הפעל את השירות (אם אינו כבר רץ):
foundry service start -
בדוק את סטטוס השירות לאישור שהוא פועל וראה את הפורט:
foundry service status -
הורד והרץ דגם (ההורדה תתבצע בהרצה הראשונה, בקאש להרצות הבאות):
foundry model run phi-4-miniזה פותח שיחה אינטראקטיבית. ניתן לצאת באמצעות
Ctrl+C. הדגם נשאר טעון בשירות.עצה: הרץ
foundry model listכדי לראות את כל הדגמים הזמינים. החלף אתphi-4-miniבכל כינוי מהרשימה (למשל:qwen2.5-0.5bלדגם קטן ומהיר יותר). -
אמת שהדגם נטען:
foundry service ps -
עדכן את
application.propertiesבמידת הצורך:- ה-
base-urlהמוגדר כברירת מחדל (http://localhost:5273/v1) תואם את פורט CLI ברירת המחדל. עדכן רק אם ב-foundry service statusמופיע פורט שונה. - הדגם מתגלה אוטומטית בעת ההפעלה — אין צורך בהגדרה ידנית.
foundry.local.base-url=http://localhost:5273/v1 # Model is auto-detected. Uncomment below to override: # foundry.local.model=Phi-4-mini-instruct-cuda-gpu:5 - ה-
הרצת האפליקציה
שלב 1: וודא שדגם נטען ב-Foundry Local
foundry service ps
אם אין דגמים ברשימה, טען אחד:
foundry model run phi-4-mini
שלב 2: בניית והרצת האפליקציה
בטרמינל נפרד:
cd 04-PracticalSamples/foundrylocal
mvn spring-boot:run
או בנה והרץ כקובץ JAR:
mvn clean package
java -jar target/foundry-local-spring-boot-0.0.1-SNAPSHOT.jar
פלט צפוי
=== Foundry Local Demo ===
Calling Foundry Local service...
Sending message: Hello! Can you tell me what you are and what model you're running?
Response from Foundry Local:
Hello! I'm Phi, an AI developed by Microsoft. I can assist with a wide variety of
tasks including answering questions, helping with analysis, creative writing, coding,
and general conversation. How can I help you today?
=========================
שלבים הבאים
לדוגמאות נוספות ראו פרק 04: דוגמאות מעשיות
פתרון תקלות
בעיות נפוצות
"Connection refused" או "Service unavailable"
- בדוק את השירות:
foundry service status - הפעל מחדש אם צריך:
foundry service restart - אמת שהפורט ב-
application.propertiesתואם ליציאתfoundry service status - ודא שה-URL מסתיים ב-
/v1:http://localhost:5273/v1
"No model found" בהפעלה
- האפליקציה מגלה את הדגם אוטומטית. ודא שיש לפחות דגם נטען:
foundry service ps - אם אין דגמים נטועים:
foundry model run phi-4-mini - אם הגדרת שם דגם ב-
application.properties, ודא שהוא תואם לfoundry model list
שגיאות "400 Bad Request"
- ודא שה-URL כולל
/v1:http://localhost:5273/v1 - השתמש ב-
maxCompletionTokens()בקוד שלך (ולא ב-maxTokens()שהוסר)
שגיאות קומפילציה במייבן
- ודא שיש Java 21 ומעלה:
java -version - נקה ובנה מחדש:
mvn clean compile - בדוק חיבור לאינטרנט להורדת תלויות
בעיות חיבור לשירות
- אם מופיע
Request to local service failed, הפעל:foundry service restart - בדוק דגמים נטענים:
foundry service ps - צפה בלוגים של השירות:
foundry service diag
כתב ויתור:
מסמך זה תורגם באמצעות שירות התרגום הממוחשב Co-op Translator. בעוד שאנו שואפים לדיוק, יש לקחת בחשבון שתרגומים אוטומטיים עלולים להכיל שגיאות או אי דיוקים. המסמך המקורי בשפת המקור שלו הוא המקור הסמכותי. למידע קריטי מומלץ להשתמש בתרגום מקצועי על ידי מתרגם אנושי. אנו לא נושאים באחריות לכל אי הבנה או פירוש שגוי הנובע משימוש בתרגום זה.